feat(ssa): Complete Phase 2A frontend integration - multi-step workflow end-to-end

Phase 2A: WorkflowPlannerService, WorkflowExecutorService, Python data quality, 6 bug fixes, DescriptiveResultView, multi-step R code/Word export, MVP UI reuse. V11 UI: Gemini-style, multi-task, single-page scroll, Word export. Architecture: Block-based rendering consensus (4 block types). New R tools: chi_square, correlation, descriptive, logistic_binary, mann_whitney, t_test_paired. Docs: dev summary, block-based plan, status updates, task list v2.0.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-02-20 23:09:27 +08:00
parent 23b422f758
commit 428a22adf2
62 changed files with 15416 additions and 299 deletions

View File

@@ -0,0 +1,581 @@
/**
* SSA Phase 2A 端到端自动化测试
*
* 测试层次:
* - Layer 1: R 服务 - 7 个统计工具
* - Layer 2: Python DataProfile API
* - Layer 3: Node.js 工作流 API
* - Layer 4: 完整场景测试
*
* 运行方式npx tsx phase2a_e2e_test.ts
*/
import axios, { AxiosInstance } from 'axios';
import * as fs from 'fs';
import * as path from 'path';
// ==================== 配置 ====================
const CONFIG = {
// 服务地址
R_SERVICE_URL: 'http://localhost:8082',
PYTHON_SERVICE_URL: 'http://localhost:8081',
BACKEND_URL: 'http://localhost:3000',
// 测试账号
USERNAME: '13800000001',
PASSWORD: '123456',
// 测试数据文件
TEST_CSV_PATH: path.join(__dirname, 'test.csv')
};
// ==================== 工具函数 ====================
function log(emoji: string, message: string, details?: any) {
console.log(`${emoji} ${message}`);
if (details) {
console.log(' ', JSON.stringify(details, null, 2).split('\n').slice(0, 10).join('\n '));
}
}
function success(message: string, details?: any) {
log('✅', message, details);
}
function error(message: string, details?: any) {
log('❌', message, details);
}
function info(message: string) {
log('', message);
}
function section(title: string) {
console.log('\n' + '='.repeat(60));
console.log(` ${title}`);
console.log('='.repeat(60) + '\n');
}
// 加载测试数据
function loadTestData(): Record<string, any>[] {
const csvContent = fs.readFileSync(CONFIG.TEST_CSV_PATH, 'utf-8');
const lines = csvContent.trim().split('\n');
const headers = lines[0].split(',');
const data: Record<string, any>[] = [];
for (let i = 1; i < lines.length; i++) {
const values = lines[i].split(',');
const row: Record<string, any> = {};
for (let j = 0; j < headers.length; j++) {
const val = values[j];
if (val === '' || val === undefined) {
row[headers[j]] = null;
} else if (!isNaN(Number(val))) {
row[headers[j]] = Number(val);
} else {
row[headers[j]] = val;
}
}
data.push(row);
}
return data;
}
// ==================== Layer 1: R 服务测试 ====================
async function testRService() {
section('Layer 1: R 服务测试7 个统计工具)');
const rClient = axios.create({
baseURL: CONFIG.R_SERVICE_URL,
timeout: 60000
});
const data = loadTestData();
info(`测试数据: ${data.length} 行, ${Object.keys(data[0]).length}`);
const results: { tool: string; status: string; time: number; error?: string }[] = [];
// 1. 健康检查
try {
const health = await rClient.get('/health');
success('R 服务健康检查通过', {
version: health.data.version,
tools_loaded: health.data.tools_loaded
});
} catch (e: any) {
error('R 服务连接失败', e.message);
return { passed: false, results };
}
// 构建数据源
const dataSource = { type: 'inline', data };
// 2. ST_DESCRIPTIVE - 描述性统计
try {
const start = Date.now();
const res = await rClient.post('/api/v1/skills/ST_DESCRIPTIVE', {
data_source: dataSource,
params: {
variables: ['age', 'bmi', 'time'],
group_var: 'sex'
}
});
results.push({ tool: 'ST_DESCRIPTIVE', status: res.data.status, time: Date.now() - start });
if (res.data.status === 'success') {
success('ST_DESCRIPTIVE (描述性统计)', {
summary: res.data.results?.summary
});
} else {
error('ST_DESCRIPTIVE 失败', res.data);
}
} catch (e: any) {
results.push({ tool: 'ST_DESCRIPTIVE', status: 'error', time: 0, error: e.message });
error('ST_DESCRIPTIVE 异常', e.message);
}
// 3. ST_T_TEST_IND - 独立样本 T 检验
try {
const start = Date.now();
const res = await rClient.post('/api/v1/skills/ST_T_TEST_IND', {
data_source: dataSource,
params: { group_var: 'sex', value_var: 'age' },
guardrails: { check_normality: true }
});
results.push({ tool: 'ST_T_TEST_IND', status: res.data.status, time: Date.now() - start });
if (res.data.status === 'success') {
success('ST_T_TEST_IND (独立样本T检验)', {
p_value: res.data.results?.p_value_fmt,
t: res.data.results?.statistic
});
} else {
error('ST_T_TEST_IND 失败', res.data);
}
} catch (e: any) {
results.push({ tool: 'ST_T_TEST_IND', status: 'error', time: 0, error: e.message });
error('ST_T_TEST_IND 异常', e.message);
}
// 4. ST_MANN_WHITNEY - Mann-Whitney U 检验
try {
const start = Date.now();
const res = await rClient.post('/api/v1/skills/ST_MANN_WHITNEY', {
data_source: dataSource,
params: { group_var: 'sex', value_var: 'bmi' }
});
results.push({ tool: 'ST_MANN_WHITNEY', status: res.data.status, time: Date.now() - start });
if (res.data.status === 'success') {
success('ST_MANN_WHITNEY (Mann-Whitney U)', {
p_value: res.data.results?.p_value_fmt,
U: res.data.results?.statistic_U
});
} else {
error('ST_MANN_WHITNEY 失败', res.data);
}
} catch (e: any) {
results.push({ tool: 'ST_MANN_WHITNEY', status: 'error', time: 0, error: e.message });
error('ST_MANN_WHITNEY 异常', e.message);
}
// 5. ST_CHI_SQUARE - 卡方检验
try {
const start = Date.now();
const res = await rClient.post('/api/v1/skills/ST_CHI_SQUARE', {
data_source: dataSource,
params: { var1: 'sex', var2: 'smoke' }
});
results.push({ tool: 'ST_CHI_SQUARE', status: res.data.status, time: Date.now() - start });
if (res.data.status === 'success') {
success('ST_CHI_SQUARE (卡方检验)', {
p_value: res.data.results?.p_value_fmt,
chi2: res.data.results?.statistic
});
} else {
error('ST_CHI_SQUARE 失败', res.data);
}
} catch (e: any) {
results.push({ tool: 'ST_CHI_SQUARE', status: 'error', time: 0, error: e.message });
error('ST_CHI_SQUARE 异常', e.message);
}
// 6. ST_CORRELATION - 相关分析
try {
const start = Date.now();
const res = await rClient.post('/api/v1/skills/ST_CORRELATION', {
data_source: dataSource,
params: { var_x: 'age', var_y: 'bmi', method: 'auto' }
});
results.push({ tool: 'ST_CORRELATION', status: res.data.status, time: Date.now() - start });
if (res.data.status === 'success') {
success('ST_CORRELATION (相关分析)', {
r: res.data.results?.statistic,
p_value: res.data.results?.p_value_fmt,
method: res.data.results?.method_code
});
} else {
error('ST_CORRELATION 失败', res.data);
}
} catch (e: any) {
results.push({ tool: 'ST_CORRELATION', status: 'error', time: 0, error: e.message });
error('ST_CORRELATION 异常', e.message);
}
// 7. ST_LOGISTIC_BINARY - 二元 Logistic 回归
try {
const start = Date.now();
const res = await rClient.post('/api/v1/skills/ST_LOGISTIC_BINARY', {
data_source: dataSource,
params: {
outcome_var: 'Yqol', // 二分类结局
predictors: ['age', 'bmi', 'sex', 'smoke']
}
});
results.push({ tool: 'ST_LOGISTIC_BINARY', status: res.data.status, time: Date.now() - start });
if (res.data.status === 'success') {
const sigCoeffs = res.data.results?.coefficients?.filter((c: any) => c.significant) || [];
success('ST_LOGISTIC_BINARY (Logistic回归)', {
n_predictors: res.data.results?.n_predictors,
significant_vars: sigCoeffs.length,
AIC: res.data.results?.model_fit?.aic
});
} else {
error('ST_LOGISTIC_BINARY 失败', res.data);
}
} catch (e: any) {
results.push({ tool: 'ST_LOGISTIC_BINARY', status: 'error', time: 0, error: e.message });
error('ST_LOGISTIC_BINARY 异常', e.message);
}
// 8. ST_T_TEST_PAIRED - 配对 T 检验(使用两个连续变量模拟)
try {
const start = Date.now();
const res = await rClient.post('/api/v1/skills/ST_T_TEST_PAIRED', {
data_source: dataSource,
params: { before_var: 'mouth_open', after_var: 'bucal_relax' },
guardrails: { check_normality: true }
});
results.push({ tool: 'ST_T_TEST_PAIRED', status: res.data.status, time: Date.now() - start });
if (res.data.status === 'success') {
success('ST_T_TEST_PAIRED (配对T检验)', {
p_value: res.data.results?.p_value_fmt,
mean_diff: res.data.results?.descriptive?.difference?.mean
});
} else {
error('ST_T_TEST_PAIRED 失败', res.data);
}
} catch (e: any) {
results.push({ tool: 'ST_T_TEST_PAIRED', status: 'error', time: 0, error: e.message });
error('ST_T_TEST_PAIRED 异常', e.message);
}
// 9. JIT 护栏测试
try {
const start = Date.now();
const res = await rClient.post('/api/v1/guardrails/jit', {
data_source: dataSource,
tool_code: 'ST_T_TEST_IND',
params: { group_var: 'sex', value_var: 'age' }
});
if (res.data.status === 'success') {
success('JIT 护栏检查', {
checks: res.data.checks?.length,
all_passed: res.data.all_checks_passed
});
}
} catch (e: any) {
error('JIT 护栏检查异常', e.message);
}
// 汇总
const passed = results.filter(r => r.status === 'success').length;
info(`\nR 服务测试完成: ${passed}/${results.length} 通过`);
return { passed: passed === results.length, results };
}
// ==================== Layer 2: Python DataProfile 测试 ====================
async function testPythonDataProfile() {
section('Layer 2: Python DataProfile 测试');
const pythonClient = axios.create({
baseURL: CONFIG.PYTHON_SERVICE_URL,
timeout: 60000
});
const data = loadTestData();
// 健康检查
try {
const health = await pythonClient.get('/api/health');
success('Python 服务健康检查通过', { status: health.data.status });
} catch (e: any) {
error('Python 服务连接失败', e.message);
return { passed: false };
}
// DataProfile 测试
try {
const start = Date.now();
const res = await pythonClient.post('/api/ssa/data-profile', {
data,
max_unique_values: 20,
include_quality_score: true
});
if (res.data.success) {
const profile = res.data.profile;
const quality = res.data.quality;
success('DataProfile 生成成功', {
rows: profile.summary.totalRows,
columns: profile.summary.totalColumns,
numeric: profile.summary.numericColumns,
categorical: profile.summary.categoricalColumns,
missing_rate: profile.summary.overallMissingRate + '%',
quality_score: quality?.score,
quality_grade: quality?.grade,
execution_time: res.data.execution_time + 's'
});
// 显示部分列画像
info('部分列画像:');
for (const col of profile.columns.slice(0, 5)) {
console.log(` - ${col.name} [${col.type}]: 缺失${col.missingRate}%`);
if (col.type === 'numeric') {
console.log(` 均值=${col.mean}, SD=${col.std}`);
}
}
return { passed: true, profile, quality };
} else {
error('DataProfile 生成失败', res.data);
return { passed: false };
}
} catch (e: any) {
error('DataProfile 请求异常', e.message);
return { passed: false };
}
}
// ==================== Layer 3: Node.js 后端 API 测试 ====================
async function testBackendAPI() {
section('Layer 3: Node.js 后端 API 测试');
const client = axios.create({
baseURL: CONFIG.BACKEND_URL,
timeout: 60000
});
let token = '';
// 1. 登录获取 Token
try {
const loginRes = await client.post('/api/v1/auth/login', {
phone: CONFIG.USERNAME,
password: CONFIG.PASSWORD
});
if (loginRes.data.token || loginRes.data.data?.token) {
token = loginRes.data.token || loginRes.data.data?.token;
success('登录成功', { token: token.substring(0, 20) + '...' });
client.defaults.headers.common['Authorization'] = `Bearer ${token}`;
} else {
error('登录失败', loginRes.data);
return { passed: false };
}
} catch (e: any) {
error('登录请求异常', e.response?.data || e.message);
return { passed: false };
}
const data = loadTestData();
let sessionId = '';
let workflowId = '';
// 2. 创建 SSA 会话
try {
const createRes = await client.post('/api/v1/ssa/sessions', {
title: 'Phase2A 自动化测试',
dataPayload: data,
dataSchema: {
columns: Object.keys(data[0]).map(name => ({
name,
type: typeof data[0][name] === 'number' ? 'numeric' : 'categorical'
}))
}
});
if (createRes.data.session?.id || createRes.data.id) {
sessionId = createRes.data.session?.id || createRes.data.id;
success('SSA 会话创建成功', { sessionId });
} else {
error('SSA 会话创建失败', createRes.data);
return { passed: false, token };
}
} catch (e: any) {
error('创建会话异常', e.response?.data || e.message);
return { passed: false, token };
}
// 3. 生成 DataProfile
try {
const profileRes = await client.post('/api/v1/ssa/workflow/profile', {
sessionId
});
if (profileRes.data.success) {
success('会话 DataProfile 生成成功', {
rows: profileRes.data.profile?.summary?.totalRows
});
} else {
info('DataProfile 生成跳过(可能已存在)');
}
} catch (e: any) {
info('DataProfile 端点可能不存在: ' + e.message);
}
// 4. 规划工作流
try {
const planRes = await client.post('/api/v1/ssa/workflow/plan', {
sessionId,
userQuery: '比较不同性别的年龄和BMI差异'
});
if (planRes.data.success && planRes.data.plan) {
const plan = planRes.data.plan;
success('工作流规划成功', {
goal: plan.goal,
steps: plan.steps?.length,
tools: plan.steps?.map((s: any) => s.toolCode)
});
// 从数据库获取 workflowId
// 暂时跳过执行测试,因为需要查询数据库获取 workflowId
info('工作流规划完成,跳过执行测试(需要 workflowId');
} else {
error('工作流规划失败', planRes.data);
}
} catch (e: any) {
error('工作流规划异常', e.response?.data || e.message);
}
return { passed: true, token, sessionId };
}
// ==================== Layer 4: 完整场景测试 ====================
async function testFullScenario() {
section('Layer 4: 完整场景测试(验收标准)');
info('根据 Phase 2A 验收标准进行测试...\n');
const scenarios = [
{
name: '场景1: 比较两组血压',
query: '比较两组的数值差异',
expectedFlow: ['描述统计', 'T检验/Mann-Whitney']
},
{
name: '场景2: 分析分类变量关联',
query: '分析性别与吸烟的关系',
expectedFlow: ['描述统计', '卡方检验']
},
{
name: '场景3: 多因素分析',
query: '哪些因素影响结局',
expectedFlow: ['描述统计', '单因素分析', 'Logistic回归']
},
{
name: '场景4: 相关性分析',
query: '年龄与BMI相关吗',
expectedFlow: ['描述统计', '相关分析']
}
];
for (const scenario of scenarios) {
console.log(`📋 ${scenario.name}`);
console.log(` 查询: "${scenario.query}"`);
console.log(` 预期流程: ${scenario.expectedFlow.join(' → ')}`);
console.log('');
}
info('场景验收需要在前端界面手动验证');
return { passed: true };
}
// ==================== 主函数 ====================
async function main() {
console.log('\n');
console.log('╔══════════════════════════════════════════════════════════╗');
console.log('║ SSA Phase 2A 端到端自动化测试 ║');
console.log('║ 测试时间: ' + new Date().toISOString().slice(0, 19) + ' ║');
console.log('╚══════════════════════════════════════════════════════════╝');
const results = {
layer1_r_service: { passed: false, details: null as any },
layer2_python_profile: { passed: false, details: null as any },
layer3_backend_api: { passed: false, details: null as any },
layer4_full_scenario: { passed: false, details: null as any }
};
// Layer 1
try {
results.layer1_r_service = await testRService();
} catch (e: any) {
error('Layer 1 测试异常', e.message);
}
// Layer 2
try {
results.layer2_python_profile = await testPythonDataProfile();
} catch (e: any) {
error('Layer 2 测试异常', e.message);
}
// Layer 3
try {
results.layer3_backend_api = await testBackendAPI();
} catch (e: any) {
error('Layer 3 测试异常', e.message);
}
// Layer 4
try {
results.layer4_full_scenario = await testFullScenario();
} catch (e: any) {
error('Layer 4 测试异常', e.message);
}
// 最终汇总
section('测试汇总');
const layers = [
{ name: 'Layer 1: R 服务', result: results.layer1_r_service },
{ name: 'Layer 2: Python DataProfile', result: results.layer2_python_profile },
{ name: 'Layer 3: Node.js 后端', result: results.layer3_backend_api },
{ name: 'Layer 4: 完整场景', result: results.layer4_full_scenario }
];
let allPassed = true;
for (const layer of layers) {
const status = layer.result.passed ? '✅ 通过' : '❌ 失败';
console.log(`${status} ${layer.name}`);
if (!layer.result.passed) allPassed = false;
}
console.log('\n' + '─'.repeat(60));
if (allPassed) {
console.log('🎉 Phase 2A 端到端测试全部通过!');
} else {
console.log('⚠️ 部分测试未通过,请检查上述错误');
}
console.log('─'.repeat(60) + '\n');
}
// 运行
main().catch(console.error);

View File

@@ -0,0 +1,536 @@
/**
* SSA Phase 2A 端到端自动化测试
*
* 运行方式node run_e2e_test.js
*
* 测试层次:
* - Layer 1: R 服务 - 7 个统计工具
* - Layer 2: Python DataProfile API
* - Layer 3: Node.js 后端 API
*/
const http = require('http');
const https = require('https');
const fs = require('fs');
const path = require('path');
// ==================== 配置 ====================
const CONFIG = {
R_SERVICE_URL: 'http://localhost:8082',
PYTHON_SERVICE_URL: 'http://localhost:8000',
BACKEND_URL: 'http://localhost:3000',
USERNAME: '13800000001',
PASSWORD: '123456',
TEST_CSV_PATH: path.join(__dirname, 'test.csv')
};
// ==================== HTTP 请求工具 ====================
function httpRequest(urlStr, options = {}) {
return new Promise((resolve, reject) => {
const url = new URL(urlStr);
const isHttps = url.protocol === 'https:';
const lib = isHttps ? https : http;
const reqOptions = {
hostname: url.hostname,
port: url.port || (isHttps ? 443 : 80),
path: url.pathname + url.search,
method: options.method || 'GET',
headers: {
'Content-Type': 'application/json',
...options.headers
},
timeout: options.timeout || 60000
};
const req = lib.request(reqOptions, (res) => {
let data = '';
res.on('data', chunk => data += chunk);
res.on('end', () => {
try {
resolve({ status: res.statusCode, data: JSON.parse(data) });
} catch {
resolve({ status: res.statusCode, data });
}
});
});
req.on('error', reject);
req.on('timeout', () => {
req.destroy();
reject(new Error('Request timeout'));
});
if (options.body) {
req.write(JSON.stringify(options.body));
}
req.end();
});
}
// ==================== 日志工具 ====================
function log(emoji, message, details) {
console.log(`${emoji} ${message}`);
if (details) {
const str = JSON.stringify(details, null, 2);
const lines = str.split('\n').slice(0, 10);
console.log(' ', lines.join('\n '));
}
}
const success = (msg, details) => log('✅', msg, details);
const error = (msg, details) => log('❌', msg, details);
const info = (msg) => log('', msg);
function section(title) {
console.log('\n' + '='.repeat(60));
console.log(` ${title}`);
console.log('='.repeat(60) + '\n');
}
// ==================== 加载测试数据 ====================
function loadTestData() {
const csvContent = fs.readFileSync(CONFIG.TEST_CSV_PATH, 'utf-8');
const lines = csvContent.trim().split('\n');
const headers = lines[0].split(',');
const data = [];
for (let i = 1; i < lines.length; i++) {
const values = lines[i].split(',');
const row = {};
for (let j = 0; j < headers.length; j++) {
const val = values[j];
if (val === '' || val === undefined) {
row[headers[j]] = null;
} else if (!isNaN(Number(val))) {
row[headers[j]] = Number(val);
} else {
row[headers[j]] = val;
}
}
data.push(row);
}
return data;
}
// ==================== Layer 1: R 服务测试 ====================
async function testRService() {
section('Layer 1: R 服务测试7 个统计工具 + JIT 护栏)');
const data = loadTestData();
info(`测试数据: ${data.length} 行, ${Object.keys(data[0]).length}`);
const results = [];
const dataSource = { type: 'inline', data };
// 1. 健康检查
try {
const res = await httpRequest(`${CONFIG.R_SERVICE_URL}/health`);
success('R 服务健康检查', {
version: res.data.version,
tools_loaded: res.data.tools_loaded
});
} catch (e) {
error('R 服务连接失败', e.message);
return { passed: false, results };
}
// 测试配置
const tests = [
{
name: 'ST_DESCRIPTIVE (描述性统计)',
endpoint: '/api/v1/skills/ST_DESCRIPTIVE',
body: {
data_source: dataSource,
params: { variables: ['age', 'bmi', 'time'], group_var: 'sex' }
},
extract: (r) => ({ summary: r.results?.summary })
},
{
name: 'ST_T_TEST_IND (独立样本T检验)',
endpoint: '/api/v1/skills/ST_T_TEST_IND',
body: {
data_source: dataSource,
params: { group_var: 'sex', value_var: 'age' },
guardrails: { check_normality: true }
},
extract: (r) => ({ p: r.results?.p_value_fmt, t: r.results?.statistic })
},
{
name: 'ST_MANN_WHITNEY (Mann-Whitney U)',
endpoint: '/api/v1/skills/ST_MANN_WHITNEY',
body: {
data_source: dataSource,
params: { group_var: 'sex', value_var: 'bmi' }
},
extract: (r) => ({ p: r.results?.p_value_fmt, U: r.results?.statistic_U })
},
{
name: 'ST_CHI_SQUARE (卡方检验)',
endpoint: '/api/v1/skills/ST_CHI_SQUARE',
body: {
data_source: dataSource,
params: { var1: 'sex', var2: 'smoke' }
},
extract: (r) => ({ p: r.results?.p_value_fmt, chi2: r.results?.statistic })
},
{
name: 'ST_CORRELATION (相关分析)',
endpoint: '/api/v1/skills/ST_CORRELATION',
body: {
data_source: dataSource,
params: { var_x: 'age', var_y: 'bmi', method: 'auto' }
},
extract: (r) => ({ r: r.results?.statistic, p: r.results?.p_value_fmt, method: r.results?.method_code })
},
{
name: 'ST_LOGISTIC_BINARY (Logistic回归)',
endpoint: '/api/v1/skills/ST_LOGISTIC_BINARY',
body: {
data_source: dataSource,
params: { outcome_var: 'Yqol', predictors: ['age', 'bmi', 'sex', 'smoke'] }
},
extract: (r) => ({
n: r.results?.n_predictors,
sig: r.results?.coefficients?.filter(c => c.significant)?.length,
aic: r.results?.model_fit?.aic
})
},
{
name: 'ST_T_TEST_PAIRED (配对T检验)',
endpoint: '/api/v1/skills/ST_T_TEST_PAIRED',
body: {
data_source: dataSource,
params: { before_var: 'mouth_open', after_var: 'bucal_relax' },
guardrails: { check_normality: true }
},
extract: (r) => ({ p: r.results?.p_value_fmt, diff: r.results?.descriptive?.difference?.mean })
},
{
name: 'JIT 护栏检查',
endpoint: '/api/v1/guardrails/jit',
body: {
data_source: dataSource,
tool_code: 'ST_T_TEST_IND',
params: { group_var: 'sex', value_var: 'age' }
},
extract: (r) => ({ checks: r.checks?.length, all_passed: r.all_checks_passed })
}
];
for (const test of tests) {
try {
const start = Date.now();
const res = await httpRequest(`${CONFIG.R_SERVICE_URL}${test.endpoint}`, {
method: 'POST',
body: test.body
});
const elapsed = Date.now() - start;
if (res.data.status === 'success') {
const extracted = test.extract(res.data);
success(`${test.name} (${elapsed}ms)`, extracted);
results.push({ name: test.name, status: 'success', time: elapsed });
} else {
error(`${test.name} 失败`, res.data.error || res.data.message);
results.push({ name: test.name, status: 'failed', time: elapsed });
}
} catch (e) {
error(`${test.name} 异常`, e.message);
results.push({ name: test.name, status: 'error', error: e.message });
}
}
const passed = results.filter(r => r.status === 'success').length;
info(`\nR 服务测试: ${passed}/${results.length} 通过`);
return { passed: passed === results.length, results, passedCount: passed, total: results.length };
}
// ==================== Layer 2: Python DataProfile 测试 ====================
async function testPythonDataProfile() {
section('Layer 2: Python DataProfile 测试');
const data = loadTestData();
// 健康检查
try {
const res = await httpRequest(`${CONFIG.PYTHON_SERVICE_URL}/api/health`);
success('Python 服务健康检查', { status: res.data.status });
} catch (e) {
error('Python 服务连接失败', e.message);
return { passed: false };
}
// DataProfile 测试
try {
const start = Date.now();
const res = await httpRequest(`${CONFIG.PYTHON_SERVICE_URL}/api/ssa/data-profile`, {
method: 'POST',
body: {
data,
max_unique_values: 20,
include_quality_score: true
}
});
const elapsed = Date.now() - start;
if (res.data.success) {
const profile = res.data.profile;
const quality = res.data.quality;
success(`DataProfile 生成成功 (${elapsed}ms)`, {
rows: profile.summary.totalRows,
columns: profile.summary.totalColumns,
numeric: profile.summary.numericColumns,
categorical: profile.summary.categoricalColumns,
missing_rate: profile.summary.overallMissingRate + '%',
quality_score: quality?.score,
quality_grade: quality?.grade
});
info('部分列画像:');
for (const col of profile.columns.slice(0, 5)) {
console.log(` - ${col.name} [${col.type}]: 缺失${col.missingRate}%`);
}
return { passed: true, profile, quality };
} else {
error('DataProfile 生成失败', res.data);
return { passed: false };
}
} catch (e) {
error('DataProfile 请求异常', e.message);
return { passed: false };
}
}
// ==================== Layer 3: Node.js 后端 API 测试 ====================
async function testBackendAPI() {
section('Layer 3: Node.js 后端 API 测试');
let token = '';
// 1. 登录
try {
const res = await httpRequest(`${CONFIG.BACKEND_URL}/api/v1/auth/login/password`, {
method: 'POST',
body: {
phone: CONFIG.USERNAME,
password: CONFIG.PASSWORD
}
});
if (res.data.success && res.data.data?.tokens?.accessToken) {
token = res.data.data.tokens.accessToken;
success('登录成功', {
user: res.data.data.user?.name,
token: token.substring(0, 20) + '...'
});
} else if (res.data.data?.token) {
token = res.data.data.token;
success('登录成功', { token: token.substring(0, 20) + '...' });
} else {
error('登录失败', res.data);
return { passed: false };
}
} catch (e) {
error('登录请求异常', e.message);
return { passed: false };
}
const data = loadTestData();
let sessionId = '';
// 2. 创建 SSA 会话
try {
const res = await httpRequest(`${CONFIG.BACKEND_URL}/api/v1/ssa/sessions`, {
method: 'POST',
headers: { Authorization: `Bearer ${token}` },
body: {
title: 'Phase2A 自动化测试 - ' + new Date().toISOString().slice(0, 19),
dataPayload: data,
dataSchema: {
columns: Object.keys(data[0]).map(name => ({
name,
type: typeof data[0][name] === 'number' ? 'numeric' : 'categorical'
}))
}
}
});
if (res.data.sessionId || res.data.session?.id || res.data.data?.id || res.data.id) {
sessionId = res.data.sessionId || res.data.session?.id || res.data.data?.id || res.data.id;
success('SSA 会话创建成功', { sessionId });
} else {
error('SSA 会话创建失败', res.data);
return { passed: false, token };
}
} catch (e) {
error('创建会话异常', e.message);
return { passed: false, token };
}
// 3. 生成 DataProfile通过会话
try {
const res = await httpRequest(`${CONFIG.BACKEND_URL}/api/v1/ssa/workflow/profile`, {
method: 'POST',
headers: { Authorization: `Bearer ${token}` },
body: { sessionId }
});
if (res.data.success) {
success('会话 DataProfile 生成成功', {
rows: res.data.profile?.summary?.totalRows
});
} else {
info('DataProfile: ' + (res.data.message || '跳过'));
}
} catch (e) {
info('DataProfile 端点: ' + e.message);
}
// 4. 规划工作流
let workflowId = '';
try {
const res = await httpRequest(`${CONFIG.BACKEND_URL}/api/v1/ssa/workflow/plan`, {
method: 'POST',
headers: { Authorization: `Bearer ${token}` },
body: {
sessionId,
userQuery: '比较不同性别的年龄和BMI差异分析是否存在统计学显著差异'
}
});
if (res.data.success && res.data.plan) {
const plan = res.data.plan;
workflowId = res.data.workflowId || '';
success('工作流规划成功', {
workflowId,
goal: plan.goal,
steps: plan.steps?.length,
tools: plan.steps?.map(s => s.toolCode)
});
} else {
error('工作流规划失败', res.data);
return { passed: false, token, sessionId };
}
} catch (e) {
error('工作流规划异常', e.message);
return { passed: false, token, sessionId };
}
// 5. 执行工作流(如果有 workflowId
if (workflowId) {
try {
info(`执行工作流 ${workflowId}...`);
const res = await httpRequest(`${CONFIG.BACKEND_URL}/api/v1/ssa/workflow/${workflowId}/execute`, {
method: 'POST',
headers: { Authorization: `Bearer ${token}` },
timeout: 120000 // 2 分钟超时
});
if (res.data.success) {
success('工作流执行成功', {
status: res.data.result?.status,
completedSteps: res.data.result?.completedSteps,
totalSteps: res.data.result?.totalSteps,
hasConclusion: !!res.data.result?.conclusion
});
// 显示结论摘要
if (res.data.result?.conclusion) {
info('结论摘要:');
console.log(' ' + (res.data.result.conclusion.summary || '').substring(0, 200) + '...');
}
} else {
error('工作流执行失败', res.data);
}
} catch (e) {
error('工作流执行异常', e.message);
}
}
return { passed: true, token, sessionId, workflowId };
}
// ==================== 主函数 ====================
async function main() {
console.log('\n');
console.log('╔══════════════════════════════════════════════════════════╗');
console.log('║ SSA Phase 2A 端到端自动化测试 ║');
console.log('║ ' + new Date().toISOString().slice(0, 19) + ' ║');
console.log('╚══════════════════════════════════════════════════════════╝');
const results = {
layer1: { passed: false },
layer2: { passed: false },
layer3: { passed: false }
};
// Layer 1: R 服务
try {
results.layer1 = await testRService();
} catch (e) {
error('Layer 1 测试异常', e.message);
}
// Layer 2: Python DataProfile
try {
results.layer2 = await testPythonDataProfile();
} catch (e) {
error('Layer 2 测试异常', e.message);
}
// Layer 3: Node.js 后端
try {
results.layer3 = await testBackendAPI();
} catch (e) {
error('Layer 3 测试异常', e.message);
}
// 最终汇总
section('测试汇总报告');
const layers = [
{ name: 'Layer 1: R 服务 (7工具+护栏)', result: results.layer1 },
{ name: 'Layer 2: Python DataProfile', result: results.layer2 },
{ name: 'Layer 3: Node.js 后端 API', result: results.layer3 }
];
let allPassed = true;
for (const layer of layers) {
const status = layer.result.passed ? '✅ 通过' : '❌ 失败';
let extra = '';
if (layer.result.passedCount !== undefined) {
extra = ` (${layer.result.passedCount}/${layer.result.total})`;
}
console.log(`${status} ${layer.name}${extra}`);
if (!layer.result.passed) allPassed = false;
}
console.log('\n' + '─'.repeat(60));
if (allPassed) {
console.log('🎉 Phase 2A 端到端测试全部通过!系统已准备就绪!');
} else {
console.log('⚠️ 部分测试未通过,请检查上述错误并修复');
}
console.log('─'.repeat(60) + '\n');
process.exit(allPassed ? 0 : 1);
}
main().catch(err => {
console.error('测试脚本执行失败:', err);
process.exit(1);
});

View File

@@ -0,0 +1,312 @@
sex,smoke,age,bmi,mouth_open,bucal_relax,toot_morph,root_number,root_curve,lenspace,denseratio,Pglevel,Pgverti,Winter,presyp,flap,operation,time,surgage,Yqol,times
2,2,27,23.1,4.2,4.4,3,2,2,4.43,0.554,1,1,1,1,2,2,15.5,2,0,23.25
1,1,24,16.7,3.5,4.7,3,2,2,7.02,0.657,1,1,1,2,2,1,4.73,2,0,7.095
1,1,30,21.5,4.2,4.7,1,1,1,9.82,0.665,2,1,1,2,2,1,4.27,2,1,6.405
2,1,26,20.7,4.6,3.7,1,2,2,6.37,0.675,2,1,,,,,5.33,2,0,7.995
2,1,20,20.4,3.7,3.6,3,3,1,6.43,0.685,2,1,,,,,6.3,2,1,9.45
2,1,18,21.9,4.8,4.9,3,2,2,6.46,0.687,2,1,1,2,2,1,4.88,2,0,7.32
1,1,26,19.8,4,4.1,3,2,1,5.1,0.697,2,1,1,2,2,1,8.33,1,1,12.495
1,1,26,23.7,4.4,3.3,3,2,1,7.15,0.732,2,1,1,2,2,1,3.25,2,1,4.875
2,1,23,24.3,5,3.9,3,2,2,6.31,0.776,2,1,1,2,2,1,3.67,2,0,5.505
1,2,42,18,4.2,,,2,1,6.9,0.796,2,1,1,2,2,1,10.33,3,1,15.495
2,1,21,21.8,4.2,,,2,2,5.76,0.806,1,1,2,2,1,2,8.67,2,1,13.005
1,1,18,27.2,4.2,5,3,2,1,6.12,0.814,3,1,1,2,2,1,3.38,2,1,5.07
2,1,24,24.2,4,4.2,1,1,1,8.87,0.82,2,1,1,2,2,1,3.33,2,0,4.995
2,2,24,23.3,5,4.9,1,2,1,6.37,0.822,3,2,2,2,3,3,19.75,1,1,29.625
1,2,22,14.2,5.4,4.1,2,2,1,9.49,0.826,3,2,1,1,3,2,17.3,2,0,25.95
1,1,,,4.4,5,1,,,9.23,0.83,2,2,1,2,3,2,12.35,3,1,18.525
1,1,,,4.2,4,3,,,5.49,0.835,1,1,1,2,2,1,4.97,1,0,7.455
2,2,,,4.2,4.3,3,,,6.02,0.849,1,1,1,2,2,1,3.33,2,1,4.995
1,1,27,21.7,4.3,5,1,3,1,6,0.854,2,1,2,1,3,3,34.42,3,1,51.63
1,1,22,21.1,3.6,4.1,1,1,1,5.93,0.867,2,1,2,1,3,3,23.15,3,1,34.725
1,1,34,30.6,3.9,5,1,2,1,6.65,0.878,3,1,3,2,3,3,26.5,1,1,39.75
2,2,24,24.9,4.2,4.5,3,2,2,4.42,0.892,2,2,3,2,3,3,20.5,1,1,30.75
2,2,25,14.7,4.4,4,1,2,2,4.9,0.893,2,1,2,2,3,3,24.5,1,1,36.75
1,1,22,19.3,4.3,4.6,3,2,1,5.54,,,,1,1,2,1,3.83,2,0,5.745
1,1,23,16.2,5.5,5,3,2,2,5.23,,,,2,2,3,3,15.08,1,1,22.62
2,1,38,38.3,4.5,5.4,3,2,2,4.82,,,,2,2,3,2,17.93,2,1,26.895
1,1,24,25.4,4.4,3.5,1,2,1,5.21,0.903,2,1,1,2,3,1,3.02,2,0,4.53
1,2,21,13.9,4,4.8,1,1,1,4.27,0.905,2,1,3,1,2,2,20.25,3,1,30.375
1,1,26,25,4.6,4.5,2,2,2,5.81,0.919,1,1,2,1,3,2,26.32,3,1,39.48
2,2,30,41.1,5,4.8,3,2,2,4.6,0.919,1,1,2,2,1,2,9.05,1,0,13.575
1,1,18,14.4,4.3,3.9,3,2,2,10.18,0.922,3,1,2,2,3,3,6.83,1,0,10.245
1,1,27,15.8,4,4.5,1,2,1,6.57,0.927,3,1,1,2,2,2,11.58,1,1,17.37
2,1,20,46.6,3.9,4.7,3,2,1,6.81,0.928,2,1,2,2,3,3,25.33,3,1,37.995
2,1,29,23.4,4.5,4,1,2,1,22.26,0.93,2,1,3,2,3,3,16.68,2,0,25.02
2,2,34,35.8,3,4.5,1,1,1,7.48,0.934,2,1,2,2,3,2,5.33,1,0,7.995
1,1,33,29.9,4.1,4.4,1,1,1,6.4,0.934,1,1,2,1,3,2,8.67,1,0,13.005
1,1,35,21,3.9,3.6,3,3,1,7.09,0.937,2,1,2,2,1,3,21.38,2,0,32.07
1,2,27,23.7,4.4,4.5,1,1,1,6.09,0.938,2,1,1,2,2,1,6.5,2,1,9.75
1,1,20,20.7,4.3,4.7,1,2,1,9.5,0.941,2,1,3,2,3,2,10.53,2,0,15.795
1,2,26,16.1,5.6,5.4,1,1,1,7.52,0.946,2,1,1,2,3,1,5.5,2,1,8.25
2,1,33,45,4,5,1,2,1,9.59,0.95,2,1,1,2,2,1,3.67,1,0,5.505
1,2,28,19.7,3.6,5,1,1,1,6.97,0.953,1,1,1,1,2,1,6.08,1,1,9.12
1,2,24,17.9,3.7,4.9,2,3,1,4.99,0.957,1,1,2,2,3,2,30.62,1,1,45.93
2,2,33,31.8,4.2,5,1,2,2,4.62,0.958,2,1,3,2,3,3,14.67,1,0,22.005
1,1,34,15.6,4,5.2,1,1,1,5.4,0.96,1,2,2,1,2,1,5.42,3,0,8.13
1,,,,4,5.1,1,1,1,4.92,0.965,,,2,2,3,3,11.67,3,1,17.505
1,,,,4.2,4.8,1,2,1,10.33,0.965,,,3,2,3,3,24.3,1,0,36.45
2,,,,5.2,6,3,2,1,8.21,0.966,,,4,2,2,1,4.67,1,0,7.005
1,,,,4.4,3.4,1,2,1,4.39,0.969,,,3,1,3,3,24.58,2,1,36.87
1,1,27,23,4.5,4.7,1,2,1,4.04,0.971,,,2,2,3,2,14.82,2,0,22.23
1,1,36,18,4.2,4.7,3,2,1,5.47,0.972,1,1,2,2,3,2,14.83,1,0,22.245
1,1,18,21.8,4.4,5,3,3,2,6.14,0.978,2,1,1,1,2,1,3.5,3,0,5.25
2,1,29,21.1,4.2,3.9,1,1,1,6.49,0.979,2,1,3,2,3,2,24.67,3,1,37.005
1,1,24,17.3,3.9,4,1,1,1,8.72,0.98,2,1,3,2,3,3,15.28,2,0,22.92
2,1,39,26.3,3.7,4,1,2,1,4.75,0.981,2,1,1,2,2,1,27.5,3,1,41.25
1,2,20,20.8,5.1,4.7,1,1,1,5.62,0.981,1,3,2,2,3,1,6.5,1,0,9.75
1,1,25,19,3.2,4.6,3,2,2,8.97,0.982,2,1,3,1,3,3,36.45,2,1,54.675
2,1,32,31.6,4.2,4.9,3,2,1,5.05,0.985,3,1,2,1,2,2,8.33,1,0,12.495
1,2,21,19.6,4.1,4.6,1,2,1,5.63,0.985,2,1,3,2,3,3,18.67,1,1,28.005
1,1,24,13.6,3.7,5,1,2,1,9.44,0.986,3,2,3,1,3,2,32.12,2,1,48.18
1,1,21,21.2,4.6,4.5,3,2,1,9.35,0.987,2,1,2,2,3,3,30.6,3,0,45.9
1,1,27,23.4,4.9,3.5,1,3,1,6.89,0.989,1,1,1,2,2,1,10.5,3,0,15.75
2,1,24,24.5,4.4,4.6,1,2,1,6.64,0.99,3,2,2,2,3,1,5.92,1,0,8.88
1,2,22,16.7,4.5,4.4,1,2,2,6.39,0.996,2,1,1,2,2,1,4.37,2,0,6.555
2,2,27,31.3,4.2,5.5,3,2,2,9.13,0.997,2,1,1,2,3,1,8.05,2,1,12.075
2,2,23,24.4,4.5,4.8,3,2,2,4.72,0.997,2,1,2,1,3,2,10.5,3,0,15.75
2,1,19,18.7,4.6,5,1,1,2,7.5,0.997,2,1,3,1,3,3,13.63,2,0,20.445
2,2,29,20,3.7,3.8,3,2,1,6.57,0.998,2,1,3,2,3,3,15.27,2,1,22.905
2,2,30,32.1,4.1,5,1,2,1,8.27,0.999,1,2,3,2,3,3,13.88,2,0,20.82
2,1,26,27.5,4.1,4.9,1,2,1,7.36,1.002,2,1,3,2,3,3,26.67,2,0,40.005
2,1,26,45,4.2,4.3,3,2,1,6.41,1.006,2,1,2,2,2,2,4.5,2,0,6.75
2,2,20,34.8,4.7,5,3,2,2,4.88,1.009,2,1,1,2,1,1,4.33,1,1,6.495
1,1,25,23.9,4.2,3.9,2,2,2,5.76,1.009,2,1,2,1,3,2,24.25,1,0,36.375
1,2,29,29.9,4.2,4.3,1,2,1,6.54,1.009,2,1,2,2,3,2,21.3,3,0,31.95
1,1,28,17.2,4.3,4.8,1,1,1,5.69,1.009,1,1,2,2,3,2,11.67,1,0,17.505
1,2,33,21.4,4.1,4.6,1,1,1,7.01,1.009,2,1,3,2,3,3,8.5,1,1,12.75
1,2,26,16.7,4.4,5.4,3,2,1,9.41,1.011,3,1,3,2,3,3,15.5,2,1,23.25
1,1,23,15.8,4.1,4.5,3,2,2,5.24,1.012,1,1,2,2,3,2,7.78,2,0,11.67
1,1,20,37.6,4.5,4.9,1,2,2,9.96,1.012,2,2,2,1,3,3,18.95,2,0,28.425
2,1,30,28.3,4.3,4.6,3,2,1,5.61,1.013,2,1,1,2,2,2,5.5,3,0,8.25
2,1,24,20.2,3.5,4.5,3,2,2,5.3,1.013,2,1,2,2,3,2,24.5,1,0,36.75
1,2,33,13,4.6,4.8,2,1,1,6.03,1.014,3,3,1,2,3,3,18.17,1,1,27.255
2,1,17,44.8,3.8,4.1,1,2,1,8.29,1.014,2,1,2,2,3,3,28.03,1,0,42.045
1,1,25,16.9,4.3,4.5,3,2,1,4.74,1.014,2,1,3,1,3,2,7.42,1,0,11.13
1,2,22,18.4,3.8,4,1,2,1,6.65,1.016,2,2,2,1,3,3,13.73,1,1,20.595
1,1,19,21,3.8,4.2,1,1,1,4.35,1.016,2,2,3,1,3,3,18.68,2,0,28.02
2,2,33,60.6,3.5,5.5,1,2,1,7.92,1.019,2,1,1,2,3,2,25.18,1,0,37.77
1,1,32,29.3,3.7,4.7,1,2,1,4.71,1.019,2,1,2,2,3,3,12.67,1,1,19.005
1,1,27,14.2,4.2,4.5,1,1,1,6.27,1.02,2,1,2,2,2,1,5.83,2,1,8.745
2,1,25,24.8,4.8,4.2,3,2,2,8.4,1.022,2,1,2,2,2,3,7.1,2,1,10.65
2,2,27,39.5,3.4,4.5,1,2,2,7.74,1.025,3,1,3,2,3,3,20.33,1,1,30.495
2,1,29,30.7,3.7,4.7,1,2,1,5.43,1.026,2,1,2,2,3,3,18.8,1,1,28.2
2,2,31,28.8,4.4,4.5,1,2,1,5.36,1.026,2,1,2,2,2,2,8.58,1,0,12.87
2,2,27,19.7,3.5,4.5,2,2,2,9.19,1.026,3,1,2,1,3,2,13.25,2,1,19.875
2,1,33,26.1,4.7,4.8,3,2,1,6.55,1.028,2,1,2,2,3,3,24.5,1,0,36.75
2,1,24,31.4,5.6,5.9,1,1,1,6.03,1.028,1,2,2,2,3,1,8.67,3,0,13.005
2,2,29,37.8,4.5,5.2,1,2,1,4.44,1.029,2,1,2,2,3,2,28.17,3,1,42.255
1,2,23,21.2,4.4,5,1,1,1,16.97,1.031,3,2,3,2,3,3,18.37,2,1,27.555
1,2,29,14.2,3.7,4,1,1,1,5.52,1.032,1,1,1,1,1,1,7.5,3,0,11.25
1,1,25,18.9,4.1,4.5,1,1,1,5.25,1.033,1,2,1,2,3,1,3.95,2,0,5.925
2,1,23,27.4,4.3,4.3,1,2,1,5.97,1.033,2,2,3,1,3,3,16.57,1,0,24.855
1,1,38,21.4,3.8,5,1,2,1,5.14,1.035,2,1,2,2,3,2,25.67,1,0,38.505
2,1,40,39.5,4.5,4.7,3,2,1,4.93,1.036,1,1,2,1,1,2,19.42,1,0,29.13
1,1,38,13.8,3.6,4.1,1,1,1,4.94,1.037,3,1,2,2,1,2,10.52,1,1,15.78
1,1,28,18.8,4.6,4.6,1,1,2,7.3,1.039,2,1,2,2,2,2,5.73,2,1,8.595
2,1,18,38.6,4.9,4.1,3,2,1,5.12,1.039,2,1,2,2,3,3,30.18,1,1,45.27
2,1,28,21.4,4.7,5.1,1,2,1,8.01,1.041,3,1,3,2,3,3,20.17,1,1,30.255
1,1,27,26.4,4.3,4.4,1,2,1,5.77,1.042,1,1,1,1,2,1,3.33,1,0,4.995
2,1,16,27.4,4.4,4.9,1,2,1,7.34,1.042,1,1,2,1,1,2,10.67,3,0,16.005
2,1,18,21.7,5.3,4.6,1,2,1,11.05,1.043,2,3,2,1,3,3,14.5,1,0,21.75
2,1,40,30.7,4.1,5.2,3,2,2,5.55,1.043,1,1,3,2,3,3,30.73,1,0,46.095
2,2,42,35.4,4,5.2,3,2,1,6.11,1.043,2,1,3,2,1,3,11.08,2,0,16.62
1,2,45,25.6,4.5,4.1,1,1,1,8.96,1.045,3,1,3,1,3,1,18.67,1,1,28.005
2,1,38,27.1,4.5,4.8,3,2,1,6.76,1.046,2,1,2,2,1,3,10.5,2,1,15.75
1,1,24,19.9,4.5,4.6,1,2,2,5.19,1.047,3,1,2,1,3,3,25.95,1,0,38.925
1,2,21,18.3,4.4,4,1,2,1,8.04,1.048,2,1,2,1,3,3,13.03,2,1,19.545
1,1,26,21.1,4.9,3.9,1,1,1,7.16,1.048,2,1,3,2,3,2,14.28,2,0,21.42
1,1,20,14.2,4.5,4.7,1,1,1,5.14,1.049,3,1,2,2,3,2,10.33,3,1,15.495
1,1,30,14.1,3.5,4.4,1,1,1,6.72,1.049,2,1,3,2,3,3,33.43,1,1,50.145
1,1,24,13.5,3.2,4.3,1,3,1,7.92,1.05,2,1,3,2,3,3,15.67,2,1,23.505
1,1,24,14.2,4.2,3.7,1,2,1,12.14,1.05,3,1,3,2,3,2,17.72,2,1,26.58
1,1,23,12.8,4.9,3.5,1,2,1,4.92,1.051,2,1,3,1,3,3,40.4,3,0,60.6
2,1,25,41.6,3.2,4.8,1,2,1,7.6,1.054,2,1,2,2,3,3,25.6,1,1,38.4
1,1,28,11.4,3.8,4,1,2,1,4.28,1.054,1,1,3,2,3,2,18.5,3,0,27.75
2,1,26,37.4,3.7,4,3,2,1,4.3,1.057,2,1,2,2,3,2,16.67,1,1,25.005
1,1,33,18,3.7,4.8,3,2,1,11.27,1.059,3,1,3,2,3,3,40.17,1,1,60.255
1,1,22,20.5,3.6,4.1,1,1,1,8.85,1.06,2,1,2,2,3,3,7.87,2,1,11.805
2,1,29,39.5,4.3,4.5,2,2,1,5.85,1.061,1,2,1,2,3,1,15.17,2,0,22.755
1,1,22,15.5,4.5,4.8,1,2,1,7.22,1.061,1,1,3,2,3,3,13.33,2,0,19.995
2,1,29,35.1,4.7,4.8,2,2,2,5.31,1.062,1,1,1,2,3,1,5.33,2,0,7.995
1,1,23,14.4,4.5,3.9,1,2,1,4.73,1.062,1,2,1,2,3,2,20.72,1,0,31.08
1,1,18,19.5,4.2,5.7,1,2,2,5.79,1.062,2,1,2,2,3,3,20.22,1,0,30.33
1,1,28,15.4,3.4,3.7,1,2,1,4.56,1.063,2,1,1,2,2,1,15.67,3,1,23.505
1,2,35,147.3,4.7,4.6,1,1,1,5.95,1.063,2,1,2,2,1,2,8.5,2,1,12.75
1,2,20,11.7,4.6,4.3,1,2,1,7.22,1.063,3,1,3,2,3,3,27.68,1,1,41.52
2,2,36,30.7,4.5,5,2,2,1,7.55,1.066,3,1,3,2,3,3,22.17,1,0,33.255
1,1,49,26.2,3.4,4.4,3,2,1,5.01,1.067,1,1,2,2,3,3,22.17,1,0,33.255
2,2,26,45,4.2,4.3,2,2,1,6.13,1.068,1,1,2,1,1,2,6.9,2,0,10.35
1,2,47,17.4,4.2,4.3,1,2,1,4.24,1.07,1,1,1,2,1,1,5.03,1,0,7.545
1,2,23,16.7,4.4,3.6,1,1,1,6.49,1.07,3,1,2,1,3,2,18.83,2,1,28.245
2,1,17,23.5,4.6,5,3,1,1,6.87,1.07,3,1,2,1,3,2,6.5,1,1,9.75
1,1,30,15.5,4.7,4.2,1,2,1,6.37,1.07,2,1,2,2,2,2,6.48,1,0,9.72
1,2,28,33.1,3.7,4.3,1,2,2,5.33,1.071,2,1,3,2,3,2,33.43,1,1,50.145
1,1,24,18,3.5,4,1,2,2,7.33,1.072,3,1,2,2,3,3,32.58,3,1,48.87
1,2,27,9.4,3.2,4.6,1,1,1,6.32,1.072,2,1,3,1,3,3,12.83,2,1,19.245
1,1,31,18.6,4.3,4.5,1,2,2,5.67,1.074,2,1,2,2,2,2,6.83,1,1,10.245
2,1,49,26.7,5,5.5,1,3,1,5.11,1.074,1,1,2,2,1,1,9.5,1,1,14.25
1,1,26,18.1,4.2,4,1,1,1,2.97,1.074,1,1,2,1,2,1,8.33,1,0,12.495
1,1,29,14.7,4.5,4.7,3,2,2,7.74,1.074,2,2,2,2,3,3,23.02,2,1,34.53
1,1,27,20.9,4.6,5.2,1,2,1,13.96,1.075,3,1,2,2,3,3,20.4,1,0,30.6
1,2,24,16.5,4.1,4.4,1,1,1,8.13,1.075,3,1,3,1,3,3,11.33,2,1,16.995
1,1,37,24.7,3.7,4.5,2,1,1,6.46,1.077,1,1,1,2,2,1,3.47,2,0,5.205
2,1,24,24.9,4,4.4,1,1,1,4.33,1.078,2,1,2,2,3,2,15.67,1,1,23.505
1,1,32,25,3.6,4.1,1,3,1,9.77,1.078,2,1,3,2,3,3,35.75,1,1,53.625
1,1,20,20.8,3.3,5,1,2,1,5.19,1.078,2,1,3,2,3,3,12.67,2,0,19.005
1,1,19,12.8,3.7,3.7,1,2,1,10.19,1.079,2,2,3,2,3,3,29.25,1,0,43.875
2,1,27,28.5,3.7,4.6,1,1,1,5.47,1.081,1,1,2,2,3,2,10.67,1,1,16.005
2,1,27,43.3,4.4,4.6,3,2,2,6.34,1.083,1,1,1,2,2,2,18.33,1,0,27.495
1,1,18,24,4.3,3.3,1,2,2,7.04,1.083,2,2,3,1,3,3,19.57,1,0,29.355
1,1,41,26.1,3.6,3.9,3,2,1,9.69,1.085,3,1,2,2,2,3,14.57,2,0,21.855
2,2,15,28,4.3,5,1,2,1,8.81,1.085,2,3,2,1,3,3,13.33,1,0,19.995
1,1,24,18.3,4.1,4.2,1,1,1,6.04,1.085,2,1,3,1,3,2,27.5,3,0,41.25
1,1,36,16.4,4.8,3.7,1,3,1,10.93,1.086,2,1,1,2,2,1,10.92,3,1,16.38
1,1,26,17.6,4.6,4.7,1,2,2,6.15,1.087,3,1,2,2,1,2,10.52,3,1,15.78
1,2,21,16.2,3.7,4.5,1,2,1,4.21,1.087,2,1,3,1,3,2,30.67,1,0,46.005
1,1,39,22.2,3.8,4.2,1,2,2,6.96,1.088,2,1,2,1,3,2,18.5,2,0,27.75
2,1,29,24,4.5,5.5,1,1,1,5.83,1.091,2,1,1,2,2,1,10.5,2,0,15.75
2,1,30,42.1,4,5,1,2,1,6.94,1.092,1,1,1,2,2,1,4.5,1,0,6.75
1,2,49,22.6,4.3,3.8,1,2,1,4.44,1.093,1,1,1,1,1,1,3.33,1,0,4.995
1,1,30,15.5,3.6,4.9,2,2,2,6.02,1.093,2,1,3,2,3,2,24.83,3,1,37.245
2,1,33,35.6,4.2,4.6,1,1,1,8.86,1.094,3,1,2,2,3,2,16.5,1,0,24.75
1,2,32,17.4,3.8,4.5,1,1,1,6.36,1.094,2,1,3,2,3,3,13.5,3,0,20.25
1,2,23,17,4.3,3.9,1,2,1,8.98,1.094,1,1,3,2,3,3,8.82,1,0,13.23
1,2,45,16.1,4.4,4.5,1,1,1,7.01,1.095,3,2,3,2,3,2,16.9,1,1,25.35
2,2,27,35.6,4.9,5.3,1,2,1,6.72,1.096,2,1,2,2,3,2,21.63,3,0,32.445
2,1,27,33.8,4.5,5,1,2,1,7.43,1.098,3,1,3,2,3,3,14.83,1,1,22.245
2,1,43,20.6,4,5,3,2,2,6.73,1.099,1,1,2,1,2,2,11.88,1,0,17.82
1,2,28,23.1,3.4,4,1,1,1,11.76,1.1,3,2,3,2,2,3,27.83,2,1,41.745
1,2,20,14.2,4.5,4.6,1,3,1,4.78,1.105,2,1,2,2,3,2,13.67,3,0,20.505
1,1,29,22.9,5.3,4.3,1,1,1,10.94,1.105,2,2,2,2,3,3,17.85,2,0,26.775
2,2,33,40.1,4.4,6,1,1,1,5.17,1.106,2,1,2,1,3,2,13.37,1,0,20.055
2,2,28,45.8,4.5,5.5,1,2,1,4.15,1.108,2,1,2,2,3,3,11.52,2,0,17.28
2,1,25,22.8,3.1,3.6,1,2,2,6.91,1.109,3,1,2,1,3,3,25.33,1,1,37.995
2,2,26,23.7,5.4,5,1,1,1,7.43,1.109,2,1,2,2,2,3,17.68,2,1,26.52
1,1,25,36.3,4.1,3.9,1,1,2,7.07,1.109,3,1,3,2,3,3,26.33,2,0,39.495
2,2,30,46.5,4.7,5,3,2,1,5.07,1.11,2,1,2,1,3,3,23.67,2,1,35.505
1,1,31,29.7,4.5,4.7,2,1,1,7.11,1.11,2,1,2,2,1,3,22.48,1,1,33.72
1,2,27,40,3.5,3.8,1,2,1,8.99,1.111,3,3,1,2,3,1,6.67,3,1,10.005
1,2,22,14.6,5,5.2,3,3,2,6.65,1.112,2,1,2,1,3,3,39.67,1,1,59.505
2,2,24,27.2,5.1,4.9,1,2,1,6.46,1.113,3,2,3,1,3,3,28.17,1,0,42.255
1,1,23,19.8,4.2,4.5,1,1,1,6.37,1.117,2,1,1,2,1,1,2.83,2,0,4.245
1,1,26,16.7,3.6,4.6,2,2,1,5.78,1.117,2,1,2,2,1,2,2.92,1,0,4.38
1,1,25,43.6,3.9,4.5,1,1,1,5.13,1.118,1,1,2,1,2,2,15.33,3,1,22.995
2,1,24,39.5,4.4,4.6,1,2,2,4.86,1.118,1,1,2,2,2,1,5.17,1,0,7.755
1,2,46,20,4.5,3.7,1,1,1,5.67,1.119,2,1,1,2,3,1,5.67,2,0,8.505
1,1,21,17.6,4.5,4.8,1,2,1,7.18,1.119,1,2,1,1,3,2,15.67,1,0,23.505
1,1,24,18.3,5,3.7,1,1,1,6.6,1.121,1,1,3,1,2,1,1.32,2,0,1.98
1,2,25,16.7,4.2,4.6,1,2,1,6.73,1.122,2,1,2,2,2,1,10.5,2,1,15.75
1,2,22,19.5,4,4.2,3,2,2,5.63,1.123,2,1,2,1,3,3,12.5,1,0,18.75
1,1,23,19.8,4.4,4.6,1,2,1,5.86,1.124,2,1,2,2,3,2,10.33,2,1,15.495
1,2,27,14.1,4.8,4.5,1,2,1,5.21,1.128,1,1,2,2,3,3,15.68,1,1,23.52
1,1,29,13.8,3.5,4,1,2,2,5.61,1.129,2,1,3,1,3,3,38.67,3,1,58.005
1,1,55,30.7,5,4.8,2,2,1,5.06,1.131,2,1,2,1,3,3,9.5,1,1,14.25
1,1,26,12.1,3.8,3.7,1,1,1,6.79,1.131,3,1,2,1,1,2,6.83,1,0,10.245
1,1,64,25.4,4.1,5,2,2,1,8.03,1.132,2,1,2,2,3,3,30.85,3,1,46.275
1,1,20,21.2,4,4.6,1,2,1,4.43,1.132,1,2,2,2,3,1,8.25,1,1,12.375
1,1,29,24.5,4.2,3.9,1,1,1,6.12,1.133,1,1,1,2,2,1,2.95,1,0,4.425
1,2,30,18.2,3.6,4,2,1,1,8.16,1.134,3,1,3,2,3,2,12.25,1,1,18.375
1,1,20,20.8,3.7,4.7,1,1,1,4.8,1.135,2,1,1,1,2,1,3.83,1,0,5.745
2,1,45,45,5.9,4,1,2,2,6.52,1.136,3,2,2,1,3,3,40.5,2,0,60.75
1,2,38,16.3,4.2,4,2,2,2,3.79,1.138,2,1,2,2,2,2,8.5,1,1,12.75
2,2,31,38.2,3.6,4.2,1,2,1,8.89,1.138,2,2,3,2,3,3,40.5,1,0,60.75
2,1,22,41.3,4,4.6,1,2,2,6.89,1.143,2,2,2,1,3,3,35.67,1,1,53.505
2,1,26,31.2,5,5.5,1,2,1,6.89,1.144,2,1,1,2,1,1,7.83,1,1,11.745
2,1,24,32,5,4.3,2,2,1,7.53,1.148,2,2,3,2,3,3,23.12,1,0,34.68
2,1,27,32.4,4.5,5.4,1,3,2,11.79,1.15,2,2,1,2,2,1,20.67,1,0,31.005
1,2,25,22.7,4.3,4.2,3,2,2,9.38,1.151,3,1,2,1,3,3,9.5,2,1,14.25
2,1,29,30.2,4,4.3,1,2,1,8.65,1.153,2,3,1,2,2,1,14.5,3,0,21.75
1,1,17,11.8,3.7,5,1,2,1,7.38,1.153,3,1,2,2,1,2,2.17,1,0,3.255
1,2,26,43,3.7,4.6,3,3,1,6.73,1.154,2,1,1,2,3,1,7.17,2,1,10.755
1,1,29,32.9,3.8,4,3,2,1,7.24,1.155,2,1,1,2,2,1,5.67,3,0,8.505
2,1,32,36,4.2,5,3,2,1,6.39,1.157,2,1,1,2,2,2,14.03,2,0,21.045
2,1,17,24.1,4.2,4.5,1,2,2,6.86,1.158,2,2,2,2,3,3,27.67,1,1,41.505
1,1,35,17.4,3.8,4.1,1,2,1,5.34,1.159,2,1,2,1,3,2,30.83,3,0,46.245
1,1,26,17.9,4,5.2,1,2,1,9.34,1.16,2,2,1,2,2,1,6.67,1,0,10.005
1,2,25,24.1,4.2,3.8,2,2,1,4.15,1.16,1,1,2,1,3,2,18.1,1,1,27.15
1,2,36,22.2,4.1,4.2,1,1,1,6.6,1.161,2,2,2,2,3,3,38.33,2,1,57.495
1,1,23,19.6,3.7,4.5,1,2,1,4.66,1.162,1,1,2,1,3,2,10.67,3,0,16.005
2,1,33,27.5,3.4,4,1,2,1,6,1.163,2,1,2,2,2,2,11.95,1,1,17.925
2,2,29,44.5,4.5,4,1,2,1,6.14,1.163,1,1,3,1,3,3,18.73,1,0,28.095
2,1,27,35.8,4.6,4,1,2,2,18.56,1.165,3,1,3,1,3,2,14.5,1,1,21.75
2,1,21,31.1,4.8,3.7,1,2,1,5.45,1.166,1,1,2,2,1,2,6.92,1,0,10.38
2,2,44,30.9,3.4,4,1,3,1,6.57,1.176,2,1,2,1,1,2,15.85,2,0,23.775
1,2,27,20.8,4.5,4.3,1,2,1,4.75,1.179,2,1,4,2,1,2,17.87,2,1,26.805
1,2,22,16,4.4,4,1,2,1,7.98,1.183,2,1,3,2,3,3,11.98,2,0,17.97
1,2,32,23.6,3.5,4.2,1,2,2,8.58,1.185,2,1,1,2,3,3,14.38,2,1,21.57
2,1,31,40.6,5,4.4,3,2,1,5.28,1.185,1,1,2,2,3,3,16.42,1,1,24.63
1,1,21,18.4,4.1,4.5,1,2,1,6.26,1.186,2,3,2,2,3,2,15.42,1,0,23.13
1,1,26,24.4,4.2,4.7,1,2,2,6.54,1.186,2,1,3,2,3,3,26.75,1,1,40.125
2,1,23,30.9,4.1,4.5,1,2,2,5.45,1.187,2,1,2,2,3,2,18.5,3,0,27.75
1,2,24,21.6,4.1,4,1,2,1,4.65,1.187,1,1,2,1,1,1,1.08,2,0,1.62
1,1,24,22.4,4.2,4.1,1,2,1,5.94,1.188,2,1,3,1,3,2,17.58,1,1,26.37
1,1,20,30.1,4.9,4.9,1,1,1,13.62,1.192,3,1,2,1,3,3,17.33,2,1,25.995
1,1,40,22.2,4.5,4.3,3,2,1,5.33,1.193,2,1,2,1,3,3,12.8,1,0,19.2
2,1,29,49.1,4.9,4.2,1,1,2,7.18,1.198,2,1,2,2,1,2,20.7,1,0,31.05
1,2,34,20.8,4.2,4.7,1,1,1,4.36,1.205,2,1,2,1,1,2,4.33,1,1,6.495
2,1,22,40.1,4.2,4.6,1,2,2,5.53,1.205,1,1,2,2,3,3,18.5,3,1,27.75
1,1,18,14.1,4.4,4.5,1,2,1,5.13,1.207,2,2,2,2,2,1,6.17,1,0,9.255
1,2,34,20.8,4.2,4,1,2,1,4.19,1.209,1,1,2,1,3,2,20.58,3,1,30.87
2,2,25,20.8,4.1,4.6,3,2,1,6.81,1.21,2,1,2,2,3,2,28.77,3,0,43.155
2,1,34,40.6,3.7,4.5,1,2,1,4.21,1.214,3,1,2,1,3,2,21.58,3,1,32.37
1,1,26,16.4,4.2,4.5,3,2,2,7.21,1.221,2,1,1,2,3,1,35.67,3,1,53.505
2,1,52,30.8,4.2,4.3,1,3,1,5.02,1.224,2,1,2,2,3,2,18.58,1,1,27.87
1,2,20,21.2,5,4.7,1,1,1,4.75,1.227,2,1,1,2,1,1,4.5,2,1,6.75
1,2,31,20.5,4.3,4.4,1,2,1,5.43,1.227,2,1,2,2,3,2,28.22,2,1,42.33
1,1,30,26.7,3.7,4.1,1,1,2,4.73,1.227,2,2,3,2,3,3,38.23,1,1,57.345
2,1,40,43,4,4.2,1,2,1,5.78,1.228,1,1,2,2,3,2,20.33,3,1,30.495
1,1,36,16.5,4.2,3.6,2,2,1,5.14,1.235,2,2,1,2,2,2,22.67,2,1,34.005
1,1,41,20.3,3.6,3.8,1,1,1,10.26,1.236,3,2,3,1,3,3,36.6,1,1,54.9
1,1,32,18.7,3.9,5.2,3,2,2,5.76,1.238,2,1,3,2,3,3,20.67,1,1,31.005
1,1,26,22,4.6,5,3,2,1,5.1,1.241,1,1,1,2,2,1,4.42,1,1,6.63
2,1,25,41.1,4.4,5,3,3,2,7.63,1.241,2,1,3,2,3,3,12.93,1,0,19.395
2,1,28,26.6,4.8,5.4,1,2,1,6.98,1.247,2,1,3,2,3,2,15.08,1,1,22.62
1,1,22,13,4.1,4.5,1,2,1,8.86,1.249,1,1,1,1,2,1,8.83,2,0,13.245
1,1,24,13.6,4.2,4.4,1,2,1,4.08,1.25,3,1,2,2,3,2,7.5,2,1,11.25
1,1,27,26.4,4.3,4.4,2,2,1,5.58,1.252,2,1,1,2,1,1,5.68,1,0,8.52
2,1,37,50.1,4.4,4.4,3,2,1,6.8,1.259,2,2,2,2,3,3,28.67,1,1,43.005
1,1,27,15,3.5,4,3,2,1,5.52,1.263,3,1,3,1,3,3,24.67,2,1,37.005
1,1,24,15.6,3.7,3.7,1,2,1,5.94,1.264,2,1,2,2,2,3,22.12,1,1,33.18
2,2,33,36.4,4.8,5.5,1,2,1,5.19,1.264,1,1,2,2,3,2,16.7,3,0,25.05
1,1,24,19.3,3.7,5.2,1,1,1,7.51,1.266,2,1,1,1,3,1,5.77,2,1,8.655
1,1,33,19.7,4.5,4.7,1,1,1,6.04,1.266,3,2,2,2,3,3,20.65,1,1,30.975
1,1,21,20.5,4.2,4.6,1,2,1,9.56,1.269,3,2,1,2,3,2,19.33,3,1,28.995
1,2,25,28.3,4.2,4.2,1,1,1,5.22,1.275,1,1,1,1,3,1,11.67,1,1,17.505
1,2,26,27.5,3.5,4.5,1,1,1,8.07,1.288,2,1,1,1,2,1,7.33,2,0,10.995
1,2,20,17.9,5,4.5,1,1,1,5.33,1.304,1,1,2,2,2,3,23.33,2,1,34.995
1,1,21,23.4,4.1,4.7,1,2,2,7.44,1.306,2,1,2,1,3,2,21.18,2,1,31.77
2,1,26,30.4,3.3,4.2,3,2,2,6.22,1.309,2,1,3,2,3,3,15.67,2,1,23.505
1,1,20,19.5,4.2,4.5,1,2,1,5.94,1.315,3,1,2,2,3,3,10.67,1,1,16.005
1,1,20,19.8,4.2,5.5,1,2,2,4.98,1.316,2,1,3,2,3,3,17.7,2,0,26.55
2,1,49,37.6,3.6,4.6,3,2,1,4.08,1.32,1,1,2,2,3,2,15.65,1,1,23.475
2,2,27,44.3,4.2,4.8,3,2,2,7.14,1.324,2,1,3,2,3,3,22.18,1,1,33.27
1,2,21,13,3.8,4.2,1,2,2,6.06,1.327,3,1,2,2,3,2,24.83,3,1,37.245
2,1,28,32.6,4.2,4.6,1,1,1,7.09,1.334,3,1,3,1,3,3,39.08,2,0,58.62
1,2,37,25.3,4,4.5,1,2,1,5.89,1.334,3,1,3,2,3,3,30.67,3,1,46.005
1,1,31,12.8,3.5,4.3,1,2,1,9.59,1.339,1,2,3,2,3,3,34.98,1,0,52.47
1,1,24,14.2,4.8,4.6,1,1,1,9.34,1.348,3,2,1,2,3,3,27.57,2,1,41.355
1,1,46,29.9,3.5,3.8,1,1,1,5.87,1.348,1,1,2,2,3,2,34.83,3,1,52.245
1,1,31,31.4,3.9,4.6,3,2,1,6.24,1.352,1,1,1,2,2,1,3.85,1,0,5.775
1,1,34,13.3,4,4.3,1,1,2,6.72,1.361,2,1,1,2,3,2,11.95,2,1,17.925
1,1,28,20.1,4.3,4.5,3,2,1,10.12,1.372,2,1,1,2,1,1,4.98,1,1,7.47
1,1,26,18.9,4.5,4.4,1,1,1,4.63,1.387,1,1,2,2,3,2,29.05,3,0,43.575
1,1,17,16.5,3.7,3.9,1,2,1,4.45,1.394,2,3,2,1,3,3,15.58,1,0,23.37
1,1,24,14.3,4.5,3,1,2,1,4.19,1.41,2,1,2,1,3,2,14.83,3,0,22.245
1,1,19,19.9,4.2,4,1,2,1,7.6,1.411,2,1,1,2,2,1,14.08,2,1,21.12
1,2,26,12.1,3,5,3,2,1,6.24,1.42,3,1,3,2,3,3,7.67,1,1,11.505
2,1,45,24.9,3.8,5.6,1,1,1,5.95,1.444,2,2,2,2,3,2,14.5,1,1,21.75
1,2,40,22.5,4.1,4.7,1,1,2,5.68,1.446,3,1,3,2,3,3,35.08,3,0,52.62
2,1,26,30.1,5.5,6,1,2,1,6.23,1.469,1,1,2,2,2,1,10.08,2,0,15.12
1,1,21,21.7,4,4.3,1,2,1,5.59,1.475,2,1,1,2,2,1,9.9,2,0,14.85
1,1,28,18.1,4.2,4,1,2,1,4.31,1.475,1,1,3,2,3,2,25.05,1,0,37.575
1,1,26,17.8,4.4,4,1,2,1,7.22,1.502,2,1,3,2,1,2,7.77,2,0,11.655
1,2,31,15.3,4.3,4.5,3,2,2,5.03,1.531,2,1,2,2,3,2,14.57,1,1,21.855
1,1,24,21.8,3.5,4.5,1,1,1,4.9,1.582,2,1,1,1,2,1,4.93,2,0,7.395
1,1,26,18.8,4.2,4.6,1,1,1,6.03,1.585,1,1,2,2,3,2,19.57,3,0,29.355
1,1,28,22,4.2,4.1,1,2,1,5.99,1.61,2,3,2,2,3,3,22.7,1,1,34.05
1,1,45,29.2,3.7,4.4,1,1,1,7.09,1.67,2,1,2,2,3,3,10.5,1,1,15.75
1,1,33,15.2,4.7,3.9,1,1,1,6.64,1.706,2,1,4,1,2,1,5.77,1,0,8.655
1,1,27,18.9,3.7,4.9,1,1,1,5.58,1.781,2,2,1,1,3,1,12.12,3,0,18.18
1,2,21,17.8,4.3,3.8,1,2,1,7.63,1.913,2,1,1,2,3,2,22.38,1,1,33.57
1,1,26,14.7,3.7,4,1,1,1,5.32,1.942,2,1,1,1,2,1,4.43,2,0,10.12
1 sex smoke age bmi mouth_open bucal_relax toot_morph root_number root_curve lenspace denseratio Pglevel Pgverti Winter presyp flap operation time surgage Yqol times
2 2 2 27 23.1 4.2 4.4 3 2 2 4.43 0.554 1 1 1 1 2 2 15.5 2 0 23.25
3 1 1 24 16.7 3.5 4.7 3 2 2 7.02 0.657 1 1 1 2 2 1 4.73 2 0 7.095
4 1 1 30 21.5 4.2 4.7 1 1 1 9.82 0.665 2 1 1 2 2 1 4.27 2 1 6.405
5 2 1 26 20.7 4.6 3.7 1 2 2 6.37 0.675 2 1 5.33 2 0 7.995
6 2 1 20 20.4 3.7 3.6 3 3 1 6.43 0.685 2 1 6.3 2 1 9.45
7 2 1 18 21.9 4.8 4.9 3 2 2 6.46 0.687 2 1 1 2 2 1 4.88 2 0 7.32
8 1 1 26 19.8 4 4.1 3 2 1 5.1 0.697 2 1 1 2 2 1 8.33 1 1 12.495
9 1 1 26 23.7 4.4 3.3 3 2 1 7.15 0.732 2 1 1 2 2 1 3.25 2 1 4.875
10 2 1 23 24.3 5 3.9 3 2 2 6.31 0.776 2 1 1 2 2 1 3.67 2 0 5.505
11 1 2 42 18 4.2 2 1 6.9 0.796 2 1 1 2 2 1 10.33 3 1 15.495
12 2 1 21 21.8 4.2 2 2 5.76 0.806 1 1 2 2 1 2 8.67 2 1 13.005
13 1 1 18 27.2 4.2 5 3 2 1 6.12 0.814 3 1 1 2 2 1 3.38 2 1 5.07
14 2 1 24 24.2 4 4.2 1 1 1 8.87 0.82 2 1 1 2 2 1 3.33 2 0 4.995
15 2 2 24 23.3 5 4.9 1 2 1 6.37 0.822 3 2 2 2 3 3 19.75 1 1 29.625
16 1 2 22 14.2 5.4 4.1 2 2 1 9.49 0.826 3 2 1 1 3 2 17.3 2 0 25.95
17 1 1 4.4 5 1 9.23 0.83 2 2 1 2 3 2 12.35 3 1 18.525
18 1 1 4.2 4 3 5.49 0.835 1 1 1 2 2 1 4.97 1 0 7.455
19 2 2 4.2 4.3 3 6.02 0.849 1 1 1 2 2 1 3.33 2 1 4.995
20 1 1 27 21.7 4.3 5 1 3 1 6 0.854 2 1 2 1 3 3 34.42 3 1 51.63
21 1 1 22 21.1 3.6 4.1 1 1 1 5.93 0.867 2 1 2 1 3 3 23.15 3 1 34.725
22 1 1 34 30.6 3.9 5 1 2 1 6.65 0.878 3 1 3 2 3 3 26.5 1 1 39.75
23 2 2 24 24.9 4.2 4.5 3 2 2 4.42 0.892 2 2 3 2 3 3 20.5 1 1 30.75
24 2 2 25 14.7 4.4 4 1 2 2 4.9 0.893 2 1 2 2 3 3 24.5 1 1 36.75
25 1 1 22 19.3 4.3 4.6 3 2 1 5.54 1 1 2 1 3.83 2 0 5.745
26 1 1 23 16.2 5.5 5 3 2 2 5.23 2 2 3 3 15.08 1 1 22.62
27 2 1 38 38.3 4.5 5.4 3 2 2 4.82 2 2 3 2 17.93 2 1 26.895
28 1 1 24 25.4 4.4 3.5 1 2 1 5.21 0.903 2 1 1 2 3 1 3.02 2 0 4.53
29 1 2 21 13.9 4 4.8 1 1 1 4.27 0.905 2 1 3 1 2 2 20.25 3 1 30.375
30 1 1 26 25 4.6 4.5 2 2 2 5.81 0.919 1 1 2 1 3 2 26.32 3 1 39.48
31 2 2 30 41.1 5 4.8 3 2 2 4.6 0.919 1 1 2 2 1 2 9.05 1 0 13.575
32 1 1 18 14.4 4.3 3.9 3 2 2 10.18 0.922 3 1 2 2 3 3 6.83 1 0 10.245
33 1 1 27 15.8 4 4.5 1 2 1 6.57 0.927 3 1 1 2 2 2 11.58 1 1 17.37
34 2 1 20 46.6 3.9 4.7 3 2 1 6.81 0.928 2 1 2 2 3 3 25.33 3 1 37.995
35 2 1 29 23.4 4.5 4 1 2 1 22.26 0.93 2 1 3 2 3 3 16.68 2 0 25.02
36 2 2 34 35.8 3 4.5 1 1 1 7.48 0.934 2 1 2 2 3 2 5.33 1 0 7.995
37 1 1 33 29.9 4.1 4.4 1 1 1 6.4 0.934 1 1 2 1 3 2 8.67 1 0 13.005
38 1 1 35 21 3.9 3.6 3 3 1 7.09 0.937 2 1 2 2 1 3 21.38 2 0 32.07
39 1 2 27 23.7 4.4 4.5 1 1 1 6.09 0.938 2 1 1 2 2 1 6.5 2 1 9.75
40 1 1 20 20.7 4.3 4.7 1 2 1 9.5 0.941 2 1 3 2 3 2 10.53 2 0 15.795
41 1 2 26 16.1 5.6 5.4 1 1 1 7.52 0.946 2 1 1 2 3 1 5.5 2 1 8.25
42 2 1 33 45 4 5 1 2 1 9.59 0.95 2 1 1 2 2 1 3.67 1 0 5.505
43 1 2 28 19.7 3.6 5 1 1 1 6.97 0.953 1 1 1 1 2 1 6.08 1 1 9.12
44 1 2 24 17.9 3.7 4.9 2 3 1 4.99 0.957 1 1 2 2 3 2 30.62 1 1 45.93
45 2 2 33 31.8 4.2 5 1 2 2 4.62 0.958 2 1 3 2 3 3 14.67 1 0 22.005
46 1 1 34 15.6 4 5.2 1 1 1 5.4 0.96 1 2 2 1 2 1 5.42 3 0 8.13
47 1 4 5.1 1 1 1 4.92 0.965 2 2 3 3 11.67 3 1 17.505
48 1 4.2 4.8 1 2 1 10.33 0.965 3 2 3 3 24.3 1 0 36.45
49 2 5.2 6 3 2 1 8.21 0.966 4 2 2 1 4.67 1 0 7.005
50 1 4.4 3.4 1 2 1 4.39 0.969 3 1 3 3 24.58 2 1 36.87
51 1 1 27 23 4.5 4.7 1 2 1 4.04 0.971 2 2 3 2 14.82 2 0 22.23
52 1 1 36 18 4.2 4.7 3 2 1 5.47 0.972 1 1 2 2 3 2 14.83 1 0 22.245
53 1 1 18 21.8 4.4 5 3 3 2 6.14 0.978 2 1 1 1 2 1 3.5 3 0 5.25
54 2 1 29 21.1 4.2 3.9 1 1 1 6.49 0.979 2 1 3 2 3 2 24.67 3 1 37.005
55 1 1 24 17.3 3.9 4 1 1 1 8.72 0.98 2 1 3 2 3 3 15.28 2 0 22.92
56 2 1 39 26.3 3.7 4 1 2 1 4.75 0.981 2 1 1 2 2 1 27.5 3 1 41.25
57 1 2 20 20.8 5.1 4.7 1 1 1 5.62 0.981 1 3 2 2 3 1 6.5 1 0 9.75
58 1 1 25 19 3.2 4.6 3 2 2 8.97 0.982 2 1 3 1 3 3 36.45 2 1 54.675
59 2 1 32 31.6 4.2 4.9 3 2 1 5.05 0.985 3 1 2 1 2 2 8.33 1 0 12.495
60 1 2 21 19.6 4.1 4.6 1 2 1 5.63 0.985 2 1 3 2 3 3 18.67 1 1 28.005
61 1 1 24 13.6 3.7 5 1 2 1 9.44 0.986 3 2 3 1 3 2 32.12 2 1 48.18
62 1 1 21 21.2 4.6 4.5 3 2 1 9.35 0.987 2 1 2 2 3 3 30.6 3 0 45.9
63 1 1 27 23.4 4.9 3.5 1 3 1 6.89 0.989 1 1 1 2 2 1 10.5 3 0 15.75
64 2 1 24 24.5 4.4 4.6 1 2 1 6.64 0.99 3 2 2 2 3 1 5.92 1 0 8.88
65 1 2 22 16.7 4.5 4.4 1 2 2 6.39 0.996 2 1 1 2 2 1 4.37 2 0 6.555
66 2 2 27 31.3 4.2 5.5 3 2 2 9.13 0.997 2 1 1 2 3 1 8.05 2 1 12.075
67 2 2 23 24.4 4.5 4.8 3 2 2 4.72 0.997 2 1 2 1 3 2 10.5 3 0 15.75
68 2 1 19 18.7 4.6 5 1 1 2 7.5 0.997 2 1 3 1 3 3 13.63 2 0 20.445
69 2 2 29 20 3.7 3.8 3 2 1 6.57 0.998 2 1 3 2 3 3 15.27 2 1 22.905
70 2 2 30 32.1 4.1 5 1 2 1 8.27 0.999 1 2 3 2 3 3 13.88 2 0 20.82
71 2 1 26 27.5 4.1 4.9 1 2 1 7.36 1.002 2 1 3 2 3 3 26.67 2 0 40.005
72 2 1 26 45 4.2 4.3 3 2 1 6.41 1.006 2 1 2 2 2 2 4.5 2 0 6.75
73 2 2 20 34.8 4.7 5 3 2 2 4.88 1.009 2 1 1 2 1 1 4.33 1 1 6.495
74 1 1 25 23.9 4.2 3.9 2 2 2 5.76 1.009 2 1 2 1 3 2 24.25 1 0 36.375
75 1 2 29 29.9 4.2 4.3 1 2 1 6.54 1.009 2 1 2 2 3 2 21.3 3 0 31.95
76 1 1 28 17.2 4.3 4.8 1 1 1 5.69 1.009 1 1 2 2 3 2 11.67 1 0 17.505
77 1 2 33 21.4 4.1 4.6 1 1 1 7.01 1.009 2 1 3 2 3 3 8.5 1 1 12.75
78 1 2 26 16.7 4.4 5.4 3 2 1 9.41 1.011 3 1 3 2 3 3 15.5 2 1 23.25
79 1 1 23 15.8 4.1 4.5 3 2 2 5.24 1.012 1 1 2 2 3 2 7.78 2 0 11.67
80 1 1 20 37.6 4.5 4.9 1 2 2 9.96 1.012 2 2 2 1 3 3 18.95 2 0 28.425
81 2 1 30 28.3 4.3 4.6 3 2 1 5.61 1.013 2 1 1 2 2 2 5.5 3 0 8.25
82 2 1 24 20.2 3.5 4.5 3 2 2 5.3 1.013 2 1 2 2 3 2 24.5 1 0 36.75
83 1 2 33 13 4.6 4.8 2 1 1 6.03 1.014 3 3 1 2 3 3 18.17 1 1 27.255
84 2 1 17 44.8 3.8 4.1 1 2 1 8.29 1.014 2 1 2 2 3 3 28.03 1 0 42.045
85 1 1 25 16.9 4.3 4.5 3 2 1 4.74 1.014 2 1 3 1 3 2 7.42 1 0 11.13
86 1 2 22 18.4 3.8 4 1 2 1 6.65 1.016 2 2 2 1 3 3 13.73 1 1 20.595
87 1 1 19 21 3.8 4.2 1 1 1 4.35 1.016 2 2 3 1 3 3 18.68 2 0 28.02
88 2 2 33 60.6 3.5 5.5 1 2 1 7.92 1.019 2 1 1 2 3 2 25.18 1 0 37.77
89 1 1 32 29.3 3.7 4.7 1 2 1 4.71 1.019 2 1 2 2 3 3 12.67 1 1 19.005
90 1 1 27 14.2 4.2 4.5 1 1 1 6.27 1.02 2 1 2 2 2 1 5.83 2 1 8.745
91 2 1 25 24.8 4.8 4.2 3 2 2 8.4 1.022 2 1 2 2 2 3 7.1 2 1 10.65
92 2 2 27 39.5 3.4 4.5 1 2 2 7.74 1.025 3 1 3 2 3 3 20.33 1 1 30.495
93 2 1 29 30.7 3.7 4.7 1 2 1 5.43 1.026 2 1 2 2 3 3 18.8 1 1 28.2
94 2 2 31 28.8 4.4 4.5 1 2 1 5.36 1.026 2 1 2 2 2 2 8.58 1 0 12.87
95 2 2 27 19.7 3.5 4.5 2 2 2 9.19 1.026 3 1 2 1 3 2 13.25 2 1 19.875
96 2 1 33 26.1 4.7 4.8 3 2 1 6.55 1.028 2 1 2 2 3 3 24.5 1 0 36.75
97 2 1 24 31.4 5.6 5.9 1 1 1 6.03 1.028 1 2 2 2 3 1 8.67 3 0 13.005
98 2 2 29 37.8 4.5 5.2 1 2 1 4.44 1.029 2 1 2 2 3 2 28.17 3 1 42.255
99 1 2 23 21.2 4.4 5 1 1 1 16.97 1.031 3 2 3 2 3 3 18.37 2 1 27.555
100 1 2 29 14.2 3.7 4 1 1 1 5.52 1.032 1 1 1 1 1 1 7.5 3 0 11.25
101 1 1 25 18.9 4.1 4.5 1 1 1 5.25 1.033 1 2 1 2 3 1 3.95 2 0 5.925
102 2 1 23 27.4 4.3 4.3 1 2 1 5.97 1.033 2 2 3 1 3 3 16.57 1 0 24.855
103 1 1 38 21.4 3.8 5 1 2 1 5.14 1.035 2 1 2 2 3 2 25.67 1 0 38.505
104 2 1 40 39.5 4.5 4.7 3 2 1 4.93 1.036 1 1 2 1 1 2 19.42 1 0 29.13
105 1 1 38 13.8 3.6 4.1 1 1 1 4.94 1.037 3 1 2 2 1 2 10.52 1 1 15.78
106 1 1 28 18.8 4.6 4.6 1 1 2 7.3 1.039 2 1 2 2 2 2 5.73 2 1 8.595
107 2 1 18 38.6 4.9 4.1 3 2 1 5.12 1.039 2 1 2 2 3 3 30.18 1 1 45.27
108 2 1 28 21.4 4.7 5.1 1 2 1 8.01 1.041 3 1 3 2 3 3 20.17 1 1 30.255
109 1 1 27 26.4 4.3 4.4 1 2 1 5.77 1.042 1 1 1 1 2 1 3.33 1 0 4.995
110 2 1 16 27.4 4.4 4.9 1 2 1 7.34 1.042 1 1 2 1 1 2 10.67 3 0 16.005
111 2 1 18 21.7 5.3 4.6 1 2 1 11.05 1.043 2 3 2 1 3 3 14.5 1 0 21.75
112 2 1 40 30.7 4.1 5.2 3 2 2 5.55 1.043 1 1 3 2 3 3 30.73 1 0 46.095
113 2 2 42 35.4 4 5.2 3 2 1 6.11 1.043 2 1 3 2 1 3 11.08 2 0 16.62
114 1 2 45 25.6 4.5 4.1 1 1 1 8.96 1.045 3 1 3 1 3 1 18.67 1 1 28.005
115 2 1 38 27.1 4.5 4.8 3 2 1 6.76 1.046 2 1 2 2 1 3 10.5 2 1 15.75
116 1 1 24 19.9 4.5 4.6 1 2 2 5.19 1.047 3 1 2 1 3 3 25.95 1 0 38.925
117 1 2 21 18.3 4.4 4 1 2 1 8.04 1.048 2 1 2 1 3 3 13.03 2 1 19.545
118 1 1 26 21.1 4.9 3.9 1 1 1 7.16 1.048 2 1 3 2 3 2 14.28 2 0 21.42
119 1 1 20 14.2 4.5 4.7 1 1 1 5.14 1.049 3 1 2 2 3 2 10.33 3 1 15.495
120 1 1 30 14.1 3.5 4.4 1 1 1 6.72 1.049 2 1 3 2 3 3 33.43 1 1 50.145
121 1 1 24 13.5 3.2 4.3 1 3 1 7.92 1.05 2 1 3 2 3 3 15.67 2 1 23.505
122 1 1 24 14.2 4.2 3.7 1 2 1 12.14 1.05 3 1 3 2 3 2 17.72 2 1 26.58
123 1 1 23 12.8 4.9 3.5 1 2 1 4.92 1.051 2 1 3 1 3 3 40.4 3 0 60.6
124 2 1 25 41.6 3.2 4.8 1 2 1 7.6 1.054 2 1 2 2 3 3 25.6 1 1 38.4
125 1 1 28 11.4 3.8 4 1 2 1 4.28 1.054 1 1 3 2 3 2 18.5 3 0 27.75
126 2 1 26 37.4 3.7 4 3 2 1 4.3 1.057 2 1 2 2 3 2 16.67 1 1 25.005
127 1 1 33 18 3.7 4.8 3 2 1 11.27 1.059 3 1 3 2 3 3 40.17 1 1 60.255
128 1 1 22 20.5 3.6 4.1 1 1 1 8.85 1.06 2 1 2 2 3 3 7.87 2 1 11.805
129 2 1 29 39.5 4.3 4.5 2 2 1 5.85 1.061 1 2 1 2 3 1 15.17 2 0 22.755
130 1 1 22 15.5 4.5 4.8 1 2 1 7.22 1.061 1 1 3 2 3 3 13.33 2 0 19.995
131 2 1 29 35.1 4.7 4.8 2 2 2 5.31 1.062 1 1 1 2 3 1 5.33 2 0 7.995
132 1 1 23 14.4 4.5 3.9 1 2 1 4.73 1.062 1 2 1 2 3 2 20.72 1 0 31.08
133 1 1 18 19.5 4.2 5.7 1 2 2 5.79 1.062 2 1 2 2 3 3 20.22 1 0 30.33
134 1 1 28 15.4 3.4 3.7 1 2 1 4.56 1.063 2 1 1 2 2 1 15.67 3 1 23.505
135 1 2 35 147.3 4.7 4.6 1 1 1 5.95 1.063 2 1 2 2 1 2 8.5 2 1 12.75
136 1 2 20 11.7 4.6 4.3 1 2 1 7.22 1.063 3 1 3 2 3 3 27.68 1 1 41.52
137 2 2 36 30.7 4.5 5 2 2 1 7.55 1.066 3 1 3 2 3 3 22.17 1 0 33.255
138 1 1 49 26.2 3.4 4.4 3 2 1 5.01 1.067 1 1 2 2 3 3 22.17 1 0 33.255
139 2 2 26 45 4.2 4.3 2 2 1 6.13 1.068 1 1 2 1 1 2 6.9 2 0 10.35
140 1 2 47 17.4 4.2 4.3 1 2 1 4.24 1.07 1 1 1 2 1 1 5.03 1 0 7.545
141 1 2 23 16.7 4.4 3.6 1 1 1 6.49 1.07 3 1 2 1 3 2 18.83 2 1 28.245
142 2 1 17 23.5 4.6 5 3 1 1 6.87 1.07 3 1 2 1 3 2 6.5 1 1 9.75
143 1 1 30 15.5 4.7 4.2 1 2 1 6.37 1.07 2 1 2 2 2 2 6.48 1 0 9.72
144 1 2 28 33.1 3.7 4.3 1 2 2 5.33 1.071 2 1 3 2 3 2 33.43 1 1 50.145
145 1 1 24 18 3.5 4 1 2 2 7.33 1.072 3 1 2 2 3 3 32.58 3 1 48.87
146 1 2 27 9.4 3.2 4.6 1 1 1 6.32 1.072 2 1 3 1 3 3 12.83 2 1 19.245
147 1 1 31 18.6 4.3 4.5 1 2 2 5.67 1.074 2 1 2 2 2 2 6.83 1 1 10.245
148 2 1 49 26.7 5 5.5 1 3 1 5.11 1.074 1 1 2 2 1 1 9.5 1 1 14.25
149 1 1 26 18.1 4.2 4 1 1 1 2.97 1.074 1 1 2 1 2 1 8.33 1 0 12.495
150 1 1 29 14.7 4.5 4.7 3 2 2 7.74 1.074 2 2 2 2 3 3 23.02 2 1 34.53
151 1 1 27 20.9 4.6 5.2 1 2 1 13.96 1.075 3 1 2 2 3 3 20.4 1 0 30.6
152 1 2 24 16.5 4.1 4.4 1 1 1 8.13 1.075 3 1 3 1 3 3 11.33 2 1 16.995
153 1 1 37 24.7 3.7 4.5 2 1 1 6.46 1.077 1 1 1 2 2 1 3.47 2 0 5.205
154 2 1 24 24.9 4 4.4 1 1 1 4.33 1.078 2 1 2 2 3 2 15.67 1 1 23.505
155 1 1 32 25 3.6 4.1 1 3 1 9.77 1.078 2 1 3 2 3 3 35.75 1 1 53.625
156 1 1 20 20.8 3.3 5 1 2 1 5.19 1.078 2 1 3 2 3 3 12.67 2 0 19.005
157 1 1 19 12.8 3.7 3.7 1 2 1 10.19 1.079 2 2 3 2 3 3 29.25 1 0 43.875
158 2 1 27 28.5 3.7 4.6 1 1 1 5.47 1.081 1 1 2 2 3 2 10.67 1 1 16.005
159 2 1 27 43.3 4.4 4.6 3 2 2 6.34 1.083 1 1 1 2 2 2 18.33 1 0 27.495
160 1 1 18 24 4.3 3.3 1 2 2 7.04 1.083 2 2 3 1 3 3 19.57 1 0 29.355
161 1 1 41 26.1 3.6 3.9 3 2 1 9.69 1.085 3 1 2 2 2 3 14.57 2 0 21.855
162 2 2 15 28 4.3 5 1 2 1 8.81 1.085 2 3 2 1 3 3 13.33 1 0 19.995
163 1 1 24 18.3 4.1 4.2 1 1 1 6.04 1.085 2 1 3 1 3 2 27.5 3 0 41.25
164 1 1 36 16.4 4.8 3.7 1 3 1 10.93 1.086 2 1 1 2 2 1 10.92 3 1 16.38
165 1 1 26 17.6 4.6 4.7 1 2 2 6.15 1.087 3 1 2 2 1 2 10.52 3 1 15.78
166 1 2 21 16.2 3.7 4.5 1 2 1 4.21 1.087 2 1 3 1 3 2 30.67 1 0 46.005
167 1 1 39 22.2 3.8 4.2 1 2 2 6.96 1.088 2 1 2 1 3 2 18.5 2 0 27.75
168 2 1 29 24 4.5 5.5 1 1 1 5.83 1.091 2 1 1 2 2 1 10.5 2 0 15.75
169 2 1 30 42.1 4 5 1 2 1 6.94 1.092 1 1 1 2 2 1 4.5 1 0 6.75
170 1 2 49 22.6 4.3 3.8 1 2 1 4.44 1.093 1 1 1 1 1 1 3.33 1 0 4.995
171 1 1 30 15.5 3.6 4.9 2 2 2 6.02 1.093 2 1 3 2 3 2 24.83 3 1 37.245
172 2 1 33 35.6 4.2 4.6 1 1 1 8.86 1.094 3 1 2 2 3 2 16.5 1 0 24.75
173 1 2 32 17.4 3.8 4.5 1 1 1 6.36 1.094 2 1 3 2 3 3 13.5 3 0 20.25
174 1 2 23 17 4.3 3.9 1 2 1 8.98 1.094 1 1 3 2 3 3 8.82 1 0 13.23
175 1 2 45 16.1 4.4 4.5 1 1 1 7.01 1.095 3 2 3 2 3 2 16.9 1 1 25.35
176 2 2 27 35.6 4.9 5.3 1 2 1 6.72 1.096 2 1 2 2 3 2 21.63 3 0 32.445
177 2 1 27 33.8 4.5 5 1 2 1 7.43 1.098 3 1 3 2 3 3 14.83 1 1 22.245
178 2 1 43 20.6 4 5 3 2 2 6.73 1.099 1 1 2 1 2 2 11.88 1 0 17.82
179 1 2 28 23.1 3.4 4 1 1 1 11.76 1.1 3 2 3 2 2 3 27.83 2 1 41.745
180 1 2 20 14.2 4.5 4.6 1 3 1 4.78 1.105 2 1 2 2 3 2 13.67 3 0 20.505
181 1 1 29 22.9 5.3 4.3 1 1 1 10.94 1.105 2 2 2 2 3 3 17.85 2 0 26.775
182 2 2 33 40.1 4.4 6 1 1 1 5.17 1.106 2 1 2 1 3 2 13.37 1 0 20.055
183 2 2 28 45.8 4.5 5.5 1 2 1 4.15 1.108 2 1 2 2 3 3 11.52 2 0 17.28
184 2 1 25 22.8 3.1 3.6 1 2 2 6.91 1.109 3 1 2 1 3 3 25.33 1 1 37.995
185 2 2 26 23.7 5.4 5 1 1 1 7.43 1.109 2 1 2 2 2 3 17.68 2 1 26.52
186 1 1 25 36.3 4.1 3.9 1 1 2 7.07 1.109 3 1 3 2 3 3 26.33 2 0 39.495
187 2 2 30 46.5 4.7 5 3 2 1 5.07 1.11 2 1 2 1 3 3 23.67 2 1 35.505
188 1 1 31 29.7 4.5 4.7 2 1 1 7.11 1.11 2 1 2 2 1 3 22.48 1 1 33.72
189 1 2 27 40 3.5 3.8 1 2 1 8.99 1.111 3 3 1 2 3 1 6.67 3 1 10.005
190 1 2 22 14.6 5 5.2 3 3 2 6.65 1.112 2 1 2 1 3 3 39.67 1 1 59.505
191 2 2 24 27.2 5.1 4.9 1 2 1 6.46 1.113 3 2 3 1 3 3 28.17 1 0 42.255
192 1 1 23 19.8 4.2 4.5 1 1 1 6.37 1.117 2 1 1 2 1 1 2.83 2 0 4.245
193 1 1 26 16.7 3.6 4.6 2 2 1 5.78 1.117 2 1 2 2 1 2 2.92 1 0 4.38
194 1 1 25 43.6 3.9 4.5 1 1 1 5.13 1.118 1 1 2 1 2 2 15.33 3 1 22.995
195 2 1 24 39.5 4.4 4.6 1 2 2 4.86 1.118 1 1 2 2 2 1 5.17 1 0 7.755
196 1 2 46 20 4.5 3.7 1 1 1 5.67 1.119 2 1 1 2 3 1 5.67 2 0 8.505
197 1 1 21 17.6 4.5 4.8 1 2 1 7.18 1.119 1 2 1 1 3 2 15.67 1 0 23.505
198 1 1 24 18.3 5 3.7 1 1 1 6.6 1.121 1 1 3 1 2 1 1.32 2 0 1.98
199 1 2 25 16.7 4.2 4.6 1 2 1 6.73 1.122 2 1 2 2 2 1 10.5 2 1 15.75
200 1 2 22 19.5 4 4.2 3 2 2 5.63 1.123 2 1 2 1 3 3 12.5 1 0 18.75
201 1 1 23 19.8 4.4 4.6 1 2 1 5.86 1.124 2 1 2 2 3 2 10.33 2 1 15.495
202 1 2 27 14.1 4.8 4.5 1 2 1 5.21 1.128 1 1 2 2 3 3 15.68 1 1 23.52
203 1 1 29 13.8 3.5 4 1 2 2 5.61 1.129 2 1 3 1 3 3 38.67 3 1 58.005
204 1 1 55 30.7 5 4.8 2 2 1 5.06 1.131 2 1 2 1 3 3 9.5 1 1 14.25
205 1 1 26 12.1 3.8 3.7 1 1 1 6.79 1.131 3 1 2 1 1 2 6.83 1 0 10.245
206 1 1 64 25.4 4.1 5 2 2 1 8.03 1.132 2 1 2 2 3 3 30.85 3 1 46.275
207 1 1 20 21.2 4 4.6 1 2 1 4.43 1.132 1 2 2 2 3 1 8.25 1 1 12.375
208 1 1 29 24.5 4.2 3.9 1 1 1 6.12 1.133 1 1 1 2 2 1 2.95 1 0 4.425
209 1 2 30 18.2 3.6 4 2 1 1 8.16 1.134 3 1 3 2 3 2 12.25 1 1 18.375
210 1 1 20 20.8 3.7 4.7 1 1 1 4.8 1.135 2 1 1 1 2 1 3.83 1 0 5.745
211 2 1 45 45 5.9 4 1 2 2 6.52 1.136 3 2 2 1 3 3 40.5 2 0 60.75
212 1 2 38 16.3 4.2 4 2 2 2 3.79 1.138 2 1 2 2 2 2 8.5 1 1 12.75
213 2 2 31 38.2 3.6 4.2 1 2 1 8.89 1.138 2 2 3 2 3 3 40.5 1 0 60.75
214 2 1 22 41.3 4 4.6 1 2 2 6.89 1.143 2 2 2 1 3 3 35.67 1 1 53.505
215 2 1 26 31.2 5 5.5 1 2 1 6.89 1.144 2 1 1 2 1 1 7.83 1 1 11.745
216 2 1 24 32 5 4.3 2 2 1 7.53 1.148 2 2 3 2 3 3 23.12 1 0 34.68
217 2 1 27 32.4 4.5 5.4 1 3 2 11.79 1.15 2 2 1 2 2 1 20.67 1 0 31.005
218 1 2 25 22.7 4.3 4.2 3 2 2 9.38 1.151 3 1 2 1 3 3 9.5 2 1 14.25
219 2 1 29 30.2 4 4.3 1 2 1 8.65 1.153 2 3 1 2 2 1 14.5 3 0 21.75
220 1 1 17 11.8 3.7 5 1 2 1 7.38 1.153 3 1 2 2 1 2 2.17 1 0 3.255
221 1 2 26 43 3.7 4.6 3 3 1 6.73 1.154 2 1 1 2 3 1 7.17 2 1 10.755
222 1 1 29 32.9 3.8 4 3 2 1 7.24 1.155 2 1 1 2 2 1 5.67 3 0 8.505
223 2 1 32 36 4.2 5 3 2 1 6.39 1.157 2 1 1 2 2 2 14.03 2 0 21.045
224 2 1 17 24.1 4.2 4.5 1 2 2 6.86 1.158 2 2 2 2 3 3 27.67 1 1 41.505
225 1 1 35 17.4 3.8 4.1 1 2 1 5.34 1.159 2 1 2 1 3 2 30.83 3 0 46.245
226 1 1 26 17.9 4 5.2 1 2 1 9.34 1.16 2 2 1 2 2 1 6.67 1 0 10.005
227 1 2 25 24.1 4.2 3.8 2 2 1 4.15 1.16 1 1 2 1 3 2 18.1 1 1 27.15
228 1 2 36 22.2 4.1 4.2 1 1 1 6.6 1.161 2 2 2 2 3 3 38.33 2 1 57.495
229 1 1 23 19.6 3.7 4.5 1 2 1 4.66 1.162 1 1 2 1 3 2 10.67 3 0 16.005
230 2 1 33 27.5 3.4 4 1 2 1 6 1.163 2 1 2 2 2 2 11.95 1 1 17.925
231 2 2 29 44.5 4.5 4 1 2 1 6.14 1.163 1 1 3 1 3 3 18.73 1 0 28.095
232 2 1 27 35.8 4.6 4 1 2 2 18.56 1.165 3 1 3 1 3 2 14.5 1 1 21.75
233 2 1 21 31.1 4.8 3.7 1 2 1 5.45 1.166 1 1 2 2 1 2 6.92 1 0 10.38
234 2 2 44 30.9 3.4 4 1 3 1 6.57 1.176 2 1 2 1 1 2 15.85 2 0 23.775
235 1 2 27 20.8 4.5 4.3 1 2 1 4.75 1.179 2 1 4 2 1 2 17.87 2 1 26.805
236 1 2 22 16 4.4 4 1 2 1 7.98 1.183 2 1 3 2 3 3 11.98 2 0 17.97
237 1 2 32 23.6 3.5 4.2 1 2 2 8.58 1.185 2 1 1 2 3 3 14.38 2 1 21.57
238 2 1 31 40.6 5 4.4 3 2 1 5.28 1.185 1 1 2 2 3 3 16.42 1 1 24.63
239 1 1 21 18.4 4.1 4.5 1 2 1 6.26 1.186 2 3 2 2 3 2 15.42 1 0 23.13
240 1 1 26 24.4 4.2 4.7 1 2 2 6.54 1.186 2 1 3 2 3 3 26.75 1 1 40.125
241 2 1 23 30.9 4.1 4.5 1 2 2 5.45 1.187 2 1 2 2 3 2 18.5 3 0 27.75
242 1 2 24 21.6 4.1 4 1 2 1 4.65 1.187 1 1 2 1 1 1 1.08 2 0 1.62
243 1 1 24 22.4 4.2 4.1 1 2 1 5.94 1.188 2 1 3 1 3 2 17.58 1 1 26.37
244 1 1 20 30.1 4.9 4.9 1 1 1 13.62 1.192 3 1 2 1 3 3 17.33 2 1 25.995
245 1 1 40 22.2 4.5 4.3 3 2 1 5.33 1.193 2 1 2 1 3 3 12.8 1 0 19.2
246 2 1 29 49.1 4.9 4.2 1 1 2 7.18 1.198 2 1 2 2 1 2 20.7 1 0 31.05
247 1 2 34 20.8 4.2 4.7 1 1 1 4.36 1.205 2 1 2 1 1 2 4.33 1 1 6.495
248 2 1 22 40.1 4.2 4.6 1 2 2 5.53 1.205 1 1 2 2 3 3 18.5 3 1 27.75
249 1 1 18 14.1 4.4 4.5 1 2 1 5.13 1.207 2 2 2 2 2 1 6.17 1 0 9.255
250 1 2 34 20.8 4.2 4 1 2 1 4.19 1.209 1 1 2 1 3 2 20.58 3 1 30.87
251 2 2 25 20.8 4.1 4.6 3 2 1 6.81 1.21 2 1 2 2 3 2 28.77 3 0 43.155
252 2 1 34 40.6 3.7 4.5 1 2 1 4.21 1.214 3 1 2 1 3 2 21.58 3 1 32.37
253 1 1 26 16.4 4.2 4.5 3 2 2 7.21 1.221 2 1 1 2 3 1 35.67 3 1 53.505
254 2 1 52 30.8 4.2 4.3 1 3 1 5.02 1.224 2 1 2 2 3 2 18.58 1 1 27.87
255 1 2 20 21.2 5 4.7 1 1 1 4.75 1.227 2 1 1 2 1 1 4.5 2 1 6.75
256 1 2 31 20.5 4.3 4.4 1 2 1 5.43 1.227 2 1 2 2 3 2 28.22 2 1 42.33
257 1 1 30 26.7 3.7 4.1 1 1 2 4.73 1.227 2 2 3 2 3 3 38.23 1 1 57.345
258 2 1 40 43 4 4.2 1 2 1 5.78 1.228 1 1 2 2 3 2 20.33 3 1 30.495
259 1 1 36 16.5 4.2 3.6 2 2 1 5.14 1.235 2 2 1 2 2 2 22.67 2 1 34.005
260 1 1 41 20.3 3.6 3.8 1 1 1 10.26 1.236 3 2 3 1 3 3 36.6 1 1 54.9
261 1 1 32 18.7 3.9 5.2 3 2 2 5.76 1.238 2 1 3 2 3 3 20.67 1 1 31.005
262 1 1 26 22 4.6 5 3 2 1 5.1 1.241 1 1 1 2 2 1 4.42 1 1 6.63
263 2 1 25 41.1 4.4 5 3 3 2 7.63 1.241 2 1 3 2 3 3 12.93 1 0 19.395
264 2 1 28 26.6 4.8 5.4 1 2 1 6.98 1.247 2 1 3 2 3 2 15.08 1 1 22.62
265 1 1 22 13 4.1 4.5 1 2 1 8.86 1.249 1 1 1 1 2 1 8.83 2 0 13.245
266 1 1 24 13.6 4.2 4.4 1 2 1 4.08 1.25 3 1 2 2 3 2 7.5 2 1 11.25
267 1 1 27 26.4 4.3 4.4 2 2 1 5.58 1.252 2 1 1 2 1 1 5.68 1 0 8.52
268 2 1 37 50.1 4.4 4.4 3 2 1 6.8 1.259 2 2 2 2 3 3 28.67 1 1 43.005
269 1 1 27 15 3.5 4 3 2 1 5.52 1.263 3 1 3 1 3 3 24.67 2 1 37.005
270 1 1 24 15.6 3.7 3.7 1 2 1 5.94 1.264 2 1 2 2 2 3 22.12 1 1 33.18
271 2 2 33 36.4 4.8 5.5 1 2 1 5.19 1.264 1 1 2 2 3 2 16.7 3 0 25.05
272 1 1 24 19.3 3.7 5.2 1 1 1 7.51 1.266 2 1 1 1 3 1 5.77 2 1 8.655
273 1 1 33 19.7 4.5 4.7 1 1 1 6.04 1.266 3 2 2 2 3 3 20.65 1 1 30.975
274 1 1 21 20.5 4.2 4.6 1 2 1 9.56 1.269 3 2 1 2 3 2 19.33 3 1 28.995
275 1 2 25 28.3 4.2 4.2 1 1 1 5.22 1.275 1 1 1 1 3 1 11.67 1 1 17.505
276 1 2 26 27.5 3.5 4.5 1 1 1 8.07 1.288 2 1 1 1 2 1 7.33 2 0 10.995
277 1 2 20 17.9 5 4.5 1 1 1 5.33 1.304 1 1 2 2 2 3 23.33 2 1 34.995
278 1 1 21 23.4 4.1 4.7 1 2 2 7.44 1.306 2 1 2 1 3 2 21.18 2 1 31.77
279 2 1 26 30.4 3.3 4.2 3 2 2 6.22 1.309 2 1 3 2 3 3 15.67 2 1 23.505
280 1 1 20 19.5 4.2 4.5 1 2 1 5.94 1.315 3 1 2 2 3 3 10.67 1 1 16.005
281 1 1 20 19.8 4.2 5.5 1 2 2 4.98 1.316 2 1 3 2 3 3 17.7 2 0 26.55
282 2 1 49 37.6 3.6 4.6 3 2 1 4.08 1.32 1 1 2 2 3 2 15.65 1 1 23.475
283 2 2 27 44.3 4.2 4.8 3 2 2 7.14 1.324 2 1 3 2 3 3 22.18 1 1 33.27
284 1 2 21 13 3.8 4.2 1 2 2 6.06 1.327 3 1 2 2 3 2 24.83 3 1 37.245
285 2 1 28 32.6 4.2 4.6 1 1 1 7.09 1.334 3 1 3 1 3 3 39.08 2 0 58.62
286 1 2 37 25.3 4 4.5 1 2 1 5.89 1.334 3 1 3 2 3 3 30.67 3 1 46.005
287 1 1 31 12.8 3.5 4.3 1 2 1 9.59 1.339 1 2 3 2 3 3 34.98 1 0 52.47
288 1 1 24 14.2 4.8 4.6 1 1 1 9.34 1.348 3 2 1 2 3 3 27.57 2 1 41.355
289 1 1 46 29.9 3.5 3.8 1 1 1 5.87 1.348 1 1 2 2 3 2 34.83 3 1 52.245
290 1 1 31 31.4 3.9 4.6 3 2 1 6.24 1.352 1 1 1 2 2 1 3.85 1 0 5.775
291 1 1 34 13.3 4 4.3 1 1 2 6.72 1.361 2 1 1 2 3 2 11.95 2 1 17.925
292 1 1 28 20.1 4.3 4.5 3 2 1 10.12 1.372 2 1 1 2 1 1 4.98 1 1 7.47
293 1 1 26 18.9 4.5 4.4 1 1 1 4.63 1.387 1 1 2 2 3 2 29.05 3 0 43.575
294 1 1 17 16.5 3.7 3.9 1 2 1 4.45 1.394 2 3 2 1 3 3 15.58 1 0 23.37
295 1 1 24 14.3 4.5 3 1 2 1 4.19 1.41 2 1 2 1 3 2 14.83 3 0 22.245
296 1 1 19 19.9 4.2 4 1 2 1 7.6 1.411 2 1 1 2 2 1 14.08 2 1 21.12
297 1 2 26 12.1 3 5 3 2 1 6.24 1.42 3 1 3 2 3 3 7.67 1 1 11.505
298 2 1 45 24.9 3.8 5.6 1 1 1 5.95 1.444 2 2 2 2 3 2 14.5 1 1 21.75
299 1 2 40 22.5 4.1 4.7 1 1 2 5.68 1.446 3 1 3 2 3 3 35.08 3 0 52.62
300 2 1 26 30.1 5.5 6 1 2 1 6.23 1.469 1 1 2 2 2 1 10.08 2 0 15.12
301 1 1 21 21.7 4 4.3 1 2 1 5.59 1.475 2 1 1 2 2 1 9.9 2 0 14.85
302 1 1 28 18.1 4.2 4 1 2 1 4.31 1.475 1 1 3 2 3 2 25.05 1 0 37.575
303 1 1 26 17.8 4.4 4 1 2 1 7.22 1.502 2 1 3 2 1 2 7.77 2 0 11.655
304 1 2 31 15.3 4.3 4.5 3 2 2 5.03 1.531 2 1 2 2 3 2 14.57 1 1 21.855
305 1 1 24 21.8 3.5 4.5 1 1 1 4.9 1.582 2 1 1 1 2 1 4.93 2 0 7.395
306 1 1 26 18.8 4.2 4.6 1 1 1 6.03 1.585 1 1 2 2 3 2 19.57 3 0 29.355
307 1 1 28 22 4.2 4.1 1 2 1 5.99 1.61 2 3 2 2 3 3 22.7 1 1 34.05
308 1 1 45 29.2 3.7 4.4 1 1 1 7.09 1.67 2 1 2 2 3 3 10.5 1 1 15.75
309 1 1 33 15.2 4.7 3.9 1 1 1 6.64 1.706 2 1 4 1 2 1 5.77 1 0 8.655
310 1 1 27 18.9 3.7 4.9 1 1 1 5.58 1.781 2 2 1 1 3 1 12.12 3 0 18.18
311 1 2 21 17.8 4.3 3.8 1 2 1 7.63 1.913 2 1 1 2 3 2 22.38 1 1 33.57
312 1 1 26 14.7 3.7 4 1 1 1 5.32 1.942 2 1 1 1 2 1 4.43 2 0 10.12