include b
include b.bat
+include SWIG/*
+exclude SWIG/CVS/*
+
include demo/*.py
include demo/bitmaps/*.bmp
include demo/bitmaps/*.ico
include demo/data/*.h
include demo/data/*.py
+include samples/doodle/*.txt
+include samples/doodle/*.py
+include samples/doodle/sample.ddl
+include samples/stxview/*.txt
+include samples/stxview/*.py
+include samples/stxview/*.stx
+include samples/stxview/StructuredText/*.py
+include samples/wxProject/*.txt
+include samples/wxProject/*.py
+
include wxPython/lib/*.py
include wxPython/lib/*.txt
include wxPython/lib/editor/*.py
exclude wxPython/*
exclude tests
-exclude SWIG
include src/*.i
include src/*.py
--- /dev/null
+# doodle.py
+
+"""
+This module contains the DoodleWindow class which is a window that you
+can do simple drawings upon.
+"""
+
+
+from wxPython.wx import *
+
+#----------------------------------------------------------------------
+
+class DoodleWindow(wxWindow):
+ menuColours = { 100 : 'Black',
+ 101 : 'Yellow',
+ 102 : 'Red',
+ 103 : 'Green',
+ 104 : 'Blue',
+ 105 : 'Purple',
+ 106 : 'Brown',
+ 107 : 'Aquamarine',
+ 108 : 'Forest Green',
+ 109 : 'Light Blue',
+ 110 : 'Goldenrod',
+ 111 : 'Cyan',
+ 112 : 'Orange',
+ 113 : 'Navy',
+ 114 : 'Dark Grey',
+ 115 : 'Light Grey',
+ }
+ maxThickness = 16
+
+
+ def __init__(self, parent, ID):
+ wxWindow.__init__(self, parent, ID)
+ self.SetBackgroundColour(wxWHITE)
+ self.listeners = []
+ self.thickness = 1
+ self.SetColour("Black")
+ self.lines = []
+ self.x = self.y = 0
+ self.MakeMenu()
+
+ # hook some mouse events
+ EVT_LEFT_DOWN(self, self.OnLeftDown)
+ EVT_LEFT_UP(self, self.OnLeftUp)
+ EVT_RIGHT_UP(self, self.OnRightUp)
+ EVT_MOTION(self, self.OnMotion)
+
+ # and the refresh event
+ EVT_PAINT(self, self.OnPaint)
+
+
+ def __del__(self):
+ self.menu.Destroy()
+
+
+ def SetColour(self, colour):
+ """Set a new colour and make a matching pen"""
+ self.colour = colour
+ self.pen = wxPen(wxNamedColour(self.colour), self.thickness, wxSOLID)
+ self.Notify()
+
+
+ def SetThickness(self, num):
+ """Set a new line thickness and make a matching pen"""
+ self.thickness = num
+ self.pen = wxPen(wxNamedColour(self.colour), self.thickness, wxSOLID)
+ self.Notify()
+
+
+ def GetLinesData(self):
+ return self.lines[:]
+
+
+ def SetLinesData(self, lines):
+ self.lines = lines[:]
+ self.Refresh()
+
+
+ def MakeMenu(self):
+ """Make a menu that can be popped up later"""
+ menu = wxMenu()
+ keys = self.menuColours.keys()
+ keys.sort()
+ for k in keys:
+ text = self.menuColours[k]
+ menu.Append(k, text, checkable=true)
+ EVT_MENU_RANGE(self, 100, 200, self.OnMenuSetColour)
+ EVT_UPDATE_UI_RANGE(self, 100, 200, self.OnCheckMenuColours)
+ menu.Break()
+
+ for x in range(1, self.maxThickness+1):
+ menu.Append(x, str(x), checkable=true)
+ EVT_MENU_RANGE(self, 1, self.maxThickness, self.OnMenuSetThickness)
+ EVT_UPDATE_UI_RANGE(self, 1, self.maxThickness, self.OnCheckMenuThickness)
+ self.menu = menu
+
+
+ # These two event handlers are called before the menu is displayed
+ # to determine which items should be checked.
+ def OnCheckMenuColours(self, event):
+ text = self.menuColours[event.GetId()]
+ if text == self.colour:
+ event.Check(true)
+ else:
+ event.Check(false)
+ def OnCheckMenuThickness(self, event):
+ if event.GetId() == self.thickness:
+ event.Check(true)
+ else:
+ event.Check(false)
+
+
+ def OnLeftDown(self, event):
+ """called when the left mouse button is pressed"""
+ self.curLine = []
+ self.x, self.y = event.GetPositionTuple()
+ self.CaptureMouse()
+
+
+ def OnLeftUp(self, event):
+ """called when the left mouse button is released"""
+ self.lines.append( (self.colour, self.thickness, self.curLine) )
+ self.curLine = []
+ self.ReleaseMouse()
+
+
+ def OnRightUp(self, event):
+ """called when the right mouse button is released, will popup the menu"""
+ pt = event.GetPosition()
+ self.PopupMenu(self.menu, pt)
+
+
+
+ def OnMotion(self, event):
+ """
+ Called when the mouse is in motion. If the left button is
+ dragging then draw a line from the last event position to the
+ current one. Save the coordinants for redraws.
+ """
+ if event.Dragging() and event.LeftIsDown():
+ dc = wxClientDC(self)
+ dc.BeginDrawing()
+ dc.SetPen(self.pen)
+ pos = event.GetPositionTuple()
+ coords = (self.x, self.y) + pos
+ self.curLine.append(coords)
+ dc.DrawLine(self.x, self.y, pos[0], pos[1])
+ self.x, self.y = pos
+ dc.EndDrawing()
+
+
+ def OnPaint(self, event):
+ """
+ Called when the window is exposed. Redraws all the lines that have
+ been drawn already.
+ """
+ dc = wxPaintDC(self)
+ dc.BeginDrawing()
+ for colour, thickness, line in self.lines:
+ pen = wxPen(wxNamedColour(colour), thickness, wxSOLID)
+ dc.SetPen(pen)
+ for coords in line:
+ apply(dc.DrawLine, coords)
+ dc.EndDrawing()
+
+
+ # Event handlers for the popup menu, uses the event ID to determine
+ # the colour or the thickness to set.
+ def OnMenuSetColour(self, event):
+ self.SetColour(self.menuColours[event.GetId()])
+
+ def OnMenuSetThickness(self, event):
+ self.SetThickness(event.GetId())
+
+
+ # Observer pattern. Listeners are registered and then notified
+ # whenever doodle settings change.
+ def AddListener(self, listener):
+ self.listeners.append(listener)
+
+ def Notify(self):
+ for other in self.listeners:
+ other.Update(self.colour, self.thickness)
+
+
+#----------------------------------------------------------------------
+
+class DoodleFrame(wxFrame):
+ def __init__(self, parent):
+ wxFrame.__init__(self, parent, -1, "Doodle Frame", size=(800,600))
+ self.doodle = DoodleWindow(self, -1)
+
+
+#----------------------------------------------------------------------
+
+
+class DoodleApp(wxApp):
+ def OnInit(self):
+ frame = DoodleFrame(None)
+ frame.Show(true)
+ self.SetTopWindow(frame)
+ return true
+
+
+#----------------------------------------------------------------------
+
+if __name__ == '__main__':
+ app = DoodleApp(0)
+ app.MainLoop()
+
--- /dev/null
+(lp1
+(S'Red'
+p2
+I1
+(lp3
+(I44
+I16
+I43
+I16
+ta(I43
+I16
+I42
+I16
+ta(I42
+I16
+I41
+I17
+ta(I41
+I17
+I39
+I19
+ta(I39
+I19
+I37
+I22
+ta(I37
+I22
+I35
+I25
+ta(I35
+I25
+I34
+I29
+ta(I34
+I29
+I33
+I35
+ta(I33
+I35
+I33
+I39
+ta(I33
+I39
+I33
+I45
+ta(I33
+I45
+I33
+I50
+ta(I33
+I50
+I33
+I56
+ta(I33
+I56
+I35
+I60
+ta(I35
+I60
+I38
+I65
+ta(I38
+I65
+I41
+I69
+ta(I41
+I69
+I45
+I72
+ta(I45
+I72
+I51
+I75
+ta(I51
+I75
+I56
+I77
+ta(I56
+I77
+I72
+I80
+ta(I72
+I80
+I88
+I81
+ta(I88
+I81
+I104
+I81
+ta(I104
+I81
+I122
+I81
+ta(I122
+I81
+I138
+I80
+ta(I138
+I80
+I152
+I78
+ta(I152
+I78
+I157
+I75
+ta(I157
+I75
+I160
+I72
+ta(I160
+I72
+I163
+I67
+ta(I163
+I67
+I165
+I62
+ta(I165
+I62
+I166
+I56
+ta(I166
+I56
+I166
+I50
+ta(I166
+I50
+I164
+I45
+ta(I164
+I45
+I162
+I39
+ta(I162
+I39
+I158
+I33
+ta(I158
+I33
+I154
+I30
+ta(I154
+I30
+I149
+I26
+ta(I149
+I26
+I144
+I23
+ta(I144
+I23
+I140
+I21
+ta(I140
+I21
+I136
+I20
+ta(I136
+I20
+I133
+I20
+ta(I133
+I20
+I130
+I20
+ta(I130
+I20
+I128
+I22
+ta(I128
+I22
+I126
+I25
+ta(I126
+I25
+I124
+I28
+ta(I124
+I28
+I122
+I34
+ta(I122
+I34
+I121
+I39
+ta(I121
+I39
+I120
+I45
+ta(I120
+I45
+I120
+I51
+ta(I120
+I51
+I120
+I69
+ta(I120
+I69
+I120
+I83
+ta(I120
+I83
+I121
+I97
+ta(I121
+I97
+I122
+I113
+ta(I122
+I113
+I125
+I127
+ta(I125
+I127
+I128
+I132
+ta(I128
+I132
+I134
+I138
+ta(I134
+I138
+I139
+I141
+ta(I139
+I141
+I145
+I144
+ta(I145
+I144
+I151
+I146
+ta(I151
+I146
+I167
+I147
+ta(I167
+I147
+I172
+I147
+ta(I172
+I147
+I186
+I145
+ta(I186
+I145
+I191
+I142
+ta(I191
+I142
+I196
+I139
+ta(I196
+I139
+I199
+I134
+ta(I199
+I134
+I202
+I120
+ta(I202
+I120
+I204
+I106
+ta(I204
+I106
+I204
+I100
+ta(I204
+I100
+I204
+I86
+ta(I204
+I86
+I204
+I80
+ta(I204
+I80
+I202
+I74
+ta(I202
+I74
+I198
+I58
+ta(I198
+I58
+I195
+I54
+ta(I195
+I54
+I191
+I48
+ta(I191
+I48
+I186
+I43
+ta(I186
+I43
+I181
+I39
+ta(I181
+I39
+I175
+I36
+ta(I175
+I36
+I170
+I35
+ta(I170
+I35
+I166
+I34
+ta(I166
+I34
+I162
+I34
+ta(I162
+I34
+I159
+I36
+ta(I159
+I36
+I157
+I40
+ta(I157
+I40
+I155
+I44
+ta(I155
+I44
+I154
+I50
+ta(I154
+I50
+I153
+I55
+ta(I153
+I55
+I153
+I61
+ta(I153
+I61
+I155
+I66
+ta(I155
+I66
+I157
+I71
+ta(I157
+I71
+I160
+I77
+ta(I160
+I77
+I163
+I81
+ta(I163
+I81
+I168
+I85
+ta(I168
+I85
+I174
+I89
+ta(I174
+I89
+I188
+I91
+ta(I188
+I91
+I208
+I93
+ta(I208
+I93
+I224
+I95
+ta(I224
+I95
+I242
+I95
+ta(I242
+I95
+I258
+I95
+ta(I258
+I95
+I278
+I92
+ta(I278
+I92
+I298
+I88
+ta(I298
+I88
+I304
+I84
+ta(I304
+I84
+I310
+I80
+ta(I310
+I80
+I315
+I75
+ta(I315
+I75
+I318
+I70
+ta(I318
+I70
+I319
+I64
+ta(I319
+I64
+I319
+I59
+ta(I319
+I59
+I317
+I54
+ta(I317
+I54
+I314
+I40
+ta(I314
+I40
+I310
+I37
+ta(I310
+I37
+I306
+I33
+ta(I306
+I33
+I301
+I30
+ta(I301
+I30
+I296
+I27
+ta(I296
+I27
+I292
+I26
+ta(I292
+I26
+I288
+I25
+ta(I288
+I25
+I285
+I25
+ta(I285
+I25
+I282
+I25
+ta(I282
+I25
+I279
+I27
+ta(I279
+I27
+I278
+I30
+ta(I278
+I30
+I276
+I35
+ta(I276
+I35
+I275
+I41
+ta(I275
+I41
+I275
+I46
+ta(I275
+I46
+I275
+I52
+ta(I275
+I52
+I276
+I57
+ta(I276
+I57
+I278
+I63
+ta(I278
+I63
+I281
+I68
+ta(I281
+I68
+I284
+I72
+ta(I284
+I72
+I288
+I76
+ta(I288
+I76
+I302
+I79
+ta(I302
+I79
+I307
+I82
+ta(I307
+I82
+I321
+I83
+ta(I321
+I83
+I337
+I84
+ta(I337
+I84
+I351
+I83
+ta(I351
+I83
+I367
+I81
+ta(I367
+I81
+I381
+I79
+ta(I381
+I79
+I386
+I75
+ta(I386
+I75
+I391
+I72
+ta(I391
+I72
+I394
+I67
+ta(I394
+I67
+I397
+I62
+ta(I397
+I62
+I398
+I48
+ta(I398
+I48
+I399
+I44
+ta(I399
+I44
+I398
+I38
+ta(I398
+I38
+I394
+I32
+ta(I394
+I32
+I390
+I29
+ta(I390
+I29
+I385
+I24
+ta(I385
+I24
+I371
+I20
+ta(I371
+I20
+I366
+I17
+ta(I366
+I17
+I360
+I15
+ta(I360
+I15
+I354
+I13
+ta(I354
+I13
+I340
+I11
+ta(I340
+I11
+I336
+I11
+ta(I336
+I11
+I332
+I11
+ta(I332
+I11
+I327
+I12
+ta(I327
+I12
+I324
+I14
+ta(I324
+I14
+I321
+I18
+ta(I321
+I18
+I320
+I24
+ta(I320
+I24
+I318
+I29
+ta(I318
+I29
+I318
+I35
+ta(I318
+I35
+I318
+I51
+ta(I318
+I51
+I318
+I57
+ta(I318
+I57
+I319
+I73
+ta(I319
+I73
+I321
+I79
+ta(I321
+I79
+I323
+I84
+ta(I323
+I84
+I327
+I89
+ta(I327
+I89
+I331
+I93
+ta(I331
+I93
+I335
+I96
+ta(I335
+I96
+I340
+I98
+ta(I340
+I98
+I354
+I99
+ta(I354
+I99
+I368
+I98
+ta(I368
+I98
+I384
+I97
+ta(I384
+I97
+I398
+I94
+ta(I398
+I94
+I403
+I89
+ta(I403
+I89
+I408
+I85
+ta(I408
+I85
+I409
+I80
+ta(I409
+I80
+I410
+I74
+ta(I410
+I74
+I410
+I69
+ta(I410
+I69
+I408
+I64
+ta(I408
+I64
+I404
+I59
+ta(I404
+I59
+I400
+I54
+ta(I400
+I54
+I386
+I49
+ta(I386
+I49
+I380
+I46
+ta(I380
+I46
+I366
+I42
+ta(I366
+I42
+I362
+I40
+ta(I362
+I40
+I357
+I37
+ta(I357
+I37
+I352
+I36
+ta(I352
+I36
+I349
+I36
+ta(I349
+I36
+I347
+I36
+ta(I347
+I36
+I346
+I36
+ta(I346
+I36
+I345
+I38
+ta(I345
+I38
+I345
+I42
+ta(I345
+I42
+I345
+I47
+ta(I345
+I47
+I345
+I52
+ta(I345
+I52
+I346
+I58
+ta(I346
+I58
+I348
+I64
+ta(I348
+I64
+I351
+I69
+ta(I351
+I69
+I355
+I75
+ta(I355
+I75
+I361
+I79
+ta(I361
+I79
+I366
+I83
+ta(I366
+I83
+I384
+I87
+ta(I384
+I87
+I400
+I89
+ta(I400
+I89
+I416
+I91
+ta(I416
+I91
+I436
+I91
+ta(I436
+I91
+I456
+I91
+ta(I456
+I91
+I476
+I90
+ta(I476
+I90
+I494
+I87
+ta(I494
+I87
+I512
+I83
+ta(I512
+I83
+I518
+I79
+ta(I518
+I79
+I534
+I74
+ta(I534
+I74
+I537
+I69
+ta(I537
+I69
+I539
+I63
+ta(I539
+I63
+I540
+I58
+ta(I540
+I58
+I540
+I52
+ta(I540
+I52
+I537
+I48
+ta(I537
+I48
+I533
+I42
+ta(I533
+I42
+I528
+I37
+ta(I528
+I37
+I512
+I32
+ta(I512
+I32
+I498
+I29
+ta(I498
+I29
+I492
+I27
+ta(I492
+I27
+I488
+I26
+ta(I488
+I26
+I484
+I26
+ta(I484
+I26
+I480
+I27
+ta(I480
+I27
+I476
+I31
+ta(I476
+I31
+I473
+I36
+ta(I473
+I36
+I472
+I41
+ta(I472
+I41
+I471
+I47
+ta(I471
+I47
+I471
+I61
+ta(I471
+I61
+I471
+I75
+ta(I471
+I75
+I474
+I79
+ta(I474
+I79
+I477
+I85
+ta(I477
+I85
+I480
+I89
+ta(I480
+I89
+I486
+I93
+ta(I486
+I93
+I502
+I96
+ta(I502
+I96
+I516
+I98
+ta(I516
+I98
+I534
+I99
+ta(I534
+I99
+I552
+I99
+ta(I552
+I99
+I570
+I98
+ta(I570
+I98
+I590
+I96
+ta(I590
+I96
+I608
+I93
+ta(I608
+I93
+I626
+I89
+ta(I626
+I89
+I642
+I85
+ta(I642
+I85
+I646
+I80
+ta(I646
+I80
+I649
+I75
+ta(I649
+I75
+I651
+I69
+ta(I651
+I69
+I651
+I65
+ta(I651
+I65
+I650
+I60
+ta(I650
+I60
+I646
+I55
+ta(I646
+I55
+I632
+I50
+ta(I632
+I50
+I626
+I46
+ta(I626
+I46
+I620
+I43
+ta(I620
+I43
+I606
+I41
+ta(I606
+I41
+I592
+I39
+ta(I592
+I39
+I578
+I37
+ta(I578
+I37
+I572
+I36
+ta(I572
+I36
+I568
+I36
+ta(I568
+I36
+I564
+I36
+ta(I564
+I36
+I561
+I39
+ta(I561
+I39
+I559
+I42
+ta(I559
+I42
+I558
+I46
+ta(I558
+I46
+I557
+I51
+ta(I557
+I51
+I557
+I56
+ta(I557
+I56
+I559
+I62
+ta(I559
+I62
+I561
+I67
+ta(I561
+I67
+I564
+I73
+ta(I564
+I73
+I570
+I78
+ta(I570
+I78
+I574
+I83
+ta(I574
+I83
+I579
+I85
+ta(I579
+I85
+I593
+I90
+ta(I593
+I90
+I609
+I92
+ta(I609
+I92
+I623
+I93
+ta(I623
+I93
+I641
+I94
+ta(I641
+I94
+I659
+I94
+ta(I659
+I94
+I673
+I93
+ta(I673
+I93
+I689
+I91
+ta(I689
+I91
+I693
+I87
+ta(I693
+I87
+I698
+I83
+ta(I698
+I83
+I700
+I79
+ta(I700
+I79
+I703
+I74
+ta(I703
+I74
+I703
+I68
+ta(I703
+I68
+I703
+I63
+ta(I703
+I63
+I700
+I58
+ta(I700
+I58
+I696
+I53
+ta(I696
+I53
+I692
+I48
+ta(I692
+I48
+I678
+I44
+ta(I678
+I44
+I672
+I41
+ta(I672
+I41
+I668
+I39
+ta(I668
+I39
+I662
+I37
+ta(I662
+I37
+I657
+I37
+ta(I657
+I37
+I652
+I37
+ta(I652
+I37
+I647
+I37
+ta(I647
+I37
+I643
+I39
+ta(I643
+I39
+I639
+I43
+ta(I639
+I43
+I635
+I47
+ta(I635
+I47
+I633
+I53
+ta(I633
+I53
+I631
+I59
+ta(I631
+I59
+I630
+I65
+ta(I630
+I65
+I629
+I83
+ta(I629
+I83
+I629
+I99
+ta(I629
+I99
+I629
+I105
+ta(I629
+I105
+I630
+I111
+ta(I630
+I111
+I631
+I117
+ta(I631
+I117
+I633
+I122
+ta(I633
+I122
+I636
+I125
+ta(I636
+I125
+I641
+I128
+ta(I641
+I128
+I646
+I131
+ta(I646
+I131
+I652
+I133
+ta(I652
+I133
+I656
+I133
+ta(I656
+I133
+I662
+I133
+ta(I662
+I133
+I666
+I132
+ta(I666
+I132
+I670
+I130
+ta(I670
+I130
+I673
+I128
+ta(I673
+I128
+I675
+I124
+ta(I675
+I124
+I676
+I121
+ta(I676
+I121
+I676
+I117
+ta(I676
+I117
+I675
+I114
+ta(I675
+I114
+I672
+I110
+ta(I672
+I110
+I668
+I106
+ta(I668
+I106
+I662
+I103
+ta(I662
+I103
+I656
+I100
+ta(I656
+I100
+I642
+I98
+ta(I642
+I98
+I636
+I97
+ta(I636
+I97
+I630
+I97
+ta(I630
+I97
+I616
+I96
+ta(I616
+I96
+I611
+I97
+ta(I611
+I97
+I605
+I99
+ta(I605
+I99
+I601
+I102
+ta(I601
+I102
+I596
+I107
+ta(I596
+I107
+I593
+I112
+ta(I593
+I112
+I590
+I118
+ta(I590
+I118
+I589
+I123
+ta(I589
+I123
+I589
+I128
+ta(I589
+I128
+I589
+I133
+ta(I589
+I133
+I590
+I139
+ta(I590
+I139
+I592
+I144
+ta(I592
+I144
+I596
+I147
+ta(I596
+I147
+I600
+I152
+ta(I600
+I152
+I604
+I155
+ta(I604
+I155
+I610
+I158
+ta(I610
+I158
+I616
+I160
+ta(I616
+I160
+I622
+I161
+ta(I622
+I161
+I640
+I161
+ta(I640
+I161
+I645
+I161
+ta(I645
+I161
+I651
+I161
+ta(I651
+I161
+I655
+I159
+ta(I655
+I159
+I659
+I156
+ta(I659
+I156
+I662
+I153
+ta(I662
+I153
+I663
+I150
+ta(I663
+I150
+I663
+I146
+ta(I663
+I146
+I662
+I141
+ta(I662
+I141
+I659
+I136
+ta(I659
+I136
+I655
+I130
+ta(I655
+I130
+I650
+I125
+ta(I650
+I125
+I644
+I120
+ta(I644
+I120
+I638
+I116
+ta(I638
+I116
+I633
+I111
+ta(I633
+I111
+I617
+I107
+ta(I617
+I107
+I601
+I103
+ta(I601
+I103
+I595
+I101
+ta(I595
+I101
+I575
+I99
+ta(I575
+I99
+I559
+I99
+ta(I559
+I99
+I553
+I99
+ta(I553
+I99
+I547
+I103
+ta(I547
+I103
+I543
+I107
+ta(I543
+I107
+I539
+I121
+ta(I539
+I121
+I537
+I127
+ta(I537
+I127
+I535
+I143
+ta(I535
+I143
+I534
+I157
+ta(I534
+I157
+I533
+I173
+ta(I533
+I173
+I533
+I178
+ta(I533
+I178
+I535
+I183
+ta(I535
+I183
+I537
+I188
+ta(I537
+I188
+I540
+I191
+ta(I540
+I191
+I543
+I195
+ta(I543
+I195
+I547
+I196
+ta(I547
+I196
+I551
+I198
+ta(I551
+I198
+I556
+I198
+ta(I556
+I198
+I562
+I198
+ta(I562
+I198
+I568
+I196
+ta(I568
+I196
+I573
+I194
+ta(I573
+I194
+I579
+I190
+ta(I579
+I190
+I582
+I187
+ta(I582
+I187
+I585
+I182
+ta(I585
+I182
+I587
+I177
+ta(I587
+I177
+I587
+I172
+ta(I587
+I172
+I586
+I158
+ta(I586
+I158
+I582
+I154
+ta(I582
+I154
+I578
+I149
+ta(I578
+I149
+I564
+I135
+ta(I564
+I135
+I550
+I131
+ta(I550
+I131
+I536
+I128
+ta(I536
+I128
+I520
+I125
+ta(I520
+I125
+I502
+I122
+ta(I502
+I122
+I484
+I119
+ta(I484
+I119
+I464
+I117
+ta(I464
+I117
+I442
+I116
+ta(I442
+I116
+I424
+I116
+ta(I424
+I116
+I404
+I117
+ta(I404
+I117
+I388
+I120
+ta(I388
+I120
+I382
+I124
+ta(I382
+I124
+I378
+I130
+ta(I378
+I130
+I375
+I136
+ta(I375
+I136
+I373
+I142
+ta(I373
+I142
+I372
+I156
+ta(I372
+I156
+I372
+I161
+ta(I372
+I161
+I374
+I167
+ta(I374
+I167
+I376
+I172
+ta(I376
+I172
+I379
+I177
+ta(I379
+I177
+I383
+I180
+ta(I383
+I180
+I387
+I183
+ta(I387
+I183
+I391
+I185
+ta(I391
+I185
+I395
+I187
+ta(I395
+I187
+I399
+I187
+ta(I399
+I187
+I403
+I187
+ta(I403
+I187
+I407
+I186
+ta(I407
+I186
+I411
+I184
+ta(I411
+I184
+I415
+I180
+ta(I415
+I180
+I418
+I177
+ta(I418
+I177
+I420
+I172
+ta(I420
+I172
+I420
+I167
+ta(I420
+I167
+I420
+I161
+ta(I420
+I161
+I418
+I147
+ta(I418
+I147
+I414
+I141
+ta(I414
+I141
+I410
+I136
+ta(I410
+I136
+I396
+I122
+ta(I396
+I122
+I392
+I118
+ta(I392
+I118
+I386
+I104
+ta(I386
+I104
+I370
+I100
+ta(I370
+I100
+I364
+I97
+ta(I364
+I97
+I350
+I94
+ta(I350
+I94
+I334
+I91
+ta(I334
+I91
+I318
+I90
+ta(I318
+I90
+I312
+I90
+ta(I312
+I90
+I308
+I92
+ta(I308
+I92
+I304
+I96
+ta(I304
+I96
+I301
+I101
+ta(I301
+I101
+I299
+I106
+ta(I299
+I106
+I298
+I122
+ta(I298
+I122
+I298
+I127
+ta(I298
+I127
+I298
+I133
+ta(I298
+I133
+I300
+I139
+ta(I300
+I139
+I303
+I144
+ta(I303
+I144
+I305
+I149
+ta(I305
+I149
+I309
+I154
+ta(I309
+I154
+I313
+I157
+ta(I313
+I157
+I318
+I160
+ta(I318
+I160
+I332
+I162
+ta(I332
+I162
+I346
+I163
+ta(I346
+I163
+I352
+I163
+ta(I352
+I163
+I366
+I163
+ta(I366
+I163
+I372
+I161
+ta(I372
+I161
+I377
+I158
+ta(I377
+I158
+I379
+I154
+ta(I379
+I154
+I382
+I150
+ta(I382
+I150
+I382
+I145
+ta(I382
+I145
+I382
+I140
+ta(I382
+I140
+I379
+I126
+ta(I379
+I126
+I376
+I121
+ta(I376
+I121
+I372
+I115
+ta(I372
+I115
+I368
+I111
+ta(I368
+I111
+I362
+I106
+ta(I362
+I106
+I348
+I102
+ta(I348
+I102
+I342
+I98
+ta(I342
+I98
+I328
+I96
+ta(I328
+I96
+I322
+I94
+ta(I322
+I94
+I317
+I94
+ta(I317
+I94
+I312
+I94
+ta(I312
+I94
+I307
+I97
+ta(I307
+I97
+I302
+I100
+ta(I302
+I100
+I299
+I105
+ta(I299
+I105
+I296
+I119
+ta(I296
+I119
+I294
+I125
+ta(I294
+I125
+I294
+I139
+ta(I294
+I139
+I294
+I153
+ta(I294
+I153
+I294
+I167
+ta(I294
+I167
+I297
+I181
+ta(I297
+I181
+I301
+I195
+ta(I301
+I195
+I306
+I201
+ta(I306
+I201
+I312
+I205
+ta(I312
+I205
+I318
+I207
+ta(I318
+I207
+I336
+I210
+ta(I336
+I210
+I354
+I210
+ta(I354
+I210
+I372
+I210
+ta(I372
+I210
+I392
+I209
+ta(I392
+I209
+I408
+I206
+ta(I408
+I206
+I414
+I202
+ta(I414
+I202
+I419
+I197
+ta(I419
+I197
+I420
+I193
+ta(I420
+I193
+I421
+I187
+ta(I421
+I187
+I420
+I181
+ta(I420
+I181
+I416
+I175
+ta(I416
+I175
+I411
+I170
+ta(I411
+I170
+I395
+I164
+ta(I395
+I164
+I379
+I160
+ta(I379
+I160
+I361
+I154
+ta(I361
+I154
+I343
+I151
+ta(I343
+I151
+I319
+I147
+ta(I319
+I147
+I299
+I144
+ta(I299
+I144
+I279
+I142
+ta(I279
+I142
+I257
+I141
+ta(I257
+I141
+I241
+I141
+ta(I241
+I141
+I227
+I141
+ta(I227
+I141
+I222
+I143
+ta(I222
+I143
+I218
+I147
+ta(I218
+I147
+I215
+I152
+ta(I215
+I152
+I214
+I157
+ta(I214
+I157
+I213
+I171
+ta(I213
+I171
+I213
+I177
+ta(I213
+I177
+I213
+I183
+ta(I213
+I183
+I214
+I197
+ta(I214
+I197
+I216
+I202
+ta(I216
+I202
+I219
+I208
+ta(I219
+I208
+I223
+I213
+ta(I223
+I213
+I229
+I217
+ta(I229
+I217
+I243
+I220
+ta(I243
+I220
+I263
+I222
+ta(I263
+I222
+I281
+I223
+ta(I281
+I223
+I301
+I223
+ta(I301
+I223
+I319
+I222
+ta(I319
+I222
+I333
+I219
+ta(I333
+I219
+I338
+I215
+ta(I338
+I215
+I340
+I210
+ta(I340
+I210
+I341
+I204
+ta(I341
+I204
+I341
+I198
+ta(I341
+I198
+I339
+I184
+ta(I339
+I184
+I334
+I178
+ta(I334
+I178
+I329
+I173
+ta(I329
+I173
+I313
+I159
+ta(I313
+I159
+I295
+I154
+ta(I295
+I154
+I277
+I140
+ta(I277
+I140
+I261
+I138
+ta(I261
+I138
+I243
+I134
+ta(I243
+I134
+I223
+I131
+ta(I223
+I131
+I203
+I128
+ta(I203
+I128
+I187
+I126
+ta(I187
+I126
+I171
+I126
+ta(I171
+I126
+I167
+I126
+ta(I167
+I126
+I161
+I127
+ta(I161
+I127
+I157
+I131
+ta(I157
+I131
+I155
+I137
+ta(I155
+I137
+I153
+I151
+ta(I153
+I151
+I151
+I167
+ta(I151
+I167
+I151
+I181
+ta(I151
+I181
+I151
+I197
+ta(I151
+I197
+I151
+I211
+ta(I151
+I211
+I153
+I217
+ta(I153
+I217
+I155
+I222
+ta(I155
+I222
+I158
+I226
+ta(I158
+I226
+I161
+I229
+ta(I161
+I229
+I165
+I232
+ta(I165
+I232
+I171
+I232
+ta(I171
+I232
+I176
+I232
+ta(I176
+I232
+I182
+I230
+ta(I182
+I230
+I187
+I227
+ta(I187
+I227
+I192
+I222
+ta(I192
+I222
+I195
+I218
+ta(I195
+I218
+I197
+I212
+ta(I197
+I212
+I198
+I206
+ta(I198
+I206
+I198
+I201
+ta(I198
+I201
+I197
+I187
+ta(I197
+I187
+I195
+I173
+ta(I195
+I173
+I191
+I168
+ta(I191
+I168
+I187
+I163
+ta(I187
+I163
+I182
+I149
+ta(I182
+I149
+I176
+I145
+ta(I176
+I145
+I162
+I141
+ta(I162
+I141
+I156
+I137
+ta(I156
+I137
+I140
+I133
+ta(I140
+I133
+I124
+I131
+ta(I124
+I131
+I108
+I130
+ta(I108
+I130
+I94
+I130
+ta(I94
+I130
+I80
+I131
+ta(I80
+I131
+I76
+I134
+ta(I76
+I134
+I71
+I137
+ta(I71
+I137
+I66
+I143
+ta(I66
+I143
+I62
+I149
+ta(I62
+I149
+I59
+I155
+ta(I59
+I155
+I57
+I171
+ta(I57
+I171
+I56
+I185
+ta(I56
+I185
+I55
+I199
+ta(I55
+I199
+I55
+I215
+ta(I55
+I215
+I55
+I229
+ta(I55
+I229
+I57
+I234
+ta(I57
+I234
+I59
+I240
+ta(I59
+I240
+I63
+I244
+ta(I63
+I244
+I67
+I247
+ta(I67
+I247
+I71
+I249
+ta(I71
+I249
+I87
+I251
+ta(I87
+I251
+I92
+I251
+ta(I92
+I251
+I98
+I250
+ta(I98
+I250
+I102
+I248
+ta(I102
+I248
+I106
+I244
+ta(I106
+I244
+I110
+I239
+ta(I110
+I239
+I112
+I233
+ta(I112
+I233
+I113
+I227
+ta(I113
+I227
+I113
+I221
+ta(I113
+I221
+I113
+I215
+ta(I113
+I215
+I112
+I201
+ta(I112
+I201
+I109
+I195
+ta(I109
+I195
+I107
+I189
+ta(I107
+I189
+I103
+I183
+ta(I103
+I183
+I99
+I179
+ta(I99
+I179
+I95
+I175
+ta(I95
+I175
+I90
+I171
+ta(I90
+I171
+I84
+I169
+ta(I84
+I169
+I78
+I168
+ta(I78
+I168
+I74
+I167
+ta(I74
+I167
+I69
+I167
+ta(I69
+I167
+I65
+I169
+ta(I65
+I169
+I62
+I172
+ta(I62
+I172
+I58
+I178
+ta(I58
+I178
+I55
+I184
+ta(I55
+I184
+I52
+I189
+ta(I52
+I189
+I48
+I209
+ta(I48
+I209
+I46
+I227
+ta(I46
+I227
+I43
+I243
+ta(I43
+I243
+I41
+I259
+ta(I41
+I259
+I38
+I277
+ta(I38
+I277
+I38
+I295
+ta(I38
+I295
+I38
+I311
+ta(I38
+I311
+I39
+I317
+ta(I39
+I317
+I42
+I323
+ta(I42
+I323
+I46
+I327
+ta(I46
+I327
+I52
+I330
+ta(I52
+I330
+I58
+I332
+ta(I58
+I332
+I63
+I333
+ta(I63
+I333
+I77
+I333
+ta(I77
+I333
+I82
+I331
+ta(I82
+I331
+I87
+I329
+ta(I87
+I329
+I91
+I325
+ta(I91
+I325
+I95
+I320
+ta(I95
+I320
+I99
+I315
+ta(I99
+I315
+I102
+I309
+ta(I102
+I309
+I104
+I304
+ta(I104
+I304
+I105
+I298
+ta(I105
+I298
+I105
+I293
+ta(I105
+I293
+I103
+I288
+ta(I103
+I288
+I101
+I283
+ta(I101
+I283
+I97
+I278
+ta(I97
+I278
+I92
+I275
+ta(I92
+I275
+I88
+I272
+ta(I88
+I272
+I84
+I271
+ta(I84
+I271
+I80
+I270
+ta(I80
+I270
+I76
+I271
+ta(I76
+I271
+I72
+I273
+ta(I72
+I273
+I68
+I275
+ta(I68
+I275
+I65
+I278
+ta(I65
+I278
+I61
+I282
+ta(I61
+I282
+I59
+I286
+ta(I59
+I286
+I57
+I292
+ta(I57
+I292
+I56
+I297
+ta(I56
+I297
+I56
+I302
+ta(I56
+I302
+I58
+I308
+ta(I58
+I308
+I60
+I314
+ta(I60
+I314
+I63
+I319
+ta(I63
+I319
+I67
+I324
+ta(I67
+I324
+I73
+I328
+ta(I73
+I328
+I78
+I332
+ta(I78
+I332
+I84
+I334
+ta(I84
+I334
+I89
+I336
+ta(I89
+I336
+I105
+I337
+ta(I105
+I337
+I119
+I337
+ta(I119
+I337
+I135
+I335
+ta(I135
+I335
+I153
+I331
+ta(I153
+I331
+I169
+I327
+ta(I169
+I327
+I174
+I322
+ta(I174
+I322
+I180
+I316
+ta(I180
+I316
+I183
+I302
+ta(I183
+I302
+I186
+I296
+ta(I186
+I296
+I187
+I282
+ta(I187
+I282
+I187
+I266
+ta(I187
+I266
+I185
+I252
+ta(I185
+I252
+I182
+I238
+ta(I182
+I238
+I178
+I224
+ta(I178
+I224
+I173
+I220
+ta(I173
+I220
+I159
+I206
+ta(I159
+I206
+I153
+I203
+ta(I153
+I203
+I149
+I201
+ta(I149
+I201
+I144
+I199
+ta(I144
+I199
+I140
+I199
+ta(I140
+I199
+I137
+I200
+ta(I137
+I200
+I135
+I202
+ta(I135
+I202
+I133
+I208
+ta(I133
+I208
+I132
+I213
+ta(I132
+I213
+I131
+I218
+ta(I131
+I218
+I131
+I234
+ta(I131
+I234
+I131
+I250
+ta(I131
+I250
+I133
+I264
+ta(I133
+I264
+I135
+I268
+ta(I135
+I268
+I138
+I274
+ta(I138
+I274
+I143
+I279
+ta(I143
+I279
+I148
+I283
+ta(I148
+I283
+I154
+I287
+ta(I154
+I287
+I160
+I290
+ta(I160
+I290
+I178
+I291
+ta(I178
+I291
+I194
+I292
+ta(I194
+I292
+I210
+I292
+ta(I210
+I292
+I224
+I290
+ta(I224
+I290
+I230
+I288
+ta(I230
+I288
+I236
+I284
+ta(I236
+I284
+I241
+I280
+ta(I241
+I280
+I245
+I276
+ta(I245
+I276
+I249
+I271
+ta(I249
+I271
+I251
+I257
+ta(I251
+I257
+I252
+I252
+ta(I252
+I252
+I252
+I238
+ta(I252
+I238
+I251
+I232
+ta(I251
+I232
+I248
+I218
+ta(I248
+I218
+I244
+I212
+ta(I244
+I212
+I240
+I207
+ta(I240
+I207
+I226
+I193
+ta(I226
+I193
+I221
+I189
+ta(I221
+I189
+I207
+I186
+ta(I207
+I186
+I203
+I183
+ta(I203
+I183
+I198
+I182
+ta(I198
+I182
+I194
+I182
+ta(I194
+I182
+I191
+I182
+ta(I191
+I182
+I189
+I184
+ta(I189
+I184
+I187
+I187
+ta(I187
+I187
+I186
+I193
+ta(I186
+I193
+I186
+I199
+ta(I186
+I199
+I186
+I215
+ta(I186
+I215
+I187
+I231
+ta(I187
+I231
+I188
+I247
+ta(I188
+I247
+I189
+I263
+ta(I189
+I263
+I192
+I279
+ta(I192
+I279
+I194
+I284
+ta(I194
+I284
+I197
+I290
+ta(I197
+I290
+I203
+I296
+ta(I203
+I296
+I208
+I299
+ta(I208
+I299
+I214
+I302
+ta(I214
+I302
+I230
+I303
+ta(I230
+I303
+I246
+I304
+ta(I246
+I304
+I262
+I304
+ta(I262
+I304
+I278
+I301
+ta(I278
+I301
+I294
+I298
+ta(I294
+I298
+I308
+I293
+ta(I308
+I293
+I313
+I287
+ta(I313
+I287
+I316
+I282
+ta(I316
+I282
+I319
+I268
+ta(I319
+I268
+I321
+I254
+ta(I321
+I254
+I322
+I240
+ta(I322
+I240
+I322
+I226
+ta(I322
+I226
+I319
+I212
+ta(I319
+I212
+I315
+I198
+ta(I315
+I198
+I311
+I194
+ta(I311
+I194
+I306
+I180
+ta(I306
+I180
+I300
+I177
+ta(I300
+I177
+I286
+I175
+ta(I286
+I175
+I282
+I174
+ta(I282
+I174
+I276
+I174
+ta(I276
+I174
+I272
+I174
+ta(I272
+I174
+I268
+I176
+ta(I268
+I176
+I265
+I181
+ta(I265
+I181
+I263
+I187
+ta(I263
+I187
+I262
+I192
+ta(I262
+I192
+I261
+I198
+ta(I261
+I198
+I261
+I212
+ta(I261
+I212
+I261
+I226
+ta(I261
+I226
+I262
+I244
+ta(I262
+I244
+I264
+I258
+ta(I264
+I258
+I268
+I274
+ta(I268
+I274
+I273
+I280
+ta(I273
+I280
+I279
+I296
+ta(I279
+I296
+I285
+I301
+ta(I285
+I301
+I301
+I306
+ta(I301
+I306
+I317
+I309
+ta(I317
+I309
+I333
+I311
+ta(I333
+I311
+I351
+I311
+ta(I351
+I311
+I369
+I311
+ta(I369
+I311
+I387
+I310
+ta(I387
+I310
+I401
+I306
+ta(I401
+I306
+I406
+I303
+ta(I406
+I303
+I411
+I299
+ta(I411
+I299
+I415
+I294
+ta(I415
+I294
+I419
+I280
+ta(I419
+I280
+I421
+I275
+ta(I421
+I275
+I421
+I261
+ta(I421
+I261
+I421
+I255
+ta(I421
+I255
+I416
+I241
+ta(I416
+I241
+I411
+I235
+ta(I411
+I235
+I397
+I231
+ta(I397
+I231
+I391
+I227
+ta(I391
+I227
+I385
+I224
+ta(I385
+I224
+I371
+I222
+ta(I371
+I222
+I365
+I221
+ta(I365
+I221
+I361
+I221
+ta(I361
+I221
+I358
+I221
+ta(I358
+I221
+I356
+I223
+ta(I356
+I223
+I354
+I227
+ta(I354
+I227
+I353
+I233
+ta(I353
+I233
+I353
+I238
+ta(I353
+I238
+I353
+I252
+ta(I353
+I252
+I353
+I268
+ta(I353
+I268
+I355
+I282
+ta(I355
+I282
+I358
+I298
+ta(I358
+I298
+I362
+I312
+ta(I362
+I312
+I365
+I326
+ta(I365
+I326
+I371
+I330
+ta(I371
+I330
+I376
+I333
+ta(I376
+I333
+I382
+I336
+ta(I382
+I336
+I388
+I338
+ta(I388
+I338
+I394
+I338
+ta(I394
+I338
+I408
+I337
+ta(I408
+I337
+I424
+I334
+ta(I424
+I334
+I429
+I331
+ta(I429
+I331
+I435
+I317
+ta(I435
+I317
+I441
+I313
+ta(I441
+I313
+I445
+I299
+ta(I445
+I299
+I448
+I293
+ta(I448
+I293
+I450
+I287
+ta(I450
+I287
+I451
+I273
+ta(I451
+I273
+I451
+I257
+ta(I451
+I257
+I449
+I243
+ta(I449
+I243
+I446
+I229
+ta(I446
+I229
+I442
+I223
+ta(I442
+I223
+I437
+I218
+ta(I437
+I218
+I432
+I213
+ta(I432
+I213
+I418
+I209
+ta(I418
+I209
+I414
+I206
+ta(I414
+I206
+I409
+I204
+ta(I409
+I204
+I405
+I203
+ta(I405
+I203
+I402
+I203
+ta(I402
+I203
+I399
+I203
+ta(I399
+I203
+I396
+I206
+ta(I396
+I206
+I393
+I212
+ta(I393
+I212
+I391
+I217
+ta(I391
+I217
+I390
+I223
+ta(I390
+I223
+I389
+I229
+ta(I389
+I229
+I389
+I247
+ta(I389
+I247
+I389
+I261
+ta(I389
+I261
+I391
+I277
+ta(I391
+I277
+I393
+I282
+ta(I393
+I282
+I396
+I287
+ta(I396
+I287
+I401
+I292
+ta(I401
+I292
+I406
+I295
+ta(I406
+I295
+I412
+I297
+ta(I412
+I297
+I418
+I299
+ta(I418
+I299
+I434
+I299
+ta(I434
+I299
+I450
+I297
+ta(I450
+I297
+I464
+I294
+ta(I464
+I294
+I470
+I290
+ta(I470
+I290
+I476
+I286
+ta(I476
+I286
+I481
+I280
+ta(I481
+I280
+I485
+I266
+ta(I485
+I266
+I488
+I260
+ta(I488
+I260
+I490
+I254
+ta(I490
+I254
+I490
+I238
+ta(I490
+I238
+I490
+I224
+ta(I490
+I224
+I489
+I208
+ta(I489
+I208
+I486
+I202
+ta(I486
+I202
+I483
+I196
+ta(I483
+I196
+I479
+I191
+ta(I479
+I191
+I474
+I185
+ta(I474
+I185
+I468
+I182
+ta(I468
+I182
+I462
+I178
+ta(I462
+I178
+I456
+I176
+ta(I456
+I176
+I452
+I175
+ta(I452
+I175
+I447
+I175
+ta(I447
+I175
+I444
+I175
+ta(I444
+I175
+I441
+I178
+ta(I441
+I178
+I439
+I181
+ta(I439
+I181
+I438
+I186
+ta(I438
+I186
+I437
+I200
+ta(I437
+I200
+I437
+I214
+ta(I437
+I214
+I439
+I230
+ta(I439
+I230
+I441
+I244
+ta(I441
+I244
+I444
+I260
+ta(I444
+I260
+I447
+I276
+ta(I447
+I276
+I452
+I281
+ta(I452
+I281
+I455
+I286
+ta(I455
+I286
+I460
+I289
+ta(I460
+I289
+I466
+I291
+ta(I466
+I291
+I470
+I292
+ta(I470
+I292
+I476
+I292
+ta(I476
+I292
+I481
+I292
+ta(I481
+I292
+I486
+I289
+ta(I486
+I289
+I491
+I285
+ta(I491
+I285
+I495
+I280
+ta(I495
+I280
+I499
+I266
+ta(I499
+I266
+I503
+I260
+ta(I503
+I260
+I505
+I254
+ta(I505
+I254
+I506
+I248
+ta(I506
+I248
+I506
+I234
+ta(I506
+I234
+I506
+I220
+ta(I506
+I220
+I506
+I206
+ta(I506
+I206
+I503
+I200
+ta(I503
+I200
+I500
+I194
+ta(I500
+I194
+I496
+I190
+ta(I496
+I190
+I492
+I185
+ta(I492
+I185
+I487
+I180
+ta(I487
+I180
+I483
+I177
+ta(I483
+I177
+I480
+I174
+ta(I480
+I174
+I476
+I172
+ta(I476
+I172
+I473
+I172
+ta(I473
+I172
+I471
+I172
+ta(I471
+I172
+I469
+I172
+ta(I469
+I172
+I467
+I173
+ta(I467
+I173
+I466
+I176
+ta(I466
+I176
+I465
+I179
+ta(I465
+I179
+I464
+I193
+ta(I464
+I193
+I464
+I199
+ta(I464
+I199
+I464
+I205
+ta(I464
+I205
+I464
+I225
+ta(I464
+I225
+I464
+I241
+ta(I464
+I241
+I464
+I257
+ta(I464
+I257
+I464
+I273
+ta(I464
+I273
+I466
+I287
+ta(I466
+I287
+I468
+I301
+ta(I468
+I301
+I472
+I306
+ta(I472
+I306
+I476
+I311
+ta(I476
+I311
+I482
+I314
+ta(I482
+I314
+I487
+I316
+ta(I487
+I316
+I493
+I318
+ta(I493
+I318
+I511
+I318
+ta(I511
+I318
+I525
+I318
+ta(I525
+I318
+I541
+I316
+ta(I541
+I316
+I561
+I311
+ta(I561
+I311
+I577
+I305
+ta(I577
+I305
+I595
+I299
+ta(I595
+I299
+I600
+I293
+ta(I600
+I293
+I605
+I279
+ta(I605
+I279
+I608
+I265
+ta(I608
+I265
+I611
+I249
+ta(I611
+I249
+I612
+I233
+ta(I612
+I233
+I612
+I219
+ta(I612
+I219
+I610
+I205
+ta(I610
+I205
+I607
+I200
+ta(I607
+I200
+I603
+I196
+ta(I603
+I196
+I598
+I192
+ta(I598
+I192
+I594
+I190
+ta(I594
+I190
+I590
+I189
+ta(I590
+I189
+I587
+I189
+ta(I587
+I189
+I585
+I189
+ta(I585
+I189
+I582
+I191
+ta(I582
+I191
+I580
+I193
+ta(I580
+I193
+I577
+I197
+ta(I577
+I197
+I575
+I201
+ta(I575
+I201
+I573
+I207
+ta(I573
+I207
+I571
+I213
+ta(I571
+I213
+I571
+I227
+ta(I571
+I227
+I571
+I241
+ta(I571
+I241
+I572
+I255
+ta(I572
+I255
+I574
+I273
+ta(I574
+I273
+I577
+I277
+ta(I577
+I277
+I581
+I281
+ta(I581
+I281
+I587
+I285
+ta(I587
+I285
+I593
+I288
+ta(I593
+I288
+I599
+I289
+ta(I599
+I289
+I615
+I289
+ta(I615
+I289
+I629
+I288
+ta(I629
+I288
+I634
+I285
+ta(I634
+I285
+I648
+I281
+ta(I648
+I281
+I654
+I276
+ta(I654
+I276
+I659
+I270
+ta(I659
+I270
+I662
+I254
+ta(I662
+I254
+I665
+I240
+ta(I665
+I240
+I667
+I226
+ta(I667
+I226
+I668
+I210
+ta(I668
+I210
+I668
+I194
+ta(I668
+I194
+I667
+I180
+ta(I667
+I180
+I664
+I166
+ta(I664
+I166
+I659
+I152
+ta(I659
+I152
+I645
+I147
+ta(I645
+I147
+I639
+I142
+ta(I639
+I142
+I623
+I138
+ta(I623
+I138
+I607
+I134
+ta(I607
+I134
+I593
+I133
+ta(I593
+I133
+I587
+I133
+ta(I587
+I133
+I583
+I133
+ta(I583
+I133
+I579
+I134
+ta(I579
+I134
+I577
+I136
+ta(I577
+I136
+I575
+I140
+ta(I575
+I140
+I573
+I145
+ta(I573
+I145
+I573
+I149
+ta(I573
+I149
+I573
+I163
+ta(I573
+I163
+I575
+I177
+ta(I575
+I177
+I577
+I191
+ta(I577
+I191
+I580
+I197
+ta(I580
+I197
+I584
+I213
+ta(I584
+I213
+I588
+I218
+ta(I588
+I218
+I594
+I223
+ta(I594
+I223
+I599
+I227
+ta(I599
+I227
+I605
+I231
+ta(I605
+I231
+I610
+I233
+ta(I610
+I233
+I624
+I234
+ta(I624
+I234
+I629
+I234
+ta(I629
+I234
+I635
+I233
+ta(I635
+I233
+I641
+I230
+ta(I641
+I230
+I644
+I227
+ta(I644
+I227
+I649
+I222
+ta(I649
+I222
+I652
+I216
+ta(I652
+I216
+I654
+I210
+ta(I654
+I210
+I655
+I204
+ta(I655
+I204
+I655
+I190
+ta(I655
+I190
+I653
+I184
+ta(I653
+I184
+I651
+I179
+ta(I651
+I179
+I647
+I173
+ta(I647
+I173
+I642
+I169
+ta(I642
+I169
+I638
+I165
+ta(I638
+I165
+I635
+I163
+ta(I635
+I163
+I631
+I161
+ta(I631
+I161
+I628
+I160
+ta(I628
+I160
+I625
+I160
+ta(I625
+I160
+I622
+I161
+ta(I622
+I161
+I618
+I164
+ta(I618
+I164
+I614
+I169
+ta(I614
+I169
+I611
+I187
+ta(I611
+I187
+I607
+I203
+ta(I607
+I203
+I605
+I217
+ta(I605
+I217
+I603
+I235
+ta(I603
+I235
+I602
+I257
+ta(I602
+I257
+I602
+I275
+ta(I602
+I275
+I602
+I291
+ta(I602
+I291
+I605
+I309
+ta(I605
+I309
+I608
+I323
+ta(I608
+I323
+I612
+I329
+ta(I612
+I329
+I616
+I335
+ta(I616
+I335
+I621
+I339
+ta(I621
+I339
+I635
+I343
+ta(I635
+I343
+I641
+I347
+ta(I641
+I347
+I657
+I350
+ta(I657
+I350
+I662
+I351
+ta(I662
+I351
+I678
+I351
+ta(I678
+I351
+I692
+I351
+ta(I692
+I351
+I696
+I349
+ta(I696
+I349
+I702
+I346
+ta(I702
+I346
+I705
+I343
+ta(I705
+I343
+I708
+I339
+ta(I708
+I339
+I710
+I336
+ta(I710
+I336
+I710
+I332
+ta(I710
+I332
+I709
+I327
+ta(I709
+I327
+I707
+I323
+ta(I707
+I323
+I703
+I319
+ta(I703
+I319
+I699
+I317
+ta(I699
+I317
+I694
+I315
+ta(I694
+I315
+I680
+I313
+ta(I680
+I313
+I676
+I313
+ta(I676
+I313
+I672
+I313
+ta(I672
+I313
+I667
+I315
+ta(I667
+I315
+I663
+I318
+ta(I663
+I318
+I658
+I323
+ta(I658
+I323
+I653
+I327
+ta(I653
+I327
+I648
+I333
+ta(I648
+I333
+I644
+I339
+ta(I644
+I339
+I641
+I344
+ta(I641
+I344
+I639
+I350
+ta(I639
+I350
+I638
+I355
+ta(I638
+I355
+I637
+I360
+ta(I637
+I360
+I637
+I365
+ta(I637
+I365
+I639
+I369
+ta(I639
+I369
+I641
+I372
+ta(I641
+I372
+I644
+I374
+ta(I644
+I374
+I647
+I376
+ta(I647
+I376
+I650
+I377
+ta(I650
+I377
+I653
+I378
+ta(I653
+I378
+I656
+I378
+ta(I656
+I378
+I660
+I378
+ta(I660
+I378
+I664
+I376
+ta(I664
+I376
+I667
+I374
+ta(I667
+I374
+I671
+I371
+ta(I671
+I371
+I675
+I368
+ta(I675
+I368
+I679
+I364
+ta(I679
+I364
+I682
+I359
+ta(I682
+I359
+I684
+I355
+ta(I684
+I355
+I685
+I350
+ta(I685
+I350
+I685
+I344
+ta(I685
+I344
+I685
+I340
+ta(I685
+I340
+I683
+I334
+ta(I683
+I334
+I680
+I328
+ta(I680
+I328
+I676
+I322
+ta(I676
+I322
+I671
+I318
+ta(I671
+I318
+I666
+I313
+ta(I666
+I313
+I660
+I309
+ta(I660
+I309
+I644
+I306
+ta(I644
+I306
+I638
+I303
+ta(I638
+I303
+I632
+I302
+ta(I632
+I302
+I626
+I301
+ta(I626
+I301
+I612
+I302
+ta(I612
+I302
+I606
+I304
+ta(I606
+I304
+I602
+I308
+ta(I602
+I308
+I597
+I322
+ta(I597
+I322
+I593
+I328
+ta(I593
+I328
+I590
+I344
+ta(I590
+I344
+I588
+I360
+ta(I588
+I360
+I588
+I376
+ta(I588
+I376
+I587
+I392
+ta(I587
+I392
+I588
+I397
+ta(I588
+I397
+I589
+I411
+ta(I589
+I411
+I592
+I417
+ta(I592
+I417
+I595
+I421
+ta(I595
+I421
+I599
+I424
+ta(I599
+I424
+I604
+I427
+ta(I604
+I427
+I608
+I428
+ta(I608
+I428
+I612
+I429
+ta(I612
+I429
+I616
+I429
+ta(I616
+I429
+I621
+I428
+ta(I621
+I428
+I625
+I427
+ta(I625
+I427
+I628
+I424
+ta(I628
+I424
+I630
+I421
+ta(I630
+I421
+I632
+I417
+ta(I632
+I417
+I632
+I413
+ta(I632
+I413
+I632
+I409
+ta(I632
+I409
+I630
+I403
+ta(I630
+I403
+I627
+I389
+ta(I627
+I389
+I621
+I375
+ta(I621
+I375
+I607
+I369
+ta(I607
+I369
+I593
+I363
+ta(I593
+I363
+I577
+I359
+ta(I577
+I359
+I559
+I354
+ta(I559
+I354
+I543
+I350
+ta(I543
+I350
+I529
+I346
+ta(I529
+I346
+I513
+I343
+ta(I513
+I343
+I499
+I341
+ta(I499
+I341
+I485
+I340
+ta(I485
+I340
+I469
+I340
+ta(I469
+I340
+I464
+I341
+ta(I464
+I341
+I450
+I345
+ta(I450
+I345
+I446
+I350
+ta(I446
+I350
+I443
+I356
+ta(I443
+I356
+I440
+I362
+ta(I440
+I362
+I439
+I378
+ta(I439
+I378
+I439
+I392
+ta(I439
+I392
+I439
+I398
+ta(I439
+I398
+I439
+I404
+ta(I439
+I404
+I439
+I420
+ta(I439
+I420
+I441
+I424
+ta(I441
+I424
+I443
+I429
+ta(I443
+I429
+I445
+I432
+ta(I445
+I432
+I448
+I436
+ta(I448
+I436
+I451
+I438
+ta(I451
+I438
+I455
+I440
+ta(I455
+I440
+I459
+I440
+ta(I459
+I440
+I464
+I440
+ta(I464
+I440
+I468
+I439
+ta(I468
+I439
+I473
+I436
+ta(I473
+I436
+I478
+I433
+ta(I478
+I433
+I481
+I429
+ta(I481
+I429
+I485
+I424
+ta(I485
+I424
+I488
+I410
+ta(I488
+I410
+I489
+I405
+ta(I489
+I405
+I490
+I391
+ta(I490
+I391
+I489
+I385
+ta(I489
+I385
+I487
+I379
+ta(I487
+I379
+I485
+I374
+ta(I485
+I374
+I482
+I368
+ta(I482
+I368
+I478
+I363
+ta(I478
+I363
+I473
+I357
+ta(I473
+I357
+I467
+I354
+ta(I467
+I354
+I461
+I350
+ta(I461
+I350
+I456
+I347
+ta(I456
+I347
+I440
+I344
+ta(I440
+I344
+I434
+I343
+ta(I434
+I343
+I420
+I343
+ta(I420
+I343
+I406
+I344
+ta(I406
+I344
+I400
+I347
+ta(I400
+I347
+I395
+I353
+ta(I395
+I353
+I392
+I367
+ta(I392
+I367
+I388
+I381
+ta(I388
+I381
+I385
+I397
+ta(I385
+I397
+I383
+I411
+ta(I383
+I411
+I382
+I427
+ta(I382
+I427
+I381
+I432
+ta(I381
+I432
+I381
+I448
+ta(I381
+I448
+I381
+I453
+ta(I381
+I453
+I383
+I456
+ta(I383
+I456
+I386
+I460
+ta(I386
+I460
+I390
+I462
+ta(I390
+I462
+I396
+I464
+ta(I396
+I464
+I400
+I464
+ta(I400
+I464
+I406
+I464
+ta(I406
+I464
+I412
+I462
+ta(I412
+I462
+I428
+I460
+ta(I428
+I460
+I433
+I457
+ta(I433
+I457
+I439
+I453
+ta(I439
+I453
+I445
+I448
+ta(I445
+I448
+I448
+I443
+ta(I448
+I443
+I450
+I437
+ta(I450
+I437
+I450
+I431
+ta(I450
+I431
+I450
+I425
+ta(I450
+I425
+I447
+I420
+ta(I447
+I420
+I443
+I415
+ta(I443
+I415
+I438
+I401
+ta(I438
+I401
+I424
+I397
+ta(I424
+I397
+I410
+I392
+ta(I410
+I392
+I392
+I388
+ta(I392
+I388
+I374
+I385
+ta(I374
+I385
+I352
+I382
+ta(I352
+I382
+I330
+I379
+ta(I330
+I379
+I308
+I376
+ta(I308
+I376
+I288
+I375
+ta(I288
+I375
+I268
+I375
+ta(I268
+I375
+I250
+I375
+ta(I250
+I375
+I230
+I378
+ta(I230
+I378
+I224
+I381
+ta(I224
+I381
+I218
+I387
+ta(I218
+I387
+I215
+I392
+ta(I215
+I392
+I212
+I398
+ta(I212
+I398
+I211
+I416
+ta(I211
+I416
+I210
+I422
+ta(I210
+I422
+I211
+I438
+ta(I211
+I438
+I213
+I443
+ta(I213
+I443
+I215
+I449
+ta(I215
+I449
+I220
+I454
+ta(I220
+I454
+I223
+I457
+ta(I223
+I457
+I228
+I460
+ta(I228
+I460
+I232
+I462
+ta(I232
+I462
+I238
+I463
+ta(I238
+I463
+I244
+I463
+ta(I244
+I463
+I249
+I463
+ta(I249
+I463
+I254
+I460
+ta(I254
+I460
+I258
+I457
+ta(I258
+I457
+I262
+I453
+ta(I262
+I453
+I267
+I447
+ta(I267
+I447
+I268
+I433
+ta(I268
+I433
+I269
+I427
+ta(I269
+I427
+I269
+I413
+ta(I269
+I413
+I268
+I407
+ta(I268
+I407
+I266
+I391
+ta(I266
+I391
+I264
+I377
+ta(I264
+I377
+I261
+I371
+ta(I261
+I371
+I258
+I365
+ta(I258
+I365
+I255
+I359
+ta(I255
+I359
+I250
+I354
+ta(I250
+I354
+I246
+I349
+ta(I246
+I349
+I241
+I345
+ta(I241
+I345
+I236
+I341
+ta(I236
+I341
+I232
+I340
+ta(I232
+I340
+I227
+I340
+ta(I227
+I340
+I224
+I340
+ta(I224
+I340
+I220
+I343
+ta(I220
+I343
+I217
+I348
+ta(I217
+I348
+I215
+I362
+ta(I215
+I362
+I213
+I376
+ta(I213
+I376
+I213
+I392
+ta(I213
+I392
+I212
+I406
+ta(I212
+I406
+I212
+I422
+ta(I212
+I422
+I213
+I428
+ta(I213
+I428
+I216
+I442
+ta(I216
+I442
+I219
+I447
+ta(I219
+I447
+I223
+I452
+ta(I223
+I452
+I229
+I455
+ta(I229
+I455
+I235
+I458
+ta(I235
+I458
+I249
+I460
+ta(I249
+I460
+I265
+I461
+ta(I265
+I461
+I281
+I461
+ta(I281
+I461
+I299
+I458
+ta(I299
+I458
+I315
+I455
+ta(I315
+I455
+I331
+I451
+ta(I331
+I451
+I337
+I446
+ta(I337
+I446
+I341
+I441
+ta(I341
+I441
+I343
+I435
+ta(I343
+I435
+I345
+I421
+ta(I345
+I421
+I345
+I415
+ta(I345
+I415
+I345
+I399
+ta(I345
+I399
+I342
+I383
+ta(I342
+I383
+I339
+I369
+ta(I339
+I369
+I335
+I363
+ta(I335
+I363
+I329
+I358
+ta(I329
+I358
+I315
+I353
+ta(I315
+I353
+I309
+I349
+ta(I309
+I349
+I295
+I345
+ta(I295
+I345
+I281
+I342
+ta(I281
+I342
+I267
+I340
+ta(I267
+I340
+I261
+I339
+ta(I261
+I339
+I257
+I339
+ta(I257
+I339
+I253
+I341
+ta(I253
+I341
+I250
+I344
+ta(I250
+I344
+I248
+I349
+ta(I248
+I349
+I246
+I355
+ta(I246
+I355
+I246
+I361
+ta(I246
+I361
+I246
+I377
+ta(I246
+I377
+I246
+I393
+ta(I246
+I393
+I248
+I398
+ta(I248
+I398
+I252
+I416
+ta(I252
+I416
+I258
+I421
+ta(I258
+I421
+I263
+I426
+ta(I263
+I426
+I279
+I429
+ta(I279
+I429
+I295
+I432
+ta(I295
+I432
+I309
+I433
+ta(I309
+I433
+I325
+I433
+ta(I325
+I433
+I343
+I430
+ta(I343
+I430
+I359
+I426
+ta(I359
+I426
+I364
+I421
+ta(I364
+I421
+I369
+I407
+ta(I369
+I407
+I371
+I393
+ta(I371
+I393
+I373
+I379
+ta(I373
+I379
+I374
+I363
+ta(I374
+I363
+I372
+I349
+ta(I372
+I349
+I368
+I335
+ta(I368
+I335
+I362
+I319
+ta(I362
+I319
+I356
+I305
+ta(I356
+I305
+I350
+I299
+ta(I350
+I299
+I336
+I295
+ta(I336
+I295
+I320
+I290
+ta(I320
+I290
+I304
+I286
+ta(I304
+I286
+I290
+I283
+ta(I290
+I283
+I272
+I279
+ta(I272
+I279
+I258
+I278
+ta(I258
+I278
+I244
+I276
+ta(I244
+I276
+I239
+I276
+ta(I239
+I276
+I236
+I276
+ta(I236
+I276
+I233
+I278
+ta(I233
+I278
+I231
+I281
+ta(I231
+I281
+I229
+I286
+ta(I229
+I286
+I228
+I300
+ta(I228
+I300
+I228
+I306
+ta(I228
+I306
+I228
+I324
+ta(I228
+I324
+I228
+I340
+ta(I228
+I340
+I228
+I356
+ta(I228
+I356
+I228
+I374
+ta(I228
+I374
+I229
+I392
+ta(I229
+I392
+I231
+I408
+ta(I231
+I408
+I233
+I422
+ta(I233
+I422
+I236
+I428
+ta(I236
+I428
+I239
+I433
+ta(I239
+I433
+I243
+I435
+ta(I243
+I435
+I246
+I436
+ta(I246
+I436
+I250
+I437
+ta(I250
+I437
+I253
+I437
+ta(I253
+I437
+I256
+I434
+ta(I256
+I434
+I258
+I430
+ta(I258
+I430
+I260
+I416
+ta(I260
+I416
+I262
+I402
+ta(I262
+I402
+I262
+I386
+ta(I262
+I386
+I262
+I370
+ta(I262
+I370
+I261
+I356
+ta(I261
+I356
+I258
+I338
+ta(I258
+I338
+I255
+I324
+ta(I255
+I324
+I251
+I310
+ta(I251
+I310
+I246
+I305
+ta(I246
+I305
+I232
+I291
+ta(I232
+I291
+I226
+I288
+ta(I226
+I288
+I212
+I285
+ta(I212
+I285
+I206
+I283
+ta(I206
+I283
+I200
+I282
+ta(I200
+I282
+I186
+I282
+ta(I186
+I282
+I181
+I284
+ta(I181
+I284
+I176
+I287
+ta(I176
+I287
+I170
+I293
+ta(I170
+I293
+I166
+I299
+ta(I166
+I299
+I162
+I315
+ta(I162
+I315
+I159
+I331
+ta(I159
+I331
+I156
+I351
+ta(I156
+I351
+I153
+I371
+ta(I153
+I371
+I152
+I389
+ta(I152
+I389
+I152
+I409
+ta(I152
+I409
+I152
+I427
+ta(I152
+I427
+I153
+I433
+ta(I153
+I433
+I156
+I438
+ta(I156
+I438
+I159
+I441
+ta(I159
+I441
+I163
+I444
+ta(I163
+I444
+I166
+I446
+ta(I166
+I446
+I170
+I447
+ta(I170
+I447
+I174
+I447
+ta(I174
+I447
+I179
+I445
+ta(I179
+I445
+I182
+I441
+ta(I182
+I441
+I186
+I436
+ta(I186
+I436
+I190
+I422
+ta(I190
+I422
+I195
+I416
+ta(I195
+I416
+I199
+I402
+ta(I199
+I402
+I201
+I396
+ta(I201
+I396
+I202
+I382
+ta(I202
+I382
+I202
+I368
+ta(I202
+I368
+I202
+I354
+ta(I202
+I354
+I200
+I340
+ta(I200
+I340
+I197
+I334
+ta(I197
+I334
+I193
+I328
+ta(I193
+I328
+I179
+I323
+ta(I179
+I323
+I173
+I318
+ta(I173
+I318
+I167
+I314
+ta(I167
+I314
+I153
+I312
+ta(I153
+I312
+I147
+I310
+ta(I147
+I310
+I141
+I310
+ta(I141
+I310
+I137
+I310
+ta(I137
+I310
+I131
+I313
+ta(I131
+I313
+I126
+I317
+ta(I126
+I317
+I123
+I323
+ta(I123
+I323
+I120
+I341
+ta(I120
+I341
+I117
+I359
+ta(I117
+I359
+I115
+I377
+ta(I115
+I377
+I114
+I395
+ta(I114
+I395
+I112
+I417
+ta(I112
+I417
+I111
+I435
+ta(I111
+I435
+I111
+I453
+ta(I111
+I453
+I111
+I469
+ta(I111
+I469
+I112
+I475
+ta(I112
+I475
+I114
+I480
+ta(I114
+I480
+I116
+I483
+ta(I116
+I483
+I119
+I485
+ta(I119
+I485
+I123
+I487
+ta(I123
+I487
+I127
+I487
+ta(I127
+I487
+I133
+I486
+ta(I133
+I486
+I139
+I483
+ta(I139
+I483
+I144
+I480
+ta(I144
+I480
+I149
+I476
+ta(I149
+I476
+I153
+I470
+ta(I153
+I470
+I156
+I464
+ta(I156
+I464
+I158
+I458
+ta(I158
+I458
+I160
+I452
+ta(I160
+I452
+I160
+I446
+ta(I160
+I446
+I159
+I432
+ta(I159
+I432
+I157
+I418
+ta(I157
+I418
+I154
+I412
+ta(I154
+I412
+I149
+I406
+ta(I149
+I406
+I144
+I402
+ta(I144
+I402
+I130
+I397
+ta(I130
+I397
+I124
+I393
+ta(I124
+I393
+I110
+I390
+ta(I110
+I390
+I94
+I387
+ta(I94
+I387
+I90
+I386
+ta(I90
+I386
+I86
+I386
+ta(I86
+I386
+I81
+I386
+ta(I81
+I386
+I77
+I388
+ta(I77
+I388
+I73
+I392
+ta(I73
+I392
+I69
+I396
+ta(I69
+I396
+I65
+I402
+ta(I65
+I402
+I62
+I416
+ta(I62
+I416
+I60
+I422
+ta(I60
+I422
+I58
+I440
+ta(I58
+I440
+I57
+I456
+ta(I57
+I456
+I57
+I474
+ta(I57
+I474
+I57
+I492
+ta(I57
+I492
+I59
+I508
+ta(I59
+I508
+I61
+I522
+ta(I61
+I522
+I64
+I527
+ta(I64
+I527
+I67
+I530
+ta(I67
+I530
+I70
+I533
+ta(I70
+I533
+I75
+I535
+ta(I75
+I535
+I80
+I535
+ta(I80
+I535
+I85
+I534
+ta(I85
+I534
+I90
+I531
+ta(I90
+I531
+I95
+I526
+ta(I95
+I526
+I98
+I520
+ta(I98
+I520
+I101
+I506
+ta(I101
+I506
+I102
+I492
+ta(I102
+I492
+I104
+I476
+ta(I104
+I476
+I104
+I460
+ta(I104
+I460
+I104
+I442
+ta(I104
+I442
+I102
+I426
+ta(I102
+I426
+I99
+I408
+ta(I99
+I408
+I96
+I394
+ta(I96
+I394
+I92
+I380
+ta(I92
+I380
+I88
+I376
+ta(I88
+I376
+I83
+I371
+ta(I83
+I371
+I78
+I367
+ta(I78
+I367
+I73
+I363
+ta(I73
+I363
+I68
+I360
+ta(I68
+I360
+I63
+I358
+ta(I63
+I358
+I59
+I357
+ta(I59
+I357
+I56
+I357
+ta(I56
+I357
+I53
+I359
+ta(I53
+I359
+I50
+I363
+ta(I50
+I363
+I49
+I369
+ta(I49
+I369
+I47
+I375
+ta(I47
+I375
+I46
+I393
+ta(I46
+I393
+I45
+I407
+ta(I45
+I407
+I44
+I421
+ta(I44
+I421
+I44
+I439
+ta(I44
+I439
+I44
+I455
+ta(I44
+I455
+I44
+I469
+ta(I44
+I469
+I44
+I474
+ta(I44
+I474
+I45
+I480
+ta(I45
+I480
+I46
+I483
+ta(I46
+I483
+I49
+I487
+ta(I49
+I487
+I52
+I490
+ta(I52
+I490
+I55
+I493
+ta(I55
+I493
+I59
+I494
+ta(I59
+I494
+I63
+I494
+ta(I63
+I494
+I67
+I493
+ta(I67
+I493
+I73
+I490
+ta(I73
+I490
+I78
+I487
+ta(I78
+I487
+I81
+I483
+ta(I81
+I483
+I85
+I478
+ta(I85
+I478
+I89
+I464
+ta(I89
+I464
+I91
+I458
+ta(I91
+I458
+I92
+I452
+ta(I92
+I452
+I92
+I438
+ta(I92
+I438
+I92
+I424
+ta(I92
+I424
+I90
+I410
+ta(I90
+I410
+I87
+I396
+ta(I87
+I396
+I83
+I390
+ta(I83
+I390
+I79
+I385
+ta(I79
+I385
+I75
+I381
+ta(I75
+I381
+I70
+I378
+ta(I70
+I378
+I64
+I376
+ta(I64
+I376
+I59
+I375
+ta(I59
+I375
+I53
+I375
+ta(I53
+I375
+I50
+I376
+ta(I50
+I376
+I45
+I380
+ta(I45
+I380
+I40
+I386
+ta(I40
+I386
+I36
+I392
+ta(I36
+I392
+I33
+I408
+ta(I33
+I408
+I30
+I426
+ta(I30
+I426
+I28
+I442
+ta(I28
+I442
+I28
+I460
+ta(I28
+I460
+I27
+I476
+ta(I27
+I476
+I27
+I496
+ta(I27
+I496
+I27
+I512
+ta(I27
+I512
+I28
+I526
+ta(I28
+I526
+I31
+I531
+ta(I31
+I531
+I35
+I537
+ta(I35
+I537
+I49
+I540
+ta(I49
+I540
+I63
+I543
+ta(I63
+I543
+I79
+I544
+ta(I79
+I544
+I99
+I545
+ta(I99
+I545
+I123
+I545
+ta(I123
+I545
+I145
+I544
+ta(I145
+I544
+I167
+I542
+ta(I167
+I542
+I189
+I539
+ta(I189
+I539
+I205
+I536
+ta(I205
+I536
+I221
+I531
+ta(I221
+I531
+I225
+I527
+ta(I225
+I527
+I229
+I521
+ta(I229
+I521
+I231
+I507
+ta(I231
+I507
+I233
+I501
+ta(I233
+I501
+I233
+I495
+ta(I233
+I495
+I232
+I490
+ta(I232
+I490
+I229
+I476
+ta(I229
+I476
+I225
+I470
+ta(I225
+I470
+I219
+I464
+ta(I219
+I464
+I214
+I460
+ta(I214
+I460
+I209
+I456
+ta(I209
+I456
+I204
+I452
+ta(I204
+I452
+I199
+I449
+ta(I199
+I449
+I194
+I448
+ta(I194
+I448
+I190
+I447
+ta(I190
+I447
+I187
+I447
+ta(I187
+I447
+I183
+I448
+ta(I183
+I448
+I180
+I451
+ta(I180
+I451
+I177
+I457
+ta(I177
+I457
+I175
+I462
+ta(I175
+I462
+I174
+I468
+ta(I174
+I468
+I172
+I486
+ta(I172
+I486
+I171
+I500
+ta(I171
+I500
+I171
+I516
+ta(I171
+I516
+I171
+I532
+ta(I171
+I532
+I171
+I546
+ta(I171
+I546
+I172
+I560
+ta(I172
+I560
+I174
+I576
+ta(I174
+I576
+I177
+I580
+ta(I177
+I580
+I181
+I585
+ta(I181
+I585
+I187
+I589
+ta(I187
+I589
+I193
+I591
+ta(I193
+I591
+I211
+I593
+ta(I211
+I593
+I229
+I593
+ta(I229
+I593
+I245
+I593
+ta(I245
+I593
+I261
+I592
+ta(I261
+I592
+I279
+I588
+ta(I279
+I588
+I284
+I584
+ta(I284
+I584
+I290
+I579
+ta(I290
+I579
+I294
+I565
+ta(I294
+I565
+I298
+I551
+ta(I298
+I551
+I300
+I537
+ta(I300
+I537
+I302
+I521
+ta(I302
+I521
+I302
+I505
+ta(I302
+I505
+I302
+I491
+ta(I302
+I491
+I299
+I475
+ta(I299
+I475
+I296
+I469
+ta(I296
+I469
+I282
+I455
+ta(I282
+I455
+I278
+I451
+ta(I278
+I451
+I264
+I447
+ta(I264
+I447
+I250
+I444
+ta(I250
+I444
+I236
+I441
+ta(I236
+I441
+I230
+I439
+ta(I230
+I439
+I224
+I439
+ta(I224
+I439
+I220
+I441
+ta(I220
+I441
+I217
+I445
+ta(I217
+I445
+I214
+I449
+ta(I214
+I449
+I212
+I463
+ta(I212
+I463
+I211
+I469
+ta(I211
+I469
+I211
+I487
+ta(I211
+I487
+I212
+I501
+ta(I212
+I501
+I213
+I515
+ta(I213
+I515
+I216
+I521
+ta(I216
+I521
+I219
+I526
+ta(I219
+I526
+I223
+I531
+ta(I223
+I531
+I227
+I534
+ta(I227
+I534
+I241
+I537
+ta(I241
+I537
+I247
+I540
+ta(I247
+I540
+I263
+I540
+ta(I263
+I540
+I281
+I540
+ta(I281
+I540
+I299
+I538
+ta(I299
+I538
+I315
+I535
+ta(I315
+I535
+I331
+I532
+ta(I331
+I532
+I337
+I528
+ta(I337
+I528
+I343
+I523
+ta(I343
+I523
+I348
+I518
+ta(I348
+I518
+I350
+I512
+ta(I350
+I512
+I351
+I506
+ta(I351
+I506
+I351
+I502
+ta(I351
+I502
+I350
+I488
+ta(I350
+I488
+I346
+I483
+ta(I346
+I483
+I343
+I477
+ta(I343
+I477
+I337
+I472
+ta(I337
+I472
+I332
+I467
+ta(I332
+I467
+I326
+I463
+ta(I326
+I463
+I320
+I461
+ta(I320
+I461
+I304
+I458
+ta(I304
+I458
+I290
+I458
+ta(I290
+I458
+I284
+I458
+ta(I284
+I458
+I279
+I461
+ta(I279
+I461
+I274
+I464
+ta(I274
+I464
+I270
+I470
+ta(I270
+I470
+I267
+I476
+ta(I267
+I476
+I265
+I482
+ta(I265
+I482
+I264
+I500
+ta(I264
+I500
+I264
+I514
+ta(I264
+I514
+I266
+I528
+ta(I266
+I528
+I268
+I533
+ta(I268
+I533
+I272
+I547
+ta(I272
+I547
+I277
+I552
+ta(I277
+I552
+I282
+I556
+ta(I282
+I556
+I298
+I561
+ta(I298
+I561
+I314
+I565
+ta(I314
+I565
+I330
+I568
+ta(I330
+I568
+I346
+I570
+ta(I346
+I570
+I366
+I571
+ta(I366
+I571
+I388
+I571
+ta(I388
+I571
+I408
+I569
+ta(I408
+I569
+I428
+I566
+ta(I428
+I566
+I448
+I562
+ta(I448
+I562
+I464
+I558
+ta(I464
+I558
+I478
+I544
+ta(I478
+I544
+I483
+I538
+ta(I483
+I538
+I485
+I524
+ta(I485
+I524
+I486
+I510
+ta(I486
+I510
+I486
+I494
+ta(I486
+I494
+I484
+I480
+ta(I484
+I480
+I480
+I464
+ta(I480
+I464
+I476
+I450
+ta(I476
+I450
+I471
+I445
+ta(I471
+I445
+I457
+I439
+ta(I457
+I439
+I443
+I435
+ta(I443
+I435
+I429
+I432
+ta(I429
+I432
+I413
+I429
+ta(I413
+I429
+I395
+I428
+ta(I395
+I428
+I377
+I428
+ta(I377
+I428
+I359
+I429
+ta(I359
+I429
+I345
+I432
+ta(I345
+I432
+I339
+I437
+ta(I339
+I437
+I336
+I442
+ta(I336
+I442
+I333
+I456
+ta(I333
+I456
+I331
+I462
+ta(I331
+I462
+I331
+I480
+ta(I331
+I480
+I331
+I496
+ta(I331
+I496
+I332
+I510
+ta(I332
+I510
+I334
+I524
+ta(I334
+I524
+I337
+I529
+ta(I337
+I529
+I343
+I533
+ta(I343
+I533
+I349
+I537
+ta(I349
+I537
+I355
+I542
+ta(I355
+I542
+I369
+I542
+ta(I369
+I542
+I389
+I543
+ta(I389
+I543
+I405
+I544
+ta(I405
+I544
+I423
+I543
+ta(I423
+I543
+I439
+I541
+ta(I439
+I541
+I457
+I538
+ta(I457
+I538
+I463
+I534
+ta(I463
+I534
+I477
+I531
+ta(I477
+I531
+I481
+I517
+ta(I481
+I517
+I484
+I514
+ta(I484
+I514
+I486
+I509
+ta(I486
+I509
+I486
+I495
+ta(I486
+I495
+I486
+I490
+ta(I486
+I490
+I485
+I484
+ta(I485
+I484
+I482
+I478
+ta(I482
+I478
+I479
+I473
+ta(I479
+I473
+I475
+I469
+ta(I475
+I469
+I471
+I465
+ta(I471
+I465
+I465
+I461
+ta(I465
+I461
+I451
+I457
+ta(I451
+I457
+I445
+I454
+ta(I445
+I454
+I431
+I452
+ta(I431
+I452
+I425
+I452
+ta(I425
+I452
+I411
+I452
+ta(I411
+I452
+I395
+I452
+ta(I395
+I452
+I389
+I455
+ta(I389
+I455
+I383
+I459
+ta(I383
+I459
+I380
+I464
+ta(I380
+I464
+I378
+I480
+ta(I378
+I480
+I377
+I496
+ta(I377
+I496
+I377
+I512
+ta(I377
+I512
+I378
+I528
+ta(I378
+I528
+I381
+I542
+ta(I381
+I542
+I384
+I558
+ta(I384
+I558
+I388
+I563
+ta(I388
+I563
+I394
+I568
+ta(I394
+I568
+I400
+I573
+ta(I400
+I573
+I416
+I576
+ta(I416
+I576
+I434
+I579
+ta(I434
+I579
+I452
+I580
+ta(I452
+I580
+I474
+I580
+ta(I474
+I580
+I494
+I579
+ta(I494
+I579
+I516
+I577
+ta(I516
+I577
+I538
+I574
+ta(I538
+I574
+I560
+I570
+ta(I560
+I570
+I578
+I565
+ta(I578
+I565
+I594
+I560
+ta(I594
+I560
+I598
+I554
+ta(I598
+I554
+I601
+I548
+ta(I601
+I548
+I602
+I542
+ta(I602
+I542
+I602
+I536
+ta(I602
+I536
+I600
+I530
+ta(I600
+I530
+I596
+I524
+ta(I596
+I524
+I590
+I519
+ta(I590
+I519
+I576
+I513
+ta(I576
+I513
+I562
+I508
+ta(I562
+I508
+I544
+I504
+ta(I544
+I504
+I530
+I501
+ta(I530
+I501
+I524
+I498
+ta(I524
+I498
+I510
+I495
+ta(I510
+I495
+I505
+I494
+ta(I505
+I494
+I501
+I494
+ta(I501
+I494
+I498
+I494
+ta(I498
+I494
+I495
+I495
+ta(I495
+I495
+I493
+I498
+ta(I493
+I498
+I492
+I502
+ta(I492
+I502
+I492
+I508
+ta(I492
+I508
+I492
+I513
+ta(I492
+I513
+I492
+I529
+ta(I492
+I529
+I494
+I534
+ta(I494
+I534
+I497
+I548
+ta(I497
+I548
+I500
+I554
+ta(I500
+I554
+I504
+I568
+ta(I504
+I568
+I508
+I571
+ta(I508
+I571
+I514
+I576
+ta(I514
+I576
+I520
+I579
+ta(I520
+I579
+I538
+I582
+ta(I538
+I582
+I552
+I584
+ta(I552
+I584
+I568
+I585
+ta(I568
+I585
+I588
+I585
+ta(I588
+I585
+I608
+I585
+ta(I608
+I585
+I624
+I583
+ta(I624
+I583
+I640
+I581
+ta(I640
+I581
+I654
+I577
+ta(I654
+I577
+I659
+I572
+ta(I659
+I572
+I661
+I568
+ta(I661
+I568
+I663
+I554
+ta(I663
+I554
+I664
+I548
+ta(I664
+I548
+I664
+I543
+ta(I664
+I543
+I661
+I529
+ta(I661
+I529
+I658
+I524
+ta(I658
+I524
+I654
+I518
+ta(I654
+I518
+I649
+I512
+ta(I649
+I512
+I644
+I507
+ta(I644
+I507
+I630
+I503
+ta(I630
+I503
+I624
+I498
+ta(I624
+I498
+I608
+I494
+ta(I608
+I494
+I594
+I490
+ta(I594
+I490
+I578
+I487
+ta(I578
+I487
+I562
+I485
+ta(I562
+I485
+I556
+I485
+ta(I556
+I485
+I552
+I485
+ta(I552
+I485
+I548
+I487
+ta(I548
+I487
+I546
+I489
+ta(I546
+I489
+I545
+I494
+ta(I545
+I494
+I544
+I498
+ta(I544
+I498
+I545
+I512
+ta(I545
+I512
+I547
+I517
+ta(I547
+I517
+I550
+I523
+ta(I550
+I523
+I554
+I537
+ta(I554
+I537
+I559
+I542
+ta(I559
+I542
+I565
+I548
+ta(I565
+I548
+I581
+I554
+ta(I581
+I554
+I586
+I558
+ta(I586
+I558
+I604
+I562
+ta(I604
+I562
+I624
+I565
+ta(I624
+I565
+I642
+I567
+ta(I642
+I567
+I658
+I568
+ta(I658
+I568
+I678
+I568
+ta(I678
+I568
+I694
+I567
+ta(I694
+I567
+I710
+I564
+ta(I710
+I564
+I715
+I561
+ta(I715
+I561
+I719
+I556
+ta(I719
+I556
+I721
+I551
+ta(I721
+I551
+I721
+I547
+ta(I721
+I547
+I721
+I533
+ta(I721
+I533
+I718
+I528
+ta(I718
+I528
+I713
+I514
+ta(I713
+I514
+I697
+I508
+ta(I697
+I508
+I683
+I502
+ta(I683
+I502
+I667
+I498
+ta(I667
+I498
+I653
+I495
+ta(I653
+I495
+I637
+I490
+ta(I637
+I490
+I631
+I487
+ta(I631
+I487
+I615
+I484
+ta(I615
+I484
+I610
+I482
+ta(I610
+I482
+I605
+I482
+ta(I605
+I482
+I601
+I482
+ta(I601
+I482
+I598
+I483
+ta(I598
+I483
+I596
+I486
+ta(I596
+I486
+I596
+I491
+ta(I596
+I491
+I596
+I496
+ta(I596
+I496
+I597
+I502
+ta(I597
+I502
+I600
+I508
+ta(I600
+I508
+I604
+I514
+ta(I604
+I514
+I610
+I528
+ta(I610
+I528
+I614
+I532
+ta(I614
+I532
+I620
+I536
+ta(I620
+I536
+I634
+I540
+ta(I634
+I540
+I640
+I542
+ta(I640
+I542
+I646
+I543
+ta(I646
+I543
+I651
+I543
+ta(I651
+I543
+I656
+I542
+ta(I656
+I542
+I661
+I540
+ta(I661
+I540
+I666
+I537
+ta(I666
+I537
+I672
+I533
+ta(I672
+I533
+I676
+I529
+ta(I676
+I529
+I680
+I515
+ta(I680
+I515
+I683
+I509
+ta(I683
+I509
+I684
+I504
+ta(I684
+I504
+I685
+I490
+ta(I685
+I490
+I685
+I476
+ta(I685
+I476
+I682
+I470
+ta(I682
+I470
+I679
+I464
+ta(I679
+I464
+I673
+I459
+ta(I673
+I459
+I668
+I454
+ta(I668
+I454
+I652
+I448
+ta(I652
+I448
+I638
+I442
+ta(I638
+I442
+I622
+I438
+ta(I622
+I438
+I608
+I433
+ta(I608
+I433
+I603
+I429
+ta(I603
+I429
+I597
+I425
+ta(I597
+I425
+I593
+I422
+ta(I593
+I422
+I588
+I419
+ta(I588
+I419
+I583
+I418
+ta(I583
+I418
+I578
+I417
+ta(I578
+I417
+I574
+I417
+ta(I574
+I417
+I571
+I418
+ta(I571
+I418
+I568
+I422
+ta(I568
+I422
+I566
+I428
+ta(I566
+I428
+I565
+I434
+ta(I565
+I434
+I565
+I450
+ta(I565
+I450
+I564
+I464
+ta(I564
+I464
+I564
+I480
+ta(I564
+I480
+I566
+I498
+ta(I566
+I498
+I568
+I512
+ta(I568
+I512
+I570
+I516
+ta(I570
+I516
+I573
+I520
+ta(I573
+I520
+I577
+I523
+ta(I577
+I523
+I583
+I526
+ta(I583
+I526
+I588
+I526
+ta(I588
+I526
+I602
+I527
+ta(I602
+I527
+I616
+I526
+ta(I616
+I526
+I632
+I523
+ta(I632
+I523
+I637
+I520
+ta(I637
+I520
+I653
+I515
+ta(I653
+I515
+I658
+I501
+ta(I658
+I501
+I661
+I495
+ta(I661
+I495
+I664
+I481
+ta(I664
+I481
+I665
+I467
+ta(I665
+I467
+I665
+I453
+ta(I665
+I453
+I665
+I439
+ta(I665
+I439
+I662
+I433
+ta(I662
+I433
+I659
+I427
+ta(I659
+I427
+I654
+I423
+ta(I654
+I423
+I649
+I419
+ta(I649
+I419
+I633
+I415
+ta(I633
+I415
+I627
+I412
+ta(I627
+I412
+I613
+I410
+ta(I613
+I410
+I607
+I408
+ta(I607
+I408
+I589
+I406
+ta(I589
+I406
+I573
+I405
+ta(I573
+I405
+I557
+I405
+ta(I557
+I405
+I541
+I405
+ta(I541
+I405
+I527
+I407
+ta(I527
+I407
+I521
+I410
+ta(I521
+I410
+I517
+I415
+ta(I517
+I415
+I513
+I421
+ta(I513
+I421
+I510
+I427
+ta(I510
+I427
+I508
+I447
+ta(I508
+I447
+I508
+I463
+ta(I508
+I463
+I508
+I479
+ta(I508
+I479
+I509
+I493
+ta(I509
+I493
+I511
+I507
+ta(I511
+I507
+I514
+I521
+ta(I514
+I521
+I518
+I526
+ta(I518
+I526
+I524
+I530
+ta(I524
+I530
+I530
+I533
+ta(I530
+I533
+I536
+I535
+ta(I536
+I535
+I552
+I536
+ta(I552
+I536
+I566
+I536
+ta(I566
+I536
+I572
+I532
+ta(I572
+I532
+I577
+I528
+ta(I577
+I528
+I582
+I523
+ta(I582
+I523
+I585
+I509
+ta(I585
+I509
+I588
+I503
+ta(I588
+I503
+I590
+I487
+ta(I590
+I487
+I591
+I473
+ta(I591
+I473
+I591
+I459
+ta(I591
+I459
+I591
+I445
+ta(I591
+I445
+I588
+I429
+ta(I588
+I429
+I584
+I415
+ta(I584
+I415
+I580
+I410
+ta(I580
+I410
+I566
+I405
+ta(I566
+I405
+I552
+I401
+ta(I552
+I401
+I546
+I398
+ta(I546
+I398
+I532
+I395
+ta(I532
+I395
+I518
+I393
+ta(I518
+I393
+I504
+I391
+ta(I504
+I391
+I490
+I389
+ta(I490
+I389
+I476
+I388
+ta(I476
+I388
+I470
+I387
+ta(I470
+I387
+I465
+I387
+ta(I465
+I387
+I461
+I387
+ta(I461
+I387
+I458
+I388
+ta(I458
+I388
+I456
+I392
+ta(I456
+I392
+I456
+I396
+ta(I456
+I396
+I456
+I401
+ta(I456
+I401
+I456
+I407
+ta(I456
+I407
+I458
+I413
+ta(I458
+I413
+I460
+I419
+ta(I460
+I419
+I464
+I425
+ta(I464
+I425
+I467
+I439
+ta(I467
+I439
+I471
+I443
+ta(I471
+I443
+I475
+I448
+ta(I475
+I448
+I479
+I452
+ta(I479
+I452
+I493
+I456
+ta(I493
+I456
+I498
+I458
+ta(I498
+I458
+I503
+I459
+ta(I503
+I459
+I509
+I459
+ta(I509
+I459
+I523
+I458
+ta(I523
+I458
+I539
+I455
+ta(I539
+I455
+I553
+I451
+ta(I553
+I451
+I558
+I446
+ta(I558
+I446
+I564
+I441
+ta(I564
+I441
+I570
+I423
+ta(I570
+I423
+I573
+I407
+ta(I573
+I407
+I576
+I391
+ta(I576
+I391
+I579
+I377
+ta(I579
+I377
+I581
+I359
+ta(I581
+I359
+I581
+I345
+ta(I581
+I345
+I581
+I331
+ta(I581
+I331
+I580
+I326
+ta(I580
+I326
+I579
+I321
+ta(I579
+I321
+I576
+I316
+ta(I576
+I316
+I573
+I311
+ta(I573
+I311
+I569
+I307
+ta(I569
+I307
+I565
+I304
+ta(I565
+I304
+I561
+I302
+ta(I561
+I302
+I557
+I301
+ta(I557
+I301
+I555
+I301
+ta(I555
+I301
+I553
+I301
+ta(I553
+I301
+I552
+I303
+ta(I552
+I303
+I551
+I306
+ta(I551
+I306
+I549
+I312
+ta(I549
+I312
+I547
+I315
+ta(I547
+I315
+I545
+I321
+ta(I545
+I321
+I544
+I325
+ta(I544
+I325
+I542
+I331
+ta(I542
+I331
+I541
+I337
+ta(I541
+I337
+I539
+I353
+ta(I539
+I353
+I539
+I369
+ta(I539
+I369
+I539
+I374
+ta(I539
+I374
+I541
+I392
+ta(I541
+I392
+I544
+I406
+ta(I544
+I406
+I547
+I410
+ta(I547
+I410
+I553
+I415
+ta(I553
+I415
+I567
+I419
+ta(I567
+I419
+I581
+I421
+ta(I581
+I421
+I595
+I422
+ta(I595
+I422
+I611
+I422
+ta(I611
+I422
+I625
+I422
+ta(I625
+I422
+I639
+I420
+ta(I639
+I420
+I645
+I416
+ta(I645
+I416
+I663
+I411
+ta(I663
+I411
+I668
+I397
+ta(I668
+I397
+I671
+I383
+ta(I671
+I383
+I674
+I377
+ta(I674
+I377
+I675
+I361
+ta(I675
+I361
+I675
+I347
+ta(I675
+I347
+I674
+I331
+ta(I674
+I331
+I671
+I317
+ta(I671
+I317
+I666
+I303
+ta(I666
+I303
+I661
+I298
+ta(I661
+I298
+I647
+I293
+ta(I647
+I293
+I641
+I289
+ta(I641
+I289
+I635
+I286
+ta(I635
+I286
+I621
+I283
+ta(I621
+I283
+I605
+I281
+ta(I605
+I281
+I587
+I280
+ta(I587
+I280
+I569
+I279
+ta(I569
+I279
+I551
+I279
+ta(I551
+I279
+I535
+I281
+ta(I535
+I281
+I521
+I283
+ta(I521
+I283
+I517
+I285
+ta(I517
+I285
+I513
+I288
+ta(I513
+I288
+I510
+I292
+ta(I510
+I292
+I508
+I297
+ta(I508
+I297
+I506
+I311
+ta(I506
+I311
+I506
+I317
+ta(I506
+I317
+I506
+I333
+ta(I506
+I333
+I506
+I347
+ta(I506
+I347
+I509
+I363
+ta(I509
+I363
+I512
+I377
+ta(I512
+I377
+I516
+I383
+ta(I516
+I383
+I520
+I388
+ta(I520
+I388
+I526
+I393
+ta(I526
+I393
+I532
+I396
+ta(I532
+I396
+I535
+I397
+ta(I535
+I397
+I549
+I398
+ta(I549
+I398
+I554
+I398
+ta(I554
+I398
+I559
+I396
+ta(I559
+I396
+I563
+I392
+ta(I563
+I392
+I567
+I386
+ta(I567
+I386
+I569
+I381
+ta(I569
+I381
+I571
+I375
+ta(I571
+I375
+I571
+I359
+ta(I571
+I359
+I571
+I343
+ta(I571
+I343
+I568
+I329
+ta(I568
+I329
+I564
+I313
+ta(I564
+I313
+I560
+I307
+ta(I560
+I307
+I546
+I301
+ta(I546
+I301
+I540
+I297
+ta(I540
+I297
+I524
+I293
+ta(I524
+I293
+I508
+I290
+ta(I508
+I290
+I490
+I288
+ta(I490
+I288
+I474
+I286
+ta(I474
+I286
+I458
+I285
+ta(I458
+I285
+I442
+I285
+ta(I442
+I285
+I428
+I285
+ta(I428
+I285
+I414
+I286
+ta(I414
+I286
+I398
+I287
+ta(I398
+I287
+I384
+I289
+ta(I384
+I289
+I370
+I292
+ta(I370
+I292
+I364
+I296
+ta(I364
+I296
+I359
+I302
+ta(I359
+I302
+I355
+I308
+ta(I355
+I308
+I350
+I326
+ta(I350
+I326
+I347
+I340
+ta(I347
+I340
+I344
+I358
+ta(I344
+I358
+I342
+I376
+ta(I342
+I376
+I342
+I394
+ta(I342
+I394
+I342
+I410
+ta(I342
+I410
+I344
+I415
+ta(I344
+I415
+I346
+I420
+ta(I346
+I420
+I350
+I423
+ta(I350
+I423
+I354
+I426
+ta(I354
+I426
+I359
+I427
+ta(I359
+I427
+I364
+I427
+ta(I364
+I427
+I368
+I427
+ta(I368
+I427
+I374
+I424
+ta(I374
+I424
+I377
+I421
+ta(I377
+I421
+I382
+I416
+ta(I382
+I416
+I384
+I412
+ta(I384
+I412
+I387
+I398
+ta(I387
+I398
+I388
+I394
+ta(I388
+I394
+I390
+I380
+ta(I390
+I380
+I390
+I375
+ta(I390
+I375
+I389
+I369
+ta(I389
+I369
+I387
+I364
+ta(I387
+I364
+I384
+I358
+ta(I384
+I358
+I379
+I353
+ta(I379
+I353
+I365
+I348
+ta(I365
+I348
+I360
+I345
+ta(I360
+I345
+I346
+I342
+ta(I346
+I342
+I340
+I340
+ta(I340
+I340
+I335
+I338
+ta(I335
+I338
+I321
+I337
+ta(I321
+I337
+I315
+I336
+ta(I315
+I336
+I309
+I336
+ta(I309
+I336
+I305
+I336
+ta(I305
+I336
+I300
+I337
+ta(I300
+I337
+I297
+I339
+ta(I297
+I339
+I294
+I341
+ta(I294
+I341
+I291
+I345
+ta(I291
+I345
+I289
+I359
+ta(I289
+I359
+I288
+I364
+ta(I288
+I364
+I287
+I380
+ta(I287
+I380
+I287
+I394
+ta(I287
+I394
+I287
+I410
+ta(I287
+I410
+I287
+I424
+ta(I287
+I424
+I289
+I442
+ta(I289
+I442
+I291
+I447
+ta(I291
+I447
+I293
+I453
+ta(I293
+I453
+I298
+I457
+ta(I298
+I457
+I301
+I461
+ta(I301
+I461
+I307
+I464
+ta(I307
+I464
+I312
+I465
+ta(I312
+I465
+I317
+I465
+ta(I317
+I465
+I323
+I464
+ta(I323
+I464
+I328
+I461
+ta(I328
+I461
+I333
+I457
+ta(I333
+I457
+I337
+I452
+ta(I337
+I452
+I341
+I447
+ta(I341
+I447
+I343
+I431
+ta(I343
+I431
+I345
+I417
+ta(I345
+I417
+I345
+I411
+ta(I345
+I411
+I344
+I405
+ta(I344
+I405
+I342
+I400
+ta(I342
+I400
+I339
+I395
+ta(I339
+I395
+I334
+I390
+ta(I334
+I390
+I329
+I385
+ta(I329
+I385
+I323
+I382
+ta(I323
+I382
+I317
+I379
+ta(I317
+I379
+I312
+I377
+ta(I312
+I377
+I308
+I375
+ta(I308
+I375
+I303
+I374
+ta(I303
+I374
+I300
+I373
+ta(I300
+I373
+I298
+I372
+ta(I298
+I372
+I298
+I371
+ta(I298
+I371
+I298
+I369
+ta(I298
+I369
+I297
+I368
+ta(I297
+I368
+I297
+I367
+ta(I297
+I367
+I297
+I366
+ta(I297
+I366
+I297
+I365
+ta(I297
+I365
+I296
+I364
+ta(I296
+I364
+I294
+I362
+ta(I294
+I362
+I291
+I360
+ta(I291
+I360
+I287
+I358
+ta(I287
+I358
+I281
+I355
+ta(I281
+I355
+I275
+I353
+ta(I275
+I353
+I261
+I351
+ta(I261
+I351
+I245
+I349
+ta(I245
+I349
+I231
+I348
+ta(I231
+I348
+I225
+I347
+ta(I225
+I347
+I211
+I347
+ta(I211
+I347
+I205
+I349
+ta(I205
+I349
+I191
+I352
+ta(I191
+I352
+I177
+I356
+ta(I177
+I356
+I172
+I362
+ta(I172
+I362
+I156
+I368
+ta(I156
+I368
+I151
+I374
+ta(I151
+I374
+I148
+I380
+ta(I148
+I380
+I145
+I386
+ta(I145
+I386
+I145
+I392
+ta(I145
+I392
+I145
+I406
+ta(I145
+I406
+I148
+I412
+ta(I148
+I412
+I152
+I418
+ta(I152
+I418
+I156
+I423
+ta(I156
+I423
+I170
+I426
+ta(I170
+I426
+I188
+I429
+ta(I188
+I429
+I204
+I431
+ta(I204
+I431
+I220
+I431
+ta(I220
+I431
+I236
+I430
+ta(I236
+I430
+I242
+I427
+ta(I242
+I427
+I258
+I422
+ta(I258
+I422
+I262
+I408
+ta(I262
+I408
+I266
+I392
+ta(I266
+I392
+I268
+I376
+ta(I268
+I376
+I269
+I358
+ta(I269
+I358
+I269
+I340
+ta(I269
+I340
+I268
+I320
+ta(I268
+I320
+I265
+I302
+ta(I265
+I302
+I262
+I296
+ta(I262
+I296
+I257
+I280
+ta(I257
+I280
+I252
+I275
+ta(I252
+I275
+I247
+I270
+ta(I247
+I270
+I233
+I266
+ta(I233
+I266
+I228
+I263
+ta(I228
+I263
+I214
+I260
+ta(I214
+I260
+I208
+I259
+ta(I208
+I259
+I194
+I258
+ta(I194
+I258
+I180
+I258
+ta(I180
+I258
+I164
+I258
+ta(I164
+I258
+I148
+I261
+ta(I148
+I261
+I132
+I263
+ta(I132
+I263
+I116
+I266
+ta(I116
+I266
+I112
+I270
+ta(I112
+I270
+I107
+I275
+ta(I107
+I275
+I104
+I281
+ta(I104
+I281
+I102
+I286
+ta(I102
+I286
+I102
+I300
+ta(I102
+I300
+I102
+I306
+ta(I102
+I306
+I102
+I320
+ta(I102
+I320
+I103
+I338
+ta(I103
+I338
+I104
+I343
+ta(I104
+I343
+I107
+I349
+ta(I107
+I349
+I109
+I354
+ta(I109
+I354
+I112
+I356
+ta(I112
+I356
+I116
+I359
+ta(I116
+I359
+I120
+I360
+ta(I120
+I360
+I126
+I360
+ta(I126
+I360
+I129
+I358
+ta(I129
+I358
+I133
+I355
+ta(I133
+I355
+I137
+I351
+ta(I137
+I351
+I141
+I337
+ta(I141
+I337
+I144
+I323
+ta(I144
+I323
+I147
+I307
+ta(I147
+I307
+I149
+I293
+ta(I149
+I293
+I149
+I279
+ta(I149
+I279
+I149
+I265
+ta(I149
+I265
+I149
+I249
+ta(I149
+I249
+I146
+I235
+ta(I146
+I235
+I143
+I230
+ta(I143
+I230
+I140
+I226
+ta(I140
+I226
+I136
+I222
+ta(I136
+I222
+I132
+I219
+ta(I132
+I219
+I127
+I216
+ta(I127
+I216
+I121
+I214
+ta(I121
+I214
+I115
+I212
+ta(I115
+I212
+I101
+I211
+ta(I101
+I211
+I95
+I211
+ta(I95
+I211
+I89
+I211
+ta(I89
+I211
+I83
+I212
+ta(I83
+I212
+I78
+I215
+ta(I78
+I215
+I64
+I218
+ta(I64
+I218
+I61
+I224
+ta(I61
+I224
+I57
+I229
+ta(I57
+I229
+I54
+I235
+ta(I54
+I235
+I52
+I241
+ta(I52
+I241
+I50
+I259
+ta(I50
+I259
+I50
+I273
+ta(I50
+I273
+I49
+I289
+ta(I49
+I289
+I49
+I294
+ta(I49
+I294
+I49
+I308
+ta(I49
+I308
+I51
+I313
+ta(I51
+I313
+I53
+I317
+ta(I53
+I317
+I57
+I319
+ta(I57
+I319
+I63
+I320
+ta(I63
+I320
+I68
+I320
+ta(I68
+I320
+I86
+I319
+ta(I86
+I319
+I100
+I315
+ta(I100
+I315
+I105
+I310
+ta(I105
+I310
+I110
+I294
+ta(I110
+I294
+I113
+I288
+ta(I113
+I288
+I116
+I272
+ta(I116
+I272
+I119
+I254
+ta(I119
+I254
+I119
+I240
+ta(I119
+I240
+I120
+I224
+ta(I120
+I224
+I119
+I210
+ta(I119
+I210
+I116
+I194
+ta(I116
+I194
+I113
+I190
+ta(I113
+I190
+I110
+I186
+ta(I110
+I186
+I106
+I181
+ta(I106
+I181
+I103
+I178
+ta(I103
+I178
+I99
+I175
+ta(I99
+I175
+I95
+I172
+ta(I95
+I172
+I92
+I170
+ta(I92
+I170
+I88
+I169
+ta(I88
+I169
+I85
+I168
+ta(I85
+I168
+I81
+I167
+ta(I81
+I167
+I78
+I167
+ta(I78
+I167
+I74
+I167
+ta(I74
+I167
+I71
+I168
+ta(I71
+I168
+I68
+I170
+ta(I68
+I170
+I66
+I173
+ta(I66
+I173
+I64
+I177
+ta(I64
+I177
+I64
+I181
+ta(I64
+I181
+I64
+I187
+ta(I64
+I187
+I64
+I193
+ta(I64
+I193
+I65
+I199
+ta(I65
+I199
+I67
+I205
+ta(I67
+I205
+I71
+I211
+ta(I71
+I211
+I75
+I217
+ta(I75
+I217
+I81
+I222
+ta(I81
+I222
+I86
+I225
+ta(I86
+I225
+I92
+I229
+ta(I92
+I229
+I98
+I232
+ta(I98
+I232
+I112
+I235
+ta(I112
+I235
+I118
+I236
+ta(I118
+I236
+I123
+I236
+ta(I123
+I236
+I126
+I235
+ta(I126
+I235
+I126
+I234
+ta(I126
+I234
+I140
+I232
+ta(I140
+I232
+I140
+I214
+ta(I140
+I214
+I141
+I200
+ta(I141
+I200
+I142
+I194
+ta(I142
+I194
+I144
+I180
+ta(I144
+I180
+I146
+I166
+ta(I146
+I166
+I148
+I150
+ta(I148
+I150
+I148
+I136
+ta(I148
+I136
+I148
+I120
+ta(I148
+I120
+I148
+I104
+ta(I148
+I104
+I147
+I88
+ta(I147
+I88
+I145
+I72
+ta(I145
+I72
+I143
+I58
+ta(I143
+I58
+I140
+I52
+ta(I140
+I52
+I136
+I46
+ta(I136
+I46
+I131
+I41
+ta(I131
+I41
+I125
+I37
+ta(I125
+I37
+I121
+I35
+ta(I121
+I35
+I116
+I34
+ta(I116
+I34
+I112
+I33
+ta(I112
+I33
+I108
+I34
+ta(I108
+I34
+I105
+I36
+ta(I105
+I36
+I101
+I40
+ta(I101
+I40
+I98
+I45
+ta(I98
+I45
+I97
+I59
+ta(I97
+I59
+I95
+I65
+ta(I95
+I65
+I94
+I79
+ta(I94
+I79
+I93
+I93
+ta(I93
+I93
+I93
+I99
+ta(I93
+I99
+I93
+I113
+ta(I93
+I113
+I94
+I118
+ta(I94
+I118
+I96
+I122
+ta(I96
+I122
+I99
+I125
+ta(I99
+I125
+I102
+I129
+ta(I102
+I129
+I106
+I130
+ta(I106
+I130
+I110
+I131
+ta(I110
+I131
+I115
+I131
+ta(I115
+I131
+I119
+I131
+ta(I119
+I131
+I125
+I130
+ta(I125
+I130
+I129
+I127
+ta(I129
+I127
+I133
+I124
+ta(I133
+I124
+I136
+I120
+ta(I136
+I120
+I139
+I115
+ta(I139
+I115
+I141
+I110
+ta(I141
+I110
+I141
+I104
+ta(I141
+I104
+I141
+I90
+ta(I141
+I90
+I139
+I85
+ta(I139
+I85
+I136
+I79
+ta(I136
+I79
+I133
+I74
+ta(I133
+I74
+I128
+I69
+ta(I128
+I69
+I112
+I66
+ta(I112
+I66
+I98
+I63
+ta(I98
+I63
+I82
+I60
+ta(I82
+I60
+I66
+I59
+ta(I66
+I59
+I52
+I59
+ta(I52
+I59
+I46
+I59
+ta(I46
+I59
+I41
+I62
+ta(I41
+I62
+I35
+I65
+ta(I35
+I65
+I31
+I70
+ta(I31
+I70
+I26
+I75
+ta(I26
+I75
+I23
+I81
+ta(I23
+I81
+I20
+I97
+ta(I20
+I97
+I19
+I113
+ta(I19
+I113
+I19
+I127
+ta(I19
+I127
+I20
+I141
+ta(I20
+I141
+I23
+I146
+ta(I23
+I146
+I27
+I151
+ta(I27
+I151
+I33
+I156
+ta(I33
+I156
+I39
+I159
+ta(I39
+I159
+I44
+I161
+ta(I44
+I161
+I50
+I162
+ta(I50
+I162
+I56
+I162
+ta(I56
+I162
+I70
+I161
+ta(I70
+I161
+I74
+I159
+ta(I74
+I159
+I79
+I155
+ta(I79
+I155
+I82
+I150
+ta(I82
+I150
+I85
+I145
+ta(I85
+I145
+I86
+I131
+ta(I86
+I131
+I86
+I125
+ta(I86
+I125
+I86
+I109
+ta(I86
+I109
+I86
+I103
+ta(I86
+I103
+I83
+I89
+ta(I83
+I89
+I81
+I75
+ta(I81
+I75
+I77
+I69
+ta(I77
+I69
+I73
+I64
+ta(I73
+I64
+I69
+I50
+ta(I69
+I50
+I64
+I47
+ta(I64
+I47
+I60
+I43
+ta(I60
+I43
+I54
+I40
+ta(I54
+I40
+I49
+I38
+ta(I49
+I38
+I45
+I37
+ta(I45
+I37
+I41
+I37
+ta(I41
+I37
+I38
+I39
+ta(I38
+I39
+I35
+I42
+ta(I35
+I42
+I32
+I47
+ta(I32
+I47
+I30
+I53
+ta(I30
+I53
+I28
+I67
+ta(I28
+I67
+I27
+I81
+ta(I27
+I81
+I26
+I99
+ta(I26
+I99
+I26
+I113
+ta(I26
+I113
+I26
+I127
+ta(I26
+I127
+I27
+I133
+ta(I27
+I133
+I29
+I139
+ta(I29
+I139
+I32
+I145
+ta(I32
+I145
+I37
+I148
+ta(I37
+I148
+I42
+I151
+ta(I42
+I151
+I47
+I153
+ta(I47
+I153
+I53
+I153
+ta(I53
+I153
+I69
+I153
+ta(I69
+I153
+I75
+I150
+ta(I75
+I150
+I93
+I145
+ta(I93
+I145
+I98
+I140
+ta(I98
+I140
+I104
+I126
+ta(I104
+I126
+I109
+I112
+ta(I109
+I112
+I112
+I96
+ta(I112
+I96
+I115
+I80
+ta(I115
+I80
+I116
+I64
+ta(I116
+I64
+I116
+I48
+ta(I116
+I48
+I116
+I34
+ta(I116
+I34
+I114
+I28
+ta(I114
+I28
+I110
+I12
+ta(I110
+I12
+I105
+I8
+ta(I105
+I8
+I100
+I3
+ta(I100
+I3
+I94
+I0
+ta(I94
+I0
+I89
+I-2
+ta(I89
+I-2
+I85
+I-3
+ta(I85
+I-3
+I82
+I-3
+ta(I82
+I-3
+I80
+I0
+ta(I80
+I0
+I78
+I4
+ta(I78
+I4
+I78
+I10
+ta(I78
+I10
+I78
+I16
+ta(I78
+I16
+I80
+I36
+ta(I80
+I36
+I83
+I50
+ta(I83
+I50
+I87
+I66
+ta(I87
+I66
+I101
+I82
+ta(I101
+I82
+I117
+I96
+ta(I117
+I96
+I131
+I101
+ta(I131
+I101
+I153
+I105
+ta(I153
+I105
+I173
+I108
+ta(I173
+I108
+I193
+I110
+ta(I193
+I110
+I217
+I112
+ta(I217
+I112
+I237
+I112
+ta(I237
+I112
+I257
+I111
+ta(I257
+I111
+I277
+I108
+ta(I277
+I108
+I295
+I104
+ta(I295
+I104
+I309
+I99
+ta(I309
+I99
+I314
+I94
+ta(I314
+I94
+I317
+I88
+ta(I317
+I88
+I319
+I74
+ta(I319
+I74
+I320
+I68
+ta(I320
+I68
+I319
+I64
+ta(I319
+I64
+I316
+I59
+ta(I316
+I59
+I312
+I55
+ta(I312
+I55
+I296
+I50
+ta(I296
+I50
+I282
+I47
+ta(I282
+I47
+I268
+I44
+ta(I268
+I44
+I264
+I43
+ta(I264
+I43
+I259
+I42
+ta(I259
+I42
+I255
+I42
+ta(I255
+I42
+I253
+I42
+ta(I253
+I42
+I251
+I45
+ta(I251
+I45
+I250
+I48
+ta(I250
+I48
+I248
+I53
+ta(I248
+I53
+I246
+I59
+ta(I246
+I59
+I245
+I65
+ta(I245
+I65
+I245
+I79
+ta(I245
+I79
+I245
+I97
+ta(I245
+I97
+I245
+I102
+ta(I245
+I102
+I247
+I116
+ta(I247
+I116
+I249
+I130
+ta(I249
+I130
+I251
+I135
+ta(I251
+I135
+I254
+I141
+ta(I254
+I141
+I257
+I145
+ta(I257
+I145
+I261
+I148
+ta(I261
+I148
+I264
+I150
+ta(I264
+I150
+I268
+I152
+ta(I268
+I152
+I272
+I152
+ta(I272
+I152
+I275
+I151
+ta(I275
+I151
+I279
+I149
+ta(I279
+I149
+I284
+I144
+ta(I284
+I144
+I286
+I140
+ta(I286
+I140
+I289
+I126
+ta(I289
+I126
+I291
+I112
+ta(I291
+I112
+I292
+I106
+ta(I292
+I106
+I292
+I92
+ta(I292
+I92
+I291
+I78
+ta(I291
+I78
+I287
+I64
+ta(I287
+I64
+I283
+I58
+ta(I283
+I58
+I278
+I53
+ta(I278
+I53
+I273
+I48
+ta(I273
+I48
+I257
+I44
+ta(I257
+I44
+I251
+I41
+ta(I251
+I41
+I237
+I38
+ta(I237
+I38
+I223
+I36
+ta(I223
+I36
+I217
+I35
+ta(I217
+I35
+I212
+I35
+ta(I212
+I35
+I208
+I35
+ta(I208
+I35
+I204
+I37
+ta(I204
+I37
+I201
+I41
+ta(I201
+I41
+I199
+I45
+ta(I199
+I45
+I197
+I51
+ta(I197
+I51
+I196
+I57
+ta(I196
+I57
+I196
+I75
+ta(I196
+I75
+I196
+I91
+ta(I196
+I91
+I197
+I105
+ta(I197
+I105
+I201
+I123
+ta(I201
+I123
+I205
+I137
+ta(I205
+I137
+I211
+I153
+ta(I211
+I153
+I216
+I157
+ta(I216
+I157
+I222
+I162
+ta(I222
+I162
+I228
+I165
+ta(I228
+I165
+I234
+I166
+ta(I234
+I166
+I240
+I166
+ta(I240
+I166
+I245
+I165
+ta(I245
+I165
+I251
+I162
+ta(I251
+I162
+I256
+I157
+ta(I256
+I157
+I261
+I143
+ta(I261
+I143
+I263
+I137
+ta(I263
+I137
+I266
+I123
+ta(I266
+I123
+I268
+I107
+ta(I268
+I107
+I268
+I91
+ta(I268
+I91
+I267
+I75
+ta(I267
+I75
+I264
+I59
+ta(I264
+I59
+I261
+I53
+ta(I261
+I53
+I257
+I47
+ta(I257
+I47
+I251
+I41
+ta(I251
+I41
+I246
+I36
+ta(I246
+I36
+I232
+I32
+ta(I232
+I32
+I226
+I28
+ta(I226
+I28
+I220
+I25
+ta(I220
+I25
+I217
+I22
+ta(I217
+I22
+I213
+I20
+ta(I213
+I20
+I210
+I20
+ta(I210
+I20
+I208
+I20
+ta(I208
+I20
+I206
+I22
+ta(I206
+I22
+I204
+I26
+ta(I204
+I26
+I204
+I32
+ta(I204
+I32
+I204
+I48
+ta(I204
+I48
+I204
+I64
+ta(I204
+I64
+I207
+I82
+ta(I207
+I82
+I210
+I100
+ta(I210
+I100
+I214
+I118
+ta(I214
+I118
+I220
+I134
+ta(I220
+I134
+I224
+I140
+ta(I224
+I140
+I230
+I145
+ta(I230
+I145
+I250
+I159
+ta(I250
+I159
+I264
+I161
+ta(I264
+I161
+I282
+I165
+ta(I282
+I165
+I302
+I167
+ta(I302
+I167
+I324
+I168
+ta(I324
+I168
+I346
+I169
+ta(I346
+I169
+I368
+I169
+ta(I368
+I169
+I386
+I166
+ta(I386
+I166
+I404
+I163
+ta(I404
+I163
+I422
+I158
+ta(I422
+I158
+I436
+I153
+ta(I436
+I153
+I441
+I147
+ta(I441
+I147
+I445
+I131
+ta(I445
+I131
+I447
+I117
+ta(I447
+I117
+I447
+I101
+ta(I447
+I101
+I446
+I87
+ta(I446
+I87
+I443
+I73
+ta(I443
+I73
+I438
+I68
+ta(I438
+I68
+I424
+I62
+ta(I424
+I62
+I410
+I57
+ta(I410
+I57
+I396
+I52
+ta(I396
+I52
+I390
+I49
+ta(I390
+I49
+I384
+I47
+ta(I384
+I47
+I368
+I46
+ta(I368
+I46
+I362
+I46
+ta(I362
+I46
+I356
+I48
+ta(I356
+I48
+I352
+I50
+ta(I352
+I50
+I348
+I55
+ta(I348
+I55
+I344
+I61
+ta(I344
+I61
+I341
+I67
+ta(I341
+I67
+I339
+I83
+ta(I339
+I83
+I339
+I99
+ta(I339
+I99
+I339
+I105
+ta(I339
+I105
+I340
+I121
+ta(I340
+I121
+I342
+I135
+ta(I342
+I135
+I347
+I141
+ta(I347
+I141
+I352
+I147
+ta(I352
+I147
+I357
+I152
+ta(I357
+I152
+I363
+I155
+ta(I363
+I155
+I379
+I158
+ta(I379
+I158
+I393
+I160
+ta(I393
+I160
+I409
+I161
+ta(I409
+I161
+I425
+I161
+ta(I425
+I161
+I441
+I160
+ta(I441
+I160
+I455
+I156
+ta(I455
+I156
+I461
+I151
+ta(I461
+I151
+I466
+I146
+ta(I466
+I146
+I470
+I130
+ta(I470
+I130
+I474
+I124
+ta(I474
+I124
+I477
+I108
+ta(I477
+I108
+I478
+I102
+ta(I478
+I102
+I479
+I86
+ta(I479
+I86
+I479
+I72
+ta(I479
+I72
+I478
+I66
+ta(I478
+I66
+I475
+I61
+ta(I475
+I61
+I471
+I56
+ta(I471
+I56
+I457
+I51
+ta(I457
+I51
+I443
+I48
+ta(I443
+I48
+I427
+I44
+ta(I427
+I44
+I413
+I43
+ta(I413
+I43
+I407
+I42
+ta(I407
+I42
+I402
+I42
+ta(I402
+I42
+I397
+I43
+ta(I397
+I43
+I393
+I46
+ta(I393
+I46
+I390
+I51
+ta(I390
+I51
+I387
+I57
+ta(I387
+I57
+I385
+I62
+ta(I385
+I62
+I383
+I76
+ta(I383
+I76
+I381
+I92
+ta(I381
+I92
+I380
+I106
+ta(I380
+I106
+I379
+I122
+ta(I379
+I122
+I379
+I138
+ta(I379
+I138
+I380
+I144
+ta(I380
+I144
+I382
+I150
+ta(I382
+I150
+I386
+I156
+ta(I386
+I156
+I390
+I160
+ta(I390
+I160
+I396
+I163
+ta(I396
+I163
+I412
+I166
+ta(I412
+I166
+I426
+I166
+ta(I426
+I166
+I444
+I166
+ta(I444
+I166
+I462
+I165
+ta(I462
+I165
+I480
+I162
+ta(I480
+I162
+I496
+I159
+ta(I496
+I159
+I510
+I155
+ta(I510
+I155
+I516
+I149
+ta(I516
+I149
+I521
+I135
+ta(I521
+I135
+I523
+I129
+ta(I523
+I129
+I524
+I123
+ta(I524
+I123
+I524
+I109
+ta(I524
+I109
+I523
+I95
+ta(I523
+I95
+I520
+I79
+ta(I520
+I79
+I517
+I73
+ta(I517
+I73
+I513
+I67
+ta(I513
+I67
+I497
+I63
+ta(I497
+I63
+I483
+I58
+ta(I483
+I58
+I469
+I55
+ta(I469
+I55
+I453
+I52
+ta(I453
+I52
+I433
+I50
+ta(I433
+I50
+I415
+I49
+ta(I415
+I49
+I397
+I49
+ta(I397
+I49
+I381
+I49
+ta(I381
+I49
+I375
+I51
+ta(I375
+I51
+I371
+I55
+ta(I371
+I55
+I368
+I59
+ta(I368
+I59
+I368
+I65
+ta(I368
+I65
+I368
+I79
+ta(I368
+I79
+I368
+I85
+ta(I368
+I85
+I370
+I99
+ta(I370
+I99
+I374
+I117
+ta(I374
+I117
+I378
+I123
+ta(I378
+I123
+I383
+I137
+ta(I383
+I137
+I389
+I141
+ta(I389
+I141
+I395
+I146
+ta(I395
+I146
+I411
+I150
+ta(I411
+I150
+I431
+I153
+ta(I431
+I153
+I449
+I155
+ta(I449
+I155
+I467
+I156
+ta(I467
+I156
+I487
+I157
+ta(I487
+I157
+I507
+I157
+ta(I507
+I157
+I527
+I156
+ta(I527
+I156
+I541
+I154
+ta(I541
+I154
+I557
+I150
+ta(I557
+I150
+I561
+I145
+ta(I561
+I145
+I565
+I131
+ta(I565
+I131
+I569
+I125
+ta(I569
+I125
+I571
+I111
+ta(I571
+I111
+I573
+I105
+ta(I573
+I105
+I573
+I89
+ta(I573
+I89
+I572
+I83
+ta(I572
+I83
+I569
+I77
+ta(I569
+I77
+I564
+I72
+ta(I564
+I72
+I550
+I67
+ta(I550
+I67
+I536
+I62
+ta(I536
+I62
+I518
+I59
+ta(I518
+I59
+I502
+I57
+ta(I502
+I57
+I482
+I56
+ta(I482
+I56
+I462
+I55
+ta(I462
+I55
+I444
+I55
+ta(I444
+I55
+I428
+I57
+ta(I428
+I57
+I414
+I59
+ta(I414
+I59
+I409
+I63
+ta(I409
+I63
+I405
+I67
+ta(I405
+I67
+I402
+I73
+ta(I402
+I73
+I401
+I79
+ta(I401
+I79
+I401
+I85
+ta(I401
+I85
+I402
+I90
+ta(I402
+I90
+I404
+I96
+ta(I404
+I96
+I409
+I102
+ta(I409
+I102
+I414
+I107
+ta(I414
+I107
+I428
+I113
+ta(I428
+I113
+I444
+I116
+ta(I444
+I116
+I460
+I120
+ta(I460
+I120
+I476
+I122
+ta(I476
+I122
+I498
+I124
+ta(I498
+I124
+I518
+I124
+ta(I518
+I124
+I536
+I124
+ta(I536
+I124
+I554
+I122
+ta(I554
+I122
+I574
+I118
+ta(I574
+I118
+I590
+I114
+ta(I590
+I114
+I595
+I110
+ta(I595
+I110
+I601
+I104
+ta(I601
+I104
+I604
+I90
+ta(I604
+I90
+I606
+I84
+ta(I606
+I84
+I608
+I78
+ta(I608
+I78
+I608
+I72
+ta(I608
+I72
+I608
+I58
+ta(I608
+I58
+I605
+I52
+ta(I605
+I52
+I601
+I48
+ta(I601
+I48
+I596
+I43
+ta(I596
+I43
+I582
+I39
+ta(I582
+I39
+I568
+I36
+ta(I568
+I36
+I552
+I34
+ta(I552
+I34
+I534
+I32
+ta(I534
+I32
+I518
+I32
+ta(I518
+I32
+I500
+I31
+ta(I500
+I31
+I480
+I31
+ta(I480
+I31
+I462
+I31
+ta(I462
+I31
+I444
+I32
+ta(I444
+I32
+I430
+I35
+ta(I430
+I35
+I426
+I37
+ta(I426
+I37
+I423
+I40
+ta(I423
+I40
+I421
+I44
+ta(I421
+I44
+I420
+I58
+ta(I420
+I58
+I420
+I63
+ta(I420
+I63
+I421
+I69
+ta(I421
+I69
+I424
+I75
+ta(I424
+I75
+I428
+I93
+ta(I428
+I93
+I431
+I98
+ta(I431
+I98
+I437
+I104
+ta(I437
+I104
+I443
+I120
+ta(I443
+I120
+I449
+I124
+ta(I449
+I124
+I465
+I130
+ta(I465
+I130
+I481
+I133
+ta(I481
+I133
+I497
+I137
+ta(I497
+I137
+I515
+I139
+ta(I515
+I139
+I533
+I140
+ta(I533
+I140
+I555
+I140
+ta(I555
+I140
+I575
+I139
+ta(I575
+I139
+I593
+I137
+ta(I593
+I137
+I611
+I133
+ta(I611
+I133
+I627
+I129
+ta(I627
+I129
+I633
+I124
+ta(I633
+I124
+I638
+I110
+ta(I638
+I110
+I641
+I105
+ta(I641
+I105
+I644
+I89
+ta(I644
+I89
+I646
+I75
+ta(I646
+I75
+I646
+I69
+ta(I646
+I69
+I646
+I64
+ta(I646
+I64
+I643
+I50
+ta(I643
+I50
+I639
+I45
+ta(I639
+I45
+I625
+I41
+ta(I625
+I41
+I611
+I37
+ta(I611
+I37
+I593
+I33
+ta(I593
+I33
+I575
+I31
+ta(I575
+I31
+I557
+I30
+ta(I557
+I30
+I539
+I30
+ta(I539
+I30
+I525
+I30
+ta(I525
+I30
+I519
+I32
+ta(I519
+I32
+I514
+I36
+ta(I514
+I36
+I510
+I40
+ta(I510
+I40
+I507
+I54
+ta(I507
+I54
+I506
+I68
+ta(I506
+I68
+I507
+I73
+ta(I507
+I73
+I509
+I79
+ta(I509
+I79
+I513
+I93
+ta(I513
+I93
+I518
+I98
+ta(I518
+I98
+I523
+I103
+ta(I523
+I103
+I539
+I108
+ta(I539
+I108
+I555
+I111
+ta(I555
+I111
+I569
+I116
+ta(I569
+I116
+I589
+I120
+ta(I589
+I120
+I607
+I123
+ta(I607
+I123
+I625
+I126
+ta(I625
+I126
+I643
+I127
+ta(I643
+I127
+I663
+I128
+ta(I663
+I128
+I683
+I128
+ta(I683
+I128
+I701
+I126
+ta(I701
+I126
+I717
+I123
+ta(I717
+I123
+I723
+I119
+ta(I723
+I119
+I728
+I115
+ta(I728
+I115
+I730
+I111
+ta(I730
+I111
+I732
+I106
+ta(I732
+I106
+I732
+I92
+ta(I732
+I92
+I732
+I88
+ta(I732
+I88
+I728
+I74
+ta(I728
+I74
+I725
+I69
+ta(I725
+I69
+I719
+I64
+ta(I719
+I64
+I705
+I60
+ta(I705
+I60
+I689
+I55
+ta(I689
+I55
+I675
+I52
+ta(I675
+I52
+I659
+I50
+ta(I659
+I50
+I643
+I49
+ta(I643
+I49
+I629
+I49
+ta(I629
+I49
+I613
+I49
+ta(I613
+I49
+I595
+I52
+ta(I595
+I52
+I579
+I56
+ta(I579
+I56
+I573
+I62
+ta(I573
+I62
+I568
+I67
+ta(I568
+I67
+I564
+I83
+ta(I564
+I83
+I562
+I97
+ta(I562
+I97
+I560
+I113
+ta(I560
+I113
+I560
+I127
+ta(I560
+I127
+I560
+I141
+ta(I560
+I141
+I562
+I155
+ta(I562
+I155
+I565
+I169
+ta(I565
+I169
+I568
+I185
+ta(I568
+I185
+I573
+I199
+ta(I573
+I199
+I578
+I213
+ta(I578
+I213
+I584
+I218
+ta(I584
+I218
+I598
+I222
+ta(I598
+I222
+I614
+I225
+ta(I614
+I225
+I632
+I229
+ta(I632
+I229
+I648
+I231
+ta(I648
+I231
+I662
+I231
+ta(I662
+I231
+I676
+I230
+ta(I676
+I230
+I681
+I228
+ta(I681
+I228
+I684
+I225
+ta(I684
+I225
+I688
+I220
+ta(I688
+I220
+I689
+I215
+ta(I689
+I215
+I690
+I199
+ta(I690
+I199
+I690
+I185
+ta(I690
+I185
+I688
+I171
+ta(I688
+I171
+I685
+I155
+ta(I685
+I155
+I679
+I141
+ta(I679
+I141
+I674
+I135
+ta(I674
+I135
+I658
+I129
+ta(I658
+I129
+I644
+I125
+ta(I644
+I125
+I630
+I121
+ta(I630
+I121
+I616
+I119
+ta(I616
+I119
+I600
+I117
+ta(I600
+I117
+I584
+I116
+ta(I584
+I116
+I578
+I116
+ta(I578
+I116
+I564
+I119
+ta(I564
+I119
+I550
+I123
+ta(I550
+I123
+I545
+I128
+ta(I545
+I128
+I541
+I133
+ta(I541
+I133
+I537
+I147
+ta(I537
+I147
+I533
+I163
+ta(I533
+I163
+I531
+I179
+ta(I531
+I179
+I530
+I197
+ta(I530
+I197
+I530
+I213
+ta(I530
+I213
+I532
+I227
+ta(I532
+I227
+I536
+I241
+ta(I536
+I241
+I542
+I255
+ta(I542
+I255
+I547
+I259
+ta(I547
+I259
+I553
+I262
+ta(I553
+I262
+I567
+I264
+ta(I567
+I264
+I573
+I265
+ta(I573
+I265
+I589
+I266
+ta(I589
+I266
+I593
+I266
+ta(I593
+I266
+I607
+I264
+ta(I607
+I264
+I612
+I260
+ta(I612
+I260
+I615
+I256
+ta(I615
+I256
+I619
+I242
+ta(I619
+I242
+I622
+I237
+ta(I622
+I237
+I623
+I231
+ta(I623
+I231
+I622
+I215
+ta(I622
+I215
+I620
+I201
+ta(I620
+I201
+I615
+I185
+ta(I615
+I185
+I599
+I169
+ta(I599
+I169
+I585
+I163
+ta(I585
+I163
+I569
+I157
+ta(I569
+I157
+I547
+I152
+ta(I547
+I152
+I531
+I149
+ta(I531
+I149
+I513
+I146
+ta(I513
+I146
+I499
+I146
+ta(I499
+I146
+I485
+I146
+ta(I485
+I146
+I471
+I149
+ta(I471
+I149
+I465
+I152
+ta(I465
+I152
+I451
+I158
+ta(I451
+I158
+I445
+I163
+ta(I445
+I163
+I442
+I168
+ta(I442
+I168
+I437
+I182
+ta(I437
+I182
+I434
+I188
+ta(I434
+I188
+I432
+I202
+ta(I432
+I202
+I431
+I220
+ta(I431
+I220
+I431
+I234
+ta(I431
+I234
+I432
+I239
+ta(I432
+I239
+I435
+I245
+ta(I435
+I245
+I439
+I251
+ta(I439
+I251
+I443
+I254
+ta(I443
+I254
+I449
+I258
+ta(I449
+I258
+I463
+I261
+ta(I463
+I261
+I469
+I262
+ta(I469
+I262
+I475
+I262
+ta(I475
+I262
+I493
+I261
+ta(I493
+I261
+I511
+I259
+ta(I511
+I259
+I525
+I255
+ta(I525
+I255
+I539
+I250
+ta(I539
+I250
+I542
+I244
+ta(I542
+I244
+I545
+I238
+ta(I545
+I238
+I546
+I224
+ta(I546
+I224
+I545
+I208
+ta(I545
+I208
+I542
+I190
+ta(I542
+I190
+I538
+I174
+ta(I538
+I174
+I522
+I158
+ta(I522
+I158
+I504
+I144
+ta(I504
+I144
+I486
+I130
+ta(I486
+I130
+I466
+I126
+ta(I466
+I126
+I448
+I122
+ta(I448
+I122
+I430
+I119
+ta(I430
+I119
+I410
+I117
+ta(I410
+I117
+I394
+I116
+ta(I394
+I116
+I376
+I116
+ta(I376
+I116
+I358
+I117
+ta(I358
+I117
+I340
+I120
+ta(I340
+I120
+I326
+I123
+ta(I326
+I123
+I321
+I129
+ta(I321
+I129
+I316
+I135
+ta(I316
+I135
+I313
+I141
+ta(I313
+I141
+I312
+I157
+ta(I312
+I157
+I312
+I171
+ta(I312
+I171
+I312
+I185
+ta(I312
+I185
+I313
+I199
+ta(I313
+I199
+I315
+I213
+ta(I315
+I213
+I318
+I219
+ta(I318
+I219
+I323
+I225
+ta(I323
+I225
+I326
+I230
+ta(I326
+I230
+I332
+I233
+ta(I332
+I233
+I338
+I237
+ta(I338
+I237
+I343
+I239
+ta(I343
+I239
+I361
+I240
+ta(I361
+I240
+I375
+I241
+ta(I375
+I241
+I389
+I240
+ta(I389
+I240
+I395
+I237
+ta(I395
+I237
+I409
+I233
+ta(I409
+I233
+I412
+I230
+ta(I412
+I230
+I415
+I225
+ta(I415
+I225
+I416
+I220
+ta(I416
+I220
+I416
+I215
+ta(I416
+I215
+I415
+I210
+ta(I415
+I210
+I411
+I196
+ta(I411
+I196
+I405
+I192
+ta(I405
+I192
+I387
+I188
+ta(I387
+I188
+I371
+I184
+ta(I371
+I184
+I351
+I180
+ta(I351
+I180
+I333
+I178
+ta(I333
+I178
+I315
+I176
+ta(I315
+I176
+I299
+I175
+ta(I299
+I175
+I283
+I175
+ta(I283
+I175
+I269
+I176
+ta(I269
+I176
+I253
+I178
+ta(I253
+I178
+I239
+I181
+ta(I239
+I181
+I235
+I185
+ta(I235
+I185
+I231
+I199
+ta(I231
+I199
+I228
+I204
+ta(I228
+I204
+I226
+I210
+ta(I226
+I210
+I225
+I226
+ta(I225
+I226
+I226
+I231
+ta(I226
+I231
+I228
+I249
+ta(I228
+I249
+I232
+I255
+ta(I232
+I255
+I236
+I269
+ta(I236
+I269
+I241
+I274
+ta(I241
+I274
+I247
+I280
+ta(I247
+I280
+I261
+I283
+ta(I261
+I283
+I275
+I286
+ta(I275
+I286
+I291
+I288
+ta(I291
+I288
+I309
+I289
+ta(I309
+I289
+I325
+I289
+ta(I325
+I289
+I339
+I288
+ta(I339
+I288
+I357
+I285
+ta(I357
+I285
+I373
+I280
+ta(I373
+I280
+I377
+I276
+ta(I377
+I276
+I382
+I271
+ta(I382
+I271
+I384
+I257
+ta(I384
+I257
+I385
+I252
+ta(I385
+I252
+I384
+I248
+ta(I384
+I248
+I382
+I242
+ta(I382
+I242
+I378
+I237
+ta(I378
+I237
+I372
+I234
+ta(I372
+I234
+I356
+I230
+ta(I356
+I230
+I340
+I228
+ta(I340
+I228
+I322
+I226
+ta(I322
+I226
+I304
+I226
+ta(I304
+I226
+I288
+I226
+ta(I288
+I226
+I282
+I227
+ta(I282
+I227
+I276
+I230
+ta(I276
+I230
+I273
+I233
+ta(I273
+I233
+I270
+I237
+ta(I270
+I237
+I269
+I243
+ta(I269
+I243
+I269
+I249
+ta(I269
+I249
+I270
+I254
+ta(I270
+I254
+I274
+I259
+ta(I274
+I259
+I279
+I263
+ta(I279
+I263
+I285
+I266
+ta(I285
+I266
+I301
+I270
+ta(I301
+I270
+I317
+I272
+ta(I317
+I272
+I339
+I275
+ta(I339
+I275
+I361
+I277
+ta(I361
+I277
+I383
+I277
+ta(I383
+I277
+I409
+I277
+ta(I409
+I277
+I433
+I276
+ta(I433
+I276
+I457
+I273
+ta(I457
+I273
+I481
+I268
+ta(I481
+I268
+I501
+I263
+ta(I501
+I263
+I517
+I249
+ta(I517
+I249
+I531
+I235
+ta(I531
+I235
+I533
+I221
+ta(I533
+I221
+I535
+I207
+ta(I535
+I207
+I535
+I191
+ta(I535
+I191
+I533
+I177
+ta(I533
+I177
+I528
+I171
+ta(I528
+I171
+I523
+I167
+ta(I523
+I167
+I507
+I162
+ta(I507
+I162
+I493
+I159
+ta(I493
+I159
+I487
+I157
+ta(I487
+I157
+I481
+I156
+ta(I481
+I156
+I476
+I156
+ta(I476
+I156
+I472
+I157
+ta(I472
+I157
+I469
+I159
+ta(I469
+I159
+I466
+I162
+ta(I466
+I162
+I464
+I166
+ta(I464
+I166
+I463
+I172
+ta(I463
+I172
+I463
+I177
+ta(I463
+I177
+I463
+I183
+ta(I463
+I183
+I463
+I188
+ta(I463
+I188
+I464
+I194
+ta(I464
+I194
+I466
+I200
+ta(I466
+I200
+I469
+I206
+ta(I469
+I206
+I473
+I211
+ta(I473
+I211
+I477
+I216
+ta(I477
+I216
+I483
+I221
+ta(I483
+I221
+I489
+I224
+ta(I489
+I224
+I494
+I227
+ta(I494
+I227
+I510
+I230
+ta(I510
+I230
+I526
+I231
+ta(I526
+I231
+I544
+I231
+ta(I544
+I231
+I560
+I231
+ta(I560
+I231
+I578
+I229
+ta(I578
+I229
+I592
+I226
+ta(I592
+I226
+I606
+I222
+ta(I606
+I222
+I611
+I218
+ta(I611
+I218
+I615
+I213
+ta(I615
+I213
+I617
+I208
+ta(I617
+I208
+I620
+I202
+ta(I620
+I202
+I621
+I196
+ta(I621
+I196
+I621
+I191
+ta(I621
+I191
+I620
+I186
+ta(I620
+I186
+I617
+I181
+ta(I617
+I181
+I613
+I176
+ta(I613
+I176
+I609
+I172
+ta(I609
+I172
+I605
+I169
+ta(I605
+I169
+I587
+I165
+ta(I587
+I165
+I571
+I162
+ta(I571
+I162
+I553
+I160
+ta(I553
+I160
+I535
+I159
+ta(I535
+I159
+I519
+I159
+ta(I519
+I159
+I503
+I161
+ta(I503
+I161
+I498
+I164
+ta(I498
+I164
+I494
+I168
+ta(I494
+I168
+I491
+I174
+ta(I491
+I174
+I489
+I179
+ta(I489
+I179
+I489
+I184
+ta(I489
+I184
+I489
+I190
+ta(I489
+I190
+I491
+I206
+ta(I491
+I206
+I494
+I210
+ta(I494
+I210
+I500
+I216
+ta(I500
+I216
+I505
+I221
+ta(I505
+I221
+I511
+I225
+ta(I511
+I225
+I529
+I231
+ta(I529
+I231
+I545
+I234
+ta(I545
+I234
+I563
+I238
+ta(I563
+I238
+I581
+I242
+ta(I581
+I242
+I599
+I244
+ta(I599
+I244
+I615
+I246
+ta(I615
+I246
+I631
+I247
+ta(I631
+I247
+I645
+I247
+ta(I645
+I247
+I659
+I247
+ta(I659
+I247
+I664
+I246
+ta(I664
+I246
+I669
+I243
+ta(I669
+I243
+I672
+I240
+ta(I672
+I240
+I674
+I237
+ta(I674
+I237
+I676
+I234
+ta(I676
+I234
+I677
+I229
+ta(I677
+I229
+I677
+I225
+ta(I677
+I225
+I675
+I220
+ta(I675
+I220
+I672
+I216
+ta(I672
+I216
+I667
+I211
+ta(I667
+I211
+I663
+I207
+ta(I663
+I207
+I658
+I205
+ta(I658
+I205
+I654
+I202
+ta(I654
+I202
+I649
+I200
+ta(I649
+I200
+I644
+I199
+ta(I644
+I199
+I640
+I198
+ta(I640
+I198
+I635
+I198
+ta(I635
+I198
+I630
+I200
+ta(I630
+I200
+I626
+I202
+ta(I626
+I202
+I623
+I205
+ta(I623
+I205
+I619
+I219
+ta(I619
+I219
+I617
+I224
+ta(I617
+I224
+I615
+I238
+ta(I615
+I238
+I614
+I254
+ta(I614
+I254
+I614
+I259
+ta(I614
+I259
+I614
+I261
+ta(I614
+I261
+I614
+I262
+ta(I614
+I262
+I617
+I280
+ta(I617
+I280
+I617
+I281
+ta(I617
+I281
+I616
+I282
+ta(I616
+I282
+I617
+I282
+ta(I617
+I282
+I641
+I286
+ta(I641
+I286
+I655
+I288
+ta(I655
+I288
+I669
+I288
+ta(I669
+I288
+I673
+I288
+ta(I673
+I288
+I677
+I286
+ta(I677
+I286
+I678
+I283
+ta(I678
+I283
+I678
+I279
+ta(I678
+I279
+I678
+I275
+ta(I678
+I275
+I677
+I271
+ta(I677
+I271
+I675
+I268
+ta(I675
+I268
+I670
+I254
+ta(I670
+I254
+I669
+I254
+ta(I669
+I254
+I664
+I250
+ta(I664
+I250
+I659
+I248
+ta(I659
+I248
+I645
+I245
+ta(I645
+I245
+I631
+I241
+ta(I631
+I241
+I617
+I239
+ta(I617
+I239
+I611
+I238
+ta(I611
+I238
+I608
+I238
+ta(I608
+I238
+I604
+I239
+ta(I604
+I239
+I601
+I242
+ta(I601
+I242
+I600
+I245
+ta(I600
+I245
+I600
+I247
+ta(I600
+I247
+I600
+I251
+ta(I600
+I251
+I600
+I256
+ta(I600
+I256
+I600
+I259
+ta(I600
+I259
+I600
+I263
+ta(I600
+I263
+I600
+I266
+ta(I600
+I266
+I600
+I270
+ta(I600
+I270
+I600
+I273
+ta(I600
+I273
+I600
+I277
+ta(I600
+I277
+I600
+I280
+ta(I600
+I280
+I601
+I283
+ta(I601
+I283
+I603
+I286
+ta(I603
+I286
+I606
+I289
+ta(I606
+I289
+I610
+I291
+ta(I610
+I291
+I615
+I292
+ta(I615
+I292
+I621
+I293
+ta(I621
+I293
+I625
+I293
+ta(I625
+I293
+I630
+I292
+ta(I630
+I292
+I634
+I289
+ta(I634
+I289
+I637
+I286
+ta(I637
+I286
+I640
+I282
+ta(I640
+I282
+I641
+I277
+ta(I641
+I277
+I641
+I271
+ta(I641
+I271
+I640
+I267
+ta(I640
+I267
+I637
+I261
+ta(I637
+I261
+I633
+I256
+ta(I633
+I256
+I619
+I250
+ta(I619
+I250
+I603
+I246
+ta(I603
+I246
+I579
+I240
+ta(I579
+I240
+I551
+I236
+ta(I551
+I236
+I519
+I233
+ta(I519
+I233
+I487
+I230
+ta(I487
+I230
+I457
+I230
+ta(I457
+I230
+I429
+I230
+ta(I429
+I230
+I401
+I233
+ta(I401
+I233
+I377
+I236
+ta(I377
+I236
+I353
+I241
+ta(I353
+I241
+I331
+I247
+ta(I331
+I247
+I311
+I263
+ta(I311
+I263
+I297
+I268
+ta(I297
+I268
+I292
+I288
+ta(I292
+I288
+I290
+I306
+ta(I290
+I306
+I289
+I324
+ta(I289
+I324
+I291
+I342
+ta(I291
+I342
+I296
+I362
+ta(I296
+I362
+I301
+I376
+ta(I301
+I376
+I319
+I392
+ta(I319
+I392
+I337
+I397
+ta(I337
+I397
+I355
+I401
+ta(I355
+I401
+I373
+I405
+ta(I373
+I405
+I391
+I408
+ta(I391
+I408
+I409
+I408
+ta(I409
+I408
+I423
+I409
+ta(I423
+I409
+I427
+I407
+ta(I427
+I407
+I430
+I404
+ta(I430
+I404
+I432
+I400
+ta(I432
+I400
+I433
+I395
+ta(I433
+I395
+I432
+I381
+ta(I432
+I381
+I430
+I375
+ta(I430
+I375
+I426
+I369
+ta(I426
+I369
+I422
+I353
+ta(I422
+I353
+I408
+I339
+ta(I408
+I339
+I402
+I333
+ta(I402
+I333
+I388
+I319
+ta(I388
+I319
+I372
+I313
+ta(I372
+I313
+I356
+I299
+ta(I356
+I299
+I338
+I295
+ta(I338
+I295
+I322
+I291
+ta(I322
+I291
+I306
+I287
+ta(I306
+I287
+I286
+I284
+ta(I286
+I284
+I270
+I283
+ta(I270
+I283
+I256
+I283
+ta(I256
+I283
+I251
+I285
+ta(I251
+I285
+I246
+I289
+ta(I246
+I289
+I243
+I295
+ta(I243
+I295
+I240
+I300
+ta(I240
+I300
+I238
+I314
+ta(I238
+I314
+I238
+I330
+ta(I238
+I330
+I238
+I335
+ta(I238
+I335
+I238
+I341
+ta(I238
+I341
+I241
+I347
+ta(I241
+I347
+I244
+I351
+ta(I244
+I351
+I249
+I354
+ta(I249
+I354
+I254
+I357
+ta(I254
+I357
+I268
+I359
+ta(I268
+I359
+I284
+I360
+ta(I284
+I360
+I304
+I360
+ta(I304
+I360
+I326
+I360
+ta(I326
+I360
+I348
+I359
+ta(I348
+I359
+I370
+I357
+ta(I370
+I357
+I390
+I353
+ta(I390
+I353
+I408
+I350
+ta(I408
+I350
+I422
+I346
+ta(I422
+I346
+I427
+I341
+ta(I427
+I341
+I428
+I336
+ta(I428
+I336
+I429
+I331
+ta(I429
+I331
+I428
+I326
+ta(I428
+I326
+I425
+I321
+ta(I425
+I321
+I421
+I316
+ta(I421
+I316
+I415
+I311
+ta(I415
+I311
+I409
+I309
+ta(I409
+I309
+I391
+I305
+ta(I391
+I305
+I375
+I303
+ta(I375
+I303
+I361
+I302
+ta(I361
+I302
+I347
+I301
+ta(I347
+I301
+I333
+I301
+ta(I333
+I301
+I329
+I301
+ta(I329
+I301
+I325
+I304
+ta(I325
+I304
+I323
+I307
+ta(I323
+I307
+I322
+I311
+ta(I322
+I311
+I322
+I316
+ta(I322
+I316
+I325
+I322
+ta(I325
+I322
+I329
+I327
+ta(I329
+I327
+I335
+I332
+ta(I335
+I332
+I353
+I336
+ta(I353
+I336
+I371
+I340
+ta(I371
+I340
+I395
+I344
+ta(I395
+I344
+I419
+I347
+ta(I419
+I347
+I445
+I349
+ta(I445
+I349
+I473
+I350
+ta(I473
+I350
+I501
+I352
+ta(I501
+I352
+I527
+I352
+ta(I527
+I352
+I551
+I352
+ta(I551
+I352
+I571
+I351
+ta(I571
+I351
+I577
+I349
+ta(I577
+I349
+I581
+I346
+ta(I581
+I346
+I583
+I343
+ta(I583
+I343
+I585
+I340
+ta(I585
+I340
+I585
+I336
+ta(I585
+I336
+I583
+I332
+ta(I583
+I332
+I579
+I328
+ta(I579
+I328
+I573
+I323
+ta(I573
+I323
+I557
+I320
+ta(I557
+I320
+I539
+I317
+ta(I539
+I317
+I523
+I314
+ta(I523
+I314
+I503
+I312
+ta(I503
+I312
+I487
+I310
+ta(I487
+I310
+I469
+I309
+ta(I469
+I309
+I463
+I309
+ta(I463
+I309
+I458
+I309
+ta(I458
+I309
+I453
+I309
+ta(I453
+I309
+I451
+I312
+ta(I451
+I312
+I449
+I315
+ta(I449
+I315
+I449
+I318
+ta(I449
+I318
+I449
+I323
+ta(I449
+I323
+I452
+I337
+ta(I452
+I337
+I455
+I342
+ta(I455
+I342
+I461
+I348
+ta(I461
+I348
+I465
+I354
+ta(I465
+I354
+I468
+I359
+ta(I468
+I359
+I473
+I364
+ta(I473
+I364
+I477
+I367
+ta(I477
+I367
+I483
+I370
+ta(I483
+I370
+I487
+I371
+ta(I487
+I371
+I491
+I372
+ta(I491
+I372
+I496
+I371
+ta(I496
+I371
+I501
+I370
+ta(I501
+I370
+I505
+I367
+ta(I505
+I367
+I509
+I363
+ta(I509
+I363
+I512
+I358
+ta(I512
+I358
+I514
+I352
+ta(I514
+I352
+I515
+I347
+ta(I515
+I347
+I514
+I333
+ta(I514
+I333
+I512
+I327
+ta(I512
+I327
+I508
+I321
+ta(I508
+I321
+I503
+I307
+ta(I503
+I307
+I487
+I302
+ta(I487
+I302
+I473
+I297
+ta(I473
+I297
+I449
+I292
+ta(I449
+I292
+I425
+I287
+ta(I425
+I287
+I401
+I285
+ta(I401
+I285
+I375
+I282
+ta(I375
+I282
+I351
+I281
+ta(I351
+I281
+I327
+I281
+ta(I327
+I281
+I303
+I281
+ta(I303
+I281
+I283
+I283
+ta(I283
+I283
+I263
+I287
+ta(I263
+I287
+I245
+I293
+ta(I245
+I293
+I240
+I298
+ta(I240
+I298
+I235
+I304
+ta(I235
+I304
+I233
+I322
+ta(I233
+I322
+I231
+I336
+ta(I231
+I336
+I232
+I342
+ta(I232
+I342
+I233
+I358
+ta(I233
+I358
+I236
+I374
+ta(I236
+I374
+I239
+I388
+ta(I239
+I388
+I244
+I404
+ta(I244
+I404
+I250
+I418
+ta(I250
+I418
+I255
+I423
+ta(I255
+I423
+I269
+I428
+ta(I269
+I428
+I275
+I431
+ta(I275
+I431
+I289
+I433
+ta(I289
+I433
+I295
+I434
+ta(I295
+I434
+I300
+I434
+ta(I300
+I434
+I306
+I432
+ta(I306
+I432
+I309
+I429
+ta(I309
+I429
+I313
+I425
+ta(I313
+I425
+I316
+I420
+ta(I316
+I420
+I318
+I415
+ta(I318
+I415
+I319
+I409
+ta(I319
+I409
+I319
+I395
+ta(I319
+I395
+I318
+I389
+ta(I318
+I389
+I316
+I383
+ta(I316
+I383
+I311
+I369
+ta(I311
+I369
+I306
+I355
+ta(I306
+I355
+I292
+I349
+ta(I292
+I349
+I276
+I335
+ta(I276
+I335
+I260
+I329
+ta(I260
+I329
+I242
+I324
+ta(I242
+I324
+I226
+I319
+ta(I226
+I319
+I208
+I315
+ta(I208
+I315
+I190
+I312
+ta(I190
+I312
+I172
+I309
+ta(I172
+I309
+I152
+I306
+ta(I152
+I306
+I134
+I306
+ta(I134
+I306
+I116
+I306
+ta(I116
+I306
+I96
+I307
+ta(I96
+I307
+I76
+I310
+ta(I76
+I310
+I60
+I316
+ta(I60
+I316
+I55
+I321
+ta(I55
+I321
+I50
+I337
+ta(I50
+I337
+I47
+I353
+ta(I47
+I353
+I45
+I369
+ta(I45
+I369
+I45
+I387
+ta(I45
+I387
+I46
+I403
+ta(I46
+I403
+I49
+I409
+ta(I49
+I409
+I54
+I423
+ta(I54
+I423
+I60
+I429
+ta(I60
+I429
+I66
+I432
+ta(I66
+I432
+I84
+I434
+ta(I84
+I434
+I102
+I435
+ta(I102
+I435
+I122
+I436
+ta(I122
+I436
+I142
+I436
+ta(I142
+I436
+I162
+I434
+ta(I162
+I434
+I180
+I431
+ta(I180
+I431
+I194
+I427
+ta(I194
+I427
+I198
+I423
+ta(I198
+I423
+I201
+I417
+ta(I201
+I417
+I201
+I403
+ta(I201
+I403
+I200
+I389
+ta(I200
+I389
+I197
+I383
+ta(I197
+I383
+I192
+I377
+ta(I192
+I377
+I178
+I361
+ta(I178
+I361
+I164
+I347
+ta(I164
+I347
+I148
+I341
+ta(I148
+I341
+I132
+I337
+ta(I132
+I337
+I112
+I331
+ta(I112
+I331
+I96
+I327
+ta(I96
+I327
+I80
+I324
+ta(I80
+I324
+I66
+I322
+ta(I66
+I322
+I50
+I321
+ta(I50
+I321
+I44
+I321
+ta(I44
+I321
+I38
+I321
+ta(I38
+I321
+I33
+I322
+ta(I33
+I322
+I29
+I324
+ta(I29
+I324
+I26
+I328
+ta(I26
+I328
+I23
+I333
+ta(I23
+I333
+I21
+I337
+ta(I21
+I337
+I21
+I351
+ta(I21
+I351
+I21
+I365
+ta(I21
+I365
+I22
+I379
+ta(I22
+I379
+I25
+I393
+ta(I25
+I393
+I28
+I411
+ta(I28
+I411
+I32
+I416
+ta(I32
+I416
+I37
+I421
+ta(I37
+I421
+I40
+I424
+ta(I40
+I424
+I45
+I426
+ta(I45
+I426
+I51
+I428
+ta(I51
+I428
+I57
+I427
+ta(I57
+I427
+I73
+I424
+ta(I73
+I424
+I87
+I419
+ta(I87
+I419
+I93
+I405
+ta(I93
+I405
+I99
+I389
+ta(I99
+I389
+I102
+I373
+ta(I102
+I373
+I104
+I357
+ta(I104
+I357
+I105
+I335
+ta(I105
+I335
+I105
+I319
+ta(I105
+I319
+I103
+I303
+ta(I103
+I303
+I100
+I287
+ta(I100
+I287
+I96
+I273
+ta(I96
+I273
+I91
+I268
+ta(I91
+I268
+I77
+I254
+ta(I77
+I254
+I71
+I251
+ta(I71
+I251
+I66
+I247
+ta(I66
+I247
+I60
+I244
+ta(I60
+I244
+I46
+I241
+ta(I46
+I241
+I42
+I239
+ta(I42
+I239
+I37
+I238
+ta(I37
+I238
+I33
+I238
+ta(I33
+I238
+I28
+I240
+ta(I28
+I240
+I24
+I246
+ta(I24
+I246
+I21
+I252
+ta(I21
+I252
+I19
+I268
+ta(I19
+I268
+I17
+I284
+ta(I17
+I284
+I17
+I302
+ta(I17
+I302
+I17
+I316
+ta(I17
+I316
+I18
+I321
+ta(I18
+I321
+I21
+I326
+ta(I21
+I326
+I25
+I330
+ta(I25
+I330
+I30
+I332
+ta(I30
+I332
+I36
+I333
+ta(I36
+I333
+I52
+I333
+ta(I52
+I333
+I66
+I332
+ta(I66
+I332
+I72
+I328
+ta(I72
+I328
+I88
+I324
+ta(I88
+I324
+I94
+I310
+ta(I94
+I310
+I110
+I304
+ta(I110
+I304
+I113
+I290
+ta(I113
+I290
+I118
+I274
+ta(I118
+I274
+I122
+I256
+ta(I122
+I256
+I124
+I240
+ta(I124
+I240
+I125
+I222
+ta(I125
+I222
+I125
+I208
+ta(I125
+I208
+I125
+I203
+ta(I125
+I203
+I123
+I197
+ta(I123
+I197
+I120
+I183
+ta(I120
+I183
+I116
+I178
+ta(I116
+I178
+I112
+I175
+ta(I112
+I175
+I108
+I170
+ta(I108
+I170
+I103
+I166
+ta(I103
+I166
+I97
+I164
+ta(I97
+I164
+I92
+I162
+ta(I92
+I162
+I89
+I161
+ta(I89
+I161
+I85
+I160
+ta(I85
+I160
+I82
+I160
+ta(I82
+I160
+I80
+I160
+ta(I80
+I160
+I78
+I162
+ta(I78
+I162
+I76
+I165
+ta(I76
+I165
+I74
+I169
+ta(I74
+I169
+I71
+I183
+ta(I71
+I183
+I70
+I188
+ta(I70
+I188
+I67
+I206
+ta(I67
+I206
+I65
+I224
+ta(I65
+I224
+I64
+I240
+ta(I64
+I240
+I63
+I260
+ta(I63
+I260
+I62
+I274
+ta(I62
+I274
+I62
+I288
+ta(I62
+I288
+I62
+I293
+ta(I62
+I293
+I63
+I297
+ta(I63
+I297
+I66
+I300
+ta(I66
+I300
+I68
+I301
+ta(I68
+I301
+I71
+I301
+ta(I71
+I301
+I74
+I301
+ta(I74
+I301
+I77
+I298
+ta(I77
+I298
+I81
+I293
+ta(I81
+I293
+I84
+I287
+ta(I84
+I287
+I87
+I273
+ta(I87
+I273
+I91
+I257
+ta(I91
+I257
+I93
+I239
+ta(I93
+I239
+I95
+I223
+ta(I95
+I223
+I96
+I203
+ta(I96
+I203
+I96
+I187
+ta(I96
+I187
+I96
+I171
+ta(I96
+I171
+I94
+I157
+ta(I94
+I157
+I91
+I152
+ta(I91
+I152
+I88
+I148
+ta(I88
+I148
+I84
+I144
+ta(I84
+I144
+I80
+I142
+ta(I80
+I142
+I75
+I139
+ta(I75
+I139
+I70
+I139
+ta(I70
+I139
+I54
+I139
+ta(I54
+I139
+I48
+I139
+ta(I48
+I139
+I42
+I141
+ta(I42
+I141
+I36
+I144
+ta(I36
+I144
+I32
+I150
+ta(I32
+I150
+I29
+I155
+ta(I29
+I155
+I26
+I161
+ta(I26
+I161
+I23
+I166
+ta(I23
+I166
+I22
+I172
+ta(I22
+I172
+I22
+I177
+ta(I22
+I177
+I21
+I183
+ta(I21
+I183
+I21
+I189
+ta(I21
+I189
+I21
+I194
+ta(I21
+I194
+I23
+I198
+ta(I23
+I198
+I25
+I202
+ta(I25
+I202
+I27
+I206
+ta(I27
+I206
+I30
+I208
+ta(I30
+I208
+I34
+I210
+ta(I34
+I210
+I37
+I211
+ta(I37
+I211
+I40
+I211
+ta(I40
+I211
+I44
+I209
+ta(I44
+I209
+I48
+I206
+ta(I48
+I206
+I52
+I201
+ta(I52
+I201
+I55
+I187
+ta(I55
+I187
+I58
+I181
+ta(I58
+I181
+I61
+I167
+ta(I61
+I167
+I63
+I151
+ta(I63
+I151
+I65
+I137
+ta(I65
+I137
+I65
+I123
+ta(I65
+I123
+I65
+I117
+ta(I65
+I117
+I64
+I112
+ta(I64
+I112
+I62
+I108
+ta(I62
+I108
+I59
+I105
+ta(I59
+I105
+I57
+I103
+ta(I57
+I103
+I54
+I102
+ta(I54
+I102
+I51
+I101
+ta(I51
+I101
+I47
+I101
+ta(I47
+I101
+I43
+I101
+ta(I43
+I101
+I39
+I102
+ta(I39
+I102
+I34
+I104
+ta(I34
+I104
+I29
+I108
+ta(I29
+I108
+I25
+I111
+ta(I25
+I111
+I20
+I116
+ta(I20
+I116
+I16
+I130
+ta(I16
+I130
+I13
+I146
+ta(I13
+I146
+I9
+I162
+ta(I9
+I162
+I7
+I178
+ta(I7
+I178
+I6
+I192
+ta(I6
+I192
+I5
+I198
+ta(I5
+I198
+I5
+I212
+ta(I5
+I212
+I6
+I217
+ta(I6
+I217
+I9
+I223
+ta(I9
+I223
+I13
+I226
+ta(I13
+I226
+I19
+I229
+ta(I19
+I229
+I24
+I231
+ta(I24
+I231
+I30
+I232
+ta(I30
+I232
+I44
+I232
+ta(I44
+I232
+I62
+I231
+ta(I62
+I231
+I76
+I228
+ta(I76
+I228
+I82
+I224
+ta(I82
+I224
+I96
+I219
+ta(I96
+I219
+I110
+I203
+ta(I110
+I203
+I115
+I187
+ta(I115
+I187
+I118
+I171
+ta(I118
+I171
+I120
+I153
+ta(I120
+I153
+I121
+I133
+ta(I121
+I133
+I121
+I115
+ta(I121
+I115
+I119
+I99
+ta(I119
+I99
+I116
+I93
+ta(I116
+I93
+I112
+I89
+ta(I112
+I89
+I108
+I87
+ta(I108
+I87
+I103
+I84
+ta(I103
+I84
+I97
+I83
+ta(I97
+I83
+I83
+I82
+ta(I83
+I82
+I65
+I82
+ta(I65
+I82
+I47
+I82
+ta(I47
+I82
+I29
+I82
+ta(I29
+I82
+I9
+I85
+ta(I9
+I85
+I-9
+I89
+ta(I-9
+I89
+I-15
+I93
+ta(I-15
+I93
+I-18
+I97
+ta(I-18
+I97
+I-21
+I111
+ta(I-21
+I111
+I-22
+I117
+ta(I-22
+I117
+I-23
+I135
+ta(I-23
+I135
+I-23
+I141
+ta(I-23
+I141
+I-22
+I157
+ta(I-22
+I157
+I-19
+I171
+ta(I-19
+I171
+I-15
+I187
+ta(I-15
+I187
+I-1
+I203
+ta(I-1
+I203
+I5
+I217
+ta(I5
+I217
+I21
+I221
+ta(I21
+I221
+I39
+I224
+ta(I39
+I224
+I59
+I228
+ta(I59
+I228
+I81
+I229
+ta(I81
+I229
+I105
+I230
+ta(I105
+I230
+I125
+I230
+ta(I125
+I230
+I145
+I227
+ta(I145
+I227
+I167
+I221
+ta(I167
+I221
+I183
+I207
+ta(I183
+I207
+I189
+I201
+ta(I189
+I201
+I203
+I185
+ta(I203
+I185
+I209
+I169
+ta(I209
+I169
+I212
+I151
+ta(I212
+I151
+I216
+I135
+ta(I216
+I135
+I217
+I121
+ta(I217
+I121
+I217
+I115
+ta(I217
+I115
+I215
+I109
+ta(I215
+I109
+I211
+I105
+ta(I211
+I105
+I197
+I102
+ta(I197
+I102
+I191
+I101
+ta(I191
+I101
+I175
+I99
+ta(I175
+I99
+I157
+I99
+ta(I157
+I99
+I137
+I99
+ta(I137
+I99
+I119
+I99
+ta(I119
+I99
+I101
+I102
+ta(I101
+I102
+I97
+I104
+ta(I97
+I104
+I93
+I107
+ta(I93
+I107
+I91
+I112
+ta(I91
+I112
+I90
+I117
+ta(I90
+I117
+I90
+I131
+ta(I90
+I131
+I91
+I145
+ta(I91
+I145
+I94
+I151
+ta(I94
+I151
+I99
+I169
+ta(I99
+I169
+I113
+I175
+ta(I113
+I175
+I131
+I191
+ta(I131
+I191
+I149
+I197
+ta(I149
+I197
+I169
+I202
+ta(I169
+I202
+I195
+I207
+ta(I195
+I207
+I221
+I209
+ta(I221
+I209
+I247
+I211
+ta(I247
+I211
+I277
+I211
+ta(I277
+I211
+I311
+I210
+ta(I311
+I210
+I339
+I208
+ta(I339
+I208
+I367
+I203
+ta(I367
+I203
+I393
+I187
+ta(I393
+I187
+I413
+I173
+ta(I413
+I173
+I418
+I155
+ta(I418
+I155
+I422
+I135
+ta(I422
+I135
+I423
+I115
+ta(I423
+I115
+I423
+I97
+ta(I423
+I97
+I419
+I77
+ta(I419
+I77
+I414
+I71
+ta(I414
+I71
+I398
+I66
+ta(I398
+I66
+I380
+I61
+ta(I380
+I61
+I362
+I57
+ta(I362
+I57
+I342
+I55
+ta(I342
+I55
+I320
+I53
+ta(I320
+I53
+I296
+I51
+ta(I296
+I51
+I276
+I50
+ta(I276
+I50
+I254
+I50
+ta(I254
+I50
+I234
+I50
+ta(I234
+I50
+I216
+I50
+ta(I216
+I50
+I210
+I52
+ta(I210
+I52
+I206
+I54
+ta(I206
+I54
+I202
+I56
+ta(I202
+I56
+I200
+I60
+ta(I200
+I60
+I200
+I64
+ta(I200
+I64
+I200
+I69
+ta(I200
+I69
+I201
+I75
+ta(I201
+I75
+I204
+I80
+ta(I204
+I80
+I208
+I86
+ta(I208
+I86
+I213
+I100
+ta(I213
+I100
+I219
+I106
+ta(I219
+I106
+I225
+I112
+ta(I225
+I112
+I230
+I116
+ta(I230
+I116
+I244
+I120
+ta(I244
+I120
+I260
+I123
+ta(I260
+I123
+I278
+I126
+ta(I278
+I126
+I284
+I127
+ta(I284
+I127
+I300
+I127
+ta(I300
+I127
+I316
+I125
+ta(I316
+I125
+I322
+I121
+ta(I322
+I121
+I327
+I117
+ta(I327
+I117
+I333
+I101
+ta(I333
+I101
+I335
+I95
+ta(I335
+I95
+I337
+I89
+ta(I337
+I89
+I338
+I75
+ta(I338
+I75
+I337
+I69
+ta(I337
+I69
+I335
+I63
+ta(I335
+I63
+I332
+I59
+ta(I332
+I59
+I328
+I56
+ta(I328
+I56
+I314
+I53
+ta(I314
+I53
+I300
+I52
+ta(I300
+I52
+I286
+I52
+ta(I286
+I52
+I270
+I52
+ta(I270
+I52
+I256
+I54
+ta(I256
+I54
+I240
+I57
+ta(I240
+I57
+I235
+I62
+ta(I235
+I62
+I230
+I67
+ta(I230
+I67
+I226
+I81
+ta(I226
+I81
+I223
+I95
+ta(I223
+I95
+I221
+I111
+ta(I221
+I111
+I219
+I129
+ta(I219
+I129
+I219
+I147
+ta(I219
+I147
+I219
+I163
+ta(I219
+I163
+I221
+I179
+ta(I221
+I179
+I226
+I193
+ta(I226
+I193
+I231
+I207
+ta(I231
+I207
+I237
+I221
+ta(I237
+I221
+I257
+I226
+ta(I257
+I226
+I277
+I231
+ta(I277
+I231
+I295
+I234
+ta(I295
+I234
+I315
+I237
+ta(I315
+I237
+I329
+I238
+ta(I329
+I238
+I335
+I238
+ta(I335
+I238
+I339
+I237
+ta(I339
+I237
+I342
+I235
+ta(I342
+I235
+I344
+I232
+ta(I344
+I232
+I344
+I228
+ta(I344
+I228
+I342
+I223
+ta(I342
+I223
+I338
+I218
+ta(I338
+I218
+I332
+I213
+ta(I332
+I213
+I312
+I209
+ta(I312
+I209
+I292
+I205
+ta(I292
+I205
+I272
+I204
+ta(I272
+I204
+I252
+I204
+ta(I252
+I204
+I234
+I205
+ta(I234
+I205
+I218
+I208
+ta(I218
+I208
+I202
+I212
+ta(I202
+I212
+I198
+I218
+ta(I198
+I218
+I195
+I224
+ta(I195
+I224
+I194
+I229
+ta(I194
+I229
+I194
+I235
+ta(I194
+I235
+I196
+I249
+ta(I196
+I249
+I201
+I254
+ta(I201
+I254
+I215
+I268
+ta(I215
+I268
+I231
+I273
+ta(I231
+I273
+I249
+I278
+ta(I249
+I278
+I269
+I284
+ta(I269
+I284
+I289
+I289
+ta(I289
+I289
+I309
+I295
+ta(I309
+I295
+I325
+I300
+ta(I325
+I300
+I341
+I306
+ta(I341
+I306
+I357
+I309
+ta(I357
+I309
+I371
+I313
+ta(I371
+I313
+I374
+I317
+ta(I374
+I317
+I377
+I319
+ta(I377
+I319
+I380
+I321
+ta(I380
+I321
+I382
+I322
+ta(I382
+I322
+I382
+I323
+ta(I382
+I323
+I383
+I323
+ta(I383
+I323
+I384
+I322
+ta(I384
+I322
+I385
+I322
+ta(I385
+I322
+I386
+I321
+ta(I386
+I321
+I387
+I321
+ta(I387
+I321
+I388
+I320
+ta(I388
+I320
+I389
+I320
+ta(I389
+I320
+I390
+I319
+ta(I390
+I319
+I391
+I319
+ta(I391
+I319
+I392
+I318
+ta(I392
+I318
+I393
+I318
+ta(I393
+I318
+I395
+I318
+ta(I395
+I318
+I397
+I318
+ta(I397
+I318
+I399
+I320
+ta(I399
+I320
+I400
+I323
+ta(I400
+I323
+I403
+I326
+ta(I403
+I326
+I405
+I331
+ta(I405
+I331
+I407
+I337
+ta(I407
+I337
+I409
+I342
+ta(I409
+I342
+I413
+I347
+ta(I413
+I347
+I417
+I351
+ta(I417
+I351
+I420
+I354
+ta(I420
+I354
+I423
+I357
+ta(I423
+I357
+I426
+I359
+ta(I426
+I359
+I427
+I360
+ta(I427
+I360
+I425
+I357
+ta(I425
+I357
+I419
+I351
+ta(I419
+I351
+I403
+I346
+ta(I403
+I346
+I387
+I341
+ta(I387
+I341
+I367
+I337
+ta(I367
+I337
+I349
+I334
+ta(I349
+I334
+I331
+I333
+ta(I331
+I333
+I315
+I332
+ta(I315
+I332
+I299
+I333
+ta(I299
+I333
+I283
+I336
+ta(I283
+I336
+I267
+I340
+ta(I267
+I340
+I253
+I343
+ta(I253
+I343
+I239
+I349
+ta(I239
+I349
+I235
+I353
+ta(I235
+I353
+I232
+I359
+ta(I232
+I359
+I231
+I363
+ta(I231
+I363
+I231
+I369
+ta(I231
+I369
+I232
+I374
+ta(I232
+I374
+I235
+I379
+ta(I235
+I379
+I241
+I385
+ta(I241
+I385
+I246
+I399
+ta(I246
+I399
+I252
+I404
+ta(I252
+I404
+I266
+I410
+ta(I266
+I410
+I280
+I414
+ta(I280
+I414
+I298
+I418
+ta(I298
+I418
+I312
+I420
+ta(I312
+I420
+I328
+I421
+ta(I328
+I421
+I344
+I420
+ta(I344
+I420
+I349
+I418
+ta(I349
+I418
+I355
+I414
+ta(I355
+I414
+I360
+I409
+ta(I360
+I409
+I361
+I403
+ta(I361
+I403
+I362
+I398
+ta(I362
+I398
+I363
+I382
+ta(I363
+I382
+I361
+I368
+ta(I361
+I368
+I358
+I352
+ta(I358
+I352
+I342
+I334
+ta(I342
+I334
+I326
+I320
+ta(I326
+I320
+I310
+I314
+ta(I310
+I314
+I288
+I309
+ta(I288
+I309
+I266
+I306
+ta(I266
+I306
+I244
+I304
+ta(I244
+I304
+I222
+I303
+ta(I222
+I303
+I200
+I304
+ta(I200
+I304
+I182
+I309
+ta(I182
+I309
+I176
+I313
+ta(I176
+I313
+I171
+I319
+ta(I171
+I319
+I167
+I335
+ta(I167
+I335
+I165
+I349
+ta(I165
+I349
+I165
+I367
+ta(I165
+I367
+I165
+I383
+ta(I165
+I383
+I167
+I397
+ta(I167
+I397
+I170
+I411
+ta(I170
+I411
+I175
+I417
+ta(I175
+I417
+I189
+I423
+ta(I189
+I423
+I207
+I426
+ta(I207
+I426
+I223
+I430
+ta(I223
+I430
+I239
+I433
+ta(I239
+I433
+I253
+I434
+ta(I253
+I434
+I259
+I435
+ta(I259
+I435
+I265
+I435
+ta(I265
+I435
+I268
+I435
+ta(I268
+I435
+I271
+I433
+ta(I271
+I433
+I273
+I430
+ta(I273
+I430
+I274
+I427
+ta(I274
+I427
+I274
+I423
+ta(I274
+I423
+I271
+I419
+ta(I271
+I419
+I268
+I415
+ta(I268
+I415
+I263
+I410
+ta(I263
+I410
+I245
+I404
+ta(I245
+I404
+I229
+I399
+ta(I229
+I399
+I213
+I395
+ta(I213
+I395
+I195
+I392
+ta(I195
+I392
+I179
+I389
+ta(I179
+I389
+I163
+I388
+ta(I163
+I388
+I147
+I388
+ta(I147
+I388
+I131
+I389
+ta(I131
+I389
+I125
+I391
+ta(I125
+I391
+I111
+I397
+ta(I111
+I397
+I106
+I403
+ta(I106
+I403
+I103
+I419
+ta(I103
+I419
+I99
+I437
+ta(I99
+I437
+I98
+I455
+ta(I98
+I455
+I98
+I473
+ta(I98
+I473
+I98
+I487
+ta(I98
+I487
+I101
+I503
+ta(I101
+I503
+I105
+I517
+ta(I105
+I517
+I110
+I521
+ta(I110
+I521
+I114
+I525
+ta(I114
+I525
+I120
+I528
+ta(I120
+I528
+I126
+I531
+ta(I126
+I531
+I132
+I534
+ta(I132
+I534
+I146
+I536
+ta(I146
+I536
+I162
+I536
+ta(I162
+I536
+I176
+I536
+ta(I176
+I536
+I190
+I535
+ta(I190
+I535
+I204
+I533
+ta(I204
+I533
+I210
+I529
+ta(I210
+I529
+I215
+I525
+ta(I215
+I525
+I217
+I522
+ta(I217
+I522
+I219
+I518
+ta(I219
+I518
+I219
+I513
+ta(I219
+I513
+I218
+I509
+ta(I218
+I509
+I214
+I505
+ta(I214
+I505
+I209
+I500
+ta(I209
+I500
+I193
+I495
+ta(I193
+I495
+I177
+I491
+ta(I177
+I491
+I161
+I488
+ta(I161
+I488
+I145
+I486
+ta(I145
+I486
+I131
+I483
+ta(I131
+I483
+I125
+I481
+ta(I125
+I481
+I120
+I479
+ta(I120
+I479
+I115
+I478
+ta(I115
+I478
+I110
+I477
+ta(I110
+I477
+I106
+I477
+ta(I106
+I477
+I103
+I477
+ta(I103
+I477
+I101
+I478
+ta(I101
+I478
+I98
+I480
+ta(I98
+I480
+I97
+I483
+ta(I97
+I483
+I95
+I487
+ta(I95
+I487
+I94
+I491
+ta(I94
+I491
+I93
+I497
+ta(I93
+I497
+I93
+I502
+ta(I93
+I502
+I93
+I508
+ta(I93
+I508
+I94
+I514
+ta(I94
+I514
+I96
+I520
+ta(I96
+I520
+I99
+I526
+ta(I99
+I526
+I103
+I530
+ta(I103
+I530
+I107
+I534
+ta(I107
+I534
+I113
+I537
+ta(I113
+I537
+I117
+I539
+ta(I117
+I539
+I131
+I540
+ta(I131
+I540
+I145
+I540
+ta(I145
+I540
+I161
+I539
+ta(I161
+I539
+I175
+I536
+ta(I175
+I536
+I181
+I533
+ta(I181
+I533
+I199
+I528
+ta(I199
+I528
+I203
+I523
+ta(I203
+I523
+I208
+I509
+ta(I208
+I509
+I211
+I504
+ta(I211
+I504
+I211
+I498
+ta(I211
+I498
+I211
+I484
+ta(I211
+I484
+I209
+I470
+ta(I209
+I470
+I204
+I456
+ta(I204
+I456
+I188
+I440
+ta(I188
+I440
+I174
+I434
+ta(I174
+I434
+I158
+I429
+ta(I158
+I429
+I142
+I425
+ta(I142
+I425
+I136
+I421
+ta(I136
+I421
+I131
+I418
+ta(I131
+I418
+I127
+I417
+ta(I127
+I417
+I125
+I417
+ta(I125
+I417
+I123
+I418
+ta(I123
+I418
+I123
+I421
+ta(I123
+I421
+I123
+I426
+ta(I123
+I426
+I124
+I432
+ta(I124
+I432
+I126
+I438
+ta(I126
+I438
+I130
+I452
+ta(I130
+I452
+I134
+I466
+ta(I134
+I466
+I140
+I484
+ta(I140
+I484
+I146
+I500
+ta(I146
+I500
+I152
+I514
+ta(I152
+I514
+I166
+I519
+ta(I166
+I519
+I186
+I525
+ta(I186
+I525
+I202
+I528
+ta(I202
+I528
+I222
+I531
+ta(I222
+I531
+I242
+I533
+ta(I242
+I533
+I266
+I534
+ta(I266
+I534
+I286
+I534
+ta(I286
+I534
+I306
+I532
+ta(I306
+I532
+I326
+I529
+ta(I326
+I529
+I340
+I525
+ta(I340
+I525
+I345
+I520
+ta(I345
+I520
+I351
+I514
+ta(I351
+I514
+I355
+I498
+ta(I355
+I498
+I359
+I482
+ta(I359
+I482
+I362
+I466
+ta(I362
+I466
+I363
+I448
+ta(I363
+I448
+I363
+I434
+ta(I363
+I434
+I361
+I418
+ta(I361
+I418
+I357
+I404
+ta(I357
+I404
+I343
+I398
+ta(I343
+I398
+I337
+I392
+ta(I337
+I392
+I323
+I389
+ta(I323
+I389
+I317
+I386
+ta(I317
+I386
+I303
+I385
+ta(I303
+I385
+I297
+I385
+ta(I297
+I385
+I294
+I388
+ta(I294
+I388
+I291
+I392
+ta(I291
+I392
+I289
+I398
+ta(I289
+I398
+I288
+I414
+ta(I288
+I414
+I288
+I420
+ta(I288
+I420
+I290
+I440
+ta(I290
+I440
+I292
+I456
+ta(I292
+I456
+I297
+I472
+ta(I297
+I472
+I303
+I488
+ta(I303
+I488
+I309
+I493
+ta(I309
+I493
+I329
+I499
+ta(I329
+I499
+I347
+I502
+ta(I347
+I502
+I367
+I505
+ta(I367
+I505
+I393
+I506
+ta(I393
+I506
+I409
+I507
+ta(I409
+I507
+I433
+I507
+ta(I433
+I507
+I457
+I505
+ta(I457
+I505
+I475
+I501
+ta(I475
+I501
+I478
+I501
+ta(I478
+I501
+I478
+I500
+ta(I478
+I500
+I492
+I495
+ta(I492
+I495
+I495
+I490
+ta(I495
+I490
+I498
+I476
+ta(I498
+I476
+I499
+I473
+ta(I499
+I473
+I499
+I467
+ta(I499
+I467
+I497
+I451
+ta(I497
+I451
+I494
+I437
+ta(I494
+I437
+I490
+I431
+ta(I490
+I431
+I485
+I426
+ta(I485
+I426
+I471
+I412
+ta(I471
+I412
+I466
+I409
+ta(I466
+I409
+I460
+I405
+ta(I460
+I405
+I454
+I403
+ta(I454
+I403
+I449
+I402
+ta(I449
+I402
+I445
+I402
+ta(I445
+I402
+I429
+I404
+ta(I429
+I404
+I425
+I410
+ta(I425
+I410
+I421
+I415
+ta(I421
+I415
+I417
+I433
+ta(I417
+I433
+I415
+I449
+ta(I415
+I449
+I414
+I465
+ta(I414
+I465
+I414
+I481
+ta(I414
+I481
+I414
+I487
+ta(I414
+I487
+I417
+I501
+ta(I417
+I501
+I420
+I517
+ta(I420
+I517
+I422
+I519
+ta(I422
+I519
+I427
+I524
+ta(I427
+I524
+I430
+I525
+ta(I430
+I525
+I436
+I529
+ta(I436
+I529
+I452
+I533
+ta(I452
+I533
+I470
+I535
+ta(I470
+I535
+I488
+I536
+ta(I488
+I536
+I494
+I536
+ta(I494
+I536
+I495
+I536
+ta(I495
+I536
+I495
+I535
+ta(I495
+I535
+I499
+I519
+ta(I499
+I519
+I499
+I513
+ta(I499
+I513
+I499
+I512
+ta(I499
+I512
+I499
+I511
+ta(I499
+I511
+I485
+I505
+ta(I485
+I505
+I481
+I503
+ta(I481
+I503
+I479
+I502
+ta(I479
+I502
+I463
+I499
+ta(I463
+I499
+I447
+I498
+ta(I447
+I498
+I441
+I498
+ta(I441
+I498
+I427
+I498
+ta(I427
+I498
+I422
+I500
+ta(I422
+I500
+I417
+I506
+ta(I417
+I506
+I414
+I510
+ta(I414
+I510
+I412
+I516
+ta(I412
+I516
+I411
+I532
+ta(I411
+I532
+I411
+I538
+ta(I411
+I538
+I413
+I552
+ta(I413
+I552
+I417
+I557
+ta(I417
+I557
+I422
+I562
+ta(I422
+I562
+I425
+I564
+ta(I425
+I564
+I426
+I566
+ta(I426
+I566
+I444
+I569
+ta(I444
+I569
+I464
+I572
+ta(I464
+I572
+I469
+I573
+ta(I469
+I573
+I472
+I568
+ta(I472
+I568
+I473
+I554
+ta(I473
+I554
+I474
+I553
+ta(I474
+I553
+I474
+I551
+ta(I474
+I551
+I476
+I565
+ta(I476
+I565
+I475
+I563
+ta(I475
+I563
+I459
+I560
+ta(I459
+I560
+I455
+I558
+ta(I455
+I558
+I453
+I558
+ta(I453
+I558
+I431
+I557
+ta(I431
+I557
+I417
+I557
+ta(I417
+I557
+I411
+I558
+ta(I411
+I558
+I407
+I562
+ta(I407
+I562
+I403
+I566
+ta(I403
+I566
+I401
+I571
+ta(I401
+I571
+I400
+I576
+ta(I400
+I576
+I401
+I582
+ta(I401
+I582
+I403
+I588
+ta(I403
+I588
+I406
+I604
+ta(I406
+I604
+I422
+I610
+ta(I422
+I610
+I428
+I616
+ta(I428
+I616
+I442
+I616
+ta(I442
+I616
+I466
+I614
+ta(I466
+I614
+I468
+I614
+ta(I468
+I614
+I465
+I610
+ta(I465
+I610
+I464
+I607
+ta(I464
+I607
+I464
+I603
+ta(I464
+I603
+I466
+I589
+ta(I466
+I589
+I468
+I573
+ta(I468
+I573
+I470
+I555
+ta(I470
+I555
+I472
+I533
+ta(I472
+I533
+I473
+I509
+ta(I473
+I509
+I473
+I483
+ta(I473
+I483
+I473
+I459
+ta(I473
+I459
+I471
+I435
+ta(I471
+I435
+I471
+I419
+ta(I471
+I419
+I472
+I413
+ta(I472
+I413
+I476
+I408
+ta(I476
+I408
+I482
+I405
+ta(I482
+I405
+I488
+I404
+ta(I488
+I404
+I504
+I404
+ta(I504
+I404
+I522
+I404
+ta(I522
+I404
+I542
+I406
+ta(I542
+I406
+I562
+I409
+ta(I562
+I409
+I584
+I412
+ta(I584
+I412
+I604
+I416
+ta(I604
+I416
+I622
+I421
+ta(I622
+I421
+I638
+I427
+ta(I638
+I427
+I644
+I433
+ta(I644
+I433
+I650
+I439
+ta(I650
+I439
+I655
+I453
+ta(I655
+I453
+I657
+I467
+ta(I657
+I467
+I659
+I473
+ta(I659
+I473
+I659
+I479
+ta(I659
+I479
+I656
+I483
+ta(I656
+I483
+I650
+I488
+ta(I650
+I488
+I636
+I490
+ta(I636
+I490
+I618
+I492
+ta(I618
+I492
+I596
+I493
+ta(I596
+I493
+I576
+I493
+ta(I576
+I493
+I558
+I492
+ta(I558
+I492
+I542
+I489
+ta(I542
+I489
+I538
+I485
+ta(I538
+I485
+I536
+I481
+ta(I536
+I481
+I534
+I475
+ta(I534
+I475
+I533
+I459
+ta(I533
+I459
+I533
+I443
+ta(I533
+I443
+I534
+I425
+ta(I534
+I425
+I537
+I409
+ta(I537
+I409
+I542
+I393
+ta(I542
+I393
+I556
+I379
+ta(I556
+I379
+I574
+I365
+ta(I574
+I365
+I590
+I361
+ta(I590
+I361
+I606
+I358
+ta(I606
+I358
+I624
+I356
+ta(I624
+I356
+I640
+I355
+ta(I640
+I355
+I656
+I356
+ta(I656
+I356
+I670
+I359
+ta(I670
+I359
+I684
+I365
+ta(I684
+I365
+I698
+I371
+ta(I698
+I371
+I714
+I391
+ta(I714
+I391
+I718
+I405
+ta(I718
+I405
+I723
+I425
+ta(I723
+I425
+I727
+I449
+ta(I727
+I449
+I730
+I469
+ta(I730
+I469
+I730
+I489
+ta(I730
+I489
+I730
+I507
+ta(I730
+I507
+I727
+I523
+ta(I727
+I523
+I722
+I537
+ta(I722
+I537
+I704
+I542
+ta(I704
+I542
+I686
+I546
+ta(I686
+I546
+I666
+I548
+ta(I666
+I548
+I644
+I548
+ta(I644
+I548
+I624
+I548
+ta(I624
+I548
+I602
+I546
+ta(I602
+I546
+I582
+I543
+ta(I582
+I543
+I566
+I539
+ta(I566
+I539
+I550
+I525
+ta(I550
+I525
+I545
+I519
+ta(I545
+I519
+I542
+I513
+ta(I542
+I513
+I539
+I495
+ta(I539
+I495
+I537
+I479
+ta(I537
+I479
+I537
+I463
+ta(I537
+I463
+I539
+I445
+ta(I539
+I445
+I542
+I429
+ta(I542
+I429
+I548
+I423
+ta(I548
+I423
+I566
+I417
+ta(I566
+I417
+I582
+I414
+ta(I582
+I414
+I602
+I411
+ta(I602
+I411
+I624
+I411
+ta(I624
+I411
+I644
+I412
+ta(I644
+I412
+I664
+I416
+ta(I664
+I416
+I682
+I420
+ta(I682
+I420
+I688
+I434
+ta(I688
+I434
+I693
+I440
+ta(I693
+I440
+I696
+I456
+ta(I696
+I456
+I699
+I474
+ta(I699
+I474
+I701
+I490
+ta(I701
+I490
+I701
+I506
+ta(I701
+I506
+I701
+I512
+ta(I701
+I512
+I698
+I518
+ta(I698
+I518
+I695
+I524
+ta(I695
+I524
+I690
+I529
+ta(I690
+I529
+I684
+I532
+ta(I684
+I532
+I680
+I535
+ta(I680
+I535
+I666
+I536
+ta(I666
+I536
+I660
+I536
+ta(I660
+I536
+I646
+I535
+ta(I646
+I535
+I640
+I531
+ta(I640
+I531
+I635
+I526
+ta(I635
+I526
+I621
+I510
+ta(I621
+I510
+I618
+I494
+ta(I618
+I494
+I615
+I478
+ta(I615
+I478
+I612
+I458
+ta(I612
+I458
+I612
+I438
+ta(I612
+I438
+I612
+I416
+ta(I612
+I416
+I613
+I392
+ta(I613
+I392
+I615
+I370
+ta(I615
+I370
+I618
+I350
+ta(I618
+I350
+I632
+I328
+ta(I632
+I328
+I646
+I312
+ta(I646
+I312
+I651
+I306
+ta(I651
+I306
+I669
+I302
+ta(I669
+I302
+I674
+I299
+ta(I674
+I299
+I692
+I299
+ta(I692
+I299
+I697
+I300
+ta(I697
+I300
+I701
+I302
+ta(I701
+I302
+I705
+I307
+ta(I705
+I307
+I709
+I311
+ta(I709
+I311
+I711
+I317
+ta(I711
+I317
+I714
+I323
+ta(I714
+I323
+I714
+I329
+ta(I714
+I329
+I714
+I343
+ta(I714
+I343
+I714
+I349
+ta(I714
+I349
+I711
+I355
+ta(I711
+I355
+I707
+I360
+ta(I707
+I360
+I702
+I363
+ta(I702
+I363
+I697
+I366
+ta(I697
+I366
+I683
+I367
+ta(I683
+I367
+I669
+I368
+ta(I669
+I368
+I655
+I366
+ta(I655
+I366
+I639
+I363
+ta(I639
+I363
+I623
+I359
+ta(I623
+I359
+I609
+I354
+ta(I609
+I354
+I603
+I340
+ta(I603
+I340
+I597
+I324
+ta(I597
+I324
+I595
+I310
+ta(I595
+I310
+I592
+I292
+ta(I592
+I292
+I590
+I272
+ta(I590
+I272
+I590
+I252
+ta(I590
+I252
+I590
+I234
+ta(I590
+I234
+I591
+I214
+ta(I591
+I214
+I594
+I198
+ta(I594
+I198
+I598
+I182
+ta(I598
+I182
+I602
+I176
+ta(I602
+I176
+I616
+I171
+ta(I616
+I171
+I621
+I167
+ta(I621
+I167
+I627
+I165
+ta(I627
+I165
+I633
+I164
+ta(I633
+I164
+I636
+I164
+ta(I636
+I164
+I640
+I168
+ta(I640
+I168
+I642
+I173
+ta(I642
+I173
+I644
+I187
+ta(I644
+I187
+I644
+I193
+ta(I644
+I193
+I644
+I211
+ta(I644
+I211
+I642
+I227
+ta(I642
+I227
+I637
+I243
+ta(I637
+I243
+I633
+I257
+ta(I633
+I257
+I628
+I271
+ta(I628
+I271
+I623
+I287
+ta(I623
+I287
+I618
+I291
+ta(I618
+I291
+I613
+I296
+ta(I613
+I296
+I607
+I299
+ta(I607
+I299
+I601
+I301
+ta(I601
+I301
+I597
+I302
+ta(I597
+I302
+I591
+I302
+ta(I591
+I302
+I585
+I298
+ta(I585
+I298
+I579
+I294
+ta(I579
+I294
+I573
+I289
+ta(I573
+I289
+I568
+I275
+ta(I568
+I275
+I563
+I259
+ta(I563
+I259
+I560
+I243
+ta(I560
+I243
+I558
+I227
+ta(I558
+I227
+I557
+I211
+ta(I557
+I211
+I558
+I193
+ta(I558
+I193
+I561
+I177
+ta(I561
+I177
+I565
+I161
+ta(I565
+I161
+I579
+I147
+ta(I579
+I147
+I585
+I142
+ta(I585
+I142
+I603
+I138
+ta(I603
+I138
+I617
+I135
+ta(I617
+I135
+I633
+I134
+ta(I633
+I134
+I639
+I134
+ta(I639
+I134
+I653
+I136
+ta(I653
+I136
+I658
+I139
+ta(I658
+I139
+I662
+I145
+ta(I662
+I145
+I666
+I151
+ta(I666
+I151
+I669
+I165
+ta(I669
+I165
+I670
+I171
+ta(I670
+I171
+I670
+I189
+ta(I670
+I189
+I670
+I205
+ta(I670
+I205
+I667
+I221
+ta(I667
+I221
+I663
+I227
+ta(I663
+I227
+I657
+I243
+ta(I657
+I243
+I652
+I249
+ta(I652
+I249
+I636
+I254
+ta(I636
+I254
+I618
+I257
+ta(I618
+I257
+I600
+I259
+ta(I600
+I259
+I580
+I260
+ta(I580
+I260
+I560
+I260
+ta(I560
+I260
+I538
+I256
+ta(I538
+I256
+I520
+I252
+ta(I520
+I252
+I504
+I248
+ta(I504
+I248
+I490
+I234
+ta(I490
+I234
+I487
+I229
+ta(I487
+I229
+I484
+I224
+ta(I484
+I224
+I482
+I210
+ta(I482
+I210
+I481
+I204
+ta(I481
+I204
+I481
+I198
+ta(I481
+I198
+I481
+I193
+ta(I481
+I193
+I485
+I188
+ta(I485
+I188
+I489
+I184
+ta(I489
+I184
+I503
+I181
+ta(I503
+I181
+I519
+I180
+ta(I519
+I180
+I539
+I179
+ta(I539
+I179
+I557
+I181
+ta(I557
+I181
+I579
+I185
+ta(I579
+I185
+I599
+I189
+ta(I599
+I189
+I617
+I195
+ta(I617
+I195
+I623
+I201
+ta(I623
+I201
+I628
+I207
+ta(I628
+I207
+I631
+I223
+ta(I631
+I223
+I632
+I239
+ta(I632
+I239
+I632
+I257
+ta(I632
+I257
+I629
+I275
+ta(I629
+I275
+I625
+I295
+ta(I625
+I295
+I609
+I315
+ta(I609
+I315
+I595
+I333
+ta(I595
+I333
+I577
+I351
+ta(I577
+I351
+I561
+I365
+ta(I561
+I365
+I541
+I370
+ta(I541
+I370
+I523
+I374
+ta(I523
+I374
+I505
+I376
+ta(I505
+I376
+I481
+I378
+ta(I481
+I378
+I461
+I378
+ta(I461
+I378
+I441
+I377
+ta(I441
+I377
+I423
+I374
+ta(I423
+I374
+I409
+I369
+ta(I409
+I369
+I404
+I364
+ta(I404
+I364
+I400
+I358
+ta(I400
+I358
+I398
+I344
+ta(I398
+I344
+I397
+I330
+ta(I397
+I330
+I397
+I316
+ta(I397
+I316
+I398
+I300
+ta(I398
+I300
+I402
+I294
+ta(I402
+I294
+I408
+I290
+ta(I408
+I290
+I414
+I285
+ta(I414
+I285
+I428
+I281
+ta(I428
+I281
+I442
+I278
+ta(I442
+I278
+I458
+I276
+ta(I458
+I276
+I472
+I275
+ta(I472
+I275
+I477
+I275
+ta(I477
+I275
+I483
+I278
+ta(I483
+I278
+I488
+I283
+ta(I488
+I283
+I492
+I288
+ta(I492
+I288
+I495
+I304
+ta(I495
+I304
+I497
+I310
+ta(I497
+I310
+I497
+I326
+ta(I497
+I326
+I498
+I342
+ta(I498
+I342
+I498
+I358
+ta(I498
+I358
+I496
+I374
+ta(I496
+I374
+I494
+I379
+ta(I494
+I379
+I490
+I393
+ta(I490
+I393
+I485
+I397
+ta(I485
+I397
+I480
+I401
+ta(I480
+I401
+I466
+I404
+ta(I466
+I404
+I450
+I405
+ta(I450
+I405
+I434
+I405
+ta(I434
+I405
+I416
+I403
+ta(I416
+I403
+I396
+I399
+ta(I396
+I399
+I380
+I394
+ta(I380
+I394
+I364
+I380
+ta(I364
+I380
+I350
+I364
+ta(I350
+I364
+I345
+I350
+ta(I345
+I350
+I340
+I332
+ta(I340
+I332
+I335
+I314
+ta(I335
+I314
+I332
+I294
+ta(I332
+I294
+I330
+I274
+ta(I330
+I274
+I329
+I254
+ta(I329
+I254
+I329
+I236
+ta(I329
+I236
+I334
+I220
+ta(I334
+I220
+I339
+I206
+ta(I339
+I206
+I355
+I201
+ta(I355
+I201
+I369
+I197
+ta(I369
+I197
+I385
+I195
+ta(I385
+I195
+I407
+I192
+ta(I407
+I192
+I427
+I192
+ta(I427
+I192
+I449
+I193
+ta(I449
+I193
+I469
+I197
+ta(I469
+I197
+I489
+I211
+ta(I489
+I211
+I503
+I225
+ta(I503
+I225
+I506
+I241
+ta(I506
+I241
+I510
+I263
+ta(I510
+I263
+I511
+I281
+ta(I511
+I281
+I511
+I299
+ta(I511
+I299
+I509
+I319
+ta(I509
+I319
+I506
+I339
+ta(I506
+I339
+I492
+I353
+ta(I492
+I353
+I478
+I359
+ta(I478
+I359
+I464
+I363
+ta(I464
+I363
+I450
+I365
+ta(I450
+I365
+I430
+I367
+ta(I430
+I367
+I410
+I367
+ta(I410
+I367
+I386
+I365
+ta(I386
+I365
+I360
+I361
+ta(I360
+I361
+I336
+I355
+ta(I336
+I355
+I312
+I341
+ta(I312
+I341
+I296
+I335
+ta(I296
+I335
+I278
+I315
+ta(I278
+I315
+I274
+I299
+ta(I274
+I299
+I270
+I279
+ta(I270
+I279
+I268
+I261
+ta(I268
+I261
+I268
+I243
+ta(I268
+I243
+I270
+I225
+ta(I270
+I225
+I275
+I211
+ta(I275
+I211
+I289
+I195
+ta(I289
+I195
+I307
+I190
+ta(I307
+I190
+I327
+I184
+ta(I327
+I184
+I351
+I180
+ta(I351
+I180
+I373
+I177
+ta(I373
+I177
+I395
+I176
+ta(I395
+I176
+I419
+I176
+ta(I419
+I176
+I437
+I177
+ta(I437
+I177
+I453
+I180
+ta(I453
+I180
+I457
+I185
+ta(I457
+I185
+I460
+I191
+ta(I460
+I191
+I461
+I205
+ta(I461
+I205
+I461
+I221
+ta(I461
+I221
+I458
+I243
+ta(I458
+I243
+I454
+I261
+ta(I454
+I261
+I448
+I281
+ta(I448
+I281
+I434
+I299
+ta(I434
+I299
+I418
+I317
+ta(I418
+I317
+I412
+I322
+ta(I412
+I322
+I406
+I328
+ta(I406
+I328
+I400
+I331
+ta(I400
+I331
+I386
+I333
+ta(I386
+I333
+I381
+I333
+ta(I381
+I333
+I376
+I331
+ta(I376
+I331
+I362
+I327
+ta(I362
+I327
+I346
+I311
+ta(I346
+I311
+I342
+I297
+ta(I342
+I297
+I336
+I279
+ta(I336
+I279
+I332
+I263
+ta(I332
+I263
+I329
+I245
+ta(I329
+I245
+I327
+I240
+ta(I327
+I240
+I326
+I236
+ta(I326
+I236
+I325
+I232
+ta(I325
+I232
+I324
+I229
+ta(I324
+I229
+I324
+I228
+ta(I324
+I228
+I323
+I227
+tatp4
+a(S'Green'
+p5
+I1
+(lp6
+(I100
+I31
+I101
+I31
+ta(I101
+I31
+I106
+I30
+ta(I106
+I30
+I120
+I30
+ta(I120
+I30
+I136
+I29
+ta(I136
+I29
+I156
+I29
+ta(I156
+I29
+I176
+I29
+ta(I176
+I29
+I200
+I29
+ta(I200
+I29
+I222
+I29
+ta(I222
+I29
+I244
+I29
+ta(I244
+I29
+I266
+I31
+ta(I266
+I31
+I284
+I32
+ta(I284
+I32
+I300
+I32
+ta(I300
+I32
+I305
+I33
+ta(I305
+I33
+I307
+I33
+ta(I307
+I33
+I307
+I34
+ta(I307
+I34
+I305
+I34
+ta(I305
+I34
+I287
+I34
+ta(I287
+I34
+I267
+I34
+ta(I267
+I34
+I243
+I34
+ta(I243
+I34
+I211
+I36
+ta(I211
+I36
+I183
+I37
+ta(I183
+I37
+I157
+I38
+ta(I157
+I38
+I131
+I40
+ta(I131
+I40
+I109
+I42
+ta(I109
+I42
+I89
+I43
+ta(I89
+I43
+I71
+I44
+ta(I71
+I44
+I65
+I45
+ta(I65
+I45
+I61
+I47
+ta(I61
+I47
+I59
+I48
+ta(I59
+I48
+I58
+I49
+ta(I58
+I49
+I58
+I50
+ta(I58
+I50
+I60
+I52
+ta(I60
+I52
+I64
+I53
+ta(I64
+I53
+I69
+I54
+ta(I69
+I54
+I87
+I54
+ta(I87
+I54
+I103
+I54
+ta(I103
+I54
+I123
+I54
+ta(I123
+I54
+I149
+I54
+ta(I149
+I54
+I173
+I54
+ta(I173
+I54
+I197
+I53
+ta(I197
+I53
+I219
+I52
+ta(I219
+I52
+I239
+I51
+ta(I239
+I51
+I245
+I50
+ta(I245
+I50
+I249
+I49
+ta(I249
+I49
+I247
+I49
+ta(I247
+I49
+I223
+I49
+ta(I223
+I49
+I201
+I49
+ta(I201
+I49
+I179
+I49
+ta(I179
+I49
+I155
+I51
+ta(I155
+I51
+I131
+I53
+ta(I131
+I53
+I107
+I54
+ta(I107
+I54
+I89
+I56
+ta(I89
+I56
+I71
+I58
+ta(I71
+I58
+I57
+I60
+ta(I57
+I60
+I53
+I62
+ta(I53
+I62
+I51
+I63
+ta(I51
+I63
+I51
+I64
+ta(I51
+I64
+I51
+I65
+ta(I51
+I65
+I52
+I66
+ta(I52
+I66
+I55
+I67
+ta(I55
+I67
+I61
+I67
+ta(I61
+I67
+I67
+I68
+ta(I67
+I68
+I83
+I69
+ta(I83
+I69
+I103
+I70
+ta(I103
+I70
+I125
+I70
+ta(I125
+I70
+I149
+I70
+ta(I149
+I70
+I177
+I70
+ta(I177
+I70
+I205
+I70
+ta(I205
+I70
+I229
+I70
+ta(I229
+I70
+I253
+I70
+ta(I253
+I70
+I257
+I70
+ta(I257
+I70
+I258
+I70
+ta(I258
+I70
+I255
+I70
+ta(I255
+I70
+I237
+I71
+ta(I237
+I71
+I217
+I73
+ta(I217
+I73
+I195
+I74
+ta(I195
+I74
+I165
+I76
+ta(I165
+I76
+I139
+I78
+ta(I139
+I78
+I111
+I79
+ta(I111
+I79
+I83
+I81
+ta(I83
+I81
+I57
+I84
+ta(I57
+I84
+I39
+I86
+ta(I39
+I86
+I25
+I87
+ta(I25
+I87
+I24
+I88
+ta(I24
+I88
+I24
+I89
+ta(I24
+I89
+I25
+I90
+ta(I25
+I90
+I30
+I91
+ta(I30
+I91
+I46
+I92
+ta(I46
+I92
+I66
+I93
+ta(I66
+I93
+I92
+I94
+ta(I92
+I94
+I118
+I94
+ta(I118
+I94
+I148
+I94
+ta(I148
+I94
+I178
+I94
+ta(I178
+I94
+I206
+I94
+ta(I206
+I94
+I230
+I95
+ta(I230
+I95
+I246
+I96
+ta(I246
+I96
+I250
+I97
+ta(I250
+I97
+I251
+I98
+ta(I251
+I98
+I250
+I99
+ta(I250
+I99
+I245
+I101
+ta(I245
+I101
+I229
+I102
+ta(I229
+I102
+I211
+I103
+ta(I211
+I103
+I187
+I105
+ta(I187
+I105
+I163
+I106
+ta(I163
+I106
+I139
+I109
+ta(I139
+I109
+I117
+I112
+ta(I117
+I112
+I99
+I115
+ta(I99
+I115
+I85
+I117
+ta(I85
+I117
+I81
+I120
+ta(I81
+I120
+I77
+I123
+ta(I77
+I123
+I76
+I125
+ta(I76
+I125
+I76
+I127
+ta(I76
+I127
+I79
+I130
+ta(I79
+I130
+I83
+I132
+ta(I83
+I132
+I97
+I135
+ta(I97
+I135
+I113
+I137
+ta(I113
+I137
+I131
+I137
+ta(I131
+I137
+I151
+I137
+ta(I151
+I137
+I175
+I137
+ta(I175
+I137
+I201
+I137
+ta(I201
+I137
+I229
+I137
+ta(I229
+I137
+I255
+I137
+ta(I255
+I137
+I283
+I137
+ta(I283
+I137
+I307
+I137
+ta(I307
+I137
+I312
+I137
+ta(I312
+I137
+I314
+I137
+ta(I314
+I137
+I311
+I137
+ta(I311
+I137
+I293
+I137
+ta(I293
+I137
+I271
+I137
+ta(I271
+I137
+I247
+I137
+ta(I247
+I137
+I217
+I138
+ta(I217
+I138
+I185
+I140
+ta(I185
+I140
+I155
+I142
+ta(I155
+I142
+I129
+I143
+ta(I129
+I143
+I107
+I146
+ta(I107
+I146
+I87
+I149
+ta(I87
+I149
+I82
+I151
+ta(I82
+I151
+I79
+I153
+ta(I79
+I153
+I79
+I154
+ta(I79
+I154
+I80
+I155
+ta(I80
+I155
+I84
+I156
+ta(I84
+I156
+I90
+I156
+ta(I90
+I156
+I112
+I156
+ta(I112
+I156
+I132
+I156
+ta(I132
+I156
+I156
+I154
+ta(I156
+I154
+I180
+I152
+ta(I180
+I152
+I202
+I151
+ta(I202
+I151
+I220
+I150
+ta(I220
+I150
+I234
+I149
+ta(I234
+I149
+I240
+I148
+ta(I240
+I148
+I243
+I148
+ta(I243
+I148
+I244
+I148
+ta(I244
+I148
+I243
+I148
+ta(I243
+I148
+I237
+I149
+ta(I237
+I149
+I219
+I150
+ta(I219
+I150
+I199
+I151
+ta(I199
+I151
+I173
+I153
+ta(I173
+I153
+I149
+I154
+ta(I149
+I154
+I125
+I156
+ta(I125
+I156
+I105
+I159
+ta(I105
+I159
+I89
+I161
+ta(I89
+I161
+I86
+I163
+ta(I86
+I163
+I84
+I165
+ta(I84
+I165
+I84
+I167
+ta(I84
+I167
+I85
+I168
+ta(I85
+I168
+I89
+I171
+ta(I89
+I171
+I95
+I173
+ta(I95
+I173
+I111
+I175
+ta(I111
+I175
+I129
+I177
+ta(I129
+I177
+I149
+I178
+ta(I149
+I178
+I175
+I179
+ta(I175
+I179
+I199
+I180
+ta(I199
+I180
+I225
+I182
+ta(I225
+I182
+I251
+I183
+ta(I251
+I183
+I269
+I184
+ta(I269
+I184
+I274
+I185
+ta(I274
+I185
+I275
+I186
+ta(I275
+I186
+I274
+I186
+ta(I274
+I186
+I269
+I186
+ta(I269
+I186
+I251
+I186
+ta(I251
+I186
+I229
+I186
+ta(I229
+I186
+I201
+I187
+ta(I201
+I187
+I167
+I188
+ta(I167
+I188
+I137
+I191
+ta(I137
+I191
+I107
+I192
+ta(I107
+I192
+I77
+I194
+ta(I77
+I194
+I55
+I197
+ta(I55
+I197
+I41
+I199
+ta(I41
+I199
+I36
+I201
+ta(I36
+I201
+I35
+I202
+ta(I35
+I202
+I37
+I203
+ta(I37
+I203
+I42
+I204
+ta(I42
+I204
+I48
+I204
+ta(I48
+I204
+I64
+I204
+ta(I64
+I204
+I86
+I204
+ta(I86
+I204
+I110
+I204
+ta(I110
+I204
+I136
+I204
+ta(I136
+I204
+I164
+I204
+ta(I164
+I204
+I188
+I204
+ta(I188
+I204
+I208
+I204
+ta(I208
+I204
+I213
+I204
+ta(I213
+I204
+I214
+I204
+ta(I214
+I204
+I211
+I204
+ta(I211
+I204
+I197
+I205
+ta(I197
+I205
+I179
+I205
+ta(I179
+I205
+I155
+I206
+ta(I155
+I206
+I125
+I207
+ta(I125
+I207
+I95
+I207
+ta(I95
+I207
+I69
+I209
+ta(I69
+I209
+I41
+I211
+ta(I41
+I211
+I23
+I212
+ta(I23
+I212
+I9
+I215
+ta(I9
+I215
+I6
+I216
+ta(I6
+I216
+I4
+I218
+ta(I4
+I218
+I5
+I219
+ta(I5
+I219
+I11
+I219
+ta(I11
+I219
+I27
+I220
+ta(I27
+I220
+I47
+I221
+ta(I47
+I221
+I75
+I221
+ta(I75
+I221
+I105
+I221
+ta(I105
+I221
+I137
+I221
+ta(I137
+I221
+I169
+I221
+ta(I169
+I221
+I195
+I221
+ta(I195
+I221
+I219
+I221
+ta(I219
+I221
+I225
+I222
+ta(I225
+I222
+I229
+I223
+ta(I229
+I223
+I227
+I223
+ta(I227
+I223
+I211
+I224
+ta(I211
+I224
+I191
+I225
+ta(I191
+I225
+I163
+I226
+ta(I163
+I226
+I135
+I226
+ta(I135
+I226
+I105
+I228
+ta(I105
+I228
+I73
+I230
+ta(I73
+I230
+I49
+I232
+ta(I49
+I232
+I31
+I234
+ta(I31
+I234
+I26
+I237
+ta(I26
+I237
+I23
+I238
+ta(I23
+I238
+I23
+I240
+ta(I23
+I240
+I24
+I241
+ta(I24
+I241
+I29
+I243
+ta(I29
+I243
+I47
+I244
+ta(I47
+I244
+I69
+I245
+ta(I69
+I245
+I93
+I246
+ta(I93
+I246
+I119
+I246
+ta(I119
+I246
+I147
+I246
+ta(I147
+I246
+I175
+I246
+ta(I175
+I246
+I199
+I246
+ta(I199
+I246
+I217
+I246
+ta(I217
+I246
+I222
+I247
+ta(I222
+I247
+I219
+I247
+ta(I219
+I247
+I201
+I248
+ta(I201
+I248
+I181
+I249
+ta(I181
+I249
+I157
+I251
+ta(I157
+I251
+I127
+I252
+ta(I127
+I252
+I97
+I254
+ta(I97
+I254
+I67
+I256
+ta(I67
+I256
+I45
+I258
+ta(I45
+I258
+I27
+I260
+ta(I27
+I260
+I24
+I262
+ta(I24
+I262
+I24
+I263
+ta(I24
+I263
+I24
+I264
+ta(I24
+I264
+I26
+I266
+ta(I26
+I266
+I30
+I267
+ta(I30
+I267
+I50
+I269
+ta(I50
+I269
+I68
+I270
+ta(I68
+I270
+I92
+I272
+ta(I92
+I272
+I118
+I273
+ta(I118
+I273
+I144
+I274
+ta(I144
+I274
+I170
+I275
+ta(I170
+I275
+I196
+I277
+ta(I196
+I277
+I220
+I278
+ta(I220
+I278
+I226
+I280
+ta(I226
+I280
+I228
+I280
+ta(I228
+I280
+I228
+I281
+ta(I228
+I281
+I227
+I281
+ta(I227
+I281
+I223
+I281
+ta(I223
+I281
+I205
+I281
+ta(I205
+I281
+I181
+I281
+ta(I181
+I281
+I153
+I282
+ta(I153
+I282
+I125
+I284
+ta(I125
+I284
+I105
+I285
+ta(I105
+I285
+I91
+I286
+ta(I91
+I286
+I87
+I287
+ta(I87
+I287
+I85
+I288
+ta(I85
+I288
+I87
+I289
+ta(I87
+I289
+I101
+I289
+ta(I101
+I289
+I117
+I288
+ta(I117
+I288
+I137
+I287
+ta(I137
+I287
+I159
+I285
+ta(I159
+I285
+I183
+I284
+ta(I183
+I284
+I203
+I283
+ta(I203
+I283
+I219
+I282
+ta(I219
+I282
+I222
+I281
+ta(I222
+I281
+I218
+I281
+ta(I218
+I281
+I196
+I282
+ta(I196
+I282
+I176
+I284
+ta(I176
+I284
+I146
+I287
+ta(I146
+I287
+I118
+I289
+ta(I118
+I289
+I92
+I293
+ta(I92
+I293
+I66
+I297
+ta(I66
+I297
+I50
+I300
+ta(I50
+I300
+I36
+I303
+ta(I36
+I303
+I33
+I306
+ta(I33
+I306
+I32
+I308
+ta(I32
+I308
+I33
+I310
+ta(I33
+I310
+I36
+I312
+ta(I36
+I312
+I50
+I314
+ta(I50
+I314
+I66
+I315
+ta(I66
+I315
+I88
+I316
+ta(I88
+I316
+I114
+I316
+ta(I114
+I316
+I140
+I316
+ta(I140
+I316
+I168
+I316
+ta(I168
+I316
+I196
+I316
+ta(I196
+I316
+I220
+I316
+ta(I220
+I316
+I238
+I316
+ta(I238
+I316
+I243
+I316
+ta(I243
+I316
+I242
+I316
+ta(I242
+I316
+I239
+I316
+ta(I239
+I316
+I223
+I317
+ta(I223
+I317
+I203
+I318
+ta(I203
+I318
+I177
+I318
+ta(I177
+I318
+I143
+I318
+ta(I143
+I318
+I111
+I319
+ta(I111
+I319
+I79
+I321
+ta(I79
+I321
+I51
+I323
+ta(I51
+I323
+I31
+I324
+ta(I31
+I324
+I15
+I327
+ta(I15
+I327
+I12
+I329
+ta(I12
+I329
+I11
+I331
+ta(I11
+I331
+I11
+I332
+ta(I11
+I332
+I14
+I334
+ta(I14
+I334
+I20
+I336
+ta(I20
+I336
+I36
+I338
+ta(I36
+I338
+I56
+I339
+ta(I56
+I339
+I82
+I340
+ta(I82
+I340
+I110
+I340
+ta(I110
+I340
+I142
+I340
+ta(I142
+I340
+I174
+I340
+ta(I174
+I340
+I204
+I340
+ta(I204
+I340
+I230
+I340
+ta(I230
+I340
+I254
+I340
+ta(I254
+I340
+I258
+I340
+ta(I258
+I340
+I257
+I340
+ta(I257
+I340
+I254
+I339
+ta(I254
+I339
+I238
+I337
+ta(I238
+I337
+I214
+I336
+ta(I214
+I336
+I178
+I335
+ta(I178
+I335
+I142
+I335
+ta(I142
+I335
+I108
+I335
+ta(I108
+I335
+I78
+I335
+ta(I78
+I335
+I50
+I336
+ta(I50
+I336
+I34
+I338
+ta(I34
+I338
+I30
+I340
+ta(I30
+I340
+I29
+I341
+ta(I29
+I341
+I30
+I342
+ta(I30
+I342
+I34
+I343
+ta(I34
+I343
+I50
+I345
+ta(I50
+I345
+I72
+I345
+ta(I72
+I345
+I96
+I345
+ta(I96
+I345
+I132
+I345
+ta(I132
+I345
+I168
+I345
+ta(I168
+I345
+I202
+I345
+ta(I202
+I345
+I230
+I345
+ta(I230
+I345
+I252
+I345
+ta(I252
+I345
+I258
+I345
+ta(I258
+I345
+I258
+I344
+ta(I258
+I344
+I256
+I344
+ta(I256
+I344
+I240
+I343
+ta(I240
+I343
+I220
+I343
+ta(I220
+I343
+I192
+I343
+ta(I192
+I343
+I160
+I343
+ta(I160
+I343
+I122
+I343
+ta(I122
+I343
+I86
+I344
+ta(I86
+I344
+I54
+I346
+ta(I54
+I346
+I26
+I349
+ta(I26
+I349
+I4
+I352
+ta(I4
+I352
+I0
+I355
+ta(I0
+I355
+I-1
+I358
+ta(I-1
+I358
+I2
+I361
+ta(I2
+I361
+I18
+I363
+ta(I18
+I363
+I40
+I364
+ta(I40
+I364
+I70
+I366
+ta(I70
+I366
+I106
+I367
+ta(I106
+I367
+I140
+I368
+ta(I140
+I368
+I172
+I368
+ta(I172
+I368
+I202
+I368
+ta(I202
+I368
+I222
+I368
+ta(I222
+I368
+I227
+I368
+ta(I227
+I368
+I228
+I369
+ta(I228
+I369
+I227
+I369
+ta(I227
+I369
+I225
+I370
+ta(I225
+I370
+I220
+I371
+ta(I220
+I371
+I206
+I373
+ta(I206
+I373
+I192
+I373
+ta(I192
+I373
+I186
+I374
+ta(I186
+I374
+I183
+I374
+ta(I183
+I374
+I182
+I374
+ta(I182
+I374
+I162
+I372
+ta(I162
+I372
+I138
+I366
+ta(I138
+I366
+I114
+I364
+ta(I114
+I364
+I92
+I364
+ta(I92
+I364
+I68
+I364
+ta(I68
+I364
+I50
+I364
+ta(I50
+I364
+I30
+I364
+ta(I30
+I364
+I8
+I364
+ta(I8
+I364
+I-8
+I365
+ta(I-8
+I365
+I-26
+I367
+ta(I-26
+I367
+I-32
+I370
+ta(I-32
+I370
+I-37
+I374
+ta(I-37
+I374
+I-40
+I378
+ta(I-40
+I378
+I-41
+I381
+ta(I-41
+I381
+I-41
+I385
+ta(I-41
+I385
+I-39
+I388
+ta(I-39
+I388
+I-35
+I391
+ta(I-35
+I391
+I-19
+I393
+ta(I-19
+I393
+I-3
+I394
+ta(I-3
+I394
+I19
+I395
+ta(I19
+I395
+I47
+I396
+ta(I47
+I396
+I79
+I396
+ta(I79
+I396
+I109
+I396
+ta(I109
+I396
+I141
+I396
+ta(I141
+I396
+I169
+I393
+ta(I169
+I393
+I195
+I392
+ta(I195
+I392
+I213
+I390
+ta(I213
+I390
+I217
+I389
+ta(I217
+I389
+I218
+I388
+ta(I218
+I388
+I218
+I387
+ta(I218
+I387
+I215
+I386
+ta(I215
+I386
+I201
+I386
+ta(I201
+I386
+I181
+I386
+ta(I181
+I386
+I153
+I386
+ta(I153
+I386
+I123
+I387
+ta(I123
+I387
+I91
+I389
+ta(I91
+I389
+I63
+I392
+ta(I63
+I392
+I39
+I395
+ta(I39
+I395
+I17
+I398
+ta(I17
+I398
+I3
+I401
+ta(I3
+I401
+I-3
+I404
+ta(I-3
+I404
+I-6
+I407
+ta(I-6
+I407
+I-7
+I410
+ta(I-7
+I410
+I-6
+I412
+ta(I-6
+I412
+I-1
+I415
+ta(I-1
+I415
+I13
+I417
+ta(I13
+I417
+I35
+I419
+ta(I35
+I419
+I59
+I420
+ta(I59
+I420
+I83
+I421
+ta(I83
+I421
+I111
+I422
+ta(I111
+I422
+I137
+I422
+ta(I137
+I422
+I161
+I422
+ta(I161
+I422
+I185
+I424
+ta(I185
+I424
+I191
+I425
+ta(I191
+I425
+I196
+I427
+ta(I196
+I427
+I197
+I429
+ta(I197
+I429
+I197
+I430
+ta(I197
+I430
+I195
+I431
+ta(I195
+I431
+I191
+I432
+ta(I191
+I432
+I173
+I434
+ta(I173
+I434
+I153
+I436
+ta(I153
+I436
+I129
+I438
+ta(I129
+I438
+I101
+I440
+ta(I101
+I440
+I71
+I441
+ta(I71
+I441
+I43
+I444
+ta(I43
+I444
+I19
+I447
+ta(I19
+I447
+I1
+I451
+ta(I1
+I451
+I-13
+I455
+ta(I-13
+I455
+I-16
+I460
+ta(I-16
+I460
+I-17
+I463
+ta(I-17
+I463
+I-17
+I466
+ta(I-17
+I466
+I-14
+I469
+ta(I-14
+I469
+I0
+I471
+ta(I0
+I471
+I16
+I473
+ta(I16
+I473
+I38
+I474
+ta(I38
+I474
+I60
+I474
+ta(I60
+I474
+I86
+I474
+ta(I86
+I474
+I110
+I472
+ta(I110
+I472
+I134
+I471
+ta(I134
+I471
+I154
+I470
+ta(I154
+I470
+I172
+I468
+ta(I172
+I468
+I177
+I467
+ta(I177
+I467
+I181
+I467
+ta(I181
+I467
+I182
+I467
+ta(I182
+I467
+I181
+I467
+ta(I181
+I467
+I178
+I467
+ta(I178
+I467
+I173
+I467
+ta(I173
+I467
+I155
+I468
+ta(I155
+I468
+I133
+I469
+ta(I133
+I469
+I115
+I470
+ta(I115
+I470
+I95
+I472
+ta(I95
+I472
+I79
+I474
+ta(I79
+I474
+I65
+I476
+ta(I65
+I476
+I60
+I478
+ta(I60
+I478
+I57
+I480
+ta(I57
+I480
+I55
+I482
+ta(I55
+I482
+I55
+I483
+ta(I55
+I483
+I55
+I484
+ta(I55
+I484
+I57
+I485
+ta(I57
+I485
+I60
+I486
+ta(I60
+I486
+I74
+I486
+ta(I74
+I486
+I94
+I486
+ta(I94
+I486
+I114
+I485
+ta(I114
+I485
+I138
+I483
+ta(I138
+I483
+I166
+I482
+ta(I166
+I482
+I194
+I480
+ta(I194
+I480
+I218
+I478
+ta(I218
+I478
+I240
+I477
+ta(I240
+I477
+I245
+I476
+ta(I245
+I476
+I247
+I475
+ta(I247
+I475
+I247
+I474
+ta(I247
+I474
+I245
+I473
+ta(I245
+I473
+I231
+I471
+ta(I231
+I471
+I209
+I470
+ta(I209
+I470
+I181
+I468
+ta(I181
+I468
+I149
+I468
+ta(I149
+I468
+I115
+I468
+ta(I115
+I468
+I81
+I468
+ta(I81
+I468
+I55
+I469
+ta(I55
+I469
+I35
+I471
+ta(I35
+I471
+I29
+I473
+ta(I29
+I473
+I27
+I474
+ta(I27
+I474
+I27
+I475
+ta(I27
+I475
+I28
+I476
+ta(I28
+I476
+I32
+I477
+ta(I32
+I477
+I38
+I478
+ta(I38
+I478
+I56
+I479
+ta(I56
+I479
+I80
+I480
+ta(I80
+I480
+I104
+I480
+ta(I104
+I480
+I128
+I480
+ta(I128
+I480
+I158
+I480
+ta(I158
+I480
+I184
+I480
+ta(I184
+I480
+I208
+I481
+ta(I208
+I481
+I228
+I483
+ta(I228
+I483
+I234
+I484
+ta(I234
+I484
+I240
+I485
+ta(I240
+I485
+I241
+I486
+ta(I241
+I486
+I239
+I487
+ta(I239
+I487
+I223
+I488
+ta(I223
+I488
+I203
+I489
+ta(I203
+I489
+I173
+I491
+ta(I173
+I491
+I141
+I492
+ta(I141
+I492
+I105
+I492
+ta(I105
+I492
+I73
+I492
+ta(I73
+I492
+I47
+I494
+ta(I47
+I494
+I31
+I495
+ta(I31
+I495
+I27
+I497
+ta(I27
+I497
+I25
+I498
+ta(I25
+I498
+I26
+I499
+ta(I26
+I499
+I30
+I500
+ta(I30
+I500
+I36
+I501
+ta(I36
+I501
+I56
+I501
+ta(I56
+I501
+I80
+I501
+ta(I80
+I501
+I104
+I501
+ta(I104
+I501
+I130
+I501
+ta(I130
+I501
+I156
+I501
+ta(I156
+I501
+I182
+I501
+ta(I182
+I501
+I208
+I501
+ta(I208
+I501
+I228
+I501
+ta(I228
+I501
+I244
+I502
+ta(I244
+I502
+I246
+I502
+ta(I246
+I502
+I244
+I502
+ta(I244
+I502
+I230
+I503
+ta(I230
+I503
+I212
+I505
+ta(I212
+I505
+I188
+I506
+ta(I188
+I506
+I160
+I508
+ta(I160
+I508
+I132
+I510
+ta(I132
+I510
+I106
+I511
+ta(I106
+I511
+I78
+I515
+ta(I78
+I515
+I58
+I518
+ta(I58
+I518
+I44
+I521
+ta(I44
+I521
+I40
+I524
+ta(I40
+I524
+I38
+I527
+ta(I38
+I527
+I37
+I530
+ta(I37
+I530
+I39
+I531
+ta(I39
+I531
+I41
+I533
+ta(I41
+I533
+I47
+I534
+ta(I47
+I534
+I61
+I535
+ta(I61
+I535
+I77
+I535
+ta(I77
+I535
+I97
+I535
+ta(I97
+I535
+I119
+I535
+ta(I119
+I535
+I141
+I535
+ta(I141
+I535
+I163
+I535
+ta(I163
+I535
+I187
+I535
+ta(I187
+I535
+I207
+I535
+ta(I207
+I535
+I225
+I535
+ta(I225
+I535
+I231
+I535
+ta(I231
+I535
+I234
+I535
+ta(I234
+I535
+I235
+I535
+ta(I235
+I535
+I232
+I535
+ta(I232
+I535
+I216
+I535
+ta(I216
+I535
+I196
+I535
+ta(I196
+I535
+I174
+I536
+ta(I174
+I536
+I150
+I536
+ta(I150
+I536
+I120
+I536
+ta(I120
+I536
+I90
+I538
+ta(I90
+I538
+I64
+I539
+ta(I64
+I539
+I42
+I541
+ta(I42
+I541
+I24
+I542
+ta(I24
+I542
+I22
+I543
+ta(I22
+I543
+I21
+I543
+ta(I21
+I543
+I23
+I543
+ta(I23
+I543
+I27
+I543
+ta(I27
+I543
+I47
+I543
+ta(I47
+I543
+I67
+I543
+ta(I67
+I543
+I91
+I543
+ta(I91
+I543
+I123
+I543
+ta(I123
+I543
+I153
+I543
+ta(I153
+I543
+I187
+I543
+ta(I187
+I543
+I217
+I543
+ta(I217
+I543
+I247
+I543
+ta(I247
+I543
+I281
+I543
+ta(I281
+I543
+I311
+I544
+ta(I311
+I544
+I341
+I544
+ta(I341
+I544
+I373
+I544
+ta(I373
+I544
+I401
+I544
+ta(I401
+I544
+I427
+I544
+ta(I427
+I544
+I451
+I544
+ta(I451
+I544
+I471
+I544
+ta(I471
+I544
+I487
+I543
+ta(I487
+I543
+I491
+I542
+ta(I491
+I542
+I493
+I542
+ta(I493
+I542
+I491
+I541
+ta(I491
+I541
+I477
+I538
+ta(I477
+I538
+I461
+I536
+ta(I461
+I536
+I437
+I534
+ta(I437
+I534
+I405
+I533
+ta(I405
+I533
+I373
+I532
+ta(I373
+I532
+I339
+I532
+ta(I339
+I532
+I309
+I532
+ta(I309
+I532
+I279
+I532
+ta(I279
+I532
+I257
+I532
+ta(I257
+I532
+I251
+I533
+ta(I251
+I533
+I249
+I533
+ta(I249
+I533
+I248
+I533
+ta(I248
+I533
+I250
+I533
+ta(I250
+I533
+I254
+I535
+ta(I254
+I535
+I260
+I536
+ta(I260
+I536
+I278
+I536
+ta(I278
+I536
+I300
+I537
+ta(I300
+I537
+I324
+I537
+ta(I324
+I537
+I348
+I537
+ta(I348
+I537
+I374
+I537
+ta(I374
+I537
+I398
+I537
+ta(I398
+I537
+I420
+I536
+ta(I420
+I536
+I444
+I535
+ta(I444
+I535
+I466
+I535
+ta(I466
+I535
+I486
+I535
+ta(I486
+I535
+I504
+I535
+ta(I504
+I535
+I510
+I535
+ta(I510
+I535
+I513
+I535
+ta(I513
+I535
+I514
+I535
+ta(I514
+I535
+I511
+I535
+ta(I511
+I535
+I493
+I534
+ta(I493
+I534
+I467
+I533
+ta(I467
+I533
+I435
+I532
+ta(I435
+I532
+I399
+I532
+ta(I399
+I532
+I355
+I531
+ta(I355
+I531
+I307
+I530
+ta(I307
+I530
+I269
+I530
+ta(I269
+I530
+I237
+I530
+ta(I237
+I530
+I209
+I530
+ta(I209
+I530
+I191
+I530
+ta(I191
+I530
+I186
+I530
+ta(I186
+I530
+I184
+I530
+ta(I184
+I530
+I187
+I529
+ta(I187
+I529
+I201
+I529
+ta(I201
+I529
+I221
+I527
+ta(I221
+I527
+I243
+I526
+ta(I243
+I526
+I269
+I524
+ta(I269
+I524
+I305
+I523
+ta(I305
+I523
+I333
+I521
+ta(I333
+I521
+I363
+I519
+ta(I363
+I519
+I393
+I517
+ta(I393
+I517
+I417
+I516
+ta(I417
+I516
+I439
+I515
+ta(I439
+I515
+I444
+I514
+ta(I444
+I514
+I445
+I513
+ta(I445
+I513
+I442
+I513
+ta(I442
+I513
+I422
+I512
+ta(I422
+I512
+I398
+I512
+ta(I398
+I512
+I370
+I512
+ta(I370
+I512
+I334
+I511
+ta(I334
+I511
+I296
+I511
+ta(I296
+I511
+I266
+I511
+ta(I266
+I511
+I236
+I511
+ta(I236
+I511
+I216
+I511
+ta(I216
+I511
+I211
+I510
+ta(I211
+I510
+I208
+I509
+ta(I208
+I509
+I208
+I508
+ta(I208
+I508
+I210
+I507
+ta(I210
+I507
+I224
+I505
+ta(I224
+I505
+I244
+I502
+ta(I244
+I502
+I268
+I500
+ta(I268
+I500
+I304
+I497
+ta(I304
+I497
+I346
+I495
+ta(I346
+I495
+I388
+I492
+ta(I388
+I492
+I428
+I490
+ta(I428
+I490
+I466
+I487
+ta(I466
+I487
+I492
+I485
+ta(I492
+I485
+I512
+I484
+ta(I512
+I484
+I516
+I482
+ta(I516
+I482
+I516
+I481
+ta(I516
+I481
+I513
+I479
+ta(I513
+I479
+I499
+I476
+ta(I499
+I476
+I475
+I475
+ta(I475
+I475
+I445
+I474
+ta(I445
+I474
+I403
+I473
+ta(I403
+I473
+I357
+I472
+ta(I357
+I472
+I313
+I471
+ta(I313
+I471
+I269
+I471
+ta(I269
+I471
+I235
+I471
+ta(I235
+I471
+I207
+I471
+ta(I207
+I471
+I191
+I471
+ta(I191
+I471
+I189
+I471
+ta(I189
+I471
+I194
+I471
+ta(I194
+I471
+I214
+I470
+ta(I214
+I470
+I240
+I468
+ta(I240
+I468
+I274
+I466
+ta(I274
+I466
+I316
+I463
+ta(I316
+I463
+I354
+I461
+ta(I354
+I461
+I396
+I459
+ta(I396
+I459
+I434
+I457
+ta(I434
+I457
+I462
+I456
+ta(I462
+I456
+I478
+I455
+ta(I478
+I455
+I498
+I454
+ta(I498
+I454
+I502
+I453
+ta(I502
+I453
+I499
+I452
+ta(I499
+I452
+I477
+I451
+ta(I477
+I451
+I451
+I451
+ta(I451
+I451
+I447
+I451
+ta(I447
+I451
+I415
+I450
+ta(I415
+I450
+I375
+I449
+ta(I375
+I449
+I339
+I449
+ta(I339
+I449
+I307
+I449
+ta(I307
+I449
+I281
+I449
+ta(I281
+I449
+I267
+I449
+ta(I267
+I449
+I266
+I448
+ta(I266
+I448
+I267
+I448
+ta(I267
+I448
+I273
+I446
+ta(I273
+I446
+I291
+I444
+ta(I291
+I444
+I315
+I440
+ta(I315
+I440
+I349
+I436
+ta(I349
+I436
+I385
+I432
+ta(I385
+I432
+I425
+I427
+ta(I425
+I427
+I459
+I423
+ta(I459
+I423
+I493
+I419
+ta(I493
+I419
+I519
+I416
+ta(I519
+I416
+I543
+I414
+ta(I543
+I414
+I548
+I413
+ta(I548
+I413
+I548
+I412
+ta(I548
+I412
+I547
+I412
+ta(I547
+I412
+I531
+I410
+ta(I531
+I410
+I511
+I410
+ta(I511
+I410
+I483
+I410
+ta(I483
+I410
+I449
+I410
+ta(I449
+I410
+I419
+I410
+ta(I419
+I410
+I381
+I410
+ta(I381
+I410
+I345
+I410
+ta(I345
+I410
+I317
+I410
+ta(I317
+I410
+I297
+I410
+ta(I297
+I410
+I292
+I410
+ta(I292
+I410
+I294
+I410
+ta(I294
+I410
+I308
+I409
+ta(I308
+I409
+I332
+I406
+ta(I332
+I406
+I356
+I404
+ta(I356
+I404
+I384
+I402
+ta(I384
+I402
+I418
+I400
+ta(I418
+I400
+I446
+I398
+ta(I446
+I398
+I472
+I396
+ta(I472
+I396
+I496
+I394
+ta(I496
+I394
+I512
+I391
+ta(I512
+I391
+I514
+I390
+ta(I514
+I390
+I514
+I389
+ta(I514
+I389
+I511
+I387
+ta(I511
+I387
+I497
+I385
+ta(I497
+I385
+I477
+I384
+ta(I477
+I384
+I445
+I384
+ta(I445
+I384
+I409
+I384
+ta(I409
+I384
+I375
+I384
+ta(I375
+I384
+I335
+I384
+ta(I335
+I384
+I297
+I384
+ta(I297
+I384
+I269
+I384
+ta(I269
+I384
+I243
+I384
+ta(I243
+I384
+I229
+I384
+ta(I229
+I384
+I226
+I382
+ta(I226
+I382
+I228
+I381
+ta(I228
+I381
+I244
+I378
+ta(I244
+I378
+I266
+I375
+ta(I266
+I375
+I292
+I372
+ta(I292
+I372
+I326
+I367
+ta(I326
+I367
+I362
+I364
+ta(I362
+I364
+I400
+I359
+ta(I400
+I359
+I434
+I356
+ta(I434
+I356
+I464
+I353
+ta(I464
+I353
+I494
+I349
+ta(I494
+I349
+I516
+I347
+ta(I516
+I347
+I521
+I346
+ta(I521
+I346
+I522
+I345
+ta(I522
+I345
+I521
+I345
+ta(I521
+I345
+I516
+I344
+ta(I516
+I344
+I498
+I344
+ta(I498
+I344
+I472
+I345
+ta(I472
+I345
+I438
+I346
+ta(I438
+I346
+I398
+I347
+ta(I398
+I347
+I356
+I348
+ta(I356
+I348
+I322
+I350
+ta(I322
+I350
+I288
+I352
+ta(I288
+I352
+I262
+I353
+ta(I262
+I353
+I240
+I355
+ta(I240
+I355
+I236
+I355
+ta(I236
+I355
+I235
+I356
+ta(I235
+I356
+I236
+I356
+ta(I236
+I356
+I242
+I356
+ta(I242
+I356
+I260
+I355
+ta(I260
+I355
+I286
+I353
+ta(I286
+I353
+I312
+I349
+ta(I312
+I349
+I348
+I347
+ta(I348
+I347
+I380
+I345
+ta(I380
+I345
+I420
+I342
+ta(I420
+I342
+I454
+I340
+ta(I454
+I340
+I486
+I338
+ta(I486
+I338
+I512
+I334
+ta(I512
+I334
+I534
+I332
+ta(I534
+I332
+I539
+I330
+ta(I539
+I330
+I541
+I329
+ta(I541
+I329
+I538
+I328
+ta(I538
+I328
+I516
+I328
+ta(I516
+I328
+I494
+I328
+ta(I494
+I328
+I464
+I328
+ta(I464
+I328
+I426
+I328
+ta(I426
+I328
+I392
+I328
+ta(I392
+I328
+I360
+I328
+ta(I360
+I328
+I330
+I328
+ta(I330
+I328
+I306
+I328
+ta(I306
+I328
+I292
+I328
+ta(I292
+I328
+I290
+I327
+ta(I290
+I327
+I290
+I326
+ta(I290
+I326
+I291
+I326
+ta(I291
+I326
+I296
+I324
+ta(I296
+I324
+I314
+I321
+ta(I314
+I321
+I334
+I318
+ta(I334
+I318
+I360
+I315
+ta(I360
+I315
+I388
+I311
+ta(I388
+I311
+I416
+I308
+ta(I416
+I308
+I444
+I304
+ta(I444
+I304
+I472
+I301
+ta(I472
+I301
+I496
+I298
+ta(I496
+I298
+I516
+I295
+ta(I516
+I295
+I520
+I293
+ta(I520
+I293
+I522
+I291
+ta(I522
+I291
+I522
+I290
+ta(I522
+I290
+I519
+I288
+ta(I519
+I288
+I503
+I286
+ta(I503
+I286
+I483
+I285
+ta(I483
+I285
+I457
+I285
+ta(I457
+I285
+I425
+I285
+ta(I425
+I285
+I385
+I285
+ta(I385
+I285
+I353
+I285
+ta(I353
+I285
+I317
+I287
+ta(I317
+I287
+I289
+I288
+ta(I289
+I288
+I267
+I290
+ta(I267
+I290
+I263
+I291
+ta(I263
+I291
+I262
+I291
+ta(I262
+I291
+I266
+I291
+ta(I266
+I291
+I286
+I290
+ta(I286
+I290
+I308
+I288
+ta(I308
+I288
+I334
+I286
+ta(I334
+I286
+I368
+I284
+ta(I368
+I284
+I406
+I281
+ta(I406
+I281
+I438
+I279
+ta(I438
+I279
+I470
+I277
+ta(I470
+I277
+I496
+I275
+ta(I496
+I275
+I512
+I274
+ta(I512
+I274
+I515
+I272
+ta(I515
+I272
+I515
+I271
+ta(I515
+I271
+I513
+I270
+ta(I513
+I270
+I499
+I269
+ta(I499
+I269
+I477
+I267
+ta(I477
+I267
+I451
+I266
+ta(I451
+I266
+I423
+I266
+ta(I423
+I266
+I389
+I266
+ta(I389
+I266
+I355
+I266
+ta(I355
+I266
+I327
+I266
+ta(I327
+I266
+I305
+I265
+ta(I305
+I265
+I299
+I263
+ta(I299
+I263
+I298
+I262
+ta(I298
+I262
+I298
+I261
+ta(I298
+I261
+I301
+I258
+ta(I301
+I258
+I307
+I254
+ta(I307
+I254
+I329
+I249
+ta(I329
+I249
+I351
+I244
+ta(I351
+I244
+I375
+I239
+ta(I375
+I239
+I401
+I233
+ta(I401
+I233
+I431
+I228
+ta(I431
+I228
+I457
+I214
+ta(I457
+I214
+I477
+I211
+ta(I477
+I211
+I495
+I206
+ta(I495
+I206
+I499
+I202
+ta(I499
+I202
+I500
+I199
+ta(I500
+I199
+I500
+I196
+ta(I500
+I196
+I497
+I194
+ta(I497
+I194
+I483
+I193
+ta(I483
+I193
+I467
+I191
+ta(I467
+I191
+I445
+I191
+ta(I445
+I191
+I419
+I191
+ta(I419
+I191
+I395
+I192
+ta(I395
+I192
+I369
+I194
+ta(I369
+I194
+I347
+I195
+ta(I347
+I195
+I329
+I196
+ta(I329
+I196
+I324
+I197
+ta(I324
+I197
+I320
+I198
+ta(I320
+I198
+I323
+I198
+ta(I323
+I198
+I343
+I195
+ta(I343
+I195
+I361
+I193
+ta(I361
+I193
+I379
+I190
+ta(I379
+I190
+I397
+I187
+ta(I397
+I187
+I417
+I185
+ta(I417
+I185
+I435
+I182
+ta(I435
+I182
+I451
+I180
+ta(I451
+I180
+I456
+I178
+ta(I456
+I178
+I458
+I177
+ta(I458
+I177
+I459
+I176
+ta(I459
+I176
+I458
+I176
+ta(I458
+I176
+I454
+I176
+ta(I454
+I176
+I438
+I177
+ta(I438
+I177
+I418
+I178
+ta(I418
+I178
+I396
+I181
+ta(I396
+I181
+I372
+I185
+ta(I372
+I185
+I344
+I188
+ta(I344
+I188
+I318
+I192
+ta(I318
+I192
+I294
+I195
+ta(I294
+I195
+I276
+I198
+ta(I276
+I198
+I272
+I200
+ta(I272
+I200
+I271
+I201
+ta(I271
+I201
+I274
+I201
+ta(I274
+I201
+I290
+I199
+ta(I290
+I199
+I310
+I196
+ta(I310
+I196
+I332
+I193
+ta(I332
+I193
+I352
+I190
+ta(I352
+I190
+I376
+I187
+ta(I376
+I187
+I396
+I185
+ta(I396
+I185
+I412
+I182
+ta(I412
+I182
+I428
+I181
+ta(I428
+I181
+I429
+I180
+ta(I429
+I180
+I430
+I180
+ta(I430
+I180
+I428
+I180
+ta(I428
+I180
+I414
+I180
+ta(I414
+I180
+I396
+I182
+ta(I396
+I182
+I372
+I185
+ta(I372
+I185
+I346
+I188
+ta(I346
+I188
+I316
+I192
+ta(I316
+I192
+I290
+I194
+ta(I290
+I194
+I268
+I197
+ta(I268
+I197
+I250
+I200
+ta(I250
+I200
+I236
+I202
+ta(I236
+I202
+I231
+I203
+ta(I231
+I203
+I228
+I204
+ta(I228
+I204
+I226
+I204
+ta(I226
+I204
+I228
+I204
+ta(I228
+I204
+I234
+I202
+ta(I234
+I202
+I250
+I200
+ta(I250
+I200
+I270
+I197
+ta(I270
+I197
+I296
+I193
+ta(I296
+I193
+I324
+I189
+ta(I324
+I189
+I356
+I185
+ta(I356
+I185
+I392
+I181
+ta(I392
+I181
+I420
+I177
+ta(I420
+I177
+I446
+I175
+ta(I446
+I175
+I468
+I174
+ta(I468
+I174
+I471
+I174
+ta(I471
+I174
+I472
+I174
+ta(I472
+I174
+I471
+I174
+ta(I471
+I174
+I466
+I178
+ta(I466
+I178
+I448
+I181
+ta(I448
+I181
+I420
+I185
+ta(I420
+I185
+I390
+I189
+ta(I390
+I189
+I354
+I194
+ta(I354
+I194
+I318
+I197
+ta(I318
+I197
+I276
+I199
+ta(I276
+I199
+I246
+I201
+ta(I246
+I201
+I216
+I203
+ta(I216
+I203
+I190
+I204
+ta(I190
+I204
+I172
+I205
+ta(I172
+I205
+I166
+I206
+ta(I166
+I206
+I164
+I206
+ta(I164
+I206
+I164
+I207
+ta(I164
+I207
+I168
+I207
+ta(I168
+I207
+I188
+I207
+ta(I188
+I207
+I208
+I208
+ta(I208
+I208
+I232
+I208
+ta(I232
+I208
+I262
+I208
+ta(I262
+I208
+I294
+I209
+ta(I294
+I209
+I328
+I210
+ta(I328
+I210
+I358
+I212
+ta(I358
+I212
+I392
+I215
+ta(I392
+I215
+I424
+I217
+ta(I424
+I217
+I454
+I220
+ta(I454
+I220
+I478
+I223
+ta(I478
+I223
+I484
+I227
+ta(I484
+I227
+I485
+I229
+ta(I485
+I229
+I484
+I232
+ta(I484
+I232
+I478
+I235
+ta(I478
+I235
+I458
+I240
+ta(I458
+I240
+I426
+I244
+ta(I426
+I244
+I390
+I248
+ta(I390
+I248
+I352
+I253
+ta(I352
+I253
+I308
+I258
+ta(I308
+I258
+I276
+I261
+ta(I276
+I261
+I250
+I264
+ta(I250
+I264
+I226
+I268
+ta(I226
+I268
+I212
+I270
+ta(I212
+I270
+I208
+I272
+ta(I208
+I272
+I207
+I273
+ta(I207
+I273
+I206
+I273
+ta(I206
+I273
+I207
+I274
+ta(I207
+I274
+I213
+I274
+ta(I213
+I274
+I231
+I272
+ta(I231
+I272
+I255
+I269
+ta(I255
+I269
+I281
+I266
+ta(I281
+I266
+I309
+I263
+ta(I309
+I263
+I343
+I259
+ta(I343
+I259
+I373
+I255
+ta(I373
+I255
+I403
+I252
+ta(I403
+I252
+I429
+I248
+ta(I429
+I248
+I451
+I246
+ta(I451
+I246
+I467
+I243
+ta(I467
+I243
+I471
+I241
+ta(I471
+I241
+I469
+I240
+ta(I469
+I240
+I453
+I240
+ta(I453
+I240
+I433
+I240
+ta(I433
+I240
+I405
+I240
+ta(I405
+I240
+I375
+I242
+ta(I375
+I242
+I337
+I244
+ta(I337
+I244
+I305
+I246
+ta(I305
+I246
+I269
+I247
+ta(I269
+I247
+I239
+I249
+ta(I239
+I249
+I213
+I249
+ta(I213
+I249
+I189
+I249
+ta(I189
+I249
+I175
+I250
+ta(I175
+I250
+I173
+I251
+ta(I173
+I251
+I174
+I251
+ta(I174
+I251
+I188
+I247
+ta(I188
+I247
+I210
+I244
+ta(I210
+I244
+I238
+I239
+ta(I238
+I239
+I272
+I233
+ta(I272
+I233
+I304
+I230
+ta(I304
+I230
+I342
+I216
+ta(I342
+I216
+I380
+I202
+ta(I380
+I202
+I410
+I188
+ta(I410
+I188
+I440
+I174
+ta(I440
+I174
+I464
+I168
+ta(I464
+I168
+I480
+I164
+ta(I480
+I164
+I484
+I160
+ta(I484
+I160
+I484
+I158
+ta(I484
+I158
+I482
+I156
+ta(I482
+I156
+I468
+I154
+ta(I468
+I154
+I446
+I152
+ta(I446
+I152
+I418
+I152
+ta(I418
+I152
+I384
+I152
+ta(I384
+I152
+I340
+I152
+ta(I340
+I152
+I300
+I153
+ta(I300
+I153
+I268
+I155
+ta(I268
+I155
+I238
+I157
+ta(I238
+I157
+I220
+I158
+ta(I220
+I158
+I218
+I158
+ta(I218
+I158
+I219
+I158
+ta(I219
+I158
+I235
+I157
+ta(I235
+I157
+I255
+I154
+ta(I255
+I154
+I281
+I151
+ta(I281
+I151
+I313
+I147
+ta(I313
+I147
+I345
+I144
+ta(I345
+I144
+I377
+I140
+ta(I377
+I140
+I407
+I137
+ta(I407
+I137
+I431
+I134
+ta(I431
+I134
+I449
+I132
+ta(I449
+I132
+I451
+I131
+ta(I451
+I131
+I452
+I131
+ta(I452
+I131
+I449
+I131
+ta(I449
+I131
+I431
+I131
+ta(I431
+I131
+I407
+I132
+ta(I407
+I132
+I379
+I134
+ta(I379
+I134
+I347
+I135
+ta(I347
+I135
+I315
+I138
+ta(I315
+I138
+I281
+I140
+ta(I281
+I140
+I257
+I141
+ta(I257
+I141
+I237
+I142
+ta(I237
+I142
+I232
+I143
+ta(I232
+I143
+I231
+I143
+ta(I231
+I143
+I234
+I143
+ta(I234
+I143
+I256
+I139
+ta(I256
+I139
+I278
+I134
+ta(I278
+I134
+I306
+I120
+ta(I306
+I120
+I348
+I106
+ta(I348
+I106
+I384
+I100
+ta(I384
+I100
+I422
+I95
+ta(I422
+I95
+I448
+I91
+ta(I448
+I91
+I468
+I88
+ta(I468
+I88
+I473
+I85
+ta(I473
+I85
+I475
+I83
+ta(I475
+I83
+I474
+I82
+ta(I474
+I82
+I456
+I82
+ta(I456
+I82
+I434
+I84
+ta(I434
+I84
+I406
+I86
+ta(I406
+I86
+I372
+I87
+ta(I372
+I87
+I340
+I89
+ta(I340
+I89
+I310
+I91
+ta(I310
+I91
+I280
+I93
+ta(I280
+I93
+I260
+I95
+ta(I260
+I95
+I257
+I95
+ta(I257
+I95
+I260
+I95
+ta(I260
+I95
+I282
+I92
+ta(I282
+I92
+I302
+I89
+ta(I302
+I89
+I326
+I86
+ta(I326
+I86
+I350
+I82
+ta(I350
+I82
+I378
+I76
+ta(I378
+I76
+I402
+I72
+ta(I402
+I72
+I426
+I68
+ta(I426
+I68
+I448
+I64
+ta(I448
+I64
+I453
+I62
+ta(I453
+I62
+I456
+I60
+ta(I456
+I60
+I457
+I60
+ta(I457
+I60
+I453
+I60
+ta(I453
+I60
+I435
+I60
+ta(I435
+I60
+I417
+I60
+ta(I417
+I60
+I397
+I60
+ta(I397
+I60
+I377
+I60
+ta(I377
+I60
+I361
+I60
+ta(I361
+I60
+I355
+I61
+ta(I355
+I61
+I352
+I61
+ta(I352
+I61
+I350
+I62
+ta(I350
+I62
+I353
+I62
+ta(I353
+I62
+I371
+I59
+ta(I371
+I59
+I387
+I57
+ta(I387
+I57
+I405
+I53
+ta(I405
+I53
+I425
+I49
+ta(I425
+I49
+I443
+I44
+ta(I443
+I44
+I463
+I40
+ta(I463
+I40
+I483
+I35
+ta(I483
+I35
+I501
+I31
+ta(I501
+I31
+I515
+I28
+ta(I515
+I28
+I518
+I25
+ta(I518
+I25
+I521
+I24
+ta(I521
+I24
+I521
+I23
+ta(I521
+I23
+I517
+I22
+ta(I517
+I22
+I501
+I22
+ta(I501
+I22
+I483
+I23
+ta(I483
+I23
+I455
+I25
+ta(I455
+I25
+I427
+I27
+ta(I427
+I27
+I395
+I31
+ta(I395
+I31
+I363
+I35
+ta(I363
+I35
+I339
+I38
+ta(I339
+I38
+I321
+I40
+ta(I321
+I40
+I316
+I41
+ta(I316
+I41
+I315
+I42
+ta(I315
+I42
+I317
+I40
+ta(I317
+I40
+I333
+I36
+ta(I333
+I36
+I353
+I33
+ta(I353
+I33
+I373
+I30
+ta(I373
+I30
+I397
+I27
+ta(I397
+I27
+I421
+I23
+ta(I421
+I23
+I449
+I20
+ta(I449
+I20
+I477
+I18
+ta(I477
+I18
+I507
+I16
+ta(I507
+I16
+I543
+I14
+ta(I543
+I14
+I571
+I13
+ta(I571
+I13
+I601
+I11
+ta(I601
+I11
+I629
+I10
+ta(I629
+I10
+I649
+I10
+ta(I649
+I10
+I665
+I10
+ta(I665
+I10
+I667
+I11
+ta(I667
+I11
+I668
+I12
+ta(I668
+I12
+I667
+I13
+ta(I667
+I13
+I664
+I15
+ta(I664
+I15
+I650
+I19
+ta(I650
+I19
+I628
+I23
+ta(I628
+I23
+I604
+I29
+ta(I604
+I29
+I576
+I35
+ta(I576
+I35
+I548
+I40
+ta(I548
+I40
+I520
+I46
+ta(I520
+I46
+I492
+I51
+ta(I492
+I51
+I462
+I65
+ta(I462
+I65
+I434
+I71
+ta(I434
+I71
+I406
+I77
+ta(I406
+I77
+I380
+I81
+ta(I380
+I81
+I362
+I84
+ta(I362
+I84
+I357
+I87
+ta(I357
+I87
+I355
+I88
+ta(I355
+I88
+I361
+I88
+ta(I361
+I88
+I381
+I88
+ta(I381
+I88
+I403
+I85
+ta(I403
+I85
+I433
+I82
+ta(I433
+I82
+I467
+I78
+ta(I467
+I78
+I511
+I73
+ta(I511
+I73
+I549
+I68
+ta(I549
+I68
+I583
+I65
+ta(I583
+I65
+I619
+I60
+ta(I619
+I60
+I649
+I57
+ta(I649
+I57
+I673
+I55
+ta(I673
+I55
+I691
+I54
+ta(I691
+I54
+I692
+I53
+ta(I692
+I53
+I693
+I53
+ta(I693
+I53
+I692
+I53
+ta(I692
+I53
+I687
+I54
+ta(I687
+I54
+I671
+I56
+ta(I671
+I56
+I645
+I60
+ta(I645
+I60
+I613
+I63
+ta(I613
+I63
+I579
+I68
+ta(I579
+I68
+I549
+I71
+ta(I549
+I71
+I515
+I75
+ta(I515
+I75
+I489
+I79
+ta(I489
+I79
+I469
+I82
+ta(I469
+I82
+I455
+I84
+ta(I455
+I84
+I455
+I85
+ta(I455
+I85
+I459
+I85
+ta(I459
+I85
+I475
+I84
+ta(I475
+I84
+I499
+I81
+ta(I499
+I81
+I529
+I78
+ta(I529
+I78
+I571
+I74
+ta(I571
+I74
+I611
+I70
+ta(I611
+I70
+I649
+I66
+ta(I649
+I66
+I681
+I63
+ta(I681
+I63
+I707
+I59
+ta(I707
+I59
+I729
+I58
+ta(I729
+I58
+I733
+I57
+ta(I733
+I57
+I732
+I57
+ta(I732
+I57
+I726
+I57
+ta(I726
+I57
+I706
+I60
+ta(I706
+I60
+I680
+I63
+ta(I680
+I63
+I648
+I67
+ta(I648
+I67
+I608
+I71
+ta(I608
+I71
+I568
+I76
+ta(I568
+I76
+I536
+I79
+ta(I536
+I79
+I504
+I83
+ta(I504
+I83
+I482
+I87
+ta(I482
+I87
+I476
+I89
+ta(I476
+I89
+I475
+I90
+ta(I475
+I90
+I474
+I90
+ta(I474
+I90
+I477
+I90
+ta(I477
+I90
+I493
+I88
+ta(I493
+I88
+I517
+I86
+ta(I517
+I86
+I545
+I82
+ta(I545
+I82
+I577
+I79
+ta(I577
+I79
+I615
+I77
+ta(I615
+I77
+I645
+I75
+ta(I645
+I75
+I675
+I73
+ta(I675
+I73
+I701
+I72
+ta(I701
+I72
+I719
+I71
+ta(I719
+I71
+I721
+I71
+ta(I721
+I71
+I722
+I71
+ta(I722
+I71
+I720
+I72
+ta(I720
+I72
+I706
+I74
+ta(I706
+I74
+I686
+I77
+ta(I686
+I77
+I658
+I82
+ta(I658
+I82
+I624
+I87
+ta(I624
+I87
+I586
+I92
+ta(I586
+I92
+I552
+I96
+ta(I552
+I96
+I524
+I102
+ta(I524
+I102
+I498
+I108
+ta(I498
+I108
+I480
+I113
+ta(I480
+I113
+I476
+I116
+ta(I476
+I116
+I475
+I118
+ta(I475
+I118
+I474
+I120
+ta(I474
+I120
+I477
+I121
+ta(I477
+I121
+I483
+I121
+ta(I483
+I121
+I503
+I121
+ta(I503
+I121
+I525
+I120
+ta(I525
+I120
+I549
+I118
+ta(I549
+I118
+I575
+I116
+ta(I575
+I116
+I603
+I115
+ta(I603
+I115
+I629
+I113
+ta(I629
+I113
+I653
+I113
+ta(I653
+I113
+I671
+I113
+ta(I671
+I113
+I676
+I113
+ta(I676
+I113
+I677
+I114
+ta(I677
+I114
+I677
+I115
+ta(I677
+I115
+I675
+I118
+ta(I675
+I118
+I671
+I121
+ta(I671
+I121
+I651
+I125
+ta(I651
+I125
+I629
+I131
+ta(I629
+I131
+I599
+I136
+ta(I599
+I136
+I567
+I150
+ta(I567
+I150
+I533
+I156
+ta(I533
+I156
+I505
+I161
+ta(I505
+I161
+I479
+I167
+ta(I479
+I167
+I463
+I173
+ta(I463
+I173
+I460
+I175
+ta(I460
+I175
+I459
+I177
+ta(I459
+I177
+I459
+I178
+ta(I459
+I178
+I462
+I179
+ta(I462
+I179
+I476
+I180
+ta(I476
+I180
+I492
+I178
+ta(I492
+I178
+I516
+I177
+ta(I516
+I177
+I540
+I174
+ta(I540
+I174
+I568
+I171
+ta(I568
+I171
+I598
+I167
+ta(I598
+I167
+I626
+I163
+ta(I626
+I163
+I652
+I160
+ta(I652
+I160
+I678
+I157
+ta(I678
+I157
+I694
+I156
+ta(I694
+I156
+I697
+I155
+ta(I697
+I155
+I695
+I155
+ta(I695
+I155
+I675
+I155
+ta(I675
+I155
+I653
+I157
+ta(I653
+I157
+I625
+I160
+ta(I625
+I160
+I591
+I164
+ta(I591
+I164
+I553
+I168
+ta(I553
+I168
+I521
+I172
+ta(I521
+I172
+I491
+I177
+ta(I491
+I177
+I467
+I180
+ta(I467
+I180
+I453
+I184
+ta(I453
+I184
+I449
+I187
+ta(I449
+I187
+I449
+I188
+ta(I449
+I188
+I449
+I190
+ta(I449
+I190
+I455
+I190
+ta(I455
+I190
+I471
+I190
+ta(I471
+I190
+I495
+I189
+ta(I495
+I189
+I521
+I186
+ta(I521
+I186
+I551
+I184
+ta(I551
+I184
+I589
+I182
+ta(I589
+I182
+I617
+I180
+ta(I617
+I180
+I647
+I178
+ta(I647
+I178
+I673
+I177
+ta(I673
+I177
+I693
+I176
+ta(I693
+I176
+I696
+I176
+ta(I696
+I176
+I691
+I176
+ta(I691
+I176
+I669
+I180
+ta(I669
+I180
+I641
+I183
+ta(I641
+I183
+I607
+I187
+ta(I607
+I187
+I571
+I190
+ta(I571
+I190
+I529
+I194
+ta(I529
+I194
+I491
+I200
+ta(I491
+I200
+I461
+I203
+ta(I461
+I203
+I445
+I206
+ta(I445
+I206
+I442
+I209
+ta(I442
+I209
+I442
+I211
+ta(I442
+I211
+I443
+I212
+ta(I443
+I212
+I447
+I214
+ta(I447
+I214
+I465
+I215
+ta(I465
+I215
+I483
+I216
+ta(I483
+I216
+I507
+I216
+ta(I507
+I216
+I535
+I216
+ta(I535
+I216
+I565
+I216
+ta(I565
+I216
+I599
+I216
+ta(I599
+I216
+I625
+I216
+ta(I625
+I216
+I649
+I217
+ta(I649
+I217
+I667
+I219
+ta(I667
+I219
+I673
+I220
+ta(I673
+I220
+I676
+I222
+ta(I676
+I222
+I676
+I223
+ta(I676
+I223
+I674
+I224
+ta(I674
+I224
+I670
+I226
+ta(I670
+I226
+I650
+I229
+ta(I650
+I229
+I624
+I232
+ta(I624
+I232
+I592
+I235
+ta(I592
+I235
+I556
+I239
+ta(I556
+I239
+I518
+I243
+ta(I518
+I243
+I486
+I247
+ta(I486
+I247
+I462
+I250
+ta(I462
+I250
+I446
+I253
+ta(I446
+I253
+I443
+I255
+ta(I443
+I255
+I442
+I256
+ta(I442
+I256
+I443
+I257
+ta(I443
+I257
+I457
+I257
+ta(I457
+I257
+I475
+I257
+ta(I475
+I257
+I497
+I257
+ta(I497
+I257
+I523
+I257
+ta(I523
+I257
+I551
+I257
+ta(I551
+I257
+I583
+I257
+ta(I583
+I257
+I607
+I257
+ta(I607
+I257
+I629
+I256
+ta(I629
+I256
+I635
+I256
+ta(I635
+I256
+I637
+I256
+ta(I637
+I256
+I633
+I257
+ta(I633
+I257
+I615
+I259
+ta(I615
+I259
+I593
+I261
+ta(I593
+I261
+I561
+I265
+ta(I561
+I265
+I525
+I268
+ta(I525
+I268
+I493
+I271
+ta(I493
+I271
+I457
+I276
+ta(I457
+I276
+I431
+I280
+ta(I431
+I280
+I411
+I283
+ta(I411
+I283
+I397
+I287
+ta(I397
+I287
+I394
+I290
+ta(I394
+I290
+I394
+I292
+ta(I394
+I292
+I395
+I294
+ta(I395
+I294
+I399
+I295
+ta(I399
+I295
+I417
+I296
+ta(I417
+I296
+I437
+I297
+ta(I437
+I297
+I463
+I297
+ta(I463
+I297
+I491
+I297
+ta(I491
+I297
+I521
+I296
+ta(I521
+I296
+I553
+I295
+ta(I553
+I295
+I577
+I293
+ta(I577
+I293
+I597
+I292
+ta(I597
+I292
+I602
+I291
+ta(I602
+I291
+I605
+I291
+ta(I605
+I291
+I603
+I291
+ta(I603
+I291
+I589
+I291
+ta(I589
+I291
+I575
+I291
+ta(I575
+I291
+I555
+I293
+ta(I555
+I293
+I529
+I294
+ta(I529
+I294
+I501
+I296
+ta(I501
+I296
+I475
+I300
+ta(I475
+I300
+I459
+I303
+ta(I459
+I303
+I453
+I305
+ta(I453
+I305
+I452
+I307
+ta(I452
+I307
+I452
+I309
+ta(I452
+I309
+I453
+I312
+ta(I453
+I312
+I459
+I314
+ta(I459
+I314
+I475
+I315
+ta(I475
+I315
+I497
+I315
+ta(I497
+I315
+I523
+I315
+ta(I523
+I315
+I557
+I315
+ta(I557
+I315
+I591
+I315
+ta(I591
+I315
+I619
+I315
+ta(I619
+I315
+I645
+I315
+ta(I645
+I315
+I663
+I315
+ta(I663
+I315
+I666
+I315
+ta(I666
+I315
+I663
+I314
+ta(I663
+I314
+I658
+I314
+ta(I658
+I314
+I656
+I314
+ta(I656
+I314
+I630
+I314
+ta(I630
+I314
+I604
+I314
+ta(I604
+I314
+I556
+I314
+ta(I556
+I314
+I512
+I315
+ta(I512
+I315
+I478
+I317
+ta(I478
+I317
+I446
+I319
+ta(I446
+I319
+I424
+I321
+ta(I424
+I321
+I420
+I323
+ta(I420
+I323
+I424
+I324
+ta(I424
+I324
+I446
+I325
+ta(I446
+I325
+I470
+I325
+ta(I470
+I325
+I510
+I323
+ta(I510
+I323
+I552
+I321
+ta(I552
+I321
+I596
+I318
+ta(I596
+I318
+I646
+I316
+ta(I646
+I316
+I676
+I314
+ta(I676
+I314
+I694
+I314
+ta(I694
+I314
+I708
+I313
+ta(I708
+I313
+I706
+I313
+ta(I706
+I313
+I688
+I314
+ta(I688
+I314
+I674
+I315
+ta(I674
+I315
+I673
+I314
+ta(I673
+I314
+I631
+I314
+ta(I631
+I314
+I597
+I317
+ta(I597
+I317
+I563
+I321
+ta(I563
+I321
+I541
+I324
+ta(I541
+I324
+I535
+I327
+ta(I535
+I327
+I533
+I330
+ta(I533
+I330
+I533
+I332
+ta(I533
+I332
+I536
+I335
+ta(I536
+I335
+I541
+I337
+ta(I541
+I337
+I559
+I339
+ta(I559
+I339
+I583
+I340
+ta(I583
+I340
+I609
+I340
+ta(I609
+I340
+I641
+I340
+ta(I641
+I340
+I673
+I342
+ta(I673
+I342
+I697
+I344
+ta(I697
+I344
+I721
+I345
+ta(I721
+I345
+I727
+I346
+ta(I727
+I346
+I728
+I347
+ta(I728
+I347
+I729
+I348
+ta(I729
+I348
+I727
+I349
+ta(I727
+I349
+I724
+I351
+ta(I724
+I351
+I718
+I354
+ta(I718
+I354
+I712
+I357
+ta(I712
+I357
+I696
+I361
+ta(I696
+I361
+I682
+I364
+ta(I682
+I364
+I666
+I368
+ta(I666
+I368
+I661
+I371
+ta(I661
+I371
+I656
+I375
+ta(I656
+I375
+I653
+I378
+ta(I653
+I378
+I650
+I381
+ta(I650
+I381
+I649
+I382
+ta(I649
+I382
+I649
+I383
+ta(I649
+I383
+I650
+I383
+ta(I650
+I383
+I649
+I383
+ta(I649
+I383
+I621
+I383
+ta(I621
+I383
+I601
+I380
+ta(I601
+I380
+I587
+I379
+ta(I587
+I379
+I582
+I378
+ta(I582
+I378
+I576
+I377
+ta(I576
+I377
+I571
+I377
+ta(I571
+I377
+I557
+I377
+ta(I557
+I377
+I541
+I377
+ta(I541
+I377
+I517
+I378
+ta(I517
+I378
+I493
+I379
+ta(I493
+I379
+I473
+I381
+ta(I473
+I381
+I449
+I384
+ta(I449
+I384
+I435
+I387
+ta(I435
+I387
+I431
+I390
+ta(I431
+I390
+I428
+I393
+ta(I428
+I393
+I427
+I396
+ta(I427
+I396
+I427
+I398
+ta(I427
+I398
+I428
+I399
+ta(I428
+I399
+I432
+I400
+ta(I432
+I400
+I450
+I400
+ta(I450
+I400
+I468
+I400
+ta(I468
+I400
+I492
+I398
+ta(I492
+I398
+I518
+I396
+ta(I518
+I396
+I544
+I395
+ta(I544
+I395
+I574
+I393
+ta(I574
+I393
+I602
+I391
+ta(I602
+I391
+I626
+I390
+ta(I626
+I390
+I648
+I388
+ta(I648
+I388
+I662
+I387
+ta(I662
+I387
+I666
+I386
+ta(I666
+I386
+I668
+I386
+ta(I668
+I386
+I667
+I386
+ta(I667
+I386
+I663
+I385
+ta(I663
+I385
+I647
+I384
+ta(I647
+I384
+I627
+I383
+ta(I627
+I383
+I605
+I383
+ta(I605
+I383
+I573
+I383
+ta(I573
+I383
+I541
+I383
+ta(I541
+I383
+I511
+I383
+ta(I511
+I383
+I481
+I383
+ta(I481
+I383
+I455
+I383
+ta(I455
+I383
+I441
+I383
+ta(I441
+I383
+I440
+I383
+ta(I440
+I383
+I440
+I382
+ta(I440
+I382
+I442
+I381
+ta(I442
+I381
+I448
+I379
+ta(I448
+I379
+I468
+I375
+ta(I468
+I375
+I488
+I371
+ta(I488
+I371
+I512
+I366
+ta(I512
+I366
+I538
+I362
+ta(I538
+I362
+I568
+I358
+ta(I568
+I358
+I596
+I355
+ta(I596
+I355
+I624
+I352
+ta(I624
+I352
+I650
+I349
+ta(I650
+I349
+I670
+I347
+ta(I670
+I347
+I684
+I347
+ta(I684
+I347
+I686
+I346
+ta(I686
+I346
+I683
+I346
+ta(I683
+I346
+I667
+I347
+ta(I667
+I347
+I647
+I350
+ta(I647
+I350
+I619
+I353
+ta(I619
+I353
+I589
+I357
+ta(I589
+I357
+I557
+I361
+ta(I557
+I361
+I529
+I365
+ta(I529
+I365
+I501
+I379
+ta(I501
+I379
+I481
+I384
+ta(I481
+I384
+I475
+I387
+ta(I475
+I387
+I472
+I392
+ta(I472
+I392
+I471
+I395
+ta(I471
+I395
+I472
+I397
+ta(I472
+I397
+I478
+I398
+ta(I478
+I398
+I498
+I399
+ta(I498
+I399
+I518
+I399
+ta(I518
+I399
+I544
+I397
+ta(I544
+I397
+I574
+I396
+ta(I574
+I396
+I604
+I394
+ta(I604
+I394
+I634
+I393
+ta(I634
+I393
+I662
+I392
+ta(I662
+I392
+I686
+I392
+ta(I686
+I392
+I704
+I392
+ta(I704
+I392
+I707
+I393
+ta(I707
+I393
+I707
+I394
+ta(I707
+I394
+I706
+I396
+ta(I706
+I396
+I692
+I399
+ta(I692
+I399
+I674
+I403
+ta(I674
+I403
+I650
+I406
+ta(I650
+I406
+I618
+I410
+ta(I618
+I410
+I586
+I413
+ta(I586
+I413
+I554
+I417
+ta(I554
+I417
+I528
+I420
+ta(I528
+I420
+I506
+I424
+ta(I506
+I424
+I502
+I427
+ta(I502
+I427
+I499
+I429
+ta(I499
+I429
+I499
+I431
+ta(I499
+I431
+I502
+I433
+ta(I502
+I433
+I508
+I435
+ta(I508
+I435
+I526
+I436
+ta(I526
+I436
+I546
+I436
+ta(I546
+I436
+I570
+I436
+ta(I570
+I436
+I598
+I436
+ta(I598
+I436
+I624
+I436
+ta(I624
+I436
+I650
+I436
+ta(I650
+I436
+I672
+I436
+ta(I672
+I436
+I677
+I436
+ta(I677
+I436
+I678
+I436
+ta(I678
+I436
+I677
+I437
+ta(I677
+I437
+I674
+I438
+ta(I674
+I438
+I660
+I439
+ta(I660
+I439
+I642
+I440
+ta(I642
+I440
+I612
+I442
+ta(I612
+I442
+I580
+I444
+ta(I580
+I444
+I548
+I446
+ta(I548
+I446
+I516
+I448
+ta(I516
+I448
+I488
+I450
+ta(I488
+I450
+I466
+I453
+ta(I466
+I453
+I460
+I455
+ta(I460
+I455
+I459
+I456
+ta(I459
+I456
+I459
+I457
+ta(I459
+I457
+I463
+I458
+ta(I463
+I458
+I483
+I458
+ta(I483
+I458
+I505
+I458
+ta(I505
+I458
+I531
+I458
+ta(I531
+I458
+I561
+I456
+ta(I561
+I456
+I597
+I456
+ta(I597
+I456
+I625
+I456
+ta(I625
+I456
+I651
+I456
+ta(I651
+I456
+I675
+I456
+ta(I675
+I456
+I689
+I457
+ta(I689
+I457
+I693
+I458
+ta(I693
+I458
+I692
+I459
+ta(I692
+I459
+I688
+I461
+ta(I688
+I461
+I670
+I464
+ta(I670
+I464
+I646
+I467
+ta(I646
+I467
+I620
+I471
+ta(I620
+I471
+I586
+I476
+ta(I586
+I476
+I554
+I478
+ta(I554
+I478
+I522
+I483
+ta(I522
+I483
+I492
+I487
+ta(I492
+I487
+I468
+I491
+ta(I468
+I491
+I462
+I495
+ta(I462
+I495
+I460
+I499
+ta(I460
+I499
+I460
+I501
+ta(I460
+I501
+I465
+I502
+ta(I465
+I502
+I483
+I504
+ta(I483
+I504
+I509
+I505
+ta(I509
+I505
+I539
+I505
+ta(I539
+I505
+I577
+I505
+ta(I577
+I505
+I621
+I505
+ta(I621
+I505
+I663
+I504
+ta(I663
+I504
+I691
+I504
+ta(I691
+I504
+I729
+I504
+ta(I729
+I504
+I743
+I504
+ta(I743
+I504
+I742
+I504
+ta(I742
+I504
+I736
+I504
+ta(I736
+I504
+I702
+I505
+ta(I702
+I505
+I684
+I504
+ta(I684
+I504
+I654
+I504
+ta(I654
+I504
+I616
+I506
+ta(I616
+I506
+I582
+I508
+ta(I582
+I508
+I550
+I510
+ta(I550
+I510
+I526
+I514
+ta(I526
+I514
+I520
+I516
+ta(I520
+I516
+I519
+I518
+ta(I519
+I518
+I520
+I519
+ta(I520
+I519
+I534
+I520
+ta(I534
+I520
+I552
+I520
+ta(I552
+I520
+I578
+I520
+ta(I578
+I520
+I608
+I520
+ta(I608
+I520
+I638
+I518
+ta(I638
+I518
+I672
+I516
+ta(I672
+I516
+I700
+I515
+ta(I700
+I515
+I724
+I515
+ta(I724
+I515
+I742
+I515
+ta(I742
+I515
+I746
+I515
+ta(I746
+I515
+I743
+I516
+ta(I743
+I516
+I723
+I518
+ta(I723
+I518
+I701
+I520
+ta(I701
+I520
+I671
+I521
+ta(I671
+I521
+I641
+I523
+ta(I641
+I523
+I609
+I525
+ta(I609
+I525
+I579
+I527
+ta(I579
+I527
+I557
+I529
+ta(I557
+I529
+I552
+I531
+ta(I552
+I531
+I550
+I533
+ta(I550
+I533
+I551
+I535
+ta(I551
+I535
+I556
+I537
+ta(I556
+I537
+I576
+I539
+ta(I576
+I539
+I602
+I542
+ta(I602
+I542
+I630
+I543
+ta(I630
+I543
+I666
+I543
+ta(I666
+I543
+I700
+I543
+ta(I700
+I543
+I730
+I542
+ta(I730
+I542
+I756
+I540
+ta(I756
+I540
+I774
+I539
+ta(I774
+I539
+I776
+I538
+ta(I776
+I538
+I772
+I538
+ta(I772
+I538
+I748
+I539
+ta(I748
+I539
+I724
+I541
+ta(I724
+I541
+I698
+I544
+ta(I698
+I544
+I672
+I547
+ta(I672
+I547
+I650
+I551
+ta(I650
+I551
+I632
+I554
+ta(I632
+I554
+I626
+I556
+ta(I626
+I556
+I623
+I557
+ta(I623
+I557
+I620
+I559
+ta(I620
+I559
+I618
+I560
+ta(I618
+I560
+I617
+I560
+ta(I617
+I560
+I618
+I560
+ta(I618
+I560
+I617
+I559
+ta(I617
+I559
+I614
+I554
+tatp7
+a(S'Cyan'
+p8
+I1
+(lp9
+(I18
+I19
+I18
+I20
+ta(I18
+I20
+I17
+I24
+ta(I17
+I24
+I17
+I28
+ta(I17
+I28
+I17
+I42
+ta(I17
+I42
+I16
+I48
+ta(I16
+I48
+I16
+I62
+ta(I16
+I62
+I16
+I80
+ta(I16
+I80
+I16
+I100
+ta(I16
+I100
+I16
+I122
+ta(I16
+I122
+I16
+I146
+ta(I16
+I146
+I16
+I170
+ta(I16
+I170
+I17
+I196
+ta(I17
+I196
+I19
+I222
+ta(I19
+I222
+I20
+I248
+ta(I20
+I248
+I23
+I266
+ta(I23
+I266
+I25
+I271
+ta(I25
+I271
+I27
+I273
+ta(I27
+I273
+I28
+I269
+ta(I28
+I269
+I29
+I247
+ta(I29
+I247
+I30
+I227
+ta(I30
+I227
+I31
+I201
+ta(I31
+I201
+I31
+I173
+ta(I31
+I173
+I31
+I147
+ta(I31
+I147
+I31
+I119
+ta(I31
+I119
+I31
+I89
+ta(I31
+I89
+I31
+I63
+ta(I31
+I63
+I31
+I35
+ta(I31
+I35
+I31
+I11
+ta(I31
+I11
+I31
+I-11
+ta(I31
+I-11
+I30
+I-29
+ta(I30
+I-29
+I29
+I-43
+ta(I29
+I-43
+I28
+I-46
+ta(I28
+I-46
+I27
+I-47
+ta(I27
+I-47
+I27
+I-42
+ta(I27
+I-42
+I27
+I-24
+ta(I27
+I-24
+I29
+I-6
+ta(I29
+I-6
+I30
+I12
+ta(I30
+I12
+I32
+I32
+ta(I32
+I32
+I33
+I56
+ta(I33
+I56
+I34
+I78
+ta(I34
+I78
+I36
+I98
+ta(I36
+I98
+I37
+I120
+ta(I37
+I120
+I39
+I138
+ta(I39
+I138
+I42
+I156
+ta(I42
+I156
+I45
+I172
+ta(I45
+I172
+I48
+I177
+ta(I48
+I177
+I51
+I180
+ta(I51
+I180
+I53
+I181
+ta(I53
+I181
+I55
+I181
+ta(I55
+I181
+I56
+I180
+ta(I56
+I180
+I57
+I175
+ta(I57
+I175
+I59
+I161
+ta(I59
+I161
+I60
+I147
+ta(I60
+I147
+I61
+I131
+ta(I61
+I131
+I61
+I113
+ta(I61
+I113
+I61
+I93
+ta(I61
+I93
+I61
+I73
+ta(I61
+I73
+I61
+I51
+ta(I61
+I51
+I61
+I27
+ta(I61
+I27
+I61
+I7
+ta(I61
+I7
+I61
+I-15
+ta(I61
+I-15
+I61
+I-31
+ta(I61
+I-31
+I61
+I-36
+ta(I61
+I-36
+I61
+I-40
+ta(I61
+I-40
+I62
+I-42
+ta(I62
+I-42
+I62
+I-38
+ta(I62
+I-38
+I62
+I-16
+ta(I62
+I-16
+I62
+I4
+ta(I62
+I4
+I63
+I26
+ta(I63
+I26
+I65
+I52
+ta(I65
+I52
+I66
+I78
+ta(I66
+I78
+I68
+I104
+ta(I68
+I104
+I69
+I134
+ta(I69
+I134
+I70
+I160
+ta(I70
+I160
+I72
+I186
+ta(I72
+I186
+I74
+I208
+ta(I74
+I208
+I77
+I224
+ta(I77
+I224
+I80
+I228
+ta(I80
+I228
+I83
+I230
+ta(I83
+I230
+I85
+I230
+ta(I85
+I230
+I88
+I229
+ta(I88
+I229
+I91
+I224
+ta(I91
+I224
+I94
+I206
+ta(I94
+I206
+I97
+I190
+ta(I97
+I190
+I99
+I168
+ta(I99
+I168
+I101
+I146
+ta(I101
+I146
+I102
+I122
+ta(I102
+I122
+I102
+I98
+ta(I102
+I98
+I102
+I72
+ta(I102
+I72
+I101
+I48
+ta(I101
+I48
+I99
+I26
+ta(I99
+I26
+I98
+I6
+ta(I98
+I6
+I97
+I-8
+ta(I97
+I-8
+I96
+I-12
+ta(I96
+I-12
+I96
+I-14
+ta(I96
+I-14
+I96
+I-10
+ta(I96
+I-10
+I96
+I12
+ta(I96
+I12
+I97
+I32
+ta(I97
+I32
+I97
+I56
+ta(I97
+I56
+I99
+I82
+ta(I99
+I82
+I99
+I108
+ta(I99
+I108
+I99
+I136
+ta(I99
+I136
+I99
+I166
+ta(I99
+I166
+I99
+I192
+ta(I99
+I192
+I100
+I218
+ta(I100
+I218
+I102
+I244
+ta(I102
+I244
+I105
+I262
+ta(I105
+I262
+I108
+I267
+ta(I108
+I267
+I113
+I271
+ta(I113
+I271
+I117
+I273
+ta(I117
+I273
+I121
+I273
+ta(I121
+I273
+I125
+I270
+ta(I125
+I270
+I128
+I266
+ta(I128
+I266
+I132
+I248
+ta(I132
+I248
+I135
+I232
+ta(I135
+I232
+I137
+I210
+ta(I137
+I210
+I140
+I186
+ta(I140
+I186
+I141
+I162
+ta(I141
+I162
+I142
+I132
+ta(I142
+I132
+I142
+I106
+ta(I142
+I106
+I142
+I80
+ta(I142
+I80
+I140
+I54
+ta(I140
+I54
+I138
+I34
+ta(I138
+I34
+I137
+I18
+ta(I137
+I18
+I137
+I12
+ta(I137
+I12
+I136
+I9
+ta(I136
+I9
+I136
+I10
+ta(I136
+I10
+I136
+I32
+ta(I136
+I32
+I137
+I50
+ta(I137
+I50
+I139
+I74
+ta(I139
+I74
+I140
+I100
+ta(I140
+I100
+I142
+I124
+ta(I142
+I124
+I143
+I152
+ta(I143
+I152
+I145
+I180
+ta(I145
+I180
+I146
+I208
+ta(I146
+I208
+I147
+I234
+ta(I147
+I234
+I149
+I258
+ta(I149
+I258
+I151
+I276
+ta(I151
+I276
+I153
+I280
+ta(I153
+I280
+I156
+I283
+ta(I156
+I283
+I157
+I283
+ta(I157
+I283
+I158
+I283
+ta(I158
+I283
+I161
+I279
+ta(I161
+I279
+I162
+I263
+ta(I162
+I263
+I165
+I247
+ta(I165
+I247
+I168
+I225
+ta(I168
+I225
+I171
+I201
+ta(I171
+I201
+I174
+I177
+ta(I174
+I177
+I177
+I153
+ta(I177
+I153
+I178
+I125
+ta(I178
+I125
+I179
+I99
+ta(I179
+I99
+I180
+I75
+ta(I180
+I75
+I180
+I53
+ta(I180
+I53
+I179
+I33
+ta(I179
+I33
+I178
+I17
+ta(I178
+I17
+I177
+I13
+ta(I177
+I13
+I176
+I10
+ta(I176
+I10
+I175
+I10
+ta(I175
+I10
+I175
+I12
+ta(I175
+I12
+I175
+I34
+ta(I175
+I34
+I175
+I52
+ta(I175
+I52
+I175
+I76
+ta(I175
+I76
+I175
+I100
+ta(I175
+I100
+I175
+I126
+ta(I175
+I126
+I174
+I156
+ta(I174
+I156
+I173
+I184
+ta(I173
+I184
+I173
+I208
+ta(I173
+I208
+I173
+I232
+ta(I173
+I232
+I173
+I252
+ta(I173
+I252
+I174
+I258
+ta(I174
+I258
+I176
+I262
+ta(I176
+I262
+I177
+I263
+ta(I177
+I263
+I179
+I263
+ta(I179
+I263
+I180
+I261
+ta(I180
+I261
+I182
+I245
+ta(I182
+I245
+I184
+I229
+ta(I184
+I229
+I186
+I207
+ta(I186
+I207
+I187
+I183
+ta(I187
+I183
+I188
+I155
+ta(I188
+I155
+I189
+I129
+ta(I189
+I129
+I190
+I99
+ta(I190
+I99
+I191
+I73
+ta(I191
+I73
+I192
+I49
+ta(I192
+I49
+I193
+I27
+ta(I193
+I27
+I193
+I5
+ta(I193
+I5
+I193
+I-11
+ta(I193
+I-11
+I193
+I-16
+ta(I193
+I-16
+I193
+I-20
+ta(I193
+I-20
+I193
+I-21
+ta(I193
+I-21
+I193
+I-20
+ta(I193
+I-20
+I193
+I0
+ta(I193
+I0
+I193
+I18
+ta(I193
+I18
+I194
+I42
+ta(I194
+I42
+I195
+I66
+ta(I195
+I66
+I197
+I94
+ta(I197
+I94
+I199
+I122
+ta(I199
+I122
+I200
+I148
+ta(I200
+I148
+I203
+I178
+ta(I203
+I178
+I204
+I206
+ta(I204
+I206
+I206
+I230
+ta(I206
+I230
+I209
+I256
+ta(I209
+I256
+I212
+I274
+ta(I212
+I274
+I216
+I290
+ta(I216
+I290
+I220
+I292
+ta(I220
+I292
+I223
+I293
+ta(I223
+I293
+I225
+I293
+ta(I225
+I293
+I227
+I291
+ta(I227
+I291
+I229
+I277
+ta(I229
+I277
+I231
+I259
+ta(I231
+I259
+I234
+I237
+ta(I234
+I237
+I236
+I215
+ta(I236
+I215
+I238
+I185
+ta(I238
+I185
+I240
+I157
+ta(I240
+I157
+I242
+I129
+ta(I242
+I129
+I243
+I103
+ta(I243
+I103
+I245
+I73
+ta(I245
+I73
+I246
+I49
+ta(I246
+I49
+I246
+I29
+ta(I246
+I29
+I246
+I13
+ta(I246
+I13
+I245
+I9
+ta(I245
+I9
+I244
+I6
+ta(I244
+I6
+I243
+I12
+ta(I243
+I12
+I243
+I36
+ta(I243
+I36
+I243
+I60
+ta(I243
+I60
+I243
+I84
+ta(I243
+I84
+I243
+I112
+ta(I243
+I112
+I243
+I140
+ta(I243
+I140
+I243
+I172
+ta(I243
+I172
+I243
+I202
+ta(I243
+I202
+I244
+I230
+ta(I244
+I230
+I245
+I258
+ta(I245
+I258
+I246
+I282
+ta(I246
+I282
+I246
+I300
+ta(I246
+I300
+I248
+I303
+ta(I248
+I303
+I250
+I305
+ta(I250
+I305
+I251
+I305
+ta(I251
+I305
+I252
+I304
+ta(I252
+I304
+I255
+I290
+ta(I255
+I290
+I257
+I286
+ta(I257
+I286
+I260
+I266
+ta(I260
+I266
+I264
+I246
+ta(I264
+I246
+I267
+I224
+ta(I267
+I224
+I268
+I204
+ta(I268
+I204
+I269
+I180
+ta(I269
+I180
+I270
+I160
+ta(I270
+I160
+I270
+I140
+ta(I270
+I140
+I270
+I118
+ta(I270
+I118
+I270
+I100
+ta(I270
+I100
+I269
+I84
+ta(I269
+I84
+I268
+I70
+ta(I268
+I70
+I267
+I66
+ta(I267
+I66
+I266
+I63
+ta(I266
+I63
+I266
+I62
+ta(I266
+I62
+I266
+I67
+ta(I266
+I67
+I266
+I85
+ta(I266
+I85
+I268
+I105
+ta(I268
+I105
+I269
+I129
+ta(I269
+I129
+I271
+I155
+ta(I271
+I155
+I272
+I185
+ta(I272
+I185
+I274
+I213
+ta(I274
+I213
+I274
+I239
+ta(I274
+I239
+I276
+I267
+ta(I276
+I267
+I278
+I291
+ta(I278
+I291
+I280
+I311
+ta(I280
+I311
+I282
+I316
+ta(I282
+I316
+I284
+I319
+ta(I284
+I319
+I286
+I321
+ta(I286
+I321
+I288
+I321
+ta(I288
+I321
+I289
+I320
+ta(I289
+I320
+I290
+I302
+ta(I290
+I302
+I291
+I282
+ta(I291
+I282
+I292
+I281
+ta(I292
+I281
+I291
+I281
+ta(I291
+I281
+I291
+I259
+ta(I291
+I259
+I292
+I233
+ta(I292
+I233
+I291
+I209
+ta(I291
+I209
+I290
+I189
+ta(I290
+I189
+I288
+I169
+ta(I288
+I169
+I287
+I163
+ta(I287
+I163
+I287
+I160
+ta(I287
+I160
+I287
+I158
+ta(I287
+I158
+I287
+I159
+ta(I287
+I159
+I287
+I175
+ta(I287
+I175
+I289
+I193
+ta(I289
+I193
+I292
+I215
+ta(I292
+I215
+I295
+I241
+ta(I295
+I241
+I298
+I269
+ta(I298
+I269
+I302
+I299
+ta(I302
+I299
+I303
+I313
+ta(I303
+I313
+I306
+I337
+ta(I306
+I337
+I307
+I339
+ta(I307
+I339
+I308
+I353
+ta(I308
+I353
+I311
+I367
+ta(I311
+I367
+I310
+I369
+ta(I310
+I369
+I311
+I372
+ta(I311
+I372
+I312
+I368
+ta(I312
+I368
+I312
+I366
+ta(I312
+I366
+I313
+I365
+ta(I313
+I365
+I312
+I335
+ta(I312
+I335
+I310
+I301
+ta(I310
+I301
+I310
+I287
+ta(I310
+I287
+I310
+I261
+ta(I310
+I261
+I309
+I233
+ta(I309
+I233
+I307
+I207
+ta(I307
+I207
+I306
+I185
+ta(I306
+I185
+I305
+I167
+ta(I305
+I167
+I304
+I153
+ta(I304
+I153
+I303
+I149
+ta(I303
+I149
+I303
+I147
+ta(I303
+I147
+I304
+I149
+ta(I304
+I149
+I306
+I171
+ta(I306
+I171
+I309
+I193
+ta(I309
+I193
+I312
+I217
+ta(I312
+I217
+I316
+I243
+ta(I316
+I243
+I320
+I271
+ta(I320
+I271
+I323
+I301
+ta(I323
+I301
+I327
+I329
+ta(I327
+I329
+I330
+I353
+ta(I330
+I353
+I333
+I379
+ta(I333
+I379
+I336
+I395
+ta(I336
+I395
+I340
+I411
+ta(I340
+I411
+I343
+I414
+ta(I343
+I414
+I345
+I415
+ta(I345
+I415
+I346
+I416
+ta(I346
+I416
+I347
+I414
+ta(I347
+I414
+I348
+I408
+ta(I348
+I408
+I348
+I406
+ta(I348
+I406
+I349
+I388
+ta(I349
+I388
+I349
+I384
+ta(I349
+I384
+I349
+I352
+ta(I349
+I352
+I349
+I324
+ta(I349
+I324
+I349
+I294
+ta(I349
+I294
+I373
+I294
+ta(I373
+I294
+I393
+I314
+ta(I393
+I314
+I457
+I360
+ta(I457
+I360
+I513
+I404
+ta(I513
+I404
+I591
+I432
+ta(I591
+I432
+I665
+I448
+ta(I665
+I448
+I664
+I474
+ta(I664
+I474
+I586
+I512
+ta(I586
+I512
+I508
+I556
+ta(I508
+I556
+I410
+I616
+ta(I410
+I616
+I316
+I678
+ta(I316
+I678
+I220
+I740
+ta(I220
+I740
+I158
+I804
+ta(I158
+I804
+I90
+I853
+ta(I90
+I853
+I40
+I853
+ta(I40
+I853
+I-16
+I853
+ta(I-16
+I853
+I-66
+I853
+ta(I-66
+I853
+I-96
+I852
+ta(I-96
+I852
+I-130
+I853
+ta(I-130
+I853
+I-154
+I775
+ta(I-154
+I775
+I-180
+I703
+ta(I-180
+I703
+I-196
+I755
+ta(I-196
+I755
+I-194
+I773
+ta(I-194
+I773
+I-192
+I776
+ta(I-192
+I776
+I-191
+I777
+ta(I-191
+I777
+I-190
+I776
+ta(I-190
+I776
+I-190
+I770
+ta(I-190
+I770
+I-190
+I750
+ta(I-190
+I750
+I-190
+I724
+ta(I-190
+I724
+I-191
+I694
+ta(I-191
+I694
+I-191
+I662
+ta(I-191
+I662
+I-191
+I628
+ta(I-191
+I628
+I-191
+I596
+ta(I-191
+I596
+I-193
+I568
+ta(I-193
+I568
+I-196
+I544
+ta(I-196
+I544
+I-201
+I524
+ta(I-201
+I524
+I-206
+I508
+ta(I-206
+I508
+I-212
+I506
+ta(I-212
+I506
+I-213
+I506
+tatp10
+a(g8
+I1
+(lp11
+(I288
+I12
+I288
+I16
+ta(I288
+I16
+I288
+I19
+ta(I288
+I19
+I289
+I23
+ta(I289
+I23
+I290
+I28
+ta(I290
+I28
+I290
+I34
+ta(I290
+I34
+I291
+I48
+ta(I291
+I48
+I291
+I66
+ta(I291
+I66
+I291
+I84
+ta(I291
+I84
+I291
+I106
+ta(I291
+I106
+I291
+I130
+ta(I291
+I130
+I291
+I154
+ta(I291
+I154
+I291
+I182
+ta(I291
+I182
+I291
+I208
+ta(I291
+I208
+I292
+I236
+ta(I292
+I236
+I292
+I262
+ta(I292
+I262
+I293
+I284
+ta(I293
+I284
+I293
+I300
+ta(I293
+I300
+I295
+I306
+ta(I295
+I306
+I295
+I309
+ta(I295
+I309
+I296
+I310
+ta(I296
+I310
+I297
+I310
+ta(I297
+I310
+I298
+I294
+ta(I298
+I294
+I298
+I274
+ta(I298
+I274
+I298
+I248
+ta(I298
+I248
+I298
+I220
+ta(I298
+I220
+I298
+I188
+ta(I298
+I188
+I298
+I148
+ta(I298
+I148
+I298
+I116
+ta(I298
+I116
+I298
+I82
+ta(I298
+I82
+I298
+I46
+ta(I298
+I46
+I298
+I10
+ta(I298
+I10
+I298
+I-20
+ta(I298
+I-20
+I298
+I-50
+ta(I298
+I-50
+I300
+I-76
+ta(I300
+I-76
+I302
+I-94
+ta(I302
+I-94
+I303
+I-110
+ta(I303
+I-110
+I304
+I-113
+ta(I304
+I-113
+I305
+I-113
+ta(I305
+I-113
+I305
+I-112
+ta(I305
+I-112
+I305
+I-92
+ta(I305
+I-92
+I308
+I-74
+ta(I308
+I-74
+I310
+I-48
+ta(I310
+I-48
+I312
+I-24
+ta(I312
+I-24
+I313
+I2
+ta(I313
+I2
+I315
+I30
+ta(I315
+I30
+I317
+I60
+ta(I317
+I60
+I319
+I84
+ta(I319
+I84
+I322
+I108
+ta(I322
+I108
+I326
+I134
+ta(I326
+I134
+I329
+I150
+ta(I329
+I150
+I332
+I166
+ta(I332
+I166
+I336
+I172
+ta(I336
+I172
+I339
+I176
+ta(I339
+I176
+I343
+I177
+ta(I343
+I177
+I345
+I178
+ta(I345
+I178
+I346
+I179
+ta(I346
+I179
+I347
+I179
+ta(I347
+I179
+I347
+I176
+ta(I347
+I176
+I348
+I171
+ta(I348
+I171
+I348
+I157
+ta(I348
+I157
+I348
+I141
+ta(I348
+I141
+I348
+I119
+ta(I348
+I119
+I349
+I97
+ta(I349
+I97
+I351
+I71
+ta(I351
+I71
+I353
+I41
+ta(I353
+I41
+I355
+I9
+ta(I355
+I9
+I358
+I-21
+ta(I358
+I-21
+I362
+I-51
+ta(I362
+I-51
+I365
+I-79
+ta(I365
+I-79
+I368
+I-101
+ta(I368
+I-101
+I371
+I-117
+ta(I371
+I-117
+I373
+I-121
+ta(I373
+I-121
+I373
+I-122
+ta(I373
+I-122
+I373
+I-121
+ta(I373
+I-121
+I374
+I-101
+ta(I374
+I-101
+I375
+I-81
+ta(I375
+I-81
+I375
+I-57
+ta(I375
+I-57
+I375
+I-33
+ta(I375
+I-33
+I375
+I-7
+ta(I375
+I-7
+I375
+I23
+ta(I375
+I23
+I375
+I51
+ta(I375
+I51
+I375
+I81
+ta(I375
+I81
+I375
+I109
+ta(I375
+I109
+I375
+I137
+ta(I375
+I137
+I375
+I163
+ta(I375
+I163
+I375
+I183
+ta(I375
+I183
+I376
+I199
+ta(I376
+I199
+I377
+I202
+ta(I377
+I202
+I379
+I203
+ta(I379
+I203
+I380
+I203
+ta(I380
+I203
+I381
+I200
+ta(I381
+I200
+I383
+I184
+ta(I383
+I184
+I383
+I170
+ta(I383
+I170
+I384
+I154
+ta(I384
+I154
+I386
+I130
+ta(I386
+I130
+I387
+I108
+ta(I387
+I108
+I388
+I84
+ta(I388
+I84
+I390
+I58
+ta(I390
+I58
+I391
+I32
+ta(I391
+I32
+I393
+I8
+ta(I393
+I8
+I395
+I-12
+ta(I395
+I-12
+I396
+I-30
+ta(I396
+I-30
+I397
+I-36
+ta(I397
+I-36
+I397
+I-39
+ta(I397
+I-39
+I397
+I-34
+ta(I397
+I-34
+I397
+I-10
+ta(I397
+I-10
+I397
+I12
+ta(I397
+I12
+I397
+I32
+ta(I397
+I32
+I397
+I58
+ta(I397
+I58
+I397
+I84
+ta(I397
+I84
+I397
+I110
+ta(I397
+I110
+I397
+I140
+ta(I397
+I140
+I397
+I166
+ta(I397
+I166
+I397
+I190
+ta(I397
+I190
+I398
+I216
+ta(I398
+I216
+I399
+I236
+ta(I399
+I236
+I400
+I252
+ta(I400
+I252
+I402
+I268
+ta(I402
+I268
+I404
+I270
+ta(I404
+I270
+I405
+I272
+ta(I405
+I272
+I406
+I272
+ta(I406
+I272
+I407
+I269
+ta(I407
+I269
+I408
+I263
+ta(I408
+I263
+I409
+I247
+ta(I409
+I247
+I412
+I229
+ta(I412
+I229
+I414
+I205
+ta(I414
+I205
+I418
+I181
+ta(I418
+I181
+I421
+I155
+ta(I421
+I155
+I424
+I129
+ta(I424
+I129
+I427
+I101
+ta(I427
+I101
+I429
+I71
+ta(I429
+I71
+I432
+I47
+ta(I432
+I47
+I434
+I25
+ta(I434
+I25
+I437
+I5
+ta(I437
+I5
+I439
+I-9
+ta(I439
+I-9
+I440
+I-13
+ta(I440
+I-13
+I441
+I-15
+ta(I441
+I-15
+I441
+I-11
+ta(I441
+I-11
+I441
+I15
+ta(I441
+I15
+I441
+I35
+ta(I441
+I35
+I441
+I59
+ta(I441
+I59
+I441
+I89
+ta(I441
+I89
+I441
+I117
+ta(I441
+I117
+I441
+I145
+ta(I441
+I145
+I442
+I173
+ta(I442
+I173
+I443
+I199
+ta(I443
+I199
+I445
+I225
+ta(I445
+I225
+I447
+I247
+ta(I447
+I247
+I448
+I253
+ta(I448
+I253
+I450
+I256
+ta(I450
+I256
+I452
+I258
+ta(I452
+I258
+I453
+I258
+ta(I453
+I258
+I455
+I252
+ta(I455
+I252
+I457
+I234
+ta(I457
+I234
+I458
+I214
+ta(I458
+I214
+I461
+I190
+ta(I461
+I190
+I463
+I160
+ta(I463
+I160
+I464
+I130
+ta(I464
+I130
+I466
+I98
+ta(I466
+I98
+I468
+I64
+ta(I468
+I64
+I470
+I34
+ta(I470
+I34
+I471
+I8
+ta(I471
+I8
+I472
+I-18
+ta(I472
+I-18
+I473
+I-42
+ta(I473
+I-42
+I474
+I-62
+ta(I474
+I-62
+I475
+I-76
+ta(I475
+I-76
+I476
+I-80
+ta(I476
+I-80
+I476
+I-82
+ta(I476
+I-82
+I476
+I-77
+ta(I476
+I-77
+I476
+I-55
+ta(I476
+I-55
+I478
+I-33
+ta(I478
+I-33
+I480
+I-9
+ta(I480
+I-9
+I481
+I17
+ta(I481
+I17
+I483
+I45
+ta(I483
+I45
+I485
+I73
+ta(I485
+I73
+I488
+I99
+ta(I488
+I99
+I491
+I123
+ta(I491
+I123
+I494
+I145
+ta(I494
+I145
+I500
+I163
+ta(I500
+I163
+I503
+I177
+ta(I503
+I177
+I507
+I181
+ta(I507
+I181
+I511
+I183
+ta(I511
+I183
+I515
+I185
+ta(I515
+I185
+I519
+I185
+ta(I519
+I185
+I521
+I184
+ta(I521
+I184
+I524
+I180
+ta(I524
+I180
+I526
+I176
+ta(I526
+I176
+I528
+I158
+ta(I528
+I158
+I530
+I140
+ta(I530
+I140
+I531
+I120
+ta(I531
+I120
+I531
+I94
+ta(I531
+I94
+I531
+I66
+ta(I531
+I66
+I531
+I38
+ta(I531
+I38
+I531
+I10
+ta(I531
+I10
+I532
+I-16
+ta(I532
+I-16
+I534
+I-42
+ta(I534
+I-42
+I536
+I-64
+ta(I536
+I-64
+I537
+I-78
+ta(I537
+I-78
+I538
+I-84
+ta(I538
+I-84
+I539
+I-86
+ta(I539
+I-86
+I539
+I-82
+ta(I539
+I-82
+I540
+I-58
+ta(I540
+I-58
+I541
+I-36
+ta(I541
+I-36
+I543
+I-12
+ta(I543
+I-12
+I544
+I16
+ta(I544
+I16
+I546
+I44
+ta(I546
+I44
+I548
+I70
+ta(I548
+I70
+I549
+I96
+ta(I549
+I96
+I551
+I122
+ta(I551
+I122
+I554
+I144
+ta(I554
+I144
+I557
+I162
+ta(I557
+I162
+I560
+I178
+ta(I560
+I178
+I562
+I182
+ta(I562
+I182
+I565
+I185
+ta(I565
+I185
+I566
+I187
+ta(I566
+I187
+I568
+I187
+ta(I568
+I187
+I569
+I186
+ta(I569
+I186
+I570
+I181
+ta(I570
+I181
+I571
+I167
+ta(I571
+I167
+I573
+I151
+ta(I573
+I151
+I574
+I131
+ta(I574
+I131
+I575
+I109
+ta(I575
+I109
+I576
+I89
+ta(I576
+I89
+I578
+I65
+ta(I578
+I65
+I579
+I43
+ta(I579
+I43
+I581
+I23
+ta(I581
+I23
+I582
+I3
+ta(I582
+I3
+I583
+I-13
+ta(I583
+I-13
+I584
+I-18
+ta(I584
+I-18
+I585
+I-23
+ta(I585
+I-23
+I585
+I-24
+ta(I585
+I-24
+I585
+I-18
+ta(I585
+I-18
+I585
+I6
+ta(I585
+I6
+I586
+I26
+ta(I586
+I26
+I587
+I48
+ta(I587
+I48
+I588
+I74
+ta(I588
+I74
+I589
+I98
+ta(I589
+I98
+I590
+I122
+ta(I590
+I122
+I592
+I148
+ta(I592
+I148
+I594
+I170
+ta(I594
+I170
+I595
+I190
+ta(I595
+I190
+I596
+I210
+ta(I596
+I210
+I597
+I224
+ta(I597
+I224
+I599
+I228
+ta(I599
+I228
+I600
+I230
+ta(I600
+I230
+I601
+I230
+ta(I601
+I230
+I602
+I228
+ta(I602
+I228
+I603
+I212
+ta(I603
+I212
+I605
+I198
+ta(I605
+I198
+I608
+I178
+ta(I608
+I178
+I609
+I158
+ta(I609
+I158
+I610
+I134
+ta(I610
+I134
+I612
+I110
+ta(I612
+I110
+I613
+I84
+ta(I613
+I84
+I615
+I60
+ta(I615
+I60
+I615
+I34
+ta(I615
+I34
+I615
+I14
+ta(I615
+I14
+I615
+I-4
+ta(I615
+I-4
+I615
+I-18
+ta(I615
+I-18
+I615
+I-23
+ta(I615
+I-23
+I615
+I-25
+ta(I615
+I-25
+I615
+I-24
+ta(I615
+I-24
+I615
+I-6
+ta(I615
+I-6
+I615
+I8
+ta(I615
+I8
+I615
+I28
+ta(I615
+I28
+I615
+I50
+ta(I615
+I50
+I616
+I74
+ta(I616
+I74
+I616
+I100
+ta(I616
+I100
+I616
+I124
+ta(I616
+I124
+I618
+I144
+ta(I618
+I144
+I619
+I164
+ta(I619
+I164
+I620
+I182
+ta(I620
+I182
+I622
+I196
+ta(I622
+I196
+I623
+I201
+ta(I623
+I201
+I624
+I204
+ta(I624
+I204
+I624
+I206
+ta(I624
+I206
+I625
+I206
+ta(I625
+I206
+I626
+I206
+ta(I626
+I206
+I627
+I201
+ta(I627
+I201
+I628
+I187
+ta(I628
+I187
+I629
+I171
+ta(I629
+I171
+I629
+I151
+ta(I629
+I151
+I630
+I129
+ta(I630
+I129
+I631
+I109
+ta(I631
+I109
+I632
+I83
+ta(I632
+I83
+I632
+I57
+ta(I632
+I57
+I632
+I35
+ta(I632
+I35
+I633
+I11
+ta(I633
+I11
+I634
+I-9
+ta(I634
+I-9
+I635
+I-25
+ta(I635
+I-25
+I636
+I-30
+ta(I636
+I-30
+I637
+I-33
+ta(I637
+I-33
+I637
+I-35
+ta(I637
+I-35
+I637
+I-32
+ta(I637
+I-32
+I638
+I-14
+ta(I638
+I-14
+I639
+I4
+ta(I639
+I4
+I642
+I24
+ta(I642
+I24
+I645
+I48
+ta(I645
+I48
+I648
+I70
+ta(I648
+I70
+I651
+I92
+ta(I651
+I92
+I653
+I114
+ta(I653
+I114
+I656
+I132
+ta(I656
+I132
+I659
+I150
+ta(I659
+I150
+I662
+I164
+ta(I662
+I164
+I664
+I169
+ta(I664
+I169
+I667
+I173
+ta(I667
+I173
+I669
+I175
+ta(I669
+I175
+I670
+I175
+ta(I670
+I175
+I671
+I175
+ta(I671
+I175
+I671
+I169
+ta(I671
+I169
+I671
+I163
+ta(I671
+I163
+I671
+I147
+ta(I671
+I147
+I670
+I129
+ta(I670
+I129
+I669
+I111
+ta(I669
+I111
+I669
+I91
+ta(I669
+I91
+I669
+I67
+ta(I669
+I67
+I669
+I49
+ta(I669
+I49
+I670
+I27
+ta(I670
+I27
+I671
+I7
+ta(I671
+I7
+I671
+I-13
+ta(I671
+I-13
+I672
+I-27
+ta(I672
+I-27
+I673
+I-32
+ta(I673
+I-32
+I673
+I-35
+ta(I673
+I-35
+I673
+I-30
+ta(I673
+I-30
+I674
+I-14
+ta(I674
+I-14
+I675
+I6
+ta(I675
+I6
+I676
+I22
+ta(I676
+I22
+I677
+I42
+ta(I677
+I42
+I679
+I64
+ta(I679
+I64
+I681
+I84
+ta(I681
+I84
+I683
+I106
+ta(I683
+I106
+I685
+I126
+ta(I685
+I126
+I688
+I148
+ta(I688
+I148
+I691
+I168
+ta(I691
+I168
+I694
+I182
+ta(I694
+I182
+I695
+I187
+ta(I695
+I187
+I696
+I190
+ta(I696
+I190
+I697
+I192
+ta(I697
+I192
+I697
+I193
+ta(I697
+I193
+I697
+I192
+ta(I697
+I192
+I695
+I190
+ta(I695
+I190
+I695
+I189
+tatp12
+a(g8
+I1
+(lp13
+(I683
+I229
+I682
+I233
+ta(I682
+I233
+I682
+I239
+ta(I682
+I239
+I681
+I245
+ta(I681
+I245
+I681
+I251
+ta(I681
+I251
+I681
+I257
+ta(I681
+I257
+I681
+I273
+ta(I681
+I273
+I681
+I289
+ta(I681
+I289
+I681
+I307
+ta(I681
+I307
+I681
+I327
+ta(I681
+I327
+I681
+I345
+ta(I681
+I345
+I683
+I365
+ta(I683
+I365
+I684
+I389
+ta(I684
+I389
+I685
+I409
+ta(I685
+I409
+I686
+I431
+ta(I686
+I431
+I688
+I447
+ta(I688
+I447
+I689
+I452
+ta(I689
+I452
+I690
+I457
+ta(I690
+I457
+I690
+I459
+ta(I690
+I459
+I691
+I459
+ta(I691
+I459
+I691
+I456
+ta(I691
+I456
+I691
+I436
+ta(I691
+I436
+I691
+I418
+ta(I691
+I418
+I690
+I394
+ta(I690
+I394
+I688
+I370
+ta(I688
+I370
+I687
+I342
+ta(I687
+I342
+I687
+I314
+ta(I687
+I314
+I687
+I284
+ta(I687
+I284
+I687
+I254
+ta(I687
+I254
+I688
+I226
+ta(I688
+I226
+I690
+I202
+ta(I690
+I202
+I691
+I180
+ta(I691
+I180
+I692
+I160
+ta(I692
+I160
+I692
+I146
+ta(I692
+I146
+I692
+I143
+ta(I692
+I143
+I692
+I141
+ta(I692
+I141
+I692
+I146
+ta(I692
+I146
+I692
+I166
+ta(I692
+I166
+I692
+I184
+ta(I692
+I184
+I692
+I204
+ta(I692
+I204
+I692
+I226
+ta(I692
+I226
+I692
+I250
+ta(I692
+I250
+I692
+I274
+ta(I692
+I274
+I692
+I298
+ta(I692
+I298
+I692
+I322
+ta(I692
+I322
+I692
+I342
+ta(I692
+I342
+I692
+I360
+ta(I692
+I360
+I692
+I378
+ta(I692
+I378
+I692
+I382
+ta(I692
+I382
+I692
+I386
+ta(I692
+I386
+I692
+I388
+ta(I692
+I388
+I692
+I387
+ta(I692
+I387
+I692
+I369
+ta(I692
+I369
+I691
+I353
+ta(I691
+I353
+I689
+I333
+ta(I689
+I333
+I688
+I311
+ta(I688
+I311
+I686
+I287
+ta(I686
+I287
+I683
+I263
+ta(I683
+I263
+I682
+I241
+ta(I682
+I241
+I680
+I221
+ta(I680
+I221
+I678
+I201
+ta(I678
+I201
+I676
+I183
+ta(I676
+I183
+I674
+I177
+ta(I674
+I177
+I672
+I173
+ta(I672
+I173
+I671
+I171
+ta(I671
+I171
+I670
+I176
+ta(I670
+I176
+I668
+I198
+ta(I668
+I198
+I668
+I216
+ta(I668
+I216
+I667
+I240
+ta(I667
+I240
+I665
+I264
+ta(I665
+I264
+I664
+I288
+ta(I664
+I288
+I662
+I312
+ta(I662
+I312
+I660
+I338
+ta(I660
+I338
+I659
+I360
+ta(I659
+I360
+I656
+I382
+ta(I656
+I382
+I655
+I400
+ta(I655
+I400
+I654
+I416
+ta(I654
+I416
+I653
+I421
+ta(I653
+I421
+I653
+I423
+ta(I653
+I423
+I654
+I418
+ta(I654
+I418
+I655
+I394
+ta(I655
+I394
+I655
+I378
+ta(I655
+I378
+I655
+I356
+ta(I655
+I356
+I654
+I332
+ta(I654
+I332
+I652
+I308
+ta(I652
+I308
+I649
+I282
+ta(I649
+I282
+I647
+I260
+ta(I647
+I260
+I644
+I238
+ta(I644
+I238
+I641
+I220
+ta(I641
+I220
+I638
+I202
+ta(I638
+I202
+I636
+I196
+ta(I636
+I196
+I635
+I193
+ta(I635
+I193
+I634
+I191
+ta(I634
+I191
+I633
+I191
+ta(I633
+I191
+I632
+I196
+ta(I632
+I196
+I631
+I216
+ta(I631
+I216
+I630
+I234
+ta(I630
+I234
+I629
+I254
+ta(I629
+I254
+I627
+I280
+ta(I627
+I280
+I625
+I304
+ta(I625
+I304
+I624
+I330
+ta(I624
+I330
+I622
+I354
+ta(I622
+I354
+I621
+I376
+ta(I621
+I376
+I620
+I394
+ta(I620
+I394
+I618
+I412
+ta(I618
+I412
+I618
+I416
+ta(I618
+I416
+I618
+I420
+ta(I618
+I420
+I618
+I422
+ta(I618
+I422
+I618
+I418
+ta(I618
+I418
+I618
+I396
+ta(I618
+I396
+I618
+I378
+ta(I618
+I378
+I618
+I356
+ta(I618
+I356
+I618
+I332
+ta(I618
+I332
+I618
+I306
+ta(I618
+I306
+I618
+I282
+ta(I618
+I282
+I617
+I258
+ta(I617
+I258
+I615
+I238
+ta(I615
+I238
+I614
+I220
+ta(I614
+I220
+I613
+I214
+ta(I613
+I214
+I612
+I210
+ta(I612
+I210
+I611
+I209
+ta(I611
+I209
+I609
+I212
+ta(I609
+I212
+I608
+I230
+ta(I608
+I230
+I605
+I248
+ta(I605
+I248
+I603
+I266
+ta(I603
+I266
+I600
+I288
+ta(I600
+I288
+I597
+I310
+ta(I597
+I310
+I595
+I330
+ta(I595
+I330
+I592
+I354
+ta(I592
+I354
+I589
+I374
+ta(I589
+I374
+I588
+I394
+ta(I588
+I394
+I587
+I412
+ta(I587
+I412
+I586
+I417
+ta(I586
+I417
+I586
+I420
+ta(I586
+I420
+I586
+I419
+ta(I586
+I419
+I586
+I399
+ta(I586
+I399
+I586
+I383
+ta(I586
+I383
+I585
+I365
+ta(I585
+I365
+I583
+I345
+ta(I583
+I345
+I582
+I321
+ta(I582
+I321
+I580
+I299
+ta(I580
+I299
+I578
+I279
+ta(I578
+I279
+I574
+I257
+ta(I574
+I257
+I571
+I237
+ta(I571
+I237
+I567
+I219
+ta(I567
+I219
+I563
+I203
+ta(I563
+I203
+I559
+I198
+ta(I559
+I198
+I555
+I193
+ta(I555
+I193
+I552
+I191
+ta(I552
+I191
+I551
+I191
+ta(I551
+I191
+I550
+I196
+ta(I550
+I196
+I548
+I216
+ta(I548
+I216
+I547
+I232
+ta(I547
+I232
+I547
+I254
+ta(I547
+I254
+I547
+I278
+ta(I547
+I278
+I547
+I302
+ta(I547
+I302
+I547
+I326
+ta(I547
+I326
+I547
+I350
+ta(I547
+I350
+I547
+I374
+ta(I547
+I374
+I547
+I394
+ta(I547
+I394
+I547
+I412
+ta(I547
+I412
+I547
+I426
+ta(I547
+I426
+I547
+I429
+ta(I547
+I429
+I548
+I432
+ta(I548
+I432
+I548
+I433
+ta(I548
+I433
+I549
+I433
+ta(I549
+I433
+I550
+I431
+ta(I550
+I431
+I550
+I426
+ta(I550
+I426
+I550
+I412
+ta(I550
+I412
+I550
+I396
+ta(I550
+I396
+I550
+I378
+ta(I550
+I378
+I549
+I358
+ta(I549
+I358
+I548
+I334
+ta(I548
+I334
+I547
+I308
+ta(I547
+I308
+I546
+I284
+ta(I546
+I284
+I546
+I260
+ta(I546
+I260
+I545
+I236
+ta(I545
+I236
+I543
+I216
+ta(I543
+I216
+I542
+I200
+ta(I542
+I200
+I541
+I196
+ta(I541
+I196
+I541
+I192
+ta(I541
+I192
+I540
+I191
+ta(I540
+I191
+I539
+I197
+ta(I539
+I197
+I538
+I215
+ta(I538
+I215
+I537
+I235
+ta(I537
+I235
+I536
+I257
+ta(I536
+I257
+I534
+I281
+ta(I534
+I281
+I532
+I307
+ta(I532
+I307
+I531
+I331
+ta(I531
+I331
+I529
+I355
+ta(I529
+I355
+I527
+I375
+ta(I527
+I375
+I524
+I391
+ta(I524
+I391
+I523
+I396
+ta(I523
+I396
+I522
+I399
+ta(I522
+I399
+I522
+I400
+ta(I522
+I400
+I523
+I396
+ta(I523
+I396
+I523
+I380
+ta(I523
+I380
+I522
+I374
+ta(I522
+I374
+I520
+I358
+ta(I520
+I358
+I518
+I342
+ta(I518
+I342
+I515
+I324
+ta(I515
+I324
+I512
+I306
+ta(I512
+I306
+I508
+I286
+ta(I508
+I286
+I504
+I268
+ta(I504
+I268
+I500
+I250
+ta(I500
+I250
+I494
+I232
+ta(I494
+I232
+I491
+I216
+ta(I491
+I216
+I488
+I210
+ta(I488
+I210
+I484
+I205
+ta(I484
+I205
+I482
+I202
+ta(I482
+I202
+I481
+I201
+ta(I481
+I201
+I480
+I202
+ta(I480
+I202
+I479
+I208
+ta(I479
+I208
+I478
+I228
+ta(I478
+I228
+I477
+I244
+ta(I477
+I244
+I475
+I264
+ta(I475
+I264
+I472
+I288
+ta(I472
+I288
+I469
+I314
+ta(I469
+I314
+I466
+I338
+ta(I466
+I338
+I462
+I362
+ta(I462
+I362
+I458
+I388
+ta(I458
+I388
+I455
+I412
+ta(I455
+I412
+I452
+I430
+ta(I452
+I430
+I450
+I446
+ta(I450
+I446
+I448
+I450
+ta(I448
+I450
+I447
+I452
+ta(I447
+I452
+I447
+I451
+ta(I447
+I451
+I447
+I445
+ta(I447
+I445
+I447
+I429
+ta(I447
+I429
+I447
+I415
+ta(I447
+I415
+I448
+I397
+ta(I448
+I397
+I449
+I377
+ta(I449
+I377
+I451
+I357
+ta(I451
+I357
+I452
+I337
+ta(I452
+I337
+I453
+I317
+ta(I453
+I317
+I454
+I297
+ta(I454
+I297
+I454
+I279
+ta(I454
+I279
+I454
+I263
+ta(I454
+I263
+I453
+I247
+ta(I453
+I247
+I453
+I244
+ta(I453
+I244
+I452
+I242
+ta(I452
+I242
+I452
+I241
+ta(I452
+I241
+I450
+I246
+ta(I450
+I246
+I448
+I262
+ta(I448
+I262
+I446
+I282
+ta(I446
+I282
+I444
+I302
+ta(I444
+I302
+I440
+I326
+ta(I440
+I326
+I437
+I350
+ta(I437
+I350
+I434
+I374
+ta(I434
+I374
+I430
+I400
+ta(I430
+I400
+I427
+I420
+ta(I427
+I420
+I425
+I434
+ta(I425
+I434
+I422
+I440
+ta(I422
+I440
+I421
+I444
+ta(I421
+I444
+I420
+I446
+ta(I420
+I446
+I420
+I447
+ta(I420
+I447
+I421
+I445
+ta(I421
+I445
+I421
+I439
+ta(I421
+I439
+I421
+I425
+ta(I421
+I425
+I421
+I407
+ta(I421
+I407
+I420
+I387
+ta(I420
+I387
+I419
+I367
+ta(I419
+I367
+I417
+I343
+ta(I417
+I343
+I416
+I323
+ta(I416
+I323
+I415
+I301
+ta(I415
+I301
+I413
+I279
+ta(I413
+I279
+I411
+I261
+ta(I411
+I261
+I408
+I245
+ta(I408
+I245
+I405
+I229
+ta(I405
+I229
+I402
+I223
+ta(I402
+I223
+I398
+I219
+ta(I398
+I219
+I395
+I215
+ta(I395
+I215
+I392
+I214
+ta(I392
+I214
+I390
+I213
+ta(I390
+I213
+I387
+I214
+ta(I387
+I214
+I384
+I219
+ta(I384
+I219
+I379
+I225
+ta(I379
+I225
+I375
+I245
+ta(I375
+I245
+I369
+I267
+ta(I369
+I267
+I365
+I289
+ta(I365
+I289
+I351
+I313
+ta(I351
+I313
+I346
+I339
+ta(I346
+I339
+I342
+I363
+ta(I342
+I363
+I337
+I385
+ta(I337
+I385
+I333
+I405
+ta(I333
+I405
+I329
+I423
+ta(I329
+I423
+I327
+I428
+ta(I327
+I428
+I326
+I432
+ta(I326
+I432
+I326
+I433
+ta(I326
+I433
+I326
+I434
+ta(I326
+I434
+I327
+I432
+ta(I327
+I432
+I329
+I426
+ta(I329
+I426
+I331
+I410
+ta(I331
+I410
+I334
+I396
+ta(I334
+I396
+I336
+I376
+ta(I336
+I376
+I339
+I356
+ta(I339
+I356
+I342
+I334
+ta(I342
+I334
+I345
+I312
+ta(I345
+I312
+I347
+I292
+ta(I347
+I292
+I348
+I272
+ta(I348
+I272
+I349
+I252
+ta(I349
+I252
+I349
+I236
+ta(I349
+I236
+I349
+I220
+ta(I349
+I220
+I349
+I214
+ta(I349
+I214
+I349
+I211
+ta(I349
+I211
+I348
+I210
+ta(I348
+I210
+I348
+I211
+ta(I348
+I211
+I347
+I229
+ta(I347
+I229
+I346
+I247
+ta(I346
+I247
+I345
+I265
+ta(I345
+I265
+I343
+I287
+ta(I343
+I287
+I342
+I313
+ta(I342
+I313
+I340
+I337
+ta(I340
+I337
+I338
+I361
+ta(I338
+I361
+I336
+I383
+ta(I336
+I383
+I333
+I403
+ta(I333
+I403
+I332
+I419
+ta(I332
+I419
+I331
+I424
+ta(I331
+I424
+I331
+I427
+ta(I331
+I427
+I331
+I429
+ta(I331
+I429
+I332
+I427
+ta(I332
+I427
+I333
+I411
+ta(I333
+I411
+I335
+I395
+ta(I335
+I395
+I336
+I377
+ta(I336
+I377
+I337
+I359
+ta(I337
+I359
+I337
+I335
+ta(I337
+I335
+I337
+I315
+ta(I337
+I315
+I337
+I293
+ta(I337
+I293
+I336
+I269
+ta(I336
+I269
+I335
+I251
+ta(I335
+I251
+I333
+I231
+ta(I333
+I231
+I332
+I217
+ta(I332
+I217
+I330
+I203
+ta(I330
+I203
+I329
+I199
+ta(I329
+I199
+I328
+I196
+ta(I328
+I196
+I327
+I195
+ta(I327
+I195
+I325
+I199
+ta(I325
+I199
+I323
+I219
+ta(I323
+I219
+I321
+I235
+ta(I321
+I235
+I318
+I257
+ta(I318
+I257
+I315
+I281
+ta(I315
+I281
+I312
+I305
+ta(I312
+I305
+I309
+I329
+ta(I309
+I329
+I306
+I355
+ta(I306
+I355
+I304
+I379
+ta(I304
+I379
+I303
+I399
+ta(I303
+I399
+I302
+I415
+ta(I302
+I415
+I302
+I429
+ta(I302
+I429
+I302
+I432
+ta(I302
+I432
+I302
+I434
+ta(I302
+I434
+I302
+I435
+ta(I302
+I435
+I302
+I434
+ta(I302
+I434
+I302
+I428
+ta(I302
+I428
+I302
+I414
+ta(I302
+I414
+I302
+I400
+ta(I302
+I400
+I302
+I382
+ta(I302
+I382
+I302
+I364
+ta(I302
+I364
+I302
+I344
+ta(I302
+I344
+I302
+I322
+ta(I302
+I322
+I302
+I302
+ta(I302
+I302
+I302
+I284
+ta(I302
+I284
+I302
+I266
+ta(I302
+I266
+I302
+I250
+ta(I302
+I250
+I301
+I236
+ta(I301
+I236
+I300
+I231
+ta(I300
+I231
+I299
+I227
+ta(I299
+I227
+I298
+I226
+ta(I298
+I226
+I298
+I225
+ta(I298
+I225
+I296
+I231
+ta(I296
+I231
+I294
+I245
+ta(I294
+I245
+I291
+I265
+ta(I291
+I265
+I289
+I285
+ta(I289
+I285
+I285
+I307
+ta(I285
+I307
+I282
+I327
+ta(I282
+I327
+I278
+I349
+ta(I278
+I349
+I274
+I369
+ta(I274
+I369
+I270
+I385
+ta(I270
+I385
+I268
+I390
+ta(I268
+I390
+I266
+I393
+ta(I266
+I393
+I265
+I395
+ta(I265
+I395
+I265
+I396
+ta(I265
+I396
+I266
+I395
+ta(I266
+I395
+I267
+I390
+ta(I267
+I390
+I267
+I376
+ta(I267
+I376
+I267
+I362
+ta(I267
+I362
+I267
+I344
+ta(I267
+I344
+I267
+I328
+ta(I267
+I328
+I266
+I310
+ta(I266
+I310
+I265
+I294
+ta(I265
+I294
+I264
+I276
+ta(I264
+I276
+I262
+I260
+ta(I262
+I260
+I260
+I246
+ta(I260
+I246
+I257
+I232
+ta(I257
+I232
+I256
+I228
+ta(I256
+I228
+I254
+I224
+ta(I254
+I224
+I252
+I220
+ta(I252
+I220
+I250
+I218
+ta(I250
+I218
+I249
+I218
+ta(I249
+I218
+I247
+I221
+ta(I247
+I221
+I245
+I226
+ta(I245
+I226
+I242
+I240
+ta(I242
+I240
+I238
+I256
+ta(I238
+I256
+I235
+I272
+ta(I235
+I272
+I231
+I288
+ta(I231
+I288
+I227
+I308
+ta(I227
+I308
+I222
+I326
+ta(I222
+I326
+I218
+I344
+ta(I218
+I344
+I214
+I364
+ta(I214
+I364
+I211
+I382
+ta(I211
+I382
+I209
+I388
+ta(I209
+I388
+I207
+I404
+ta(I207
+I404
+I206
+I407
+ta(I206
+I407
+I206
+I409
+ta(I206
+I409
+I206
+I410
+ta(I206
+I410
+I207
+I411
+ta(I207
+I411
+I209
+I409
+ta(I209
+I409
+I212
+I404
+ta(I212
+I404
+I215
+I398
+ta(I215
+I398
+I218
+I384
+ta(I218
+I384
+I222
+I366
+ta(I222
+I366
+I226
+I350
+ta(I226
+I350
+I230
+I330
+ta(I230
+I330
+I233
+I312
+ta(I233
+I312
+I235
+I292
+ta(I235
+I292
+I236
+I276
+ta(I236
+I276
+I237
+I260
+ta(I237
+I260
+I237
+I254
+ta(I237
+I254
+I237
+I251
+ta(I237
+I251
+I236
+I248
+ta(I236
+I248
+I235
+I248
+ta(I235
+I248
+I234
+I249
+ta(I234
+I249
+I232
+I267
+ta(I232
+I267
+I230
+I285
+ta(I230
+I285
+I227
+I305
+ta(I227
+I305
+I224
+I327
+ta(I224
+I327
+I221
+I349
+ta(I221
+I349
+I218
+I369
+ta(I218
+I369
+I215
+I387
+ta(I215
+I387
+I212
+I403
+ta(I212
+I403
+I211
+I408
+ta(I211
+I408
+I209
+I413
+ta(I209
+I413
+I208
+I415
+ta(I208
+I415
+I208
+I417
+ta(I208
+I417
+I208
+I415
+ta(I208
+I415
+I208
+I409
+ta(I208
+I409
+I208
+I404
+ta(I208
+I404
+I208
+I390
+ta(I208
+I390
+I208
+I374
+ta(I208
+I374
+I208
+I358
+ta(I208
+I358
+I208
+I340
+ta(I208
+I340
+I208
+I320
+ta(I208
+I320
+I208
+I302
+ta(I208
+I302
+I207
+I286
+ta(I207
+I286
+I206
+I270
+ta(I206
+I270
+I205
+I256
+ta(I205
+I256
+I204
+I251
+ta(I204
+I251
+I202
+I246
+ta(I202
+I246
+I201
+I243
+ta(I201
+I243
+I200
+I241
+ta(I200
+I241
+I197
+I246
+ta(I197
+I246
+I193
+I260
+ta(I193
+I260
+I190
+I278
+ta(I190
+I278
+I186
+I296
+ta(I186
+I296
+I182
+I312
+ta(I182
+I312
+I178
+I332
+ta(I178
+I332
+I173
+I352
+ta(I173
+I352
+I169
+I370
+ta(I169
+I370
+I165
+I386
+ta(I165
+I386
+I162
+I392
+ta(I162
+I392
+I159
+I398
+ta(I159
+I398
+I157
+I402
+ta(I157
+I402
+I157
+I404
+ta(I157
+I404
+I159
+I401
+ta(I159
+I401
+I161
+I387
+ta(I161
+I387
+I164
+I381
+ta(I164
+I381
+I165
+I367
+ta(I165
+I367
+I166
+I353
+ta(I166
+I353
+I167
+I339
+ta(I167
+I339
+I168
+I321
+ta(I168
+I321
+I169
+I305
+ta(I169
+I305
+I170
+I291
+ta(I170
+I291
+I171
+I275
+ta(I171
+I275
+I171
+I261
+ta(I171
+I261
+I171
+I255
+ta(I171
+I255
+I170
+I251
+ta(I170
+I251
+I170
+I248
+ta(I170
+I248
+I169
+I246
+ta(I169
+I246
+I168
+I246
+ta(I168
+I246
+I167
+I249
+ta(I167
+I249
+I164
+I263
+ta(I164
+I263
+I162
+I279
+ta(I162
+I279
+I160
+I297
+ta(I160
+I297
+I156
+I317
+ta(I156
+I317
+I153
+I339
+ta(I153
+I339
+I150
+I361
+ta(I150
+I361
+I145
+I381
+ta(I145
+I381
+I141
+I401
+ta(I141
+I401
+I137
+I419
+ta(I137
+I419
+I134
+I433
+ta(I134
+I433
+I133
+I438
+ta(I133
+I438
+I133
+I441
+ta(I133
+I441
+I133
+I443
+ta(I133
+I443
+I134
+I443
+ta(I134
+I443
+I135
+I443
+ta(I135
+I443
+I136
+I441
+ta(I136
+I441
+I138
+I436
+ta(I138
+I436
+I140
+I422
+ta(I140
+I422
+I141
+I416
+ta(I141
+I416
+I142
+I402
+ta(I142
+I402
+I143
+I384
+ta(I143
+I384
+I144
+I366
+ta(I144
+I366
+I144
+I346
+ta(I144
+I346
+I144
+I324
+ta(I144
+I324
+I143
+I306
+ta(I143
+I306
+I142
+I288
+ta(I142
+I288
+I141
+I272
+ta(I141
+I272
+I139
+I256
+ta(I139
+I256
+I138
+I252
+ta(I138
+I252
+I135
+I247
+ta(I135
+I247
+I134
+I245
+ta(I134
+I245
+I133
+I244
+ta(I133
+I244
+I131
+I246
+ta(I131
+I246
+I128
+I262
+ta(I128
+I262
+I125
+I280
+ta(I125
+I280
+I121
+I300
+ta(I121
+I300
+I117
+I322
+ta(I117
+I322
+I111
+I344
+ta(I111
+I344
+I107
+I368
+ta(I107
+I368
+I102
+I390
+ta(I102
+I390
+I98
+I408
+ta(I98
+I408
+I95
+I426
+ta(I95
+I426
+I93
+I431
+ta(I93
+I431
+I92
+I434
+ta(I92
+I434
+I92
+I435
+ta(I92
+I435
+I92
+I434
+ta(I92
+I434
+I94
+I428
+ta(I94
+I428
+I96
+I414
+ta(I96
+I414
+I98
+I400
+ta(I98
+I400
+I100
+I384
+ta(I100
+I384
+I101
+I368
+ta(I101
+I368
+I102
+I352
+ta(I102
+I352
+I103
+I336
+ta(I103
+I336
+I104
+I322
+ta(I104
+I322
+I104
+I316
+ta(I104
+I316
+I104
+I310
+ta(I104
+I310
+I104
+I306
+ta(I104
+I306
+I103
+I302
+ta(I103
+I302
+I102
+I298
+ta(I102
+I298
+I101
+I295
+ta(I101
+I295
+I101
+I292
+ta(I101
+I292
+I100
+I292
+ta(I100
+I292
+I99
+I294
+ta(I99
+I294
+I98
+I308
+ta(I98
+I308
+I95
+I326
+ta(I95
+I326
+I93
+I344
+ta(I93
+I344
+I90
+I366
+ta(I90
+I366
+I87
+I386
+ta(I87
+I386
+I83
+I410
+ta(I83
+I410
+I79
+I430
+ta(I79
+I430
+I75
+I448
+ta(I75
+I448
+I71
+I454
+ta(I71
+I454
+I68
+I460
+ta(I68
+I460
+I67
+I462
+ta(I67
+I462
+I66
+I463
+ta(I66
+I463
+I66
+I459
+ta(I66
+I459
+I67
+I443
+ta(I67
+I443
+I67
+I429
+ta(I67
+I429
+I67
+I415
+ta(I67
+I415
+I67
+I397
+ta(I67
+I397
+I66
+I377
+ta(I66
+I377
+I65
+I357
+ta(I65
+I357
+I63
+I337
+ta(I63
+I337
+I62
+I319
+ta(I62
+I319
+I61
+I301
+ta(I61
+I301
+I60
+I285
+ta(I60
+I285
+I57
+I269
+ta(I57
+I269
+I55
+I263
+ta(I55
+I263
+I53
+I257
+ta(I53
+I257
+I50
+I253
+ta(I50
+I253
+I48
+I248
+ta(I48
+I248
+I45
+I245
+ta(I45
+I245
+I43
+I243
+ta(I43
+I243
+I40
+I243
+ta(I40
+I243
+I38
+I243
+ta(I38
+I243
+I34
+I247
+ta(I34
+I247
+I29
+I253
+ta(I29
+I253
+I25
+I259
+ta(I25
+I259
+I23
+I265
+ta(I23
+I265
+I22
+I287
+ta(I22
+I287
+I22
+I305
+ta(I22
+I305
+I22
+I323
+ta(I22
+I323
+I22
+I339
+ta(I22
+I339
+I22
+I345
+ta(I22
+I345
+I22
+I350
+ta(I22
+I350
+I23
+I354
+ta(I23
+I354
+I23
+I357
+ta(I23
+I357
+I23
+I358
+ta(I23
+I358
+I24
+I355
+ta(I24
+I355
+I24
+I349
+ta(I24
+I349
+I25
+I333
+ta(I25
+I333
+I25
+I317
+ta(I25
+I317
+I26
+I299
+ta(I26
+I299
+I27
+I281
+ta(I27
+I281
+I28
+I261
+ta(I28
+I261
+I29
+I243
+ta(I29
+I243
+I30
+I227
+ta(I30
+I227
+I30
+I221
+ta(I30
+I221
+I30
+I217
+ta(I30
+I217
+I30
+I214
+ta(I30
+I214
+I29
+I211
+ta(I29
+I211
+I29
+I210
+ta(I29
+I210
+I28
+I210
+ta(I28
+I210
+I27
+I213
+ta(I27
+I213
+I26
+I217
+ta(I26
+I217
+I25
+I235
+ta(I25
+I235
+I24
+I251
+ta(I24
+I251
+I23
+I271
+ta(I23
+I271
+I22
+I289
+ta(I22
+I289
+I22
+I311
+ta(I22
+I311
+I22
+I333
+ta(I22
+I333
+I22
+I351
+ta(I22
+I351
+I22
+I369
+ta(I22
+I369
+I22
+I385
+ta(I22
+I385
+I23
+I391
+ta(I23
+I391
+I23
+I397
+ta(I23
+I397
+I24
+I400
+ta(I24
+I400
+I24
+I403
+ta(I24
+I403
+I24
+I404
+ta(I24
+I404
+I25
+I405
+ta(I25
+I405
+I26
+I405
+ta(I26
+I405
+I27
+I405
+ta(I27
+I405
+I26
+I405
+ta(I26
+I405
+I23
+I403
+ta(I23
+I403
+I19
+I402
+ta(I19
+I402
+I20
+I403
+tatp14
+a(g8
+I1
+(lp15
+(I15
+I424
+I15
+I425
+ta(I15
+I425
+I15
+I429
+ta(I15
+I429
+I15
+I432
+ta(I15
+I432
+I15
+I437
+ta(I15
+I437
+I16
+I451
+ta(I16
+I451
+I17
+I457
+ta(I17
+I457
+I17
+I463
+ta(I17
+I463
+I18
+I469
+ta(I18
+I469
+I18
+I475
+ta(I18
+I475
+I18
+I495
+ta(I18
+I495
+I18
+I511
+ta(I18
+I511
+I18
+I531
+ta(I18
+I531
+I18
+I555
+ta(I18
+I555
+I18
+I577
+ta(I18
+I577
+I18
+I599
+ta(I18
+I599
+I18
+I619
+ta(I18
+I619
+I18
+I635
+ta(I18
+I635
+I18
+I639
+ta(I18
+I639
+I19
+I641
+ta(I19
+I641
+I19
+I642
+ta(I19
+I642
+I20
+I639
+ta(I20
+I639
+I22
+I617
+ta(I22
+I617
+I23
+I595
+ta(I23
+I595
+I24
+I569
+ta(I24
+I569
+I26
+I541
+ta(I26
+I541
+I28
+I513
+ta(I28
+I513
+I30
+I487
+ta(I30
+I487
+I31
+I457
+ta(I31
+I457
+I33
+I433
+ta(I33
+I433
+I34
+I411
+ta(I34
+I411
+I34
+I391
+ta(I34
+I391
+I34
+I377
+ta(I34
+I377
+I34
+I372
+ta(I34
+I372
+I34
+I370
+ta(I34
+I370
+I34
+I369
+ta(I34
+I369
+I34
+I373
+ta(I34
+I373
+I34
+I389
+ta(I34
+I389
+I34
+I407
+ta(I34
+I407
+I35
+I427
+ta(I35
+I427
+I35
+I447
+ta(I35
+I447
+I35
+I469
+ta(I35
+I469
+I35
+I493
+ta(I35
+I493
+I35
+I515
+ta(I35
+I515
+I35
+I535
+ta(I35
+I535
+I35
+I553
+ta(I35
+I553
+I37
+I567
+ta(I37
+I567
+I37
+I570
+ta(I37
+I570
+I38
+I573
+ta(I38
+I573
+I39
+I573
+ta(I39
+I573
+I40
+I573
+ta(I40
+I573
+I40
+I568
+ta(I40
+I568
+I40
+I554
+ta(I40
+I554
+I40
+I538
+ta(I40
+I538
+I40
+I520
+ta(I40
+I520
+I40
+I500
+ta(I40
+I500
+I40
+I478
+ta(I40
+I478
+I40
+I456
+ta(I40
+I456
+I42
+I430
+ta(I42
+I430
+I42
+I406
+ta(I42
+I406
+I43
+I386
+ta(I43
+I386
+I45
+I368
+ta(I45
+I368
+I46
+I352
+ta(I46
+I352
+I46
+I347
+ta(I46
+I347
+I46
+I344
+ta(I46
+I344
+I46
+I342
+ta(I46
+I342
+I46
+I348
+ta(I46
+I348
+I46
+I370
+ta(I46
+I370
+I46
+I392
+ta(I46
+I392
+I47
+I416
+ta(I47
+I416
+I47
+I440
+ta(I47
+I440
+I47
+I466
+ta(I47
+I466
+I47
+I490
+ta(I47
+I490
+I47
+I514
+ta(I47
+I514
+I47
+I534
+ta(I47
+I534
+I47
+I554
+ta(I47
+I554
+I48
+I560
+ta(I48
+I560
+I49
+I564
+ta(I49
+I564
+I51
+I566
+ta(I51
+I566
+I52
+I567
+ta(I52
+I567
+I53
+I567
+ta(I53
+I567
+I54
+I565
+ta(I54
+I565
+I56
+I549
+ta(I56
+I549
+I58
+I533
+ta(I58
+I533
+I59
+I515
+ta(I59
+I515
+I60
+I493
+ta(I60
+I493
+I61
+I471
+ta(I61
+I471
+I63
+I449
+ta(I63
+I449
+I66
+I427
+ta(I66
+I427
+I68
+I407
+ta(I68
+I407
+I70
+I387
+ta(I70
+I387
+I72
+I369
+ta(I72
+I369
+I73
+I363
+ta(I73
+I363
+I73
+I361
+ta(I73
+I361
+I74
+I359
+ta(I74
+I359
+I74
+I361
+ta(I74
+I361
+I74
+I381
+ta(I74
+I381
+I75
+I397
+ta(I75
+I397
+I75
+I417
+ta(I75
+I417
+I76
+I441
+ta(I76
+I441
+I78
+I461
+ta(I78
+I461
+I79
+I483
+ta(I79
+I483
+I81
+I503
+ta(I81
+I503
+I82
+I525
+ta(I82
+I525
+I83
+I543
+ta(I83
+I543
+I84
+I559
+ta(I84
+I559
+I86
+I564
+ta(I86
+I564
+I88
+I569
+ta(I88
+I569
+I90
+I571
+ta(I90
+I571
+I91
+I572
+ta(I91
+I572
+I92
+I568
+ta(I92
+I568
+I95
+I552
+ta(I95
+I552
+I97
+I538
+ta(I97
+I538
+I99
+I520
+ta(I99
+I520
+I101
+I504
+ta(I101
+I504
+I103
+I486
+ta(I103
+I486
+I106
+I466
+ta(I106
+I466
+I109
+I446
+ta(I109
+I446
+I112
+I432
+ta(I112
+I432
+I114
+I414
+ta(I114
+I414
+I116
+I408
+ta(I116
+I408
+I118
+I403
+ta(I118
+I403
+I119
+I400
+ta(I119
+I400
+I119
+I398
+ta(I119
+I398
+I119
+I399
+ta(I119
+I399
+I119
+I415
+ta(I119
+I415
+I119
+I429
+ta(I119
+I429
+I121
+I447
+ta(I121
+I447
+I122
+I469
+ta(I122
+I469
+I123
+I487
+ta(I123
+I487
+I125
+I509
+ta(I125
+I509
+I126
+I531
+ta(I126
+I531
+I127
+I547
+ta(I127
+I547
+I128
+I561
+ta(I128
+I561
+I129
+I565
+ta(I129
+I565
+I130
+I568
+ta(I130
+I568
+I131
+I570
+ta(I131
+I570
+I132
+I570
+ta(I132
+I570
+I133
+I568
+ta(I133
+I568
+I135
+I563
+ta(I135
+I563
+I137
+I549
+ta(I137
+I549
+I139
+I533
+ta(I139
+I533
+I141
+I517
+ta(I141
+I517
+I142
+I495
+ta(I142
+I495
+I143
+I477
+ta(I143
+I477
+I145
+I455
+ta(I145
+I455
+I146
+I433
+ta(I146
+I433
+I148
+I415
+ta(I148
+I415
+I149
+I397
+ta(I149
+I397
+I150
+I379
+ta(I150
+I379
+I152
+I365
+ta(I152
+I365
+I154
+I361
+ta(I154
+I361
+I155
+I358
+ta(I155
+I358
+I155
+I356
+ta(I155
+I356
+I155
+I358
+ta(I155
+I358
+I155
+I374
+ta(I155
+I374
+I155
+I390
+ta(I155
+I390
+I156
+I410
+ta(I156
+I410
+I156
+I430
+ta(I156
+I430
+I156
+I454
+ta(I156
+I454
+I156
+I476
+ta(I156
+I476
+I156
+I498
+ta(I156
+I498
+I156
+I518
+ta(I156
+I518
+I156
+I540
+ta(I156
+I540
+I158
+I558
+ta(I158
+I558
+I159
+I572
+ta(I159
+I572
+I160
+I576
+ta(I160
+I576
+I162
+I578
+ta(I162
+I578
+I163
+I579
+ta(I163
+I579
+I164
+I579
+ta(I164
+I579
+I165
+I578
+ta(I165
+I578
+I167
+I564
+ta(I167
+I564
+I169
+I558
+ta(I169
+I558
+I172
+I538
+ta(I172
+I538
+I174
+I520
+ta(I174
+I520
+I177
+I498
+ta(I177
+I498
+I180
+I476
+ta(I180
+I476
+I182
+I454
+ta(I182
+I454
+I185
+I432
+ta(I185
+I432
+I188
+I414
+ta(I188
+I414
+I191
+I394
+ta(I191
+I394
+I193
+I378
+ta(I193
+I378
+I194
+I362
+ta(I194
+I362
+I195
+I348
+ta(I195
+I348
+I196
+I343
+ta(I196
+I343
+I196
+I340
+ta(I196
+I340
+I196
+I338
+ta(I196
+I338
+I197
+I338
+ta(I197
+I338
+I198
+I356
+ta(I198
+I356
+I199
+I372
+ta(I199
+I372
+I200
+I390
+ta(I200
+I390
+I201
+I414
+ta(I201
+I414
+I203
+I436
+ta(I203
+I436
+I204
+I460
+ta(I204
+I460
+I204
+I486
+ta(I204
+I486
+I205
+I508
+ta(I205
+I508
+I206
+I528
+ta(I206
+I528
+I207
+I548
+ta(I207
+I548
+I209
+I554
+ta(I209
+I554
+I211
+I558
+ta(I211
+I558
+I212
+I560
+ta(I212
+I560
+I212
+I561
+ta(I212
+I561
+I213
+I561
+ta(I213
+I561
+I213
+I558
+ta(I213
+I558
+I215
+I553
+ta(I215
+I553
+I216
+I539
+ta(I216
+I539
+I217
+I523
+ta(I217
+I523
+I218
+I501
+ta(I218
+I501
+I219
+I483
+ta(I219
+I483
+I221
+I461
+ta(I221
+I461
+I224
+I439
+ta(I224
+I439
+I227
+I417
+ta(I227
+I417
+I228
+I397
+ta(I228
+I397
+I229
+I377
+ta(I229
+I377
+I230
+I361
+ta(I230
+I361
+I231
+I347
+ta(I231
+I347
+I232
+I342
+ta(I232
+I342
+I232
+I338
+ta(I232
+I338
+I232
+I337
+ta(I232
+I337
+I233
+I337
+ta(I233
+I337
+I233
+I342
+ta(I233
+I342
+I233
+I356
+ta(I233
+I356
+I233
+I372
+ta(I233
+I372
+I233
+I394
+ta(I233
+I394
+I233
+I416
+ta(I233
+I416
+I233
+I438
+ta(I233
+I438
+I233
+I462
+ta(I233
+I462
+I233
+I484
+ta(I233
+I484
+I233
+I504
+ta(I233
+I504
+I233
+I526
+ta(I233
+I526
+I233
+I540
+ta(I233
+I540
+I233
+I545
+ta(I233
+I545
+I234
+I548
+ta(I234
+I548
+I235
+I551
+ta(I235
+I551
+I236
+I551
+ta(I236
+I551
+I237
+I549
+ta(I237
+I549
+I238
+I543
+ta(I238
+I543
+I240
+I529
+ta(I240
+I529
+I242
+I513
+ta(I242
+I513
+I245
+I495
+ta(I245
+I495
+I247
+I477
+ta(I247
+I477
+I250
+I457
+ta(I250
+I457
+I252
+I439
+ta(I252
+I439
+I255
+I417
+ta(I255
+I417
+I258
+I399
+ta(I258
+I399
+I261
+I381
+ta(I261
+I381
+I263
+I365
+ta(I263
+I365
+I265
+I351
+ta(I265
+I351
+I266
+I347
+ta(I266
+I347
+I267
+I343
+ta(I267
+I343
+I267
+I342
+ta(I267
+I342
+I267
+I348
+ta(I267
+I348
+I268
+I368
+ta(I268
+I368
+I269
+I384
+ta(I269
+I384
+I271
+I404
+ta(I271
+I404
+I272
+I424
+ta(I272
+I424
+I273
+I442
+ta(I273
+I442
+I274
+I462
+ta(I274
+I462
+I274
+I482
+ta(I274
+I482
+I274
+I498
+ta(I274
+I498
+I276
+I514
+ta(I276
+I514
+I277
+I520
+ta(I277
+I520
+I277
+I525
+ta(I277
+I525
+I279
+I527
+ta(I279
+I527
+I279
+I529
+ta(I279
+I529
+I280
+I528
+ta(I280
+I528
+I281
+I512
+ta(I281
+I512
+I282
+I498
+ta(I282
+I498
+I283
+I482
+ta(I283
+I482
+I284
+I460
+ta(I284
+I460
+I286
+I438
+ta(I286
+I438
+I287
+I416
+ta(I287
+I416
+I289
+I394
+ta(I289
+I394
+I290
+I372
+ta(I290
+I372
+I291
+I354
+ta(I291
+I354
+I292
+I336
+ta(I292
+I336
+I292
+I330
+ta(I292
+I330
+I292
+I327
+ta(I292
+I327
+I292
+I324
+ta(I292
+I324
+I292
+I323
+ta(I292
+I323
+I291
+I329
+ta(I291
+I329
+I291
+I343
+ta(I291
+I343
+I291
+I359
+ta(I291
+I359
+I291
+I381
+ta(I291
+I381
+I293
+I401
+ta(I293
+I401
+I294
+I423
+ta(I294
+I423
+I294
+I449
+ta(I294
+I449
+I294
+I473
+ta(I294
+I473
+I294
+I497
+ta(I294
+I497
+I295
+I517
+ta(I295
+I517
+I296
+I539
+ta(I296
+I539
+I297
+I553
+ta(I297
+I553
+I299
+I557
+ta(I299
+I557
+I301
+I559
+ta(I301
+I559
+I302
+I560
+ta(I302
+I560
+I303
+I560
+ta(I303
+I560
+I304
+I558
+ta(I304
+I558
+I306
+I552
+ta(I306
+I552
+I308
+I538
+ta(I308
+I538
+I310
+I520
+ta(I310
+I520
+I312
+I502
+ta(I312
+I502
+I314
+I484
+ta(I314
+I484
+I316
+I466
+ta(I316
+I466
+I318
+I446
+ta(I318
+I446
+I320
+I426
+ta(I320
+I426
+I321
+I406
+ta(I321
+I406
+I322
+I390
+ta(I322
+I390
+I322
+I374
+ta(I322
+I374
+I322
+I360
+ta(I322
+I360
+I322
+I357
+ta(I322
+I357
+I322
+I355
+ta(I322
+I355
+I322
+I354
+ta(I322
+I354
+I322
+I355
+ta(I322
+I355
+I322
+I361
+ta(I322
+I361
+I323
+I367
+ta(I323
+I367
+I323
+I383
+ta(I323
+I383
+I324
+I399
+ta(I324
+I399
+I325
+I415
+ta(I325
+I415
+I325
+I433
+ta(I325
+I433
+I326
+I453
+ta(I326
+I453
+I327
+I473
+ta(I327
+I473
+I328
+I493
+ta(I328
+I493
+I330
+I513
+ta(I330
+I513
+I331
+I529
+ta(I331
+I529
+I333
+I534
+ta(I333
+I534
+I335
+I538
+ta(I335
+I538
+I336
+I541
+ta(I336
+I541
+I337
+I541
+ta(I337
+I541
+I338
+I541
+ta(I338
+I541
+I339
+I540
+ta(I339
+I540
+I340
+I535
+ta(I340
+I535
+I342
+I521
+ta(I342
+I521
+I344
+I507
+ta(I344
+I507
+I346
+I491
+ta(I346
+I491
+I349
+I471
+ta(I349
+I471
+I351
+I453
+ta(I351
+I453
+I353
+I435
+ta(I353
+I435
+I356
+I413
+ta(I356
+I413
+I358
+I395
+ta(I358
+I395
+I359
+I379
+ta(I359
+I379
+I360
+I365
+ta(I360
+I365
+I360
+I351
+ta(I360
+I351
+I361
+I348
+ta(I361
+I348
+I361
+I345
+ta(I361
+I345
+I361
+I349
+ta(I361
+I349
+I361
+I371
+ta(I361
+I371
+I362
+I387
+ta(I362
+I387
+I363
+I407
+ta(I363
+I407
+I365
+I427
+ta(I365
+I427
+I366
+I447
+ta(I366
+I447
+I366
+I463
+ta(I366
+I463
+I368
+I485
+ta(I368
+I485
+I369
+I503
+ta(I369
+I503
+I371
+I519
+ta(I371
+I519
+I374
+I537
+ta(I374
+I537
+I377
+I543
+ta(I377
+I543
+I380
+I548
+ta(I380
+I548
+I383
+I551
+ta(I383
+I551
+I385
+I553
+ta(I385
+I553
+I386
+I553
+ta(I386
+I553
+I387
+I553
+ta(I387
+I553
+I389
+I549
+ta(I389
+I549
+I391
+I544
+ta(I391
+I544
+I394
+I530
+ta(I394
+I530
+I398
+I514
+ta(I398
+I514
+I401
+I498
+ta(I401
+I498
+I405
+I480
+ta(I405
+I480
+I409
+I458
+ta(I409
+I458
+I412
+I440
+ta(I412
+I440
+I414
+I422
+ta(I414
+I422
+I417
+I400
+ta(I417
+I400
+I418
+I384
+ta(I418
+I384
+I419
+I368
+ta(I419
+I368
+I419
+I362
+ta(I419
+I362
+I419
+I359
+ta(I419
+I359
+I419
+I356
+ta(I419
+I356
+I420
+I359
+ta(I420
+I359
+I421
+I379
+ta(I421
+I379
+I421
+I395
+ta(I421
+I395
+I422
+I415
+ta(I422
+I415
+I423
+I435
+ta(I423
+I435
+I425
+I455
+ta(I425
+I455
+I426
+I473
+ta(I426
+I473
+I427
+I491
+ta(I427
+I491
+I429
+I507
+ta(I429
+I507
+I432
+I512
+ta(I432
+I512
+I434
+I518
+ta(I434
+I518
+I436
+I522
+ta(I436
+I522
+I439
+I526
+ta(I439
+I526
+I441
+I530
+ta(I441
+I530
+I443
+I533
+ta(I443
+I533
+I446
+I537
+ta(I446
+I537
+I447
+I539
+ta(I447
+I539
+I449
+I542
+ta(I449
+I542
+I450
+I543
+ta(I450
+I543
+I450
+I544
+ta(I450
+I544
+I450
+I543
+ta(I450
+I543
+I450
+I539
+ta(I450
+I539
+I450
+I536
+ta(I450
+I536
+I450
+I533
+ta(I450
+I533
+I450
+I529
+ta(I450
+I529
+I450
+I526
+ta(I450
+I526
+I450
+I523
+tatp16
+a(g8
+I1
+(lp17
+(I463
+I513
+I462
+I499
+ta(I462
+I499
+I461
+I493
+ta(I461
+I493
+I460
+I487
+ta(I460
+I487
+I460
+I481
+ta(I460
+I481
+I459
+I467
+ta(I459
+I467
+I459
+I453
+ta(I459
+I453
+I459
+I447
+ta(I459
+I447
+I459
+I441
+ta(I459
+I441
+I459
+I435
+ta(I459
+I435
+I459
+I430
+ta(I459
+I430
+I459
+I426
+ta(I459
+I426
+I459
+I423
+ta(I459
+I423
+I459
+I420
+ta(I459
+I420
+I459
+I419
+ta(I459
+I419
+I459
+I421
+ta(I459
+I421
+I459
+I435
+ta(I459
+I435
+I460
+I449
+ta(I460
+I449
+I461
+I467
+ta(I461
+I467
+I462
+I483
+ta(I462
+I483
+I463
+I503
+ta(I463
+I503
+I464
+I523
+ta(I464
+I523
+I464
+I543
+ta(I464
+I543
+I464
+I563
+ta(I464
+I563
+I464
+I583
+ta(I464
+I583
+I464
+I599
+ta(I464
+I599
+I464
+I615
+ta(I464
+I615
+I464
+I621
+ta(I464
+I621
+I464
+I626
+ta(I464
+I626
+I464
+I629
+ta(I464
+I629
+I464
+I630
+ta(I464
+I630
+I464
+I628
+ta(I464
+I628
+I464
+I608
+ta(I464
+I608
+I464
+I592
+ta(I464
+I592
+I463
+I572
+ta(I463
+I572
+I463
+I546
+ta(I463
+I546
+I463
+I518
+ta(I463
+I518
+I464
+I492
+ta(I464
+I492
+I466
+I464
+ta(I466
+I464
+I468
+I438
+ta(I468
+I438
+I471
+I414
+ta(I471
+I414
+I474
+I392
+ta(I474
+I392
+I477
+I376
+ta(I477
+I376
+I479
+I370
+ta(I479
+I370
+I481
+I367
+ta(I481
+I367
+I482
+I365
+ta(I482
+I365
+I483
+I366
+ta(I483
+I366
+I485
+I382
+ta(I485
+I382
+I487
+I396
+ta(I487
+I396
+I490
+I414
+ta(I490
+I414
+I493
+I432
+ta(I493
+I432
+I495
+I446
+ta(I495
+I446
+I498
+I466
+ta(I498
+I466
+I501
+I486
+ta(I501
+I486
+I504
+I502
+ta(I504
+I502
+I506
+I518
+ta(I506
+I518
+I508
+I534
+ta(I508
+I534
+I510
+I548
+ta(I510
+I548
+I511
+I551
+ta(I511
+I551
+I512
+I553
+ta(I512
+I553
+I513
+I554
+ta(I513
+I554
+I514
+I554
+ta(I514
+I554
+I515
+I551
+ta(I515
+I551
+I515
+I537
+ta(I515
+I537
+I516
+I531
+ta(I516
+I531
+I518
+I511
+ta(I518
+I511
+I519
+I493
+ta(I519
+I493
+I521
+I473
+ta(I521
+I473
+I524
+I453
+ta(I524
+I453
+I527
+I431
+ta(I527
+I431
+I530
+I413
+ta(I530
+I413
+I533
+I395
+ta(I533
+I395
+I535
+I381
+ta(I535
+I381
+I537
+I376
+ta(I537
+I376
+I538
+I372
+ta(I538
+I372
+I539
+I370
+ta(I539
+I370
+I539
+I369
+ta(I539
+I369
+I539
+I372
+ta(I539
+I372
+I539
+I386
+ta(I539
+I386
+I540
+I402
+ta(I540
+I402
+I541
+I418
+ta(I541
+I418
+I541
+I438
+ta(I541
+I438
+I541
+I460
+ta(I541
+I460
+I541
+I484
+ta(I541
+I484
+I541
+I506
+ta(I541
+I506
+I541
+I526
+ta(I541
+I526
+I541
+I548
+ta(I541
+I548
+I541
+I566
+ta(I541
+I566
+I541
+I580
+ta(I541
+I580
+I543
+I585
+ta(I543
+I585
+I544
+I588
+ta(I544
+I588
+I544
+I590
+ta(I544
+I590
+I545
+I590
+ta(I545
+I590
+I546
+I590
+ta(I546
+I590
+I547
+I588
+ta(I547
+I588
+I549
+I582
+ta(I549
+I582
+I551
+I568
+ta(I551
+I568
+I554
+I554
+ta(I554
+I554
+I556
+I534
+ta(I556
+I534
+I559
+I510
+ta(I559
+I510
+I562
+I490
+ta(I562
+I490
+I565
+I468
+ta(I565
+I468
+I568
+I446
+ta(I568
+I446
+I570
+I428
+ta(I570
+I428
+I572
+I410
+ta(I572
+I410
+I574
+I396
+ta(I574
+I396
+I576
+I392
+ta(I576
+I392
+I577
+I388
+ta(I577
+I388
+I577
+I387
+ta(I577
+I387
+I577
+I388
+ta(I577
+I388
+I578
+I394
+ta(I578
+I394
+I578
+I408
+ta(I578
+I408
+I578
+I424
+ta(I578
+I424
+I578
+I440
+ta(I578
+I440
+I578
+I460
+ta(I578
+I460
+I578
+I478
+ta(I578
+I478
+I580
+I496
+ta(I580
+I496
+I581
+I516
+ta(I581
+I516
+I582
+I530
+ta(I582
+I530
+I584
+I535
+ta(I584
+I535
+I587
+I539
+ta(I587
+I539
+I589
+I542
+ta(I589
+I542
+I590
+I543
+ta(I590
+I543
+I591
+I543
+ta(I591
+I543
+I593
+I540
+ta(I593
+I540
+I595
+I534
+ta(I595
+I534
+I599
+I520
+ta(I599
+I520
+I602
+I504
+ta(I602
+I504
+I605
+I488
+ta(I605
+I488
+I608
+I470
+ta(I608
+I470
+I611
+I452
+ta(I611
+I452
+I614
+I436
+ta(I614
+I436
+I616
+I422
+ta(I616
+I422
+I618
+I408
+ta(I618
+I408
+I620
+I404
+ta(I620
+I404
+I620
+I400
+ta(I620
+I400
+I621
+I397
+ta(I621
+I397
+I621
+I396
+ta(I621
+I396
+I621
+I400
+ta(I621
+I400
+I621
+I414
+ta(I621
+I414
+I621
+I430
+ta(I621
+I430
+I622
+I446
+ta(I622
+I446
+I623
+I464
+ta(I623
+I464
+I624
+I484
+ta(I624
+I484
+I625
+I504
+ta(I625
+I504
+I626
+I520
+ta(I626
+I520
+I628
+I538
+ta(I628
+I538
+I629
+I544
+ta(I629
+I544
+I630
+I550
+ta(I630
+I550
+I632
+I552
+ta(I632
+I552
+I634
+I555
+ta(I634
+I555
+I635
+I555
+ta(I635
+I555
+I637
+I555
+ta(I637
+I555
+I640
+I552
+ta(I640
+I552
+I643
+I548
+ta(I643
+I548
+I647
+I542
+ta(I647
+I542
+I652
+I524
+ta(I652
+I524
+I655
+I508
+ta(I655
+I508
+I658
+I490
+ta(I658
+I490
+I661
+I472
+ta(I661
+I472
+I663
+I456
+ta(I663
+I456
+I664
+I438
+ta(I664
+I438
+I665
+I422
+ta(I665
+I422
+I666
+I416
+ta(I666
+I416
+I667
+I412
+ta(I667
+I412
+I667
+I409
+ta(I667
+I409
+I667
+I408
+ta(I667
+I408
+I668
+I409
+ta(I668
+I409
+I668
+I414
+ta(I668
+I414
+I668
+I420
+ta(I668
+I420
+I669
+I426
+ta(I669
+I426
+I670
+I442
+ta(I670
+I442
+I671
+I458
+ta(I671
+I458
+I672
+I476
+ta(I672
+I476
+I673
+I490
+ta(I673
+I490
+I674
+I504
+ta(I674
+I504
+I676
+I509
+ta(I676
+I509
+I678
+I515
+ta(I678
+I515
+I681
+I520
+ta(I681
+I520
+I683
+I523
+ta(I683
+I523
+I687
+I526
+ta(I687
+I526
+I689
+I526
+ta(I689
+I526
+I690
+I526
+ta(I690
+I526
+I691
+I526
+ta(I691
+I526
+I692
+I522
+ta(I692
+I522
+I693
+I519
+ta(I693
+I519
+I693
+I514
+ta(I693
+I514
+I694
+I500
+ta(I694
+I500
+I695
+I494
+ta(I695
+I494
+I696
+I480
+ta(I696
+I480
+I696
+I474
+ta(I696
+I474
+I697
+I469
+ta(I697
+I469
+I697
+I463
+ta(I697
+I463
+I698
+I460
+ta(I698
+I460
+I698
+I456
+ta(I698
+I456
+I698
+I453
+ta(I698
+I453
+I698
+I450
+ta(I698
+I450
+I698
+I453
+ta(I698
+I453
+I699
+I467
+ta(I699
+I467
+I700
+I473
+ta(I700
+I473
+I701
+I479
+ta(I701
+I479
+I701
+I485
+ta(I701
+I485
+I702
+I490
+ta(I702
+I490
+I703
+I496
+ta(I703
+I496
+I703
+I501
+ta(I703
+I501
+I703
+I505
+ta(I703
+I505
+I704
+I508
+ta(I704
+I508
+I704
+I511
+ta(I704
+I511
+I704
+I514
+ta(I704
+I514
+I705
+I515
+ta(I705
+I515
+I705
+I516
+ta(I705
+I516
+I705
+I517
+ta(I705
+I517
+I706
+I517
+tatp18
+a(S'Purple'
+p19
+I16
+(lp20
+(I56
+I145
+I57
+I145
+ta(I57
+I145
+I58
+I145
+ta(I58
+I145
+I59
+I145
+ta(I59
+I145
+I60
+I145
+ta(I60
+I145
+I61
+I145
+ta(I61
+I145
+I62
+I145
+ta(I62
+I145
+I63
+I144
+ta(I63
+I144
+I64
+I144
+ta(I64
+I144
+I65
+I144
+ta(I65
+I144
+I67
+I144
+ta(I67
+I144
+I68
+I144
+ta(I68
+I144
+I69
+I143
+ta(I69
+I143
+I70
+I143
+ta(I70
+I143
+I71
+I143
+ta(I71
+I143
+I73
+I142
+ta(I73
+I142
+I74
+I142
+ta(I74
+I142
+I75
+I141
+ta(I75
+I141
+I76
+I141
+ta(I76
+I141
+I77
+I140
+ta(I77
+I140
+I77
+I139
+ta(I77
+I139
+I78
+I139
+ta(I78
+I139
+I79
+I139
+ta(I79
+I139
+I79
+I138
+ta(I79
+I138
+I80
+I138
+ta(I80
+I138
+I81
+I138
+ta(I81
+I138
+I82
+I137
+ta(I82
+I137
+I83
+I137
+ta(I83
+I137
+I83
+I136
+ta(I83
+I136
+I84
+I136
+ta(I84
+I136
+I85
+I137
+ta(I85
+I137
+I85
+I138
+ta(I85
+I138
+I85
+I139
+ta(I85
+I139
+I85
+I141
+ta(I85
+I141
+I85
+I142
+ta(I85
+I142
+I85
+I143
+ta(I85
+I143
+I85
+I145
+ta(I85
+I145
+I85
+I146
+ta(I85
+I146
+I85
+I147
+ta(I85
+I147
+I86
+I149
+ta(I86
+I149
+I86
+I151
+ta(I86
+I151
+I86
+I152
+ta(I86
+I152
+I86
+I153
+ta(I86
+I153
+I87
+I154
+ta(I87
+I154
+I87
+I155
+ta(I87
+I155
+I87
+I156
+ta(I87
+I156
+I87
+I157
+ta(I87
+I157
+I87
+I159
+ta(I87
+I159
+I87
+I160
+ta(I87
+I160
+I87
+I161
+ta(I87
+I161
+I87
+I162
+ta(I87
+I162
+I87
+I163
+ta(I87
+I163
+I88
+I164
+ta(I88
+I164
+I88
+I165
+ta(I88
+I165
+I88
+I167
+ta(I88
+I167
+I88
+I168
+ta(I88
+I168
+I88
+I170
+ta(I88
+I170
+I88
+I171
+ta(I88
+I171
+I88
+I172
+ta(I88
+I172
+I88
+I173
+ta(I88
+I173
+I88
+I174
+ta(I88
+I174
+I88
+I175
+ta(I88
+I175
+I88
+I176
+ta(I88
+I176
+I88
+I177
+ta(I88
+I177
+I88
+I178
+ta(I88
+I178
+I88
+I179
+ta(I88
+I179
+I88
+I181
+ta(I88
+I181
+I88
+I182
+ta(I88
+I182
+I88
+I184
+ta(I88
+I184
+I88
+I186
+ta(I88
+I186
+I89
+I187
+ta(I89
+I187
+I89
+I188
+ta(I89
+I188
+I89
+I190
+ta(I89
+I190
+I89
+I191
+ta(I89
+I191
+I90
+I191
+ta(I90
+I191
+I90
+I192
+ta(I90
+I192
+I91
+I193
+ta(I91
+I193
+I91
+I194
+ta(I91
+I194
+I92
+I195
+ta(I92
+I195
+I93
+I196
+ta(I93
+I196
+I94
+I197
+ta(I94
+I197
+I95
+I198
+ta(I95
+I198
+I96
+I199
+ta(I96
+I199
+I97
+I199
+ta(I97
+I199
+I97
+I200
+ta(I97
+I200
+I98
+I201
+ta(I98
+I201
+I99
+I201
+ta(I99
+I201
+I99
+I202
+ta(I99
+I202
+I100
+I202
+ta(I100
+I202
+I101
+I202
+ta(I101
+I202
+I102
+I202
+ta(I102
+I202
+I103
+I202
+ta(I103
+I202
+I104
+I202
+ta(I104
+I202
+I106
+I202
+ta(I106
+I202
+I107
+I201
+ta(I107
+I201
+I108
+I200
+ta(I108
+I200
+I109
+I200
+ta(I109
+I200
+I110
+I199
+ta(I110
+I199
+I111
+I199
+ta(I111
+I199
+I112
+I198
+ta(I112
+I198
+I114
+I196
+ta(I114
+I196
+I114
+I195
+ta(I114
+I195
+I115
+I194
+ta(I115
+I194
+I116
+I193
+ta(I116
+I193
+I117
+I192
+ta(I117
+I192
+I117
+I190
+ta(I117
+I190
+I118
+I189
+ta(I118
+I189
+I119
+I188
+ta(I119
+I188
+I120
+I187
+ta(I120
+I187
+I120
+I185
+ta(I120
+I185
+I121
+I184
+ta(I121
+I184
+I122
+I183
+ta(I122
+I183
+I122
+I182
+ta(I122
+I182
+I122
+I180
+ta(I122
+I180
+I122
+I179
+ta(I122
+I179
+I122
+I178
+ta(I122
+I178
+I122
+I177
+ta(I122
+I177
+I122
+I176
+ta(I122
+I176
+I122
+I175
+ta(I122
+I175
+I122
+I174
+ta(I122
+I174
+I122
+I173
+ta(I122
+I173
+I122
+I172
+ta(I122
+I172
+I122
+I171
+ta(I122
+I171
+I122
+I172
+ta(I122
+I172
+I122
+I173
+ta(I122
+I173
+I123
+I174
+ta(I123
+I174
+I123
+I175
+ta(I123
+I175
+I124
+I177
+ta(I124
+I177
+I125
+I178
+ta(I125
+I178
+I125
+I180
+ta(I125
+I180
+I126
+I181
+ta(I126
+I181
+I126
+I182
+ta(I126
+I182
+I126
+I183
+ta(I126
+I183
+I127
+I184
+ta(I127
+I184
+I127
+I185
+ta(I127
+I185
+I127
+I186
+ta(I127
+I186
+I128
+I187
+ta(I128
+I187
+I129
+I188
+ta(I129
+I188
+I130
+I189
+ta(I130
+I189
+I131
+I190
+ta(I131
+I190
+I132
+I190
+ta(I132
+I190
+I133
+I191
+ta(I133
+I191
+I134
+I191
+ta(I134
+I191
+I135
+I192
+ta(I135
+I192
+I136
+I192
+ta(I136
+I192
+I137
+I192
+ta(I137
+I192
+I138
+I192
+ta(I138
+I192
+I139
+I192
+ta(I139
+I192
+I140
+I192
+ta(I140
+I192
+I141
+I192
+ta(I141
+I192
+I143
+I192
+ta(I143
+I192
+I144
+I191
+ta(I144
+I191
+I145
+I191
+ta(I145
+I191
+I146
+I191
+ta(I146
+I191
+I147
+I191
+ta(I147
+I191
+I148
+I190
+ta(I148
+I190
+I149
+I190
+ta(I149
+I190
+I150
+I189
+ta(I150
+I189
+I151
+I188
+ta(I151
+I188
+I152
+I188
+ta(I152
+I188
+I153
+I188
+ta(I153
+I188
+I153
+I187
+ta(I153
+I187
+I153
+I186
+ta(I153
+I186
+I154
+I186
+ta(I154
+I186
+I154
+I185
+ta(I154
+I185
+I155
+I184
+ta(I155
+I184
+I155
+I182
+ta(I155
+I182
+I156
+I181
+ta(I156
+I181
+I157
+I180
+ta(I157
+I180
+I157
+I179
+ta(I157
+I179
+I158
+I178
+ta(I158
+I178
+I158
+I177
+ta(I158
+I177
+I158
+I175
+ta(I158
+I175
+I159
+I175
+ta(I159
+I175
+I159
+I174
+ta(I159
+I174
+I159
+I173
+ta(I159
+I173
+I160
+I172
+ta(I160
+I172
+I160
+I170
+ta(I160
+I170
+I160
+I168
+ta(I160
+I168
+I161
+I167
+ta(I161
+I167
+I161
+I166
+ta(I161
+I166
+I161
+I164
+ta(I161
+I164
+I162
+I163
+ta(I162
+I163
+I162
+I161
+ta(I162
+I161
+I162
+I160
+ta(I162
+I160
+I162
+I159
+ta(I162
+I159
+I162
+I158
+ta(I162
+I158
+I162
+I157
+ta(I162
+I157
+I162
+I155
+ta(I162
+I155
+I162
+I154
+ta(I162
+I154
+I162
+I153
+ta(I162
+I153
+I162
+I152
+ta(I162
+I152
+I162
+I151
+ta(I162
+I151
+I162
+I150
+ta(I162
+I150
+I162
+I149
+ta(I162
+I149
+I162
+I148
+ta(I162
+I148
+I162
+I147
+ta(I162
+I147
+I161
+I146
+ta(I161
+I146
+I161
+I145
+ta(I161
+I145
+I160
+I144
+ta(I160
+I144
+I160
+I143
+ta(I160
+I143
+I160
+I142
+ta(I160
+I142
+I159
+I141
+ta(I159
+I141
+I159
+I140
+ta(I159
+I140
+I158
+I139
+ta(I158
+I139
+I158
+I138
+ta(I158
+I138
+I157
+I138
+ta(I157
+I138
+I157
+I137
+ta(I157
+I137
+I156
+I136
+ta(I156
+I136
+I156
+I135
+ta(I156
+I135
+I155
+I135
+ta(I155
+I135
+I155
+I134
+ta(I155
+I134
+I154
+I134
+ta(I154
+I134
+I154
+I133
+ta(I154
+I133
+I153
+I132
+ta(I153
+I132
+I153
+I131
+ta(I153
+I131
+I152
+I131
+ta(I152
+I131
+I152
+I130
+ta(I152
+I130
+I151
+I130
+ta(I151
+I130
+I151
+I129
+tatp21
+a(g19
+I16
+(lp22
+(I185
+I125
+I186
+I126
+ta(I186
+I126
+I188
+I127
+ta(I188
+I127
+I189
+I128
+ta(I189
+I128
+I190
+I129
+ta(I190
+I129
+I191
+I130
+ta(I191
+I130
+I192
+I131
+ta(I192
+I131
+I194
+I132
+ta(I194
+I132
+I195
+I134
+ta(I195
+I134
+I196
+I135
+ta(I196
+I135
+I198
+I136
+ta(I198
+I136
+I199
+I138
+ta(I199
+I138
+I200
+I139
+ta(I200
+I139
+I201
+I139
+ta(I201
+I139
+I203
+I141
+ta(I203
+I141
+I204
+I141
+ta(I204
+I141
+I204
+I142
+ta(I204
+I142
+I205
+I143
+ta(I205
+I143
+I206
+I144
+ta(I206
+I144
+I207
+I145
+ta(I207
+I145
+I208
+I146
+ta(I208
+I146
+I209
+I147
+ta(I209
+I147
+I210
+I148
+ta(I210
+I148
+I211
+I149
+ta(I211
+I149
+I212
+I150
+ta(I212
+I150
+I213
+I151
+ta(I213
+I151
+I214
+I152
+ta(I214
+I152
+I215
+I153
+ta(I215
+I153
+I215
+I154
+ta(I215
+I154
+I216
+I155
+ta(I216
+I155
+I218
+I156
+ta(I218
+I156
+I219
+I157
+ta(I219
+I157
+I220
+I159
+ta(I220
+I159
+I221
+I160
+ta(I221
+I160
+I222
+I162
+ta(I222
+I162
+I223
+I164
+ta(I223
+I164
+I224
+I166
+ta(I224
+I166
+I226
+I168
+ta(I226
+I168
+I227
+I170
+ta(I227
+I170
+I228
+I171
+ta(I228
+I171
+I229
+I173
+ta(I229
+I173
+I230
+I174
+ta(I230
+I174
+I230
+I175
+ta(I230
+I175
+I231
+I176
+ta(I231
+I176
+I231
+I177
+ta(I231
+I177
+I232
+I177
+ta(I232
+I177
+I233
+I178
+ta(I233
+I178
+I233
+I180
+ta(I233
+I180
+I234
+I180
+ta(I234
+I180
+I235
+I181
+ta(I235
+I181
+I235
+I182
+ta(I235
+I182
+I236
+I183
+ta(I236
+I183
+I237
+I184
+ta(I237
+I184
+I237
+I185
+ta(I237
+I185
+I238
+I186
+ta(I238
+I186
+I238
+I187
+ta(I238
+I187
+I239
+I187
+ta(I239
+I187
+I239
+I188
+ta(I239
+I188
+I240
+I188
+ta(I240
+I188
+I240
+I189
+ta(I240
+I189
+I241
+I190
+ta(I241
+I190
+I241
+I191
+ta(I241
+I191
+I242
+I192
+ta(I242
+I192
+I243
+I193
+ta(I243
+I193
+I243
+I194
+ta(I243
+I194
+I244
+I194
+tatp23
+a(g19
+I16
+(lp24
+(I236
+I127
+I236
+I128
+ta(I236
+I128
+I236
+I129
+ta(I236
+I129
+I236
+I130
+ta(I236
+I130
+I235
+I131
+ta(I235
+I131
+I234
+I132
+ta(I234
+I132
+I233
+I134
+ta(I233
+I134
+I233
+I135
+ta(I233
+I135
+I232
+I136
+ta(I232
+I136
+I231
+I138
+ta(I231
+I138
+I230
+I139
+ta(I230
+I139
+I229
+I141
+ta(I229
+I141
+I228
+I142
+ta(I228
+I142
+I226
+I144
+ta(I226
+I144
+I225
+I146
+ta(I225
+I146
+I224
+I147
+ta(I224
+I147
+I223
+I149
+ta(I223
+I149
+I222
+I150
+ta(I222
+I150
+I222
+I151
+ta(I222
+I151
+I220
+I153
+ta(I220
+I153
+I220
+I154
+ta(I220
+I154
+I219
+I155
+ta(I219
+I155
+I218
+I156
+ta(I218
+I156
+I217
+I157
+ta(I217
+I157
+I216
+I159
+ta(I216
+I159
+I215
+I160
+ta(I215
+I160
+I214
+I161
+ta(I214
+I161
+I213
+I162
+ta(I213
+I162
+I213
+I163
+ta(I213
+I163
+I212
+I165
+ta(I212
+I165
+I211
+I166
+ta(I211
+I166
+I211
+I167
+ta(I211
+I167
+I209
+I168
+ta(I209
+I168
+I208
+I170
+ta(I208
+I170
+I208
+I171
+ta(I208
+I171
+I207
+I172
+ta(I207
+I172
+I206
+I173
+ta(I206
+I173
+I205
+I174
+ta(I205
+I174
+I205
+I175
+ta(I205
+I175
+I204
+I176
+ta(I204
+I176
+I204
+I177
+ta(I204
+I177
+I203
+I178
+ta(I203
+I178
+I203
+I179
+ta(I203
+I179
+I202
+I181
+ta(I202
+I181
+I201
+I181
+ta(I201
+I181
+I201
+I182
+ta(I201
+I182
+I201
+I183
+ta(I201
+I183
+I200
+I184
+ta(I200
+I184
+I200
+I185
+ta(I200
+I185
+I199
+I185
+ta(I199
+I185
+I199
+I186
+ta(I199
+I186
+I199
+I187
+ta(I199
+I187
+I199
+I188
+ta(I199
+I188
+I198
+I188
+ta(I198
+I188
+I198
+I189
+ta(I198
+I189
+I198
+I190
+ta(I198
+I190
+I197
+I190
+ta(I197
+I190
+I197
+I191
+ta(I197
+I191
+I197
+I192
+tatp25
+a(g19
+I16
+(lp26
+(I261
+I48
+I262
+I48
+ta(I262
+I48
+I262
+I51
+ta(I262
+I51
+I263
+I53
+ta(I263
+I53
+I263
+I55
+ta(I263
+I55
+I263
+I57
+ta(I263
+I57
+I264
+I60
+ta(I264
+I60
+I264
+I62
+ta(I264
+I62
+I264
+I65
+ta(I264
+I65
+I264
+I68
+ta(I264
+I68
+I265
+I71
+ta(I265
+I71
+I265
+I74
+ta(I265
+I74
+I266
+I77
+ta(I266
+I77
+I266
+I80
+ta(I266
+I80
+I267
+I84
+ta(I267
+I84
+I267
+I86
+ta(I267
+I86
+I267
+I89
+ta(I267
+I89
+I268
+I92
+ta(I268
+I92
+I268
+I95
+ta(I268
+I95
+I268
+I97
+ta(I268
+I97
+I269
+I101
+ta(I269
+I101
+I269
+I104
+ta(I269
+I104
+I269
+I107
+ta(I269
+I107
+I269
+I110
+ta(I269
+I110
+I270
+I113
+ta(I270
+I113
+I270
+I116
+ta(I270
+I116
+I271
+I119
+ta(I271
+I119
+I271
+I121
+ta(I271
+I121
+I271
+I123
+ta(I271
+I123
+I272
+I124
+ta(I272
+I124
+I272
+I125
+ta(I272
+I125
+I272
+I126
+ta(I272
+I126
+I273
+I127
+ta(I273
+I127
+I274
+I128
+ta(I274
+I128
+I274
+I130
+ta(I274
+I130
+I275
+I131
+ta(I275
+I131
+I275
+I133
+ta(I275
+I133
+I275
+I135
+ta(I275
+I135
+I276
+I137
+ta(I276
+I137
+I276
+I138
+ta(I276
+I138
+I276
+I140
+ta(I276
+I140
+I276
+I142
+ta(I276
+I142
+I276
+I144
+ta(I276
+I144
+I276
+I145
+ta(I276
+I145
+I276
+I146
+ta(I276
+I146
+I277
+I148
+ta(I277
+I148
+I277
+I150
+ta(I277
+I150
+I277
+I152
+ta(I277
+I152
+I278
+I154
+ta(I278
+I154
+I278
+I155
+ta(I278
+I155
+I278
+I157
+ta(I278
+I157
+I279
+I159
+ta(I279
+I159
+I280
+I162
+ta(I280
+I162
+I280
+I164
+ta(I280
+I164
+I280
+I165
+ta(I280
+I165
+I280
+I168
+ta(I280
+I168
+I280
+I169
+ta(I280
+I169
+I280
+I171
+ta(I280
+I171
+I280
+I173
+ta(I280
+I173
+I280
+I175
+ta(I280
+I175
+I280
+I177
+ta(I280
+I177
+I280
+I179
+ta(I280
+I179
+I280
+I180
+ta(I280
+I180
+I280
+I182
+ta(I280
+I182
+I280
+I183
+ta(I280
+I183
+I280
+I184
+ta(I280
+I184
+I280
+I185
+ta(I280
+I185
+I280
+I186
+ta(I280
+I186
+I280
+I187
+ta(I280
+I187
+I280
+I188
+ta(I280
+I188
+I280
+I189
+ta(I280
+I189
+I280
+I190
+ta(I280
+I190
+I280
+I191
+ta(I280
+I191
+I281
+I192
+ta(I281
+I192
+I281
+I193
+tatp27
+a(g19
+I16
+(lp28
+(I256
+I46
+I257
+I46
+ta(I257
+I46
+I259
+I45
+ta(I259
+I45
+I262
+I44
+ta(I262
+I44
+I265
+I43
+ta(I265
+I43
+I268
+I42
+ta(I268
+I42
+I271
+I40
+ta(I271
+I40
+I275
+I39
+ta(I275
+I39
+I278
+I38
+ta(I278
+I38
+I281
+I37
+ta(I281
+I37
+I284
+I36
+ta(I284
+I36
+I287
+I36
+ta(I287
+I36
+I288
+I35
+ta(I288
+I35
+I290
+I35
+ta(I290
+I35
+I291
+I35
+ta(I291
+I35
+I292
+I35
+ta(I292
+I35
+I294
+I35
+ta(I294
+I35
+I295
+I35
+ta(I295
+I35
+I296
+I35
+ta(I296
+I35
+I297
+I36
+ta(I297
+I36
+I298
+I36
+ta(I298
+I36
+I299
+I36
+ta(I299
+I36
+I300
+I36
+ta(I300
+I36
+I301
+I37
+ta(I301
+I37
+I303
+I38
+ta(I303
+I38
+I304
+I38
+ta(I304
+I38
+I306
+I39
+ta(I306
+I39
+I307
+I39
+ta(I307
+I39
+I309
+I40
+ta(I309
+I40
+I310
+I41
+ta(I310
+I41
+I312
+I42
+ta(I312
+I42
+I314
+I42
+ta(I314
+I42
+I316
+I43
+ta(I316
+I43
+I317
+I44
+ta(I317
+I44
+I319
+I45
+ta(I319
+I45
+I320
+I46
+ta(I320
+I46
+I321
+I47
+ta(I321
+I47
+I322
+I48
+ta(I322
+I48
+I323
+I49
+ta(I323
+I49
+I324
+I50
+ta(I324
+I50
+I325
+I51
+ta(I325
+I51
+I326
+I51
+ta(I326
+I51
+I328
+I52
+ta(I328
+I52
+I329
+I52
+ta(I329
+I52
+I329
+I53
+ta(I329
+I53
+I330
+I54
+ta(I330
+I54
+I331
+I55
+ta(I331
+I55
+I332
+I56
+ta(I332
+I56
+I333
+I57
+ta(I333
+I57
+I334
+I59
+ta(I334
+I59
+I335
+I60
+ta(I335
+I60
+I336
+I61
+ta(I336
+I61
+I338
+I63
+ta(I338
+I63
+I339
+I64
+ta(I339
+I64
+I340
+I66
+ta(I340
+I66
+I341
+I67
+ta(I341
+I67
+I342
+I69
+ta(I342
+I69
+I342
+I70
+ta(I342
+I70
+I343
+I71
+ta(I343
+I71
+I344
+I73
+ta(I344
+I73
+I345
+I73
+ta(I345
+I73
+I345
+I75
+ta(I345
+I75
+I346
+I75
+ta(I346
+I75
+I346
+I76
+ta(I346
+I76
+I346
+I77
+ta(I346
+I77
+I347
+I77
+ta(I347
+I77
+I347
+I78
+ta(I347
+I78
+I347
+I79
+ta(I347
+I79
+I347
+I80
+ta(I347
+I80
+I347
+I81
+ta(I347
+I81
+I347
+I83
+ta(I347
+I83
+I347
+I84
+ta(I347
+I84
+I347
+I85
+ta(I347
+I85
+I347
+I87
+ta(I347
+I87
+I347
+I89
+ta(I347
+I89
+I347
+I91
+ta(I347
+I91
+I346
+I92
+ta(I346
+I92
+I345
+I94
+ta(I345
+I94
+I344
+I96
+ta(I344
+I96
+I343
+I98
+ta(I343
+I98
+I342
+I99
+ta(I342
+I99
+I342
+I100
+ta(I342
+I100
+I341
+I102
+ta(I341
+I102
+I340
+I103
+ta(I340
+I103
+I339
+I104
+ta(I339
+I104
+I338
+I105
+ta(I338
+I105
+I338
+I106
+ta(I338
+I106
+I336
+I108
+ta(I336
+I108
+I335
+I109
+ta(I335
+I109
+I333
+I111
+ta(I333
+I111
+I332
+I112
+ta(I332
+I112
+I331
+I113
+ta(I331
+I113
+I330
+I114
+ta(I330
+I114
+I329
+I115
+ta(I329
+I115
+I328
+I115
+ta(I328
+I115
+I328
+I116
+ta(I328
+I116
+I327
+I116
+ta(I327
+I116
+I326
+I117
+ta(I326
+I117
+I324
+I117
+ta(I324
+I117
+I323
+I118
+ta(I323
+I118
+I321
+I119
+ta(I321
+I119
+I319
+I120
+ta(I319
+I120
+I317
+I121
+ta(I317
+I121
+I315
+I122
+ta(I315
+I122
+I313
+I123
+ta(I313
+I123
+I311
+I124
+ta(I311
+I124
+I309
+I124
+ta(I309
+I124
+I307
+I125
+ta(I307
+I125
+I305
+I126
+ta(I305
+I126
+I304
+I126
+ta(I304
+I126
+I303
+I127
+ta(I303
+I127
+I301
+I127
+ta(I301
+I127
+I300
+I128
+ta(I300
+I128
+I299
+I128
+ta(I299
+I128
+I298
+I128
+ta(I298
+I128
+I297
+I128
+ta(I297
+I128
+I296
+I128
+ta(I296
+I128
+I295
+I128
+ta(I295
+I128
+I293
+I128
+ta(I293
+I128
+I292
+I128
+ta(I292
+I128
+I291
+I128
+ta(I291
+I128
+I290
+I128
+ta(I290
+I128
+I289
+I129
+ta(I289
+I129
+I288
+I129
+ta(I288
+I129
+I287
+I129
+ta(I287
+I129
+I286
+I129
+ta(I286
+I129
+I285
+I129
+ta(I285
+I129
+I284
+I129
+tatp29
+a(g19
+I16
+(lp30
+(I354
+I127
+I355
+I128
+ta(I355
+I128
+I355
+I130
+ta(I355
+I130
+I355
+I131
+ta(I355
+I131
+I355
+I133
+ta(I355
+I133
+I355
+I134
+ta(I355
+I134
+I356
+I136
+ta(I356
+I136
+I356
+I139
+ta(I356
+I139
+I356
+I141
+ta(I356
+I141
+I357
+I143
+ta(I357
+I143
+I357
+I145
+ta(I357
+I145
+I357
+I148
+ta(I357
+I148
+I358
+I150
+ta(I358
+I150
+I359
+I152
+ta(I359
+I152
+I359
+I154
+ta(I359
+I154
+I360
+I156
+ta(I360
+I156
+I361
+I158
+ta(I361
+I158
+I361
+I159
+ta(I361
+I159
+I361
+I161
+ta(I361
+I161
+I362
+I163
+ta(I362
+I163
+I362
+I164
+ta(I362
+I164
+I363
+I165
+ta(I363
+I165
+I364
+I166
+ta(I364
+I166
+I364
+I168
+ta(I364
+I168
+I365
+I168
+ta(I365
+I168
+I366
+I169
+ta(I366
+I169
+I367
+I170
+ta(I367
+I170
+I368
+I170
+ta(I368
+I170
+I368
+I171
+ta(I368
+I171
+I369
+I171
+ta(I369
+I171
+I370
+I173
+ta(I370
+I173
+I370
+I174
+ta(I370
+I174
+I371
+I175
+ta(I371
+I175
+I373
+I176
+ta(I373
+I176
+I374
+I177
+ta(I374
+I177
+I375
+I178
+ta(I375
+I178
+I377
+I179
+ta(I377
+I179
+I378
+I180
+ta(I378
+I180
+I379
+I180
+ta(I379
+I180
+I380
+I181
+ta(I380
+I181
+I381
+I182
+ta(I381
+I182
+I382
+I182
+ta(I382
+I182
+I384
+I182
+ta(I384
+I182
+I385
+I183
+ta(I385
+I183
+I386
+I183
+ta(I386
+I183
+I388
+I183
+ta(I388
+I183
+I389
+I183
+ta(I389
+I183
+I390
+I183
+ta(I390
+I183
+I391
+I183
+ta(I391
+I183
+I392
+I182
+ta(I392
+I182
+I393
+I181
+ta(I393
+I181
+I393
+I180
+ta(I393
+I180
+I394
+I179
+ta(I394
+I179
+I395
+I177
+ta(I395
+I177
+I396
+I176
+ta(I396
+I176
+I397
+I175
+ta(I397
+I175
+I398
+I174
+ta(I398
+I174
+I399
+I174
+ta(I399
+I174
+I399
+I173
+ta(I399
+I173
+I399
+I172
+ta(I399
+I172
+I400
+I171
+ta(I400
+I171
+I400
+I169
+ta(I400
+I169
+I400
+I167
+ta(I400
+I167
+I400
+I166
+ta(I400
+I166
+I401
+I165
+ta(I401
+I165
+I401
+I163
+ta(I401
+I163
+I402
+I162
+ta(I402
+I162
+I402
+I161
+ta(I402
+I161
+I403
+I160
+ta(I403
+I160
+I403
+I159
+ta(I403
+I159
+I403
+I158
+ta(I403
+I158
+I403
+I157
+ta(I403
+I157
+I404
+I156
+ta(I404
+I156
+I404
+I154
+ta(I404
+I154
+I404
+I153
+ta(I404
+I153
+I404
+I151
+ta(I404
+I151
+I405
+I150
+ta(I405
+I150
+I405
+I149
+ta(I405
+I149
+I405
+I146
+ta(I405
+I146
+I405
+I145
+ta(I405
+I145
+I405
+I143
+ta(I405
+I143
+I405
+I142
+ta(I405
+I142
+I405
+I140
+ta(I405
+I140
+I405
+I139
+ta(I405
+I139
+I405
+I138
+ta(I405
+I138
+I405
+I137
+ta(I405
+I137
+I405
+I136
+ta(I405
+I136
+I405
+I135
+ta(I405
+I135
+I405
+I136
+ta(I405
+I136
+I406
+I139
+ta(I406
+I139
+I407
+I141
+ta(I407
+I141
+I408
+I144
+ta(I408
+I144
+I409
+I147
+ta(I409
+I147
+I409
+I149
+ta(I409
+I149
+I410
+I152
+ta(I410
+I152
+I411
+I154
+ta(I411
+I154
+I412
+I156
+ta(I412
+I156
+I412
+I158
+ta(I412
+I158
+I413
+I160
+ta(I413
+I160
+I414
+I161
+ta(I414
+I161
+I415
+I162
+ta(I415
+I162
+I415
+I164
+ta(I415
+I164
+I416
+I165
+ta(I416
+I165
+I417
+I167
+ta(I417
+I167
+I417
+I169
+ta(I417
+I169
+I418
+I171
+ta(I418
+I171
+I418
+I172
+ta(I418
+I172
+I418
+I174
+ta(I418
+I174
+I419
+I176
+ta(I419
+I176
+I419
+I177
+ta(I419
+I177
+I420
+I179
+ta(I420
+I179
+I420
+I180
+ta(I420
+I180
+I421
+I182
+ta(I421
+I182
+I422
+I184
+ta(I422
+I184
+I422
+I185
+ta(I422
+I185
+I422
+I188
+ta(I422
+I188
+I423
+I189
+ta(I423
+I189
+I423
+I191
+ta(I423
+I191
+I423
+I193
+ta(I423
+I193
+I423
+I195
+ta(I423
+I195
+I423
+I197
+ta(I423
+I197
+I423
+I199
+ta(I423
+I199
+I424
+I201
+ta(I424
+I201
+I424
+I203
+ta(I424
+I203
+I424
+I205
+ta(I424
+I205
+I425
+I207
+ta(I425
+I207
+I425
+I209
+ta(I425
+I209
+I425
+I211
+ta(I425
+I211
+I425
+I213
+ta(I425
+I213
+I426
+I215
+ta(I426
+I215
+I426
+I217
+ta(I426
+I217
+I426
+I219
+ta(I426
+I219
+I426
+I221
+ta(I426
+I221
+I426
+I223
+ta(I426
+I223
+I426
+I225
+ta(I426
+I225
+I426
+I226
+ta(I426
+I226
+I426
+I229
+ta(I426
+I229
+I426
+I230
+ta(I426
+I230
+I426
+I232
+ta(I426
+I232
+I427
+I234
+ta(I427
+I234
+I427
+I237
+ta(I427
+I237
+I427
+I239
+ta(I427
+I239
+I427
+I241
+ta(I427
+I241
+I427
+I243
+ta(I427
+I243
+I427
+I245
+ta(I427
+I245
+I426
+I248
+ta(I426
+I248
+I426
+I250
+ta(I426
+I250
+I425
+I252
+ta(I425
+I252
+I424
+I254
+ta(I424
+I254
+I424
+I256
+ta(I424
+I256
+I424
+I257
+ta(I424
+I257
+I423
+I258
+ta(I423
+I258
+I422
+I259
+ta(I422
+I259
+I422
+I261
+ta(I422
+I261
+I421
+I262
+ta(I421
+I262
+I420
+I263
+ta(I420
+I263
+I419
+I265
+ta(I419
+I265
+I418
+I267
+ta(I418
+I267
+I416
+I268
+ta(I416
+I268
+I413
+I270
+ta(I413
+I270
+I411
+I272
+ta(I411
+I272
+I408
+I274
+ta(I408
+I274
+I406
+I275
+ta(I406
+I275
+I404
+I276
+ta(I404
+I276
+I402
+I278
+ta(I402
+I278
+I400
+I279
+ta(I400
+I279
+I398
+I280
+ta(I398
+I280
+I396
+I280
+ta(I396
+I280
+I394
+I280
+ta(I394
+I280
+I392
+I281
+ta(I392
+I281
+I390
+I281
+ta(I390
+I281
+I387
+I281
+ta(I387
+I281
+I385
+I281
+ta(I385
+I281
+I382
+I281
+ta(I382
+I281
+I379
+I280
+ta(I379
+I280
+I376
+I280
+ta(I376
+I280
+I372
+I279
+ta(I372
+I279
+I367
+I279
+ta(I367
+I279
+I362
+I279
+ta(I362
+I279
+I358
+I279
+ta(I358
+I279
+I354
+I279
+ta(I354
+I279
+I350
+I279
+ta(I350
+I279
+I348
+I278
+ta(I348
+I278
+I345
+I278
+ta(I345
+I278
+I343
+I277
+ta(I343
+I277
+I341
+I277
+ta(I341
+I277
+I340
+I276
+ta(I340
+I276
+I338
+I275
+ta(I338
+I275
+I337
+I274
+ta(I337
+I274
+I336
+I274
+ta(I336
+I274
+I335
+I273
+ta(I335
+I273
+I334
+I273
+ta(I334
+I273
+I334
+I272
+ta(I334
+I272
+I333
+I272
+ta(I333
+I272
+I333
+I271
+tatp31
+a(g19
+I16
+(lp32
+(I428
+I79
+I428
+I80
+ta(I428
+I80
+I429
+I81
+ta(I429
+I81
+I430
+I83
+ta(I430
+I83
+I430
+I85
+ta(I430
+I85
+I431
+I87
+ta(I431
+I87
+I431
+I89
+ta(I431
+I89
+I431
+I91
+ta(I431
+I91
+I432
+I93
+ta(I432
+I93
+I432
+I96
+ta(I432
+I96
+I432
+I98
+ta(I432
+I98
+I432
+I101
+ta(I432
+I101
+I433
+I104
+ta(I433
+I104
+I433
+I107
+ta(I433
+I107
+I434
+I109
+ta(I434
+I109
+I434
+I112
+ta(I434
+I112
+I434
+I115
+ta(I434
+I115
+I435
+I117
+ta(I435
+I117
+I435
+I121
+ta(I435
+I121
+I435
+I124
+ta(I435
+I124
+I435
+I126
+ta(I435
+I126
+I436
+I128
+ta(I436
+I128
+I436
+I131
+ta(I436
+I131
+I437
+I133
+ta(I437
+I133
+I438
+I135
+ta(I438
+I135
+I438
+I137
+ta(I438
+I137
+I439
+I139
+ta(I439
+I139
+I440
+I140
+ta(I440
+I140
+I441
+I142
+ta(I441
+I142
+I441
+I144
+ta(I441
+I144
+I442
+I146
+ta(I442
+I146
+I443
+I148
+ta(I443
+I148
+I443
+I149
+ta(I443
+I149
+I443
+I152
+ta(I443
+I152
+I444
+I154
+ta(I444
+I154
+I445
+I156
+ta(I445
+I156
+I445
+I158
+ta(I445
+I158
+I446
+I160
+ta(I446
+I160
+I446
+I162
+ta(I446
+I162
+I447
+I163
+ta(I447
+I163
+I447
+I164
+ta(I447
+I164
+I448
+I165
+ta(I448
+I165
+I448
+I166
+ta(I448
+I166
+I448
+I167
+ta(I448
+I167
+I449
+I167
+ta(I449
+I167
+I449
+I168
+ta(I449
+I168
+I450
+I168
+ta(I450
+I168
+I451
+I169
+ta(I451
+I169
+I452
+I169
+ta(I452
+I169
+I453
+I170
+ta(I453
+I170
+I455
+I170
+ta(I455
+I170
+I456
+I171
+ta(I456
+I171
+I457
+I172
+ta(I457
+I172
+I459
+I172
+ta(I459
+I172
+I460
+I172
+ta(I460
+I172
+I461
+I173
+ta(I461
+I173
+I462
+I173
+ta(I462
+I173
+I463
+I173
+ta(I463
+I173
+I465
+I173
+ta(I465
+I173
+I466
+I174
+ta(I466
+I174
+I467
+I174
+ta(I467
+I174
+I469
+I174
+tatp33
+a(g19
+I16
+(lp34
+(I421
+I106
+I422
+I106
+ta(I422
+I106
+I423
+I106
+ta(I423
+I106
+I424
+I106
+ta(I424
+I106
+I425
+I106
+ta(I425
+I106
+I427
+I107
+ta(I427
+I107
+I428
+I107
+ta(I428
+I107
+I430
+I107
+ta(I430
+I107
+I433
+I107
+ta(I433
+I107
+I435
+I107
+ta(I435
+I107
+I437
+I107
+ta(I437
+I107
+I439
+I107
+ta(I439
+I107
+I441
+I107
+ta(I441
+I107
+I442
+I107
+ta(I442
+I107
+I443
+I107
+ta(I443
+I107
+I444
+I107
+ta(I444
+I107
+I445
+I107
+ta(I445
+I107
+I446
+I107
+ta(I446
+I107
+I447
+I107
+ta(I447
+I107
+I447
+I106
+ta(I447
+I106
+I448
+I106
+ta(I448
+I106
+I449
+I106
+ta(I449
+I106
+I450
+I106
+ta(I450
+I106
+I451
+I106
+ta(I451
+I106
+I452
+I106
+ta(I452
+I106
+I453
+I107
+ta(I453
+I107
+I454
+I107
+tatp35
+a(g19
+I16
+(lp36
+(I459
+I49
+I460
+I49
+ta(I460
+I49
+I462
+I51
+ta(I462
+I51
+I463
+I53
+ta(I463
+I53
+I464
+I55
+ta(I464
+I55
+I466
+I58
+ta(I466
+I58
+I468
+I60
+ta(I468
+I60
+I469
+I64
+ta(I469
+I64
+I471
+I66
+ta(I471
+I66
+I472
+I69
+ta(I472
+I69
+I473
+I72
+ta(I473
+I72
+I474
+I74
+ta(I474
+I74
+I475
+I77
+ta(I475
+I77
+I477
+I80
+ta(I477
+I80
+I478
+I83
+ta(I478
+I83
+I478
+I85
+ta(I478
+I85
+I479
+I88
+ta(I479
+I88
+I480
+I91
+ta(I480
+I91
+I481
+I94
+ta(I481
+I94
+I481
+I97
+ta(I481
+I97
+I482
+I99
+ta(I482
+I99
+I482
+I101
+ta(I482
+I101
+I483
+I103
+ta(I483
+I103
+I483
+I105
+ta(I483
+I105
+I483
+I106
+ta(I483
+I106
+I483
+I109
+ta(I483
+I109
+I484
+I111
+ta(I484
+I111
+I484
+I113
+ta(I484
+I113
+I485
+I115
+ta(I485
+I115
+I486
+I117
+ta(I486
+I117
+I486
+I119
+ta(I486
+I119
+I487
+I122
+ta(I487
+I122
+I488
+I124
+ta(I488
+I124
+I488
+I126
+ta(I488
+I126
+I489
+I128
+ta(I489
+I128
+I489
+I130
+ta(I489
+I130
+I490
+I132
+ta(I490
+I132
+I490
+I134
+ta(I490
+I134
+I491
+I136
+ta(I491
+I136
+I492
+I138
+ta(I492
+I138
+I492
+I140
+ta(I492
+I140
+I493
+I143
+ta(I493
+I143
+I494
+I145
+ta(I494
+I145
+I495
+I148
+ta(I495
+I148
+I495
+I150
+ta(I495
+I150
+I496
+I152
+ta(I496
+I152
+I496
+I153
+ta(I496
+I153
+I497
+I154
+ta(I497
+I154
+I497
+I155
+ta(I497
+I155
+I497
+I157
+ta(I497
+I157
+I498
+I158
+ta(I498
+I158
+I498
+I159
+ta(I498
+I159
+I498
+I160
+ta(I498
+I160
+I499
+I161
+ta(I499
+I161
+I499
+I162
+ta(I499
+I162
+I499
+I163
+ta(I499
+I163
+I499
+I164
+ta(I499
+I164
+I500
+I165
+ta(I500
+I165
+I500
+I166
+ta(I500
+I166
+I500
+I167
+tatp37
+a(g19
+I16
+(lp38
+(I489
+I116
+I488
+I115
+ta(I488
+I115
+I488
+I114
+ta(I488
+I114
+I488
+I113
+ta(I488
+I113
+I488
+I112
+ta(I488
+I112
+I488
+I111
+ta(I488
+I111
+I488
+I110
+ta(I488
+I110
+I488
+I109
+ta(I488
+I109
+I489
+I108
+ta(I489
+I108
+I489
+I107
+ta(I489
+I107
+I491
+I105
+ta(I491
+I105
+I491
+I104
+ta(I491
+I104
+I492
+I103
+ta(I492
+I103
+I492
+I102
+ta(I492
+I102
+I493
+I102
+ta(I493
+I102
+I493
+I101
+ta(I493
+I101
+I494
+I101
+ta(I494
+I101
+I495
+I100
+ta(I495
+I100
+I496
+I99
+ta(I496
+I99
+I497
+I99
+ta(I497
+I99
+I498
+I98
+ta(I498
+I98
+I499
+I98
+ta(I499
+I98
+I500
+I98
+ta(I500
+I98
+I501
+I97
+ta(I501
+I97
+I502
+I97
+ta(I502
+I97
+I504
+I97
+ta(I504
+I97
+I505
+I97
+ta(I505
+I97
+I507
+I97
+ta(I507
+I97
+I509
+I97
+ta(I509
+I97
+I511
+I97
+ta(I511
+I97
+I513
+I97
+ta(I513
+I97
+I514
+I98
+ta(I514
+I98
+I516
+I98
+ta(I516
+I98
+I517
+I98
+ta(I517
+I98
+I518
+I98
+ta(I518
+I98
+I519
+I99
+ta(I519
+I99
+I520
+I99
+ta(I520
+I99
+I521
+I100
+ta(I521
+I100
+I522
+I101
+ta(I522
+I101
+I523
+I102
+ta(I523
+I102
+I524
+I103
+ta(I524
+I103
+I525
+I104
+ta(I525
+I104
+I526
+I104
+ta(I526
+I104
+I527
+I105
+ta(I527
+I105
+I527
+I106
+ta(I527
+I106
+I528
+I107
+ta(I528
+I107
+I529
+I108
+ta(I529
+I108
+I530
+I109
+ta(I530
+I109
+I530
+I110
+ta(I530
+I110
+I531
+I111
+ta(I531
+I111
+I532
+I112
+ta(I532
+I112
+I533
+I113
+ta(I533
+I113
+I534
+I115
+ta(I534
+I115
+I535
+I116
+ta(I535
+I116
+I536
+I118
+ta(I536
+I118
+I538
+I120
+ta(I538
+I120
+I539
+I122
+ta(I539
+I122
+I540
+I124
+ta(I540
+I124
+I541
+I125
+ta(I541
+I125
+I542
+I127
+ta(I542
+I127
+I543
+I129
+ta(I543
+I129
+I544
+I130
+ta(I544
+I130
+I544
+I132
+ta(I544
+I132
+I545
+I134
+ta(I545
+I134
+I545
+I135
+ta(I545
+I135
+I546
+I136
+ta(I546
+I136
+I546
+I137
+ta(I546
+I137
+I546
+I138
+ta(I546
+I138
+I546
+I140
+ta(I546
+I140
+I547
+I142
+ta(I547
+I142
+I547
+I143
+ta(I547
+I143
+I547
+I144
+ta(I547
+I144
+I548
+I146
+ta(I548
+I146
+I548
+I147
+ta(I548
+I147
+I549
+I148
+ta(I549
+I148
+I549
+I149
+ta(I549
+I149
+I549
+I150
+ta(I549
+I150
+I550
+I151
+ta(I550
+I151
+I550
+I152
+ta(I550
+I152
+I550
+I154
+ta(I550
+I154
+I550
+I155
+ta(I550
+I155
+I550
+I156
+ta(I550
+I156
+I550
+I157
+ta(I550
+I157
+I551
+I159
+ta(I551
+I159
+I551
+I161
+ta(I551
+I161
+I551
+I163
+ta(I551
+I163
+I552
+I165
+ta(I552
+I165
+I552
+I166
+ta(I552
+I166
+I552
+I167
+ta(I552
+I167
+I553
+I168
+ta(I553
+I168
+I553
+I169
+ta(I553
+I169
+I553
+I170
+ta(I553
+I170
+I554
+I170
+tatp39
+a(g19
+I16
+(lp40
+(I572
+I101
+I572
+I100
+ta(I572
+I100
+I571
+I100
+ta(I571
+I100
+I571
+I99
+ta(I571
+I99
+I570
+I99
+ta(I570
+I99
+I570
+I98
+ta(I570
+I98
+I569
+I98
+ta(I569
+I98
+I568
+I97
+ta(I568
+I97
+I567
+I97
+ta(I567
+I97
+I566
+I97
+ta(I566
+I97
+I565
+I97
+ta(I565
+I97
+I564
+I98
+ta(I564
+I98
+I563
+I99
+ta(I563
+I99
+I562
+I100
+ta(I562
+I100
+I561
+I102
+ta(I561
+I102
+I560
+I104
+ta(I560
+I104
+I559
+I106
+ta(I559
+I106
+I558
+I109
+ta(I558
+I109
+I557
+I111
+ta(I557
+I111
+I557
+I114
+ta(I557
+I114
+I556
+I117
+ta(I556
+I117
+I555
+I119
+ta(I555
+I119
+I555
+I122
+ta(I555
+I122
+I554
+I125
+ta(I554
+I125
+I554
+I127
+ta(I554
+I127
+I554
+I129
+ta(I554
+I129
+I554
+I131
+ta(I554
+I131
+I554
+I132
+ta(I554
+I132
+I554
+I134
+ta(I554
+I134
+I554
+I136
+ta(I554
+I136
+I555
+I138
+ta(I555
+I138
+I555
+I140
+ta(I555
+I140
+I556
+I142
+ta(I556
+I142
+I557
+I144
+ta(I557
+I144
+I558
+I145
+ta(I558
+I145
+I559
+I147
+ta(I559
+I147
+I559
+I148
+ta(I559
+I148
+I559
+I149
+ta(I559
+I149
+I560
+I149
+ta(I560
+I149
+I560
+I150
+ta(I560
+I150
+I561
+I151
+ta(I561
+I151
+I562
+I151
+ta(I562
+I151
+I563
+I152
+ta(I563
+I152
+I565
+I152
+ta(I565
+I152
+I566
+I153
+ta(I566
+I153
+I568
+I154
+ta(I568
+I154
+I570
+I154
+ta(I570
+I154
+I572
+I155
+ta(I572
+I155
+I573
+I155
+ta(I573
+I155
+I575
+I155
+ta(I575
+I155
+I576
+I156
+ta(I576
+I156
+I578
+I156
+ta(I578
+I156
+I579
+I156
+ta(I579
+I156
+I581
+I156
+ta(I581
+I156
+I583
+I156
+ta(I583
+I156
+I585
+I156
+ta(I585
+I156
+I587
+I156
+ta(I587
+I156
+I588
+I156
+ta(I588
+I156
+I590
+I156
+ta(I590
+I156
+I591
+I156
+ta(I591
+I156
+I592
+I156
+ta(I592
+I156
+I593
+I155
+ta(I593
+I155
+I595
+I154
+ta(I595
+I154
+I596
+I153
+ta(I596
+I153
+I597
+I151
+ta(I597
+I151
+I598
+I150
+ta(I598
+I150
+I599
+I148
+ta(I599
+I148
+I599
+I146
+ta(I599
+I146
+I600
+I145
+ta(I600
+I145
+I601
+I143
+ta(I601
+I143
+I601
+I141
+ta(I601
+I141
+I601
+I140
+ta(I601
+I140
+I602
+I138
+ta(I602
+I138
+I602
+I136
+ta(I602
+I136
+I602
+I135
+ta(I602
+I135
+I602
+I133
+ta(I602
+I133
+I602
+I131
+ta(I602
+I131
+I602
+I128
+ta(I602
+I128
+I602
+I126
+ta(I602
+I126
+I602
+I125
+ta(I602
+I125
+I601
+I123
+ta(I601
+I123
+I601
+I121
+ta(I601
+I121
+I601
+I119
+ta(I601
+I119
+I600
+I118
+ta(I600
+I118
+I599
+I117
+ta(I599
+I117
+I598
+I115
+ta(I598
+I115
+I598
+I114
+ta(I598
+I114
+I597
+I113
+ta(I597
+I113
+I596
+I112
+ta(I596
+I112
+I595
+I110
+ta(I595
+I110
+I594
+I109
+ta(I594
+I109
+I593
+I108
+ta(I593
+I108
+I592
+I107
+ta(I592
+I107
+I591
+I107
+ta(I591
+I107
+I591
+I106
+ta(I591
+I106
+I590
+I106
+ta(I590
+I106
+I589
+I105
+ta(I589
+I105
+I587
+I104
+ta(I587
+I104
+I585
+I104
+ta(I585
+I104
+I582
+I104
+ta(I582
+I104
+I580
+I103
+ta(I580
+I103
+I578
+I103
+ta(I578
+I103
+I576
+I102
+ta(I576
+I102
+I575
+I102
+ta(I575
+I102
+I573
+I101
+ta(I573
+I101
+I572
+I101
+ta(I572
+I101
+I571
+I100
+ta(I571
+I100
+I570
+I100
+ta(I570
+I100
+I569
+I99
+ta(I569
+I99
+I568
+I99
+ta(I568
+I99
+I567
+I98
+ta(I567
+I98
+I566
+I98
+tatp41
+a(g19
+I16
+(lp42
+(I617
+I84
+I618
+I85
+ta(I618
+I85
+I619
+I87
+ta(I619
+I87
+I619
+I88
+ta(I619
+I88
+I620
+I91
+ta(I620
+I91
+I620
+I93
+ta(I620
+I93
+I621
+I95
+ta(I621
+I95
+I622
+I98
+ta(I622
+I98
+I623
+I101
+ta(I623
+I101
+I623
+I103
+ta(I623
+I103
+I624
+I105
+ta(I624
+I105
+I624
+I107
+ta(I624
+I107
+I625
+I109
+ta(I625
+I109
+I625
+I111
+ta(I625
+I111
+I625
+I112
+ta(I625
+I112
+I625
+I114
+ta(I625
+I114
+I625
+I116
+ta(I625
+I116
+I626
+I118
+ta(I626
+I118
+I626
+I120
+ta(I626
+I120
+I626
+I123
+ta(I626
+I123
+I626
+I125
+ta(I626
+I125
+I627
+I126
+ta(I627
+I126
+I627
+I128
+ta(I627
+I128
+I627
+I129
+ta(I627
+I129
+I627
+I131
+ta(I627
+I131
+I627
+I132
+ta(I627
+I132
+I628
+I134
+ta(I628
+I134
+I628
+I135
+ta(I628
+I135
+I628
+I136
+ta(I628
+I136
+I628
+I138
+ta(I628
+I138
+I628
+I139
+ta(I628
+I139
+I628
+I140
+ta(I628
+I140
+I629
+I141
+ta(I629
+I141
+I629
+I142
+ta(I629
+I142
+I629
+I143
+ta(I629
+I143
+I629
+I144
+ta(I629
+I144
+I629
+I145
+ta(I629
+I145
+I629
+I146
+ta(I629
+I146
+I629
+I147
+ta(I629
+I147
+I629
+I148
+ta(I629
+I148
+I629
+I149
+ta(I629
+I149
+I630
+I150
+ta(I630
+I150
+I630
+I151
+ta(I630
+I151
+I630
+I152
+ta(I630
+I152
+I630
+I153
+ta(I630
+I153
+I631
+I153
+ta(I631
+I153
+I631
+I154
+ta(I631
+I154
+I631
+I155
+ta(I631
+I155
+I631
+I156
+ta(I631
+I156
+I631
+I157
+ta(I631
+I157
+I631
+I158
+ta(I631
+I158
+I631
+I159
+ta(I631
+I159
+I631
+I160
+ta(I631
+I160
+I631
+I161
+ta(I631
+I161
+I631
+I162
+tatp43
+a(g19
+I16
+(lp44
+(I622
+I91
+I622
+I90
+ta(I622
+I90
+I622
+I89
+ta(I622
+I89
+I623
+I88
+ta(I623
+I88
+I624
+I87
+ta(I624
+I87
+I625
+I86
+ta(I625
+I86
+I625
+I85
+ta(I625
+I85
+I626
+I84
+ta(I626
+I84
+I627
+I83
+ta(I627
+I83
+I627
+I82
+ta(I627
+I82
+I628
+I82
+ta(I628
+I82
+I629
+I81
+ta(I629
+I81
+I629
+I80
+ta(I629
+I80
+I630
+I80
+ta(I630
+I80
+I631
+I80
+ta(I631
+I80
+I631
+I79
+ta(I631
+I79
+I632
+I79
+ta(I632
+I79
+I633
+I78
+ta(I633
+I78
+I634
+I78
+ta(I634
+I78
+I635
+I77
+ta(I635
+I77
+I637
+I77
+ta(I637
+I77
+I638
+I77
+ta(I638
+I77
+I639
+I76
+ta(I639
+I76
+I640
+I76
+ta(I640
+I76
+I641
+I76
+ta(I641
+I76
+I642
+I76
+ta(I642
+I76
+I643
+I76
+ta(I643
+I76
+I644
+I76
+ta(I644
+I76
+I645
+I76
+ta(I645
+I76
+I647
+I76
+ta(I647
+I76
+I648
+I77
+ta(I648
+I77
+I649
+I77
+ta(I649
+I77
+I650
+I77
+ta(I650
+I77
+I651
+I78
+ta(I651
+I78
+I652
+I79
+ta(I652
+I79
+I653
+I79
+ta(I653
+I79
+I654
+I80
+ta(I654
+I80
+I655
+I81
+ta(I655
+I81
+I656
+I82
+ta(I656
+I82
+I656
+I83
+ta(I656
+I83
+I657
+I83
+ta(I657
+I83
+I659
+I85
+ta(I659
+I85
+I660
+I86
+ta(I660
+I86
+I661
+I87
+ta(I661
+I87
+I661
+I88
+ta(I661
+I88
+I662
+I89
+ta(I662
+I89
+I662
+I91
+ta(I662
+I91
+I663
+I92
+ta(I663
+I92
+I664
+I94
+ta(I664
+I94
+I664
+I95
+ta(I664
+I95
+I665
+I97
+ta(I665
+I97
+I666
+I99
+ta(I666
+I99
+I667
+I100
+ta(I667
+I100
+I667
+I102
+ta(I667
+I102
+I668
+I103
+ta(I668
+I103
+I668
+I105
+ta(I668
+I105
+I669
+I106
+ta(I669
+I106
+I669
+I107
+ta(I669
+I107
+I670
+I109
+ta(I670
+I109
+I670
+I110
+ta(I670
+I110
+I671
+I112
+ta(I671
+I112
+I672
+I114
+ta(I672
+I114
+I672
+I115
+ta(I672
+I115
+I673
+I117
+ta(I673
+I117
+I673
+I118
+ta(I673
+I118
+I674
+I120
+ta(I674
+I120
+I674
+I121
+ta(I674
+I121
+I674
+I122
+ta(I674
+I122
+I675
+I124
+ta(I675
+I124
+I675
+I125
+ta(I675
+I125
+I675
+I126
+ta(I675
+I126
+I675
+I127
+ta(I675
+I127
+I676
+I127
+ta(I676
+I127
+I676
+I128
+ta(I676
+I128
+I676
+I129
+ta(I676
+I129
+I677
+I130
+ta(I677
+I130
+I677
+I131
+ta(I677
+I131
+I677
+I133
+ta(I677
+I133
+I678
+I134
+ta(I678
+I134
+I678
+I135
+ta(I678
+I135
+I678
+I137
+ta(I678
+I137
+I679
+I138
+ta(I679
+I138
+I679
+I139
+ta(I679
+I139
+I679
+I141
+ta(I679
+I141
+I680
+I142
+ta(I680
+I142
+I680
+I143
+ta(I680
+I143
+I680
+I144
+ta(I680
+I144
+I681
+I145
+ta(I681
+I145
+I681
+I147
+ta(I681
+I147
+I682
+I148
+ta(I682
+I148
+I682
+I149
+ta(I682
+I149
+I682
+I150
+ta(I682
+I150
+I682
+I151
+ta(I682
+I151
+I682
+I152
+ta(I682
+I152
+I683
+I153
+ta(I683
+I153
+I683
+I154
+ta(I683
+I154
+I683
+I155
+ta(I683
+I155
+I683
+I156
+ta(I683
+I156
+I683
+I157
+tatp45
+a(S'Navy'
+p46
+I16
+(lp47
+(I119
+I334
+I119
+I335
+ta(I119
+I335
+I121
+I339
+ta(I121
+I339
+I122
+I341
+ta(I122
+I341
+I123
+I343
+ta(I123
+I343
+I123
+I345
+ta(I123
+I345
+I124
+I348
+ta(I124
+I348
+I125
+I351
+ta(I125
+I351
+I125
+I354
+ta(I125
+I354
+I126
+I357
+ta(I126
+I357
+I127
+I359
+ta(I127
+I359
+I128
+I362
+ta(I128
+I362
+I128
+I365
+ta(I128
+I365
+I129
+I367
+ta(I129
+I367
+I130
+I370
+ta(I130
+I370
+I131
+I373
+ta(I131
+I373
+I132
+I376
+ta(I132
+I376
+I133
+I380
+ta(I133
+I380
+I134
+I384
+ta(I134
+I384
+I134
+I387
+ta(I134
+I387
+I136
+I392
+ta(I136
+I392
+I136
+I396
+ta(I136
+I396
+I137
+I400
+ta(I137
+I400
+I137
+I405
+ta(I137
+I405
+I138
+I409
+ta(I138
+I409
+I139
+I414
+ta(I139
+I414
+I140
+I416
+ta(I140
+I416
+I140
+I419
+ta(I140
+I419
+I140
+I422
+ta(I140
+I422
+I140
+I424
+ta(I140
+I424
+I140
+I427
+ta(I140
+I427
+I141
+I430
+ta(I141
+I430
+I142
+I432
+ta(I142
+I432
+I142
+I435
+ta(I142
+I435
+I142
+I438
+ta(I142
+I438
+I143
+I440
+ta(I143
+I440
+I143
+I443
+ta(I143
+I443
+I144
+I445
+ta(I144
+I445
+I144
+I447
+ta(I144
+I447
+I144
+I448
+ta(I144
+I448
+I144
+I450
+ta(I144
+I450
+I144
+I452
+ta(I144
+I452
+I144
+I454
+ta(I144
+I454
+I144
+I456
+ta(I144
+I456
+I144
+I457
+ta(I144
+I457
+I144
+I459
+ta(I144
+I459
+I144
+I461
+ta(I144
+I461
+I144
+I463
+ta(I144
+I463
+I145
+I465
+ta(I145
+I465
+I145
+I466
+ta(I145
+I466
+I145
+I467
+ta(I145
+I467
+I145
+I468
+ta(I145
+I468
+I146
+I470
+ta(I146
+I470
+I146
+I471
+ta(I146
+I471
+I146
+I473
+ta(I146
+I473
+I146
+I474
+ta(I146
+I474
+I146
+I475
+ta(I146
+I475
+I146
+I476
+ta(I146
+I476
+I146
+I477
+ta(I146
+I477
+I146
+I478
+ta(I146
+I478
+I146
+I479
+ta(I146
+I479
+I146
+I480
+ta(I146
+I480
+I147
+I481
+ta(I147
+I481
+I147
+I482
+ta(I147
+I482
+I148
+I484
+ta(I148
+I484
+I148
+I485
+ta(I148
+I485
+I149
+I487
+ta(I149
+I487
+I149
+I489
+ta(I149
+I489
+I149
+I491
+ta(I149
+I491
+I149
+I494
+ta(I149
+I494
+I149
+I495
+ta(I149
+I495
+I149
+I497
+ta(I149
+I497
+I149
+I499
+ta(I149
+I499
+I149
+I500
+ta(I149
+I500
+I148
+I502
+ta(I148
+I502
+I148
+I503
+ta(I148
+I503
+I148
+I505
+ta(I148
+I505
+I148
+I506
+ta(I148
+I506
+I148
+I508
+ta(I148
+I508
+I148
+I509
+ta(I148
+I509
+I148
+I510
+ta(I148
+I510
+I149
+I511
+ta(I149
+I511
+I149
+I512
+ta(I149
+I512
+I148
+I512
+ta(I148
+I512
+I148
+I511
+ta(I148
+I511
+I149
+I508
+tatp48
+a(g46
+I16
+(lp49
+(I126
+I336
+I127
+I336
+ta(I127
+I336
+I128
+I335
+ta(I128
+I335
+I130
+I334
+ta(I130
+I334
+I132
+I332
+ta(I132
+I332
+I134
+I331
+ta(I134
+I331
+I137
+I330
+ta(I137
+I330
+I141
+I329
+ta(I141
+I329
+I145
+I328
+ta(I145
+I328
+I149
+I327
+ta(I149
+I327
+I163
+I325
+ta(I163
+I325
+I168
+I323
+ta(I168
+I323
+I173
+I321
+ta(I173
+I321
+I177
+I320
+ta(I177
+I320
+I180
+I319
+ta(I180
+I319
+I183
+I318
+ta(I183
+I318
+I186
+I318
+ta(I186
+I318
+I188
+I317
+ta(I188
+I317
+I191
+I316
+ta(I191
+I316
+I194
+I316
+ta(I194
+I316
+I197
+I315
+ta(I197
+I315
+I200
+I315
+ta(I200
+I315
+I202
+I315
+ta(I202
+I315
+I204
+I315
+ta(I204
+I315
+I206
+I315
+ta(I206
+I315
+I208
+I316
+ta(I208
+I316
+I210
+I316
+ta(I210
+I316
+I212
+I316
+ta(I212
+I316
+I213
+I317
+ta(I213
+I317
+I214
+I317
+ta(I214
+I317
+I216
+I318
+ta(I216
+I318
+I218
+I319
+ta(I218
+I319
+I220
+I320
+ta(I220
+I320
+I223
+I321
+ta(I223
+I321
+I226
+I322
+ta(I226
+I322
+I227
+I323
+ta(I227
+I323
+I229
+I324
+ta(I229
+I324
+I229
+I325
+ta(I229
+I325
+I230
+I325
+ta(I230
+I325
+I230
+I326
+ta(I230
+I326
+I230
+I327
+ta(I230
+I327
+I231
+I329
+ta(I231
+I329
+I231
+I331
+ta(I231
+I331
+I232
+I333
+ta(I232
+I333
+I232
+I334
+ta(I232
+I334
+I233
+I336
+ta(I233
+I336
+I233
+I338
+ta(I233
+I338
+I234
+I340
+ta(I234
+I340
+I234
+I341
+ta(I234
+I341
+I234
+I342
+ta(I234
+I342
+I234
+I344
+ta(I234
+I344
+I234
+I345
+ta(I234
+I345
+I234
+I347
+ta(I234
+I347
+I233
+I349
+ta(I233
+I349
+I233
+I351
+ta(I233
+I351
+I233
+I352
+ta(I233
+I352
+I232
+I354
+ta(I232
+I354
+I231
+I356
+ta(I231
+I356
+I230
+I357
+ta(I230
+I357
+I229
+I359
+ta(I229
+I359
+I226
+I360
+ta(I226
+I360
+I225
+I362
+ta(I225
+I362
+I223
+I364
+ta(I223
+I364
+I221
+I366
+ta(I221
+I366
+I220
+I367
+ta(I220
+I367
+I219
+I368
+ta(I219
+I368
+I217
+I370
+ta(I217
+I370
+I216
+I371
+ta(I216
+I371
+I215
+I373
+ta(I215
+I373
+I214
+I374
+ta(I214
+I374
+I212
+I376
+ta(I212
+I376
+I211
+I377
+ta(I211
+I377
+I209
+I378
+ta(I209
+I378
+I208
+I380
+ta(I208
+I380
+I206
+I381
+ta(I206
+I381
+I205
+I383
+ta(I205
+I383
+I203
+I384
+ta(I203
+I384
+I201
+I385
+ta(I201
+I385
+I200
+I386
+ta(I200
+I386
+I198
+I387
+ta(I198
+I387
+I197
+I388
+ta(I197
+I388
+I195
+I389
+ta(I195
+I389
+I193
+I390
+ta(I193
+I390
+I191
+I391
+ta(I191
+I391
+I189
+I392
+ta(I189
+I392
+I187
+I393
+ta(I187
+I393
+I185
+I394
+ta(I185
+I394
+I183
+I395
+ta(I183
+I395
+I181
+I396
+ta(I181
+I396
+I179
+I397
+ta(I179
+I397
+I177
+I398
+ta(I177
+I398
+I175
+I399
+ta(I175
+I399
+I174
+I400
+ta(I174
+I400
+I172
+I400
+ta(I172
+I400
+I171
+I401
+ta(I171
+I401
+I170
+I402
+ta(I170
+I402
+I169
+I403
+ta(I169
+I403
+I168
+I403
+ta(I168
+I403
+I167
+I404
+ta(I167
+I404
+I166
+I404
+ta(I166
+I404
+I165
+I404
+ta(I165
+I404
+I164
+I405
+ta(I164
+I405
+I163
+I405
+ta(I163
+I405
+I162
+I405
+ta(I162
+I405
+I161
+I406
+ta(I161
+I406
+I160
+I406
+ta(I160
+I406
+I159
+I407
+ta(I159
+I407
+I158
+I407
+ta(I158
+I407
+I157
+I407
+ta(I157
+I407
+I156
+I408
+ta(I156
+I408
+I155
+I408
+ta(I155
+I408
+I155
+I409
+ta(I155
+I409
+I154
+I409
+ta(I154
+I409
+I153
+I409
+ta(I153
+I409
+I152
+I410
+ta(I152
+I410
+I151
+I410
+ta(I151
+I410
+I150
+I410
+ta(I150
+I410
+I149
+I410
+ta(I149
+I410
+I148
+I410
+ta(I148
+I410
+I149
+I410
+ta(I149
+I410
+I150
+I410
+ta(I150
+I410
+I151
+I410
+ta(I151
+I410
+I152
+I410
+ta(I152
+I410
+I155
+I411
+ta(I155
+I411
+I157
+I411
+ta(I157
+I411
+I160
+I411
+ta(I160
+I411
+I163
+I412
+ta(I163
+I412
+I165
+I412
+ta(I165
+I412
+I168
+I412
+ta(I168
+I412
+I169
+I412
+ta(I169
+I412
+I171
+I412
+ta(I171
+I412
+I172
+I412
+ta(I172
+I412
+I172
+I413
+ta(I172
+I413
+I173
+I413
+ta(I173
+I413
+I174
+I414
+ta(I174
+I414
+I175
+I415
+ta(I175
+I415
+I176
+I416
+ta(I176
+I416
+I178
+I418
+ta(I178
+I418
+I180
+I419
+ta(I180
+I419
+I182
+I420
+ta(I182
+I420
+I184
+I422
+ta(I184
+I422
+I186
+I423
+ta(I186
+I423
+I187
+I423
+ta(I187
+I423
+I188
+I424
+ta(I188
+I424
+I189
+I425
+ta(I189
+I425
+I190
+I426
+ta(I190
+I426
+I191
+I427
+ta(I191
+I427
+I192
+I428
+ta(I192
+I428
+I193
+I429
+ta(I193
+I429
+I195
+I431
+ta(I195
+I431
+I197
+I432
+ta(I197
+I432
+I199
+I434
+ta(I199
+I434
+I201
+I436
+ta(I201
+I436
+I204
+I438
+ta(I204
+I438
+I206
+I440
+ta(I206
+I440
+I208
+I442
+ta(I208
+I442
+I211
+I444
+ta(I211
+I444
+I213
+I446
+ta(I213
+I446
+I215
+I448
+ta(I215
+I448
+I217
+I449
+ta(I217
+I449
+I218
+I451
+ta(I218
+I451
+I220
+I453
+ta(I220
+I453
+I222
+I455
+ta(I222
+I455
+I225
+I457
+ta(I225
+I457
+I227
+I459
+ta(I227
+I459
+I229
+I462
+ta(I229
+I462
+I231
+I464
+ta(I231
+I464
+I233
+I466
+ta(I233
+I466
+I235
+I468
+ta(I235
+I468
+I237
+I470
+ta(I237
+I470
+I239
+I472
+ta(I239
+I472
+I241
+I474
+ta(I241
+I474
+I243
+I476
+ta(I243
+I476
+I244
+I477
+ta(I244
+I477
+I245
+I478
+ta(I245
+I478
+I246
+I480
+ta(I246
+I480
+I247
+I481
+ta(I247
+I481
+I249
+I482
+ta(I249
+I482
+I250
+I483
+ta(I250
+I483
+I251
+I485
+ta(I251
+I485
+I253
+I486
+ta(I253
+I486
+I254
+I488
+ta(I254
+I488
+I256
+I489
+ta(I256
+I489
+I257
+I489
+ta(I257
+I489
+I257
+I490
+ta(I257
+I490
+I258
+I491
+ta(I258
+I491
+I259
+I491
+ta(I259
+I491
+I259
+I492
+ta(I259
+I492
+I260
+I492
+ta(I260
+I492
+I260
+I493
+ta(I260
+I493
+I261
+I493
+ta(I261
+I493
+I262
+I494
+ta(I262
+I494
+I263
+I494
+ta(I263
+I494
+I264
+I495
+ta(I264
+I495
+I265
+I495
+ta(I265
+I495
+I266
+I496
+ta(I266
+I496
+I266
+I497
+ta(I266
+I497
+I267
+I497
+ta(I267
+I497
+I268
+I498
+ta(I268
+I498
+I269
+I499
+ta(I269
+I499
+I270
+I500
+ta(I270
+I500
+I271
+I501
+ta(I271
+I501
+I272
+I502
+ta(I272
+I502
+I272
+I503
+ta(I272
+I503
+I273
+I504
+ta(I273
+I504
+I274
+I504
+ta(I274
+I504
+I275
+I505
+ta(I275
+I505
+I276
+I506
+ta(I276
+I506
+I277
+I507
+ta(I277
+I507
+I278
+I507
+ta(I278
+I507
+I278
+I508
+ta(I278
+I508
+I278
+I507
+ta(I278
+I507
+I278
+I506
+tatp50
+a(g46
+I16
+(lp51
+(I311
+I319
+I310
+I320
+ta(I310
+I320
+I308
+I321
+ta(I308
+I321
+I307
+I322
+ta(I307
+I322
+I306
+I323
+ta(I306
+I323
+I305
+I325
+ta(I305
+I325
+I305
+I327
+ta(I305
+I327
+I304
+I328
+ta(I304
+I328
+I303
+I330
+ta(I303
+I330
+I303
+I332
+ta(I303
+I332
+I302
+I334
+ta(I302
+I334
+I301
+I337
+ta(I301
+I337
+I300
+I339
+ta(I300
+I339
+I300
+I341
+ta(I300
+I341
+I299
+I343
+ta(I299
+I343
+I299
+I347
+ta(I299
+I347
+I298
+I350
+ta(I298
+I350
+I298
+I353
+ta(I298
+I353
+I297
+I356
+ta(I297
+I356
+I297
+I359
+ta(I297
+I359
+I297
+I362
+ta(I297
+I362
+I296
+I365
+ta(I296
+I365
+I296
+I368
+ta(I296
+I368
+I296
+I371
+ta(I296
+I371
+I295
+I375
+ta(I295
+I375
+I295
+I378
+ta(I295
+I378
+I295
+I382
+ta(I295
+I382
+I295
+I385
+ta(I295
+I385
+I295
+I389
+ta(I295
+I389
+I295
+I392
+ta(I295
+I392
+I295
+I396
+ta(I295
+I396
+I296
+I399
+ta(I296
+I399
+I296
+I403
+ta(I296
+I403
+I296
+I406
+ta(I296
+I406
+I296
+I410
+ta(I296
+I410
+I296
+I414
+ta(I296
+I414
+I296
+I417
+ta(I296
+I417
+I296
+I421
+ta(I296
+I421
+I297
+I425
+ta(I297
+I425
+I297
+I429
+ta(I297
+I429
+I298
+I433
+ta(I298
+I433
+I298
+I436
+ta(I298
+I436
+I299
+I441
+ta(I299
+I441
+I300
+I444
+ta(I300
+I444
+I301
+I447
+ta(I301
+I447
+I302
+I451
+ta(I302
+I451
+I303
+I454
+ta(I303
+I454
+I304
+I456
+ta(I304
+I456
+I305
+I459
+ta(I305
+I459
+I306
+I462
+ta(I306
+I462
+I307
+I465
+ta(I307
+I465
+I308
+I468
+ta(I308
+I468
+I309
+I470
+ta(I309
+I470
+I310
+I472
+ta(I310
+I472
+I311
+I475
+ta(I311
+I475
+I312
+I477
+ta(I312
+I477
+I313
+I479
+ta(I313
+I479
+I314
+I481
+ta(I314
+I481
+I315
+I483
+ta(I315
+I483
+I317
+I485
+ta(I317
+I485
+I318
+I487
+ta(I318
+I487
+I319
+I488
+ta(I319
+I488
+I320
+I489
+ta(I320
+I489
+I321
+I491
+ta(I321
+I491
+I322
+I492
+ta(I322
+I492
+I323
+I493
+ta(I323
+I493
+I324
+I494
+ta(I324
+I494
+I326
+I496
+ta(I326
+I496
+I328
+I497
+ta(I328
+I497
+I329
+I499
+ta(I329
+I499
+I330
+I500
+ta(I330
+I500
+I332
+I501
+ta(I332
+I501
+I333
+I502
+ta(I333
+I502
+I335
+I503
+ta(I335
+I503
+I336
+I503
+ta(I336
+I503
+I338
+I503
+ta(I338
+I503
+I340
+I503
+ta(I340
+I503
+I342
+I503
+ta(I342
+I503
+I345
+I503
+ta(I345
+I503
+I347
+I503
+ta(I347
+I503
+I351
+I503
+ta(I351
+I503
+I353
+I503
+ta(I353
+I503
+I356
+I502
+ta(I356
+I502
+I360
+I501
+ta(I360
+I501
+I363
+I500
+ta(I363
+I500
+I366
+I498
+ta(I366
+I498
+I369
+I496
+ta(I369
+I496
+I371
+I494
+ta(I371
+I494
+I372
+I493
+ta(I372
+I493
+I374
+I491
+ta(I374
+I491
+I374
+I489
+ta(I374
+I489
+I375
+I487
+ta(I375
+I487
+I376
+I485
+ta(I376
+I485
+I377
+I483
+ta(I377
+I483
+I377
+I480
+ta(I377
+I480
+I378
+I478
+ta(I378
+I478
+I379
+I475
+ta(I379
+I475
+I379
+I471
+ta(I379
+I471
+I379
+I468
+ta(I379
+I468
+I379
+I465
+ta(I379
+I465
+I379
+I462
+ta(I379
+I462
+I379
+I460
+ta(I379
+I460
+I379
+I457
+ta(I379
+I457
+I379
+I453
+ta(I379
+I453
+I379
+I450
+ta(I379
+I450
+I378
+I446
+ta(I378
+I446
+I378
+I443
+ta(I378
+I443
+I377
+I439
+ta(I377
+I439
+I377
+I435
+ta(I377
+I435
+I376
+I431
+ta(I376
+I431
+I375
+I426
+ta(I375
+I426
+I375
+I422
+ta(I375
+I422
+I373
+I419
+ta(I373
+I419
+I372
+I416
+ta(I372
+I416
+I371
+I412
+ta(I371
+I412
+I370
+I409
+ta(I370
+I409
+I369
+I407
+ta(I369
+I407
+I368
+I405
+ta(I368
+I405
+I367
+I402
+ta(I367
+I402
+I366
+I399
+ta(I366
+I399
+I365
+I397
+ta(I365
+I397
+I364
+I394
+ta(I364
+I394
+I362
+I391
+ta(I362
+I391
+I361
+I388
+ta(I361
+I388
+I360
+I386
+ta(I360
+I386
+I359
+I384
+ta(I359
+I384
+I358
+I382
+ta(I358
+I382
+I358
+I381
+ta(I358
+I381
+I356
+I380
+ta(I356
+I380
+I356
+I379
+ta(I356
+I379
+I355
+I378
+ta(I355
+I378
+I355
+I377
+ta(I355
+I377
+I354
+I376
+ta(I354
+I376
+I353
+I374
+ta(I353
+I374
+I352
+I372
+ta(I352
+I372
+I351
+I370
+ta(I351
+I370
+I350
+I369
+ta(I350
+I369
+I348
+I367
+ta(I348
+I367
+I347
+I365
+ta(I347
+I365
+I346
+I364
+ta(I346
+I364
+I345
+I362
+ta(I345
+I362
+I344
+I360
+ta(I344
+I360
+I343
+I359
+ta(I343
+I359
+I342
+I358
+ta(I342
+I358
+I342
+I357
+ta(I342
+I357
+I340
+I355
+ta(I340
+I355
+I340
+I354
+ta(I340
+I354
+I339
+I353
+ta(I339
+I353
+I339
+I351
+ta(I339
+I351
+I338
+I350
+ta(I338
+I350
+I337
+I349
+ta(I337
+I349
+I337
+I348
+ta(I337
+I348
+I336
+I347
+ta(I336
+I347
+I336
+I346
+ta(I336
+I346
+I335
+I345
+ta(I335
+I345
+I334
+I344
+ta(I334
+I344
+I334
+I343
+ta(I334
+I343
+I333
+I342
+ta(I333
+I342
+I332
+I340
+ta(I332
+I340
+I332
+I339
+ta(I332
+I339
+I331
+I338
+ta(I331
+I338
+I330
+I337
+ta(I330
+I337
+I330
+I336
+ta(I330
+I336
+I329
+I336
+ta(I329
+I336
+I329
+I335
+ta(I329
+I335
+I329
+I334
+ta(I329
+I334
+I328
+I334
+ta(I328
+I334
+I328
+I333
+ta(I328
+I333
+I328
+I332
+ta(I328
+I332
+I327
+I332
+ta(I327
+I332
+I327
+I331
+ta(I327
+I331
+I326
+I331
+ta(I326
+I331
+I326
+I330
+ta(I326
+I330
+I326
+I329
+ta(I326
+I329
+I325
+I329
+ta(I325
+I329
+I324
+I328
+ta(I324
+I328
+I324
+I327
+ta(I324
+I327
+I323
+I326
+ta(I323
+I326
+I322
+I325
+ta(I322
+I325
+I321
+I324
+ta(I321
+I324
+I321
+I323
+ta(I321
+I323
+I320
+I323
+ta(I320
+I323
+I320
+I322
+ta(I320
+I322
+I319
+I321
+ta(I319
+I321
+I318
+I320
+ta(I318
+I320
+I317
+I319
+ta(I317
+I319
+I317
+I318
+ta(I317
+I318
+I316
+I318
+ta(I316
+I318
+I316
+I317
+ta(I316
+I317
+I315
+I316
+ta(I315
+I316
+I314
+I315
+ta(I314
+I315
+I314
+I314
+ta(I314
+I314
+I313
+I313
+ta(I313
+I313
+I313
+I312
+ta(I313
+I312
+I312
+I312
+ta(I312
+I312
+I312
+I311
+ta(I312
+I311
+I312
+I310
+ta(I312
+I310
+I311
+I310
+tatp52
+a(g46
+I16
+(lp53
+(I434
+I311
+I433
+I311
+ta(I433
+I311
+I432
+I311
+ta(I432
+I311
+I431
+I311
+ta(I431
+I311
+I430
+I310
+ta(I430
+I310
+I429
+I310
+ta(I429
+I310
+I428
+I310
+ta(I428
+I310
+I427
+I309
+ta(I427
+I309
+I426
+I309
+ta(I426
+I309
+I424
+I309
+ta(I424
+I309
+I423
+I309
+ta(I423
+I309
+I421
+I309
+ta(I421
+I309
+I419
+I309
+ta(I419
+I309
+I418
+I308
+ta(I418
+I308
+I417
+I308
+ta(I417
+I308
+I416
+I308
+ta(I416
+I308
+I415
+I308
+ta(I415
+I308
+I414
+I308
+ta(I414
+I308
+I413
+I308
+ta(I413
+I308
+I411
+I308
+ta(I411
+I308
+I410
+I309
+ta(I410
+I309
+I409
+I310
+ta(I409
+I310
+I408
+I311
+ta(I408
+I311
+I407
+I312
+ta(I407
+I312
+I406
+I312
+ta(I406
+I312
+I405
+I313
+ta(I405
+I313
+I404
+I315
+ta(I404
+I315
+I403
+I315
+ta(I403
+I315
+I402
+I317
+ta(I402
+I317
+I401
+I318
+ta(I401
+I318
+I400
+I319
+ta(I400
+I319
+I399
+I320
+ta(I399
+I320
+I398
+I322
+ta(I398
+I322
+I397
+I323
+ta(I397
+I323
+I397
+I325
+ta(I397
+I325
+I396
+I326
+ta(I396
+I326
+I394
+I328
+ta(I394
+I328
+I393
+I330
+ta(I393
+I330
+I392
+I332
+ta(I392
+I332
+I390
+I334
+ta(I390
+I334
+I389
+I336
+ta(I389
+I336
+I388
+I338
+ta(I388
+I338
+I387
+I339
+ta(I387
+I339
+I386
+I341
+ta(I386
+I341
+I384
+I343
+ta(I384
+I343
+I384
+I345
+ta(I384
+I345
+I383
+I347
+ta(I383
+I347
+I382
+I349
+ta(I382
+I349
+I381
+I351
+ta(I381
+I351
+I381
+I353
+ta(I381
+I353
+I380
+I356
+ta(I380
+I356
+I380
+I359
+ta(I380
+I359
+I379
+I361
+ta(I379
+I361
+I379
+I364
+ta(I379
+I364
+I379
+I367
+ta(I379
+I367
+I378
+I370
+ta(I378
+I370
+I378
+I374
+ta(I378
+I374
+I378
+I377
+ta(I378
+I377
+I378
+I380
+ta(I378
+I380
+I378
+I384
+ta(I378
+I384
+I378
+I387
+ta(I378
+I387
+I378
+I391
+ta(I378
+I391
+I379
+I395
+ta(I379
+I395
+I379
+I398
+ta(I379
+I398
+I380
+I401
+ta(I380
+I401
+I381
+I404
+ta(I381
+I404
+I382
+I407
+ta(I382
+I407
+I383
+I410
+ta(I383
+I410
+I383
+I412
+ta(I383
+I412
+I384
+I415
+ta(I384
+I415
+I386
+I418
+ta(I386
+I418
+I387
+I421
+ta(I387
+I421
+I388
+I424
+ta(I388
+I424
+I388
+I426
+ta(I388
+I426
+I389
+I429
+ta(I389
+I429
+I390
+I431
+ta(I390
+I431
+I390
+I434
+ta(I390
+I434
+I391
+I436
+ta(I391
+I436
+I392
+I438
+ta(I392
+I438
+I393
+I440
+ta(I393
+I440
+I393
+I442
+ta(I393
+I442
+I394
+I444
+ta(I394
+I444
+I395
+I445
+ta(I395
+I445
+I396
+I447
+ta(I396
+I447
+I397
+I449
+ta(I397
+I449
+I398
+I451
+ta(I398
+I451
+I399
+I453
+ta(I399
+I453
+I400
+I455
+ta(I400
+I455
+I401
+I456
+ta(I401
+I456
+I402
+I458
+ta(I402
+I458
+I403
+I460
+ta(I403
+I460
+I404
+I462
+ta(I404
+I462
+I405
+I463
+ta(I405
+I463
+I406
+I465
+ta(I406
+I465
+I407
+I467
+ta(I407
+I467
+I409
+I468
+ta(I409
+I468
+I410
+I470
+ta(I410
+I470
+I412
+I472
+ta(I412
+I472
+I414
+I474
+ta(I414
+I474
+I415
+I475
+ta(I415
+I475
+I416
+I476
+ta(I416
+I476
+I418
+I477
+ta(I418
+I477
+I419
+I478
+ta(I419
+I478
+I420
+I478
+ta(I420
+I478
+I421
+I479
+ta(I421
+I479
+I422
+I479
+ta(I422
+I479
+I423
+I479
+ta(I423
+I479
+I424
+I479
+ta(I424
+I479
+I425
+I479
+ta(I425
+I479
+I426
+I479
+ta(I426
+I479
+I428
+I479
+ta(I428
+I479
+I430
+I480
+ta(I430
+I480
+I431
+I480
+ta(I431
+I480
+I434
+I480
+ta(I434
+I480
+I436
+I480
+ta(I436
+I480
+I438
+I480
+ta(I438
+I480
+I441
+I480
+ta(I441
+I480
+I443
+I480
+ta(I443
+I480
+I446
+I480
+ta(I446
+I480
+I448
+I480
+ta(I448
+I480
+I450
+I480
+ta(I450
+I480
+I452
+I480
+ta(I452
+I480
+I454
+I480
+ta(I454
+I480
+I455
+I480
+ta(I455
+I480
+I457
+I480
+ta(I457
+I480
+I459
+I479
+ta(I459
+I479
+I460
+I478
+ta(I460
+I478
+I462
+I477
+ta(I462
+I477
+I464
+I476
+ta(I464
+I476
+I465
+I475
+ta(I465
+I475
+I466
+I474
+ta(I466
+I474
+I467
+I473
+ta(I467
+I473
+I468
+I472
+ta(I468
+I472
+I468
+I471
+ta(I468
+I471
+I469
+I470
+ta(I469
+I470
+I470
+I469
+ta(I470
+I469
+I471
+I468
+ta(I471
+I468
+I471
+I467
+ta(I471
+I467
+I472
+I466
+ta(I472
+I466
+I473
+I465
+ta(I473
+I465
+I474
+I464
+ta(I474
+I464
+I474
+I462
+ta(I474
+I462
+I475
+I461
+ta(I475
+I461
+I476
+I460
+ta(I476
+I460
+I477
+I459
+ta(I477
+I459
+I478
+I457
+ta(I478
+I457
+I479
+I456
+ta(I479
+I456
+I479
+I455
+ta(I479
+I455
+I479
+I454
+ta(I479
+I454
+I480
+I453
+ta(I480
+I453
+I480
+I452
+ta(I480
+I452
+I480
+I451
+ta(I480
+I451
+I480
+I450
+tatp54
+a(g46
+I16
+(lp55
+(I478
+I295
+I479
+I297
+ta(I479
+I297
+I481
+I301
+ta(I481
+I301
+I482
+I304
+ta(I482
+I304
+I484
+I307
+ta(I484
+I307
+I486
+I310
+ta(I486
+I310
+I488
+I314
+ta(I488
+I314
+I490
+I317
+ta(I490
+I317
+I491
+I321
+ta(I491
+I321
+I493
+I326
+ta(I493
+I326
+I495
+I329
+ta(I495
+I329
+I496
+I333
+ta(I496
+I333
+I498
+I336
+ta(I498
+I336
+I499
+I340
+ta(I499
+I340
+I501
+I344
+ta(I501
+I344
+I502
+I347
+ta(I502
+I347
+I504
+I351
+ta(I504
+I351
+I506
+I355
+ta(I506
+I355
+I507
+I359
+ta(I507
+I359
+I509
+I362
+ta(I509
+I362
+I510
+I366
+ta(I510
+I366
+I512
+I370
+ta(I512
+I370
+I514
+I373
+ta(I514
+I373
+I515
+I377
+ta(I515
+I377
+I517
+I380
+ta(I517
+I380
+I518
+I383
+ta(I518
+I383
+I519
+I386
+ta(I519
+I386
+I520
+I388
+ta(I520
+I388
+I521
+I391
+ta(I521
+I391
+I522
+I393
+ta(I522
+I393
+I522
+I395
+ta(I522
+I395
+I522
+I397
+ta(I522
+I397
+I523
+I400
+ta(I523
+I400
+I524
+I403
+ta(I524
+I403
+I525
+I405
+ta(I525
+I405
+I526
+I408
+ta(I526
+I408
+I526
+I411
+ta(I526
+I411
+I527
+I413
+ta(I527
+I413
+I528
+I415
+ta(I528
+I415
+I528
+I417
+ta(I528
+I417
+I529
+I420
+ta(I529
+I420
+I529
+I421
+ta(I529
+I421
+I529
+I423
+ta(I529
+I423
+I529
+I425
+ta(I529
+I425
+I529
+I426
+ta(I529
+I426
+I530
+I428
+ta(I530
+I428
+I530
+I430
+ta(I530
+I430
+I530
+I433
+ta(I530
+I433
+I531
+I435
+ta(I531
+I435
+I531
+I438
+ta(I531
+I438
+I531
+I440
+ta(I531
+I440
+I531
+I443
+ta(I531
+I443
+I532
+I445
+ta(I532
+I445
+I532
+I447
+ta(I532
+I447
+I532
+I450
+ta(I532
+I450
+I532
+I452
+ta(I532
+I452
+I533
+I453
+ta(I533
+I453
+I533
+I455
+ta(I533
+I455
+I533
+I457
+ta(I533
+I457
+I533
+I459
+ta(I533
+I459
+I534
+I460
+ta(I534
+I460
+I534
+I462
+ta(I534
+I462
+I534
+I464
+ta(I534
+I464
+I534
+I466
+ta(I534
+I466
+I534
+I468
+ta(I534
+I468
+I535
+I470
+ta(I535
+I470
+I535
+I472
+ta(I535
+I472
+I535
+I474
+ta(I535
+I474
+I535
+I476
+ta(I535
+I476
+I535
+I477
+ta(I535
+I477
+I535
+I478
+ta(I535
+I478
+I536
+I478
+ta(I536
+I478
+I536
+I479
+ta(I536
+I479
+I536
+I480
+ta(I536
+I480
+I536
+I481
+ta(I536
+I481
+I536
+I482
+ta(I536
+I482
+I537
+I483
+ta(I537
+I483
+I537
+I484
+tatp56
+a(g46
+I16
+(lp57
+(I540
+I307
+I539
+I308
+ta(I539
+I308
+I539
+I310
+ta(I539
+I310
+I539
+I311
+ta(I539
+I311
+I538
+I313
+ta(I538
+I313
+I538
+I315
+ta(I538
+I315
+I538
+I317
+ta(I538
+I317
+I537
+I320
+ta(I537
+I320
+I537
+I322
+ta(I537
+I322
+I535
+I326
+ta(I535
+I326
+I535
+I329
+ta(I535
+I329
+I534
+I332
+ta(I534
+I332
+I533
+I335
+ta(I533
+I335
+I532
+I338
+ta(I532
+I338
+I531
+I341
+ta(I531
+I341
+I530
+I344
+ta(I530
+I344
+I529
+I347
+ta(I529
+I347
+I528
+I349
+ta(I528
+I349
+I527
+I351
+ta(I527
+I351
+I526
+I354
+ta(I526
+I354
+I525
+I356
+ta(I525
+I356
+I524
+I358
+ta(I524
+I358
+I523
+I361
+ta(I523
+I361
+I522
+I363
+ta(I522
+I363
+I521
+I366
+ta(I521
+I366
+I520
+I368
+ta(I520
+I368
+I519
+I371
+ta(I519
+I371
+I518
+I373
+ta(I518
+I373
+I517
+I375
+ta(I517
+I375
+I516
+I377
+ta(I516
+I377
+I516
+I378
+ta(I516
+I378
+I516
+I379
+ta(I516
+I379
+I515
+I380
+ta(I515
+I380
+I515
+I381
+ta(I515
+I381
+I514
+I383
+ta(I514
+I383
+I514
+I384
+ta(I514
+I384
+I514
+I385
+ta(I514
+I385
+I514
+I387
+ta(I514
+I387
+I514
+I389
+ta(I514
+I389
+I514
+I390
+ta(I514
+I390
+I514
+I391
+ta(I514
+I391
+I514
+I392
+ta(I514
+I392
+I514
+I393
+ta(I514
+I393
+I515
+I393
+ta(I515
+I393
+I516
+I394
+ta(I516
+I394
+I517
+I394
+ta(I517
+I394
+I519
+I395
+ta(I519
+I395
+I521
+I396
+ta(I521
+I396
+I524
+I397
+ta(I524
+I397
+I527
+I398
+ta(I527
+I398
+I529
+I399
+ta(I529
+I399
+I532
+I399
+ta(I532
+I399
+I534
+I400
+ta(I534
+I400
+I536
+I401
+ta(I536
+I401
+I539
+I401
+ta(I539
+I401
+I541
+I402
+ta(I541
+I402
+I543
+I403
+ta(I543
+I403
+I544
+I404
+ta(I544
+I404
+I547
+I405
+ta(I547
+I405
+I549
+I406
+ta(I549
+I406
+I551
+I407
+ta(I551
+I407
+I554
+I408
+ta(I554
+I408
+I555
+I409
+ta(I555
+I409
+I557
+I410
+ta(I557
+I410
+I559
+I412
+ta(I559
+I412
+I561
+I413
+ta(I561
+I413
+I563
+I414
+ta(I563
+I414
+I565
+I416
+ta(I565
+I416
+I566
+I417
+ta(I566
+I417
+I568
+I418
+ta(I568
+I418
+I569
+I420
+ta(I569
+I420
+I570
+I421
+ta(I570
+I421
+I572
+I423
+ta(I572
+I423
+I574
+I425
+ta(I574
+I425
+I576
+I427
+ta(I576
+I427
+I577
+I429
+ta(I577
+I429
+I579
+I432
+ta(I579
+I432
+I581
+I434
+ta(I581
+I434
+I582
+I436
+ta(I582
+I436
+I583
+I438
+ta(I583
+I438
+I585
+I441
+ta(I585
+I441
+I586
+I442
+ta(I586
+I442
+I587
+I445
+ta(I587
+I445
+I589
+I447
+ta(I589
+I447
+I590
+I449
+ta(I590
+I449
+I591
+I451
+ta(I591
+I451
+I593
+I453
+ta(I593
+I453
+I594
+I456
+ta(I594
+I456
+I596
+I458
+ta(I596
+I458
+I597
+I460
+ta(I597
+I460
+I599
+I462
+ta(I599
+I462
+I600
+I464
+ta(I600
+I464
+I601
+I465
+ta(I601
+I465
+I602
+I467
+ta(I602
+I467
+I603
+I468
+ta(I603
+I468
+I604
+I470
+ta(I604
+I470
+I605
+I472
+ta(I605
+I472
+I606
+I474
+ta(I606
+I474
+I608
+I475
+ta(I608
+I475
+I609
+I477
+ta(I609
+I477
+I609
+I478
+ta(I609
+I478
+I610
+I478
+ta(I610
+I478
+I610
+I479
+ta(I610
+I479
+I611
+I480
+ta(I611
+I480
+I612
+I480
+ta(I612
+I480
+I612
+I481
+ta(I612
+I481
+I613
+I482
+ta(I613
+I482
+I613
+I483
+ta(I613
+I483
+I614
+I485
+ta(I614
+I485
+I614
+I486
+ta(I614
+I486
+I615
+I488
+ta(I615
+I488
+I615
+I489
+ta(I615
+I489
+I615
+I488
+ta(I615
+I488
+I614
+I487
+ta(I614
+I487
+I614
+I486
+ta(I614
+I486
+I614
+I485
+tatp58
+a(g46
+I16
+(lp59
+(I638
+I294
+I637
+I294
+ta(I637
+I294
+I634
+I294
+ta(I634
+I294
+I632
+I295
+ta(I632
+I295
+I630
+I295
+ta(I630
+I295
+I628
+I296
+ta(I628
+I296
+I626
+I297
+ta(I626
+I297
+I624
+I297
+ta(I624
+I297
+I621
+I299
+ta(I621
+I299
+I619
+I300
+ta(I619
+I300
+I617
+I301
+ta(I617
+I301
+I615
+I303
+ta(I615
+I303
+I613
+I304
+ta(I613
+I304
+I611
+I306
+ta(I611
+I306
+I609
+I307
+ta(I609
+I307
+I607
+I309
+ta(I607
+I309
+I606
+I311
+ta(I606
+I311
+I604
+I312
+ta(I604
+I312
+I602
+I314
+ta(I602
+I314
+I600
+I316
+ta(I600
+I316
+I598
+I318
+ta(I598
+I318
+I597
+I319
+ta(I597
+I319
+I596
+I321
+ta(I596
+I321
+I596
+I322
+ta(I596
+I322
+I595
+I324
+ta(I595
+I324
+I594
+I326
+ta(I594
+I326
+I594
+I327
+ta(I594
+I327
+I593
+I329
+ta(I593
+I329
+I592
+I331
+ta(I592
+I331
+I592
+I333
+ta(I592
+I333
+I591
+I335
+ta(I591
+I335
+I591
+I337
+ta(I591
+I337
+I590
+I339
+ta(I590
+I339
+I590
+I341
+ta(I590
+I341
+I590
+I343
+ta(I590
+I343
+I590
+I345
+ta(I590
+I345
+I590
+I347
+ta(I590
+I347
+I590
+I349
+ta(I590
+I349
+I590
+I352
+ta(I590
+I352
+I590
+I354
+ta(I590
+I354
+I590
+I356
+ta(I590
+I356
+I590
+I358
+ta(I590
+I358
+I591
+I361
+ta(I591
+I361
+I592
+I363
+ta(I592
+I363
+I593
+I364
+ta(I593
+I364
+I594
+I365
+ta(I594
+I365
+I594
+I366
+ta(I594
+I366
+I595
+I367
+ta(I595
+I367
+I596
+I368
+ta(I596
+I368
+I597
+I369
+ta(I597
+I369
+I598
+I370
+ta(I598
+I370
+I599
+I370
+ta(I599
+I370
+I600
+I371
+ta(I600
+I371
+I601
+I372
+ta(I601
+I372
+I602
+I373
+ta(I602
+I373
+I604
+I373
+ta(I604
+I373
+I605
+I374
+ta(I605
+I374
+I607
+I374
+ta(I607
+I374
+I609
+I374
+ta(I609
+I374
+I610
+I374
+ta(I610
+I374
+I611
+I374
+ta(I611
+I374
+I612
+I375
+ta(I612
+I375
+I613
+I375
+ta(I613
+I375
+I614
+I376
+ta(I614
+I376
+I615
+I376
+ta(I615
+I376
+I616
+I377
+ta(I616
+I377
+I618
+I377
+ta(I618
+I377
+I620
+I378
+ta(I620
+I378
+I622
+I378
+ta(I622
+I378
+I624
+I379
+ta(I624
+I379
+I625
+I379
+ta(I625
+I379
+I627
+I380
+ta(I627
+I380
+I628
+I380
+ta(I628
+I380
+I629
+I381
+ta(I629
+I381
+I630
+I381
+ta(I630
+I381
+I630
+I382
+ta(I630
+I382
+I631
+I382
+ta(I631
+I382
+I632
+I383
+ta(I632
+I383
+I633
+I383
+ta(I633
+I383
+I634
+I384
+ta(I634
+I384
+I635
+I385
+ta(I635
+I385
+I637
+I386
+ta(I637
+I386
+I639
+I387
+ta(I639
+I387
+I641
+I388
+ta(I641
+I388
+I642
+I389
+ta(I642
+I389
+I643
+I390
+ta(I643
+I390
+I644
+I391
+ta(I644
+I391
+I645
+I392
+ta(I645
+I392
+I646
+I392
+ta(I646
+I392
+I646
+I393
+ta(I646
+I393
+I648
+I393
+ta(I648
+I393
+I649
+I394
+ta(I649
+I394
+I650
+I395
+ta(I650
+I395
+I650
+I396
+ta(I650
+I396
+I651
+I397
+ta(I651
+I397
+I652
+I398
+ta(I652
+I398
+I654
+I400
+ta(I654
+I400
+I655
+I401
+ta(I655
+I401
+I656
+I402
+ta(I656
+I402
+I657
+I403
+ta(I657
+I403
+I658
+I404
+ta(I658
+I404
+I658
+I405
+ta(I658
+I405
+I659
+I406
+ta(I659
+I406
+I660
+I406
+ta(I660
+I406
+I661
+I407
+ta(I661
+I407
+I662
+I408
+ta(I662
+I408
+I663
+I409
+ta(I663
+I409
+I664
+I410
+ta(I664
+I410
+I665
+I412
+ta(I665
+I412
+I667
+I413
+ta(I667
+I413
+I668
+I415
+ta(I668
+I415
+I669
+I417
+ta(I669
+I417
+I671
+I418
+ta(I671
+I418
+I672
+I420
+ta(I672
+I420
+I672
+I422
+ta(I672
+I422
+I673
+I423
+ta(I673
+I423
+I674
+I424
+ta(I674
+I424
+I674
+I426
+ta(I674
+I426
+I675
+I428
+ta(I675
+I428
+I675
+I429
+ta(I675
+I429
+I676
+I431
+ta(I676
+I431
+I676
+I432
+ta(I676
+I432
+I677
+I434
+ta(I677
+I434
+I678
+I435
+ta(I678
+I435
+I678
+I437
+ta(I678
+I437
+I678
+I438
+ta(I678
+I438
+I678
+I439
+ta(I678
+I439
+I678
+I440
+ta(I678
+I440
+I678
+I441
+ta(I678
+I441
+I678
+I443
+ta(I678
+I443
+I677
+I445
+ta(I677
+I445
+I677
+I446
+ta(I677
+I446
+I676
+I448
+ta(I676
+I448
+I676
+I450
+ta(I676
+I450
+I676
+I451
+ta(I676
+I451
+I675
+I453
+ta(I675
+I453
+I675
+I454
+ta(I675
+I454
+I674
+I456
+ta(I674
+I456
+I673
+I457
+ta(I673
+I457
+I673
+I459
+ta(I673
+I459
+I672
+I460
+ta(I672
+I460
+I671
+I461
+ta(I671
+I461
+I670
+I462
+ta(I670
+I462
+I669
+I463
+ta(I669
+I463
+I668
+I465
+ta(I668
+I465
+I668
+I466
+ta(I668
+I466
+I667
+I467
+ta(I667
+I467
+I666
+I469
+ta(I666
+I469
+I665
+I471
+ta(I665
+I471
+I664
+I472
+ta(I664
+I472
+I664
+I473
+ta(I664
+I473
+I663
+I474
+ta(I663
+I474
+I662
+I475
+ta(I662
+I475
+I661
+I476
+ta(I661
+I476
+I661
+I477
+ta(I661
+I477
+I660
+I478
+ta(I660
+I478
+I660
+I479
+ta(I660
+I479
+I659
+I480
+ta(I659
+I480
+I659
+I481
+ta(I659
+I481
+I658
+I481
+ta(I658
+I481
+I657
+I482
+ta(I657
+I482
+I657
+I483
+ta(I657
+I483
+I656
+I484
+ta(I656
+I484
+I656
+I485
+ta(I656
+I485
+I655
+I486
+ta(I655
+I486
+I655
+I487
+ta(I655
+I487
+I654
+I487
+tatp60
+a(g46
+I16
+(lp61
+(I655
+I481
+I655
+I482
+ta(I655
+I482
+I654
+I482
+ta(I654
+I482
+I654
+I483
+ta(I654
+I483
+I654
+I484
+ta(I654
+I484
+I653
+I484
+ta(I653
+I484
+I653
+I485
+ta(I653
+I485
+I652
+I485
+ta(I652
+I485
+I652
+I486
+ta(I652
+I486
+I651
+I486
+ta(I651
+I486
+I651
+I487
+ta(I651
+I487
+I650
+I487
+ta(I650
+I487
+I650
+I488
+ta(I650
+I488
+I649
+I488
+ta(I649
+I488
+I648
+I488
+ta(I648
+I488
+I647
+I489
+ta(I647
+I489
+I646
+I489
+ta(I646
+I489
+I645
+I489
+ta(I645
+I489
+I644
+I489
+ta(I644
+I489
+I643
+I490
+ta(I643
+I490
+I642
+I490
+ta(I642
+I490
+I641
+I490
+ta(I641
+I490
+I640
+I490
+ta(I640
+I490
+I639
+I490
+ta(I639
+I490
+I638
+I490
+ta(I638
+I490
+I637
+I490
+ta(I637
+I490
+I636
+I490
+ta(I636
+I490
+I635
+I489
+ta(I635
+I489
+I634
+I489
+ta(I634
+I489
+I633
+I489
+ta(I633
+I489
+I632
+I488
+ta(I632
+I488
+I631
+I488
+ta(I631
+I488
+I631
+I487
+ta(I631
+I487
+I630
+I487
+ta(I630
+I487
+I629
+I486
+ta(I629
+I486
+I628
+I485
+ta(I628
+I485
+I627
+I485
+ta(I627
+I485
+I627
+I484
+ta(I627
+I484
+I626
+I484
+ta(I626
+I484
+I626
+I483
+ta(I626
+I483
+I625
+I482
+ta(I625
+I482
+I624
+I481
+ta(I624
+I481
+I624
+I480
+ta(I624
+I480
+I623
+I480
+tatp62
+a(g46
+I16
+(lp63
+(I675
+I273
+I676
+I273
+ta(I676
+I273
+I677
+I273
+ta(I677
+I273
+I677
+I275
+ta(I677
+I275
+I678
+I276
+ta(I678
+I276
+I679
+I278
+ta(I679
+I278
+I681
+I281
+ta(I681
+I281
+I682
+I284
+ta(I682
+I284
+I683
+I287
+ta(I683
+I287
+I684
+I290
+ta(I684
+I290
+I685
+I293
+ta(I685
+I293
+I687
+I296
+ta(I687
+I296
+I688
+I299
+ta(I688
+I299
+I689
+I301
+ta(I689
+I301
+I690
+I303
+ta(I690
+I303
+I691
+I306
+ta(I691
+I306
+I691
+I309
+ta(I691
+I309
+I692
+I312
+ta(I692
+I312
+I693
+I315
+ta(I693
+I315
+I694
+I318
+ta(I694
+I318
+I694
+I322
+ta(I694
+I322
+I696
+I325
+ta(I696
+I325
+I696
+I328
+ta(I696
+I328
+I697
+I332
+ta(I697
+I332
+I698
+I334
+ta(I698
+I334
+I699
+I336
+ta(I699
+I336
+I699
+I338
+ta(I699
+I338
+I700
+I340
+ta(I700
+I340
+I700
+I342
+ta(I700
+I342
+I700
+I344
+ta(I700
+I344
+I700
+I346
+ta(I700
+I346
+I701
+I348
+ta(I701
+I348
+I701
+I350
+ta(I701
+I350
+I701
+I352
+ta(I701
+I352
+I701
+I354
+ta(I701
+I354
+I701
+I356
+ta(I701
+I356
+I702
+I357
+ta(I702
+I357
+I702
+I359
+ta(I702
+I359
+I702
+I361
+ta(I702
+I361
+I702
+I363
+ta(I702
+I363
+I703
+I365
+ta(I703
+I365
+I703
+I367
+ta(I703
+I367
+I703
+I369
+ta(I703
+I369
+I704
+I371
+ta(I704
+I371
+I704
+I373
+ta(I704
+I373
+I704
+I376
+ta(I704
+I376
+I704
+I378
+ta(I704
+I378
+I705
+I380
+ta(I705
+I380
+I705
+I382
+ta(I705
+I382
+I705
+I385
+ta(I705
+I385
+I705
+I387
+ta(I705
+I387
+I706
+I389
+ta(I706
+I389
+I706
+I391
+ta(I706
+I391
+I706
+I392
+ta(I706
+I392
+I706
+I394
+ta(I706
+I394
+I706
+I396
+ta(I706
+I396
+I707
+I397
+ta(I707
+I397
+I707
+I398
+ta(I707
+I398
+I707
+I400
+ta(I707
+I400
+I708
+I401
+ta(I708
+I401
+I708
+I402
+ta(I708
+I402
+I708
+I403
+ta(I708
+I403
+I708
+I404
+ta(I708
+I404
+I708
+I405
+ta(I708
+I405
+I709
+I406
+ta(I709
+I406
+I709
+I407
+ta(I709
+I407
+I709
+I408
+ta(I709
+I408
+I709
+I409
+ta(I709
+I409
+I710
+I410
+ta(I710
+I410
+I710
+I411
+tatp64
+a(g46
+I16
+(lp65
+(I703
+I403
+I703
+I404
+ta(I703
+I404
+I704
+I404
+ta(I704
+I404
+I704
+I405
+ta(I704
+I405
+I704
+I406
+ta(I704
+I406
+I705
+I406
+ta(I705
+I406
+I705
+I407
+ta(I705
+I407
+I705
+I408
+ta(I705
+I408
+I705
+I409
+ta(I705
+I409
+I706
+I409
+ta(I706
+I409
+I706
+I410
+ta(I706
+I410
+I706
+I411
+ta(I706
+I411
+I706
+I412
+ta(I706
+I412
+I707
+I413
+ta(I707
+I413
+I707
+I414
+ta(I707
+I414
+I707
+I415
+ta(I707
+I415
+I707
+I416
+ta(I707
+I416
+I707
+I417
+ta(I707
+I417
+I707
+I418
+ta(I707
+I418
+I707
+I419
+ta(I707
+I419
+I707
+I420
+ta(I707
+I420
+I707
+I421
+ta(I707
+I421
+I707
+I422
+ta(I707
+I422
+I707
+I423
+ta(I707
+I423
+I707
+I424
+ta(I707
+I424
+I707
+I425
+ta(I707
+I425
+I707
+I426
+ta(I707
+I426
+I707
+I427
+ta(I707
+I427
+I707
+I428
+ta(I707
+I428
+I707
+I429
+ta(I707
+I429
+I706
+I430
+ta(I706
+I430
+I706
+I431
+ta(I706
+I431
+I706
+I432
+ta(I706
+I432
+I706
+I433
+ta(I706
+I433
+I705
+I434
+ta(I705
+I434
+I705
+I435
+ta(I705
+I435
+I705
+I436
+ta(I705
+I436
+I704
+I437
+ta(I704
+I437
+I704
+I438
+ta(I704
+I438
+I704
+I439
+ta(I704
+I439
+I704
+I440
+ta(I704
+I440
+I703
+I440
+ta(I703
+I440
+I703
+I441
+ta(I703
+I441
+I703
+I442
+ta(I703
+I442
+I703
+I443
+ta(I703
+I443
+I702
+I443
+ta(I702
+I443
+I702
+I444
+ta(I702
+I444
+I702
+I445
+ta(I702
+I445
+I702
+I446
+ta(I702
+I446
+I701
+I447
+ta(I701
+I447
+I701
+I448
+ta(I701
+I448
+I701
+I449
+ta(I701
+I449
+I701
+I450
+ta(I701
+I450
+I700
+I450
+ta(I700
+I450
+I700
+I451
+ta(I700
+I451
+I700
+I452
+tatp66
+a(g46
+I16
+(lp67
+(I699
+I472
+I700
+I472
+ta(I700
+I472
+I700
+I473
+ta(I700
+I473
+I700
+I474
+ta(I700
+I474
+I700
+I475
+ta(I700
+I475
+I700
+I476
+ta(I700
+I476
+I700
+I477
+ta(I700
+I477
+I700
+I478
+tatp68
+a.
\ No newline at end of file
--- /dev/null
+# superdoodle.py
+
+"""
+This module implements the SuperDoodle demo application. It takes the
+DoodleWindow previously presented and reuses it in a much more
+intelligent Frame. This one has a menu and a statusbar, is able to
+save and reload doodles, clear the workspace, and has a simple control
+panel for setting color and line thickness in addition to the popup
+menu that DoodleWindow provides. There is also a nice About dialog
+implmented using an wxHtmlWindow.
+"""
+
+from wxPython.wx import *
+from doodle import DoodleWindow
+
+import os, cPickle
+
+
+#----------------------------------------------------------------------
+
+idNEW = 11001
+idOPEN = 11002
+idSAVE = 11003
+idSAVEAS = 11004
+idCLEAR = 11005
+idEXIT = 11006
+idABOUT = 11007
+
+
+class DoodleFrame(wxFrame):
+ """
+ A DoodleFrame contains a DoodleWindow and a ControlPanel and manages
+ their layout with a wxBoxSizer. A menu and associated event handlers
+ provides for saving a doodle to a file, etc.
+ """
+ title = "Do a doodle"
+ def __init__(self, parent):
+ wxFrame.__init__(self, parent, -1, self.title, size=(800,600))
+ self.CreateStatusBar()
+ self.MakeMenu()
+ self.filename = None
+
+ self.doodle = DoodleWindow(self, -1)
+ cPanel = ControlPanel(self, -1, self.doodle)
+
+ # Create a sizer to layout the two windows side-by-side.
+ # Both will grow vertically, the doodle window will grow
+ # horizontally as well.
+ box = wxBoxSizer(wxHORIZONTAL)
+ box.Add(cPanel, 0, wxEXPAND)
+ box.Add(self.doodle, 1, wxEXPAND)
+
+ # Tell the frame that it should layout itself in response to
+ # size events.
+ self.SetAutoLayout(true)
+ self.SetSizer(box)
+
+
+ def SaveFile(self):
+ if self.filename:
+ data = self.doodle.GetLinesData()
+ f = open(self.filename, 'w')
+ cPickle.dump(data, f)
+ f.close()
+
+
+ def ReadFile(self):
+ if self.filename:
+ try:
+ f = open(self.filename, 'r')
+ data = cPickle.load(f)
+ f.close()
+ self.doodle.SetLinesData(data)
+ except cPickle.UnpicklingError:
+ wxMessageBox("%s is not a doodle file." % self.filename,
+ "oops!", style=wxOK|wxICON_EXCLAMATION)
+
+
+ def MakeMenu(self):
+ # create the file menu
+ menu1 = wxMenu()
+ menu1.Append(idOPEN, "&Open", "Open a doodle file")
+ menu1.Append(idSAVE, "&Save", "Save the doodle")
+ menu1.Append(idSAVEAS, "Save &As", "Save the doodle in a new file")
+ menu1.AppendSeparator()
+ menu1.Append(idCLEAR, "&Clear", "Clear the current doodle")
+ menu1.AppendSeparator()
+ menu1.Append(idEXIT, "E&xit", "Terminate the application")
+
+ # and the help menu
+ menu2 = wxMenu()
+ menu2.Append(idABOUT, "&About", "Display the gratuitous 'about this app' thingamajig")
+
+ # and add them to a menubar
+ menuBar = wxMenuBar()
+ menuBar.Append(menu1, "&File")
+ menuBar.Append(menu2, "&Help")
+ self.SetMenuBar(menuBar)
+
+ EVT_MENU(self, idOPEN, self.OnMenuOpen)
+ EVT_MENU(self, idSAVE, self.OnMenuSave)
+ EVT_MENU(self, idSAVEAS, self.OnMenuSaveAs)
+ EVT_MENU(self, idCLEAR, self.OnMenuClear)
+ EVT_MENU(self, idEXIT, self.OnMenuExit)
+ EVT_MENU(self, idABOUT, self.OnMenuAbout)
+
+
+
+ wildcard = "Doodle files (*.ddl)|*.ddl|All files (*.*)|*.*"
+
+ def OnMenuOpen(self, event):
+ dlg = wxFileDialog(self, "Open doodle file...",
+ style=wxOPEN, wildcard = self.wildcard)
+ if dlg.ShowModal() == wxID_OK:
+ self.filename = dlg.GetPath()
+ self.ReadFile()
+ self.SetTitle(self.title + ' -- ' + self.filename)
+ dlg.Destroy()
+
+
+ def OnMenuSave(self, event):
+ if not self.filename:
+ self.OnMenuSaveAs(event)
+ else:
+ self.SaveFile()
+
+
+ def OnMenuSaveAs(self, event):
+ dlg = wxFileDialog(self, "Save doodle as...",
+ style=wxSAVE | wxOVERWRITE_PROMPT,
+ wildcard = self.wildcard)
+ if dlg.ShowModal() == wxID_OK:
+ filename = dlg.GetPath()
+ if not os.path.splitext(filename)[1]:
+ filename = filename + '.ddl'
+ self.filename = filename
+ self.SaveFile()
+ self.SetTitle(self.title + ' -- ' + self.filename)
+ dlg.Destroy()
+
+
+ def OnMenuClear(self, event):
+ self.doodle.SetLinesData([])
+ self.SetTitle(self.title)
+
+
+ def OnMenuExit(self, event):
+ self.Close()
+
+
+ def OnMenuAbout(self, event):
+ dlg = DoodleAbout(self)
+ dlg.ShowModal()
+ dlg.Destroy()
+
+
+
+#----------------------------------------------------------------------
+
+
+class ControlPanel(wxPanel):
+ """
+ This class implements a very simple control panel for the DoodleWindow.
+ It creates buttons for each of the colours and thickneses supported by
+ the DoodleWindow, and event handlers to set the selected values. There is
+ also a little window that shows an example doodleLine in the selected
+ values. Nested sizers are used for layout.
+ """
+ def __init__(self, parent, ID, doodle):
+ wxPanel.__init__(self, parent, ID, style=wxRAISED_BORDER)
+
+ numCols = 4
+ spacing = 4
+
+ # Make a grid of buttons for each colour. Attach each button
+ # event to self.OnSetColour. The button ID is the same as the
+ # key in the colour dictionary.
+ colours = doodle.menuColours
+ keys = colours.keys()
+ keys.sort()
+ cGrid = wxGridSizer(cols=numCols, hgap=2, vgap=2)
+ for k in keys:
+ bmp = self.MakeBitmap(wxNamedColour(colours[k]))
+ b = wxBitmapButton(self, k, bmp)
+ EVT_BUTTON(self, k, self.OnSetColour)
+ cGrid.Add(b, 0)
+
+ # Save the button size so we can use it for the number buttons
+ btnSize = b.GetSize()
+
+ # Make a grid of buttons for the thicknesses. Attach each button
+ # event to self.OnSetThickness. The button ID is the same as the
+ # thickness value.
+ tGrid = wxGridSizer(cols=numCols, hgap=2, vgap=2)
+ for x in range(1, doodle.maxThickness+1):
+ b = wxButton(self, x, str(x), size=btnSize)
+ EVT_BUTTON(self, x, self.OnSetThickness)
+ tGrid.Add(b, 0)
+
+ # Make a colour indicator window, it is registerd as a listener
+ # with the doodle window so it will be notified when the settings
+ # change
+ ci = ColourIndicator(self)
+ doodle.AddListener(ci)
+ doodle.Notify()
+ self.doodle = doodle
+
+ # Make a box sizer and put the two grids and the indicator
+ # window in it.
+ box = wxBoxSizer(wxVERTICAL)
+ box.Add(cGrid, 0, wxALL, spacing)
+ box.Add(tGrid, 0, wxALL, spacing)
+ box.Add(ci, 0, wxEXPAND|wxALL, spacing)
+ self.SetSizer(box)
+ self.SetAutoLayout(true)
+
+ # Resize this window so it is just large enough for the
+ # minimum requirements of the sizer.
+ box.Fit(self)
+
+
+
+ def MakeBitmap(self, colour):
+ """
+ We can create a bitmap of whatever we want by simply selecting
+ it into a wxMemoryDC and drawing on it. In this case we just set
+ a background brush and clear the dc.
+ """
+ bmp = wxEmptyBitmap(16,16)
+ dc = wxMemoryDC()
+ dc.SelectObject(bmp)
+ dc.SetBackground(wxBrush(colour))
+ dc.Clear()
+ dc.SelectObject(wxNullBitmap)
+ return bmp
+
+
+ def OnSetColour(self, event):
+ """
+ Use the event ID to get the colour, set that colour in the doodle.
+ """
+ colour = self.doodle.menuColours[event.GetId()]
+ self.doodle.SetColour(colour)
+
+
+ def OnSetThickness(self, event):
+ """
+ Use the event ID to set the thickness in the doodle.
+ """
+ self.doodle.SetThickness(event.GetId())
+
+
+#----------------------------------------------------------------------
+
+class ColourIndicator(wxWindow):
+ """
+ An instance of this class is used on the ControlPanel to show
+ a sample of what the current doodle line will look like.
+ """
+ def __init__(self, parent):
+ wxWindow.__init__(self, parent, -1, style=wxSUNKEN_BORDER)
+ self.SetBackgroundColour(wxWHITE)
+ self.SetSize(wxSize(-1, 40))
+ self.colour = self.thickness = None
+ EVT_PAINT(self, self.OnPaint)
+
+
+ def Update(self, colour, thickness):
+ """
+ The doodle window calls this method any time the colour
+ or line thickness changes.
+ """
+ self.colour = colour
+ self.thickness = thickness
+ self.Refresh() # generate a paint event
+
+
+ def OnPaint(self, event):
+ """
+ This method is called when all or part of the window needs to be
+ redrawn.
+ """
+ dc = wxPaintDC(self)
+ if self.colour:
+ sz = self.GetClientSize()
+ pen = wxPen(wxNamedColour(self.colour), self.thickness)
+ dc.BeginDrawing()
+ dc.SetPen(pen)
+ dc.DrawLine(10, sz.height/2, sz.width-10, sz.height/2)
+ dc.EndDrawing()
+
+
+#----------------------------------------------------------------------
+
+class DoodleAbout(wxDialog):
+ """ An about box that uses an HTML window """
+
+ text = '''
+<html>
+<body bgcolor="#ACAA60">
+<center><table bgcolor="#455481" width="100%" cellspacing="0"
+cellpadding="0" border="1">
+<tr>
+ <td align="center"><h1>SuperDoodle</h1></td>
+</tr>
+</table>
+</center>
+<p><b>SuperDoodle</b> is a demonstration program for <b>wxPython</b> that
+will hopefully teach you a thing or two. Just follow these simple
+instructions: </p>
+<p>
+<ol>
+ <li><b>Read</b> the Source...
+ <li><b>Learn</b>...
+ <li><b>Do!</b>
+</ol>
+
+<p><b>SuperDoodle</b> and <b>wxPython</b> are brought to you by
+<b>Robin Dunn</b> and <b>Total Control Software</b>, Copyright
+© 1997-2001.</p>
+</body>
+</html>
+'''
+
+ def __init__(self, parent):
+ wxDialog.__init__(self, parent, -1, 'About SuperDoodle',
+ size=wxSize(420, 380))
+ from wxPython.html import wxHtmlWindow
+
+ html = wxHtmlWindow(self, -1)
+ html.SetPage(self.text)
+ button = wxButton(self, wxID_OK, "Okay")
+
+ # constraints for the html window
+ lc = wxLayoutConstraints()
+ lc.top.SameAs(self, wxTop, 5)
+ lc.left.SameAs(self, wxLeft, 5)
+ lc.bottom.SameAs(button, wxTop, 5)
+ lc.right.SameAs(self, wxRight, 5)
+ html.SetConstraints(lc)
+
+ # constraints for the button
+ lc = wxLayoutConstraints()
+ lc.bottom.SameAs(self, wxBottom, 5)
+ lc.centreX.SameAs(self, wxCentreX)
+ lc.width.AsIs()
+ lc.height.AsIs()
+ button.SetConstraints(lc)
+
+ self.SetAutoLayout(true)
+ self.Layout()
+ self.CentreOnParent(wxBOTH)
+
+
+#----------------------------------------------------------------------
+
+class DoodleApp(wxApp):
+ def OnInit(self):
+ frame = DoodleFrame(None)
+ frame.Show(true)
+ self.SetTopWindow(frame)
+ return true
+
+
+#----------------------------------------------------------------------
+
+if __name__ == '__main__':
+ app = DoodleApp(0)
+ app.MainLoop()
--- /dev/null
+##############################################################################
+#
+# Zope Public License (ZPL) Version 1.0
+# -------------------------------------
+#
+# Copyright (c) Digital Creations. All rights reserved.
+#
+# This license has been certified as Open Source(tm).
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# 1. Redistributions in source code must retain the above copyright
+# notice, this list of conditions, and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions, and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+#
+# 3. Digital Creations requests that attribution be given to Zope
+# in any manner possible. Zope includes a "Powered by Zope"
+# button that is installed by default. While it is not a license
+# violation to remove this button, it is requested that the
+# attribution remain. A significant investment has been put
+# into Zope, and this effort will continue if the Zope community
+# continues to grow. This is one way to assure that growth.
+#
+# 4. All advertising materials and documentation mentioning
+# features derived from or use of this software must display
+# the following acknowledgement:
+#
+# "This product includes software developed by Digital Creations
+# for use in the Z Object Publishing Environment
+# (http://www.zope.org/)."
+#
+# In the event that the product being advertised includes an
+# intact Zope distribution (with copyright and license included)
+# then this clause is waived.
+#
+# 5. Names associated with Zope or Digital Creations must not be used to
+# endorse or promote products derived from this software without
+# prior written permission from Digital Creations.
+#
+# 6. Modified redistributions of any form whatsoever must retain
+# the following acknowledgment:
+#
+# "This product includes software developed by Digital Creations
+# for use in the Z Object Publishing Environment
+# (http://www.zope.org/)."
+#
+# Intact (re-)distributions of any official Zope release do not
+# require an external acknowledgement.
+#
+# 7. Modifications are encouraged but must be packaged separately as
+# patches to official Zope releases. Distributions that do not
+# clearly separate the patches from the original work must be clearly
+# labeled as unofficial distributions. Modifications which do not
+# carry the name Zope may be packaged in any form, as long as they
+# conform to all of the clauses above.
+#
+#
+# Disclaimer
+#
+# THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY
+# EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIGITAL CREATIONS OR ITS
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+#
+# This software consists of contributions made by Digital Creations and
+# many individuals on behalf of Digital Creations. Specific
+# attributions are listed in the accompanying credits file.
+#
+##############################################################################
+
+import re, ST, STDOM
+from string import split, join, replace, expandtabs, strip, find
+
+StringType=type('')
+ListType=type([])
+
+class StructuredTextExample(ST.StructuredTextParagraph):
+ """Represents a section of document with literal text, as for examples"""
+
+ def __init__(self, subs, **kw):
+ t=[]; a=t.append
+ for s in subs: a(s.getNodeValue())
+ apply(ST.StructuredTextParagraph.__init__,
+ (self, join(t,'\n\n'), ()),
+ kw)
+
+ def getColorizableTexts(self): return ()
+ def setColorizableTexts(self, src): pass # never color examples
+
+class StructuredTextBullet(ST.StructuredTextParagraph):
+ """Represents a section of a document with a title and a body"""
+
+class StructuredTextNumbered(ST.StructuredTextParagraph):
+ """Represents a section of a document with a title and a body"""
+
+class StructuredTextDescriptionTitle(ST.StructuredTextParagraph):
+ """Represents a section of a document with a title and a body"""
+
+class StructuredTextDescriptionBody(ST.StructuredTextParagraph):
+ """Represents a section of a document with a title and a body"""
+
+class StructuredTextDescription(ST.StructuredTextParagraph):
+ """Represents a section of a document with a title and a body"""
+
+ def __init__(self, title, src, subs, **kw):
+ apply(ST.StructuredTextParagraph.__init__, (self, src, subs), kw)
+ self._title=title
+
+ def getColorizableTexts(self): return self._title, self._src
+ def setColorizableTexts(self, src): self._title, self._src = src
+
+ def getChildren(self):
+ return (StructuredTextDescriptionTitle(self._title),
+ StructuredTextDescriptionBody(self._src, self._subs))
+
+class StructuredTextSectionTitle(ST.StructuredTextParagraph):
+ """Represents a section of a document with a title and a body"""
+
+class StructuredTextSection(ST.StructuredTextParagraph):
+ """Represents a section of a document with a title and a body"""
+ def __init__(self, src, subs=None, **kw):
+ apply(ST.StructuredTextParagraph.__init__,
+ (self, StructuredTextSectionTitle(src), subs),
+ kw)
+
+# a StructuredTextTable holds StructuredTextRows
+class StructuredTextTable(ST.StructuredTextDocument):
+ """
+ rows is a list of lists containing tuples, which
+ represent the columns/cells in each rows.
+ EX
+ rows = [[('row 1:column1',1)],[('row2:column1',1)]]
+ """
+
+ def __init__(self, rows, src, subs, **kw):
+ apply(ST.StructuredTextDocument.__init__,(self,subs),kw)
+ self._rows = []
+ for row in rows:
+ if row:
+ self._rows.append(StructuredTextRow(row,kw))
+
+ def getRows(self):
+ return [self._rows]
+
+ def _getRows(self):
+ return self.getRows()
+
+ def getColorizableTexts(self):
+ """
+ return a tuple where each item is a column/cell's
+ contents. The tuple, result, will be of this format.
+ ("r1 col1", "r1=col2", "r2 col1", "r2 col2")
+ """
+
+ #result = ()
+ result = []
+ for row in self._rows:
+ for column in row.getColumns()[0]:
+ #result = result[:] + (column.getColorizableTexts(),)
+ result.append(column.getColorizableTexts()[0])
+ return result
+
+ def setColorizableTexts(self,texts):
+ """
+ texts is going to a tuple where each item is the
+ result of being mapped to the colortext function.
+ Need to insert the results appropriately into the
+ individual columns/cells
+ """
+ for row_index in range(len(self._rows)):
+ for column_index in range(len(self._rows[row_index]._columns)):
+ self._rows[row_index]._columns[column_index].setColorizableTexts((texts[0],))
+ texts = texts[1:]
+
+ def _getColorizableTexts(self):
+ return self.getColorizableTexts()
+
+ def _setColorizableTexts(self):
+ return self.setColorizableTexts()
+
+# StructuredTextRow holds StructuredTextColumns
+class StructuredTextRow(ST.StructuredTextDocument):
+
+ def __init__(self,row,kw):
+ """
+ row is a list of tuples, where each tuple is
+ the raw text for a cell/column and the span
+ of that cell/column".
+ EX
+ [('this is column one',1), ('this is column two',1)]
+ """
+
+ apply(ST.StructuredTextDocument.__init__,(self,[]),kw)
+ self._columns = []
+ for column in row:
+ self._columns.append(StructuredTextColumn(column[0],column[1],kw))
+ def getColumns(self):
+ return [self._columns]
+
+ def _getColumns(self):
+ return [self._columns]
+
+# this holds the raw text of a table cell
+class StructuredTextColumn(ST.StructuredTextParagraph):
+ """
+ StructuredTextColumn is a cell/column in a table.
+ This contains the actual text of a column and is
+ thus a StructuredTextParagraph. A StructuredTextColumn
+ also holds the span of its column
+ """
+
+ def __init__(self,text,span,kw):
+ apply(ST.StructuredTextParagraph.__init__,(self,text,[]),kw)
+ self._span = span
+
+ def getSpan(self):
+ return self._span
+
+ def _getSpan(self):
+ return self._span
+
+class StructuredTextMarkup(STDOM.Element):
+
+ def __init__(self, v, **kw):
+ self._value=v
+ self._attributes=kw.keys()
+ for k, v in kw.items(): setattr(self, k, v)
+
+ def getChildren(self, type=type, lt=type([])):
+ v=self._value
+ if type(v) is not lt: v=[v]
+ return v
+
+ def getColorizableTexts(self): return self._value,
+ def setColorizableTexts(self, v): self._value=v[0]
+
+ def __repr__(self):
+ return '%s(%s)' % (self.__class__.__name__, `self._value`)
+
+class StructuredTextLiteral(StructuredTextMarkup):
+ def getColorizableTexts(self): return ()
+ def setColorizableTexts(self, v): pass
+
+class StructuredTextEmphasis(StructuredTextMarkup): pass
+
+class StructuredTextStrong(StructuredTextMarkup): pass
+
+class StructuredTextInnerLink(StructuredTextMarkup): pass
+
+class StructuredTextNamedLink(StructuredTextMarkup): pass
+
+class StructuredTextUnderline(StructuredTextMarkup): pass
+
+class StructuredTextLink(StructuredTextMarkup):
+ "A simple hyperlink"
+
+class DocumentClass:
+ """
+ Class instance calls [ex.=> x()] require a structured text
+ structure. Doc will then parse each paragraph in the structure
+ and will find the special structures within each paragraph.
+ Each special structure will be stored as an instance. Special
+ structures within another special structure are stored within
+ the 'top' structure
+ EX : '-underline this-' => would be turned into an underline
+ instance. '-underline **this**' would be stored as an underline
+ instance with a strong instance stored in its string
+ """
+
+ paragraph_types = [
+ 'doc_bullet',
+ 'doc_numbered',
+ 'doc_description',
+ 'doc_header',
+ 'doc_table',
+ ]
+
+ text_types = [
+ 'doc_href',
+ 'doc_strong',
+ 'doc_emphasize',
+ 'doc_literal',
+ 'doc_inner_link',
+ 'doc_named_link',
+ 'doc_underline',
+ ]
+
+ def __call__(self, doc):
+ if type(doc) is type(''):
+ doc=ST.StructuredText(doc)
+ doc.setSubparagraphs(self.color_paragraphs(
+ doc.getSubparagraphs()))
+ else:
+ doc=ST.StructuredTextDocument(self.color_paragraphs(
+ doc.getSubparagraphs()))
+ return doc
+
+ def parse(self, raw_string, text_type,
+ type=type, st=type(''), lt=type([])):
+
+ """
+ Parse accepts a raw_string, an expr to test the raw_string,
+ and the raw_string's subparagraphs.
+
+ Parse will continue to search through raw_string until
+ all instances of expr in raw_string are found.
+
+ If no instances of expr are found, raw_string is returned.
+ Otherwise a list of substrings and instances is returned
+ """
+
+ tmp = [] # the list to be returned if raw_string is split
+ append=tmp.append
+
+ if type(text_type) is st: text_type=getattr(self, text_type)
+
+ while 1:
+ t = text_type(raw_string)
+ if not t: break
+ #an instance of expr was found
+ t, start, end = t
+
+ if start: append(raw_string[0:start])
+
+ tt=type(t)
+ if tt is st:
+ # if we get a string back, add it to text to be parsed
+ raw_string = t+raw_string[end:len(raw_string)]
+ else:
+ if tt is lt:
+ # is we get a list, append it's elements
+ tmp[len(tmp):]=t
+ else:
+ # normal case, an object
+ append(t)
+ raw_string = raw_string[end:len(raw_string)]
+
+ if not tmp: return raw_string # nothing found
+
+ if raw_string: append(raw_string)
+ elif len(tmp)==1: return tmp[0]
+
+ return tmp
+
+
+ def color_text(self, str, types=None):
+ """Search the paragraph for each special structure
+ """
+ if types is None: types=self.text_types
+
+ for text_type in types:
+
+ if type(str) is StringType:
+ str = self.parse(str, text_type)
+ elif type(str) is ListType:
+ r=[]; a=r.append
+ for s in str:
+ if type(s) is StringType:
+ s=self.parse(s, text_type)
+ if type(s) is ListType: r[len(r):]=s
+ else: a(s)
+ else:
+ s.setColorizableTexts(
+ map(self.color_text,
+ s.getColorizableTexts()
+ ))
+ a(s)
+ str=r
+ else:
+ r=[]; a=r.append; color=self.color_text
+ for s in str.getColorizableTexts():
+ color(s, (text_type,))
+ a(s)
+
+ str.setColorizableTexts(r)
+
+ return str
+
+ def color_paragraphs(self, raw_paragraphs,
+ type=type, sequence_types=(type([]), type(())),
+ st=type('')):
+ result=[]
+ for paragraph in raw_paragraphs:
+
+ if paragraph.getNodeName() != 'StructuredTextParagraph':
+ result.append(paragraph)
+ continue
+
+ for pt in self.paragraph_types:
+ if type(pt) is st:
+ # grab the corresponding function
+ pt=getattr(self, pt)
+ # evaluate the paragraph
+ r=pt(paragraph)
+ if r:
+ if type(r) not in sequence_types:
+ r=r,
+ new_paragraphs=r
+ for paragraph in new_paragraphs:
+ paragraph.setSubparagraphs(self.color_paragraphs(paragraph.getSubparagraphs()))
+ break
+ else:
+ new_paragraphs=ST.StructuredTextParagraph(paragraph.getColorizableTexts()[0],
+ self.color_paragraphs(paragraph.getSubparagraphs()),
+ indent=paragraph.indent),
+ # color the inline StructuredText types
+ # for each StructuredTextParagraph
+ for paragraph in new_paragraphs:
+ paragraph.setColorizableTexts(
+ map(self.color_text,
+ paragraph.getColorizableTexts()
+ ))
+ result.append(paragraph)
+
+ return result
+
+ def doc_table(self,paragraph, expr = re.compile('(\s*)([||]+)').match):
+ text = paragraph.getColorizableTexts()[0]
+ m = expr(text)
+
+ if not (m):
+ return None
+ rows = []
+
+ # initial split
+ for row in split(text,"\n"):
+ rows.append(row)
+
+ # clean up the rows
+ for index in range(len(rows)):
+ tmp = []
+ rows[index] = strip(rows[index])
+ l = len(rows[index])-2
+ result = split(rows[index][:l],"||")
+ for text in result:
+ if text:
+ tmp.append(text)
+ tmp.append('')
+ else:
+ tmp.append(text)
+ rows[index] = tmp
+ # remove trailing '''s
+ for index in range(len(rows)):
+ l = len(rows[index])-1
+ rows[index] = rows[index][:l]
+
+ result = []
+ for row in rows:
+ cspan = 0
+ tmp = []
+ for item in row:
+ if item:
+ tmp.append(item,cspan)
+ cspan = 0
+ else:
+ cspan = cspan + 1
+ result.append(tmp)
+
+ subs = paragraph.getSubparagraphs()
+ indent=paragraph.indent
+ return StructuredTextTable(result,text,subs,indent=paragraph.indent)
+
+ def doc_bullet(self, paragraph, expr = re.compile('\s*[-*o]\s+').match):
+ top=paragraph.getColorizableTexts()[0]
+ m=expr(top)
+
+ if not m:
+ return None
+
+ subs=paragraph.getSubparagraphs()
+ if top[-2:]=='::':
+ subs=[StructuredTextExample(subs)]
+ top=top[:-1]
+ return StructuredTextBullet(top[m.span()[1]:], subs,
+ indent=paragraph.indent,
+ bullet=top[:m.span()[1]]
+ )
+
+ def doc_numbered(
+ self, paragraph,
+ expr = re.compile('(\s*[a-zA-Z]+\.)|(\s*[0-9]+\.)|(\s*[0-9]+\s+)').match):
+
+ # This is the old expression. It had a nasty habit
+ # of grabbing paragraphs that began with a single
+ # letter word even if there was no following period.
+
+ #expr = re.compile('\s*'
+ # '(([a-zA-Z]|[0-9]+|[ivxlcdmIVXLCDM]+)\.)*'
+ # '([a-zA-Z]|[0-9]+|[ivxlcdmIVXLCDM]+)\.?'
+ # '\s+').match):
+
+ top=paragraph.getColorizableTexts()[0]
+ m=expr(top)
+ if not m: return None
+ subs=paragraph.getSubparagraphs()
+ if top[-2:]=='::':
+ subs=[StructuredTextExample(subs)]
+ top=top[:-1]
+ return StructuredTextNumbered(top[m.span()[1]:], subs,
+ indent=paragraph.indent,
+ number=top[:m.span()[1]])
+
+ def doc_description(
+ self, paragraph,
+ delim = re.compile('\s+--\s+').search,
+ nb=re.compile(r'[^\0- ]').search,
+ ):
+
+ top=paragraph.getColorizableTexts()[0]
+ d=delim(top)
+ if not d: return None
+ start, end = d.span()
+ title=top[:start]
+ if find(title, '\n') >= 0: return None
+ if not nb(title): return None
+ d=top[start:end]
+ top=top[end:]
+
+ subs=paragraph.getSubparagraphs()
+ if top[-2:]=='::':
+ subs=[StructuredTextExample(subs)]
+ top=top[:-1]
+
+ return StructuredTextDescription(
+ title, top, subs,
+ indent=paragraph.indent,
+ delim=d)
+
+ def doc_header(self, paragraph,
+ expr = re.compile('[ a-zA-Z0-9.:/,-_*<>\?\'\"]+').match
+ ):
+ subs=paragraph.getSubparagraphs()
+ if not subs: return None
+ top=paragraph.getColorizableTexts()[0]
+ if not strip(top): return None
+ if top[-2:]=='::':
+ subs=StructuredTextExample(subs)
+ if strip(top)=='::': return subs
+ return ST.StructuredTextParagraph(top[:-1],
+ [subs],
+ indent=paragraph.indent,
+ level=paragraph.level)
+
+ if find(top,'\n') >= 0: return None
+ return StructuredTextSection(top, subs, indent=paragraph.indent, level=paragraph.level)
+
+ def doc_literal(
+ self, s,
+ expr=re.compile(
+ "(?:\s|^)'" # open
+ "([^ \t\n\r\f\v']|[^ \t\n\r\f\v'][^\n']*[^ \t\n\r\f\v'])" # contents
+ "'(?:\s|[,.;:!?]|$)" # close
+ ).search):
+
+ r=expr(s)
+ if r:
+ start, end = r.span(1)
+ return (StructuredTextLiteral(s[start:end]), start-1, end+1)
+ else:
+ return None
+
+ def doc_emphasize(
+ self, s,
+ expr = re.compile('\s*\*([ \na-zA-Z0-9.:/;,\'\"\?]+)\*(?!\*|-)').search
+ ):
+
+ r=expr(s)
+ if r:
+ start, end = r.span(1)
+ return (StructuredTextEmphasis(s[start:end]), start-1, end+1)
+ else:
+ return None
+
+ def doc_inner_link(self,
+ s,
+ expr1 = re.compile("\.\.\s*").search,
+ expr2 = re.compile("\[[a-zA-Z0-9]+\]").search):
+
+ # make sure we dont grab a named link
+ if expr2(s) and expr1(s):
+ start1,end1 = expr1(s).span()
+ start2,end2 = expr2(s).span()
+ if end1 == start2:
+ # uh-oh, looks like a named link
+ return None
+ else:
+ # the .. is somewhere else, ignore it
+ return (StructuredTextInnerLink(s[start2+1,end2-1],start2,end2))
+ return None
+ elif expr2(s) and not expr1(s):
+ start,end = expr2(s).span()
+ return (StructuredTextInnerLink(s[start+1:end-1]),start,end)
+ return None
+
+ def doc_named_link(self,
+ s,
+ expr=re.compile("(\.\.\s)(\[[a-zA-Z0-9]+\])").search):
+
+ result = expr(s)
+ if result:
+ start,end = result.span(2)
+ a,b = result.span(1)
+ str = strip(s[a:b]) + s[start:end]
+ str = s[start+1:end-1]
+ st,en = result.span()
+ return (StructuredTextNamedLink(str),st,en)
+ #return (StructuredTextNamedLink(s[st:en]),st,en)
+ return None
+
+ def doc_underline(self,
+ s,
+ expr=re.compile("\_([a-zA-Z0-9\s\.,\?\/]+)\_").search):
+
+ result = expr(s)
+ if result:
+ start,end = result.span(1)
+ st,e = result.span()
+ return (StructuredTextUnderline(s[start:end]),st,e)
+ else:
+ return None
+
+ def doc_strong(self,
+ s,
+ expr = re.compile('\s*\*\*([ \na-zA-Z0-9.:/;\-,!\?\'\"]+)\*\*').search
+ ):
+
+ r=expr(s)
+ if r:
+ start, end = r.span(1)
+ return (StructuredTextStrong(s[start:end]), start-2, end+2)
+ else:
+ return None
+
+ def doc_href(
+
+ self, s,
+ expr1 = re.compile("(\"[ a-zA-Z0-9\n\-\.\,\;\(\)\/\:\/]+\")(:)([a-zA-Z0-9\:\/\.\~\-]+)([,]*\s*)").search,
+ expr2 = re.compile('(\"[ a-zA-Z0-9\n\-\.\:\;\(\)\/]+\")([,]+\s+)([a-zA-Z0-9\@\.\,\?\!\/\:\;\-\#]+)(\s*)').search):
+
+ #expr1=re.compile('\"([ a-zA-Z0-9.:/;,\n\~\(\)\-]+)\"'
+ # ':'
+ # '([a-zA-Z0-9.:/;,\n\~]+)(?=(\s+|\.|\!|\?))'
+ # ).search,
+ #expr2=re.compile('\"([ a-zA-Z0-9./:]+)\"'
+ # ',\s+'
+ # '([ a-zA-Z0-9@.:/;]+)(?=(\s+|\.|\!|\?))'
+ # ).search,
+
+ punctuation = re.compile("[\,\.\?\!\;]+").match
+ r=expr1(s) or expr2(s)
+
+ if r:
+ # need to grab the href part and the
+ # beginning part
+
+ start,e = r.span(1)
+ name = s[start:e]
+ name = replace(name,'"','',2)
+ #start = start + 1
+ st,end = r.span(3)
+ if punctuation(s[end-1:end]):
+ end = end -1
+ link = s[st:end]
+ #end = end - 1
+
+ # name is the href title, link is the target
+ # of the href
+ return (StructuredTextLink(name, href=link),
+ start, end)
+
+ #return (StructuredTextLink(s[start:end], href=s[start:end]),
+ # start, end)
+ else:
+ return None
--- /dev/null
+##############################################################################
+#
+# Zope Public License (ZPL) Version 1.0
+# -------------------------------------
+#
+# Copyright (c) Digital Creations. All rights reserved.
+#
+# This license has been certified as Open Source(tm).
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# 1. Redistributions in source code must retain the above copyright
+# notice, this list of conditions, and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions, and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+#
+# 3. Digital Creations requests that attribution be given to Zope
+# in any manner possible. Zope includes a "Powered by Zope"
+# button that is installed by default. While it is not a license
+# violation to remove this button, it is requested that the
+# attribution remain. A significant investment has been put
+# into Zope, and this effort will continue if the Zope community
+# continues to grow. This is one way to assure that growth.
+#
+# 4. All advertising materials and documentation mentioning
+# features derived from or use of this software must display
+# the following acknowledgement:
+#
+# "This product includes software developed by Digital Creations
+# for use in the Z Object Publishing Environment
+# (http://www.zope.org/)."
+#
+# In the event that the product being advertised includes an
+# intact Zope distribution (with copyright and license included)
+# then this clause is waived.
+#
+# 5. Names associated with Zope or Digital Creations must not be used to
+# endorse or promote products derived from this software without
+# prior written permission from Digital Creations.
+#
+# 6. Modified redistributions of any form whatsoever must retain
+# the following acknowledgment:
+#
+# "This product includes software developed by Digital Creations
+# for use in the Z Object Publishing Environment
+# (http://www.zope.org/)."
+#
+# Intact (re-)distributions of any official Zope release do not
+# require an external acknowledgement.
+#
+# 7. Modifications are encouraged but must be packaged separately as
+# patches to official Zope releases. Distributions that do not
+# clearly separate the patches from the original work must be clearly
+# labeled as unofficial distributions. Modifications which do not
+# carry the name Zope may be packaged in any form, as long as they
+# conform to all of the clauses above.
+#
+#
+# Disclaimer
+#
+# THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY
+# EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIGITAL CREATIONS OR ITS
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+#
+# This software consists of contributions made by Digital Creations and
+# many individuals on behalf of Digital Creations. Specific
+# attributions are listed in the accompanying credits file.
+#
+##############################################################################
+
+import string
+from string import join, split, find, lstrip
+
+class DocBookClass:
+
+ element_types={
+ '#text': '_text',
+ 'StructuredTextDocument': 'document',
+ 'StructuredTextParagraph': 'paragraph',
+ 'StructuredTextExample': 'example',
+ 'StructuredTextBullet': 'bullet',
+ 'StructuredTextNumbered': 'numbered',
+ 'StructuredTextDescription': 'description',
+ 'StructuredTextDescriptionTitle': 'descriptionTitle',
+ 'StructuredTextDescriptionBody': 'descriptionBody',
+ 'StructuredTextSection': 'section',
+ 'StructuredTextSectionTitle': 'sectionTitle',
+ 'StructuredTextLiteral': 'literal',
+ 'StructuredTextEmphasis': 'emphasis',
+ 'StructuredTextStrong': 'strong',
+ 'StructuredTextLink': 'link',
+ 'StructuredTextXref': 'xref',
+ }
+
+ def dispatch(self, doc, level, output):
+ getattr(self, self.element_types[doc.getNodeName()])(doc, level, output)
+
+ def __call__(self, doc, level=1):
+ r=[]
+ self.dispatch(doc, level-1, r.append)
+ return join(r,'')
+
+ def _text(self, doc, level, output):
+ if doc.getNodeName() == 'StructuredTextLiteral':
+ output(doc.getNodeValue())
+ else:
+ output(lstrip(doc.getNodeValue()))
+
+ def document(self, doc, level, output):
+ output('<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook V3.1//EN">\n')
+ output('<book>\n')
+ children=doc.getChildNodes()
+ if (children and
+ children[0].getNodeName() == 'StructuredTextSection'):
+ output('<title>%s</title>' % children[0].getChildNodes()[0].getNodeValue())
+ for c in children:
+ getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+ output('</book>\n')
+
+ def section(self, doc, level, output):
+ output('\n<sect%s>\n' % (level + 1))
+ children=doc.getChildNodes()
+ for c in children:
+ getattr(self, self.element_types[c.getNodeName()])(c, level+1, output)
+ output('\n</sect%s>\n' % (level + 1))
+
+ def sectionTitle(self, doc, level, output):
+ output('<title>')
+ for c in doc.getChildNodes():
+ getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+ output('</title>\n')
+
+ def description(self, doc, level, output):
+ p=doc.getPreviousSibling()
+ if p is None or p.getNodeName() is not doc.getNodeName():
+ output('<variablelist>\n')
+ for c in doc.getChildNodes():
+ getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+ n=doc.getNextSibling()
+ if n is None or n.getNodeName() is not doc.getNodeName():
+ output('</variablelist>\n')
+
+ def descriptionTitle(self, doc, level, output):
+ output('<varlistentry><term>\n')
+ for c in doc.getChildNodes():
+ getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+ output('</term>\n')
+
+ def descriptionBody(self, doc, level, output):
+ output('<listitem><para>\n')
+ for c in doc.getChildNodes():
+ getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+ output('</para></listitem>\n')
+ output('</varlistentry>\n')
+
+ def bullet(self, doc, level, output):
+ p=doc.getPreviousSibling()
+ if p is None or p.getNodeName() is not doc.getNodeName():
+ output('<itemizedlist>\n')
+ output('<listitem><para>\n')
+
+ for c in doc.getChildNodes():
+ getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+ n=doc.getNextSibling()
+ output('</para></listitem>\n')
+ if n is None or n.getNodeName() is not doc.getNodeName():
+ output('</itemizedlist>\n')
+
+ def numbered(self, doc, level, output):
+ p=doc.getPreviousSibling()
+ if p is None or p.getNodeName() is not doc.getNodeName():
+ output('<orderedlist>\n')
+ output('<listitem><para>\n')
+ for c in doc.getChildNodes():
+ getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+ n=doc.getNextSibling()
+ output('</para></listitem>\n')
+ if n is None or n.getNodeName() is not doc.getNodeName():
+ output('</orderedlist>\n')
+
+ def example(self, doc, level, output):
+ i=0
+ for c in doc.getChildNodes():
+ if i==0:
+ output('<programlisting>\n<![CDATA[\n')
+ ##
+ ## eek. A ']]>' in your body will break this...
+ ##
+ output(prestrip(c.getNodeValue()))
+ output('\n]]></programlisting>\n')
+ else:
+ getattr(self, self.element_types[c.getNodeName()])(
+ c, level, output)
+
+ def paragraph(self, doc, level, output):
+
+ output('<para>\n\n')
+ for c in doc.getChildNodes():
+ getattr(self, self.element_types[c.getNodeName()])(
+ c, level, output)
+ output('</para>\n\n')
+
+ def link(self, doc, level, output):
+# output('<link linkend="%s">' % doc.href)
+ for c in doc.getChildNodes():
+ getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+# output('</link>')
+
+ def emphasis(self, doc, level, output):
+ output('<emphasis>')
+ for c in doc.getChildNodes():
+ getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+ output('</emphasis> ')
+
+ def literal(self, doc, level, output):
+ output('<literal>')
+ for c in doc.getChildNodes():
+ output(c.getNodeValue())
+ output('</literal>')
+
+ def strong(self, doc, level, output):
+ output('<emphasis>')
+ for c in doc.getChildNodes():
+ getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+ output('</emphasis>')
+
+ def xref(self, doc, level, output):
+ output('<xref linkend="%s">' % doc.getNodeValue())
+
+def prestrip(v):
+ v=string.replace(v, '\r\n', '\n')
+ v=string.replace(v, '\r', '\n')
+ v=string.replace(v, '\t', ' ')
+ lines=string.split(v, '\n')
+ indent=len(lines[0])
+ for line in lines:
+ if not len(line): continue
+ i=len(line)-len(string.lstrip(line))
+ if i < indent:
+ indent=i
+ nlines=[]
+ for line in lines:
+ nlines.append(line[indent:])
+ return string.join(nlines, '\r\n')
+
+
+class DocBookChapter(DocBookClass):
+
+ def document(self, doc, level, output):
+ output('<chapter>\n')
+ children=doc.getChildNodes()
+ if (children and
+ children[0].getNodeName() == 'StructuredTextSection'):
+ output('<title>%s</title>' % children[0].getChildNodes()[0].getNodeValue())
+ for c in children[0].getChildNodes()[1:]:
+ getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+ output('</chapter>\n')
+
+ets = DocBookClass.element_types
+ets.update({'StructuredTextImage': 'image'})
+
+class DocBookChapterWithFigures(DocBookChapter):
+
+ element_types = ets
+
+ def image(self, doc, level, output):
+ if hasattr(doc, 'key'):
+ output('<figure id="%s"><title>%s</title>\n' % (doc.key, doc.getNodeValue()) )
+ else:
+ output('<figure><title>%s</title>\n' % doc.getNodeValue())
+## for c in doc.getChildNodes():
+## getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+ output('<graphic fileref="%s"></graphic>\n</figure>\n' % doc.href)
+
+class DocBookArticle(DocBookClass):
+
+ def document(self, doc, level, output):
+ output('<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V3.1//EN">\n')
+ output('<article>\n')
+ children=doc.getChildNodes()
+ if (children and
+ children[0].getNodeName() == 'StructuredTextSection'):
+ output('<artheader>\n<title>%s</title>\n</artheader>\n' %
+ children[0].getChildNodes()[0].getNodeValue())
+ for c in children:
+ getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+ output('</article>\n')
+
+
+class DocBookBook:
+
+ def __init__(self, title=''):
+ self.title = title
+ self.chapters = []
+
+ def addChapter(self, chapter):
+ self.chapters.append(chapter)
+
+ def read(self):
+ out = '<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook V3.1//EN">\n<book>\n'
+ out = out + '<title>%s</title>\n' % self.title
+ for chapter in self.chapters:
+ out = out + chapter + '\n</book>\n'
+
+ return out
+
+ def __str__(self):
+ return self.read()
+
+
--- /dev/null
+##############################################################################
+#
+# Zope Public License (ZPL) Version 1.0
+# -------------------------------------
+#
+# Copyright (c) Digital Creations. All rights reserved.
+#
+# This license has been certified as Open Source(tm).
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# 1. Redistributions in source code must retain the above copyright
+# notice, this list of conditions, and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions, and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+#
+# 3. Digital Creations requests that attribution be given to Zope
+# in any manner possible. Zope includes a "Powered by Zope"
+# button that is installed by default. While it is not a license
+# violation to remove this button, it is requested that the
+# attribution remain. A significant investment has been put
+# into Zope, and this effort will continue if the Zope community
+# continues to grow. This is one way to assure that growth.
+#
+# 4. All advertising materials and documentation mentioning
+# features derived from or use of this software must display
+# the following acknowledgement:
+#
+# "This product includes software developed by Digital Creations
+# for use in the Z Object Publishing Environment
+# (http://www.zope.org/)."
+#
+# In the event that the product being advertised includes an
+# intact Zope distribution (with copyright and license included)
+# then this clause is waived.
+#
+# 5. Names associated with Zope or Digital Creations must not be used to
+# endorse or promote products derived from this software without
+# prior written permission from Digital Creations.
+#
+# 6. Modified redistributions of any form whatsoever must retain
+# the following acknowledgment:
+#
+# "This product includes software developed by Digital Creations
+# for use in the Z Object Publishing Environment
+# (http://www.zope.org/)."
+#
+# Intact (re-)distributions of any official Zope release do not
+# require an external acknowledgement.
+#
+# 7. Modifications are encouraged but must be packaged separately as
+# patches to official Zope releases. Distributions that do not
+# clearly separate the patches from the original work must be clearly
+# labeled as unofficial distributions. Modifications which do not
+# carry the name Zope may be packaged in any form, as long as they
+# conform to all of the clauses above.
+#
+#
+# Disclaimer
+#
+# THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY
+# EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIGITAL CREATIONS OR ITS
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+#
+# This software consists of contributions made by Digital Creations and
+# many individuals on behalf of Digital Creations. Specific
+# attributions are listed in the accompanying credits file.
+#
+##############################################################################
+
+import re, ST, STDOM
+from string import split, join, replace, expandtabs, strip, find, rstrip
+
+StringType=type('')
+ListType=type([])
+
+class StructuredTextExample(ST.StructuredTextParagraph):
+ """Represents a section of document with literal text, as for examples"""
+
+ def __init__(self, subs, **kw):
+ t=[]; a=t.append
+ for s in subs: a(s.getNodeValue())
+ apply(ST.StructuredTextParagraph.__init__,
+ (self, join(t,'\n\n'), ()),
+ kw)
+
+ def getColorizableTexts(self): return ()
+ def setColorizableTexts(self, src): pass # never color examples
+
+class StructuredTextBullet(ST.StructuredTextParagraph):
+ """Represents a section of a document with a title and a body"""
+
+class StructuredTextNumbered(ST.StructuredTextParagraph):
+ """Represents a section of a document with a title and a body"""
+
+class StructuredTextDescriptionTitle(ST.StructuredTextParagraph):
+ """Represents a section of a document with a title and a body"""
+
+class StructuredTextDescriptionBody(ST.StructuredTextParagraph):
+ """Represents a section of a document with a title and a body"""
+
+class StructuredTextDescription(ST.StructuredTextParagraph):
+ """Represents a section of a document with a title and a body"""
+
+ def __init__(self, title, src, subs, **kw):
+ apply(ST.StructuredTextParagraph.__init__, (self, src, subs), kw)
+ self._title=title
+
+ def getColorizableTexts(self): return self._title, self._src
+ def setColorizableTexts(self, src): self._title, self._src = src
+
+ def getChildren(self):
+ return (StructuredTextDescriptionTitle(self._title),
+ StructuredTextDescriptionBody(self._src, self._subs))
+
+class StructuredTextSectionTitle(ST.StructuredTextParagraph):
+ """Represents a section of a document with a title and a body"""
+
+class StructuredTextSection(ST.StructuredTextParagraph):
+ """Represents a section of a document with a title and a body"""
+ def __init__(self, src, subs=None, **kw):
+ apply(ST.StructuredTextParagraph.__init__,
+ (self, StructuredTextSectionTitle(src), subs),
+ kw)
+
+# a StructuredTextTable holds StructuredTextRows
+class StructuredTextTable(ST.StructuredTextDocument):
+ """
+ rows is a list of lists containing tuples, which
+ represent the columns/cells in each rows.
+ EX
+ rows = [[('row 1:column1',1)],[('row2:column1',1)]]
+ """
+
+ def __init__(self, rows, src, subs, **kw):
+ apply(ST.StructuredTextDocument.__init__,(self,subs),kw)
+ self._rows = []
+ for row in rows:
+ if row:
+ self._rows.append(StructuredTextRow(row,kw))
+
+ def getRows(self):
+ return [self._rows]
+
+ def _getRows(self):
+ return self.getRows()
+
+ def getColumns(self):
+ result = []
+ for row in self._rows:
+ result.append(row.getColumns())
+ return result
+
+ def _getColumns(self):
+ return self.getColumns()
+
+ def setColumns(self,columns):
+ for index in range(len(self._rows)):
+ self._rows[index].setColumns(columns[index])
+
+ def _setColumns(self,columns):
+ return self.setColumns(columns)
+
+ def getColorizableTexts(self):
+ """
+ return a tuple where each item is a column/cell's
+ contents. The tuple, result, will be of this format.
+ ("r1 col1", "r1=col2", "r2 col1", "r2 col2")
+ """
+
+ result = []
+ for row in self._rows:
+ for column in row.getColumns()[0]:
+ result.append(column.getColorizableTexts()[0])
+ return result
+
+ def setColorizableTexts(self,texts):
+ """
+ texts is going to a tuple where each item is the
+ result of being mapped to the colortext function.
+ Need to insert the results appropriately into the
+ individual columns/cells
+ """
+ for row_index in range(len(self._rows)):
+ for column_index in range(len(self._rows[row_index]._columns)):
+ self._rows[row_index]._columns[column_index].setColorizableTexts((texts[0],))
+ texts = texts[1:]
+
+ def _getColorizableTexts(self):
+ return self.getColorizableTexts()
+
+ def _setColorizableTexts(self):
+ return self.setColorizableTexts()
+
+# StructuredTextRow holds StructuredTextColumns
+class StructuredTextRow(ST.StructuredTextDocument):
+
+ def __init__(self,row,kw):
+ """
+ row is a list of tuples, where each tuple is
+ the raw text for a cell/column and the span
+ of that cell/column".
+ EX
+ [('this is column one',1), ('this is column two',1)]
+ """
+
+ apply(ST.StructuredTextDocument.__init__,(self,[]),kw)
+ self._columns = []
+ for column in row:
+ self._columns.append(StructuredTextColumn(column[0],column[1],kw))
+
+ def getColumns(self):
+ return [self._columns]
+
+ def _getColumns(self):
+ return [self._columns]
+
+ def setColumns(self,columns):
+ self._columns = columns
+
+ def _setColumns(self,columns):
+ return self.setColumns(columns)
+
+# this holds the text of a table cell
+class StructuredTextColumn(ST.StructuredTextParagraph):
+ """
+ StructuredTextColumn is a cell/column in a table.
+ A cell can hold multiple paragraphs. The cell
+ is either classified as a StructuredTextTableHeader
+ or StructuredTextTableData.
+ """
+
+ def __init__(self,text,span,kw):
+ # print "StructuredTextColumn", text, span
+ apply(ST.StructuredTextParagraph.__init__,(self,text,[]),kw)
+ self._span = span
+
+ def getSpan(self):
+ return self._span
+
+ def _getSpan(self):
+ return self._span
+
+class StructuredTextTableHeader(ST.StructuredTextDocument): pass
+
+class StructuredTextTableData(ST.StructuredTextDocument): pass
+
+class StructuredTextMarkup(STDOM.Element):
+
+ def __init__(self, v, **kw):
+ self._value=v
+ self._attributes=kw.keys()
+ for k, v in kw.items(): setattr(self, k, v)
+
+ def getChildren(self, type=type, lt=type([])):
+ v=self._value
+ if type(v) is not lt: v=[v]
+ return v
+
+ def getColorizableTexts(self): return self._value,
+ def setColorizableTexts(self, v): self._value=v[0]
+
+ def __repr__(self):
+ return '%s(%s)' % (self.__class__.__name__, `self._value`)
+
+class StructuredTextLiteral(StructuredTextMarkup):
+ def getColorizableTexts(self): return ()
+ def setColorizableTexts(self, v): pass
+
+class StructuredTextEmphasis(StructuredTextMarkup): pass
+
+class StructuredTextStrong(StructuredTextMarkup): pass
+
+class StructuredTextInnerLink(StructuredTextMarkup): pass
+
+class StructuredTextNamedLink(StructuredTextMarkup): pass
+
+class StructuredTextUnderline(StructuredTextMarkup): pass
+
+class StructuredTextSGML(StructuredTextMarkup): pass
+
+class StructuredTextLink(StructuredTextMarkup): pass
+
+class DocumentClass:
+ """
+ Class instance calls [ex.=> x()] require a structured text
+ structure. Doc will then parse each paragraph in the structure
+ and will find the special structures within each paragraph.
+ Each special structure will be stored as an instance. Special
+ structures within another special structure are stored within
+ the 'top' structure
+ EX : '-underline this-' => would be turned into an underline
+ instance. '-underline **this**' would be stored as an underline
+ instance with a strong instance stored in its string
+ """
+
+ #'doc_table',
+ paragraph_types = [
+ 'doc_bullet',
+ 'doc_numbered',
+ 'doc_description',
+ 'doc_header',
+ 'doc_table',
+ ]
+
+ #'doc_inner_link',
+ #'doc_named_link',
+ #'doc_underline',
+ text_types = [
+ 'doc_href',
+ 'doc_strong',
+ 'doc_emphasize',
+ 'doc_literal',
+ 'doc_sgml'
+ ]
+
+ def __call__(self, doc):
+ if type(doc) is type(''):
+ doc=ST.StructuredText(doc)
+ doc.setSubparagraphs(self.color_paragraphs(
+ doc.getSubparagraphs()))
+ else:
+ doc=ST.StructuredTextDocument(self.color_paragraphs(
+ doc.getSubparagraphs()))
+ return doc
+
+ def parse(self, raw_string, text_type,
+ type=type, st=type(''), lt=type([])):
+
+ """
+ Parse accepts a raw_string, an expr to test the raw_string,
+ and the raw_string's subparagraphs.
+
+ Parse will continue to search through raw_string until
+ all instances of expr in raw_string are found.
+
+ If no instances of expr are found, raw_string is returned.
+ Otherwise a list of substrings and instances is returned
+ """
+
+ tmp = [] # the list to be returned if raw_string is split
+ append=tmp.append
+
+ if type(text_type) is st: text_type=getattr(self, text_type)
+
+ while 1:
+ t = text_type(raw_string)
+ if not t: break
+ #an instance of expr was found
+ t, start, end = t
+
+ if start: append(raw_string[0:start])
+
+ tt=type(t)
+ if tt is st:
+ # if we get a string back, add it to text to be parsed
+ raw_string = t+raw_string[end:len(raw_string)]
+ else:
+ if tt is lt:
+ # is we get a list, append it's elements
+ tmp[len(tmp):]=t
+ else:
+ # normal case, an object
+ append(t)
+ raw_string = raw_string[end:len(raw_string)]
+
+ if not tmp: return raw_string # nothing found
+
+ if raw_string: append(raw_string)
+ elif len(tmp)==1: return tmp[0]
+
+ return tmp
+
+
+ def color_text(self, str, types=None):
+ """Search the paragraph for each special structure
+ """
+ if types is None: types=self.text_types
+
+ for text_type in types:
+
+ if type(str) is StringType:
+ str = self.parse(str, text_type)
+ elif type(str) is ListType:
+ r=[]; a=r.append
+ for s in str:
+ if type(s) is StringType:
+ s=self.parse(s, text_type)
+ if type(s) is ListType: r[len(r):]=s
+ else: a(s)
+ else:
+ s.setColorizableTexts(
+ map(self.color_text,
+ s.getColorizableTexts()
+ ))
+ a(s)
+ str=r
+ else:
+ r=[]; a=r.append; color=self.color_text
+ for s in str.getColorizableTexts():
+ color(s, (text_type,))
+ a(s)
+
+ str.setColorizableTexts(r)
+
+ return str
+
+ def color_paragraphs(self, raw_paragraphs,
+ type=type, sequence_types=(type([]), type(())),
+ st=type('')):
+ result=[]
+ for paragraph in raw_paragraphs:
+ #print type(paragraph)
+ if paragraph.getNodeName() != 'StructuredTextParagraph':
+ result.append(paragraph)
+ continue
+
+ for pt in self.paragraph_types:
+ if type(pt) is st:
+ # grab the corresponding function
+ pt=getattr(self, pt)
+ # evaluate the paragraph
+ r=pt(paragraph)
+ if r:
+ if type(r) not in sequence_types:
+ r=r,
+ new_paragraphs=r
+ for paragraph in new_paragraphs:
+ paragraph.setSubparagraphs(self.color_paragraphs(paragraph.getSubparagraphs()))
+ break
+ else:
+ new_paragraphs=ST.StructuredTextParagraph(paragraph.getColorizableTexts()[0],
+ self.color_paragraphs(paragraph.getSubparagraphs()),
+ indent=paragraph.indent),
+
+ # color the inline StructuredText types
+ # for each StructuredTextParagraph
+ for paragraph in new_paragraphs:
+
+ if paragraph.getNodeName() is "StructuredTextTable":
+ #print "we have a table"
+ cells = paragraph.getColumns()
+ text = paragraph.getColorizableTexts()
+ text = map(ST.StructuredText,text)
+ text = map(self.__call__,text)
+ #for index in range(len(text)):
+ # text[index].setColorizableTexts(map(self.color_text,text[index].getColorizableTexts()))
+ paragraph.setColorizableTexts(text)
+
+ paragraph.setColorizableTexts(
+ map(self.color_text,
+ paragraph.getColorizableTexts()
+ ))
+ result.append(paragraph)
+
+ return result
+
+ def doc_table(self, paragraph, expr = re.compile('\s*\|[-]+\|').match):
+ text = paragraph.getColorizableTexts()[0]
+ m = expr(text)
+
+ subs = paragraph.getSubparagraphs()
+
+ if not (m):
+ return None
+ rows = []
+
+ rows = split(text,'\n')
+
+ spans = []
+ ROWS = []
+ COLS = []
+
+ TDdivider = re.compile("[\-]+").match
+ THdivider = re.compile("[\=]+").match
+
+ # find where the column markers are located
+ col = re.compile('\|').search
+ text = strip(text)
+ rows = split(text,'\n')
+ for row in range(len(rows)):
+ rows[row] = strip(rows[row])
+
+ for row in rows:
+ tmp = strip(row)
+ tmp = row[1:len(tmp)-1] # remove leading and trailing |
+ offset = 0
+ if col(tmp):
+ while col(tmp):
+ start,end = col(tmp).span()
+ if not start+offset in spans:
+ spans.append(start + offset)
+ COLS.append((tmp[0:start],start+offset))
+ tmp = " " + tmp[end:]
+ offset = offset + (start)
+ if not offset+len(tmp) in spans:
+ spans.append(offset+len(tmp))
+ COLS.append((tmp,offset+len(tmp)))
+ ROWS.append(COLS)
+ COLS = []
+
+ spans.sort()
+
+ ROWS = ROWS[1:len(ROWS)]
+
+ # find each column span
+ cols = []
+ tmp = []
+
+ for row in ROWS:
+ for c in row:
+ tmp.append(c[1])
+ cols.append(tmp)
+ tmp = []
+
+ cur = 1 # the current column span
+ tmp = []
+ C = [] # holds the span of each cell
+ for col in cols:
+ for span in spans:
+ if not span in col:
+ cur = cur + 1
+ else:
+ tmp.append(cur)
+ cur = 1
+ C.append(tmp)
+ tmp = []
+
+ # make rows contain the cell's text and the span
+ # of that cell
+ for index in range(len(C)):
+ for i in range(len(C[index])):
+ ROWS[index][i] = (ROWS[index][i][0],C[index][i])
+ rows = ROWS
+
+ # now munge the table cells together
+ ROWS = []
+ COLS = []
+ for row in rows:
+ for index in range(len(row)):
+ if not COLS:
+ COLS = range(len(row))
+ for i in range(len(COLS)):
+ COLS[i] = ["",1]
+ if TDdivider(row[index][0]) or THdivider(row[index][0]):
+ ROWS.append(COLS)
+ COLS = []
+ else:
+ COLS[index][0] = COLS[index][0] + rstrip(row[index][0]) + "\n"
+ COLS[index][1] = row[index][1]
+ return StructuredTextTable(ROWS,text,subs,indent=paragraph.indent)
+
+ def doc_bullet(self, paragraph, expr = re.compile('\s*[-*o]\s+').match):
+ top=paragraph.getColorizableTexts()[0]
+ m=expr(top)
+
+ if not m:
+ return None
+
+ subs=paragraph.getSubparagraphs()
+ if top[-2:]=='::':
+ subs=[StructuredTextExample(subs)]
+ top=top[:-1]
+ return StructuredTextBullet(top[m.span()[1]:], subs,
+ indent=paragraph.indent,
+ bullet=top[:m.span()[1]]
+ )
+
+ def doc_numbered(
+ self, paragraph,
+ expr = re.compile('(\s*[a-zA-Z]+\.)|(\s*[0-9]+\.)|(\s*[0-9]+\s+)').match):
+
+ # This is the old expression. It had a nasty habit
+ # of grabbing paragraphs that began with a single
+ # letter word even if there was no following period.
+
+ #expr = re.compile('\s*'
+ # '(([a-zA-Z]|[0-9]+|[ivxlcdmIVXLCDM]+)\.)*'
+ # '([a-zA-Z]|[0-9]+|[ivxlcdmIVXLCDM]+)\.?'
+ # '\s+').match):
+
+ top=paragraph.getColorizableTexts()[0]
+ m=expr(top)
+ if not m: return None
+ subs=paragraph.getSubparagraphs()
+ if top[-2:]=='::':
+ subs=[StructuredTextExample(subs)]
+ top=top[:-1]
+ return StructuredTextNumbered(top[m.span()[1]:], subs,
+ indent=paragraph.indent,
+ number=top[:m.span()[1]])
+
+ def doc_description(
+ self, paragraph,
+ delim = re.compile('\s+--\s+').search,
+ nb=re.compile(r'[^\0- ]').search,
+ ):
+
+ top=paragraph.getColorizableTexts()[0]
+ d=delim(top)
+ if not d: return None
+ start, end = d.span()
+ title=top[:start]
+ if find(title, '\n') >= 0: return None
+ if not nb(title): return None
+ d=top[start:end]
+ top=top[end:]
+
+ subs=paragraph.getSubparagraphs()
+ if top[-2:]=='::':
+ subs=[StructuredTextExample(subs)]
+ top=top[:-1]
+
+ return StructuredTextDescription(
+ title, top, subs,
+ indent=paragraph.indent,
+ delim=d)
+
+ def doc_header(self, paragraph,
+ expr = re.compile('[ a-zA-Z0-9.:/,-_*<>\?\'\"]+').match
+ ):
+ subs=paragraph.getSubparagraphs()
+ if not subs: return None
+ top=paragraph.getColorizableTexts()[0]
+ if not strip(top): return None
+ if top[-2:]=='::':
+ subs=StructuredTextExample(subs)
+ if strip(top)=='::': return subs
+ return ST.StructuredTextParagraph(
+ top[:-1], [subs], indent=paragraph.indent)
+
+ if find(top,'\n') >= 0: return None
+ return StructuredTextSection(top, subs, indent=paragraph.indent)
+
+ def doc_literal(
+ self, s,
+ expr=re.compile(
+ "(?:\s|^)'" # open
+ "([^ \t\n\r\f\v']|[^ \t\n\r\f\v'][^\n']*[^ \t\n\r\f\v'])" # contents
+ "'(?:\s|[,.;:!?]|$)" # close
+ ).search):
+
+ r=expr(s)
+ if r:
+ start, end = r.span(1)
+ return (StructuredTextLiteral(s[start:end]), start-1, end+1)
+ else:
+ return None
+
+ def doc_emphasize(
+ self, s,
+ expr = re.compile('\s*\*([ \na-zA-Z0-9.:/;,\'\"\?]+)\*(?!\*|-)').search
+ ):
+
+ r=expr(s)
+ if r:
+ start, end = r.span(1)
+ return (StructuredTextEmphasis(s[start:end]), start-1, end+1)
+ else:
+ return None
+
+ def doc_inner_link(self,
+ s,
+ expr1 = re.compile("\.\.\s*").search,
+ expr2 = re.compile("\[[a-zA-Z0-9]+\]").search):
+
+ # make sure we dont grab a named link
+ if expr2(s) and expr1(s):
+ start1,end1 = expr1(s).span()
+ start2,end2 = expr2(s).span()
+ if end1 == start2:
+ # uh-oh, looks like a named link
+ return None
+ else:
+ # the .. is somewhere else, ignore it
+ return (StructuredTextInnerLink(s[start2+1,end2-1],start2,end2))
+ return None
+ elif expr2(s) and not expr1(s):
+ start,end = expr2(s).span()
+ return (StructuredTextInnerLink(s[start+1:end-1]),start,end)
+ return None
+
+ def doc_named_link(self,
+ s,
+ expr=re.compile("(\.\.\s)(\[[a-zA-Z0-9]+\])").search):
+
+ result = expr(s)
+ if result:
+ start,end = result.span(2)
+ a,b = result.span(1)
+ str = strip(s[a:b]) + s[start:end]
+ st,en = result.span()
+ return (StructuredTextNamedLink(str),st,en)
+ #return (StructuredTextNamedLink(s[st:en]),st,en)
+ return None
+
+ def doc_underline(self,
+ s,
+ expr=re.compile("\_([a-zA-Z0-9\s\.,\?]+)\_").search):
+
+ result = expr(s)
+ if result:
+ start,end = result.span(1)
+ st,e = result.span()
+ return (StructuredTextUnderline(s[start:end]),st,e)
+ else:
+ return None
+
+ def doc_strong(self,
+ s,
+ expr = re.compile('\s*\*\*([ \na-zA-Z0-9.:/;\-,!\?\'\"]+)\*\*').search
+ ):
+
+ r=expr(s)
+ if r:
+ start, end = r.span(1)
+ return (StructuredTextStrong(s[start:end]), start-2, end+2)
+ else:
+ return None
+
+ def doc_href(
+
+ self, s,
+ expr1 = re.compile("(\"[ a-zA-Z0-9\n\-\.\,\;\(\)\/\:\/]+\")(:)([a-zA-Z0-9\:\/\.\~\-]+)([,]*\s*)").search,
+ expr2 = re.compile('(\"[ a-zA-Z0-9\n\-\.\:\;\(\)\/]+\")([,]+\s+)([a-zA-Z0-9\@\.\,\?\!\/\:\;\-\#]+)(\s*)').search):
+
+ punctuation = re.compile("[\,\.\?\!\;]+").match
+ r=expr1(s) or expr2(s)
+
+ if r:
+ # need to grab the href part and the
+ # beginning part
+
+ start,e = r.span(1)
+ name = s[start:e]
+ name = replace(name,'"','',2)
+ #start = start + 1
+ st,end = r.span(3)
+ if punctuation(s[end-1:end]):
+ end = end -1
+ link = s[st:end]
+ #end = end - 1
+
+ # name is the href title, link is the target
+ # of the href
+ return (StructuredTextLink(name, href=link),
+ start, end)
+
+ #return (StructuredTextLink(s[start:end], href=s[start:end]),
+ # start, end)
+ else:
+ return None
+
+ def doc_sgml(self,s,expr=re.compile("\<[a-zA-Z0-9\.\=\'\"\:\/\-\#\+\s]+\>").search):
+ """
+ SGML text is ignored and outputed as-is
+ """
+ r = expr(s)
+ if r:
+ start,end = r.span()
+ text = s[start:end]
+ return (StructuredTextSGML(text),start,end)
--- /dev/null
+##############################################################################
+#
+# Zope Public License (ZPL) Version 1.0
+# -------------------------------------
+#
+# Copyright (c) Digital Creations. All rights reserved.
+#
+# This license has been certified as Open Source(tm).
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# 1. Redistributions in source code must retain the above copyright
+# notice, this list of conditions, and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions, and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+#
+# 3. Digital Creations requests that attribution be given to Zope
+# in any manner possible. Zope includes a "Powered by Zope"
+# button that is installed by default. While it is not a license
+# violation to remove this button, it is requested that the
+# attribution remain. A significant investment has been put
+# into Zope, and this effort will continue if the Zope community
+# continues to grow. This is one way to assure that growth.
+#
+# 4. All advertising materials and documentation mentioning
+# features derived from or use of this software must display
+# the following acknowledgement:
+#
+# "This product includes software developed by Digital Creations
+# for use in the Z Object Publishing Environment
+# (http://www.zope.org/)."
+#
+# In the event that the product being advertised includes an
+# intact Zope distribution (with copyright and license included)
+# then this clause is waived.
+#
+# 5. Names associated with Zope or Digital Creations must not be used to
+# endorse or promote products derived from this software without
+# prior written permission from Digital Creations.
+#
+# 6. Modified redistributions of any form whatsoever must retain
+# the following acknowledgment:
+#
+# "This product includes software developed by Digital Creations
+# for use in the Z Object Publishing Environment
+# (http://www.zope.org/)."
+#
+# Intact (re-)distributions of any official Zope release do not
+# require an external acknowledgement.
+#
+# 7. Modifications are encouraged but must be packaged separately as
+# patches to official Zope releases. Distributions that do not
+# clearly separate the patches from the original work must be clearly
+# labeled as unofficial distributions. Modifications which do not
+# carry the name Zope may be packaged in any form, as long as they
+# conform to all of the clauses above.
+#
+#
+# Disclaimer
+#
+# THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY
+# EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIGITAL CREATIONS OR ITS
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+#
+# This software consists of contributions made by Digital Creations and
+# many individuals on behalf of Digital Creations. Specific
+# attributions are listed in the accompanying credits file.
+#
+##############################################################################
+
+import re, ST, STDOM
+from string import split, join, replace, expandtabs, strip, find
+
+from DocumentClass import *
+
+class StructuredTextImage(StructuredTextMarkup):
+ "A simple embedded image"
+
+class DocumentWithImages(DocumentClass):
+ """
+
+ """
+
+
+ text_types = [
+ 'doc_img',
+ ] + DocumentClass.text_types
+
+
+ def doc_img(
+ self, s,
+ expr1=re.compile('\"([ _a-zA-Z0-9*.:/;,\-\n\~]+)\":img:([a-zA-Z0-9\-.:/;,\n\~]+)').search,
+ expr2=re.compile('\"([ _a-zA-Z0-9*.:/;,\-\n\~]+)\":img:([a-zA-Z0-9\-.:/;,\n\~]+):([a-zA-Z0-9\-.:/;,\n\~]+)').search
+ ):
+
+
+ r = expr2(s)
+ if r:
+ startt, endt = r.span(1)
+ startk, endk = r.span(2)
+ starth, endh = r.span(3)
+ start, end = r.span()
+ return (StructuredTextImage(s[startt:endt], href=s[starth:endh], key=s[startk:endk]),
+ start, end)
+
+
+ else:
+
+ r=expr1(s)
+
+ if r:
+ startt, endt = r.span(1)
+ starth, endh = r.span(2)
+ start, end = r.span()
+ return (StructuredTextImage(s[startt:endt], href=s[starth:endh]),
+ start, end)
+
+ return None
+
--- /dev/null
+##############################################################################
+#
+# Zope Public License (ZPL) Version 1.0
+# -------------------------------------
+#
+# Copyright (c) Digital Creations. All rights reserved.
+#
+# This license has been certified as Open Source(tm).
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# 1. Redistributions in source code must retain the above copyright
+# notice, this list of conditions, and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions, and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+#
+# 3. Digital Creations requests that attribution be given to Zope
+# in any manner possible. Zope includes a "Powered by Zope"
+# button that is installed by default. While it is not a license
+# violation to remove this button, it is requested that the
+# attribution remain. A significant investment has been put
+# into Zope, and this effort will continue if the Zope community
+# continues to grow. This is one way to assure that growth.
+#
+# 4. All advertising materials and documentation mentioning
+# features derived from or use of this software must display
+# the following acknowledgement:
+#
+# "This product includes software developed by Digital Creations
+# for use in the Z Object Publishing Environment
+# (http://www.zope.org/)."
+#
+# In the event that the product being advertised includes an
+# intact Zope distribution (with copyright and license included)
+# then this clause is waived.
+#
+# 5. Names associated with Zope or Digital Creations must not be used to
+# endorse or promote products derived from this software without
+# prior written permission from Digital Creations.
+#
+# 6. Modified redistributions of any form whatsoever must retain
+# the following acknowledgment:
+#
+# "This product includes software developed by Digital Creations
+# for use in the Z Object Publishing Environment
+# (http://www.zope.org/)."
+#
+# Intact (re-)distributions of any official Zope release do not
+# require an external acknowledgement.
+#
+# 7. Modifications are encouraged but must be packaged separately as
+# patches to official Zope releases. Distributions that do not
+# clearly separate the patches from the original work must be clearly
+# labeled as unofficial distributions. Modifications which do not
+# carry the name Zope may be packaged in any form, as long as they
+# conform to all of the clauses above.
+#
+#
+# Disclaimer
+#
+# THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY
+# EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIGITAL CREATIONS OR ITS
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+#
+# This software consists of contributions made by Digital Creations and
+# many individuals on behalf of Digital Creations. Specific
+# attributions are listed in the accompanying credits file.
+#
+##############################################################################
+
+from string import join, split, find
+import re, sys, ST
+
+class HTMLClass:
+
+ element_types={
+ '#text': '_text',
+ 'StructuredTextDocument': 'document',
+ 'StructuredTextParagraph': 'paragraph',
+ 'StructuredTextExample': 'example',
+ 'StructuredTextBullet': 'bullet',
+ 'StructuredTextNumbered': 'numbered',
+ 'StructuredTextDescription': 'description',
+ 'StructuredTextDescriptionTitle': 'descriptionTitle',
+ 'StructuredTextDescriptionBody': 'descriptionBody',
+ 'StructuredTextSection': 'section',
+ 'StructuredTextSectionTitle': 'sectionTitle',
+ 'StructuredTextLiteral': 'literal',
+ 'StructuredTextEmphasis': 'emphasis',
+ 'StructuredTextStrong': 'strong',
+ 'StructuredTextLink': 'link',
+ 'StructuredTextXref': 'xref',
+ 'StructuredTextInnerLink':'innerLink',
+ 'StructuredTextNamedLink':'namedLink',
+ 'StructuredTextUnderline':'underline',
+ 'StructuredTextTable':'table',
+ 'StructuredTextSGML':'sgml',
+ }
+
+ def dispatch(self, doc, level, output):
+ getattr(self, self.element_types[doc.getNodeName()])(doc, level, output)
+
+ def __call__(self, doc, level=1):
+ r=[]
+ self.dispatch(doc, level-1, r.append)
+ return join(r,'')
+
+ def _text(self, doc, level, output):
+ output(doc.getNodeValue())
+
+ def document(self, doc, level, output):
+ output('<html>\n')
+ children=doc.getChildNodes()
+ if (children and
+ children[0].getNodeName() == 'StructuredTextSection'):
+ output('<head>\n<title>%s</title>\n</head>\n' %
+ children[0].getChildNodes()[0].getNodeValue())
+ output('<body>\n')
+ for c in children:
+ getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+ output('</body>\n')
+ output('</html>\n')
+
+ def section(self, doc, level, output):
+ children=doc.getChildNodes()
+ for c in children:
+ getattr(self, self.element_types[c.getNodeName()])(c, level+1, output)
+
+ def sectionTitle(self, doc, level, output):
+ output('<h%d>' % (level))
+ for c in doc.getChildNodes():
+ getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+ output('</h%d>\n' % (level))
+
+ def description(self, doc, level, output):
+ p=doc.getPreviousSibling()
+ if p is None or p.getNodeName() is not doc.getNodeName():
+ output('<dl>\n')
+ for c in doc.getChildNodes():
+ getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+ n=doc.getNextSibling()
+ if n is None or n.getNodeName() is not doc.getNodeName():
+ output('</dl>\n')
+
+ def descriptionTitle(self, doc, level, output):
+ output('<dt>')
+ for c in doc.getChildNodes():
+ getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+ output('</dt>\n')
+
+ def descriptionBody(self, doc, level, output):
+ output('<dd>')
+ for c in doc.getChildNodes():
+ getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+ output('</dd>\n')
+
+ def bullet(self, doc, level, output):
+ p=doc.getPreviousSibling()
+ if p is None or p.getNodeName() is not doc.getNodeName():
+ output('<ul>\n')
+ output('<li>')
+ for c in doc.getChildNodes():
+ getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+ n=doc.getNextSibling()
+ output('</li>\n')
+ if n is None or n.getNodeName() is not doc.getNodeName():
+ output('</ul>\n')
+
+ def numbered(self, doc, level, output):
+ p=doc.getPreviousSibling()
+ if p is None or p.getNodeName() is not doc.getNodeName():
+ output('<ol>\n')
+ output('<li>')
+ for c in doc.getChildNodes():
+ getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+ n=doc.getNextSibling()
+ output('</li>\n')
+ if n is None or n.getNodeName() is not doc.getNodeName():
+ output('</ol>\n')
+
+ def example(self, doc, level, output):
+ i=0
+ for c in doc.getChildNodes():
+ if i==0:
+ output('<pre>')
+ output(html_quote(c.getNodeValue()))
+ output('</pre>\n')
+ else:
+ getattr(self, self.element_types[c.getNodeName()])(
+ c, level, output)
+
+ def paragraph(self, doc, level, output):
+ i=0
+ output('<p>')
+ for c in doc.getChildNodes():
+ if c.getNodeName() in ['StructuredTextParagraph']:
+ getattr(self, self.element_types[c.getNodeName()])(
+ c, level, output)
+ else:
+ getattr(self, self.element_types[c.getNodeName()])(
+ c, level, output)
+ output('</p>')
+
+ def link(self, doc, level, output):
+ output('<a href="%s">' % doc.href)
+ for c in doc.getChildNodes():
+ getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+ output('</a>')
+
+ def emphasis(self, doc, level, output):
+ output('<em>')
+ for c in doc.getChildNodes():
+ getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+ output('</em>')
+
+ def literal(self, doc, level, output):
+ output('<code>')
+ for c in doc.getChildNodes():
+ output(html_quote(c.getNodeValue()))
+ output('</code>')
+
+ def strong(self, doc, level, output):
+ output('<strong>')
+ for c in doc.getChildNodes():
+ getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+ output('</strong>')
+
+ def underline(self, doc, level, output):
+ output("<u>")
+ for c in doc.getChildNodes():
+ getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+ output("</u>")
+
+ def innerLink(self, doc, level, output):
+ output('<a href="#');
+ for c in doc.getChildNodes():
+ getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+ output('">[')
+ for c in doc.getChildNodes():
+ getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+ output(']</a>')
+
+ def namedLink(self, doc, level, output):
+ output('<a name="')
+ for c in doc.getChildNodes():
+ getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+ output('">[')
+ for c in doc.getChildNodes():
+ getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+ output(']</a>')
+
+ def sgml(self,doc,level,output):
+ for c in doc.getChildNodes():
+ getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+
+ def table(self,doc,level,output):
+ """
+ A StructuredTextTable holds StructuredTextRow(s) which
+ holds StructuredTextColumn(s). A StructuredTextColumn
+ is a type of StructuredTextParagraph and thus holds
+ the actual data.
+ """
+ output("<table border=1 cellpadding=2>\n")
+ for row in doc.getRows()[0]:
+ output("<tr>\n")
+ for column in row.getColumns()[0]:
+ str = "<td colspan=%s>" % column.getSpan()
+ output(str)
+ #for c in doc.getChildNodes():
+ # getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+ for c in column.getChildNodes():
+ getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+ output("</td>\n")
+ output("</tr>\n")
+ output("</table>\n")
+
+def html_quote(v, name='(Unknown name)', md={},
+ character_entities=(
+ (('&'), '&'),
+ (('<'), '<' ),
+ (('>'), '>' ),
+ (('\213'), '<' ),
+ (('\233'), '>' ),
+ (('"'), '"'))): #"
+ text=str(v)
+ for re,name in character_entities:
+ if find(text, re) >= 0: text=join(split(text,re),name)
+ return text
+
+
+
+
+
--- /dev/null
+##############################################################################
+#
+# Zope Public License (ZPL) Version 1.0
+# -------------------------------------
+#
+# Copyright (c) Digital Creations. All rights reserved.
+#
+# This license has been certified as Open Source(tm).
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# 1. Redistributions in source code must retain the above copyright
+# notice, this list of conditions, and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions, and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+#
+# 3. Digital Creations requests that attribution be given to Zope
+# in any manner possible. Zope includes a "Powered by Zope"
+# button that is installed by default. While it is not a license
+# violation to remove this button, it is requested that the
+# attribution remain. A significant investment has been put
+# into Zope, and this effort will continue if the Zope community
+# continues to grow. This is one way to assure that growth.
+#
+# 4. All advertising materials and documentation mentioning
+# features derived from or use of this software must display
+# the following acknowledgement:
+#
+# "This product includes software developed by Digital Creations
+# for use in the Z Object Publishing Environment
+# (http://www.zope.org/)."
+#
+# In the event that the product being advertised includes an
+# intact Zope distribution (with copyright and license included)
+# then this clause is waived.
+#
+# 5. Names associated with Zope or Digital Creations must not be used to
+# endorse or promote products derived from this software without
+# prior written permission from Digital Creations.
+#
+# 6. Modified redistributions of any form whatsoever must retain
+# the following acknowledgment:
+#
+# "This product includes software developed by Digital Creations
+# for use in the Z Object Publishing Environment
+# (http://www.zope.org/)."
+#
+# Intact (re-)distributions of any official Zope release do not
+# require an external acknowledgement.
+#
+# 7. Modifications are encouraged but must be packaged separately as
+# patches to official Zope releases. Distributions that do not
+# clearly separate the patches from the original work must be clearly
+# labeled as unofficial distributions. Modifications which do not
+# carry the name Zope may be packaged in any form, as long as they
+# conform to all of the clauses above.
+#
+#
+# Disclaimer
+#
+# THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY
+# EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIGITAL CREATIONS OR ITS
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+#
+# This software consists of contributions made by Digital Creations and
+# many individuals on behalf of Digital Creations. Specific
+# attributions are listed in the accompanying credits file.
+#
+##############################################################################
+
+from string import join, split, find
+import re, sys, ST
+import time
+
+from HTMLClass import HTMLClass
+
+ets = HTMLClass.element_types
+ets.update({'StructuredTextImage': 'image'})
+
+class HTMLWithImages(HTMLClass):
+
+ element_types = ets
+
+ def document(self, doc, level, output):
+ output('<html>\n')
+ children=doc.getChildNodes()
+ if (children and
+ children[0].getNodeName() == 'StructuredTextSection'):
+ output('<head>\n<title>%s</title>\n</head>\n' %
+ children[0].getChildNodes()[0].getNodeValue())
+ output('<body bgcolor="#FFFFFF">\n')
+ for c in children:
+ getattr(self, self.element_types[c.getNodeName()])(c, level, output)
+ output('</body>\n')
+ output('</html>\n')
+
+
+ def image(self, doc, level, output):
+ output('<img src="%s" alt="%s">' % (doc.href, doc.getNodeValue()))
+
+
+ def image(self, doc, level, output):
+ if hasattr(doc, 'key'):
+ output('<a name="%s"></a>\n<img src="%s" alt="%s">' % (doc.key, doc.href, doc.getNodeValue()))
+ else:
+ output('<img src="%s" alt="%s">' % (doc.href, doc.getNodeValue()))
+
+
+ def xref(self, doc, level, output):
+ val = doc.getNodeValue()
+ output('<a href="#%s">%s</a>' % (val, val) )
+
+
+
+
+
+
+
--- /dev/null
+##############################################################################
+#
+# Zope Public License (ZPL) Version 1.0
+# -------------------------------------
+#
+# Copyright (c) Digital Creations. All rights reserved.
+#
+# This license has been certified as Open Source(tm).
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# 1. Redistributions in source code must retain the above copyright
+# notice, this list of conditions, and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions, and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+#
+# 3. Digital Creations requests that attribution be given to Zope
+# in any manner possible. Zope includes a "Powered by Zope"
+# button that is installed by default. While it is not a license
+# violation to remove this button, it is requested that the
+# attribution remain. A significant investment has been put
+# into Zope, and this effort will continue if the Zope community
+# continues to grow. This is one way to assure that growth.
+#
+# 4. All advertising materials and documentation mentioning
+# features derived from or use of this software must display
+# the following acknowledgement:
+#
+# "This product includes software developed by Digital Creations
+# for use in the Z Object Publishing Environment
+# (http://www.zope.org/)."
+#
+# In the event that the product being advertised includes an
+# intact Zope distribution (with copyright and license included)
+# then this clause is waived.
+#
+# 5. Names associated with Zope or Digital Creations must not be used to
+# endorse or promote products derived from this software without
+# prior written permission from Digital Creations.
+#
+# 6. Modified redistributions of any form whatsoever must retain
+# the following acknowledgment:
+#
+# "This product includes software developed by Digital Creations
+# for use in the Z Object Publishing Environment
+# (http://www.zope.org/)."
+#
+# Intact (re-)distributions of any official Zope release do not
+# require an external acknowledgement.
+#
+# 7. Modifications are encouraged but must be packaged separately as
+# patches to official Zope releases. Distributions that do not
+# clearly separate the patches from the original work must be clearly
+# labeled as unofficial distributions. Modifications which do not
+# carry the name Zope may be packaged in any form, as long as they
+# conform to all of the clauses above.
+#
+#
+# Disclaimer
+#
+# THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY
+# EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIGITAL CREATIONS OR ITS
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+#
+# This software consists of contributions made by Digital Creations and
+# many individuals on behalf of Digital Creations. Specific
+# attributions are listed in the accompanying credits file.
+#
+##############################################################################
+'''
+$Id$'''
+
+from StructuredText import * # :-)
+
+def ctag(s):
+ # Blech, wish we could use character tags
+ if s is None: s=''
+ s=gsub(strong,'\\1<bold>\\2<plain>\\3',s)
+ s=gsub(code, '\\1<family Courier>\\2<family Times>\\3',s)
+ s=gsub(em, '\\1<italic>\\2<plain>\\3',s)
+ return join(map(strip,split(s,'\n')),'\n')
+
+class MML(StructuredText):
+
+ '''\
+ An MML structured text formatter.
+ '''\
+
+ def __str__(self,
+ ):
+ '''\
+ Return an HTML string representation of the structured text data.
+
+ '''
+ s=self._str(self.structure,self.level)
+ return s
+
+ def ul(self, before, p, after):
+ return ("%s\n\n<Bulleted>\n%s%s"
+ % (before, ctag(p), after))
+
+ def ol(self, before, p, after):
+ return ("%s\n\n<Numbered>\n%s%s"
+ % (before, ctag(p), after))
+
+ def dl(self, before, t, d, after):
+ return ("%s\n\n<Term>\n%s\n\n<Definition>\n%s%s"
+ % (before,ctag(t),ctag(d),after))
+
+ def head(self, before, t, level, d):
+ return ("%s\n\n<Heading%d>\n%s%s"
+ % (before,level,ctag(t),d))
+
+ def normal(self,before,p,after):
+ return "%s\n\n<Body>\n%s%s" % (before, ctag(p), after)
+
+ def pre(self,structure,r=None):
+ if r is None: r=['']
+ for s in structure:
+ for line in split(s[0],'\n'):
+ r.append('\n<PRE>')
+ r.append(line)
+ self.pre(s[1],r)
+ return join(r,'\n')
+
+ def _str(self,structure,level):
+ r=''
+ for s in structure:
+ # print s[0],'\n', len(s[1]), '\n\n'
+ if bullet.match(s[0]) >= 0:
+ p=bullet.group(1)
+ r=self.ul(r,p,self._str(s[1],level))
+ elif ol.match(s[0]) >= 0:
+ p=ol.group(3)
+ r=self.ol(r,p,self._str(s[1],level))
+ elif olp.match(s[0]) >= 0:
+ p=olp.group(1)
+ r=self.ol(r,p,self._str(s[1],level))
+ elif dl.match(s[0]) >= 0:
+ t,d=dl.group(1,2)
+ r=self.dl(r,t,d,self._str(s[1],level))
+ elif example.search(s[0]) >= 0 and s[1]:
+ # Introduce an example, using pre tags:
+ r=self.normal(r,s[0],self.pre(s[1]))
+ elif s[0][-2:]=='::' and s[1]:
+ # Introduce an example, using pre tags:
+ r=self.normal(r,s[0][:-1],self.pre(s[1]))
+ elif nl.search(s[0]) < 0 and s[1] and s[0][-1:] != ':':
+ # Treat as a heading
+ t=s[0]
+ r=self.head(r,t,level,
+ self._str(s[1],level and level+1))
+ else:
+ r=self.normal(r,s[0],self._str(s[1],level))
+ return r
--- /dev/null
+import re, STDOM
+from string import split, join, replace, expandtabs, strip, find
+
+#####################################################################
+# Updated functions #
+#####################################################################
+
+def indention(str,front = re.compile("^\s+").match):
+ """
+ Convert all tabs to the appropriate number of spaces.
+ Find the number of leading spaces. If none, return 0
+ """
+
+ if front(str):
+ start,end = front(str).span()
+ return end-start-1
+ else:
+ return 0 # no leading spaces
+
+def insert(struct, top, level):
+ """
+ find what will be the parant paragraph of
+ a sentence and return that paragraph's
+ sub-paragraphs. The new paragraph will be
+ appended to those sub-paragraphs
+ """
+ #print "struct", struct, top-1
+ if not top-1 in range(len(struct)):
+ return None
+ run = struct[top-1]
+ i = 0
+ while i+1 < level:
+ run = run.getSubparagraphs()[len(run.getSubparagraphs())-1]
+ i = i + 1
+ #print "parent for level ", level, " was => ", run.getColorizableTexts()
+ return run.getSubparagraphs()
+
+def display(struct):
+ """
+ runs through the structure and prints out
+ the paragraphs. If the insertion works
+ correctly, display's results should mimic
+ the orignal paragraphs.
+ """
+
+ if struct.getColorizableTexts():
+ print join(struct.getColorizableTexts()),"\n"
+ if struct.getSubparagraphs():
+ for x in struct.getSubparagraphs():
+ display(x)
+
+def display2(struct):
+ """
+ runs through the structure and prints out
+ the paragraphs. If the insertion works
+ correctly, display's results should mimic
+ the orignal paragraphs.
+ """
+
+ if struct.getNodeValue():
+ print struct.getNodeValue(),"\n"
+ if struct.getSubparagraphs():
+ for x in struct.getSubparagraphs():
+ display(x)
+
+def findlevel(levels,indent):
+ """
+ remove all level information of levels
+ with a greater level of indentation.
+ Then return which level should insert this
+ paragraph
+ """
+
+ keys = levels.keys()
+ for key in keys:
+ if levels[key] > indent:
+ del(levels[key])
+ keys = levels.keys()
+ if not(keys):
+ return 0
+ else:
+ for key in keys:
+ if levels[key] == indent:
+ return key
+ highest = 0
+ for key in keys:
+ if key > highest:
+ highest = key
+ return highest-1
+
+#####################################################################
+
+# Golly, the capitalization of this function always makes me think it's a class
+def StructuredText(paragraphs, paragraph_delimiter=re.compile('\n\s*\n')):
+ """
+ StructuredText accepts paragraphs, which is a list of
+ lines to be parsed. StructuredText creates a structure
+ which mimics the structure of the paragraphs.
+ Structure => [paragraph,[sub-paragraphs]]
+ """
+
+ currentlevel = 0
+ currentindent = 0
+ levels = {0:0}
+ level = 0 # which header are we under
+ struct = [] # the structure to be returned
+ run = struct
+
+ paragraphs = filter(
+ strip,
+ paragraph_delimiter.split(expandtabs('\n\n'+paragraphs+'\n\n'))
+ )
+
+ if not paragraphs: return []
+
+ ind = [] # structure based on indention levels
+ for paragraph in paragraphs:
+ ind.append([indention(paragraph), paragraph])
+
+ currentindent = indention(paragraphs[0])
+ levels[0] = currentindent
+
+ #############################################################
+ # updated #
+ #############################################################
+
+ for indent,paragraph in ind :
+ if indent == 0:
+ level = level + 1
+ currentlevel = 0
+ currentindent = 0
+ levels = {0:0}
+ struct.append(StructuredTextParagraph(paragraph, indent=indent, level=currentlevel))
+ elif indent > currentindent:
+ currentlevel = currentlevel + 1
+ currentindent = indent
+ levels[currentlevel] = indent
+ run = insert(struct,level,currentlevel)
+ run.append(StructuredTextParagraph(paragraph, indent=indent, level=currentlevel))
+ elif indent < currentindent:
+ result = findlevel(levels,indent)
+ if result > 0:
+ currentlevel = result
+ currentindent = indent
+ run = insert(struct,level,currentlevel)
+ run.append(StructuredTextParagraph(paragraph, indent=indent, level=currentlevel))
+ else:
+ if insert(struct,level,currentlevel):
+ run = insert(struct,level,currentlevel)
+ else:
+ run = struct
+ currentindet = indent
+ run.append(StructuredTextParagraph(paragraph, indent=indent, level=currentlevel))
+
+ return StructuredTextDocument(struct)
+
+Basic = StructuredText
+
+class StructuredTextParagraph(STDOM.Element):
+
+ indent=0
+
+ def __init__(self, src, subs=None, **kw):
+ if subs is None: subs=[]
+ self._src=src
+ self._subs=list(subs)
+
+ self._attributes=kw.keys()
+ for k, v in kw.items(): setattr(self, k, v)
+
+ def getChildren(self, type=type, lt=type([])):
+ src=self._src
+ if type(src) is not lt: src=[src]
+ return src+self._subs
+
+ def getAttribute(self, name):
+ return getattr(self, name, None)
+
+ def getAttributeNode(self, name):
+ if hasattr(self, name):
+ return STDOM.Attr(name, getattr(self, name))
+
+ def getAttributes(self):
+ d={}
+ for a in self._attributes:
+ d[a]=getattr(self, a, '')
+ return STDOM.NamedNodeMap(d)
+
+ def getSubparagraphs(self):
+ return self._subs
+
+ def setSubparagraphs(self, subs):
+ self._subs=subs
+
+ def getColorizableTexts(self):
+ return (self._src,)
+
+ def setColorizableTexts(self, src):
+ self._src=src[0]
+
+ def __repr__(self):
+ r=[]; a=r.append
+ a((' '*(self.indent or 0))+
+ ('%s(' % self.__class__.__name__)
+ +str(self._src)+', ['
+ )
+ for p in self._subs: a(`p`)
+ a((' '*(self.indent or 0))+'])')
+ return join(r,'\n')
+
+ """
+ create aliases for all above functions in the pythony way.
+ """
+
+ def _get_Children(self, type=type, lt=type([])):
+ return self.getChildren(type,lt)
+
+ def _get_Attribute(self, name):
+ return self.getAttribute(name)
+
+ def _get_AttributeNode(self, name):
+ return self.getAttributeNode(name)
+
+ def _get_Attributes(self):
+ return self.getAttributes()
+
+ def _get_Subparagraphs(self):
+ return self.getSubparagraphs()
+
+ def _set_Subparagraphs(self, subs):
+ return self.setSubparagraphs(subs)
+
+ def _get_ColorizableTexts(self):
+ return self.getColorizableTexts()
+
+ def _set_ColorizableTexts(self, src):
+ return self.setColorizableTexts(src)
+
+class StructuredTextDocument(StructuredTextParagraph):
+ """
+ A StructuredTextDocument holds StructuredTextParagraphs
+ as its subparagraphs.
+ """
+ _attributes=()
+
+ def __init__(self, subs=None, **kw):
+ apply(StructuredTextParagraph.__init__,
+ (self, '', subs),
+ kw)
+
+ def getChildren(self):
+ return self._subs
+
+ def getColorizableTexts(self):
+ return ()
+
+ def setColorizableTexts(self, src):
+ pass
+
+ def __repr__(self):
+ r=[]; a=r.append
+ a('%s([' % self.__class__.__name__)
+ for p in self._subs: a(`p`+',')
+ a('])')
+ return join(r,'\n')
+
+ """
+ create aliases for all above functions in the pythony way.
+ """
+
+ def _get_Children(self):
+ return self.getChildren()
+
+ def _get_ColorizableTexts(self):
+ return self.getColorizableTexts()
+
+ def _set_ColorizableTexts(self, src):
+ return self.setColorizableTexts(src)
--- /dev/null
+##############################################################################
+#
+# Zope Public License (ZPL) Version 1.0
+# -------------------------------------
+#
+# Copyright (c) Digital Creations. All rights reserved.
+#
+# This license has been certified as Open Source(tm).
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# 1. Redistributions in source code must retain the above copyright
+# notice, this list of conditions, and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions, and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+#
+# 3. Digital Creations requests that attribution be given to Zope
+# in any manner possible. Zope includes a "Powered by Zope"
+# button that is installed by default. While it is not a license
+# violation to remove this button, it is requested that the
+# attribution remain. A significant investment has been put
+# into Zope, and this effort will continue if the Zope community
+# continues to grow. This is one way to assure that growth.
+#
+# 4. All advertising materials and documentation mentioning
+# features derived from or use of this software must display
+# the following acknowledgement:
+#
+# "This product includes software developed by Digital Creations
+# for use in the Z Object Publishing Environment
+# (http://www.zope.org/)."
+#
+# In the event that the product being advertised includes an
+# intact Zope distribution (with copyright and license included)
+# then this clause is waived.
+#
+# 5. Names associated with Zope or Digital Creations must not be used to
+# endorse or promote products derived from this software without
+# prior written permission from Digital Creations.
+#
+# 6. Modified redistributions of any form whatsoever must retain
+# the following acknowledgment:
+#
+# "This product includes software developed by Digital Creations
+# for use in the Z Object Publishing Environment
+# (http://www.zope.org/)."
+#
+# Intact (re-)distributions of any official Zope release do not
+# require an external acknowledgement.
+#
+# 7. Modifications are encouraged but must be packaged separately as
+# patches to official Zope releases. Distributions that do not
+# clearly separate the patches from the original work must be clearly
+# labeled as unofficial distributions. Modifications which do not
+# carry the name Zope may be packaged in any form, as long as they
+# conform to all of the clauses above.
+#
+#
+# Disclaimer
+#
+# THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY
+# EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIGITAL CREATIONS OR ITS
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+#
+# This software consists of contributions made by Digital Creations and
+# many individuals on behalf of Digital Creations. Specific
+# attributions are listed in the accompanying credits file.
+#
+##############################################################################
+"""
+DOM implementation in StructuredText : Read-Only methods
+
+All standard Zope objects support DOM to a limited extent.
+"""
+import string
+
+
+# Node type codes
+# ---------------
+
+ELEMENT_NODE = 1
+ATTRIBUTE_NODE = 2
+TEXT_NODE = 3
+CDATA_SECTION_NODE = 4
+ENTITY_REFERENCE_NODE = 5
+ENTITY_NODE = 6
+PROCESSING_INSTRUCTION_NODE = 7
+COMMENT_NODE = 8
+DOCUMENT_NODE = 9
+DOCUMENT_TYPE_NODE = 10
+DOCUMENT_FRAGMENT_NODE = 11
+NOTATION_NODE = 12
+
+# Exception codes
+# ---------------
+
+INDEX_SIZE_ERR = 1
+DOMSTRING_SIZE_ERR = 2
+HIERARCHY_REQUEST_ERR = 3
+WRONG_DOCUMENT_ERR = 4
+INVALID_CHARACTER_ERR = 5
+NO_DATA_ALLOWED_ERR = 6
+NO_MODIFICATION_ALLOWED_ERR = 7
+NOT_FOUND_ERR = 8
+NOT_SUPPORTED_ERR = 9
+INUSE_ATTRIBUTE_ERR = 10
+
+# Exceptions
+# ----------
+
+class DOMException(Exception):
+ pass
+class IndexSizeException(DOMException):
+ code = INDEX_SIZE_ERR
+class DOMStringSizeException(DOMException):
+ code = DOMSTRING_SIZE_ERR
+class HierarchyRequestException(DOMException):
+ code = HIERARCHY_REQUEST_ERR
+class WrongDocumentException(DOMException):
+ code = WRONG_DOCUMENT_ERR
+class InvalidCharacterException(DOMException):
+ code = INVALID_CHARACTER_ERR
+class NoDataAllowedException(DOMException):
+ code = NO_DATA_ALLOWED_ERR
+class NoModificationAllowedException(DOMException):
+ code = NO_MODIFICATION_ALLOWED_ERR
+class NotFoundException(DOMException):
+ code = NOT_FOUND_ERR
+class NotSupportedException(DOMException):
+ code = NOT_SUPPORTED_ERR
+class InUseAttributeException(DOMException):
+ code = INUSE_ATTRIBUTE_ERR
+
+# Node classes
+# ------------
+
+class ParentNode:
+ """
+ A node that can have children, or, more precisely, that implements
+ the child access methods of the DOM.
+ """
+
+ def getChildNodes(self, type=type, st=type('')):
+ """
+ Returns a NodeList that contains all children of this node.
+ If there are no children, this is a empty NodeList
+ """
+
+ r=[]
+ for n in self.getChildren():
+ if type(n) is st: n=TextNode(n)
+ r.append(n.__of__(self))
+
+ return NodeList(r)
+
+ def getFirstChild(self, type=type, st=type('')):
+ """
+ The first child of this node. If there is no such node
+ this returns None
+ """
+ children = self.getChildren()
+
+ if not children:
+ return None
+
+ n=chidren[0]
+
+ if type(n) is st:
+ n=TextNode(n)
+
+ return n.__of__(self)
+
+ def getLastChild(self, type=type, st=type('')):
+ """
+ The last child of this node. If there is no such node
+ this returns None.
+ """
+ children = self.getChildren()
+ if not children: return None
+ n=chidren[-1]
+ if type(n) is st: n=TextNode(n)
+ return n.__of__(self)
+
+ """
+ create aliases for all above functions in the pythony way.
+ """
+
+ def _get_ChildNodes(self, type=type, st=type('')):
+ return self.getChildNodes(type,st)
+
+ def _get_FirstChild(self, type=type, st=type('')):
+ return self.getFirstChild(type,st)
+
+ def _get_LastChild(self, type=type, st=type('')):
+ return self.getLastChild(type,st)
+
+class NodeWrapper(ParentNode):
+ """
+ This is an acquisition-like wrapper that provides parent access for
+ DOM sans circular references!
+ """
+
+ def __init__(self, aq_self, aq_parent):
+ self.aq_self=aq_self
+ self.aq_parent=aq_parent
+
+ def __getattr__(self, name):
+ return getattr(self.aq_self, name)
+
+ def getParentNode(self):
+ """
+ The parent of this node. All nodes except Document
+ DocumentFragment and Attr may have a parent
+ """
+ return self.aq_parent
+
+ def _getDOMIndex(self, children, getattr=getattr):
+ i=0
+ self=self.aq_self
+ for child in children:
+ if getattr(child, 'aq_self', child) is self:
+ self._DOMIndex=i
+ return i
+ i=i+1
+ return None
+
+ def getPreviousSibling(self,
+ type=type,
+ st=type(''),
+ getattr=getattr,
+ None=None):
+
+ """
+ The node immediately preceding this node. If
+ there is no such node, this returns None.
+ """
+
+ children = self.aq_parent.getChildren()
+ if not children:
+ return None
+
+ index=getattr(self, '_DOMIndex', None)
+ if index is None:
+ index=self._getDOMIndex(children)
+ if index is None: return None
+
+ index=index-1
+ if index < 0: return None
+ try: n=children[index]
+ except IndexError: return None
+ else:
+ if type(n) is st:
+ n=TextNode(n)
+ n._DOMIndex=index
+ return n.__of__(self)
+
+
+ def getNextSibling(self, type=type, st=type('')):
+ """
+ The node immediately preceding this node. If
+ there is no such node, this returns None.
+ """
+ children = self.aq_parent.getChildren()
+ if not children:
+ return None
+
+ index=getattr(self, '_DOMIndex', None)
+ if index is None:
+ index=self._getDOMIndex(children)
+ if index is None:
+ return None
+
+ index=index+1
+ try: n=children[index]
+ except IndexError:
+ return None
+ else:
+ if type(n) is st:
+ n=TextNode(n)
+ n._DOMIndex=index
+ return n.__of__(self)
+
+ def getOwnerDocument(self):
+ """
+ The Document object associated with this node, if any.
+ """
+ return self.aq_parent.getOwnerDocument()
+
+ """
+ create aliases for all above functions in the pythony way.
+ """
+
+ def _get_ParentNode(self):
+ return self.getParentNode()
+
+ def _get_DOMIndex(self, children, getattr=getattr):
+ return self._getDOMIndex(children,getattr)
+
+ def _get_PreviousSibling(self,
+ type=type,
+ st=type(''),
+ getattr=getattr,
+ None=None):
+
+ return self.getPreviousSibling(type,st,getattr,None)
+
+ def _get_NextSibling(self, type=type, st=type('')):
+ return self.getNextSibling(type,st)
+
+ def _get_OwnerDocument(self):
+ return self.getOwnerDocument()
+
+class Node(ParentNode):
+ """
+ Node Interface
+ """
+
+ # Get a DOM wrapper with a parent link
+ def __of__(self, parent):
+ return NodeWrapper(self, parent)
+
+ # DOM attributes
+ # --------------
+
+ def getNodeName(self):
+ """
+ The name of this node, depending on its type
+ """
+
+ def getNodeValue(self):
+ """
+ The value of this node, depending on its type
+ """
+ return None
+
+ def getParentNode(self):
+ """
+ The parent of this node. All nodes except Document
+ DocumentFragment and Attr may have a parent
+ """
+
+ def getChildren(self):
+ """
+ Get a Python sequence of children
+ """
+ return ()
+
+ def getPreviousSibling(self,
+ type=type,
+ st=type(''),
+ getattr=getattr,
+ None=None):
+ """
+ The node immediately preceding this node. If
+ there is no such node, this returns None.
+ """
+
+ def getNextSibling(self, type=type, st=type('')):
+ """
+ The node immediately preceding this node. If
+ there is no such node, this returns None.
+ """
+
+ def getAttributes(self):
+ """
+ Returns a NamedNodeMap containing the attributes
+ of this node (if it is an element) or None otherwise.
+ """
+ return None
+
+ def getOwnerDocument(self):
+ """
+ The Document object associated with this node, if any.
+ """
+
+ # DOM Methods
+ # -----------
+
+ def hasChildNodes(self):
+ """
+ Returns true if the node has any children, false
+ if it doesn't.
+ """
+ return len(self.getChildren())
+
+ """
+ create aliases for all above functions in the pythony way.
+ """
+
+ def _get_NodeName(self):
+ return self.getNodeName()
+
+ def _get_NodeValue(self):
+ return self.getNodeValue()
+
+ def _get_ParentNode(self):
+ return self.getParentNode()
+
+ def _get_Children(self):
+ return self.getChildren()
+
+ def _get_PreviousSibling(self,
+ type=type,
+ st=type(''),
+ getattr=getattr,
+ None=None):
+
+ return self.getPreviousSibling(type,st,getattr,None)
+
+ def _get_NextSibling(self, type=type, st=type('')):
+ return self.getNextSibling()
+
+ def _get_Attributes(self):
+ return self.getAttributes()
+
+ def _get_OwnerDocument(self):
+ return self.getOwnerDocument()
+
+ def _has_ChildNodes(self):
+ return self.hasChildNodes()
+
+
+class TextNode(Node):
+
+ def __init__(self, str): self._value=str
+
+ def getNodeType(self):
+ return TEXT_NODE
+
+ def getNodeName(self):
+ return '#text'
+
+ def getNodeValue(self):
+ return self._value
+
+ """
+ create aliases for all above functions in the pythony way.
+ """
+
+ def _get_NodeType(self):
+ return self.getNodeType()
+
+ def _get_NodeName(self):
+ return self.getNodeName()
+
+ def _get_NodeValue(self):
+ return self.getNodeValue()
+
+class Element(Node):
+ """
+ Element interface
+ """
+
+ # Element Attributes
+ # ------------------
+
+ def getTagName(self):
+ """The name of the element"""
+ return self.__class__.__name__
+
+ def getNodeName(self):
+ """The name of this node, depending on its type"""
+ return self.__class__.__name__
+
+ def getNodeType(self):
+ """A code representing the type of the node."""
+ return ELEMENT_NODE
+
+ def getNodeValue(self, type=type, st=type('')):
+ r=[]
+ for c in self.getChildren():
+ if type(c) is not st:
+ c=c.getNodeValue()
+ r.append(c)
+ return string.join(r,'')
+
+ def getParentNode(self):
+ """
+ The parent of this node. All nodes except Document
+ DocumentFragment and Attr may have a parent
+ """
+
+ # Element Methods
+ # ---------------
+
+ _attributes=()
+
+ def getAttribute(self, name): return getattr(self, name, None)
+ def getAttributeNode(self, name):
+ if hasattr(self, name):
+ return Attr(name, getattr(self, name))
+
+ def getAttributes(self):
+ d={}
+ for a in self._attributes:
+ d[a]=getattr(self, a, '')
+ return NamedNodeMap(d)
+
+ def getAttribute(self, name):
+ """Retrieves an attribute value by name."""
+ return None
+
+ def getAttributeNode(self, name):
+ """ Retrieves an Attr node by name or None if
+ there is no such attribute. """
+ return None
+
+ def getElementsByTagName(self, tagname):
+ """
+ Returns a NodeList of all the Elements with a given tag
+ name in the order in which they would be encountered in a
+ preorder traversal of the Document tree. Parameter: tagname
+ The name of the tag to match (* = all tags). Return Value: A new
+ NodeList object containing all the matched Elements.
+ """
+ nodeList = []
+ for child in self.getChildren():
+ if (child.getNodeType()==ELEMENT_NODE and \
+ child.getTagName()==tagname or tagname== '*'):
+
+ nodeList.append(child)
+
+ if hasattr(child, 'getElementsByTagName'):
+ n1 = child.getElementsByTagName(tagname)
+ nodeList = nodeList + n1._data
+ return NodeList(nodeList)
+
+ """
+ create aliases for all above functions in the pythony way.
+ """
+
+ def _get_TagName(self):
+ return self.getTagName()
+
+ def _get_NodeName(self):
+ return self.getNodeName()
+
+ def _get_NodeType(self):
+ return self.getNodeType()
+
+ def _get_NodeValue(self, type=type, st=type('')):
+ return self.GetNodeValue(type,st)
+
+ def _get_ParentNode(self):
+ return self.getParentNode()
+
+ def _get_Attribute(self, name):
+ return self.getAttribute(name)
+
+ def _get_AttributeNode(self, name):
+ return self.getAttributeNode(name)
+
+ def _get_Attributes(self):
+ return self.getAttributes()
+
+ def _get_Attribute(self, name):
+ return self.getAttribute(name)
+
+ def _get_AttributeNode(self, name):
+ return self.getAttributeNode(name)
+
+ def _get_ElementsByTagName(self, tagname):
+ return self.getElementsByTagName(tagname)
+
+
+class NodeList:
+ """
+ NodeList interface - Provides the abstraction of an ordered
+ collection of nodes.
+
+ Python extensions: can use sequence-style 'len', 'getitem', and
+ 'for..in' constructs.
+ """
+
+ def __init__(self,list=None):
+ self._data = list or []
+
+ def __getitem__(self, index, type=type, st=type('')):
+ return self._data[index]
+
+ def __getslice__(self, i, j):
+ return self._data[i:j]
+
+ def item(self, index):
+ """
+ Returns the index-th item in the collection
+ """
+ try: return self._data[index]
+ except IndexError: return None
+
+ def getLength(self):
+ """
+ The length of the NodeList
+ """
+ return len(self._data)
+
+ __len__=getLength
+
+ """
+ create aliases for all above functions in the pythony way.
+ """
+
+ def _get_Length(self):
+ return self.getLength()
+
+class NamedNodeMap:
+ """
+ NamedNodeMap interface - Is used to represent collections
+ of nodes that can be accessed by name. NamedNodeMaps are not
+ maintained in any particular order.
+
+ Python extensions: can use sequence-style 'len', 'getitem', and
+ 'for..in' constructs, and mapping-style 'getitem'.
+ """
+
+ def __init__(self, data=None):
+ if data is None:
+ data = {}
+ self._data = data
+
+ def item(self, index):
+ """
+ Returns the index-th item in the map
+ """
+ try: return self._data.values()[index]
+ except IndexError: return None
+
+ def __getitem__(self, key):
+ if type(key)==type(1):
+ return self._data.values()[key]
+ else:
+ return self._data[key]
+
+ def getLength(self):
+ """
+ The length of the NodeList
+ """
+ return len(self._data)
+
+ __len__ = getLength
+
+ def getNamedItem(self, name):
+ """
+ Retrieves a node specified by name. Parameters:
+ name Name of a node to retrieve. Return Value A Node (of any
+ type) with the specified name, or None if the specified name
+ did not identify any node in the map.
+ """
+ if self._data.has_key(name):
+ return self._data[name]
+ return None
+
+ """
+ create aliases for all above functions in the pythony way.
+ """
+ def _get_Length(self):
+ return self.getLength()
+
+ def _get_NamedItem(self, name):
+ return self.getNamedItem(name)
+
+class Attr(Node):
+ """
+ Attr interface - The Attr interface represents an attriubte in an
+ Element object. Attr objects inherit the Node Interface
+ """
+
+ def __init__(self, name, value, specified=1):
+ self.name = name
+ self.value = value
+ self.specified = specified
+
+ def getNodeName(self):
+ """
+ The name of this node, depending on its type
+ """
+ return self.name
+
+ def getName(self):
+ """
+ Returns the name of this attribute.
+ """
+ return self.name
+
+ def getNodeValue(self):
+ """
+ The value of this node, depending on its type
+ """
+ return self.value
+
+ def getNodeType(self):
+ """
+ A code representing the type of the node.
+ """
+ return ATTRIBUTE_NODE
+
+ def getSpecified(self):
+ """
+ If this attribute was explicitly given a value in the
+ original document, this is true; otherwise, it is false.
+ """
+ return self.specified
+
+ """
+ create aliases for all above functions in the pythony way.
+ """
+
+ def _get_NodeName(self):
+ return self.getNodeName()
+
+ def _get_Name(self):
+ return self.getName()
+
+ def _get_NodeValue(self):
+ return self.getNodeValue()
+
+ def _get_NodeType(self):
+ return self.getNodeType()
+
+ def _get_Specified(self):
+ return self.getSpecified()
--- /dev/null
+Using Structured Text
+
+ The goal of StructuredText is to make it possible to express
+ structured text using a relatively simple plain text format. Simple
+ structures, like bullets or headings are indicated through
+ conventions that are natural, for some definition of
+ "natural". Hierarchical structures are indicated through
+ indentation. The use of indentation to express hierarchical
+ structure is inspired by the Python programming language.
+
+ Use of StructuredText consists of one to three logical steps. In the
+ first step, a text string is converted to a network of objects using
+ the 'StructuredText.Basic' facility, as in the following
+ example::
+
+ raw=open("mydocument.txt").read()
+ import StructuredText
+ st=StructuredText.Basic(raw)
+
+ The output of 'StructuredText.Basic' is simply a
+ StructuredTextDocumemt object containing StructuredTextParagraph
+ objects arranged in a hierarchy. Paragraphs are delimited by strings
+ of two or more whitespace characters beginning and ending with
+ newline characters. Hierarchy is indicated by indentation. The
+ indentation of a paragraph is the minimum number of leading spaces
+ in a line containing non-white-space characters after converting tab
+ characters to spaces (assuming a tab stop every eight characters).
+
+ StructuredTextNode objects support the read-only subset of the
+ Document Object Model (DOM) API. It should be possible to process
+ 'StructuredTextNode' hierarchies using XML tools such as XSLT.
+
+ The second step in using StructuredText is to apply additional
+ structuring rules based on text content. A variety of differentText
+ rules can be used. Typically, these are used to implement a
+ structured text language for producing documents, but any sort of
+ structured text language could be implemented in the second
+ step. For example, it is possible to use StructuredText to implement
+ structured text formats for representing structured data. The second
+ step, which could consist of multiple processing steps, is
+ performed by processing, or "coloring", the hierarchy of generic
+ StructuredTextParagraph objects into a network of more specialized
+ objects. Typically, the objects produced should also implement the DOM
+ API to allow processing with XML tools.
+
+ A document processor is provided to convert a StructuredTextDocument
+ object containing only StructuredStructuredTextParagraph objects
+ into a StructuredTextDocument object containing a richer collection
+ of objects such as bullets, headings, emphasis, and so on using
+ hints in the text. Hints are selected based on conventions of the
+ sort typically seen in electronic mail or news-group postings. It
+ should be noted, however, that these conventions are somewhat
+ culturally dependent, fortunately, the document processor is easily
+ customized to implement alternative rules. Here's an example of
+ using the DOC processor to convert the output of the previous example::
+
+ doc=StructuredText.Document(st)
+
+ The final step is to process the colored networks produced from the
+ second step to produce additional outputs. The final step could be
+ performed by Python programs, or by XML tools. A Python outputter is
+ provided for the document processor output that produces Hypertext Markup
+ Language (HTML) text::
+
+ html=StructuredText.HTML(doc)
+
+Customizing the document processor
+
+ The document processor is driven by two tables. The first table,
+ named 'paragraph_types', is a sequence of callable objects or method
+ names for coloring paragraphs. If a table entry is a string, then it
+ is the name of a method of the document processor to be used. For
+ each input paragraph, the objects in the table are called until one
+ returns a value (not 'None'). The value returned replaces the
+ original input paragraph in the output. If none of the objects in
+ the paragraph types table return a value, then a copy of the
+ original paragraph is used. The new object returned by calling a
+ paragraph type should implement the ReadOnlyDOM,
+ StructuredTextColorizable, and StructuredTextSubparagraphContainer
+ interfaces. See the 'Document.py' source file for examples.
+
+ A paragraph type may return a list or tuple of replacement
+ paragraphs, this allowing a paragraph to be split into multiple
+ paragraphs.
+
+ The second table, 'text_types', is a sequence of callable objects or
+ method names for coloring text. The callable objects in this table
+ are used in sequence to transform the input text into new text or
+ objects. The callable objects are passed a string and return
+ nothing ('None') or a three-element tuple consisting of:
+
+ - a replacement object,
+
+ - a starting position, and
+
+ - an ending position
+
+ The text from the starting position is (logically) replaced with the
+ replacement object. The replacement object is typically an object
+ that implements that implements the ReadOnlyDOM, and
+ StructuredTextColorizable interfaces. The replacement object can
+ also be a string or a list of strings or objects. Replacement is
+ done from beginning to end and text after the replacement ending
+ position will be passed to the character type objects for processing.
+
+Example: adding wiki links
+
+ We want to add support for Wiki links. A Wiki link is a string of
+ text containing mixed-case letters, such that at least two of the
+ letters are upper case and such that the first letter is upper case.
+
+
+
+
+
+
--- /dev/null
+#! /usr/bin/env python -- # -*- python -*-
+##############################################################################
+#
+# Zope Public License (ZPL) Version 1.0
+# -------------------------------------
+#
+# Copyright (c) Digital Creations. All rights reserved.
+#
+# This license has been certified as Open Source(tm).
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# 1. Redistributions in source code must retain the above copyright
+# notice, this list of conditions, and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions, and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+#
+# 3. Digital Creations requests that attribution be given to Zope
+# in any manner possible. Zope includes a "Powered by Zope"
+# button that is installed by default. While it is not a license
+# violation to remove this button, it is requested that the
+# attribution remain. A significant investment has been put
+# into Zope, and this effort will continue if the Zope community
+# continues to grow. This is one way to assure that growth.
+#
+# 4. All advertising materials and documentation mentioning
+# features derived from or use of this software must display
+# the following acknowledgement:
+#
+# "This product includes software developed by Digital Creations
+# for use in the Z Object Publishing Environment
+# (http://www.zope.org/)."
+#
+# In the event that the product being advertised includes an
+# intact Zope distribution (with copyright and license included)
+# then this clause is waived.
+#
+# 5. Names associated with Zope or Digital Creations must not be used to
+# endorse or promote products derived from this software without
+# prior written permission from Digital Creations.
+#
+# 6. Modified redistributions of any form whatsoever must retain
+# the following acknowledgment:
+#
+# "This product includes software developed by Digital Creations
+# for use in the Z Object Publishing Environment
+# (http://www.zope.org/)."
+#
+# Intact (re-)distributions of any official Zope release do not
+# require an external acknowledgement.
+#
+# 7. Modifications are encouraged but must be packaged separately as
+# patches to official Zope releases. Distributions that do not
+# clearly separate the patches from the original work must be clearly
+# labeled as unofficial distributions. Modifications which do not
+# carry the name Zope may be packaged in any form, as long as they
+# conform to all of the clauses above.
+#
+#
+# Disclaimer
+#
+# THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY
+# EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIGITAL CREATIONS OR ITS
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+#
+# This software consists of contributions made by Digital Creations and
+# many individuals on behalf of Digital Creations. Specific
+# attributions are listed in the accompanying credits file.
+#
+##############################################################################
+'''Structured Text Manipulation
+
+Parse a structured text string into a form that can be used with
+structured formats, like html.
+
+Structured text is text that uses indentation and simple
+symbology to indicate the structure of a document.
+
+A structured string consists of a sequence of paragraphs separated by
+one or more blank lines. Each paragraph has a level which is defined
+as the minimum indentation of the paragraph. A paragraph is a
+sub-paragraph of another paragraph if the other paragraph is the last
+preceding paragraph that has a lower level.
+
+Special symbology is used to indicate special constructs:
+
+- A single-line paragraph whose immediately succeeding paragraphs are lower
+ level is treated as a header.
+
+- A paragraph that begins with a '-', '*', or 'o' is treated as an
+ unordered list (bullet) element.
+
+- A paragraph that begins with a sequence of digits followed by a
+ white-space character is treated as an ordered list element.
+
+- A paragraph that begins with a sequence of sequences, where each
+ sequence is a sequence of digits or a sequence of letters followed
+ by a period, is treated as an ordered list element.
+
+- A paragraph with a first line that contains some text, followed by
+ some white-space and '--' is treated as
+ a descriptive list element. The leading text is treated as the
+ element title.
+
+- Sub-paragraphs of a paragraph that ends in the word 'example' or the
+ word 'examples', or '::' is treated as example code and is output as is.
+
+- Text enclosed single quotes (with white-space to the left of the
+ first quote and whitespace or puctuation to the right of the second quote)
+ is treated as example code.
+
+- Text surrounded by '*' characters (with white-space to the left of the
+ first '*' and whitespace or puctuation to the right of the second '*')
+ is emphasized.
+
+- Text surrounded by '**' characters (with white-space to the left of the
+ first '**' and whitespace or puctuation to the right of the second '**')
+ is made strong.
+
+- Text surrounded by '_' underscore characters (with whitespace to the left
+ and whitespace or punctuation to the right) is made underlined.
+
+- Text encloded by double quotes followed by a colon, a URL, and concluded
+ by punctuation plus white space, *or* just white space, is treated as a
+ hyper link. For example:
+
+ "Zope":http://www.zope.org/ is ...
+
+ Is interpreted as '<a href="http://www.zope.org/">Zope</a> is ....'
+ Note: This works for relative as well as absolute URLs.
+
+- Text enclosed by double quotes followed by a comma, one or more spaces,
+ an absolute URL and concluded by punctuation plus white space, or just
+ white space, is treated as a hyper link. For example:
+
+ "mail me", mailto:amos@digicool.com.
+
+ Is interpreted as '<a href="mailto:amos@digicool.com">mail me</a>.'
+
+- Text enclosed in brackets which consists only of letters, digits,
+ underscores and dashes is treated as hyper links within the document.
+ For example:
+
+ As demonstrated by Smith [12] this technique is quite effective.
+
+ Is interpreted as '... by Smith <a href="#12">[12]</a> this ...'. Together
+ with the next rule this allows easy coding of references or end notes.
+
+- Text enclosed in brackets which is preceded by the start of a line, two
+ periods and a space is treated as a named link. For example:
+
+ .. [12] "Effective Techniques" Smith, Joe ...
+
+ Is interpreted as '<a name="12">[12]</a> "Effective Techniques" ...'.
+ Together with the previous rule this allows easy coding of references or
+ end notes.
+
+
+- A paragraph that has blocks of text enclosed in '||' is treated as a
+ table. The text blocks correspond to table cells and table rows are
+ denoted by newlines. By default the cells are center aligned. A cell
+ can span more than one column by preceding a block of text with an
+ equivalent number of cell separators '||'. Newlines and '|' cannot
+ be a part of the cell text. For example:
+
+ |||| **Ingredients** ||
+ || *Name* || *Amount* ||
+ ||Spam||10||
+ ||Eggs||3||
+
+ is interpreted as::
+
+ <TABLE BORDER=1 CELLPADDING=2>
+ <TR>
+ <TD ALIGN=CENTER COLSPAN=2> <strong>Ingredients</strong> </TD>
+ </TR>
+ <TR>
+ <TD ALIGN=CENTER COLSPAN=1> <em>Name</em> </TD>
+ <TD ALIGN=CENTER COLSPAN=1> <em>Amount</em> </TD>
+ </TR>
+ <TR>
+ <TD ALIGN=CENTER COLSPAN=1>Spam</TD>
+ <TD ALIGN=CENTER COLSPAN=1>10</TD>
+ </TR>
+ <TR>
+ <TD ALIGN=CENTER COLSPAN=1>Eggs</TD>
+ <TD ALIGN=CENTER COLSPAN=1>3</TD>
+ </TR>
+ </TABLE>
+
+
+$Id$'''
+# Copyright
+#
+# Copyright 1996 Digital Creations, L.C., 910 Princess Anne
+# Street, Suite 300, Fredericksburg, Virginia 22401 U.S.A. All
+# rights reserved. Copyright in this software is owned by DCLC,
+# unless otherwise indicated. Permission to use, copy and
+# distribute this software is hereby granted, provided that the
+# above copyright notice appear in all copies and that both that
+# copyright notice and this permission notice appear. Note that
+# any product, process or technology described in this software
+# may be the subject of other Intellectual Property rights
+# reserved by Digital Creations, L.C. and are not licensed
+# hereunder.
+#
+# Trademarks
+#
+# Digital Creations & DCLC, are trademarks of Digital Creations, L.C..
+# All other trademarks are owned by their respective companies.
+#
+# No Warranty
+#
+# The software is provided "as is" without warranty of any kind,
+# either express or implied, including, but not limited to, the
+# implied warranties of merchantability, fitness for a particular
+# purpose, or non-infringement. This software could include
+# technical inaccuracies or typographical errors. Changes are
+# periodically made to the software; these changes will be
+# incorporated in new editions of the software. DCLC may make
+# improvements and/or changes in this software at any time
+# without notice.
+#
+# Limitation Of Liability
+#
+# In no event will DCLC be liable for direct, indirect, special,
+# incidental, economic, cover, or consequential damages arising
+# out of the use of or inability to use this software even if
+# advised of the possibility of such damages. Some states do not
+# allow the exclusion or limitation of implied warranties or
+# limitation of liability for incidental or consequential
+# damages, so the above limitation or exclusion may not apply to
+# you.
+#
+#
+# If you have questions regarding this software,
+# contact:
+#
+# Jim Fulton, jim@digicool.com
+#
+# (540) 371-6909
+#
+# $Log$
+# Revision 1.1 2001/03/10 05:07:20 RD
+# Added some simple sample apps
+#
+# Revision 1.27 2000/04/21 13:38:10 jim
+# Added closing list tags. Woo hoo!
+#
+# Revision 1.26 2000/03/14 17:22:04 brian
+# Allow ~ in hrefs.
+#
+# Revision 1.25 2000/02/17 00:53:24 klm
+# HTML._str(): We were getting preformatted examples rendered twice,
+# second time without preformatting. Problem was a missing 'continue'
+# in one of the cases.
+#
+# Revision 1.24 1999/12/13 16:32:48 klm
+# Incorporated pavlos christoforou's mods to handle simple tables. From
+# his web page at http://www.zope.org/Members/gaaros/StructuredText:
+#
+# Structured Text module with table support
+#
+# A paragraph that has blocks of text enclosed in '||' is treated as a
+# table. The text blocks correspond to table cells and table rows are
+# denoted by newlines. By default the cells are center aligned. You can
+# change the defaults by modifying the CELL,ROW and TABLE class
+# attributes in class Table. A cell can span more than one column by
+# preceding a block of text with an equivalent number of cell separators
+# '||'. Newlines and '|' cannot be a part of the cell text. If you need
+# newlines use <BR>. For example:
+#
+# |||| **Ingredients** ||
+# || *Name* || *Amount* ||
+# ||Spam||10||
+# ||Eggs||3||
+#
+# Revision 1.23 1999/08/03 20:49:05 jim
+# Fixed to allow list elements to introduce examples.
+#
+# Restructured _str using continue to avoid excessive nesting.
+#
+# Revision 1.22 1999/08/02 22:01:28 jim
+# Fixed a bunch of bugs introduced by making ts_regex actually thread
+# safe.
+#
+# Also localized a bunch of regular expressions
+# using "static" variables (aka always default arguments).
+#
+# Revision 1.21 1999/08/02 13:26:52 jim
+# paragraph_divider needs to be a regular (thread-unsafe) regex
+# since it gets passed to ts_regex.split, which is thread-safe
+# and wants to use regs.
+#
+# Revision 1.20 1999/07/21 13:33:59 jim
+# untabified.
+#
+# Revision 1.19 1999/07/15 16:43:15 jim
+# Checked in Scott Robertson's thread-safety fixes.
+#
+# Revision 1.18 1999/03/24 00:03:18 klm
+# Provide for relative links, eg <a href="file_in_same_dir">whatever</a>,
+# as:
+#
+# "whatever", :file_in_same_dir
+#
+# or
+#
+# "whatever"::file_in_same_dir
+#
+# .__init__(): relax the second gsub, using a '*' instead of a '+', so
+# the stuff before the ':' can be missing, and also do postprocessing so
+# any resulting '<a href=":file_in_same_dir">'s have the superfluous ':'
+# removed. *Seems* good!
+#
+# Revision 1.17 1999/03/12 23:21:39 klm
+# Gratuituous checkin to test my cvs *update* logging hook.
+#
+# Revision 1.16 1999/03/12 17:12:12 klm
+# Added support for underlined elements, in the obvious way (and
+# included an entry in the module docstring for it).
+#
+# Added an entry in the module docstring describing what i *guess* is
+# the criterion for identifying header elements. (I'm going to have to
+# delve into and understand the framework a bit better before *knowing*
+# this is the case.)
+#
+# Revision 1.15 1999/03/11 22:40:18 klm
+# Handle links that include '#' named links.
+#
+# Revision 1.14 1999/03/11 01:35:19 klm
+# Fixed a small typo, and refined the module docstring link example, in
+# order to do a checkin to exercise the CVS repository mirroring. Might
+# as well include my last checkin message, with some substantial stuff:
+#
+# Links are now recognized whether or not the candidate strings are
+# terminated with punctuation before the trailing whitespace. The old
+# form - trailing punctuation then whitespace - is preserved, but the
+# punctuation is now unnecessary.
+#
+# The regular expressions are a bit more complicated, but i've factored
+# out the common parts and but them in variables with suggestive names,
+# which may make them easier to understand.
+#
+# Revision 1.13 1999/03/11 00:49:57 klm
+# Links are now recognized whether or not the candidate strings are
+# terminated with punctuation before the trailing whitespace. The old
+# form - trailing punctuation then whitespace - is preserved, but the
+# punctuation is now unnecessary.
+#
+# The regular expressions are a bit more complicated, but i've factored
+# out the common parts and but them in variables with suggestive names,
+# which may make them easier to understand.
+#
+# Revision 1.12 1999/03/10 00:15:46 klm
+# Committing with version 1.0 of the license.
+#
+# Revision 1.11 1999/02/08 18:13:12 klm
+# Trival checkin (spelling fix "preceedeing" -> "preceding" and similar)
+# to see what pitfalls my environment presents to accomplishing a
+# successful checkin. (It turns out that i can't do it from aldous because
+# the new version of cvs doesn't support the '-t' and '-f' options in the
+# cvswrappers file...)
+#
+# Revision 1.10 1998/12/29 22:30:43 amos
+# Improved doc string to describe hyper link and references capabilities.
+#
+# Revision 1.9 1998/12/04 20:15:31 jim
+# Detabification and new copyright.
+#
+# Revision 1.8 1998/02/27 18:45:22 jim
+# Various updates, including new indentation utilities.
+#
+# Revision 1.7 1997/12/12 15:39:54 jim
+# Added level as argument for html_with_references.
+#
+# Revision 1.6 1997/12/12 15:27:25 jim
+# Added additional pattern matching for HTML references.
+#
+# Revision 1.5 1997/03/08 16:01:03 jim
+# Moved code to recognize: "foo bar", url.
+# into object initializer, so it gets applied in all cases.
+#
+# Revision 1.4 1997/02/17 23:36:35 jim
+# Added support for "foo title", http:/foohost/foo
+#
+# Revision 1.3 1996/12/06 15:57:37 jim
+# Fixed bugs in character tags.
+#
+# Added -t command-line option to generate title if:
+#
+# - The first paragraph is one line (i.e. a heading) and
+#
+# - All other paragraphs are indented.
+#
+# Revision 1.2 1996/10/28 13:56:02 jim
+# Fixed bug in ordered lists.
+# Added option for either HTML-style headings or descriptive-list style
+# headings.
+#
+# Revision 1.1 1996/10/23 14:00:45 jim
+# *** empty log message ***
+#
+#
+#
+
+import ts_regex, regex
+from ts_regex import gsub
+from string import split, join, strip, find
+
+def untabify(aString,
+ indent_tab=ts_regex.compile('\(\n\|^\)\( *\)\t').search_group,
+ ):
+ '''\
+ Convert indentation tabs to spaces.
+ '''
+ result=''
+ rest=aString
+ while 1:
+ ts_results = indent_tab(rest, (1,2))
+ if ts_results:
+ start, grps = ts_results
+ lnl=len(grps[0])
+ indent=len(grps[1])
+ result=result+rest[:start]
+ rest="\n%s%s" % (' ' * ((indent/8+1)*8),
+ rest[start+indent+1+lnl:])
+ else:
+ return result+rest
+
+def indent(aString, indent=2):
+ """Indent a string the given number of spaces"""
+ r=split(untabify(aString),'\n')
+ if not r: return ''
+ if not r[-1]: del r[-1]
+ tab=' '*level
+ return "%s%s\n" % (tab,join(r,'\n'+tab))
+
+def reindent(aString, indent=2, already_untabified=0):
+ "reindent a block of text, so that the minimum indent is as given"
+
+ if not already_untabified: aString=untabify(aString)
+
+ l=indent_level(aString)[0]
+ if indent==l: return aString
+
+ r=[]
+
+ append=r.append
+
+ if indent > l:
+ tab=' ' * (indent-l)
+ for s in split(aString,'\n'): append(tab+s)
+ else:
+ l=l-indent
+ for s in split(aString,'\n'): append(s[l:])
+
+ return join(r,'\n')
+
+def indent_level(aString,
+ indent_space=ts_regex.compile('\n\( *\)').search_group,
+ ):
+ '''\
+ Find the minimum indentation for a string, not counting blank lines.
+ '''
+ start=0
+ text='\n'+aString
+ indent=l=len(text)
+ while 1:
+
+ ts_results = indent_space(text, (1,2), start)
+ if ts_results:
+ start, grps = ts_results
+ i=len(grps[0])
+ start=start+i+1
+ if start < l and text[start] != '\n': # Skip blank lines
+ if not i: return (0,aString)
+ if i < indent: indent = i
+ else:
+ return (indent,aString)
+
+def paragraphs(list,start):
+ l=len(list)
+ level=list[start][0]
+ i=start+1
+ while i < l and list[i][0] > level: i=i+1
+ return i-1-start
+
+def structure(list):
+ if not list: return []
+ i=0
+ l=len(list)
+ r=[]
+ while i < l:
+ sublen=paragraphs(list,i)
+ i=i+1
+ r.append((list[i-1][1],structure(list[i:i+sublen])))
+ i=i+sublen
+ return r
+
+
+class Table:
+ CELL=' <TD ALIGN=CENTER COLSPAN=%i>%s</TD>\n'
+ ROW=' <TR>\n%s </TR>\n'
+ TABLE='\n<TABLE BORDER=1 CELLPADDING=2>\n%s</TABLE>'
+
+ def create(self,aPar,td=ts_regex.compile(
+ '[ \t\n]*||\([^\0|]*\)').match_group):
+ '''parses a table and returns nested list representing the
+ table'''
+ self.table=[]
+ text=filter(None,split(aPar,'\n'))
+ for line in text:
+ row=[]
+ while 1:
+ pos=td(line,(1,))
+ if not pos:return 0
+ row.append(pos[1])
+ if pos[0]==len(line):break
+ line=line[pos[0]:]
+ self.table.append(row)
+ return 1
+
+ def html(self):
+ '''Creates an HTML representation of table'''
+ htmltable=[]
+ for row in self.table:
+ htmlrow=[]
+ colspan=1
+ for cell in row:
+ if cell=='':
+ colspan=colspan+1
+ continue
+ else:
+ htmlrow.append(self.CELL%(colspan,cell))
+ colspan=1
+ htmltable.append(self.ROW%join(htmlrow,''))
+ return self.TABLE%join(htmltable,'')
+
+optional_trailing_punctuation = '\(,\|\([.:?;]\)\)?'
+trailing_space = '\([\0- ]\)'
+not_punctuation_or_whitespace = "[^-,.?:\0- ]"
+table=Table()
+
+class StructuredText:
+
+ """Model text as structured collection of paragraphs.
+
+ Structure is implied by the indentation level.
+
+ This class is intended as a base classes that do actual text
+ output formatting.
+ """
+
+ def __init__(self, aStructuredString, level=0,
+ paragraph_divider=regex.compile('\(\n *\)+\n'),
+ ):
+ '''Convert a structured text string into a structured text object.
+
+ Aguments:
+
+ aStructuredString -- The string to be parsed.
+ level -- The level of top level headings to be created.
+ '''
+
+ aStructuredString = gsub(
+ '\"\([^\"\0]+\)\":' # title: <"text":>
+ + ('\([-:a-zA-Z0-9_,./?=@#~]+%s\)'
+ % not_punctuation_or_whitespace)
+ + optional_trailing_punctuation
+ + trailing_space,
+ '<a href="\\2">\\1</a>\\4\\5\\6',
+ aStructuredString)
+
+ aStructuredString = gsub(
+ '\"\([^\"\0]+\)\",[\0- ]+' # title: <"text", >
+ + ('\([a-zA-Z]*:[-:a-zA-Z0-9_,./?=@#~]*%s\)'
+ % not_punctuation_or_whitespace)
+ + optional_trailing_punctuation
+ + trailing_space,
+ '<a href="\\2">\\1</a>\\4\\5\\6',
+ aStructuredString)
+
+ protoless = find(aStructuredString, '<a href=":')
+ if protoless != -1:
+ aStructuredString = gsub('<a href=":', '<a href="',
+ aStructuredString)
+
+ self.level=level
+ paragraphs=ts_regex.split(untabify(aStructuredString),
+ paragraph_divider)
+ paragraphs=map(indent_level,paragraphs)
+
+ self.structure=structure(paragraphs)
+
+
+ def __str__(self):
+ return str(self.structure)
+
+
+ctag_prefix="\([\0- (]\|^\)"
+ctag_suffix="\([\0- ,.:;!?)]\|$\)"
+ctag_middle="[%s]\([^\0- %s][^%s]*[^\0- %s]\|[^%s]\)[%s]"
+ctag_middl2="[%s][%s]\([^\0- %s][^%s]*[^\0- %s]\|[^%s]\)[%s][%s]"
+
+def ctag(s,
+ em=regex.compile(
+ ctag_prefix+(ctag_middle % (("*",)*6) )+ctag_suffix),
+ strong=regex.compile(
+ ctag_prefix+(ctag_middl2 % (("*",)*8))+ctag_suffix),
+ under=regex.compile(
+ ctag_prefix+(ctag_middle % (("_",)*6) )+ctag_suffix),
+ code=regex.compile(
+ ctag_prefix+(ctag_middle % (("\'",)*6))+ctag_suffix),
+ ):
+ if s is None: s=''
+ s=gsub(strong,'\\1<strong>\\2</strong>\\3',s)
+ s=gsub(under, '\\1<u>\\2</u>\\3',s)
+ s=gsub(code, '\\1<code>\\2</code>\\3',s)
+ s=gsub(em, '\\1<em>\\2</em>\\3',s)
+ return s
+
+class HTML(StructuredText):
+
+ '''\
+ An HTML structured text formatter.
+ '''\
+
+ def __str__(self,
+ extra_dl=regex.compile("</dl>\n<dl>"),
+ extra_ul=regex.compile("</ul>\n<ul>"),
+ extra_ol=regex.compile("</ol>\n<ol>"),
+ ):
+ '''\
+ Return an HTML string representation of the structured text data.
+
+ '''
+ s=self._str(self.structure,self.level)
+ s=gsub(extra_dl,'\n',s)
+ s=gsub(extra_ul,'\n',s)
+ s=gsub(extra_ol,'\n',s)
+ return s
+
+ def ul(self, before, p, after):
+ if p: p="<p>%s</p>" % strip(ctag(p))
+ return ('%s<ul><li>%s\n%s\n</li></ul>\n'
+ % (before,p,after))
+
+ def ol(self, before, p, after):
+ if p: p="<p>%s</p>" % strip(ctag(p))
+ return ('%s<ol><li>%s\n%s\n</li></ol>\n'
+ % (before,p,after))
+
+ def dl(self, before, t, d, after):
+ return ('%s<dl><dt>%s</dt><dd><p>%s</p>\n%s\n</dd></dl>\n'
+ % (before,ctag(t),ctag(d),after))
+
+ def head(self, before, t, level, d):
+ if level > 0 and level < 6:
+ return ('%s<h%d>%s</h%d>\n%s\n'
+ % (before,level,strip(ctag(t)),level,d))
+
+ t="<p><strong>%s</strong><p>" % strip(ctag(t))
+ return ('%s<dl><dt>%s\n</dt><dd>%s\n</dd></dl>\n'
+ % (before,t,d))
+
+ def normal(self,before,p,after):
+ return '%s<p>%s</p>\n%s\n' % (before,ctag(p),after)
+
+ def pre(self,structure,tagged=0):
+ if not structure: return ''
+ if tagged:
+ r=''
+ else:
+ r='<PRE>\n'
+ for s in structure:
+ r="%s%s\n\n%s" % (r,html_quote(s[0]),self.pre(s[1],1))
+ if not tagged: r=r+'</PRE>\n'
+ return r
+
+ def table(self,before,table,after):
+ return '%s<p>%s</p>\n%s\n' % (before,ctag(table),after)
+
+ def _str(self,structure,level,
+ # Static
+ bullet=ts_regex.compile('[ \t\n]*[o*-][ \t\n]+\([^\0]*\)'
+ ).match_group,
+ example=ts_regex.compile('[\0- ]examples?:[\0- ]*$'
+ ).search,
+ dl=ts_regex.compile('\([^\n]+\)[ \t]+--[ \t\n]+\([^\0]*\)'
+ ).match_group,
+ nl=ts_regex.compile('\n').search,
+ ol=ts_regex.compile(
+ '[ \t]*\(\([0-9]+\|[a-zA-Z]+\)[.)]\)+[ \t\n]+\([^\0]*\|$\)'
+ ).match_group,
+ olp=ts_regex.compile('[ \t]*([0-9]+)[ \t\n]+\([^\0]*\|$\)'
+ ).match_group,
+ ):
+ r=''
+ for s in structure:
+
+ ts_results = bullet(s[0], (1,))
+ if ts_results:
+ p = ts_results[1]
+ if s[0][-2:]=='::' and s[1]: ps=self.pre(s[1])
+ else: ps=self._str(s[1],level)
+ r=self.ul(r,p,ps)
+ continue
+ ts_results = ol(s[0], (3,))
+ if ts_results:
+ p = ts_results[1]
+ if s[0][-2:]=='::' and s[1]: ps=self.pre(s[1])
+ else: ps=self._str(s[1],level)
+ r=self.ol(r,p,ps)
+ continue
+ ts_results = olp(s[0], (1,))
+ if ts_results:
+ p = ts_results[1]
+ if s[0][-2:]=='::' and s[1]: ps=self.pre(s[1])
+ else: ps=self._str(s[1],level)
+ r=self.ol(r,p,ps)
+ continue
+ ts_results = dl(s[0], (1,2))
+ if ts_results:
+ t,d = ts_results[1]
+ r=self.dl(r,t,d,self._str(s[1],level))
+ continue
+ if example(s[0]) >= 0 and s[1]:
+ # Introduce an example, using pre tags:
+ r=self.normal(r,s[0],self.pre(s[1]))
+ continue
+ if s[0][-2:]=='::' and s[1]:
+ # Introduce an example, using pre tags:
+ r=self.normal(r,s[0][:-1],self.pre(s[1]))
+ continue
+ if table.create(s[0]):
+ ## table support.
+ r=self.table(r,table.html(),self._str(s[1],level))
+ continue
+ else:
+
+ if nl(s[0]) < 0 and s[1] and s[0][-1:] != ':':
+ # Treat as a heading
+ t=s[0]
+ r=self.head(r,t,level,
+ self._str(s[1],level and level+1))
+ else:
+ r=self.normal(r,s[0],self._str(s[1],level))
+ return r
+
+
+def html_quote(v,
+ character_entities=(
+ (regex.compile('&'), '&'),
+ (regex.compile("<"), '<' ),
+ (regex.compile(">"), '>' ),
+ (regex.compile('"'), '"')
+ )): #"
+ text=str(v)
+ for re,name in character_entities:
+ text=gsub(re,name,text)
+ return text
+
+def html_with_references(text, level=1):
+ text = gsub(
+ '[\0\n].. \[\([-_0-9_a-zA-Z-]+\)\]',
+ '\n <a name="\\1">[\\1]</a>',
+ text)
+
+ text = gsub(
+ '\([\0- ,]\)\[\([0-9_a-zA-Z-]+\)\]\([\0- ,.:]\)',
+ '\\1<a href="#\\2">[\\2]</a>\\3',
+ text)
+
+ text = gsub(
+ '\([\0- ,]\)\[\([^]]+\)\.html\]\([\0- ,.:]\)',
+ '\\1<a href="\\2.html">[\\2]</a>\\3',
+ text)
+
+ return HTML(text,level=level)
+
+
+def main():
+ import sys, getopt
+
+ opts,args=getopt.getopt(sys.argv[1:],'tw')
+
+ if args:
+ [infile]=args
+ s=open(infile,'r').read()
+ else:
+ s=sys.stdin.read()
+
+ if opts:
+
+ if filter(lambda o: o[0]=='-w', opts):
+ print 'Content-Type: text/html\n'
+
+ if s[:2]=='#!':
+ s=ts_regex.sub('^#![^\n]+','',s)
+
+ r=ts_regex.compile('\([\0-\n]*\n\)')
+ ts_results = r.match_group(s, (1,))
+ if ts_results:
+ s=s[len(ts_results[1]):]
+ s=str(html_with_references(s))
+ if s[:4]=='<h1>':
+ t=s[4:find(s,'</h1>')]
+ s='''<html><head><title>%s</title>
+ </head><body>
+ %s
+ </body></html>
+ ''' % (t,s)
+ print s
+ else:
+ print html_with_references(s)
+
+if __name__=="__main__": main()
--- /dev/null
+#!/usr/bin/python
+##############################################################################
+#
+# Zope Public License (ZPL) Version 1.0
+# -------------------------------------
+#
+# Copyright (c) Digital Creations. All rights reserved.
+#
+# This license has been certified as Open Source(tm).
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# 1. Redistributions in source code must retain the above copyright
+# notice, this list of conditions, and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions, and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+#
+# 3. Digital Creations requests that attribution be given to Zope
+# in any manner possible. Zope includes a "Powered by Zope"
+# button that is installed by default. While it is not a license
+# violation to remove this button, it is requested that the
+# attribution remain. A significant investment has been put
+# into Zope, and this effort will continue if the Zope community
+# continues to grow. This is one way to assure that growth.
+#
+# 4. All advertising materials and documentation mentioning
+# features derived from or use of this software must display
+# the following acknowledgement:
+#
+# "This product includes software developed by Digital Creations
+# for use in the Z Object Publishing Environment
+# (http://www.zope.org/)."
+#
+# In the event that the product being advertised includes an
+# intact Zope distribution (with copyright and license included)
+# then this clause is waived.
+#
+# 5. Names associated with Zope or Digital Creations must not be used to
+# endorse or promote products derived from this software without
+# prior written permission from Digital Creations.
+#
+# 6. Modified redistributions of any form whatsoever must retain
+# the following acknowledgment:
+#
+# "This product includes software developed by Digital Creations
+# for use in the Z Object Publishing Environment
+# (http://www.zope.org/)."
+#
+# Intact (re-)distributions of any official Zope release do not
+# require an external acknowledgement.
+#
+# 7. Modifications are encouraged but must be packaged separately as
+# patches to official Zope releases. Distributions that do not
+# clearly separate the patches from the original work must be clearly
+# labeled as unofficial distributions. Modifications which do not
+# carry the name Zope may be packaged in any form, as long as they
+# conform to all of the clauses above.
+#
+#
+# Disclaimer
+#
+# THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY
+# EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIGITAL CREATIONS OR ITS
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+#
+# This software consists of contributions made by Digital Creations and
+# many individuals on behalf of Digital Creations. Specific
+# attributions are listed in the accompanying credits file.
+#
+##############################################################################
+
+from Html import HTML
+from string import split
+from ST import DOC
+import re
+
+"""
+This is the new structured text type.
+"""
+
+class Zwiki_Title:
+ def __init__(self,str=''):
+ self.expr1 = re.compile('([A-Z]+[A-Z]+[a-zA-Z]*)').search
+ self.expr2 = re.compile('([A-Z]+[a-z]+[A-Z]+[a-zA-Z]*)').search
+ self.str = [str]
+ self.typ = "Zwiki_Title"
+
+ def type(self):
+ return '%s' % self.typ
+
+ def string(self):
+ return self.str
+
+ def __getitem__(self,index):
+ return self.str[index]
+
+ def __call__(self,raw_string,subs):
+
+ """
+ The raw_string is checked to see if it matches the rules
+ for this structured text expression. If the raw_string does,
+ it is parsed for the sub-string which matches and a doc_inner_link
+ instance is returned whose string is the matching substring.
+ If raw_string does not match, nothing is returned.
+ """
+
+ if self.expr1(raw_string):
+ start,end = self.expr1(raw_string).span()
+ result = Zwiki_Title(raw_string[start:end])
+ result.start,result.end = self.expr1(raw_string).span()
+ return result
+ elif self.expr2(raw_string):
+ start,end = self.expr2(raw_string).span()
+ result = Zwiki_Title(raw_string[start:end])
+ result.start,result.end = self.expr2(raw_string).span()
+ return result
+ else:
+ return None
+
+ def span(self):
+ return self.start,self.end
+
+class Zwiki_doc(DOC):
+
+ def __init__(self):
+ DOC.__init__(self)
+ """
+ Add the new type to self.types
+ """
+ self.types.append(Zwiki_Title())
+
+class Zwiki_parser(HTML):
+ def __init__(self):
+ HTML.__init__(self)
+ self.types["Zwiki_Title"] = self.zwiki_title
+
+ def zwiki_title(self,object):
+ result = ""
+ for x in object.string():
+ result = result + x
+ result = "<a href=%s>%s</a>" % (result,result)
+ #result = "<dtml-wikiname %s>" % result
+ self.string = self.string + result
--- /dev/null
+##############################################################################
+#
+# Zope Public License (ZPL) Version 1.0
+# -------------------------------------
+#
+# Copyright (c) Digital Creations. All rights reserved.
+#
+# This license has been certified as Open Source(tm).
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# 1. Redistributions in source code must retain the above copyright
+# notice, this list of conditions, and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions, and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+#
+# 3. Digital Creations requests that attribution be given to Zope
+# in any manner possible. Zope includes a "Powered by Zope"
+# button that is installed by default. While it is not a license
+# violation to remove this button, it is requested that the
+# attribution remain. A significant investment has been put
+# into Zope, and this effort will continue if the Zope community
+# continues to grow. This is one way to assure that growth.
+#
+# 4. All advertising materials and documentation mentioning
+# features derived from or use of this software must display
+# the following acknowledgement:
+#
+# "This product includes software developed by Digital Creations
+# for use in the Z Object Publishing Environment
+# (http://www.zope.org/)."
+#
+# In the event that the product being advertised includes an
+# intact Zope distribution (with copyright and license included)
+# then this clause is waived.
+#
+# 5. Names associated with Zope or Digital Creations must not be used to
+# endorse or promote products derived from this software without
+# prior written permission from Digital Creations.
+#
+# 6. Modified redistributions of any form whatsoever must retain
+# the following acknowledgment:
+#
+# "This product includes software developed by Digital Creations
+# for use in the Z Object Publishing Environment
+# (http://www.zope.org/)."
+#
+# Intact (re-)distributions of any official Zope release do not
+# require an external acknowledgement.
+#
+# 7. Modifications are encouraged but must be packaged separately as
+# patches to official Zope releases. Distributions that do not
+# clearly separate the patches from the original work must be clearly
+# labeled as unofficial distributions. Modifications which do not
+# carry the name Zope may be packaged in any form, as long as they
+# conform to all of the clauses above.
+#
+#
+# Disclaimer
+#
+# THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY
+# EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIGITAL CREATIONS OR ITS
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+#
+# This software consists of contributions made by Digital Creations and
+# many individuals on behalf of Digital Creations. Specific
+# attributions are listed in the accompanying credits file.
+#
+##############################################################################
+
+import HTMLClass, DocumentClass
+import ClassicDocumentClass
+from StructuredText import html_with_references, HTML
+from ST import Basic
+import DocBookClass
+import HTMLWithImages
+import DocumentWithImages
+
+ClassicHTML=HTML
+HTMLNG=HTMLClass.HTMLClass()
+
+def HTML(src, level=0, type=type, StringType=type('')):
+ if type(src) is StringType:
+ return ClassicHTML(src, level)
+ return HTMLNG(src, level)
+
+Classic=ClassicDocumentClass.DocumentClass()
+Document=DocumentClass.DocumentClass()
+DocumentWithImages=DocumentWithImages.DocumentWithImages()
+HTMLWithImages=HTMLWithImages.HTMLWithImages()
+
+DocBookBook=DocBookClass.DocBookBook
+DocBookChapter=DocBookClass.DocBookChapter()
+DocBookChapterWithFigures=DocBookClass.DocBookChapterWithFigures()
+DocBookArticle=DocBookClass.DocBookArticle()
+
+
--- /dev/null
+##############################################################################
+#
+# Zope Public License (ZPL) Version 1.0
+# -------------------------------------
+#
+# Copyright (c) Digital Creations. All rights reserved.
+#
+# This license has been certified as Open Source(tm).
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met:
+#
+# 1. Redistributions in source code must retain the above copyright
+# notice, this list of conditions, and the following disclaimer.
+#
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions, and the following disclaimer in
+# the documentation and/or other materials provided with the
+# distribution.
+#
+# 3. Digital Creations requests that attribution be given to Zope
+# in any manner possible. Zope includes a "Powered by Zope"
+# button that is installed by default. While it is not a license
+# violation to remove this button, it is requested that the
+# attribution remain. A significant investment has been put
+# into Zope, and this effort will continue if the Zope community
+# continues to grow. This is one way to assure that growth.
+#
+# 4. All advertising materials and documentation mentioning
+# features derived from or use of this software must display
+# the following acknowledgement:
+#
+# "This product includes software developed by Digital Creations
+# for use in the Z Object Publishing Environment
+# (http://www.zope.org/)."
+#
+# In the event that the product being advertised includes an
+# intact Zope distribution (with copyright and license included)
+# then this clause is waived.
+#
+# 5. Names associated with Zope or Digital Creations must not be used to
+# endorse or promote products derived from this software without
+# prior written permission from Digital Creations.
+#
+# 6. Modified redistributions of any form whatsoever must retain
+# the following acknowledgment:
+#
+# "This product includes software developed by Digital Creations
+# for use in the Z Object Publishing Environment
+# (http://www.zope.org/)."
+#
+# Intact (re-)distributions of any official Zope release do not
+# require an external acknowledgement.
+#
+# 7. Modifications are encouraged but must be packaged separately as
+# patches to official Zope releases. Distributions that do not
+# clearly separate the patches from the original work must be clearly
+# labeled as unofficial distributions. Modifications which do not
+# carry the name Zope may be packaged in any form, as long as they
+# conform to all of the clauses above.
+#
+#
+# Disclaimer
+#
+# THIS SOFTWARE IS PROVIDED BY DIGITAL CREATIONS ``AS IS'' AND ANY
+# EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL DIGITAL CREATIONS OR ITS
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+#
+# This software consists of contributions made by Digital Creations and
+# many individuals on behalf of Digital Creations. Specific
+# attributions are listed in the accompanying credits file.
+#
+##############################################################################
+"""Provide a thread-safe interface to regex
+"""
+import regex, regsub #, Sync
+from regex import *
+from regsub import split, sub, gsub, splitx, capwords
+
+try:
+ import thread
+except:
+ class allocate_lock:
+ def acquire(*args): pass
+ def release(*args): pass
+
+else:
+ class SafeFunction:
+ _l=thread.allocate_lock()
+ _a=_l.acquire
+ _r=_l.release
+
+ def __init__(self, f):
+ self._f=f
+
+ def __call__(self, *args, **kw):
+ self._a()
+ try: return apply(self._f, args, kw)
+ finally: self._r()
+
+ split=SafeFunction(split)
+ sub=SafeFunction(sub)
+ gsub=SafeFunction(gsub)
+ splitx=SafeFunction(splitx)
+ capwords=SafeFunction(capwords)
+
+ allocate_lock=thread.allocate_lock
+
+class compile:
+
+ _r=None
+ groupindex=None
+
+ def __init__(self, *args):
+ self._r=r=apply(regex.compile,args)
+ self._init(r)
+
+ def _init(self, r):
+ lock=allocate_lock()
+ self.__a=lock.acquire
+ self.__r=lock.release
+ self.translate=r.translate
+ self.givenpat=r.givenpat
+ self.realpat=r.realpat
+
+ def match(self, string, pos=0):
+ self.__a()
+ try: return self._r.match(string, pos)
+ finally: self.__r()
+
+ def search(self, string, pos=0):
+ self.__a()
+ try: return self._r.search(string, pos)
+ finally: self.__r()
+
+ def search_group(self, str, group, pos=0):
+ """Search a string for a pattern.
+
+ If the pattern was not found, then None is returned,
+ otherwise, the location where the pattern was found,
+ as well as any specified group are returned.
+ """
+ self.__a()
+ try:
+ r=self._r
+ l=r.search(str, pos)
+ if l < 0: return None
+ return l, apply(r.group, group)
+ finally: self.__r()
+
+ def match_group(self, str, group, pos=0):
+ """Match a pattern against a string
+
+ If the string does not match the pattern, then None is
+ returned, otherwise, the length of the match, as well
+ as any specified group are returned.
+ """
+ self.__a()
+ try:
+ r=self._r
+ l=r.match(str, pos)
+ if l < 0: return None
+ return l, apply(r.group, group)
+ finally: self.__r()
+
+ def search_regs(self, str, pos=0):
+ """Search a string for a pattern.
+
+ If the pattern was not found, then None is returned,
+ otherwise, the 'regs' attribute of the expression is
+ returned.
+ """
+ self.__a()
+ try:
+ r=self._r
+ r.search(str, pos)
+ return r.regs
+ finally: self.__r()
+
+ def match_regs(self, str, pos=0):
+ """Match a pattern against a string
+
+ If the string does not match the pattern, then None is
+ returned, otherwise, the 'regs' attribute of the expression is
+ returned.
+ """
+ self.__a()
+ try:
+ r=self._r
+ r.match(str, pos)
+ return r.regs
+ finally: self.__r()
+
+class symcomp(compile):
+
+ def __init__(self, *args):
+ self._r=r=apply(regex.symcomp,args)
+ self._init(r)
+ self.groupindex=r.groupindex
+
+
+
+
+
--- /dev/null
+#!/usr/bin/env python
+#----------------------------------------------------------------------
+
+import sys, os
+import StructuredText
+from wxPython.wx import *
+
+
+USE_WXHTML = 1
+
+
+if not USE_WXHTML:
+ try: # try to load the IE ActiveX control
+ from wxPython.lib.activexwrapper import MakeActiveXClass
+ import win32com.client.gencache
+ browserModule = win32com.client.gencache.EnsureModule(
+ "{EAB22AC0-30C1-11CF-A7EB-0000C05BAE0B}", 0, 1, 1)
+ except:
+ USE_WXHTML = 1
+
+if not USE_WXHTML:
+ BrowserClass = MakeActiveXClass(browserModule.WebBrowser)
+
+ class MyHtmlWindow(BrowserClass):
+ def SetPage(self, html):
+ import tempfile
+ filename = tempfile.mktemp('.html')
+ f = open(filename, 'w')
+ f.write(html)
+ f.close()
+ self.Navigate(os.path.abspath(filename))
+ self.filename = filename
+
+ def OnDocumentComplete(self, pDisp=None, URL=None):
+ os.unlink(self.filename)
+
+else:
+ from wxPython.html import *
+ MyHtmlWindow = wxHtmlWindow
+
+
+
+class StxFrame(wxFrame):
+ title = "StxViewer"
+ def __init__(self, stxFile):
+ wxFrame.__init__(self, None, -1, self.title, size=(650, 700),
+ style=wxDEFAULT_FRAME_STYLE|wxNO_FULL_REPAINT_ON_RESIZE)
+
+ ##self.CreateStatusBar()
+
+ menu = wxMenu()
+ menu.Append(10, "&Open\tCtrl-O", "Open a Structured Text file")
+ EVT_MENU(self, 10, self.OnOpen)
+ menu.Append(20, "&Close", "Close the current file")
+ EVT_MENU(self, 20, self.OnClose)
+ menu.Append(30, "&Save\tCtrl-S", "Save the current file")
+ EVT_MENU(self, 30, self.OnSave)
+ menu.Append(40, "Save &as", "Save the current file to a new name")
+ EVT_MENU(self, 40, self.OnSaveAs)
+ menu.Append(45, "Save as &html", "Save the current file as HTML")
+ EVT_MENU(self, 45, self.OnSaveAsHTML)
+ menu.AppendSeparator()
+ menu.Append(50, "&Refresh\tCtrl-R", "Reload the file from disk")
+ EVT_MENU(self, 50, self.OnRefresh)
+ menu.AppendSeparator()
+ menu.Append(60, "E&xit\tCtrl-X", "Close the application")
+ EVT_MENU(self, 60, self.OnExit)
+
+
+ menuBar = wxMenuBar()
+ menuBar.Append(menu, "&File")
+ self.SetMenuBar(menuBar)
+
+
+ nb = wxNotebook(self, -1)
+ EVT_NOTEBOOK_PAGE_CHANGED(self, -1, self.OnPageChanged)
+
+ self.htmlWin = MyHtmlWindow(nb, -1)
+ nb.AddPage(self.htmlWin, "View")
+
+ self.editWin = wxTextCtrl(nb, -1, "", style=wxTE_MULTILINE)
+ self.editWin.SetFont(wxFont(10, wxTELETYPE, wxNORMAL, wxNORMAL))
+ nb.AddPage(self.editWin, "Edit")
+
+ self.viewHtml = wxTextCtrl(nb, -1, "", style=wxTE_MULTILINE|wxTE_READONLY)
+ self.viewHtml.SetFont(wxFont(10, wxTELETYPE, wxNORMAL, wxNORMAL))
+ nb.AddPage(self.viewHtml, "HTML")
+
+ self.LoadStxFile(stxFile)
+
+
+ def LoadStxFile(self, stxFile):
+ self.file = stxFile
+ if stxFile is not None:
+ text = open(stxFile).read()
+ self.SetTitle(self.title + ': ' + stxFile)
+ else:
+ text = ""
+ self.SetTitle(self.title)
+ self.LoadStxText(text)
+
+
+ def LoadStxText(self, text):
+ # Old ST
+ html = str(StructuredText.html_with_references(text))
+
+ # NG Version
+ #st = StructuredText.Basic(text)
+ #doc = StructuredText.Document(st)
+ #html = StructuredText.HTML(doc)
+
+ self.htmlWin.SetPage(html)
+ self.editWin.SetValue(text)
+ self.viewHtml.SetValue(html)
+ self.html = html
+
+
+ def OnPageChanged(self, evt):
+ if evt.GetOldSelection() == 1: # if it was on the edit page
+ text = self.editWin.GetValue()
+ self.LoadStxText(text)
+
+
+ def OnOpen(self, evt):
+ dlg = wxFileDialog(self, defaultDir=os.getcwd(),
+ wildcard = "STX files (*.stx)|*.stx|"
+ "Text files (*.txt)|*.txt|"
+ "All files (*.*)|*.*",
+ style=wxOPEN)
+ if dlg.ShowModal() == wxID_OK:
+ self.LoadStxFile(dlg.GetPath())
+ dlg.Destroy()
+
+
+
+ def OnClose(self, evt):
+ self.LoadStxFile(None)
+
+
+ def OnSave(self, evt):
+ if not self.file:
+ self.OnSaveAs(evt)
+ else:
+ text = self.editWin.GetValue()
+ open(self.file, 'w').write(text)
+ self.LoadStxFile(self.file)
+
+
+ def OnSaveAs(self, evt):
+ dlg = wxFileDialog(self, "Save as...", defaultDir=os.getcwd(),
+ wildcard = "STX files (*.stx)|*.stx|"
+ "Text files (*.txt)|*.txt|"
+ "All files (*.*)|*.*",
+ style=wxSAVE)
+ if dlg.ShowModal() == wxID_OK:
+ file = dlg.GetPath()
+ text = self.editWin.GetValue()
+ open(file, 'w').write(text)
+ self.LoadStxFile(file)
+ dlg.Destroy()
+
+
+ def OnSaveAsHTML(self, evt):
+ dlg = wxFileDialog(self, "Save as...", defaultDir=os.getcwd(),
+ wildcard = "HTML files (*.html)|*.html|"
+ "All files (*.*)|*.*",
+ style=wxSAVE)
+ if dlg.ShowModal() == wxID_OK:
+ file = dlg.GetPath()
+ text = self.editWin.GetValue()
+ self.LoadStxText(text)
+ open(file, 'w').write(self.html)
+ dlg.Destroy()
+
+
+
+ def OnRefresh(self, evt):
+ self.LoadStxFile(self.file)
+
+
+ def OnExit(self, evt):
+ self.Close(true)
+
+
+
+
+
+app = wxPySimpleApp()
+wxInitAllImageHandlers()
+
+if len(sys.argv) > 1:
+ filename = sys.argv[1]
+else:
+ filename = None
+
+frame = StxFrame(filename)
+frame.Show(true)
+app.MainLoop()
+
+
+
--- /dev/null
+Structured Text Manipulation
+
+ Parse a structured text string into a form that can be used with
+ structured formats, like html.
+
+ Structured text is text that uses indentation and simple
+ symbology to indicate the structure of a document.
+
+ A structured string consists of a sequence of paragraphs separated by
+ one or more blank lines. Each paragraph has a level which is defined
+ as the minimum indentation of the paragraph. A paragraph is a
+ sub-paragraph of another paragraph if the other paragraph is the last
+ preceding paragraph that has a lower level.
+
+Special symbology is used to indicate special constructs:
+
+ - A single-line paragraph whose immediately succeeding paragraphs are lower
+ level is treated as a header.
+
+ - A paragraph that begins with a '-', '*', or 'o' is treated as an
+ unordered list (bullet) element.
+
+ - A paragraph that begins with a sequence of digits followed by a
+ white-space character is treated as an ordered list element.
+
+ - A paragraph that begins with a sequence of sequences, where each
+ sequence is a sequence of digits or a sequence of letters followed
+ by a period, is treated as an ordered list element. If the sequence is
+ made up of lower-case i's and v's, a lower-case roman-numeral list is
+ generated. If the sequence is made up of upper-case I's and V's, an
+ upper-case roman-numeral list is generated. If the sequence is made
+ up of other lower case letters (typically a,b,c) a lowercase alphabetic
+ list is generated. If the sequence is made of of other upper case
+ letters (typically, A,B,C) an uppercase alphabetic list is generated.
+ If the sequence is something else (typically, 1,2,3), a arabic-numeral
+ list is generated.
+
+ - A paragraph with a first line that contains some text, followed by
+ some white-space and '--' is treated as a descriptive list element.
+ The leading text is treated as the element title.
+
+ - Sub-paragraphs of a paragraph that ends in the word 'example' or the
+ word 'examples', or '::' is treated as example code and is output as is.
+
+ - Text enclosed single quotes (with white-space to the left of the
+ first quote and whitespace or puctuation to the right of the second quote)
+ is treated as example code.
+
+ - Text surrounded by '*' characters (with white-space to the left of the
+ first '*' and whitespace or puctuation to the right of the second '*')
+ is *emphasized*.
+
+ - Text surrounded by '**' characters (with white-space to the left of the
+ first '**' and whitespace or puctuation to the right of the second '**')
+ is made **strong**.
+
+ - Text surrounded by '_' underscore characters (with whitespace to the left
+ and whitespace or punctuation to the right) is made _underlined_.
+
+ - Text encloded by double quotes followed by a colon, a URL, and concluded
+ by punctuation plus white space, *or* just white space, is treated as a
+ hyper link. For example:
+
+ '"Zope":http://www.zope.org/ is ...'
+
+ Is interpreted as '<a href="http://www.zope.org/">Zope</a> is ...'
+ Note: This works for relative as well as absolute URLs.
+
+ - Text enclosed by double quotes followed by a comma, one or more spaces,
+ an absolute URL and concluded by punctuation plus white space, or just
+ white space, is treated as a hyper link. For example:
+
+ "mail me", mailto:amos@digicool.com.
+
+ Is interpreted as '<a href="mailto:amos@digicool.com">mail me</a>.'
+
+ - Text enclosed in brackets which consists only of letters, digits,
+ underscores and dashes is treated as hyper links within the document.
+ For example:
+
+ As demonstrated by Smith [12] this technique is quite effective.
+
+ Is interpreted as '... by Smith <a href="#12">[12]</a> this ...'. Together
+ with the next rule this allows easy coding of references or end notes.
+
+ - Text enclosed in brackets which is preceded by the start of a line, two
+ periods and a space is treated as a named link. For example:
+
+ .. [12] "Effective Techniques" Smith, Joe ...
+
+ Is interpreted as '<a name="12">[12]</a> "Effective Techniques" ...'.
+ Together with the previous rule this allows easy coding of references or
+ end notes.
+
+
+ - A paragraph that has blocks of text enclosed in '||' is treated as a
+ table. The text blocks correspond to table cells and table rows are
+ denoted by newlines. By default the cells are center aligned. A cell
+ can span more than one column by preceding a block of text with an
+ equivalent number of cell separators '||'. Newlines and '|' cannot
+ be a part of the cell text. For example:
+
+ |||| **Ingredients** ||
+ || *Name* || *Amount* ||
+ ||Spam||10||
+ ||Eggs||3||
+
+ is interpreted as::
+
+ <TABLE BORDER=1 CELLPADDING=2>
+ <TR>
+ <TD ALIGN=CENTER COLSPAN=2> <strong>Ingredients</strong> </TD>
+ </TR>
+ <TR>
+ <TD ALIGN=CENTER COLSPAN=1> <em>Name</em> </TD>
+ <TD ALIGN=CENTER COLSPAN=1> <em>Amount</em> </TD>
+ </TR>
+ <TR>
+ <TD ALIGN=CENTER COLSPAN=1>Spam</TD>
+ <TD ALIGN=CENTER COLSPAN=1>10</TD>
+ </TR>
+ <TR>
+ <TD ALIGN=CENTER COLSPAN=1>Eggs</TD>
+ <TD ALIGN=CENTER COLSPAN=1>3</TD>
+ </TR>
+ </TABLE>
+
--- /dev/null
+This sample comes from an IBM developerWorks article at
+http://www-106.ibm.com/developerworks/library/l-wxpy/index.html
+
--- /dev/null
+#!/bin/python
+import sys, os
+from wxPython.wx import *
+from string import *
+
+# Process the command line. Not much to do;
+# just get the name of the project file if it's given. Simple.
+projfile = 'Unnamed'
+if len(sys.argv) > 1:
+ projfile = sys.argv[1]
+
+
+def MsgBox (window, string):
+ dlg=wxMessageDialog(window, string, 'wxProject', wxOK)
+ dlg.ShowModal()
+ dlg.Destroy()
+
+class main_window(wxFrame):
+ def __init__(self, parent, id, title):
+ wxFrame.__init__(self, parent, -1, title, size = (500, 500),
+ style=wxDEFAULT_FRAME_STYLE|wxNO_FULL_REPAINT_ON_RESIZE)
+
+
+ # ------------------------------------------------------------------------------------
+ # Set up menu bar for the program.
+ # ------------------------------------------------------------------------------------
+ self.mainmenu = wxMenuBar() # Create menu bar.
+ mainwindow = self
+
+ menu=wxMenu() # Make a menu (will be the Project menu)
+
+ exitID=wxNewId() # Make a new ID for a menu entry.
+ menu.Append(exitID, '&Open', 'Open project') # Name the ID by adding it to the menu.
+ EVT_MENU(self, exitID, self.OnProjectOpen) # Create and assign a menu event.
+ exitID=wxNewId()
+ menu.Append(exitID, '&New', 'New project')
+ EVT_MENU(self, exitID, self.OnProjectNew)
+ exitID=wxNewId()
+ menu.Append(exitID, 'E&xit', 'Exit program')
+ EVT_MENU(self, exitID, self.OnProjectExit)
+
+ self.mainmenu.Append (menu, '&Project') # Add the project menu to the menu bar.
+
+
+ menu=wxMenu() # Make a menu (will be the File menu)
+
+ exitID=wxNewId()
+ menu.Append(exitID, '&Add', 'Add file to project')
+ EVT_MENU(self, exitID, self.OnFileAdd)
+ exitID=wxNewId()
+ menu.Append(exitID, '&Remove', 'Remove file from project')
+ EVT_MENU(self, exitID, self.OnFileRemove)
+ exitID=wxNewId()
+ menu.Append(exitID, '&Open', 'Open file for editing')
+ EVT_MENU(self, exitID, self.OnFileOpen)
+ exitID=wxNewId()
+ menu.Append(exitID, '&Save', 'Save file')
+ EVT_MENU(self, exitID, self.OnFileSave)
+
+ self.mainmenu.Append (menu, '&File') # Add the file menu to the menu bar.
+
+ self.SetMenuBar (self.mainmenu) # Attach the menu bar to the window.
+
+
+ # ------------------------------------------------------------------------------------
+ # Create the splitter window.
+ # ------------------------------------------------------------------------------------
+ splitter = wxSplitterWindow (self, -1, style=wxNO_3D|wxSP_3D)
+ splitter.SetMinimumPaneSize (1)
+
+ # ------------------------------------------------------------------------------------
+ # Create the tree on the left.
+ # ------------------------------------------------------------------------------------
+ tID = wxNewId()
+ self.tree = wxTreeCtrl (splitter, tID, style=wxTR_HAS_BUTTONS |
+ wxTR_EDIT_LABELS |
+ wxTR_HAS_VARIABLE_ROW_HEIGHT)
+ EVT_TREE_BEGIN_LABEL_EDIT(self.tree, tID, self.OnTreeLabelEdit)
+ EVT_TREE_END_LABEL_EDIT(self.tree, tID, self.OnTreeLabelEditEnd)
+ EVT_TREE_ITEM_ACTIVATED(self.tree, tID, self.OnTreeItemActivated)
+
+ # ------------------------------------------------------------------------------------
+ # Create the editor on the right.
+ # ------------------------------------------------------------------------------------
+ self.editor = wxTextCtrl(splitter, -1, style=wxTE_MULTILINE)
+ self.editor.Enable (0)
+
+ # ------------------------------------------------------------------------------------
+ # Install the tree and the editor.
+ # ------------------------------------------------------------------------------------
+ splitter.SplitVertically (self.tree, self.editor)
+ splitter.SetSashPosition (180, true)
+
+ self.Show(true)
+
+ # Some global state variables.
+ self.projectdirty = false
+
+ # ----------------------------------------------------------------------------------------
+ # Some nice little handlers.
+ # ----------------------------------------------------------------------------------------
+
+
+ def project_open(self, project_file):
+ try:
+ input = open (project_file, 'r')
+
+ self.tree.DeleteAllItems()
+
+ self.project_file = project_file
+ name = replace (input.readline(), "\n", "")
+ self.SetTitle (name)
+ self.root = self.tree.AddRoot(name)
+ self.activeitem = self.root
+ for line in input.readlines():
+ self.tree.AppendItem (self.root, replace(line, "\n", ""))
+ input.close
+ self.tree.Expand (self.root)
+
+ self.editor.Clear()
+ self.editor.Enable (false)
+
+ self.projectdirty = false
+ except IOError:
+ pass
+
+ def project_save(self):
+ try:
+ output = open (self.project_file, 'w+')
+ output.write (self.tree.GetItemText (self.root) + "\n")
+
+ count = self.tree.GetChildrenCount (self.root)
+ iter = 0
+ child = ''
+ for i in range(count):
+ if i == 0:
+ (child,iter) = self.tree.GetFirstChild(self.root,iter)
+ else:
+ (child,iter) = self.tree.GetNextChild(self.root,iter)
+ output.write (self.tree.GetItemText(child) + "\n")
+ output.close()
+ self.projectdirty = false
+ except IOError:
+ dlg_m = wxMessageDialog (self, 'There was an error saving the project file.',
+ 'Error!', wxOK)
+ dlg_m.ShowModal()
+ dlg_m.Destroy()
+
+ # ----------------------------------------------------------------------------------------
+ # Event handlers from here on out.
+ # ----------------------------------------------------------------------------------------
+
+ def OnProjectOpen(self, event):
+ open_it = true
+ if self.projectdirty:
+ dlg=wxMessageDialog(self, 'The project has been changed. Save?', 'wxProject',
+ wxYES_NO | wxCANCEL)
+ result = dlg.ShowModal()
+ if result == wxID_YES:
+ self.project_save()
+ if result == wxID_CANCEL:
+ open_it = false
+ dlg.Destroy()
+ if open_it:
+ dlg = wxFileDialog(self, "Choose a project to open", ".", "", "*.wxp", wxOPEN)
+ if dlg.ShowModal() == wxID_OK:
+ self.project_open(dlg.GetPath())
+ dlg.Destroy()
+
+ def OnProjectNew(self, event):
+ open_it = true
+ if self.projectdirty:
+ dlg=wxMessageDialog(self, 'The project has been changed. Save?', 'wxProject',
+ wxYES_NO | wxCANCEL)
+ result = dlg.ShowModal()
+ if result == wxID_YES:
+ self.project_save()
+ if result == wxID_CANCEL:
+ open_it = false
+ dlg.Destroy()
+
+ if open_it:
+ dlg = wxTextEntryDialog (self, "Name for new project:", "New Project",
+ "New project", wxOK | wxCANCEL)
+ if dlg.ShowModal() == wxID_OK:
+ newproj = dlg.GetValue()
+ dlg.Destroy()
+ dlg = wxFileDialog (self, "Place to store new project", ".", "", "*.wxp",
+ wxSAVE)
+ if dlg.ShowModal() == wxID_OK:
+ try:
+ proj = open (dlg.GetPath(), 'w')
+ proj.write (newproj + "\n")
+ proj.close()
+ self.project_open (dlg.GetPath())
+ except IOError:
+ dlg_m = wxMessageDialog (self,
+ 'There was an error saving the new project file.',
+ 'Error!', wxOK)
+ dlg_m.ShowModal()
+ dlg_m.Destroy()
+ dlg.Destroy()
+
+ def OnProjectExit(self, event):
+ close = true
+ if self.projectdirty:
+ dlg=wxMessageDialog(self, 'The project has been changed. Save?', 'wxProject',
+ wxYES_NO | wxCANCEL)
+ result = dlg.ShowModal()
+ if result == wxID_YES:
+ self.project_save()
+ if result == wxID_CANCEL:
+ close = false
+ dlg.Destroy()
+ if close:
+ self.Close()
+
+ def OnFileAdd(self, event):
+ dlg = wxFileDialog (self, "Choose a file to add", ".", "", "*.*", wxOPEN)
+ if dlg.ShowModal() == wxID_OK:
+ path = os.path.split(dlg.GetPath())
+ self.tree.AppendItem (self.root, path[1])
+ self.tree.Expand (self.root)
+ self.project_save()
+
+ def OnFileRemove(self, event):
+ item = self.tree.GetSelection()
+ if item != self.root:
+ self.tree.Delete (item)
+ self.project_save()
+
+ def OnFileOpen(self, event):
+ item = self.tree.GetSelection()
+
+ def OnFileSave(self, event):
+ if self.activeitem != self.root:
+ self.editor.SaveFile (self.tree.GetItemText (self.activeitem))
+
+
+ def OnTreeLabelEdit(self, event):
+ item=event.GetItem()
+ if item != self.root:
+ event.Veto()
+
+ def OnTreeLabelEditEnd(self, event):
+ self.projectdirty = true
+
+ def OnTreeItemActivated(self, event):
+ go_ahead = true
+ if self.activeitem != self.root:
+ if self.editor.IsModified():
+ dlg=wxMessageDialog(self, 'The edited file has changed. Save it?',
+ 'wxProject', wxYES_NO | wxCANCEL)
+ result = dlg.ShowModal()
+ if result == wxID_YES:
+ self.editor.SaveFile (self.tree.GetItemText (self.activeitem))
+ if result == wxID_CANCEL:
+ go_ahead = false
+ dlg.Destroy()
+ if go_ahead:
+ self.tree.SetItemBold (self.activeitem, 0)
+
+ if go_ahead:
+ item=event.GetItem()
+ self.activeitem = item
+ if item != self.root:
+ self.tree.SetItemBold (item, 1)
+ self.editor.Enable (1)
+ self.editor.LoadFile (self.tree.GetItemText(item))
+ self.editor.SetInsertionPoint (0)
+ self.editor.SetFocus()
+ else:
+ self.editor.Clear()
+ self.editor.Enable (0)
+
+class App(wxApp):
+ def OnInit(self):
+ frame = main_window(None, -1, "wxProject - " + projfile)
+ self.SetTopWindow(frame)
+ if (projfile != 'Unnamed'):
+ frame.project_open (projfile)
+ return true
+
+app = App(0)
+app.MainLoop()
+