|
@@ -27,7 +27,7 @@
|
|
|
%>
|
|
%>
|
|
|
|
|
|
|
|
<%def name="task_table(dom_id, tasks)">
|
|
<%def name="task_table(dom_id, tasks)">
|
|
|
- <table id="${ dom_id }" class="taskTable table table-striped table-condensed">
|
|
|
|
|
|
|
+ <table id="${ dom_id }" class="taskTable table table-condensed">
|
|
|
<thead>
|
|
<thead>
|
|
|
<tr>
|
|
<tr>
|
|
|
<th>${_('Logs')}</th>
|
|
<th>${_('Logs')}</th>
|
|
@@ -106,225 +106,211 @@ ${ commonheader(_('Job: %(jobId)s') % dict(jobId=job.jobId_short), "jobbrowser",
|
|
|
</style>
|
|
</style>
|
|
|
|
|
|
|
|
<div class="container-fluid">
|
|
<div class="container-fluid">
|
|
|
- <h1>${_('Job: %(jobId)s - Job Browser') % dict(jobId=job.jobId_short)}</h1>
|
|
|
|
|
- <div class="row-fluid">
|
|
|
|
|
- <div class="span2">
|
|
|
|
|
- <div class="well sidebar-nav">
|
|
|
|
|
- <ul class="nav nav-list">
|
|
|
|
|
- <li class="nav-header">${_('Job ID')}</li>
|
|
|
|
|
- <li class="hellipsify">${job.jobId_short}</li>
|
|
|
|
|
- <li class="nav-header">${_('User')}</li>
|
|
|
|
|
- <li>${job.user}</li>
|
|
|
|
|
- <li class="nav-header">${_('Status')}</li>
|
|
|
|
|
- <li id="jobStatus"> </li>
|
|
|
|
|
- <li class="nav-header">${_('Logs')}</li>
|
|
|
|
|
- <li><a href="${ url('jobbrowser.views.job_single_logs', job=job.jobId) }"><i class="icon-tasks"></i> ${_('Logs')}</a></li>
|
|
|
|
|
-
|
|
|
|
|
- % if not job.is_retired:
|
|
|
|
|
- <li class="nav-header">${_('Maps:')}</li>
|
|
|
|
|
- <li id="jobMaps"> </li>
|
|
|
|
|
- <li class="nav-header">${_('Reduces:')}</li>
|
|
|
|
|
- <li id="jobReduces"> </li>
|
|
|
|
|
- % endif
|
|
|
|
|
-
|
|
|
|
|
- <li class="nav-header">${_('Duration:')}</li>
|
|
|
|
|
- <li id="jobDuration"> </li>
|
|
|
|
|
-
|
|
|
|
|
- <%
|
|
|
|
|
- output_dir = job.conf_keys.get('mapredOutputDir', "")
|
|
|
|
|
- location_url = location_to_url(output_dir)
|
|
|
|
|
- basename = os.path.basename(output_dir)
|
|
|
|
|
- dir_name = basename.split('/')[-1]
|
|
|
|
|
- %>
|
|
|
|
|
- % if dir_name != '':
|
|
|
|
|
- <li class="nav-header">${_('Output')}</li>
|
|
|
|
|
- <li>
|
|
|
|
|
- <%
|
|
|
|
|
- output_dir = job.conf_keys.get('mapredOutputDir', "")
|
|
|
|
|
- location_url = location_to_url(output_dir)
|
|
|
|
|
- basename = os.path.basename(output_dir)
|
|
|
|
|
- dir_name = basename.split('/')[-1]
|
|
|
|
|
- %>
|
|
|
|
|
- % if location_url != None:
|
|
|
|
|
- <a href="${location_url}" title="${output_dir}">
|
|
|
|
|
- % endif
|
|
|
|
|
- <i class="icon-folder-open"></i> ${dir_name}
|
|
|
|
|
- % if location_url != None:
|
|
|
|
|
- </a>
|
|
|
|
|
- % endif
|
|
|
|
|
- </li>
|
|
|
|
|
- % endif
|
|
|
|
|
-
|
|
|
|
|
- <li class="nav-header killJob">${_('Actions')}</li>
|
|
|
|
|
- <li id="killJobContainer" class="killJob"></li>
|
|
|
|
|
- </ul>
|
|
|
|
|
- </div>
|
|
|
|
|
- </div>
|
|
|
|
|
- <div class="span10">
|
|
|
|
|
- <ul class="nav nav-tabs">
|
|
|
|
|
|
|
+ <div class="row-fluid">
|
|
|
|
|
+ <div class="span2">
|
|
|
|
|
+ <div class="sidebar-nav">
|
|
|
|
|
+ <ul class="nav nav-list">
|
|
|
|
|
+ <li class="nav-header">${_('Job ID')}</li>
|
|
|
|
|
+ <li class="white hellipsify">${job.jobId_short}</li>
|
|
|
|
|
+ <li class="nav-header">${_('User')}</li>
|
|
|
|
|
+ <li class="white">${job.user}</li>
|
|
|
|
|
+ <li class="nav-header">${_('Status')}</li>
|
|
|
|
|
+ <li class="white" id="jobStatus"> </li>
|
|
|
|
|
+ <li class="nav-header">${_('Logs')}</li>
|
|
|
|
|
+ <li><a href="${ url('jobbrowser.views.job_single_logs', job=job.jobId) }"><i class="icon-tasks"></i> ${_('Logs')}</a></li>
|
|
|
|
|
+ % if not job.is_retired:
|
|
|
|
|
+ <li class="nav-header">${_('Maps:')}</li>
|
|
|
|
|
+ <li class="white" id="jobMaps"> </li>
|
|
|
|
|
+ <li class="nav-header">${_('Reduces:')}</li>
|
|
|
|
|
+ <li class="white" id="jobReduces"> </li>
|
|
|
|
|
+ % endif
|
|
|
|
|
+ <li class="nav-header">${_('Duration:')}</li>
|
|
|
|
|
+ <li class="white" id="jobDuration"> </li>
|
|
|
|
|
+ <%
|
|
|
|
|
+ output_dir = job.conf_keys.get('mapredOutputDir', "")
|
|
|
|
|
+ location_url = location_to_url(output_dir)
|
|
|
|
|
+ basename = os.path.basename(output_dir)
|
|
|
|
|
+ dir_name = basename.split('/')[-1]
|
|
|
|
|
+ %>
|
|
|
|
|
+ % if dir_name != '':
|
|
|
|
|
+ <li class="nav-header">${_('Output')}</li>
|
|
|
|
|
+ <li class="white">
|
|
|
|
|
+ % if location_url != None:
|
|
|
|
|
+ <a href="${location_url}" title="${output_dir}">
|
|
|
|
|
+ % endif
|
|
|
|
|
+ <i class="icon-folder-open"></i> ${dir_name}
|
|
|
|
|
+ % if location_url != None:
|
|
|
|
|
+ </a>
|
|
|
|
|
+ % endif
|
|
|
|
|
+ </li>
|
|
|
|
|
+ % endif
|
|
|
|
|
+ <li class="nav-header killJob">${_('Actions')}</li>
|
|
|
|
|
+ <li id="killJobContainer" class="white killJob"></li>
|
|
|
|
|
+ </ul>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="span10">
|
|
|
|
|
+ <div class="card" style="margin-top:0">
|
|
|
|
|
+ <h1 class="card-heading simple">${_('Job: %(jobId)s - Job Browser') % dict(jobId=job.jobId_short)}</h1>
|
|
|
|
|
+ <div class="card-body">
|
|
|
|
|
+ <p>
|
|
|
|
|
+ <ul class="nav nav-tabs">
|
|
|
% if job.is_mr2:
|
|
% if job.is_mr2:
|
|
|
- <li class="active"><a href="#attempts" data-toggle="tab">${_('Attempts')}</a></li>
|
|
|
|
|
- <li><a href="#tasks" data-toggle="tab">${_('Tasks')}</a></li>
|
|
|
|
|
|
|
+ <li class="active"><a href="#attempts" data-toggle="tab">${_('Attempts')}</a></li>
|
|
|
|
|
+ <li><a href="#tasks" data-toggle="tab">${_('Tasks')}</a></li>
|
|
|
% else:
|
|
% else:
|
|
|
- <li class="active"><a href="#tasks" data-toggle="tab">${_('Tasks')}</a></li>
|
|
|
|
|
|
|
+ <li class="active"><a href="#tasks" data-toggle="tab">${_('Tasks')}</a></li>
|
|
|
% endif
|
|
% endif
|
|
|
<li><a href="#metadata" data-toggle="tab">${_('Metadata')}</a></li>
|
|
<li><a href="#metadata" data-toggle="tab">${_('Metadata')}</a></li>
|
|
|
% if not job.is_retired:
|
|
% if not job.is_retired:
|
|
|
- <li><a href="#counters" data-toggle="tab">${_('Counters')}</a></li>
|
|
|
|
|
|
|
+ <li><a href="#counters" data-toggle="tab">${_('Counters')}</a></li>
|
|
|
% endif
|
|
% endif
|
|
|
- </ul>
|
|
|
|
|
|
|
+ </ul>
|
|
|
|
|
|
|
|
- <div class="tab-content">
|
|
|
|
|
|
|
+ <div class="tab-content">
|
|
|
% if job.is_mr2:
|
|
% if job.is_mr2:
|
|
|
- <div class="tab-pane active" id="attempts">
|
|
|
|
|
- <table id="jobAttemptTable" class="table table-striped table-condensed">
|
|
|
|
|
- <thead>
|
|
|
|
|
- <th width="20">${_('Logs')}</th>
|
|
|
|
|
- <th width="30">${_('Id')}</th>
|
|
|
|
|
- <th>${_('Container')}</th>
|
|
|
|
|
- </thead>
|
|
|
|
|
- <tbody>
|
|
|
|
|
- % for attempt in job.job_attempts['jobAttempt']:
|
|
|
|
|
- <tr>
|
|
|
|
|
- <td>
|
|
|
|
|
- <a href="${ url('jobbrowser.views.job_attempt_logs', job=job.jobId, attempt_index=loop.index) }"
|
|
|
|
|
- data-row-selector="true">
|
|
|
|
|
- <i class="icon-tasks"></i>
|
|
|
|
|
- </a>
|
|
|
|
|
- </td>
|
|
|
|
|
- <td>${ attempt['id'] }</td>
|
|
|
|
|
- <td>${ comps.get_container_link(job.status, attempt['containerId']) }</td>
|
|
|
|
|
- </tr>
|
|
|
|
|
- % endfor
|
|
|
|
|
- </tbody>
|
|
|
|
|
- </table>
|
|
|
|
|
- </div>
|
|
|
|
|
- <div class="tab-pane" id="tasks">
|
|
|
|
|
|
|
+ <div class="tab-pane active" id="attempts">
|
|
|
|
|
+ <table id="jobAttemptTable" class="table table-condensed">
|
|
|
|
|
+ <thead>
|
|
|
|
|
+ <th width="20">${_('Logs')}</th>
|
|
|
|
|
+ <th width="30">${_('Id')}</th>
|
|
|
|
|
+ <th>${_('Container')}</th>
|
|
|
|
|
+ </thead>
|
|
|
|
|
+ <tbody>
|
|
|
|
|
+ % for attempt in job.job_attempts['jobAttempt']:
|
|
|
|
|
+ <tr>
|
|
|
|
|
+ <td>
|
|
|
|
|
+ <a href="${ url('jobbrowser.views.job_attempt_logs', job=job.jobId, attempt_index=loop.index) }" data-row-selector="true">
|
|
|
|
|
+ <i class="icon-tasks"></i>
|
|
|
|
|
+ </a>
|
|
|
|
|
+ </td>
|
|
|
|
|
+ <td>${ attempt['id'] }</td>
|
|
|
|
|
+ <td>${ comps.get_container_link(job.status, attempt['containerId']) }</td>
|
|
|
|
|
+ </tr>
|
|
|
|
|
+ % endfor
|
|
|
|
|
+ </tbody>
|
|
|
|
|
+ </table>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="tab-pane" id="tasks">
|
|
|
% else:
|
|
% else:
|
|
|
- <div class="tab-pane active" id="tasks">
|
|
|
|
|
|
|
+ <div class="tab-pane active" id="tasks">
|
|
|
% endif
|
|
% endif
|
|
|
- % if job.is_retired and not job.is_mr2:
|
|
|
|
|
- ${ _('This jobs is ')} <span class="label label-warning">${ _('retired') }</span> ${ _(' and so has little information available.') }
|
|
|
|
|
- <br/>
|
|
|
|
|
- <br/>
|
|
|
|
|
- % else:
|
|
|
|
|
- <div id="failedTasksContainer">
|
|
|
|
|
- <a style="float:right;margin-right:10px;margin-top: 10px" href="${url('jobbrowser.views.tasks', job=job.jobId)}?taskstate=failed">${_('View All Failed Tasks')} »</a>
|
|
|
|
|
- <h3>
|
|
|
|
|
- ${_('Failed Tasks')}
|
|
|
|
|
- </h3>
|
|
|
|
|
- <div>
|
|
|
|
|
- ${task_table('failedTasks', failed_tasks)}
|
|
|
|
|
- </div>
|
|
|
|
|
- </div>
|
|
|
|
|
- <div>
|
|
|
|
|
- <a style="float:right;margin-right:10px;margin-top: 10px" href="${url('jobbrowser.views.tasks', job=job.jobId)}">${_('View All Tasks')} »</a>
|
|
|
|
|
- <h3>
|
|
|
|
|
- ${_('Recent Tasks')}
|
|
|
|
|
- </h3>
|
|
|
|
|
- <div>
|
|
|
|
|
- ${task_table('recentTasks', recent_tasks)}
|
|
|
|
|
- </div>
|
|
|
|
|
- </div>
|
|
|
|
|
- % endif
|
|
|
|
|
- </div>
|
|
|
|
|
- <div id="metadata" class="tab-pane">
|
|
|
|
|
- <div class="well hueWell">
|
|
|
|
|
- <form class="form-search">
|
|
|
|
|
- <input type="text" id="metadataFilter" class="input-xlarge search-query" placeholder="${_('Text Filter')}">
|
|
|
|
|
- </form>
|
|
|
|
|
|
|
+ % if job.is_retired and not job.is_mr2:
|
|
|
|
|
+ ${ _('This jobs is ')} <span class="label label-warning">${ _('retired') }</span> ${ _(' and so has little information available.') }
|
|
|
|
|
+ <br/>
|
|
|
|
|
+ <br/>
|
|
|
|
|
+ % else:
|
|
|
|
|
+ <div id="failedTasksContainer">
|
|
|
|
|
+ <a style="float:right;margin-right:10px;margin-top: 10px" href="${url('jobbrowser.views.tasks', job=job.jobId)}?taskstate=failed">${_('View All Failed Tasks')} »</a>
|
|
|
|
|
+ <h3>${_('Failed Tasks')}</h3>
|
|
|
|
|
+ <div>
|
|
|
|
|
+ ${task_table('failedTasks', failed_tasks)}
|
|
|
</div>
|
|
</div>
|
|
|
- <table id="metadataTable" class="table table-striped table-condensed">
|
|
|
|
|
- <thead>
|
|
|
|
|
- <th>${_('Name')}</th>
|
|
|
|
|
- <th>${_('Value')}</th>
|
|
|
|
|
- </thead>
|
|
|
|
|
- <tbody>
|
|
|
|
|
- <tr>
|
|
|
|
|
- <td>${_('ID')}</td>
|
|
|
|
|
- <td>${job.jobId_short}</td>
|
|
|
|
|
- </tr>
|
|
|
|
|
- <tr>
|
|
|
|
|
- <td>${_('User')}</td>
|
|
|
|
|
- <td>${job.user}</td>
|
|
|
|
|
- </tr>
|
|
|
|
|
- % if not job.is_retired:
|
|
|
|
|
- <tr>
|
|
|
|
|
- <td>${_('Maps')}</td>
|
|
|
|
|
- <td>${job.finishedMaps} of ${job.desiredMaps}</td>
|
|
|
|
|
- </tr>
|
|
|
|
|
- <tr>
|
|
|
|
|
- <td>${_('Reduces')}</td>
|
|
|
|
|
- <td>${job.finishedReduces} of ${job.desiredReduces}</td>
|
|
|
|
|
- </tr>
|
|
|
|
|
- % endif
|
|
|
|
|
- <tr>
|
|
|
|
|
- <td>${_('Started')}</td>
|
|
|
|
|
- <td>${job.startTimeFormatted}</td>
|
|
|
|
|
- </tr>
|
|
|
|
|
- % if not job.is_retired:
|
|
|
|
|
- <tr>
|
|
|
|
|
- <td>${_('Ended')}</td>
|
|
|
|
|
- <td>${job.finishTimeFormatted}</td>
|
|
|
|
|
- </tr>
|
|
|
|
|
- <tr>
|
|
|
|
|
- <td>${_('Duration')}</td>
|
|
|
|
|
- <td>${job.duration}</td>
|
|
|
|
|
- </tr>
|
|
|
|
|
- % endif
|
|
|
|
|
- <tr>
|
|
|
|
|
- <td>${_('Status')}</td>
|
|
|
|
|
- <td>${job.status}</td>
|
|
|
|
|
- </tr>
|
|
|
|
|
-
|
|
|
|
|
- ${rows_for_conf_vars(job.conf_keys)}
|
|
|
|
|
-
|
|
|
|
|
- </tbody>
|
|
|
|
|
- </table>
|
|
|
|
|
- <h3>${_('Raw configuration:')}</h3>
|
|
|
|
|
- <table id="rawConfigurationTable" class="table table-striped table-condensed">
|
|
|
|
|
- <thead>
|
|
|
|
|
- <th>${_('Name')}</th>
|
|
|
|
|
- <th>${_('Value')}</th>
|
|
|
|
|
- </thead>
|
|
|
|
|
- <tbody>
|
|
|
|
|
- % if job.is_mr2:
|
|
|
|
|
- % for line in job.full_job_conf['property']:
|
|
|
|
|
- <tr>
|
|
|
|
|
- <td width="20%">${ line['name'] }</td>
|
|
|
|
|
- <td>
|
|
|
|
|
- <div class="wordbreak">
|
|
|
|
|
- ${ line['value'] }
|
|
|
|
|
- </div>
|
|
|
|
|
- </td>
|
|
|
|
|
- </tr>
|
|
|
|
|
- % endfor
|
|
|
|
|
- % else:
|
|
|
|
|
- % for key, value in sorted(job.full_job_conf.items()):
|
|
|
|
|
- <tr>
|
|
|
|
|
- <td width="20%">${key}</td>
|
|
|
|
|
- <td>
|
|
|
|
|
- <div class="wordbreak">
|
|
|
|
|
- ${value}
|
|
|
|
|
- </div>
|
|
|
|
|
- </td>
|
|
|
|
|
- </tr>
|
|
|
|
|
- % endfor
|
|
|
|
|
- % endif
|
|
|
|
|
- </tbody>
|
|
|
|
|
- </table>
|
|
|
|
|
-
|
|
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div>
|
|
|
|
|
+ <a style="float:right;margin-right:10px;margin-top: 10px" href="${url('jobbrowser.views.tasks', job=job.jobId)}">${_('View All Tasks')} »</a>
|
|
|
|
|
+ <h3>${_('Recent Tasks')}</h3>
|
|
|
|
|
+ <div>
|
|
|
|
|
+ ${task_table('recentTasks', recent_tasks)}
|
|
|
|
|
+ </div>
|
|
|
</div>
|
|
</div>
|
|
|
- <div id="counters" class="tab-pane">
|
|
|
|
|
- % if job.is_mr2:
|
|
|
|
|
- ${ comps.job_counters_mr2(job.counters) }
|
|
|
|
|
- % else:
|
|
|
|
|
- ${ comps.job_counters(job.counters) }
|
|
|
|
|
|
|
+ % endif
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div id="metadata" class="tab-pane">
|
|
|
|
|
+ <form class="form-search">
|
|
|
|
|
+ <input type="text" id="metadataFilter" class="input-xlarge search-query" placeholder="${_('Text Filter')}">
|
|
|
|
|
+ </form>
|
|
|
|
|
+ <table id="metadataTable" class="table table-condensed">
|
|
|
|
|
+ <thead>
|
|
|
|
|
+ <th>${_('Name')}</th>
|
|
|
|
|
+ <th>${_('Value')}</th>
|
|
|
|
|
+ </thead>
|
|
|
|
|
+ <tbody>
|
|
|
|
|
+ <tr>
|
|
|
|
|
+ <td>${_('ID')}</td>
|
|
|
|
|
+ <td>${job.jobId_short}</td>
|
|
|
|
|
+ </tr>
|
|
|
|
|
+ <tr>
|
|
|
|
|
+ <td>${_('User')}</td>
|
|
|
|
|
+ <td>${job.user}</td>
|
|
|
|
|
+ </tr>
|
|
|
|
|
+ % if not job.is_retired:
|
|
|
|
|
+ <tr>
|
|
|
|
|
+ <td>${_('Maps')}</td>
|
|
|
|
|
+ <td>${job.finishedMaps} of ${job.desiredMaps}</td>
|
|
|
|
|
+ </tr>
|
|
|
|
|
+ <tr>
|
|
|
|
|
+ <td>${_('Reduces')}</td>
|
|
|
|
|
+ <td>${job.finishedReduces} of ${job.desiredReduces}</td>
|
|
|
|
|
+ </tr>
|
|
|
% endif
|
|
% endif
|
|
|
- </div>
|
|
|
|
|
|
|
+ <tr>
|
|
|
|
|
+ <td>${_('Started')}</td>
|
|
|
|
|
+ <td>${job.startTimeFormatted}</td>
|
|
|
|
|
+ </tr>
|
|
|
|
|
+ % if not job.is_retired:
|
|
|
|
|
+ <tr>
|
|
|
|
|
+ <td>${_('Ended')}</td>
|
|
|
|
|
+ <td>${job.finishTimeFormatted}</td>
|
|
|
|
|
+ </tr>
|
|
|
|
|
+ <tr>
|
|
|
|
|
+ <td>${_('Duration')}</td>
|
|
|
|
|
+ <td>${job.duration}</td>
|
|
|
|
|
+ </tr>
|
|
|
|
|
+ % endif
|
|
|
|
|
+ <tr>
|
|
|
|
|
+ <td>${_('Status')}</td>
|
|
|
|
|
+ <td>${job.status}</td>
|
|
|
|
|
+ </tr>
|
|
|
|
|
+ ${rows_for_conf_vars(job.conf_keys)}
|
|
|
|
|
+ </tbody>
|
|
|
|
|
+ </table>
|
|
|
|
|
+ <h3>${_('Raw configuration:')}</h3>
|
|
|
|
|
+ <table id="rawConfigurationTable" class="table table-condensed">
|
|
|
|
|
+ <thead>
|
|
|
|
|
+ <th>${_('Name')}</th>
|
|
|
|
|
+ <th>${_('Value')}</th>
|
|
|
|
|
+ </thead>
|
|
|
|
|
+ <tbody>
|
|
|
|
|
+ % if job.is_mr2:
|
|
|
|
|
+ % for line in job.full_job_conf['property']:
|
|
|
|
|
+ <tr>
|
|
|
|
|
+ <td width="20%">${ line['name'] }</td>
|
|
|
|
|
+ <td>
|
|
|
|
|
+ <div class="wordbreak">
|
|
|
|
|
+ ${ line['value'] }
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </td>
|
|
|
|
|
+ </tr>
|
|
|
|
|
+ % endfor
|
|
|
|
|
+ % else:
|
|
|
|
|
+ % for key, value in sorted(job.full_job_conf.items()):
|
|
|
|
|
+ <tr>
|
|
|
|
|
+ <td width="20%">${key}</td>
|
|
|
|
|
+ <td>
|
|
|
|
|
+ <div class="wordbreak">
|
|
|
|
|
+ ${value}
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </td>
|
|
|
|
|
+ </tr>
|
|
|
|
|
+ % endfor
|
|
|
|
|
+ % endif
|
|
|
|
|
+ </tbody>
|
|
|
|
|
+ </table>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div id="counters" class="tab-pane">
|
|
|
|
|
+ % if job.is_mr2:
|
|
|
|
|
+ ${ comps.job_counters_mr2(job.counters) }
|
|
|
|
|
+ % else:
|
|
|
|
|
+ ${ comps.job_counters(job.counters) }
|
|
|
|
|
+ % endif
|
|
|
|
|
+ </div>
|
|
|
</div>
|
|
</div>
|
|
|
- </div>
|
|
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </p>
|
|
|
|
|
+ </div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
+ </div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|