Subversion Repositories DevTools

Rev

Rev 6873 | Rev 6876 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 6873 Rev 6874
Line 39... Line 39...
39
canControl = canActionControlInProject("BuildControl")
39
canControl = canActionControlInProject("BuildControl")
40
'-------------------------------------------------
40
'-------------------------------------------------
41
' 
41
' 
42
Sub ShowDaemonStatus
42
Sub ShowDaemonStatus
43
%>
43
%>
44
<table class="embedded_table" style="margin-bottom:20px">
-
 
45
    <tr>
44
<div>
46
        <td>
45
    <div class="panel">
47
            <table class="rounded_box embedded_table">
46
        <div class=rounded_box_caption>
48
                <caption>
-
 
49
                    <table align="center" class="full_table">
47
                <table align="center" class="full_table">
50
                       <tr>
48
                   <tr>
51
                          <td nowrap class="form_ttl"><p>DAEMON STATUS INFORMATION</p>
49
                      <td nowrap class="form_ttl">DAEMON STATUS INFORMATION
52
                          </td>
50
                      </td>
53
                          <td  valign="bottom" class="body_rowg">
51
                      <td  valign="bottom" class="body_rowg">
54
                            Last Build: <%=GetLastBuildAge(parRtagId)%> [<%=GetModifiedSeqNo(parRtagId)%>]
52
                        Last Build: <%=GetLastBuildAge(parRtagId)%> [<%=GetModifiedSeqNo(parRtagId)%>]
55
                          </td>
53
                      </td>
56
                          <td align="right" valign="bottom">
54
                      <td align="right" valign="bottom">
57
                            <a class="txt_linked" href="<%=scriptName%>?rtag_id=<%=parRtagId%>" title="Refresh Page">[Refresh]</a>
55
                        <a class="txt_linked" href="<%=scriptName%>?rtag_id=<%=parRtagId%>" title="Refresh Page">[Refresh]</a>
58
                          </td>
56
                      </td>
59
                       </tr>
57
                   </tr>
60
                    </table>
58
                </table>
61
                </caption>
-
 
62
            <tr>
59
        </div>
63
                <td>
60
        <div class='rounded_box'>
64
                    <div class='round_box_pad'>
61
            <div  class=listPanel>
65
                        <!-- MESSAGE +++++++++++++++++++++++++++++++++++++++++++++++++++ -->
62
                <!-- MESSAGE +++++++++++++++++++++++++++++++++++++++++++++++++++ -->
66
                        <!--#include file="messages/_msg_inline.asp"-->
63
                <!--#include file="messages/_msg_inline.asp"-->
67
                        <!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
64
                <!-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -->
68
                        <br>
-
 
69
                        <table width="100%" border="0" cellspacing="2" cellpadding="0">
65
                <table width="100%" border="0" cellspacing="2" cellpadding="0">
70
                           <%
66
                   <%
71
                           Dim bInactiveMachine : bInactiveMachine = false
67
                   Dim bInactiveMachine : bInactiveMachine = false
72
                           Dim indefinitelyPaused : indefinitelyPaused = Indefinitely_Paused()
68
                   Dim indefinitelyPaused : indefinitelyPaused = Indefinitely_Paused()
73
                           ' Insert a warning into the page if the build daemons are indefintely paused.
69
                   ' Insert a warning into the page if the build daemons are indefintely paused.
74
                           If indefinitelyPaused Then %>
70
                   If indefinitelyPaused Then %>
75
                              <tr>
71
                      <tr>
76
                                 <span class='err_alert'>
72
                         <span class='err_alert'>
77
                                    <font size='2'><b>WARNING: Build Daemons are all stopped - please contact an administrator</b></font>
73
                            <font size='2'><b>WARNING: Build Daemons are all stopped - please contact an administrator</b></font>
78
                                 </span>
74
                         </span>
79
                              </tr>
75
                      </tr>
80
                           <%End If
76
                   <%End If
81
                           %>
77
                   %>
82
                           <td width="9%" valign="top"></td>
78
                   <td width="9%" valign="top"></td>
83
                           <tr>
79
                   <thead>
84
                              <td valign="top" nowrap class="body_lcol">Daemon Host</td>
80
                      <th>Daemon Host</th>
85
                              <td valign="top" nowrap class="body_lcol">Machine Type</td>
81
                      <th>Machine Type</th>
86
                              <td valign="top" nowrap class="body_lcol">Mode</td>
82
                      <th>Mode</th>
87
                              <td valign="top" nowrap class="body_lcol">Run Level</td>
83
                      <th>Run Level</th>
88
                              <td valign="top" nowrap class="body_lcol">Current Package</td>
84
                      <th>Current Package</th>
89
                              <td valign="top" nowrap class="body_lcol">Est Duration<%=Quick_Help("h_buildtime")%></td>
85
                      <th>Est Duration<%=Quick_Help("h_buildtime")%></th>
90
                              <td valign="top" nowrap class="body_lcol">Last Change<%=Quick_Help("h_lastchange")%></td>
86
                      <th>Last Change<%=Quick_Help("h_lastchange")%></th>
91
                              <td valign="top" nowrap class="body_lcol">Control State</td>
87
                      <th>Control State</th>
92
                           </tr>
88
                   </thead>
93
                           <%
89
                   <%
94
                           ' Get Build Information for this Release
90
                   ' Get Build Information for this Release
95
                           query_string = _
91
                   query_string = _
96
                                "SELECT rc.rcon_id, display_name, gbe_value, daemon_mode, NVL(ACTIVE, 'U') AS ACTIVE," &_
92
                        "SELECT rc.rcon_id, display_name, gbe_value, daemon_mode, NVL(ACTIVE, 'U') AS ACTIVE," &_
97
                                "       rl.pause, rl.current_run_level, rl.current_pkg_id_being_built, TRUNC (86400*(SYSDATE - rl.KEEP_ALIVE)) AS delta," &_
93
                        "       rl.pause, rl.current_run_level, rl.current_pkg_id_being_built, TRUNC (86400*(SYSDATE - rl.KEEP_ALIVE)) AS delta," &_
98
                                "       pk.pkg_name, rl.current_pv_id, pv.build_time, TRUNC (86400*(SYSDATE - rl.LAST_BUILD)) AS build_delta" &_
94
                        "       pk.pkg_name, rl.current_pv_id, pv.build_time, TRUNC (86400*(SYSDATE - rl.LAST_BUILD)) AS build_delta" &_
99
                                " FROM release_config rc," &_
95
                        " FROM release_config rc," &_
100
                                "   gbe_machtype gm," &_
96
                        "   gbe_machtype gm," &_
101
                                "   build_machine_config bm," &_
97
                        "   build_machine_config bm," &_
102
                                "   run_level rl," &_
98
                        "   run_level rl," &_
103
                                "   packages pk," &_
99
                        "   packages pk," &_
104
                                "   package_versions pv" &_
100
                        "   package_versions pv" &_
105
                                " WHERE rc.rtag_id     = " & parRtagId &_
101
                        " WHERE rc.rtag_id     = " & parRtagId &_
106
                                "  AND gm.gbe_id        = rc.gbe_id" &_
102
                        "  AND gm.gbe_id        = rc.gbe_id" &_
107
                                "  AND rl.rcon_id(+)       = rc.rcon_id" &_
103
                        "  AND rl.rcon_id(+)    = rc.rcon_id" &_
108
                                "  AND rc.bmcon_id      =bm.bmcon_id(+)" &_
104
                        "  AND rc.bmcon_id      =bm.bmcon_id(+)" &_
109
                                "  AND pk.pkg_id(+)     = rl.current_pkg_id_being_built" &_
105
                        "  AND pk.pkg_id(+)     = rl.current_pkg_id_being_built" &_
110
                                "  AND rl.current_pv_id = pv.pv_id(+)" &_
106
                        "  AND rl.current_pv_id = pv.pv_id(+)" &_
111
                                " ORDER BY bm.display_name, rc.rcon_id"
107
                        " ORDER BY bm.display_name, rc.rcon_id"
112
 
108
 
113
                           Set rsQry = OraDatabase.DbCreateDynaset( query_string, ORADYN_DEFAULT )
109
                   Set rsQry = OraDatabase.DbCreateDynaset( query_string, ORADYN_DEFAULT )
114
 
110
 
115
                           Do While (NOT rsQry.BOF) AND (NOT rsQry.EOF)
111
                   Do While (NOT rsQry.BOF) AND (NOT rsQry.EOF)
116
                              Dim pkgName
112
                      Dim pkgName
117
                              Dim pkgPvid
113
                      Dim pkgPvid
118
                              Dim pkgBuildTime
114
                      Dim pkgBuildTime
119
                              Dim currentRunLevel
115
                      Dim currentRunLevel
120
                              Dim daemonState
116
                      Dim daemonState
121
                              Dim delta
117
                      Dim delta
122
                              Dim PkgBuildDelta
118
                      Dim PkgBuildDelta
123
                              Dim pkgId
119
                      Dim pkgId
124
                              Dim bActive
120
                      Dim bActive
125
                              Dim estDuration
121
                      Dim estDuration
126
                              Dim daemonMode 
122
                      Dim daemonMode 
127
                              Dim lastChange
123
                      Dim lastChange
128
 
124
 
129
                              rcon_id = rsQry("rcon_id")
125
                      rcon_id = rsQry("rcon_id")
130
                              ' = rsQry("display_name")
126
                      ' = rsQry("display_name")
131
                              ' = rsQry("gbe_value")
127
                      ' = rsQry("gbe_value")
132
                              daemonMode = rsQry("daemon_mode")
128
                      daemonMode = rsQry("daemon_mode")
133
                              bActive = rsQry("ACTIVE")
129
                      bActive = rsQry("ACTIVE")
134
                              daemonState = rsQry("pause")
130
                      daemonState = rsQry("pause")
135
                              currentRunLevel = rsQry("current_run_level")
131
                      currentRunLevel = rsQry("current_run_level")
136
                              pkgId = rsQry("current_pkg_id_being_built")
132
                      pkgId = rsQry("current_pkg_id_being_built")
137
                              delta = rsQry("delta")
133
                      delta = rsQry("delta")
138
                              pkgName = rsQry("pkg_name")
134
                      pkgName = rsQry("pkg_name")
139
                              pkgPvid = rsQry("current_pv_id")
135
                      pkgPvid = rsQry("current_pv_id")
140
                              pkgBuildTime = rsQry("build_time")
136
                      pkgBuildTime = rsQry("build_time")
141
                              PkgBuildDelta = rsQry("build_delta")
137
                      PkgBuildDelta = rsQry("build_delta")
142
                              lastChange = NULL
138
                      lastChange = NULL
143
                              bInactiveMachine = FALSE
139
                      bInactiveMachine = FALSE
144
                              estDuration = NULL
140
                      estDuration = NULL
145
 
141
 
146
                              If bActive = "N" Then bInactiveMachine = true
142
                      If bActive = "N" Then bInactiveMachine = true
147
                              If IsNull(daemonState) Then daemonState = 0
143
                      If IsNull(daemonState) Then daemonState = 0
148
                              If daemonState = "2" Then pkgId = Null
144
                      If daemonState = "2" Then pkgId = Null
149
                              If IsNull(currentRunLevel) Then currentRunLevel = -1
145
                      If IsNull(currentRunLevel) Then currentRunLevel = -1
150
                              If daemonMode = "M" AND not IsNull(pkgName) Then estDuration = pkgBuildTime & "[" & PkgBuildDelta & "]"
146
                      If daemonMode = "M" AND not IsNull(pkgName) Then estDuration = pkgBuildTime & "[" & PkgBuildDelta & "]"
151
                              If bActive <> "U" Then lastChange = PrettyDelta(delta, daemonState,pkgName )
147
                      If bActive <> "U" Then lastChange = PrettyDelta(delta, daemonState,pkgName )
152
 
148
 
153
                              ' --- Now render HTML for this release configuration ---
149
                      ' --- Now render HTML for this release configuration ---
154
                              %>
150
                      %>
155
                              <tr>
-
 
156
                                 <td colspan="8" class=body_line></td>
-
 
157
                              </tr>
151
                      <tr class=border>
158
                              <tr>
-
 
159
                                 <td nowrap class="body_rowg"><%=rsQry("display_name")%></td>
152
                         <td><%=rsQry("display_name")%></td>
160
                                 <td nowrap class="body_rowg"><%=rsQry("gbe_value")%></td>
153
                         <td><%=rsQry("gbe_value")%></td>
161
                                 <td nowrap class="body_rowg"><%=Get_Daemon_Mode(daemonMode)%></td>
154
                         <td><%=Get_Daemon_Mode(daemonMode)%></td>
162
                                 <td nowrap class="body_rowg"><%=Get_Run_Level(currentRunLevel, indefinitelyPaused, daemonState, bActive)%></td>
155
                         <td><%=Get_Run_Level(currentRunLevel, indefinitelyPaused, daemonState, bActive)%></td>
163
                                 <td nowrap class="body_rowg"><%=Get_Package_Name(pkgName,parRtagId,pkgPvid, daemonState, bActive)%></td>
156
                         <td><%=Get_Package_Name(pkgName,parRtagId,pkgPvid, daemonState, bActive)%></td>
164
                                 <td nowrap class="body_rowg"><%=estDuration%></td>
157
                         <td><%=estDuration%></td>
165
                                 <td nowrap class="body_rowg"><%=lastChange%></td>
158
                         <td><%=lastChange%></td>
166
                                 <td nowrap class="body_rowg">
159
                         <td>
167
                                    <%
160
                            <%
168
                                    If NOT indefinitelyPaused  Then
161
                            If NOT indefinitelyPaused  Then
169
                                        If bActive = "U" Then
162
                                If bActive = "U" Then
170
                                        ElseIf bActive = "N" Then
163
                                ElseIf bActive = "N" Then
171
                                            Call Action_Buttons ( "Daemon Unavailable" )
164
                                    Call Action_Buttons ( "Daemon Unavailable" )
172
                                        ElseIf daemonState = 0 Then
165
                                ElseIf daemonState = 0 Then
173
                                            Call Action_Buttons_State ( "Daemon Pause", canControl )
166
                                    Call Action_Buttons_State ( "Daemon Pause", canControl )
174
                                        ElseIf daemonState = 1 Then
167
                                ElseIf daemonState = 1 Then
175
                                            Call Action_Buttons_State ( "Daemon Resume", canControl )
168
                                    Call Action_Buttons_State ( "Daemon Resume", canControl )
176
                                        ElseIf daemonState = 2 Then
169
                                ElseIf daemonState = 2 Then
177
                                            Call Action_Buttons_State ( "Daemon Start", canControl )
170
                                    Call Action_Buttons_State ( "Daemon Start", canControl )
178
                                        Else
171
                                Else
179
                                            Call Action_Buttons_State ( "Daemon Resume", canControl )
172
                                    Call Action_Buttons_State ( "Daemon Resume", canControl )
180
                                      End If
173
                              End If
181
                                    Else
174
                            Else
182
                                       %>Unavailable<%
175
                               %>Unavailable<%
183
                                    End If
176
                            End If
184
                                    %>
177
                            %>
185
                                 </td>
178
                         </td>
186
                              </tr>
179
                      </tr>
187
                              <%
180
                      <%
188
                              rsQry.MoveNext
181
                      rsQry.MoveNext
189
                           Loop
182
                   Loop
190
                           %>
183
                   %>
191
                           <tr class=form_bg_light>
184
                   <tr class=foot>
192
                             <td nowrap class="body_col" colspan=7>
185
                     <td colspan=7>
193
                             <%If CheckConfigErrors(parRtagId) OR bInactiveMachine Then%><span class="err_alert">&nbsp;Daemon configuration errors detected</span>
186
                     <%If CheckConfigErrors(parRtagId) OR bInactiveMachine Then%><span class="err_alert">&nbsp;Daemon configuration errors detected</span>
194
                                <a class="txt_linked" href="release_config.asp?rtag_id=<%=parRtagId%>">
187
                        <a class="txt_linked" href="release_config.asp?rtag_id=<%=parRtagId%>">
195
                                    <img src="images/i_link.gif" hspace="2" border="0" align="absmiddle" title="Goto Configuration">
188
                            <img src="images/i_link.gif" hspace="2" border="0" align="absmiddle" title="Goto Configuration">
196
                                </a>
189
                        </a>
197
                             <%End If%>
190
                     <%End If%>
198
                             </td>
191
                     </td>
199
                             <td valign="bottom" nowrap class="body_col">
192
                     <td>
200
                             <%
193
                     <%
201
                               If (rsQry.RecordCount > 0) AND NOT indefinitelyPaused Then
194
                       If (rsQry.RecordCount > 0) AND NOT indefinitelyPaused Then
202
                                   Call Action_Buttons_State ( "Daemon Control All", objAccessControl.UserLogedIn AND canControl )
195
                           Call Action_Buttons_State ( "Daemon Control All", objAccessControl.UserLogedIn AND canControl )
203
                               Else
196
                       Else
204
                                 %>&nbsp<%
197
                         %>&nbsp<%
205
                               End If
198
                       End If
206
                             %>
199
                     %>
207
                             </td>
200
                     </td>
208
                           </tr>
201
                   </tr>
209
                           <%
202
                   <%
210
                             rsQry.Close()
203
                     rsQry.Close()
211
                             Set rsQry = nothing
204
                     Set rsQry = nothing
212
                           %>
-
 
213
                        </table>
-
 
214
                    </div>
205
                   %>
215
                </td>
206
                </table>
216
            </tr>
207
            </div>
217
        </table>
208
        </div>
218
    </td>
209
    </div>
219
</table>
210
</div>
220
<%
211
<%
221
End Sub
212
End Sub
222
'-------------------------------------------------
213
'-------------------------------------------------
223
' 
214
' 
224
Sub ShowBuildPlan
215
Sub ShowBuildPlan
225
%>
-
 
226
<!-- Planned Builds Display -->
-
 
227
<table class="embedded_table" style="margin-bottom:20px;min-width:470px">
-
 
228
<%
-
 
229
Set rsQry = OraDatabase.DbCreateDynaset( "SELECT TRUNC (86400*(SYSDATE - rl.LAST_BUILD)) as delta, rl.LAST_BUILD as BuildStart, rl.current_pv_id, SYSDATE" &_
216
Set rsQry = OraDatabase.DbCreateDynaset( "SELECT TRUNC (86400*(SYSDATE - rl.LAST_BUILD)) as delta, rl.LAST_BUILD as BuildStart, rl.current_pv_id, SYSDATE" &_
230
                                        " FROM release_config rc,  run_level rl " &_
217
                                        " FROM release_config rc,  run_level rl " &_
231
                                        " WHERE rc.rtag_id   = " & parRtagId &_
218
                                        " WHERE rc.rtag_id   = " & parRtagId &_
232
                                        " AND rc.daemon_mode = 'M' AND rl.rcon_id(+) = rc.rcon_id", ORADYN_DEFAULT )
219
                                        " AND rc.daemon_mode = 'M' AND rl.rcon_id(+) = rc.rcon_id", ORADYN_DEFAULT )
233
Dim BuildStart
220
Dim BuildStart
Line 241... Line 228...
241
    BuildNow  = rsQry("SYSDATE")
228
    BuildNow  = rsQry("SYSDATE")
242
End If
229
End If
243
rsQry.Close()
230
rsQry.Close()
244
Set rsQry = nothing
231
Set rsQry = nothing
245
%>
232
%>
246
  <tr>
233
<!-- Planned Builds Display -->
247
    <td>
234
<div>
248
        <table  class="rounded_box embedded_table" width="100%">
-
 
249
            <caption>
235
<div class=panel>
250
                DAEMON BUILD PLAN<%=Quick_Help("h_buildplan")%>
-
 
251
                <span class="body_txt_gray nowrap tright">Now: <%=DisplayShortDateTimeSecs(BuildNow)%> AWST</span>
-
 
252
            </caption>
236
        <div class=rounded_box_caption>
253
             <td bgcolor="#FFFFFF"><img src="images/h_trsp_dot.gif" width="10" ></td>
-
 
254
             <td bgcolor="#FFFFFF" valign="top">
-
 
255
                <table width="100%" border="0" cellspacing="2" cellpadding="0">
237
                <table align="center" class="full_table">
256
                   <tr>
238
                   <tr>
257
                      <td align="left" nowrap background="images/bg_table_col.gif" class="body_col">Package</td>
-
 
258
                      <td align="left" nowrap background="images/bg_table_col.gif" class="body_col">Version</td>
-
 
259
                      <td align="left" nowrap background="images/bg_table_col.gif" class="body_col">Duration<%=Quick_Help("h_buildDuration")%></td>
239
                      <td nowrap class="form_ttl">DAEMON BUILD PLAN<%=Quick_Help("h_buildplan")%></td>
260
                      <td align="left" nowrap background="images/bg_table_col.gif" class="body_col">Build Completion<%=Quick_Help("h_buildEnd")%></td>
240
                      <td class="body_rowg" align="right" valign="bottom">Now: <%=DisplayShortDateTimeSecs(BuildNow)%> AWST</td>
261
                   </tr>
241
                   </tr>
-
 
242
                </table>
-
 
243
        </div>
-
 
244
        <div class="rounded_box">
-
 
245
            <div class='listPanel'>
-
 
246
                <table class='embedded_table'>
-
 
247
                   <thead>
-
 
248
                      <th>Package</th>
-
 
249
                      <th>Version</th>
-
 
250
                      <th>Duration<%=Quick_Help("h_buildDuration")%></th>
-
 
251
                      <th>Build Completion<%=Quick_Help("h_buildEnd")%></th>
-
 
252
                   </thead>
262
                   <%
253
                   <%
263
                   Dim PkgVersion, buildDuration, durationDisplay, durationText, completionText
254
                   Dim PkgVersion, buildDuration, durationDisplay, durationText, completionText
264
                   Set rsQry = OraDatabase.DbCreateDynaset( "SELECT p.PKG_NAME," &_
255
                   Set rsQry = OraDatabase.DbCreateDynaset( "SELECT p.PKG_NAME," &_
265
                                                            "  pv.PKG_VERSION, pv.BUILD_TIME," &_
256
                                                            "  pv.PKG_VERSION, pv.BUILD_TIME," &_
266
                                                            "  bp.PV_ID" &_
257
                                                            "  bp.PV_ID" &_
Line 301... Line 292...
301
                            durationText = "&nbsp;~"
292
                            durationText = "&nbsp;~"
302
                      End If
293
                      End If
303
 
294
 
304
                      BuildStart = DateAdd("s", buildDuration, BuildStart)
295
                      BuildStart = DateAdd("s", buildDuration, BuildStart)
305
                      %>
296
                      %>
306
                      <tr align="left" valign="top" class="body_txt">
297
                      <tr class=border>
307
                         <td><%=Get_Package_Name(rsQry("PKG_NAME"), parRtagId, rsQry("PV_ID"), 0, "Y")%></td>
298
                         <td><%=Get_Package_Name(rsQry("PKG_NAME"), parRtagId, rsQry("PV_ID"), 0, "Y")%></td>
308
                         <td><%=rsQry("PKG_VERSION")%></td>
299
                         <td><%=rsQry("PKG_VERSION")%></td>
309
                         <td><%=durationDisplay%></td>
300
                         <td><%=durationDisplay%></td>
310
                         <td><%=DisplayShortDateTimeSecs(BuildStart) & durationText  & completionText%></td>
301
                         <td><%=DisplayShortDateTimeSecs(BuildStart) & durationText  & completionText%></td>
311
                      </tr>
302
                      </tr>
312
                      <tr>
-
 
313
                         <td colspan="6" background="images/bg_rep_line.gif"><img src="images/spacer.gif" width="1" height="1"></td>
-
 
314
                      </tr>
-
 
315
                      <%
303
                      <%
316
                      ' Allow for 20 seconds of planning between builds
304
                      ' Allow for 20 seconds of planning between builds
317
                      BuildStart = DateAdd("s", 20, BuildStart)
305
                      BuildStart = DateAdd("s", 20, BuildStart)
318
                      rsQry.MoveNext()
306
                      rsQry.MoveNext()
319
                   Wend
307
                   Wend
320
                   rsQry.Close()
308
                   rsQry.Close()
321
                   Set rsQry = nothing
309
                   Set rsQry = nothing
322
                   %>
310
                   %>
323
                </table>
311
                </table>
324
            </td>
312
            </div>
325
            <td background="images/lbox_bgside_white.gif">&nbsp;</td>
-
 
326
        </table>
313
        </div>
327
    </td>
314
    </div>
328
  </tr>
-
 
329
</table>
315
</div>
330
<%
316
<%
331
End Sub
317
End Sub
332
'-------------------------------------------------
318
'-------------------------------------------------
333
'
319
'
334
%>
320
%>