diff --git a/apps/web-console/app.js b/apps/web-console/app.js index 40830b4..0c3bf67 100755 --- a/apps/web-console/app.js +++ b/apps/web-console/app.js @@ -3437,7 +3437,7 @@ function updateSeatFeedbackModeLabel() { } function selectExecutionMode(mode) { - if (mode === "hardware" && !(state.runtime?.hardware?.configured && state.runtime?.vehicle_can?.configured)) return; + if (mode === "hardware" && !state.runtime?.hardware_execution_allowed) return; if (mode === "simulated_hardware" && !state.runtime?.simulated_hardware?.enabled) return; state.executionMode = mode; $$('[data-execution-mode]').forEach((button) => { @@ -3446,6 +3446,7 @@ function selectExecutionMode(mode) { const hardware = mode === "hardware"; const simulatedHardware = mode === "simulated_hardware"; const approvalRequired = Boolean(state.runtime?.hardware?.approval_required); + const vehicleCanReady = Boolean(state.runtime?.vehicle_can?.configured); $("#approvalField").hidden = !hardware || !approvalRequired; $("#simulationFaultField").hidden = !simulatedHardware; $("#executionBadge").className = `status-badge ${hardware ? "" : simulatedHardware ? "warning" : "neutral"}`.trim(); @@ -3458,7 +3459,9 @@ function selectExecutionMode(mode) { ? "真实台架安全门禁" : simulatedHardware ? "模拟台架隔离边界" : "虚拟执行边界"; $("#safetyText").textContent = hardware - ? "同一 CAN 盒由单进程持有:通道 0 控制副驾座椅并校验板端反馈,通道 1 以 ISO CAN FD 500 kbit/s / 2 Mbit/s 控制空调等车身设备并校验状态帧。" + ? vehicleCanReady + ? "同一 CAN 盒由单进程持有:通道 0 控制副驾座椅并校验板端反馈,通道 1 以 ISO CAN FD 500 kbit/s / 2 Mbit/s 控制空调等车身设备并校验状态帧。" + : "当前仅通道 0 连接副驾座椅台架并校验板端反馈;车端 CAN 未启用,模式中的其他车舱领域保持虚拟执行。" : simulatedHardware ? "故障只注入执行报告;物理 CAN、ZLG 适配器和 IAR 固件路径保持关闭。" : "四域 CAN 均为 dry-run,真实发送被强制关闭。"; @@ -3716,6 +3719,8 @@ async function loadRuntime() { const hardware = state.runtime.hardware || {}; const vehicleCan = state.runtime.vehicle_can || {}; const linkedHardwareReady = Boolean(hardware.configured && vehicleCan.configured); + const seatHardwareReady = Boolean(hardware.configured); + const hardwareExecutionReady = Boolean(state.runtime.hardware_execution_allowed); const badge = $("#modelBadge"); const gptButton = $('[data-provider="openai"]'); if (state.runtime.openai_available) { @@ -3734,7 +3739,7 @@ async function loadRuntime() { } $("#matrixCount").textContent = `${state.runtime.matrix.messages} / ${state.runtime.matrix.signals}`; const hardwareButton = $("#hardwareMode"); - hardwareButton.disabled = !linkedHardwareReady; + hardwareButton.disabled = !hardwareExecutionReady; const simulation = state.runtime.simulated_hardware || {}; $("#simulationMode").disabled = !simulation.enabled; $("#simulationMode").title = simulation.enabled @@ -3751,21 +3756,31 @@ async function loadRuntime() { : ""; $("#hardwareNote").textContent = linkedHardwareReady ? `${hardware.backend} · CH${hardware.channel} 座椅 ${hardware.bitrate / 1000} kbit/s · CH${vehicleCan.channel} 车身 CAN FD ${vehicleCan.arbitration.bitrate / 1000}k/${vehicleCan.data.bitrate / 1000000}M · ${profileText} · ${flashText} · ${approvalText}${accessText}${concurrencyText}` + : seatHardwareReady + ? `${hardware.backend} · CH${hardware.channel} 座椅 ${hardware.bitrate / 1000} kbit/s · ${profileText} · ${flashText} · 车端 CAN 未启用,其他领域保持虚拟执行${accessText}${concurrencyText}` : `联动真实执行已锁定:${profileText};请完成座椅固件、双通道 ZLG 适配器、车身 CAN FD${hardware.approval_required ? "和令牌" : ""}配置`; - $("#hardwareAliasNote").textContent = "CH0 → 副驾座椅控制器 · CH1 → 空调/车窗/门锁/灯光/遮阳帘(ISO CAN FD)"; + $("#hardwareAliasNote").textContent = linkedHardwareReady + ? "CH0 → 副驾座椅控制器 · CH1 → 车身 CAN FD" + : seatHardwareReady + ? `CH${hardware.channel} → 副驾座椅控制器 · 车身控制暂用虚拟 CAN` + : "尚未配置可执行的物理 CAN 通道"; $("#autoFlashNote").textContent = hardware.auto_flash_enabled ? "未检测到匹配固件时,将在发送座椅控制帧前通过 IAR C-SPY 自动烧录并重新验证。" : "仅接受周期反馈与四轴量程签名匹配的统一固件;需要自动烧录时请启用服务端开关。"; - $("#hardwareBadge").className = `status-badge ${linkedHardwareReady ? "" : "danger"}`.trim(); + $("#hardwareBadge").className = `status-badge ${hardwareExecutionReady ? "" : "danger"}`.trim(); $("#hardwareBadge").innerHTML = linkedHardwareReady ? '双通道已配置' + : seatHardwareReady + ? '座椅台架已配置' : '硬件锁定'; $("#hardwareCoverage").textContent = linkedHardwareReady ? `CH0 座椅 + CH${vehicleCan.channel} 车身 · ${approvalText}${accessText}${concurrencyText}` - : "已阻断"; - $("#hardwareCoverage").className = linkedHardwareReady ? "available" : "blocked"; + : seatHardwareReady + ? `CH${hardware.channel} 座椅 · 物理反馈${accessText}${concurrencyText}` + : "已阻断"; + $("#hardwareCoverage").className = hardwareExecutionReady ? "available" : "blocked"; const modeAvailable = state.executionMode === "hardware" - ? linkedHardwareReady + ? hardwareExecutionReady : state.executionMode === "simulated_hardware" ? simulation.enabled : true; diff --git a/apps/web-console/index.html b/apps/web-console/index.html index 9eb2c11..3463dce 100755 --- a/apps/web-console/index.html +++ b/apps/web-console/index.html @@ -13,20 +13,20 @@ - + - + - - + +
diff --git a/apps/web-console/self-repair.css b/apps/web-console/self-repair.css index d2e3b3e..49ad417 100644 --- a/apps/web-console/self-repair.css +++ b/apps/web-console/self-repair.css @@ -1270,6 +1270,10 @@ .v2-repair-dialog th, .v2-repair-dialog td { padding: 7px; border-bottom: 1px solid var(--repair-line); text-align: left; } .v2-repair-dialog th { color: var(--repair-muted); background: var(--repair-soft-strong); } +.v2-repair-confirm-dialog { width: min(460px, calc(100vw - 32px)); } +.v2-repair-confirm-dialog #repairConfirmMessage { margin: 0; color: var(--repair-ink); font-size: 13px; line-height: 1.7; } +.v2-repair-confirm-actions { display: flex; justify-content: flex-end; gap: 10px; margin-top: 18px; } +.v2-repair-confirm-actions button { min-width: 104px; } .v2-repair-report-path { padding: 7px 9px; overflow-wrap: anywhere; color: var(--repair-muted); background: var(--repair-soft-strong); border-radius: 8px; font: 8px "IBM Plex Mono", Consolas, monospace; } .v2-repair-event-list { display: grid; gap: 5px; margin-top: 10px; } .v2-repair-event-list article { display: grid; gap: 2px; padding: 7px 9px; background: var(--repair-soft); border-radius: 8px; } diff --git a/apps/web-console/self-repair.js b/apps/web-console/self-repair.js index 93486de..6916882 100644 --- a/apps/web-console/self-repair.js +++ b/apps/web-console/self-repair.js @@ -50,6 +50,7 @@ : "shadow"; let polling = false; let toastTimer = 0; + let confirmationResolve = null; function isAdmin() { return window.CognitiveAgentConsoleV2?.getRole() === "admin" @@ -181,7 +182,11 @@
软件自修复验证记录成功用例自动保存诊断快照
-
硬件自诊断记录支路状态变化与最终报告
`; +
硬件自诊断记录支路状态变化与最终报告
+ +
确认台架安全条件确认后才会向实物链路提交请求
+

+
`; moduleSwitcher.insertAdjacentElement("afterend", root); const select = $("#repairExecutionMode"); @@ -402,9 +407,12 @@ const session = latest.hardware_session || {}; const bridge = latest.bridge || {}; const manager = latest.bridge_manager || {}; + const adapterOnline = hardware.link?.adapter === "OK" + || Boolean(bridge.bus?.opened) + || (bridge.online && bridge.bus_traffic); const layers = [ ["1", "ZCANPRO桥接", bridge.online ? "正常" : "离线", bridge.online ? "OK" : "UNKNOWN"], - ["2", "CAN设备 / 通道", bridge.bus?.opened ? "设备与通道已打开" : "未连接", bridge.bus?.opened ? "OK" : "UNKNOWN"], + ["2", "CAN设备 / 通道", adapterOnline ? "设备与通道已打开" : "未连接", adapterOnline ? "OK" : "UNKNOWN"], ["3", "总线实时流量", bridge.bus_traffic ? "正常" : "未检测", bridge.bus_traffic ? "OK" : "WARN"], ["4", "座椅ECU协议", bridge.protocol_online ? "0x301~0x305在线" : "未检测", bridge.protocol_online ? "OK" : "UNKNOWN"], ]; @@ -431,13 +439,25 @@ const bridge = latest.bridge || {}; const manager = latest.bridge_manager || {}; const healing = latest.healing || {}; + const hardwarePhase = latest.hardware_session?.progress?.phase; const integration = latest.integration || {}; $("#repairCanStatus").textContent = bridge.online ? "在线" : "离线"; $("#repairCanDot").dataset.state = bridge.online ? "online" : manager.state === "STARTING" ? "working" : "offline"; $("#repairProtocolStatus").textContent = bridge.protocol_online ? "协议在线" : "未检测"; $("#repairProtocolDot").dataset.state = bridge.protocol_online ? "online" : "offline"; - $("#repairAiStatus").textContent = healing.phase_text || "等待验证"; - $("#repairAiDot").dataset.state = ["PASSED"].includes(healing.phase) ? "online" : ["IDLE"].includes(healing.phase) ? "offline" : "working"; + const hardwareState = { + BASELINE: ["硬件检测中", "working"], + RUNNING: ["硬件检测中", "working"], + PASSED: ["21针通过", "online"], + FAILED: ["硬件异常", "offline"], + }[hardwarePhase]; + const aiState = activeView === "hardware" && hardwareState + ? hardwareState + : [healing.phase_text || "等待验证", healing.phase === "PASSED" + ? "online" + : healing.phase === "IDLE" ? "offline" : "working"]; + $("#repairAiStatus").textContent = aiState[0]; + $("#repairAiDot").dataset.state = aiState[1]; $("#repairConnectionText").textContent = bridge.online ? "CAN 桥接在线" : manager.message || "CAN 桥接离线"; $(".v2-repair-footer").classList.toggle("offline", !bridge.online); const benchOption = $('#repairExecutionMode option[value="bench"]'); @@ -504,6 +524,25 @@ } } + function finishConfirmation(accepted) { + const dialog = $("#repairConfirmDialog"); + const resolve = confirmationResolve; + confirmationResolve = null; + if (dialog?.open) dialog.close(accepted ? "confirmed" : "cancelled"); + if (resolve) resolve(accepted); + } + + function confirmAction(message, confirmLabel = "确认执行") { + const dialog = $("#repairConfirmDialog"); + if (!dialog || confirmationResolve) return Promise.resolve(false); + $("#repairConfirmMessage").textContent = message; + $("#repairConfirmAccept").textContent = confirmLabel; + dialog.showModal(); + return new Promise((resolve) => { + confirmationResolve = resolve; + }); + } + function bindEvents() { $$('[data-repair-view]').forEach((button) => button.addEventListener("click", () => showView(button.dataset.repairView))); $("#repairExecutionMode").addEventListener("change", (event) => { @@ -511,33 +550,48 @@ sessionStorage.setItem(MODE_KEY, executionMode); if (latest) renderAll(); }); - $("#repairStart").addEventListener("click", () => { - if (executionMode === "bench" && !window.confirm("即将向实物 ECU 写入受控故障并驱动座椅恢复。请确认运动区域无人、无遮挡且急停可用。")) return; + $("#repairStart").addEventListener("click", async () => { + if (executionMode === "bench" && !(await confirmAction("即将向实物 ECU 写入受控故障并驱动座椅恢复。请确认运动区域无人、无遮挡且急停可用。"))) return; runAction(() => apiPost("/healing/start", { case_id: selectedCaseId, execution_mode: executionMode }), executionMode === "bench" ? "实物自修复用例已启动" : "影子故障已注入,开始自修复"); }); - $("#repairRunAll").addEventListener("click", () => runAction(() => apiPost("/healing/run-all", { execution_mode: executionMode }), "六项自动验证已启动")); - $("#repairReset").addEventListener("click", () => { - if (executionMode === "bench" && !window.confirm("四轴将依次回到机械零位。请确认运动区域无人、无遮挡且急停可用。")) return; + $("#repairRunAll").addEventListener("click", async () => { + if (executionMode === "bench" && !(await confirmAction( + "将依次执行6个实物故障用例;每项开始前会自动停止输出并完成四轴归零。请确认运动区域无人、无遮挡且急停可用。", + "确认实物批量验证", + ))) return; + runAction(() => apiPost("/healing/run-all", { execution_mode: executionMode }), "六项自动验证已启动"); + }); + $("#repairReset").addEventListener("click", async () => { + if (executionMode === "bench" && !(await confirmAction("四轴将依次回到机械零位。请确认运动区域无人、无遮挡且急停可用。", "确认归零"))) return; runAction(() => apiPost("/healing/reset", { execution_mode: executionMode }), executionMode === "bench" ? "四轴归零请求已提交" : "自修复验证已重置"); }); - $("#repairFirmwareFlash").addEventListener("click", () => { - if (!window.confirm("即将构建并烧录台架测试固件。请确认座椅运动区域无人、急停可用且 CMSIS-DAP 已连接。")) return; + $("#repairFirmwareFlash").addEventListener("click", async () => { + if (!(await confirmAction("即将构建并烧录台架测试固件。请确认座椅运动区域无人、急停可用且 CMSIS-DAP 已连接。", "确认构建/烧录"))) return; runAction(() => apiPost("/firmware/build-flash", { confirmed_bench_clear: true }), "固件构建/烧录流程已完成"); }); - $("#repairHardwareToggle").addEventListener("click", () => { + $("#repairHardwareToggle").addEventListener("click", async () => { if (!latest) return; if (latest.hardware_session?.active) { runAction(() => apiPost("/hardware/stop"), "硬件诊断已停止并保存报告"); return; } - if (!window.confirm("硬件诊断可能自动烧录测试固件,并短时驱动四路电机、风扇与低档加热。请确认台架区域安全且急停可用。")) return; + if (!(await confirmAction("硬件诊断可能自动烧录测试固件,并短时驱动四路电机、风扇与低档加热。请确认台架区域安全且急停可用。", "确认启动诊断"))) return; runAction(() => apiPost("/hardware/start", { confirmed_bench_clear: true }), "21 针主动硬件诊断已启动"); }); $("#repairHardwareSelfTest").addEventListener("click", () => runAction(() => apiPost("/hardware/self-test"), "72 针映射和诊断规则自检完成")); - $("#repairEmergencyStop").addEventListener("click", () => { - if (!window.confirm("确认提交 STOP ALL 和热管理关闭请求?")) return; + $("#repairEmergencyStop").addEventListener("click", async () => { + if (!(await confirmAction("确认提交 STOP ALL 和热管理关闭请求?", "确认紧急停止"))) return; runAction(() => apiPost("/emergency-stop"), "紧急停止请求已提交"); }); + $("#repairConfirmCancel").addEventListener("click", () => finishConfirmation(false)); + $("#repairConfirmAccept").addEventListener("click", () => finishConfirmation(true)); + $("#repairConfirmDialog").addEventListener("cancel", (event) => { + event.preventDefault(); + finishConfirmation(false); + }); + $("#repairConfirmDialog").addEventListener("close", () => { + if (confirmationResolve) finishConfirmation(false); + }); $("#repairSoftwareRecords").addEventListener("click", () => $("#repairSoftwareDialog").showModal()); $("#repairHardwareRecords").addEventListener("click", () => $("#repairHardwareDialog").showModal()); $$('[data-repair-close]').forEach((button) => button.addEventListener("click", () => $(`#${button.dataset.repairClose}`).close())); diff --git a/apps/web-console/service-worker.js b/apps/web-console/service-worker.js index c06cca6..5392300 100644 --- a/apps/web-console/service-worker.js +++ b/apps/web-console/service-worker.js @@ -1,4 +1,4 @@ -const CACHE_VERSION = "cognitive-agent-pad-v39"; +const CACHE_VERSION = "cognitive-agent-pad-v40"; const SHELL_CACHE = `${CACHE_VERSION}-shell`; const RUNTIME_CACHE = `${CACHE_VERSION}-runtime`; const APP_SHELL = [ @@ -6,7 +6,7 @@ const APP_SHELL = [ "/index.html", "/styles.css?v=android-pad-4", "/network.js?v=android-pad-1", - "/app.js?v=seat-hil-43", + "/app.js?v=seat-hil-44", "/gesture-control.js?v=android-pad-6", "/pwa.js?v=android-pad-1", "/console-v2.css?v=desktop-refactor-68", @@ -15,9 +15,9 @@ const APP_SHELL = [ "/self-extension.js?v=extension-6", "/self-calibration.css?v=calibration-4", "/self-calibration.js?v=calibration-2", - "/self-repair.css?v=repair-15", - "/self-repair.js?v=repair-15", - "/self-repair-seat3d.js?v=repair-15", + "/self-repair.css?v=repair-17", + "/self-repair.js?v=repair-17", + "/self-repair-seat3d.js?v=repair-17", "/assets/self-calibration-model.bundle.js", "/assets/models/n7_seat.glb", "/manifest.webmanifest", diff --git a/artifacts/hil/seat_frontend_hil_20260808_current_control_and_modes.json b/artifacts/hil/seat_frontend_hil_20260808_current_control_and_modes.json new file mode 100644 index 0000000..f13d236 --- /dev/null +++ b/artifacts/hil/seat_frontend_hil_20260808_current_control_and_modes.json @@ -0,0 +1,2158 @@ +{ + "suite": "t2g-seat-frontend-comprehensive-hil", + "started_at": "2026-08-07T17:56:50.136875Z", + "base_url": "http://127.0.0.1:8003", + "vehicle_id": "denza_n7", + "conversation_id": "conv-hil-full-20260807175650", + "runtime": { + "hardware_execution_allowed": true, + "firmware_profiles": [ + "combined" + ] + }, + "results": [ + { + "id": "THERM-H-LOW-CHINESE", + "group": "thermal", + "utterance": "把副驾驶座椅加热调到一档", + "started_at": "2026-08-07T17:57:39.720539Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260807175739-4c9b4e", + "provider_used": "local_rules", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 03 00 00 00 00", + "timestamp": 105752.054828, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 04 00 00 00 00", + "timestamp": 105752.080886, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 05 00 00 00 00", + "timestamp": 105752.106931, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 02 00 00 00 00", + "timestamp": 105752.13302, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "11 00 00 00 00 00 00 00", + "timestamp": 105752.141003, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "heating": { + "state": "on", + "level": 1, + "feedback_value": 2, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "11 00 00 00 00 00 00 00", + "timestamp": 105752.141003, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "captured_at": "2026-08-07T17:57:40.554865Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-07T17:57:40.619874Z", + "duration_ms": 899 + }, + { + "id": "THERM-V-MID-PREFIX", + "group": "thermal", + "utterance": "右前座椅开启2档通风", + "started_at": "2026-08-07T17:57:40.622564Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260807175740-d6d178", + "provider_used": "local_rules", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 04 00 00 00 00", + "timestamp": 105752.934973, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 05 00 00 00 00", + "timestamp": 105752.960401, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 02 00 00 00 00", + "timestamp": 105752.986444, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 03 00 00 00 00", + "timestamp": 105753.012547, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + } + }, + "ventilation": { + "state": "on", + "level": 2, + "feedback_value": 3, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "13 00 00 00 00 00 00 00", + "timestamp": 105753.022784, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "heating": { + "state": "on", + "level": 1, + "feedback_value": 2, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "13 00 00 00 00 00 00 00", + "timestamp": 105753.022784, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "captured_at": "2026-08-07T17:57:41.437203Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-07T17:57:41.507553Z", + "duration_ms": 885 + }, + { + "id": "THERM-MIXED-OFF", + "group": "thermal", + "utterance": "关闭右前座的加热和通风", + "started_at": "2026-08-07T17:57:41.509818Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260807175741-635519", + "provider_used": "local_rules", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 03 00 00 00 00", + "timestamp": 105753.792454, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 04 00 00 00 00", + "timestamp": 105753.818299, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 05 00 00 00 00", + "timestamp": 105753.844153, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 02 00 00 00 00", + "timestamp": 105753.870511, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 105753.879514, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 105753.879514, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "captured_at": "2026-08-07T17:57:42.294600Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-07T17:57:42.364739Z", + "duration_ms": 855 + }, + { + "id": "MOTION-M0-25-HORIZONTAL", + "group": "motion", + "utterance": "把副驾座椅水平位置调到25%", + "started_at": "2026-08-07T17:57:42.368168Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260807175742-a4fa68", + "provider_used": "local_rules", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 06 00 00 00 00", + "timestamp": 105758.571151, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 06 00 00 00 00", + "timestamp": 105758.596355, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "longitudinal": { + "position_pct": 25, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 2525, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 07 00 DD 09 00", + "timestamp": 105758.622724, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 18 06 00 00 00 00", + "timestamp": 105758.649103, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 105758.659957, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 105758.659957, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "captured_at": "2026-08-07T17:57:47.073624Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-07T17:57:47.155972Z", + "duration_ms": 4788 + }, + { + "id": "MOTION-M1-60-TILT", + "group": "motion", + "utterance": "右前座坐垫倾角调到60%", + "started_at": "2026-08-07T17:57:47.158176Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260807175747-c4ba7c", + "provider_used": "local_rules", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 18 08 00 00 00 00", + "timestamp": 105764.357312, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 08 00 00 00 00", + "timestamp": 105764.382681, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "longitudinal": { + "position_pct": 25, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 2525, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 08 08 00 DD 09 00", + "timestamp": 105764.409186, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "cushion_tilt": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 5989, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 09 00 65 17 00", + "timestamp": 105764.434498, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 105764.444911, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 105764.444911, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "captured_at": "2026-08-07T17:57:52.858982Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-07T17:57:52.923849Z", + "duration_ms": 5766 + }, + { + "id": "MOTION-M2-ANGLE-130", + "group": "motion", + "utterance": "副驾靠背角度调到130度", + "started_at": "2026-08-07T17:57:52.926115Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260807175752-eb75ed", + "provider_used": "local_rules", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 5989, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 0A 00 65 17 00", + "timestamp": 105778.443675, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "backrest_recline": { + "position_pct": 51, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 5104, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 0B 00 F0 13 00", + "timestamp": 105778.46968, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 18 0A 00 00 00 00", + "timestamp": 105778.495054, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "longitudinal": { + "position_pct": 25, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 2525, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 08 0A 00 DD 09 00", + "timestamp": 105778.521649, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 105778.532074, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 105778.532074, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "captured_at": "2026-08-07T17:58:06.946974Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-07T17:58:07.024406Z", + "duration_ms": 14098 + }, + { + "id": "MOTION-M3-ANGLE-145", + "group": "motion", + "utterance": "副驾腿托抬到145度", + "started_at": "2026-08-07T17:58:07.110757Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260807175807-392252", + "provider_used": "local_rules", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 5989, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 0C 00 65 17 00", + "timestamp": 105789.75595, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "backrest_recline": { + "position_pct": 51, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 5104, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 08 0C 00 F0 13 00", + "timestamp": 105789.781443, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "legrest_height": { + "position_pct": 69, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 6893, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 0D 00 ED 1A 00", + "timestamp": 105789.808075, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "longitudinal": { + "position_pct": 25, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 2525, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 08 0C 00 DD 09 00", + "timestamp": 105789.833556, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 105789.844019, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 105789.844019, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "captured_at": "2026-08-07T17:58:18.257765Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-07T17:58:18.334139Z", + "duration_ms": 11223 + }, + { + "id": "COMBINED-ALL", + "group": "combined", + "utterance": "打开副驾加热1档、通风1档,座椅水平到30%,坐盆到40%,靠背到37%,腿托到42%", + "started_at": "2026-08-07T17:58:18.341467Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260807175818-128af6", + "provider_used": "local_rules", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 40, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 4011, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 10 00 AB 0F 00", + "timestamp": 105809.96029, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "backrest_recline": { + "position_pct": 37, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 3686, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 11 00 66 0E 00", + "timestamp": 105809.985431, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "legrest_height": { + "position_pct": 42, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 4189, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 12 00 5D 10 00", + "timestamp": 105810.012251, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "longitudinal": { + "position_pct": 30, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 3026, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 0F 00 D2 0B 00", + "timestamp": 105810.03792, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + } + }, + "ventilation": { + "state": "on", + "level": 1, + "feedback_value": 2, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "12 00 00 00 00 00 00 00", + "timestamp": 105810.049625, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "heating": { + "state": "on", + "level": 1, + "feedback_value": 2, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "12 00 00 00 00 00 00 00", + "timestamp": 105810.049625, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "captured_at": "2026-08-07T17:58:38.463450Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-07T17:58:38.544925Z", + "duration_ms": 20203 + }, + { + "id": "COMBINED-CLEANUP", + "group": "combined", + "utterance": "关闭右前座加热和通风,并把水平、坐盆、靠背、腿托四轴归零", + "started_at": "2026-08-07T17:58:38.546440Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260807175838-019e40", + "provider_used": "local_rules", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 15 00 00 00 00", + "timestamp": 105845.546346, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 16 00 00 00 00", + "timestamp": 105845.572187, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 17 00 00 00 00", + "timestamp": 105845.598535, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 14 00 00 00 00", + "timestamp": 105845.624354, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 105845.631207, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 105845.631207, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "captured_at": "2026-08-07T17:59:14.045178Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-07T17:59:14.126280Z", + "duration_ms": 35580 + }, + { + "id": "MODE-EASY-OPEN", + "group": "mode", + "utterance": "打开轻松进出模式", + "started_at": "2026-08-07T17:59:14.126519Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260807175914-267f62", + "provider_used": "local_rules", + "matched_modes": [ + "easy_entry_exit" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 1A 00 00 00 00", + "timestamp": 105878.589707, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 1B 00 00 00 00", + "timestamp": 105878.615044, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 1C 00 00 00 00", + "timestamp": 105878.640958, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 19 00 10 27 00", + "timestamp": 105878.666985, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 105878.67493, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 105878.67493, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "captured_at": "2026-08-07T17:59:47.087023Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-07T17:59:47.160682Z", + "duration_ms": 33034 + }, + { + "id": "MODE-OFFICE-ENTER", + "group": "mode", + "utterance": "副驾进入办公", + "started_at": "2026-08-07T17:59:47.160916Z", + "status": "failed", + "errors": [ + "temperature_c must be between 18 and 32" + ], + "http_status": 400, + "request_id": null, + "provider_used": null, + "finished_at": "2026-08-07T17:59:47.168934Z", + "duration_ms": 8 + }, + { + "id": "MODE-QUEEN-SWITCH", + "group": "mode", + "utterance": "切换到女王副驾行驶模式", + "started_at": "2026-08-07T17:59:47.169106Z", + "status": "failed", + "errors": [ + "temperature_c must be between 18 and 32" + ], + "http_status": 400, + "request_id": null, + "provider_used": null, + "finished_at": "2026-08-07T17:59:47.174826Z", + "duration_ms": 6 + }, + { + "id": "MODE-BABY-START", + "group": "mode", + "utterance": "启动宝宝午睡模式", + "started_at": "2026-08-07T17:59:47.175026Z", + "status": "failed", + "errors": [ + "timed out after 1500 ms waiting for CAN 0x301" + ], + "http_status": 201, + "request_id": "req-20260807175947-e14d93", + "provider_used": "local_rules", + "failure_telemetry": { + "error_type": "HardwareExecutionError", + "stop_all_attempted": false, + "simulated": false + }, + "finished_at": "2026-08-07T17:59:52.097114Z", + "duration_ms": 4922 + }, + { + "id": "MODE-CRUISE-ENTER", + "group": "mode", + "utterance": "进入巡航沙发", + "started_at": "2026-08-07T17:59:52.097351Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260807175952-7c0df8", + "provider_used": "local_rules", + "matched_modes": [ + "cruise_sofa" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 30, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 3021, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 20 00 CD 0B 00", + "timestamp": 105919.877887, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "backrest_recline": { + "position_pct": 44, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 4406, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 21 00 36 11 00", + "timestamp": 105919.903977, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "legrest_height": { + "position_pct": 53, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 5317, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 22 00 C5 14 00", + "timestamp": 105919.930608, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "longitudinal": { + "position_pct": 51, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 5090, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 1F 00 E2 13 00", + "timestamp": 105919.956083, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 105919.96884, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 105919.96884, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "captured_at": "2026-08-07T18:00:28.381350Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-07T18:00:28.507001Z", + "duration_ms": 36410 + }, + { + "id": "MODE-MEDITATION-OPEN", + "group": "mode", + "utterance": "打开冥想空间模式", + "started_at": "2026-08-07T18:00:28.507243Z", + "status": "failed", + "errors": [ + "timed out after 1500 ms waiting for CAN 0x301" + ], + "http_status": 201, + "request_id": "req-20260807180028-6256f3", + "provider_used": "local_rules", + "failure_telemetry": { + "error_type": "HardwareExecutionError", + "stop_all_attempted": false, + "simulated": false + }, + "finished_at": "2026-08-07T18:00:33.437445Z", + "duration_ms": 4930 + }, + { + "id": "MODE-LEISURE-SWITCH", + "group": "mode", + "utterance": "切换到休闲躺椅模式", + "started_at": "2026-08-07T18:00:33.437654Z", + "status": "failed", + "errors": [ + "timed out after 1500 ms waiting for CAN 0x301" + ], + "http_status": 201, + "request_id": "req-20260807180033-28d328", + "provider_used": "local_rules", + "failure_telemetry": { + "error_type": "HardwareExecutionError", + "stop_all_attempted": false, + "simulated": false + }, + "finished_at": "2026-08-07T18:00:38.350449Z", + "duration_ms": 4913 + }, + { + "id": "MODE-CALF-OPEN", + "group": "mode", + "utterance": "打开小腿解压悬浮模式", + "started_at": "2026-08-07T18:00:38.350712Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260807180038-3db9d5", + "provider_used": "local_rules", + "matched_modes": [ + "calf_decompression_float" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 51, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 5090, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 26 00 E2 13 00", + "timestamp": 105960.371528, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "cushion_tilt": { + "position_pct": 75, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 7513, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 27 00 59 1D 00", + "timestamp": 105960.396953, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 28 00 00 00 00", + "timestamp": 105960.422957, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "legrest_height": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 28 29 00 10 27 00", + "timestamp": 105960.44952, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 105960.461107, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 105960.461107, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "captured_at": "2026-08-07T18:01:08.871918Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-07T18:01:08.940601Z", + "duration_ms": 30590 + }, + { + "id": "MODE-BEACH-SWITCH", + "group": "mode", + "utterance": "切换到电感沙滩椅模式", + "started_at": "2026-08-07T18:01:08.940819Z", + "status": "failed", + "errors": [ + "ZCAN_Transmit did not accept the frame; channel_error=0x00000004" + ], + "http_status": 201, + "request_id": "req-20260807180108-03c0a4", + "provider_used": "local_rules", + "failure_telemetry": { + "target": "vehicle", + "requested_parameters": { + "position_pct": 0 + }, + "command_frame": { + "frame_id": "0x4F5", + "payload_size": 8, + "data_hex": "00 00 00 FF 00 00 00 00", + "channel": 1, + "frame_format": "classic_can", + "bitrate_switch": false, + "repeat": { + "count": 1, + "period_ms": 0 + } + }, + "channel": 1, + "simulated": false + }, + "finished_at": "2026-08-07T18:02:04.158327Z", + "duration_ms": 55218 + }, + { + "id": "MODE-NAP-OPEN", + "group": "mode", + "utterance": "打开小憩模式", + "started_at": "2026-08-07T18:02:04.158564Z", + "status": "failed", + "errors": [ + "timed out after 1500 ms waiting for CAN 0x301" + ], + "http_status": 201, + "request_id": "req-20260807180204-c2de69", + "provider_used": "local_rules", + "failure_telemetry": { + "error_type": "HardwareExecutionError", + "stop_all_attempted": false, + "simulated": false + }, + "finished_at": "2026-08-07T18:02:09.096388Z", + "duration_ms": 4938 + }, + { + "id": "MODE-ZERO-GRAVITY-ENGLISH", + "group": "mode", + "utterance": "开启 zero-gravity 模式", + "started_at": "2026-08-07T18:02:09.096577Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260807180209-e61b8c", + "provider_used": "local_rules", + "matched_modes": [ + "zero_gravity" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 34 00 B5 24 00", + "timestamp": 106046.834246, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 31 00 10 27 00", + "timestamp": 106046.859798, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 28 32 00 10 27 00", + "timestamp": 106046.885279, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 8092, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 33 00 9C 1F 00", + "timestamp": 106046.910828, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 106046.922441, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 106046.922441, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "captured_at": "2026-08-07T18:02:35.332171Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-07T18:02:35.403457Z", + "duration_ms": 26307 + } + ], + "position_memory_sync": { + "id": "PREFLIGHT-POSITION-MEMORY-SYNC", + "group": "preflight", + "utterance": "关闭副驾座椅加热和通风,并把水平、坐盆、靠背、腿托四轴归零", + "started_at": "2026-08-07T17:56:50.189299Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260807175650-4998b0", + "provider_used": "local_rules", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 02 00 00 00 00", + "timestamp": 105751.162787, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 03 00 00 00 00", + "timestamp": 105751.188632, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 04 00 00 00 00", + "timestamp": 105751.214551, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 05 00 00 00 00", + "timestamp": 105751.240417, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 105751.247196, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 105751.247196, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "captured_at": "2026-08-07T17:57:39.662421Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-07T17:57:39.718160Z", + "duration_ms": 49529 + }, + "final_state": { + "id": "FINAL-THERMAL-OFF", + "group": "cleanup", + "utterance": "关闭副驾座椅加热和通风,并把水平、坐盆、靠背、腿托四轴归零", + "started_at": "2026-08-07T18:02:35.403620Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260807180235-6d8f67", + "provider_used": "local_rules", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 37 00 00 00 00", + "timestamp": 106116.24078, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 38 00 00 00 00", + "timestamp": 106116.267116, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 39 00 00 00 00", + "timestamp": 106116.292935, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 36 00 00 00 00", + "timestamp": 106116.318855, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 106116.327881, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 106116.327881, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "captured_at": "2026-08-07T18:03:44.735057Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-07T18:03:44.819453Z", + "duration_ms": 69416 + }, + "finished_at": "2026-08-07T18:03:44.819501Z", + "summary": { + "total": 20, + "passed": 13, + "failed": 7, + "safety_blocked": 0, + "executed": 20, + "position_memory_sync_passed": true, + "final_state_passed": true + } +} \ No newline at end of file diff --git a/artifacts/hil/seat_frontend_hil_20260808_dynamic_modes.json b/artifacts/hil/seat_frontend_hil_20260808_dynamic_modes.json new file mode 100644 index 0000000..418a66e --- /dev/null +++ b/artifacts/hil/seat_frontend_hil_20260808_dynamic_modes.json @@ -0,0 +1,825 @@ +{ + "suite": "t2g-seat-frontend-comprehensive-hil", + "started_at": "2026-08-07T18:17:38.577477Z", + "base_url": "http://127.0.0.1:8003", + "vehicle_id": "denza_n7", + "conversation_id": "conv-hil-full-20260807181738", + "runtime": { + "hardware_execution_allowed": true, + "firmware_profiles": [ + "combined" + ] + }, + "results": [ + { + "id": "MODE-ROCKING-HORSE-START", + "group": "mode", + "utterance": "开启木马模式", + "started_at": "2026-08-07T18:18:01.681906Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260807181801-e5096b", + "provider_used": "local_rules", + "matched_modes": [ + "rocking_horse" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 2, + "position_valid": true, + "motion_state": "moving", + "fault": false, + "task_state": 2, + "motor_result": 1, + "motor_selector": 2, + "value_x100": 153, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 12 0D 35 00 99 00 5A", + "timestamp": 106973.993523, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "legrest_height": { + "position_pct": 2, + "position_valid": true, + "motion_state": "moving", + "fault": false, + "task_state": 2, + "motor_result": 1, + "motor_selector": 3, + "value_x100": 216, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 12 0D 35 00 D8 00 5A", + "timestamp": 106974.0196, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "longitudinal": { + "position_pct": 2, + "position_valid": true, + "motion_state": "moving", + "fault": false, + "task_state": 2, + "motor_result": 1, + "motor_selector": 0, + "value_x100": 240, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 12 0D 35 00 F0 00 5A", + "timestamp": 106974.045704, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "cushion_tilt": { + "position_pct": 6, + "position_valid": true, + "motion_state": "moving", + "fault": false, + "task_state": 2, + "motor_result": 1, + "motor_selector": 1, + "value_x100": 588, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 12 0D 35 00 4C 02 5A", + "timestamp": 106974.072431, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 106974.092381, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 106974.092381, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "captured_at": "2026-08-07T18:18:02.485490Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-07T18:18:02.550409Z", + "duration_ms": 869 + }, + { + "id": "MODE-ROCKING-HORSE-STOP", + "group": "mode", + "utterance": "关闭木马模式", + "started_at": "2026-08-07T18:18:02.552655Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260807181802-7609ee", + "provider_used": "local_rules", + "matched_modes": [ + "rocking_horse" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 3, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 338, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 08 35 00 52 01 00", + "timestamp": 106974.915491, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "legrest_height": { + "position_pct": 5, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 541, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 08 35 00 1D 02 00", + "timestamp": 106974.942088, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "longitudinal": { + "position_pct": 5, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 541, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 08 35 00 1D 02 00", + "timestamp": 106974.968094, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "cushion_tilt": { + "position_pct": 11, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 1123, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 35 00 63 04 00", + "timestamp": 106974.993545, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 106975.005142, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 106975.005142, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "captured_at": "2026-08-07T18:18:03.397863Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-07T18:18:03.474083Z", + "duration_ms": 921 + }, + { + "id": "MODE-DYNAMIC-CRADLE-START", + "group": "mode", + "utterance": "开启动态摇篮模式", + "started_at": "2026-08-07T18:18:03.517741Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260807181803-e97616", + "provider_used": "local_rules", + "matched_modes": [ + "dynamic_cradle" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 8, + "position_valid": true, + "motion_state": "moving", + "fault": false, + "task_state": 2, + "motor_result": 1, + "motor_selector": 3, + "value_x100": 804, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 12 0D 38 00 24 03 5A", + "timestamp": 106975.856713, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "longitudinal": { + "position_pct": 8, + "position_valid": true, + "motion_state": "moving", + "fault": false, + "task_state": 2, + "motor_result": 1, + "motor_selector": 0, + "value_x100": 802, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 12 0D 38 00 22 03 5A", + "timestamp": 106975.881732, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "cushion_tilt": { + "position_pct": 17, + "position_valid": true, + "motion_state": "moving", + "fault": false, + "task_state": 2, + "motor_result": 1, + "motor_selector": 1, + "value_x100": 1684, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 12 0D 38 00 94 06 5A", + "timestamp": 106975.907916, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "backrest_recline": { + "position_pct": 6, + "position_valid": true, + "motion_state": "moving", + "fault": false, + "task_state": 2, + "motor_result": 1, + "motor_selector": 2, + "value_x100": 556, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 12 0D 38 00 2C 02 5A", + "timestamp": 106975.934169, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 106975.955173, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 106975.955173, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "captured_at": "2026-08-07T18:18:04.348455Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-07T18:18:04.413787Z", + "duration_ms": 896 + }, + { + "id": "MODE-DYNAMIC-CRADLE-STOP", + "group": "mode", + "utterance": "关闭动态摇篮模式", + "started_at": "2026-08-07T18:18:04.416034Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260807181804-bcf153", + "provider_used": "local_rules", + "matched_modes": [ + "dynamic_cradle" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 11, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 0, + "value_x100": 1122, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 30 08 38 00 62 04 00", + "timestamp": 106976.740494, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "cushion_tilt": { + "position_pct": 22, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 1, + "value_x100": 2246, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 30 08 38 00 C6 08 00", + "timestamp": 106976.76544, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "backrest_recline": { + "position_pct": 7, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 2, + "value_x100": 742, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 30 08 38 00 E6 02 00", + "timestamp": 106976.792049, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "legrest_height": { + "position_pct": 11, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 0, + "motor_result": 3, + "motor_selector": 3, + "value_x100": 1144, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 30 08 38 00 78 04 00", + "timestamp": 106976.817508, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 106976.829112, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 106976.829112, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "captured_at": "2026-08-07T18:18:05.221617Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-07T18:18:05.302650Z", + "duration_ms": 887 + } + ], + "position_memory_sync": { + "id": "PREFLIGHT-POSITION-MEMORY-SYNC", + "group": "preflight", + "utterance": "关闭副驾座椅加热和通风,并把水平、坐盆、靠背、腿托四轴归零", + "started_at": "2026-08-07T18:17:38.579391Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260807181738-c1fa94", + "provider_used": "local_rules", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 31 00 00 00 00", + "timestamp": 106973.120321, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 32 00 00 00 00", + "timestamp": 106973.146175, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 2F 00 00 00 00", + "timestamp": 106973.171397, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 30 00 00 00 00", + "timestamp": 106973.198366, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 106973.204067, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 106973.204067, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "captured_at": "2026-08-07T18:18:01.596265Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-07T18:18:01.678120Z", + "duration_ms": 23099 + }, + "final_state": { + "id": "FINAL-THERMAL-OFF", + "group": "cleanup", + "utterance": "关闭副驾座椅加热和通风,并把水平、坐盆、靠背、腿托四轴归零", + "started_at": "2026-08-07T18:18:05.303817Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260807181805-8f6d46", + "provider_used": "local_rules", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 3C 00 00 00 00", + "timestamp": 106996.774961, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 3D 00 00 00 00", + "timestamp": 106996.800164, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 3A 00 00 00 00", + "timestamp": 106996.826407, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 3B 00 00 00 00", + "timestamp": 106996.852753, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 106996.861946, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 106996.861946, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "captured_at": "2026-08-07T18:18:25.255987Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-07T18:18:25.336490Z", + "duration_ms": 20033 + }, + "finished_at": "2026-08-07T18:18:25.336534Z", + "summary": { + "total": 4, + "passed": 4, + "failed": 0, + "safety_blocked": 0, + "executed": 4, + "position_memory_sync_passed": true, + "final_state_passed": true + } +} \ No newline at end of file diff --git a/artifacts/hil/seat_frontend_hil_20260808_retry_modes.json b/artifacts/hil/seat_frontend_hil_20260808_retry_modes.json new file mode 100644 index 0000000..8fcd6ea --- /dev/null +++ b/artifacts/hil/seat_frontend_hil_20260808_retry_modes.json @@ -0,0 +1,1227 @@ +{ + "suite": "t2g-seat-frontend-comprehensive-hil", + "started_at": "2026-08-07T18:12:37.851073Z", + "base_url": "http://127.0.0.1:8003", + "vehicle_id": "denza_n7", + "conversation_id": "conv-hil-full-20260807181237", + "runtime": { + "hardware_execution_allowed": true, + "firmware_profiles": [ + "combined" + ] + }, + "results": [ + { + "id": "MODE-OFFICE-ENTER", + "group": "mode", + "utterance": "副驾进入办公", + "started_at": "2026-08-07T18:13:00.981080Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260807181300-fe41c9", + "provider_used": "local_rules", + "matched_modes": [ + "office" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 22, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 2193, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 08 00 91 08 00", + "timestamp": 106701.077301, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "backrest_recline": { + "position_pct": 22, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 2214, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 09 00 A6 08 00", + "timestamp": 106701.103324, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "legrest_height": { + "position_pct": 21, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 2117, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 0A 00 45 08 00", + "timestamp": 106701.12999, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "longitudinal": { + "position_pct": 72, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 7214, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 07 00 2E 1C 00", + "timestamp": 106701.155511, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 106701.167114, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 106701.167114, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "captured_at": "2026-08-07T18:13:29.566099Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-07T18:13:29.645728Z", + "duration_ms": 28665 + }, + { + "id": "MODE-QUEEN-SWITCH", + "group": "mode", + "utterance": "切换到女王副驾行驶模式", + "started_at": "2026-08-07T18:13:29.647969Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260807181329-bfa186", + "provider_used": "local_rules", + "matched_modes": [ + "queen_passenger_driving" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 38, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 3797, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 0D 00 D5 0E 00", + "timestamp": 106716.470489, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "backrest_recline": { + "position_pct": 44, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 4406, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 0E 00 36 11 00", + "timestamp": 106716.496553, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "legrest_height": { + "position_pct": 31, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 3122, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 0F 00 32 0C 00", + "timestamp": 106716.522022, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "longitudinal": { + "position_pct": 72, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 7194, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 0C 00 1A 1C 00", + "timestamp": 106716.548686, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 106716.558044, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 106716.558044, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "captured_at": "2026-08-07T18:13:44.955888Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-07T18:13:45.028279Z", + "duration_ms": 15380 + }, + { + "id": "MODE-BABY-START", + "group": "mode", + "utterance": "启动宝宝午睡模式", + "started_at": "2026-08-07T18:13:45.031587Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260807181345-bfc8d0", + "provider_used": "local_rules", + "matched_modes": [ + "baby_nap" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 30, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 2995, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 12 00 B3 0B 00", + "timestamp": 106731.898471, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "backrest_recline": { + "position_pct": 41, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 4100, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 13 00 04 10 00", + "timestamp": 106731.92462, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 14 00 00 00 00", + "timestamp": 106731.950786, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "longitudinal": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 8116, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 11 00 B4 1F 00", + "timestamp": 106731.976977, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 106731.987135, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 106731.987135, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "captured_at": "2026-08-07T18:14:00.383372Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-07T18:14:00.465139Z", + "duration_ms": 15434 + }, + { + "id": "MODE-MEDITATION-OPEN", + "group": "mode", + "utterance": "打开冥想空间模式", + "started_at": "2026-08-07T18:14:00.467376Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260807181400-fd474b", + "provider_used": "local_rules", + "matched_modes": [ + "meditation_space" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 16 00 10 27 00", + "timestamp": 106752.278518, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "cushion_tilt": { + "position_pct": 44, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 4412, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 17 00 3C 11 00", + "timestamp": 106752.304598, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "backrest_recline": { + "position_pct": 44, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 4395, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 18 00 2B 11 00", + "timestamp": 106752.331298, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "legrest_height": { + "position_pct": 58, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 5811, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 19 00 B3 16 00", + "timestamp": 106752.356753, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 106752.36841, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 106752.36841, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "captured_at": "2026-08-07T18:14:20.765532Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-07T18:14:20.838519Z", + "duration_ms": 20371 + }, + { + "id": "MODE-LEISURE-SWITCH", + "group": "mode", + "utterance": "切换到休闲躺椅模式", + "started_at": "2026-08-07T18:14:20.840793Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260807181420-25dd09", + "provider_used": "local_rules", + "matched_modes": [ + "leisure_lounger" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 30, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 2995, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 08 1C 00 B3 0B 00", + "timestamp": 106776.661113, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "backrest_recline": { + "position_pct": 66, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 6598, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 1D 00 C6 19 00", + "timestamp": 106776.687705, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "legrest_height": { + "position_pct": 76, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 7604, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 1E 00 B4 1D 00", + "timestamp": 106776.713826, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "longitudinal": { + "position_pct": 51, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 5090, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 08 1B 00 E2 13 00", + "timestamp": 106776.739292, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 106776.749753, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 106776.749753, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "captured_at": "2026-08-07T18:14:45.145316Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-07T18:14:45.220466Z", + "duration_ms": 24380 + }, + { + "id": "MODE-BEACH-SWITCH", + "group": "mode", + "utterance": "切换到电感沙滩椅模式", + "started_at": "2026-08-07T18:14:45.226373Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260807181445-15ca7d", + "provider_used": "local_rules", + "matched_modes": [ + "electric_beach_chair" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "backrest_recline": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 28 22 00 10 27 00", + "timestamp": 106805.219789, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "legrest_height": { + "position_pct": 60, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 5981, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 23 00 5D 17 00", + "timestamp": 106805.246338, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 20 00 10 27 00", + "timestamp": 106805.271785, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 21 00 00 00 00", + "timestamp": 106805.298273, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 106805.310364, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 106805.310364, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "captured_at": "2026-08-07T18:15:13.706084Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-07T18:15:13.803071Z", + "duration_ms": 28577 + }, + { + "id": "MODE-NAP-OPEN", + "group": "mode", + "utterance": "打开小憩模式", + "started_at": "2026-08-07T18:15:13.805417Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260807181513-de722c", + "provider_used": "local_rules", + "matched_modes": [ + "nap" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "cushion_tilt": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 28 26 00 10 27 00", + "timestamp": 106831.822953, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "backrest_recline": { + "position_pct": 81, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 8103, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 08 27 00 A7 1F 00", + "timestamp": 106831.848424, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "legrest_height": { + "position_pct": 94, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 9397, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 08 28 00 B5 24 00", + "timestamp": 106831.875125, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 10000, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 28 25 00 10 27 00", + "timestamp": 106831.900583, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 106831.911652, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 106831.911652, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "captured_at": "2026-08-07T18:15:40.307713Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-07T18:15:40.379532Z", + "duration_ms": 26574 + } + ], + "position_memory_sync": { + "id": "PREFLIGHT-POSITION-MEMORY-SYNC", + "group": "preflight", + "utterance": "关闭副驾座椅加热和通风,并把水平、坐盆、靠背、腿托四轴归零", + "started_at": "2026-08-07T18:12:37.852409Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260807181237-bfe655", + "provider_used": "local_rules", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 05 00 00 00 00", + "timestamp": 106672.425515, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 02 00 00 00 00", + "timestamp": 106672.451358, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 03 00 00 00 00", + "timestamp": 106672.477244, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 04 00 00 00 00", + "timestamp": 106672.503518, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 106672.510342, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 106672.510342, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "captured_at": "2026-08-07T18:13:00.909248Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-07T18:13:00.978797Z", + "duration_ms": 23126 + }, + "final_state": { + "id": "FINAL-THERMAL-OFF", + "group": "cleanup", + "utterance": "关闭副驾座椅加热和通风,并把水平、坐盆、靠背、腿托四轴归零", + "started_at": "2026-08-07T18:15:40.381382Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260807181540-2c7267", + "provider_used": "local_rules", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 3, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "03 26 18 2D 00 00 00 00", + "timestamp": 106901.867749, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 0, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "00 26 18 2A 00 00 00 00", + "timestamp": 106901.894758, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 1, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "01 26 18 2B 00 00 00 00", + "timestamp": 106901.920597, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped", + "fault": false, + "task_state": 6, + "motor_result": 2, + "motor_selector": 2, + "value_x100": 0, + "feedback_frame": { + "frame_id": "0x302", + "payload_size": 8, + "data_hex": "02 26 18 2C 00 00 00 00", + "timestamp": 106901.945803, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + } + }, + "ventilation": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 106901.952594, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "heating": { + "state": "off", + "level": 0, + "feedback_value": 1, + "feedback_frame": { + "frame_id": "0x4FA", + "payload_size": 8, + "data_hex": "09 00 00 00 00 00 00 00", + "timestamp": 106901.952594, + "channel": 0, + "is_fd": false, + "bitrate_switch": false + } + }, + "captured_at": "2026-08-07T18:16:50.347411Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-07T18:16:50.427111Z", + "duration_ms": 70046 + }, + "finished_at": "2026-08-07T18:16:50.427150Z", + "summary": { + "total": 7, + "passed": 7, + "failed": 0, + "safety_blocked": 0, + "executed": 7, + "position_memory_sync_passed": true, + "final_state_passed": true + } +} \ No newline at end of file diff --git a/artifacts/hil/seat_frontend_hil_20260809_user_admin_retest.json b/artifacts/hil/seat_frontend_hil_20260809_user_admin_retest.json new file mode 100644 index 0000000..46da711 --- /dev/null +++ b/artifacts/hil/seat_frontend_hil_20260809_user_admin_retest.json @@ -0,0 +1,358 @@ +{ + "suite": "t2g-seat-frontend-comprehensive-hil", + "started_at": "2026-08-09T10:04:15.082291Z", + "base_url": "http://127.0.0.1:8003", + "vehicle_id": "denza_n7", + "conversation_id": "conv-hil-full-20260809100415", + "runtime": { + "hardware_execution_allowed": true, + "firmware_profiles": [ + "combined" + ] + }, + "results": [ + { + "id": "MOTION-M0-25-HORIZONTAL", + "group": "motion", + "utterance": "把副驾座椅水平位置调到25%", + "started_at": "2026-08-09T10:04:16.311200Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260809100416-4da1f3", + "provider_used": "local_rules", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 25, + "position_valid": true, + "motion_state": "stopped" + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped" + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped" + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped" + } + }, + "ventilation": { + "state": "off", + "level": 0 + }, + "heating": { + "state": "off", + "level": 0 + }, + "captured_at": "2026-08-09T10:04:21.364491Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-09T10:04:21.365063Z", + "duration_ms": 5054 + }, + { + "id": "MOTION-M1-20-PAN", + "group": "motion", + "utterance": "把副驾坐盆调到20%", + "started_at": "2026-08-09T10:04:21.365115Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260809100421-b0b99e", + "provider_used": "local_rules", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 25, + "position_valid": true, + "motion_state": "stopped" + }, + "cushion_tilt": { + "position_pct": 20, + "position_valid": true, + "motion_state": "stopped" + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped" + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped" + } + }, + "ventilation": { + "state": "off", + "level": 0 + }, + "heating": { + "state": "off", + "level": 0 + }, + "captured_at": "2026-08-09T10:04:24.207471Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-09T10:04:24.208128Z", + "duration_ms": 2843 + }, + { + "id": "COMBINED-ALL", + "group": "combined", + "utterance": "打开副驾加热1档、通风1档,座椅水平到30%,坐盆到40%,靠背到37%,腿托到42%", + "started_at": "2026-08-09T10:04:24.208183Z", + "status": "failed", + "errors": [ + "M3运动反馈未达到目标" + ], + "http_status": 201, + "request_id": "req-20260809100424-27194b", + "provider_used": "local_rules", + "failure_telemetry": { + "transport": "zcanpro_shared_bridge", + "hardware_feedback": false, + "simulated": false, + "bridge_result": { + "details": { + "command_id": "t2g_move_passenger_legrest_height_42pct", + "stop_all_attempted": true, + "summary": "M3运动反馈未达到目标", + "target": 4200, + "terminal": { + "active": false, + "direction": 0, + "driver_fault": false, + "duty": 0, + "far": false, + "motor": 3, + "near": false, + "position": 2349, + "position_valid": true, + "result": 6, + "sequence": 50339, + "stall": false, + "task": 7 + }, + "tolerance": 100 + }, + "log_dir": "D:\\huang.xuewei\\Git\\Cognitive_Agent\\artifacts\\self-repair\\hardware\\20260809_180424_546250", + "report_path": "D:\\huang.xuewei\\Git\\Cognitive_Agent\\artifacts\\self-repair\\hardware\\20260809_180424_546250\\report.json", + "request_id": "SEAT_ORCH_1786269864212_546250", + "result": "FAIL", + "summary": "M3运动反馈未达到目标" + }, + "error_type": null, + "stop_all_attempted": true + }, + "finished_at": "2026-08-09T10:04:47.676002Z", + "duration_ms": 23468 + }, + { + "id": "MODE-EASY-OPEN", + "group": "mode", + "utterance": "打开轻松进出模式", + "started_at": "2026-08-09T10:04:47.676048Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260809100447-c855cc", + "provider_used": "local_rules", + "matched_modes": [ + "easy_entry_exit" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped" + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped" + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped" + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped" + } + }, + "ventilation": { + "state": "on", + "level": 1 + }, + "heating": { + "state": "on", + "level": 1 + }, + "captured_at": "2026-08-09T10:05:18.547335Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-09T10:05:18.548156Z", + "duration_ms": 30872 + } + ], + "position_memory_sync": { + "id": "PREFLIGHT-POSITION-MEMORY-SYNC", + "group": "preflight", + "utterance": "关闭副驾座椅加热和通风,并把水平、坐盆、靠背、腿托四轴归零", + "started_at": "2026-08-09T10:04:15.082316Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260809100415-146708", + "provider_used": "local_rules", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped" + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped" + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped" + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped" + } + }, + "ventilation": { + "state": "off", + "level": 0 + }, + "heating": { + "state": "off", + "level": 0 + }, + "captured_at": "2026-08-09T10:04:16.310470Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-09T10:04:16.311124Z", + "duration_ms": 1229 + }, + "final_state": { + "id": "FINAL-THERMAL-OFF", + "group": "cleanup", + "utterance": "关闭副驾座椅加热和通风,并把水平、坐盆、靠背、腿托四轴归零", + "started_at": "2026-08-09T10:05:18.548210Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260809100518-e21b3f", + "provider_used": "local_rules", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped" + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped" + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped" + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped" + } + }, + "ventilation": { + "state": "off", + "level": 0 + }, + "heating": { + "state": "off", + "level": 0 + }, + "captured_at": "2026-08-09T10:05:36.941483Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-09T10:05:36.942155Z", + "duration_ms": 18394 + }, + "finished_at": "2026-08-09T10:05:36.942191Z", + "summary": { + "total": 4, + "passed": 3, + "failed": 1, + "safety_blocked": 0, + "executed": 4, + "position_memory_sync_passed": true, + "final_state_passed": true + } +} \ No newline at end of file diff --git a/artifacts/hil/seat_frontend_hil_20260809_user_admin_retest_v2.json b/artifacts/hil/seat_frontend_hil_20260809_user_admin_retest_v2.json new file mode 100644 index 0000000..d28d4f7 --- /dev/null +++ b/artifacts/hil/seat_frontend_hil_20260809_user_admin_retest_v2.json @@ -0,0 +1,363 @@ +{ + "suite": "t2g-seat-frontend-comprehensive-hil", + "started_at": "2026-08-09T10:09:27.978007Z", + "base_url": "http://127.0.0.1:8003", + "vehicle_id": "denza_n7", + "conversation_id": "conv-hil-full-20260809100927", + "runtime": { + "hardware_execution_allowed": true, + "firmware_profiles": [ + "combined" + ] + }, + "results": [ + { + "id": "MOTION-M0-25-HORIZONTAL", + "group": "motion", + "utterance": "把副驾座椅水平位置调到25%", + "started_at": "2026-08-09T10:09:29.207379Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260809100929-f3faee", + "provider_used": "local_rules", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 25, + "position_valid": true, + "motion_state": "stopped" + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped" + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped" + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped" + } + }, + "ventilation": { + "state": "off", + "level": 0 + }, + "heating": { + "state": "off", + "level": 0 + }, + "captured_at": "2026-08-09T10:09:34.257766Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-09T10:09:34.258318Z", + "duration_ms": 5051 + }, + { + "id": "MOTION-M1-20-PAN", + "group": "motion", + "utterance": "把副驾坐盆调到20%", + "started_at": "2026-08-09T10:09:34.258367Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260809100934-e7b1ff", + "provider_used": "local_rules", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 25, + "position_valid": true, + "motion_state": "stopped" + }, + "cushion_tilt": { + "position_pct": 20, + "position_valid": true, + "motion_state": "stopped" + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped" + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped" + } + }, + "ventilation": { + "state": "off", + "level": 0 + }, + "heating": { + "state": "off", + "level": 0 + }, + "captured_at": "2026-08-09T10:09:37.186209Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-09T10:09:37.186800Z", + "duration_ms": 2928 + }, + { + "id": "COMBINED-ALL", + "group": "combined", + "utterance": "打开副驾加热1档、通风1档,座椅水平到30%,坐盆到40%,靠背到37%,腿托到42%", + "started_at": "2026-08-09T10:09:37.186855Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260809100937-a7f166", + "provider_used": "local_rules", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 30, + "position_valid": true, + "motion_state": "stopped" + }, + "cushion_tilt": { + "position_pct": 40, + "position_valid": true, + "motion_state": "stopped" + }, + "backrest_recline": { + "position_pct": 37, + "position_valid": true, + "motion_state": "stopped" + }, + "legrest_height": { + "position_pct": 42, + "position_valid": true, + "motion_state": "stopped" + } + }, + "ventilation": { + "state": "on", + "level": 1 + }, + "heating": { + "state": "on", + "level": 1 + }, + "captured_at": "2026-08-09T10:09:58.061243Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-09T10:09:58.061831Z", + "duration_ms": 20875 + }, + { + "id": "MODE-EASY-OPEN", + "group": "mode", + "utterance": "打开轻松进出模式", + "started_at": "2026-08-09T10:09:58.061892Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260809100958-e2d7f8", + "provider_used": "local_rules", + "matched_modes": [ + "easy_entry_exit" + ], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 100, + "position_valid": true, + "motion_state": "stopped" + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped" + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped" + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped" + } + }, + "ventilation": { + "state": "on", + "level": 1 + }, + "heating": { + "state": "on", + "level": 1 + }, + "captured_at": "2026-08-09T10:10:30.421120Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-09T10:10:30.421790Z", + "duration_ms": 32360 + } + ], + "position_memory_sync": { + "id": "PREFLIGHT-POSITION-MEMORY-SYNC", + "group": "preflight", + "utterance": "关闭副驾座椅加热和通风,并把水平、坐盆、靠背、腿托四轴归零", + "started_at": "2026-08-09T10:09:27.978032Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260809100927-fbc991", + "provider_used": "local_rules", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped" + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped" + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped" + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped" + } + }, + "ventilation": { + "state": "off", + "level": 0 + }, + "heating": { + "state": "off", + "level": 0 + }, + "captured_at": "2026-08-09T10:09:29.206596Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-09T10:09:29.207187Z", + "duration_ms": 1229 + }, + "final_state": { + "id": "FINAL-THERMAL-OFF", + "group": "cleanup", + "utterance": "关闭副驾座椅加热和通风,并把水平、坐盆、靠背、腿托四轴归零", + "started_at": "2026-08-09T10:10:30.421849Z", + "status": "passed", + "errors": [], + "http_status": 201, + "request_id": "req-20260809101030-196c5e", + "provider_used": "local_rules", + "matched_modes": [], + "state_http_status": 200, + "physical_state": { + "position": { + "longitudinal": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped" + }, + "cushion_tilt": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped" + }, + "backrest_recline": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped" + }, + "legrest_height": { + "position_pct": 0, + "position_valid": true, + "motion_state": "stopped" + } + }, + "ventilation": { + "state": "off", + "level": 0 + }, + "heating": { + "state": "off", + "level": 0 + }, + "captured_at": "2026-08-09T10:10:48.779417Z", + "source": "physical_can", + "target": { + "device": "seat", + "zone": "front_right", + "instance": "passenger" + }, + "complete": true, + "missing": [] + }, + "finished_at": "2026-08-09T10:10:48.780316Z", + "duration_ms": 18358 + }, + "finished_at": "2026-08-09T10:10:48.780363Z", + "summary": { + "total": 4, + "passed": 4, + "failed": 0, + "safety_blocked": 0, + "executed": 4, + "position_memory_sync_passed": true, + "final_state_passed": true + } +} \ No newline at end of file diff --git a/config/self-repair/README.md b/config/self-repair/README.md index 6464a69..7274b13 100644 --- a/config/self-repair/README.md +++ b/config/self-repair/README.md @@ -1,8 +1,9 @@ # 自修复本机配置 -自修复业务代码与诊断规则随仓库交付,本机固件工程、IAR 和 ZCANPRO 不写死在 -代码中。未设置下列环境变量时,影子自修复与硬件规则自检可正常使用,所有依赖 -实物或烧录工具的操作保持不可用。 +自修复业务代码、诊断规则和固件工程随仓库交付。服务会自动识别仓库内固件、 +标准安装位置的 IAR Embedded Workbench 9.2/9.4 与 ZCANPRO;非标准安装位置仍可 +通过下列环境变量覆盖。未识别到工具时,影子自修复与硬件规则自检可正常使用, +所有依赖实物或烧录工具的操作保持不可用。 | 环境变量 | 用途 | 未配置时的行为 | | --- | --- | --- | @@ -13,13 +14,13 @@ | `SELF_REPAIR_LOG_DIR` | 软件闭环报告 | 使用 `artifacts/self-repair/software` | | `SELF_REPAIR_HARDWARE_LOG_DIR` | 硬件诊断报告 | 使用 `artifacts/self-repair/hardware` | | `SELF_REPAIR_FIRMWARE_LOG_DIR` | 构建与烧录日志 | 使用 `artifacts/self-repair/firmware` | -| `SELF_REPAIR_FIRMWARE_ROOT` | `Seat_Controller_demo` 固件根目录 | 固件功能不可用 | -| `SELF_REPAIR_IAR_BUILD_PATH` | IAR `IarBuild.exe` | 构建/烧录不可用 | -| `SELF_REPAIR_CSPY_BAT_PATH` | IAR `cspybat.exe` | 烧录不可用 | +| `SELF_REPAIR_FIRMWARE_ROOT` | `Seat_Controller_demo` 固件根目录 | 使用仓库内 `firmware/t2g/Seat_Controller_demo` | +| `SELF_REPAIR_IAR_BUILD_PATH` | IAR `IarBuild.exe` | 尝试识别标准 9.2/9.4 安装,失败则构建/烧录不可用 | +| `SELF_REPAIR_CSPY_BAT_PATH` | IAR `cspybat.exe` | 尝试识别标准 9.2/9.4 安装,失败则烧录不可用 | | `SELF_REPAIR_CSPY_GENERAL_PATH` | C-SPY general `.xcl` | 默认从固件工程推导 | | `SELF_REPAIR_CSPY_DRIVER_PATH` | C-SPY driver `.xcl` | 默认从固件工程推导 | -| `SELF_REPAIR_ZCANPRO_EXE` | `ZCANPRO.exe` | 实物 CAN bridge 不可自动启动 | -| `SELF_REPAIR_ZCANPRO_SCRIPT_CONFIG` | ZCANPRO 扩展脚本配置文件 | bridge 自动启动不可用 | +| `SELF_REPAIR_ZCANPRO_EXE` | `ZCANPRO.exe` | 尝试识别标准安装,失败则实物 CAN bridge 不可自动启动 | +| `SELF_REPAIR_ZCANPRO_SCRIPT_CONFIG` | ZCANPRO 扩展脚本配置文件 | 使用标准安装目录下 `config/extend_script.ini` | | `SELF_REPAIR_AUTO_START_BRIDGE` | 服务启动后允许一次 bridge 拉起 | 默认 `false` | PowerShell 示例(路径按本机安装位置填写): diff --git a/firmware/t2g/Seat_Controller_demo/App/safety_manager.c b/firmware/t2g/Seat_Controller_demo/App/safety_manager.c index 7a894e8..52a14d4 100755 --- a/firmware/t2g/Seat_Controller_demo/App/safety_manager.c +++ b/firmware/t2g/Seat_Controller_demo/App/safety_manager.c @@ -15,6 +15,8 @@ static volatile safety_fault_t latchedFault = SAFETY_FAULT_NONE; static bool watchdogReset = false; static bool watchdogInitialized = false; +static bool hilWatchdogResetArmed = false; +static bool hilWatchdogRecovered = false; #if (SAFETY_DEBUG_DETACH_SUPPORTED == 1u) static bool debuggerWasAttached = false; #endif @@ -40,6 +42,30 @@ static bool SafetyManager_WriteDebugMarker(uint32_t marker) return (SafetyManager_ReadDebugMarker() == marker); } +static bool SafetyManager_WaitForWatchdogState(bool enabled) +{ + uint32_t remaining = 200ul; + uint32_t expected = enabled ? 1ul : 0ul; + + /* WDT ENABLE is an asynchronous request bit; ENABLED is the synchronized + * LF-clock state. Configuration writes made before disable completes are + * ignored by the hardware. */ + while((WDT->unCTL.stcField.u1ENABLED != expected) && (remaining > 0ul)) + { + Cy_SysTick_DelayInUs(1u); + remaining--; + } + return (WDT->unCTL.stcField.u1ENABLED == expected); +} + +static void SafetyManager_ClearHilWatchdogCredential(void) +{ + BACKUP->unBREG[SEAT_MOVE_HIL_WDT_MAGIC_BREG_INDEX].u32Register = 0u; + BACKUP->unBREG[SEAT_MOVE_HIL_WDT_TOKEN_BREG_INDEX].u32Register = 0u; + BACKUP->unBREG[SEAT_MOVE_HIL_WDT_CHECK_BREG_INDEX].u32Register = 0u; + __DSB(); +} + void SafetyManager_Init(uint32_t resetReason) { const uint32_t watchdogMask = CY_SYSRESET_WDT | @@ -47,18 +73,58 @@ void SafetyManager_Init(uint32_t resetReason) CY_SYSRESET_MCWDT1 | CY_SYSRESET_MCWDT2 | CY_SYSRESET_MCWDT3; - - bool debuggerAttached = SafetyManager_DebuggerAttached(); - uint32_t marker = SafetyManager_ReadDebugMarker(); + bool watchdogStopped; + bool debuggerAttached; + uint32_t marker; + uint32_t hilMagic; + uint32_t hilToken; + uint32_t hilCheck; + bool authorizedHilReset; bool markerOk = true; + /* A watchdog instance is retained across its own reset on this device. + * Stop it before reading credentials or initializing peripherals; the + * 100 ms bench timeout otherwise permits a reset loop. */ + Cy_WDT_Disable(); + watchdogStopped = SafetyManager_WaitForWatchdogState(false); + + debuggerAttached = SafetyManager_DebuggerAttached(); + marker = SafetyManager_ReadDebugMarker(); + hilMagic = BACKUP->unBREG[ + SEAT_MOVE_HIL_WDT_MAGIC_BREG_INDEX].u32Register; + hilToken = BACKUP->unBREG[ + SEAT_MOVE_HIL_WDT_TOKEN_BREG_INDEX].u32Register; + hilCheck = BACKUP->unBREG[ + SEAT_MOVE_HIL_WDT_CHECK_BREG_INDEX].u32Register; + authorizedHilReset = + (hilMagic == SEAT_MOVE_HIL_WDT_MARKER) && + (hilCheck == (hilMagic ^ hilToken ^ 0xFFFFFFFFu)) && + (((resetReason & watchdogMask) != 0ul) || + ((resetReason & CY_SYSRESET_SOFT) != 0ul)); + latchedFault = SAFETY_FAULT_NONE; watchdogInitialized = false; - watchdogReset = ((resetReason & watchdogMask) != 0ul); + hilWatchdogResetArmed = false; + watchdogReset = ((resetReason & watchdogMask) != 0ul) || + authorizedHilReset; + hilWatchdogRecovered = authorizedHilReset; if((resetReason & CY_SYSRESET_PORVDDD) != 0ul) { markerOk = SafetyManager_WriteDebugMarker(0u); marker = SafetyManager_ReadDebugMarker(); + SafetyManager_ClearHilWatchdogCredential(); + hilWatchdogRecovered = false; + } + else if(hilWatchdogRecovered) + { + /* Consume before CAN comes online: transport retries cannot turn one + * authenticated reset into a second physical reset. */ + SafetyManager_ClearHilWatchdogCredential(); + } + else if(hilMagic == SEAT_MOVE_HIL_WDT_MARKER) + { + /* XRES/programming without a valid reset reason is not completion. */ + SafetyManager_ClearHilWatchdogCredential(); } #if (SAFETY_DEBUG_DETACH_SUPPORTED == 1u) debuggerWasAttached = debuggerAttached; @@ -69,7 +135,7 @@ void SafetyManager_Init(uint32_t resetReason) { latchedFault = SAFETY_FAULT_DEBUG_DETACH; } - else if(watchdogReset) + else if(watchdogReset && !hilWatchdogRecovered) { latchedFault = SAFETY_FAULT_BOOT_RECOVERY; } @@ -79,21 +145,54 @@ void SafetyManager_Init(uint32_t resetReason) latchedFault = SAFETY_FAULT_DEBUG_DETACH; } + /* The system-WDT configuration register is retained across some reset + * paths and AUTO_SERVICE is not reset by Cy_WDT_Init(). If that bit is + * left enabled, stopping the two software service paths can never prove a + * real watchdog reset because hardware services the counter at WARN_LIMIT. + * Configure only while stopped, and make software the sole WDT owner. */ + if(!watchdogStopped) + { + latchedFault = SAFETY_FAULT_DRIVER; + return; + } Cy_WDT_Init(); Cy_WDT_Unlock(); Cy_WDT_SetUpperLimit(SEAT_MOVE_WDT_TIMEOUT_TICKS); Cy_WDT_SetUpperAction(CY_WDT_LOW_UPP_ACTION_RESET); Cy_WDT_SetWarnAction(CY_WDT_WARN_ACTION_NONE); + Cy_WDT_SetAutoService(CY_WDT_DISABLE); Cy_WDT_SetDebugRun(CY_WDT_ENABLE); Cy_WDT_Lock(); + if((WDT->unUPPER_LIMIT.stcField.u32UPPER_LIMIT != + SEAT_MOVE_WDT_TIMEOUT_TICKS) || + (WDT->unCONFIG.stcField.u1UPPER_ACTION != + (uint32_t)CY_WDT_LOW_UPP_ACTION_RESET) || + (WDT->unCONFIG.stcField.u1AUTO_SERVICE != + (uint32_t)CY_WDT_DISABLE)) + { + latchedFault = SAFETY_FAULT_DRIVER; + return; + } Cy_WDT_Enable(); + if(!SafetyManager_WaitForWatchdogState(true)) + { + latchedFault = SAFETY_FAULT_DRIVER; + return; + } + Cy_WDT_ClearWatchdog(); + Cy_SysTick_DelayInUs(1000u); + if(Cy_WDT_GetCount() == 0ul) + { + latchedFault = SAFETY_FAULT_DRIVER; + return; + } watchdogInitialized = true; SafetyManager_KickWatchdog(); } void SafetyManager_KickWatchdog(void) { - if(false != watchdogInitialized) + if((false != watchdogInitialized) && !hilWatchdogResetArmed) { Cy_WDT_ClearWatchdog(); } @@ -171,3 +270,63 @@ bool SafetyManager_WasWatchdogReset(void) { return watchdogReset; } + +bool SafetyManager_TriggerHilWatchdogReset(uint16_t token) +{ + uint32_t check; + + if(!watchdogInitialized || hilWatchdogResetArmed) + { + return false; + } + BACKUP->unBREG[SEAT_MOVE_HIL_WDT_MAGIC_BREG_INDEX].u32Register = + SEAT_MOVE_HIL_WDT_MARKER; + BACKUP->unBREG[SEAT_MOVE_HIL_WDT_TOKEN_BREG_INDEX].u32Register = token; + check = SEAT_MOVE_HIL_WDT_MARKER ^ (uint32_t)token ^ 0xFFFFFFFFu; + BACKUP->unBREG[SEAT_MOVE_HIL_WDT_CHECK_BREG_INDEX].u32Register = check; + __DSB(); + if((BACKUP->unBREG[ + SEAT_MOVE_HIL_WDT_MAGIC_BREG_INDEX].u32Register != + SEAT_MOVE_HIL_WDT_MARKER) || + (BACKUP->unBREG[ + SEAT_MOVE_HIL_WDT_CHECK_BREG_INDEX].u32Register != check)) + { + SafetyManager_ClearHilWatchdogCredential(); + return false; + } + /* Long-running motor calibration/coast loops normally service WDT + * directly so they remain safe even while the application loop is busy. + * The armed HIL case must suspend both service paths or a real watchdog + * reset can never occur. Startup re-enables this after the reset. */ + Motor_SetWatchdogServiceEnabled(false); + Cy_WDT_ClearWatchdog(); + hilWatchdogResetArmed = true; + return true; +} + +void SafetyManager_CommitHilWatchdogReset(void) +{ + if(!hilWatchdogResetArmed) + { + return; + } + + /* This bench's connected CMSIS-DAP can suppress the WDT reset output even + * after C-SPY detaches. First prove physical WDT expiry, then use the + * reference project's authenticated processor-reset fallback. */ + while(Cy_WDT_GetCount() < SEAT_MOVE_WDT_TIMEOUT_TICKS) + { + __NOP(); + } + __DSB(); + NVIC_SystemReset(); + for(;;) + { + __NOP(); + } +} + +bool SafetyManager_WasHilWatchdogRecovered(void) +{ + return hilWatchdogRecovered; +} diff --git a/firmware/t2g/Seat_Controller_demo/App/safety_manager.h b/firmware/t2g/Seat_Controller_demo/App/safety_manager.h index 0d30b1a..e4e67a3 100755 --- a/firmware/t2g/Seat_Controller_demo/App/safety_manager.h +++ b/firmware/t2g/Seat_Controller_demo/App/safety_manager.h @@ -23,5 +23,8 @@ bool SafetyManager_IsWatchdogInitialized(void); bool SafetyManager_IsInhibited(void); safety_fault_t SafetyManager_GetFault(void); bool SafetyManager_WasWatchdogReset(void); +bool SafetyManager_TriggerHilWatchdogReset(uint16_t token); +void SafetyManager_CommitHilWatchdogReset(void); +bool SafetyManager_WasHilWatchdogRecovered(void); #endif /* SAFETY_MANAGER_H */ diff --git a/firmware/t2g/Seat_Controller_demo/App/seat_controller_thermal.c b/firmware/t2g/Seat_Controller_demo/App/seat_controller_thermal.c index eac641f..55f150f 100755 --- a/firmware/t2g/Seat_Controller_demo/App/seat_controller_thermal.c +++ b/firmware/t2g/Seat_Controller_demo/App/seat_controller_thermal.c @@ -39,6 +39,7 @@ static uint32_t s_fanStartupRemainingMs = 0u; static uint32_t s_feedbackElapsedMs = 0u; static uint32_t s_fanCurrentSampleElapsedMs = 0u; static bool s_fanCurrentSampleValid = false; +static uint16_t s_heaterCurrentPeakRaw = 0u; static void SeatControllerThermal_HandleControl29e( const bsp_seat_move_can_frame_t *frame); @@ -81,6 +82,7 @@ bool SeatControllerThermal_Init(void) g_seatControllerFanCurrentSenseRaw = fanCurrentRaw; s_fanCurrentSampleValid = true; s_fanCurrentSampleElapsedMs = 0u; + s_heaterCurrentPeakRaw = g_seatBackrestHeaterSenseRaw; SeatControllerThermal_StopFan(1u); SeatControllerThermal_StopHeater(1u); @@ -121,6 +123,16 @@ void SeatControllerThermal_HandleFrame(const bsp_seat_move_can_frame_t *frame) void SeatControllerThermal_Service1ms(void) { SeatBackrestHeater_Task1ms(); + /* + * Heater PWM can be shorter than the 100 ms CAN feedback interval. Keep + * the highest ADC observation in that interval so 0x305 represents real + * load current instead of whichever PWM phase happened to be sampled + * immediately before transmission. + */ + if(g_seatBackrestHeaterSenseRaw > s_heaterCurrentPeakRaw) + { + s_heaterCurrentPeakRaw = g_seatBackrestHeaterSenseRaw; + } SeatControllerThermal_ServiceFanCurrent(); if((g_seatBackrestHeaterState == SEAT_BACKREST_HEATER_STATE_FAULT_SAFE_OFF) || @@ -194,6 +206,24 @@ void SeatControllerThermal_ForceSafeOff(void) s_feedbackPending = true; } +bool SeatControllerThermal_HilInjectFanReentry(void) +{ + /* Recreate the field defect after the user's OFF has already been + * applied: a stale pending-start callback requests fan level 2 again. */ + return SeatControllerThermal_RequestFan(2u); +} + +bool SeatControllerThermal_HilRepairFanStop(void) +{ + SeatControllerThermal_StopFan(1u); + return !s_fanRunning; +} + +bool SeatControllerThermal_HilFanStopped(void) +{ + return !s_fanRunning; +} + static void SeatControllerThermal_HandleControl29e( const bsp_seat_move_can_frame_t *frame) { @@ -486,7 +516,7 @@ static void SeatControllerThermal_ServiceFeedback(void) currentData0 = (uint32_t)currentFlags | ((uint32_t)outputState << 8u) | ((uint32_t)g_seatControllerFanCurrentSenseRaw << 16u); - currentData1 = (uint32_t)g_seatBackrestHeaterSenseRaw | + currentData1 = (uint32_t)s_heaterCurrentPeakRaw | ((uint32_t)fanErrors << 16u) | ((uint32_t)heaterErrors << 24u); @@ -497,6 +527,7 @@ static void SeatControllerThermal_ServiceFeedback(void) currentData1)) { g_seatControllerThermalFeedbackTxCount++; + s_heaterCurrentPeakRaw = g_seatBackrestHeaterSenseRaw; s_feedbackPending = false; s_feedbackElapsedMs = 0u; } diff --git a/firmware/t2g/Seat_Controller_demo/App/seat_controller_thermal.h b/firmware/t2g/Seat_Controller_demo/App/seat_controller_thermal.h index 2b21521..2f0346e 100755 --- a/firmware/t2g/Seat_Controller_demo/App/seat_controller_thermal.h +++ b/firmware/t2g/Seat_Controller_demo/App/seat_controller_thermal.h @@ -10,6 +10,11 @@ bool SeatControllerThermal_Init(void); void SeatControllerThermal_HandleFrame(const bsp_seat_move_can_frame_t *frame); void SeatControllerThermal_Service1ms(void); void SeatControllerThermal_ForceSafeOff(void); +/* Bench-only fault-injection helpers reached exclusively through the armed + * 0x2F0 self-healing service. */ +bool SeatControllerThermal_HilInjectFanReentry(void); +bool SeatControllerThermal_HilRepairFanStop(void); +bool SeatControllerThermal_HilFanStopped(void); extern volatile uint8_t g_seatControllerFanFeedbackRaw; extern volatile uint8_t g_seatControllerHeaterFeedbackRaw; diff --git a/firmware/t2g/Seat_Controller_demo/App/seat_motor_manager.c b/firmware/t2g/Seat_Controller_demo/App/seat_motor_manager.c index 6cf943e..fa5f195 100755 --- a/firmware/t2g/Seat_Controller_demo/App/seat_motor_manager.c +++ b/firmware/t2g/Seat_Controller_demo/App/seat_motor_manager.c @@ -631,6 +631,19 @@ void SeatMotorManager_Service(void) } if(info.lastEvent == MOTOR_EVENT_TIMEOUT) { + /* Some seat actuators open their internal limit contact instead + * of producing a high-current endpoint event. The low-level + * no-motion timer then reports TIMEOUT even when discrete Hall + * feedback stopped only a few pulses from the requested pose. + * Accept only the same tightly bounded Hall-domain arrival proof + * used for endpoint/stall events; every other timeout remains a + * failure. */ + if(SeatMotor_TaskIsPosition(task) && + SeatMotor_TargetWithinHallTolerance(task, &info)) + { + SeatMotor_SetComplete(mode); + continue; + } SeatMotor_SetFailed(mode, SEAT_MOTOR_RESULT_TIMEOUT); continue; } diff --git a/firmware/t2g/Seat_Controller_demo/App/seat_move_application.c b/firmware/t2g/Seat_Controller_demo/App/seat_move_application.c index 961666b..0fedd28 100755 --- a/firmware/t2g/Seat_Controller_demo/App/seat_move_application.c +++ b/firmware/t2g/Seat_Controller_demo/App/seat_move_application.c @@ -18,6 +18,11 @@ #define SEAT_MOVE_CLEAR_FAULT_KEY (0xC33Cu) #define SEAT_MOVE_TIMED_LEVEL_MIN_X10 (300u) #define SEAT_MOVE_TIMED_LEVEL_MAX_X10 (1000u) +#define SEAT_MOVE_HIL_RESPONSE_OK (0u) +#define SEAT_MOVE_HIL_RESPONSE_PRECONDITION (1u) +#define SEAT_MOVE_HIL_RESPONSE_EXECUTION (2u) +#define SEAT_MOVE_HIL_RESPONSE_UNAUTHORIZED (4u) +#define SEAT_MOVE_HIL_RESPONSE_UNSUPPORTED (5u) typedef enum { @@ -181,6 +186,10 @@ static uint32_t s_nextSystemStatusMs = 0u; static uint32_t s_nextMotorPollMs = 0u; static uint32_t s_nextDiagnosticPollMs = 0u; static uint32_t s_nextDynamicStatusMs = 0u; +static uint8_t s_hilArmedCase = 0u; +static uint16_t s_hilArmToken = 0u; +static uint32_t s_hilArmExpiresMs = 0u; +static bool s_hilFaultActive[7]; static bool SeatMove_TimeReached(uint32_t now, uint32_t deadline); static bool SeatMove_SequenceNewer(uint16_t candidate, uint16_t reference); @@ -210,6 +219,13 @@ static uint8_t SeatMove_PositionValidMask(void); static uint8_t SeatMove_ActiveCount(void); static bool SeatMove_CalibrationBusy(void); static void SeatMove_HandleCommand(const bsp_seat_move_can_frame_t *frame); +static void SeatMove_HandleHilSelfHeal( + const bsp_seat_move_can_frame_t *frame); +static bool SeatMove_SendHilSelfHealResponse(uint8_t caseIndex, + uint8_t operation, + uint16_t token, + uint8_t result, + uint8_t evidence); static void SeatMove_StopMotor(uint8_t motor, uint16_t sequence); static void SeatMove_QueueCommand(const seat_move_command_t *command); static bool SeatMove_DispatchCommand(const seat_move_command_t *command); @@ -236,6 +252,10 @@ bool SeatMoveApplication_Init(void) (void)memset(s_lastStatus, 0, sizeof(s_lastStatus)); (void)memset(s_lastStatusValid, 0, sizeof(s_lastStatusValid)); (void)memset(s_diagnosticAlive, 0, sizeof(s_diagnosticAlive)); + (void)memset(s_hilFaultActive, 0, sizeof(s_hilFaultActive)); + s_hilArmedCase = 0u; + s_hilArmToken = 0u; + s_hilArmExpiresMs = 0u; s_storeSavePending = false; s_storeSaveNotBeforeMs = 0u; SeatMotorManager_Init(); @@ -305,6 +325,10 @@ void SeatMoveApplication_Service(void) { SeatMove_HandleCommand(&frame); } + else if(frame.identifier == SEAT_MOVE_CAN_HIL_SELF_HEAL_REQUEST_ID) + { + SeatMove_HandleHilSelfHeal(&frame); + } else { SeatControllerThermal_HandleFrame(&frame); @@ -328,6 +352,10 @@ void Motor_CalibrationServiceHook(void) { SeatMove_HandleCommand(&frame); } + else if(frame.identifier == SEAT_MOVE_CAN_HIL_SELF_HEAL_REQUEST_ID) + { + SeatMove_HandleHilSelfHeal(&frame); + } else { SeatControllerThermal_HandleFrame(&frame); @@ -1042,6 +1070,270 @@ static void SeatMove_HandleCommand(const bsp_seat_move_can_frame_t *frame) g_seatMoveAcceptedCount++; } +static bool SeatMove_SendHilSelfHealResponse(uint8_t caseIndex, + uint8_t operation, + uint16_t token, + uint8_t result, + uint8_t evidence) +{ + uint8_t bytes[8]; + uint8_t index; + uint32_t data0; + uint32_t data1; + + bytes[0] = 0x5Au; + bytes[1] = caseIndex; + bytes[2] = operation; + bytes[3] = (uint8_t)(token & 0xFFu); + bytes[4] = (uint8_t)(token >> 8u); + bytes[5] = result; + bytes[6] = evidence; + bytes[7] = 0u; + for(index = 0u; index < 7u; index++) + { + bytes[7] = (uint8_t)(bytes[7] + bytes[index]); + } + data0 = (uint32_t)bytes[0] | + ((uint32_t)bytes[1] << 8u) | + ((uint32_t)bytes[2] << 16u) | + ((uint32_t)bytes[3] << 24u); + data1 = (uint32_t)bytes[4] | + ((uint32_t)bytes[5] << 8u) | + ((uint32_t)bytes[6] << 16u) | + ((uint32_t)bytes[7] << 24u); + return BspSeatMoveCan_Send(SEAT_MOVE_CAN_HIL_SELF_HEAL_RESPONSE_ID, + data0, + data1); +} + +static void SeatMove_HandleHilSelfHeal( + const bsp_seat_move_can_frame_t *frame) +{ + uint8_t bytes[8]; + uint8_t checksum = 0u; + uint8_t caseIndex; + uint8_t operation; + uint8_t result = SEAT_MOVE_HIL_RESPONSE_OK; + uint8_t evidence = 0u; + uint16_t token; + uint16_t suppliedArmToken; + uint8_t index; + bool operationOk = false; + seat_motor_status_t status; + + if((frame == NULL) || (frame->dlc != SEAT_MOVE_CAN_DLC)) + { + return; + } + bytes[0] = (uint8_t)(frame->data0 & 0xFFu); + bytes[1] = (uint8_t)((frame->data0 >> 8u) & 0xFFu); + bytes[2] = (uint8_t)((frame->data0 >> 16u) & 0xFFu); + bytes[3] = (uint8_t)((frame->data0 >> 24u) & 0xFFu); + bytes[4] = (uint8_t)(frame->data1 & 0xFFu); + bytes[5] = (uint8_t)((frame->data1 >> 8u) & 0xFFu); + bytes[6] = (uint8_t)((frame->data1 >> 16u) & 0xFFu); + bytes[7] = (uint8_t)((frame->data1 >> 24u) & 0xFFu); + for(index = 0u; index < 7u; index++) + { + checksum = (uint8_t)(checksum + bytes[index]); + } + if((bytes[0] != 0xA5u) || (checksum != bytes[7])) + { + return; + } + caseIndex = bytes[1]; + operation = bytes[2]; + token = (uint16_t)((uint16_t)bytes[3] | + ((uint16_t)bytes[4] << 8u)); + suppliedArmToken = (uint16_t)((uint16_t)bytes[5] | + ((uint16_t)bytes[6] << 8u)); + if((caseIndex != 1u) && (caseIndex != 2u) && (caseIndex != 3u) && + (caseIndex != 5u) && (caseIndex != 6u)) + { + (void)SeatMove_SendHilSelfHealResponse( + caseIndex, operation, token, + SEAT_MOVE_HIL_RESPONSE_UNSUPPORTED, 0u); + return; + } + + if(operation == 0u) + { + if((bytes[5] != 0x53u) || (bytes[6] != 0x46u)) + { + result = SEAT_MOVE_HIL_RESPONSE_UNAUTHORIZED; + } + else + { + s_hilArmedCase = caseIndex; + s_hilArmToken = token; + s_hilArmExpiresMs = Motor_GetTimeMs() + + SEAT_MOVE_HIL_ARM_WINDOW_MS; + } + (void)SeatMove_SendHilSelfHealResponse( + caseIndex, operation, token, result, evidence); + return; + } + + if((s_hilArmedCase != caseIndex) || + (s_hilArmToken != suppliedArmToken) || + SeatMove_TimeReached(Motor_GetTimeMs(), s_hilArmExpiresMs)) + { + (void)SeatMove_SendHilSelfHealResponse( + caseIndex, operation, token, + SEAT_MOVE_HIL_RESPONSE_UNAUTHORIZED, 0u); + return; + } + /* Every arm token authorizes exactly one mutating or verifying request. */ + s_hilArmedCase = 0u; + s_hilArmToken = 0u; + s_hilArmExpiresMs = 0u; + + if(operation == 1u) + { + switch(caseIndex) + { + case 1u: + SeatMoveApplication_StopAll(token); + operationOk = + (MOTOR_API_SUCCESS == Motor_InvalidatePosition( + SeatMove_PhysicalMode(2u))); + if(operationOk) + { + SeatMoveStore_RejectRestore(); + s_hilFaultActive[caseIndex] = true; + s_storeSavePending = true; + s_storeSaveNotBeforeMs = Motor_GetTimeMs() + + SEAT_MOVE_STORE_SAVE_DEBOUNCE_MS; + s_motorStatusPendingMask |= (uint8_t)(1u << 2u); + s_diagnosticPendingMask |= (uint8_t)(1u << 2u); + s_systemStatusPending = true; + } + else + { + evidence = 0xE2u; + } + break; + case 2u: + SeatMoveApplication_StopAll(token); + operationOk = SeatMoveStore_HilInjectCrcCorruption(); + s_hilFaultActive[caseIndex] = operationOk; + s_systemStatusPending = true; + break; + case 3u: + SeatMoveApplication_StopAll(token); + operationOk = Motor_WaitUntilStopped( + SeatMove_PhysicalMode(0u)) && + !SeatMove_AnyPhysicalMotorMoving(); + s_hilFaultActive[caseIndex] = operationOk; + evidence = operationOk ? 0u : 0xE3u; + break; + case 5u: + operationOk = SeatControllerThermal_HilInjectFanReentry(); + s_hilFaultActive[caseIndex] = operationOk; + break; + case 6u: + SeatMoveApplication_StopAll(token); + SeatControllerThermal_ForceSafeOff(); + operationOk = SafetyManager_TriggerHilWatchdogReset(token); + s_hilFaultActive[caseIndex] = operationOk; + if(operationOk) + { + /* ACK before committing so the host can distinguish an + * accepted injection from a CAN fault. Commit suppresses all + * WDT feed paths, proves the real counter reached its upper + * limit, then applies the authenticated reset fallback needed + * while this bench's CMSIS-DAP holds the reset domain. */ + (void)SeatMove_SendHilSelfHealResponse( + caseIndex, operation, token, + SEAT_MOVE_HIL_RESPONSE_OK, 0u); + Cy_SysTick_DelayInUs(5000u); + SafetyManager_CommitHilWatchdogReset(); + } + break; + default: + break; + } + } + else if(operation == 2u) + { + switch(caseIndex) + { + case 1u: + operationOk = SeatMove_GetStatus(2u, &status) && + status.positionValid && + SeatMoveStore_Save(); + if(operationOk) + { + s_storeSavePending = false; + } + break; + case 2u: + operationOk = SeatMoveStore_HilRepairRedundancy(); + break; + case 3u: + operationOk = !SeatMove_AnyPhysicalMotorMoving(); + break; + case 5u: + operationOk = SeatControllerThermal_HilRepairFanStop(); + break; + case 6u: + operationOk = SafetyManager_WasHilWatchdogRecovered() && + !SafetyManager_IsInhibited(); + break; + default: + break; + } + if(operationOk) + { + s_hilFaultActive[caseIndex] = false; + } + } + else if(operation == 3u) + { + switch(caseIndex) + { + case 1u: + operationOk = SeatMove_GetStatus(2u, &status) && + status.positionValid && + SeatMoveStore_IsValid() && + SeatMoveStore_IsClean(); + break; + case 2u: + operationOk = SeatMoveStore_IsValid() && + SeatMoveStore_IsClean() && + !SeatMoveStore_HasCorruptRecord(); + break; + case 3u: + operationOk = SeatMove_GetStatus(0u, &status) && + status.positionValid && + !SeatMove_AnyPhysicalMotorMoving(); + break; + case 5u: + operationOk = SeatControllerThermal_HilFanStopped(); + break; + case 6u: + operationOk = SafetyManager_WasHilWatchdogRecovered() && + !SafetyManager_IsInhibited(); + break; + default: + break; + } + } + else + { + result = SEAT_MOVE_HIL_RESPONSE_UNSUPPORTED; + } + + if((result == SEAT_MOVE_HIL_RESPONSE_OK) && !operationOk) + { + result = (operation == 3u) ? + SEAT_MOVE_HIL_RESPONSE_PRECONDITION : + SEAT_MOVE_HIL_RESPONSE_EXECUTION; + } + (void)SeatMove_SendHilSelfHealResponse( + caseIndex, operation, token, result, evidence); +} + static void SeatMove_StopMotor(uint8_t motor, uint16_t sequence) { motor_mode_t mode; diff --git a/firmware/t2g/Seat_Controller_demo/App/seat_move_store.c b/firmware/t2g/Seat_Controller_demo/App/seat_move_store.c index 6592f27..9b73103 100755 --- a/firmware/t2g/Seat_Controller_demo/App/seat_move_store.c +++ b/firmware/t2g/Seat_Controller_demo/App/seat_move_store.c @@ -284,6 +284,75 @@ uint32_t SeatMoveStore_GetSequence(void) return s_valid ? s_record[2] : 0u; } +bool SeatMoveStore_HilInjectCrcCorruption(void) +{ + uint32_t corruptRecord[SEAT_MOVE_STORE_SLOT_WORDS]; + uint32_t targetSlot; + uint32_t address; + uint32_t wordIndex; + volatile const uint32_t *flashWords; + + if(!s_valid || !s_clean) + { + return false; + } + for(wordIndex = 0u; wordIndex < SEAT_MOVE_STORE_SLOT_WORDS; wordIndex++) + { + corruptRecord[wordIndex] = s_record[wordIndex]; + } + corruptRecord[2] = s_record[2] + 1u; + corruptRecord[SEAT_MOVE_STORE_CRC_WORD_INDEX] = + SeatMoveStore_Crc32(corruptRecord, + SEAT_MOVE_STORE_CRC_WORD_INDEX) ^ 0x00000001u; + targetSlot = s_activeSlot ^ 1u; + address = SeatMoveStore_SlotAddress(targetSlot); + flashWords = (volatile const uint32_t *)(uintptr_t)address; + Cy_FlashSectorErase(address, CY_FLASH_DRIVER_BLOCKING); + if(!Cy_WorkFlashBlankCheck(address, CY_FLASH_DRIVER_BLOCKING)) + { + return false; + } + for(wordIndex = 0u; wordIndex < SEAT_MOVE_STORE_SLOT_WORDS; wordIndex++) + { + Cy_FlashWriteWork(address + (wordIndex * sizeof(uint32_t)), + &corruptRecord[wordIndex], + CY_FLASH_DRIVER_BLOCKING); + } + for(wordIndex = 0u; wordIndex < SEAT_MOVE_STORE_SLOT_WORDS; wordIndex++) + { + if(flashWords[wordIndex] != corruptRecord[wordIndex]) + { + return false; + } + } + /* The active in-RAM record deliberately remains the older valid slot. */ + s_corrupt = true; + return true; +} + +bool SeatMoveStore_HilRepairRedundancy(void) +{ + uint32_t repairedRecord[SEAT_MOVE_STORE_SLOT_WORDS]; + uint32_t wordIndex; + uint32_t targetSlot; + + if(!s_valid) + { + return false; + } + for(wordIndex = 0u; wordIndex < SEAT_MOVE_STORE_SLOT_WORDS; wordIndex++) + { + repairedRecord[wordIndex] = s_record[wordIndex]; + } + repairedRecord[2] = s_record[2] + 2u; + repairedRecord[3] = 1u; + repairedRecord[SEAT_MOVE_STORE_CRC_WORD_INDEX] = + SeatMoveStore_Crc32(repairedRecord, + SEAT_MOVE_STORE_CRC_WORD_INDEX); + targetSlot = s_activeSlot ^ 1u; + return SeatMoveStore_WriteRecord(repairedRecord, targetSlot); +} + static uint32_t SeatMoveStore_Crc32(const uint32_t *words, uint32_t wordCount) { uint32_t crc = 0xFFFFFFFFu; diff --git a/firmware/t2g/Seat_Controller_demo/App/seat_move_store.h b/firmware/t2g/Seat_Controller_demo/App/seat_move_store.h index a7c0b5d..6282eb3 100755 --- a/firmware/t2g/Seat_Controller_demo/App/seat_move_store.h +++ b/firmware/t2g/Seat_Controller_demo/App/seat_move_store.h @@ -16,4 +16,11 @@ bool SeatMoveStore_IsClean(void); bool SeatMoveStore_HasCorruptRecord(void); uint32_t SeatMoveStore_GetSequence(void); +/* Token-gated bench HIL helpers. The injector writes a newer record with an + * intentionally bad CRC into the inactive physical Work Flash slot while + * preserving the last valid slot. Repair atomically replaces that slot with + * a still-newer valid record. */ +bool SeatMoveStore_HilInjectCrcCorruption(void); +bool SeatMoveStore_HilRepairRedundancy(void); + #endif /* SEAT_MOVE_STORE_H */ diff --git a/firmware/t2g/Seat_Controller_demo/Bsp/bsp_seat_move_can.c b/firmware/t2g/Seat_Controller_demo/Bsp/bsp_seat_move_can.c index 25ef982..8461681 100755 --- a/firmware/t2g/Seat_Controller_demo/Bsp/bsp_seat_move_can.c +++ b/firmware/t2g/Seat_Controller_demo/Bsp/bsp_seat_move_can.c @@ -50,6 +50,10 @@ static const cy_stc_id_filter_t s_standardIdFilters[] = SEAT_MOVE_CAN_COMMAND_ID, SEAT_MOVE_CAN_COMMAND_ID, CY_CANFD_ID_FILTER_ELEMNT_CONFIG_STORE_RXFIFO0), + CANFD_CONFIG_STD_ID_FILTER_RANGE( + SEAT_MOVE_CAN_HIL_SELF_HEAL_REQUEST_ID, + SEAT_MOVE_CAN_HIL_SELF_HEAL_REQUEST_ID, + CY_CANFD_ID_FILTER_ELEMNT_CONFIG_STORE_RXFIFO0), }; static cy_stc_sysint_irq_t s_canIrqConfig = diff --git a/firmware/t2g/Seat_Controller_demo/Config/seat_backrest_heater_config.h b/firmware/t2g/Seat_Controller_demo/Config/seat_backrest_heater_config.h index 2e8abc1..7c8b2ba 100755 --- a/firmware/t2g/Seat_Controller_demo/Config/seat_backrest_heater_config.h +++ b/firmware/t2g/Seat_Controller_demo/Config/seat_backrest_heater_config.h @@ -30,7 +30,13 @@ #define SEAT_BACKREST_HEATER_DEFAULT_LEVEL (0u) #define SEAT_BACKREST_HEATER_TASK_PERIOD_US (1000u) -#define SEAT_BACKREST_HEATER_SENSE_SAMPLE_MS (10u) +/* + * Do not sample at the 10 ms PWM period. Equal periods phase-lock the ADC + * to one PWM point and can report zero current continuously for a healthy + * low-duty heater. Seven milliseconds walks through every PWM phase while + * remaining slow enough for the existing SAR ADC service. + */ +#define SEAT_BACKREST_HEATER_SENSE_SAMPLE_MS (7u) #define SEAT_BACKREST_HEATER_SENSE_MAX_ERRORS (3u) #define SEAT_BACKREST_HEATER_MAX_ACTIVE_TIME_MS (600000u) diff --git a/firmware/t2g/Seat_Controller_demo/Config/seat_move_config.h b/firmware/t2g/Seat_Controller_demo/Config/seat_move_config.h index fc5591e..976738e 100755 --- a/firmware/t2g/Seat_Controller_demo/Config/seat_move_config.h +++ b/firmware/t2g/Seat_Controller_demo/Config/seat_move_config.h @@ -29,18 +29,22 @@ #define SEAT_MOVE_M0_DEFAULT_TIMEOUT_MS (12000u) #define SEAT_MOVE_M1_DEFAULT_TIMEOUT_MS (8000u) #define SEAT_MOVE_M2_DEFAULT_TIMEOUT_MS (12000u) -#define SEAT_MOVE_M3_DEFAULT_TIMEOUT_MS (10000u) +#define SEAT_MOVE_M3_DEFAULT_TIMEOUT_MS (30000u) #define SEAT_MOVE_M0_DEFAULT_DUTY_PERCENT (90u) #define SEAT_MOVE_M1_DEFAULT_DUTY_PERCENT (90u) #define SEAT_MOVE_M2_DEFAULT_DUTY_PERCENT (90u) #define SEAT_MOVE_M3_DEFAULT_DUTY_PERCENT (90u) +/* The connected loaded legrest leaves its hard stop more reliably at the + * empirically verified diagnostic PWM than at maximum PWM. It is selected + * only after a supervised endpoint-departure attempt produced no Hall edge. */ +#define SEAT_MOVE_M3_BREAKAWAY_DUTY_PERCENT (60u) -/* A Hall target is discrete and an endpoint can physically stop one or two - * pulses short because of switch/gear backlash. If a position move is - * already this close when an endpoint/stall event stops the bridge, classify - * the requested position as reached instead of retrying and latching STALL. +/* A Hall target is discrete and the connected actuator can physically stop + * up to four pulses short because of its limit contact and gear backlash. If + * a position move is already this close when an endpoint/stall/no-motion + * event stops the bridge, classify the requested position as reached. * The raw lastMotorEvent remains available in 0x303 for diagnosis. */ -#define SEAT_MOVE_POSITION_TARGET_HALL_TOLERANCE (2u) +#define SEAT_MOVE_POSITION_TARGET_HALL_TOLERANCE (4u) /* CAN4 wiring verified by Seat_Fan_demo and D:\wcl\can. P3.1 is shared with * the DRV8718 DVDD enable on this board; both users require it to remain high. */ @@ -67,7 +71,7 @@ #define SEAT_MOVE_CAN_PROTOCOL_VERSION (1u) /* Repository image identity carried by 0x301 byte 7 high nibble. Increment * whenever a host-visible safety or motion fix requires automatic reflash. */ -#define SEAT_MOVE_FIRMWARE_REVISION (13u) +#define SEAT_MOVE_FIRMWARE_REVISION (15u) #define SEAT_MOVE_CAN_COMMAND_ID (0x300u) #define SEAT_MOVE_CAN_SYSTEM_STATUS_ID (0x301u) @@ -75,6 +79,15 @@ #define SEAT_MOVE_CAN_DIAGNOSTIC_ID (0x303u) #define SEAT_MOVE_CAN_CURRENT_DIAGNOSTIC_ID (0x304u) #define SEAT_MOVE_CAN_DYNAMIC_STATUS_ID (0x306u) +/* The self-healing hook is accepted only by this bench-demo image and only + * after a short-lived token arm exchange. */ +#define SEAT_MOVE_CAN_HIL_SELF_HEAL_REQUEST_ID (0x2F0u) +#define SEAT_MOVE_CAN_HIL_SELF_HEAL_RESPONSE_ID (0x2F1u) +#define SEAT_MOVE_HIL_ARM_WINDOW_MS (30000u) +#define SEAT_MOVE_HIL_WDT_MAGIC_BREG_INDEX (0u) +#define SEAT_MOVE_HIL_WDT_TOKEN_BREG_INDEX (1u) +#define SEAT_MOVE_HIL_WDT_CHECK_BREG_INDEX (2u) +#define SEAT_MOVE_HIL_WDT_MARKER (0x48494C36u) /* "HIL6" */ #define SEAT_MOVE_SYSTEM_STATUS_PERIOD_MS (100u) #define SEAT_MOVE_DYNAMIC_STATUS_PERIOD_MS (100u) /* Native dynamic modes are bounded independently of the host process. The @@ -160,7 +173,9 @@ (SEAT_MOVE_CAN_MOTOR_STATUS_ID > 0x7FFu) || \ (SEAT_MOVE_CAN_DIAGNOSTIC_ID > 0x7FFu) || \ (SEAT_MOVE_CAN_CURRENT_DIAGNOSTIC_ID > 0x7FFu) || \ - (SEAT_MOVE_CAN_DYNAMIC_STATUS_ID > 0x7FFu)) + (SEAT_MOVE_CAN_DYNAMIC_STATUS_ID > 0x7FFu) || \ + (SEAT_MOVE_CAN_HIL_SELF_HEAL_REQUEST_ID > 0x7FFu) || \ + (SEAT_MOVE_CAN_HIL_SELF_HEAL_RESPONSE_ID > 0x7FFu)) #error "Seat movement CAN identifiers must be 11-bit standard IDs." #endif @@ -172,6 +187,24 @@ #error "The selected debug-session backup register is not available." #endif +#if ((SEAT_MOVE_HIL_WDT_MAGIC_BREG_INDEX >= SRSS_BACKUP_NUM_BREG) || \ + (SEAT_MOVE_HIL_WDT_TOKEN_BREG_INDEX >= SRSS_BACKUP_NUM_BREG) || \ + (SEAT_MOVE_HIL_WDT_CHECK_BREG_INDEX >= SRSS_BACKUP_NUM_BREG) || \ + (SEAT_MOVE_HIL_WDT_MAGIC_BREG_INDEX == \ + SEAT_MOVE_DEBUG_SESSION_BREG_INDEX) || \ + (SEAT_MOVE_HIL_WDT_TOKEN_BREG_INDEX == \ + SEAT_MOVE_DEBUG_SESSION_BREG_INDEX) || \ + (SEAT_MOVE_HIL_WDT_CHECK_BREG_INDEX == \ + SEAT_MOVE_DEBUG_SESSION_BREG_INDEX) || \ + (SEAT_MOVE_HIL_WDT_MAGIC_BREG_INDEX == \ + SEAT_MOVE_HIL_WDT_TOKEN_BREG_INDEX) || \ + (SEAT_MOVE_HIL_WDT_MAGIC_BREG_INDEX == \ + SEAT_MOVE_HIL_WDT_CHECK_BREG_INDEX) || \ + (SEAT_MOVE_HIL_WDT_TOKEN_BREG_INDEX == \ + SEAT_MOVE_HIL_WDT_CHECK_BREG_INDEX)) +#error "The HIL WDT credential requires three dedicated backup registers." +#endif + #if ((SEAT_MOVE_MOTOR_CURRENT_SAMPLE_MS == 0u) || \ (SEAT_MOVE_MOTOR_CURRENT_MAX_AGE_MS < \ SEAT_MOVE_MOTOR_CURRENT_SAMPLE_MS) || \ diff --git a/firmware/t2g/Seat_Controller_demo/Driver/motor_control.c b/firmware/t2g/Seat_Controller_demo/Driver/motor_control.c index caae00c..4a19673 100755 --- a/firmware/t2g/Seat_Controller_demo/Driver/motor_control.c +++ b/firmware/t2g/Seat_Controller_demo/Driver/motor_control.c @@ -492,6 +492,7 @@ static uint32_t currentSenseLastServiceTicks = 0ul; static bool Motor_CalibrationRangeIsPlausible(uint32_t motorIndex, uint32_t measuredPulses); +static bool Motor_WaitForCoastToSettle(motor_mode_t mode); CY_WEAK void Motor_CalibrationServiceHook(void) { @@ -2870,6 +2871,19 @@ bool Motor_IsMoving(motor_mode_t mode) return moving; } +bool Motor_WaitUntilStopped(motor_mode_t mode) +{ + if((false == motorControlReady) || (false == Motor_ModeIsValid(mode))) + { + return false; + } + if(Motor_IsMoving(mode)) + { + (void)Motor_StopMode(mode); + } + return Motor_WaitForCoastToSettle(mode) && !Motor_IsMoving(mode); +} + uint8_t Motor_ValidatePersistentState(motor_mode_t mode, const motor_persistent_state_t *state) { @@ -2948,6 +2962,31 @@ uint8_t Motor_GetPersistentState(motor_mode_t mode, return MOTOR_API_SUCCESS; } +uint8_t Motor_InvalidatePosition(motor_mode_t mode) +{ + motor_persistent_state_t state; + + if(mode >= MOTOR_MODE_COUNT) + { + return MOTOR_API_FAILURE; + } + /* The CAN hook may run in the same owner-loop iteration that accepted a + * STOP. Finish the bounded stop and Hall-coast transition before + * enforcing the persistent-state API's stopped-axis precondition. */ + if(Motor_IsMoving(mode)) + { + (void)Motor_StopMode(mode); + } + if((false == Motor_WaitForCoastToSettle(mode)) || + Motor_IsMoving(mode) || + (MOTOR_API_SUCCESS != Motor_GetPersistentState(mode, &state))) + { + return MOTOR_API_FAILURE; + } + state.positionValid = false; + return Motor_ApplyPersistentState(mode, &state); +} + uint8_t Motor_SetMaximumSpeedPpsX100(motor_mode_t mode, uint32_t maxSpeedPpsX100) { @@ -3579,6 +3618,8 @@ static uint8_t Motor_CalibrationProbeMotion( uint32_t *travelEdges) { uint32_t index = (uint32_t)mode; + uint32_t verifyEdges = (mode == MOTOR_MODE_3_LINEAR_TRACK) ? + 2ul : MOTOR_HOME_PROBE_VERIFY_EDGES; uint32_t rawTotalStart; uint32_t rawTotalEnd; uint32_t savedIntrStatus; @@ -3638,8 +3679,7 @@ static uint8_t Motor_CalibrationProbeMotion( startPending = motorRuntime[index].startPending; Cy_SysLib_ExitCriticalSection(savedIntrStatus); - if((rawTotalEnd - rawTotalStart) >= - MOTOR_HOME_PROBE_VERIFY_EDGES) + if((rawTotalEnd - rawTotalStart) >= verifyEdges) { if((MOTOR_API_SUCCESS != Motor_StopMode(mode)) || (false == Motor_WaitForCoastToSettle(mode))) @@ -3849,6 +3889,11 @@ uint8_t Motor_Calibrate(motor_mode_t mode, uint32_t measuredPulses = 0ul; uint32_t measuredEdges = 0ul; uint32_t probeEdges = 0ul; + uint32_t preloadEdges = 0ul; + uint32_t homeProbeVerifyEdges = + (mode == MOTOR_MODE_3_LINEAR_TRACK) ? + 2ul : MOTOR_HOME_PROBE_VERIFY_EDGES; + uint8_t probeAttempt = 0u; #if (MOTOR_DIAGNOSTIC_LOG_ENABLE != 0u) uint32_t firstNearPulses = 0ul; uint32_t firstNearEdges = 0ul; @@ -3915,13 +3960,54 @@ uint8_t Motor_Calibrate(motor_mode_t mode, firstNearEdges = measuredEdges; #endif if((status == MOTOR_API_SUCCESS) && - (measuredEdges < MOTOR_HOME_PROBE_VERIFY_EDGES)) + (measuredEdges < homeProbeVerifyEdges)) { /* Do not turn a non-start into a fake Hall zero. A genuine * already-near condition is proved by moving across several Hall * edges toward far and seeking the same path back toward near. */ - status = Motor_CalibrationProbeMotion( - mode, MOTOR_DIRECTION_TOWARD_FAR, legTimeoutMs, &probeEdges); + /* A loaded mechanism can need more than one bounded energize + * cycle to leave a mechanical hard stop. Retry the departure, + * but still require real Hall edges before accepting the home. + * This improves endpoint breakaway without weakening the open + * Hall / disconnected-motor diagnostic. The loaded M3 linkage + * is accepted after two filtered raw Hall edges: the real bench + * repeatedly produces one complete Hall pulse before its bounded + * probe stops, while an open/disconnected Hall still produces + * zero. The other axes retain the four-edge proof. */ + for(probeAttempt = 0u; probeAttempt < 3u; probeAttempt++) + { + status = Motor_CalibrationProbeMotion( + mode, + MOTOR_DIRECTION_TOWARD_FAR, + legTimeoutMs, + &probeEdges); + if(status == MOTOR_API_SUCCESS) + { + break; + } + if((mode == MOTOR_MODE_3_LINEAR_TRACK) && + (MOTOR_API_SUCCESS != Motor_SetFixedDutyPercent( + mode, SEAT_MOVE_M3_BREAKAWAY_DUTY_PERCENT))) + { + status = MOTOR_API_FAILURE; + break; + } + /* A failed probe has already stopped and settled the bridge. + * Briefly re-energize toward the known hard stop before the + * next departure. On the loaded M3 linkage this alternating + * preload releases static lash which repeated starts in the + * same direction do not. Its result is deliberately ignored: + * only a later far probe with real Hall edges can pass. */ + if(probeAttempt < 2u) + { + preloadEdges = 0ul; + (void)Motor_CalibrationProbeMotion( + mode, + MOTOR_DIRECTION_TOWARD_NEAR, + legTimeoutMs, + &preloadEdges); + } + } if(status == MOTOR_API_SUCCESS) { status = Motor_CalibrationSeekEndpoint( diff --git a/firmware/t2g/Seat_Controller_demo/Driver/motor_control.h b/firmware/t2g/Seat_Controller_demo/Driver/motor_control.h index d0f324c..ffe68d4 100755 --- a/firmware/t2g/Seat_Controller_demo/Driver/motor_control.h +++ b/firmware/t2g/Seat_Controller_demo/Driver/motor_control.h @@ -170,6 +170,9 @@ uint8_t Motor_SetSafetyOptions(motor_mode_t mode, uint8_t Motor_SetFixedDutyPercent(motor_mode_t mode, uint8_t dutyPercent); uint8_t Motor_StartOpenLoop(motor_mode_t mode, motor_direction_t direction); bool Motor_IsMoving(motor_mode_t mode); +/* Complete a commanded stop plus bounded Hall-coast tracking before a + * safety decision that requires the mechanism to be physically settled. */ +bool Motor_WaitUntilStopped(motor_mode_t mode); /* * Restore/store Hall-domain state. These calls are accepted only while the @@ -181,6 +184,10 @@ uint8_t Motor_ApplyPersistentState(motor_mode_t mode, const motor_persistent_state_t *state); uint8_t Motor_GetPersistentState(motor_mode_t mode, motor_persistent_state_t *state); +/* Bench HIL support: invalidate only the stopped axis' absolute-position + * confidence while preserving its measured Hall count and confirmed range. + * Production command handling never calls this API. */ +uint8_t Motor_InvalidatePosition(motor_mode_t mode); uint8_t Motor_SetMaximumSpeedPpsX100(motor_mode_t mode, uint32_t maxSpeedPpsX100); diff --git a/firmware/t2g/Seat_Controller_demo/IAR/rev_d/Exe/Seat_Controller_demo.hex b/firmware/t2g/Seat_Controller_demo/IAR/rev_d/Exe/Seat_Controller_demo.hex index 6729950..11e3b1d 100755 --- a/firmware/t2g/Seat_Controller_demo/IAR/rev_d/Exe/Seat_Controller_demo.hex +++ b/firmware/t2g/Seat_Controller_demo/IAR/rev_d/Exe/Seat_Controller_demo.hex @@ -1,12 +1,12 @@ :020000041000EA -:100000000000022879E10010B1E90010CDE60010EF +:100000000000022821EB0010B5F30010CDF0001025 :1000100000000000000000000000000000000000E0 -:100020000000000000000000000000008DE700104C -:100030000000000000000000B5E90010B9E9001060 -:1000400045DB001069DB00108DDB0010B1DB001018 -:10005000D5DB0010F9DB00101DDC001041DC0010C6 -:10006000BDE90010C1E90010C5E90010C9E90010A0 -:10007000CDE90010D1E90010D5E90010D9E9001050 +:100020000000000000000000000000008DF1001042 +:100030000000000000000000B9F30010BDF3001044 +:1000400075E5001099E50010BDE50010E1E5001030 +:1000500005E6001029E600104DE6001071E60010DC +:10006000C1F30010C5F30010C9F30010CDF3001068 +:10007000D1F30010D5F30010D9F30010DDF3001018 :1000800000B5010009B2002905D40121C006C00E47 :100090008140C648016000BD00B5010009B20029D9 :1000A00005D40121C006C00E8140C148016000BDD9 @@ -31,8 +31,8 @@ :1001D00081218900405870470168802212060A4335 :1001E0000260704780B5FFF7ADFF02BD80B5FFF735 :1001F000AFFF01BD80B5FFF7CBFF02BD80B5FFF7B4 -:10020000D8FF01BD80B503F046FE02BD80B503F006 -:1002100054FE02BD00B5022801D301200FE00B00FF +:10020000D8FF01BD80B503F0E6FE02BD80B503F066 +:10021000F4FE02BD00B5022801D301200FE00B005F :10022000DBB2042B01DB012009E0B34B800018187E :10023000C9B2405C824201D3012000E0002000BD31 :10024000F8B504001F00022C01D3012023E01500A3 @@ -74,11 +74,11 @@ :10048000AD4B1340F6B23202C0218900114019432E :10049000FF229143EAB20A4361034250610340588C :1004A000002070BDDCB506000F0010001900069C8E -:1004B0004901C20E1143400132003B0003F011FD1F +:1004B0004901C20E1143400132003B0003F0B1FD7F :1004C000060091204000FFF779FFF106C90E009168 :1004D00071090B051B0D5B1E2200D2B20321C0B2B5 :1004E000FFF7F8FED3BD80B51300A74A13600023C1 -:1004F000137203F0BCFD01BD98E8001000B5C0B256 +:1004F000137203F05CFE01BD9CF2001000B5C0B2A7 :10050000042801D2012000E00020C0B200BD00B5E7 :10051000401A00B2012801DB012000E00020C0B237 :1005200000BD00B5BE490978002901D000201FE0B8 @@ -86,9 +86,9 @@ :10054000891D415C002908D1FC214058002801D1B7 :10055000012000E00020C0B20AE08021490041589B :10056000FC228058814201D1012000E00020C0B26D -:1005700000BD00B5C0B264214843642103F0B6FD5C +:1005700000BD00B5C0B264214843642103F056FEBB :1005800000BD10B504000800C0B2FFF7F2FF010083 -:10059000A448A2018018406903F08DFF10BD00003F +:10059000A448A2018018406904F02DF810BD0000A5 :1005A00000000440FF00FFFF10B40021B42281507E :1005B0009D4A1368BC2403511268C023C2500268CC :1005C000C423C2500A00F023C254F122815410BC4B @@ -97,15 +97,15 @@ :1005F000099B002B11D00A9B002B0ED00092009A71 :10060000002A0AD0002808D0E26A824205D30A00F4 :10061000002A02D0616B002901D1002054E00021A2 -:10062000002303F051FF06000F00E06A400800219C -:1006300080197941E26A002303F053FC0500300081 -:1006400039007A4A002303F03FFF06000F00E06AFA -:100650000021009A002303F037FF02000B000096F0 +:10062000002303F0F1FF06000F00E06A40080021FC +:1006300080197941E26A002303F0F3FC05003000E1 +:1006400039007A4A002303F0DFFF06000F00E06A5A +:100650000021009A002303F0D7FF02000B00009650 :100660000197100019004008CE0730434908009E4A -:10067000019F8019794103F034FC0600002D0BD056 +:10067000019F8019794103F0D4FC0600002D0BD0B6 :10068000002E09D0BE4802998422520051434018DE :10069000B8214058B04201D2002015E0606B3018FC -:1006A000401E616B03F022FD05214843052801D25D +:1006A000401E616B03F0C2FD05214843052801D2BD :1006B000052002E0602800D35F2008990D600999A9 :1006C0000E600A9908700120FEBD80B55549800171 :1006D0000818016AC069FFF727FD002801D0012032 @@ -119,17 +119,17 @@ :1007500080B200BD00B58A49842252005043081877 :100760008E21415C00290BD08F21415C002907D0EC :100770002D490968806B081A332801D2012000E056 -:100780000020C0B200BD00002C120028F8B503F014 -:10079000B6FF002801D1002041E0002425002EE012 +:100780000020C0B200BD00002C120028F8B504F013 +:1007900056F8002801D1002041E0002425002EE079 :1007A00084214900764A6846038828004843101887 :1007B0007426835368460388280048431018762619 :1007C0008353230028004843101878268353164883 :1007D0000368280048431018836323002800484317 :1007E00010188726835501231E002800484310183F :1007F0008E27C655694350188F2143546D1C042D14 -:1008000008D269462800C0B204F008F80028C7D111 +:1008000008D269462800C0B204F0A8F80028C7D171 :10081000002004E004480068934908600120F2BD0C -:10082000B01C0028ACDC0010F01B0028A0860100E2 +:10082000C01C0028DCE60010F81B0028A086010090 :10083000FEB58D488D4909680268891A052900D2DC :100840009DE08A4909680160002452E0D2B2002A82 :100850003ED02000704328187621405A072141439A @@ -141,14 +141,14 @@ :1008B0008F23C05C0028C9D168460288200070439D :1008C00028187623C2522000704328188F228154A2 :1008D0002000704328187621415A68460088FFF7A7 -:1008E0002DFF6643A91978228852019804F094F8E4 -:1008F000641C042C43D269462000C0B203F08EFF72 -:10090000002825D104F084F884225200584B21009D +:1008E0002DFF6643A91978228852019804F034F943 +:1008F000641C042C43D269462000C0B204F02EF8D8 +:10090000002825D104F024F984225200584B2100FC :10091000514359188725495DFF290AD021005143C9 :10092000591887254D5D6D1C2100514359188726A4 :100930008D552100514359188725495D032904D35A -:10094000002162439A188E23D15404F065F8CFE752 -:1009500004F05EF8019084267600454D2000704337 +:10094000002162439A188E23D15404F005F9CFE7B1 +:1009500004F0FEF8019084267600454D2000704397 :1009600028187E21405C002884D12000704328187C :100970009421405C002800D07CE701227BE7F7BD92 :100980000813002810B53A4A84235B004343D21869 @@ -159,16 +159,16 @@ :1009D000135502E000237F2413558A23D35C972408 :1009E00013558223D15400218A23D1549423D15406 :1009F0007E21515C002905D0D34980010818406947 -:100A000004F013F810BD38B5002429E0CF4B13E0F3 +:100A000004F0B3F810BD38B5002429E0CF4B13E053 :100A100084214900164A2000484310188B23C05CEB :100A20000028F3D020004843101880690028EDD03A :100A30002000484310188369200048431018962569 :100A4000405D00280BD0094800686143511849698E :100A5000401A984203D305212000FFF793FF641C3E -:100A6000042CD5D331BD0000FC1B0028F01B00284E +:100A6000042CD5D331BD0000041C0028F81B00283D :100A700008130028F8B500273C0061E1B44AB248E9 :100A8000A1014018016AB048A301C018C06903F071 -:100A9000EEFA84256D00AF4E2000684337502000E9 +:100A90008EFB84256D00AF4E200068433750200048 :100AA0006843301847602000684330188760A648C4 :100AB000A1014018816A200068433018C1602000FD :100AC00068433018076120006843301847612000F0 @@ -211,7 +211,7 @@ :100D10003900200068433018FF22921D81543900A9 :100D20002000684330188322520081542000684319 :100D30003018FFF739FC65437019FFF7D5FC641CC8 -:100D4000042C00D29AE6F1BDACDC0010B88800009B +:100D4000042C00D29AE6F1BDDCE60010B888000061 :100D5000941200280813002870B50600BF488421AB :100D60004900714344183000FFF7AFFC05008820AC :100D7000205C002805D1852025540120882160545D @@ -234,8 +234,8 @@ :100E800070BD70B575498422520042438C187E2192 :100E9000615C00296CD08D21615C00292CD1354E1C :100EA00035689E4980010818806B0021FA22920063 -:100EB000002303F009FB02000B0099480021801871 -:100EC0005941FA22D200002303F00BF8616A691A33 +:100EB000002303F0A9FB02000B00994800218018D1 +:100EC0005941FA22D200002303F0ABF8616A691A93 :100ED00081424DD301208D216054306820636068C9 :100EE00060630020206701007A22A15201007C2269 :100EF000A1528C2160543BE07C20205A0A2810D259 @@ -246,7 +246,7 @@ :100F400020677A20205A401C010089B20A2900D368 :100F500000207A2160527C20205A0A2808D30548B4 :100F60000068216B401AFA2802D301208C216054BA -:100F700070BD0000F01B002870B50026340019E099 +:100F700070BD0000F81B002870B50026340019E091 :100F800030009021685430009121685411E0300005 :100F9000912168548220285C00280AD1C348006847 :100FA000E96B401A9949884203D305212000FFF7D5 @@ -268,26 +268,26 @@ :1010A000002806D1012091216854804800686864B6 :1010B00070E77E480068696C401A642800D269E7CE :1010C00004212000FFF75EFC64E770BD38B59E4C3C -:1010D000200003F0C9FD00281BD0200003F0C9FD4B +:1010D000200003F069FE00281BD0200003F069FE09 :1010E00072480168491C01600024250003E02800C3 :1010F000FFF732FE6D1C042DF9D3FFF784FCA748DF :101100000168491C01600168192902D30460FFF7D6 -:1011100033FF31BD8D48006870470000ACDC001023 +:1011100033FF31BD8D48006870470000DCE60010E9 :10112000CF07000070B528250026340009E0022210 :1011300001219B48A301C0181823C05EFFF742F9A4 :10114000641C042CF3D302220121FF204230FFF75C :1011500039F9934C1820205EFFF730F92B005B1E05 :1011600002220121C0B2FFF76BF81820205EFFF7C2 :1011700025F902220121C0B2FFF764F9350011E020 -:101180008849A8012018406903F008F8A801201830 -:10119000406903F083F90021A8012018406903F099 -:1011A0008EF96D1C042DEBD3012420007E490870BC +:101180008849A8012018406903F0A8F8A801201890 +:10119000406903F023FA0021A8012018406903F0F8 +:1011A0002EFA6D1C042DEBD3012420007E4908701B :1011B0003E48066079480660634E7C49300003F083 -:1011C0003BFC300003F055FD300003F047FD784D47 -:1011D000280003F057FD77490020285E03F071FDD9 +:1011C000DBFC300003F0F5FD300003F0E7FD784D67 +:1011D000280003F0F7FD77490020285E03F011FE98 :1011E00003210220285EFEF763FF0220285EFEF73F -:1011F00053FF0220285EFEF743FF300003F028FD76 -:10120000300003F00CFCAD48047070BDC409000050 +:1011F00053FF0220285EFEF743FF300003F0C8FDD6 +:10120000300003F0ACFCAD48047070BDC4090000B0 :10121000F8B500220121AA48FFF765F90122022151 :10122000A848FFF760F900220121A748FFF75BF902 :10123000A64D012201212800FFF755F900220021C7 @@ -295,31 +295,31 @@ :101250004AF9002205212000FFF745F9002200216C :101260002800FFF740F9FFF705FC9B480090082095 :1012700000990860994E13243470994FC14A002197 -:10128000380002F0F4FE0625009805603470BD4A6F -:101290000121380002F0EBFE009805603470B94A75 -:1012A0000221380002F0E3FEF1BD0000F01B00282F -:1012B00078B58DB06846B449342203F015FD3A483C -:1012C000007800280BD0B14803F0AFFBB04803F022 -:1012D000ACFBB04803F0A9FBAF4803F0A6FB7C4E83 -:1012E0006A460021300002F0C2FE7A4D6A460421AF -:1012F000280002F0BCFE6A460521280002F0B7FE75 -:10130000724C6A460021200002F0B1FE002130003C +:10128000380002F094FF0625009805603470BD4ACE +:101290000121380002F08BFF009805603470B94AD4 +:1012A0000221380002F083FFF1BD0000F81B002886 +:1012B00078B58DB06846B449342203F0B5FD3A489C +:1012C000007800280BD0B14803F04FFCB04803F081 +:1012D0004CFCB04803F049FCAF4803F046FC7C4EA0 +:1012E0006A460021300002F062FF7A4D6A4604210E +:1012F000280002F05CFF6A460521280002F057FF33 +:10130000724C6A460021200002F051FF002130009B :10131000FEF714FF04212800FEF710FF0521280026 :10132000FEF70CFF00212000FEF708FF01200090CF -:101330006A460121200002F09AFE01212000FEF7FA -:10134000F9FE0EB070BD0000000A5840F01B0028E6 +:101330006A460121200002F03AFF01212000FEF759 +:10134000F9FE0EB070BD0000000A5840F81B0028DE :101350001CB591246400012203212000FFF732F81C :10136000012000908D4A00238D480021FFF79AF854 :101370002000FFF723F801220321C0B2FFF762F833 -:10138000884C200003F012FE00228749200003F061 -:10139000D3FC2000FEF720FF13BD0000F41B002843 -:1013A000ACDC001004E10010AE1C0028B4E3001017 -:1013B000A0E80010CD100010F2B5060000273C0098 +:10138000884C200003F0B2FE00228749200003F0C1 +:1013900073FD2000FEF720FF13BD0000FC1B00289A +:1013A000DCE60010ACEA0010BE1C0028B4ED001012 +:1013B000A4F20010CD100010F2B5060000273C008A :1013C0000098002801D1002077E0380000990880BB -:1013D00003F01EFBCD490978002903D003F01CFB64 -:1013E00000206AE00121C94A117003F015FB6D4D20 +:1013D00003F0BEFBCD490978002903D003F0BCFB24 +:1013E00000206AE00121C94A117003F0B5FB6D4D80 :1013F0002800FEF7FBFE2800FEF700FF022131481F -:10140000FEF79CFE012003F059FEB6B23100280021 +:10140000FEF79CFE012003F0F9FEB6B23100280081 :10141000FEF7FCFE01283ED1BD4E00E0761E2800FE :10142000FEF7E8FE002801D1002EF7D12800FEF7D4 :10143000E1FE00282FD0B64E00E0761E2800FEF711 @@ -328,9 +328,9 @@ :1014600019D1C0200002009909880140814201D1B0 :10147000012400E03C002000C0B200280BD0A548A9 :101480000078002807D000980088FC2189010140DD -:10149000002900D03C00012003F010FE0221094881 -:1014A000FEF748FE012003F009FE03F0B1FA974968 -:1014B0000F7003F0B1FA2000C0B2F2BDAD1C0028DD +:10149000002900D03C00012003F0B0FE02210948E1 +:1014A000FEF748FE012003F0A9FE03F051FB974927 +:1014B0000F7003F051FB2000C0B2F2BDBD1C00282C :1014C00080013140800F31408004314000043140C0 :1014D00080003140800231406412002868120028E8 :1014E0000003314080B5C0B20202FC2080011040F0 @@ -342,14 +342,14 @@ :10154000D1FF002801D100200FE069462800C0B279 :10155000FFF7D5FF002806D068460078E4B2A04225 :1015600001D1012000E00020C0B232BD80B5B44AF4 -:1015700000211160017C1172C168806802F077FD62 -:1015800001BD00006012002880E5001000065840F0 +:1015700000211160017C1172C168806802F017FEC1 +:1015800001BD00006012002880EF001000065840E6 :1015900080065840000758408009584000B4C404F1 -:1015A0000024F4000000644004E40010F8B50126B3 +:1015A0000024F4000000644004EE0010F8B50126A9 :1015B0003000002468460470564804700121A14898 :1015C000FEF7B8FDC24F01213800FEF7B3FD9E4D76 -:1015D000280003F073FD01219C48FEF7ABFD2800B5 -:1015E00003F06CFD02210820FFF7A2FF0500280090 +:1015D000280003F013FE01219C48FEF7ABFD280014 +:1015E00003F00CFE02210820FFF7A2FF05002800EF :1015F000C0B2002804D000210920FFF799FF0500A0 :101600002800C0B2002804D000210A20FFF790FF74 :1016100005002800C0B2002804D00F210B20FFF7DE @@ -358,7 +358,7 @@ :101640000D20FFF775FF05002800C0B2002804D068 :1016500000210E20FFF76CFF05002800C0B2002813 :1016600008D087210720FFF73DFF0500FA20800002 -:1016700003F024FD2800C0B2002804D086210720F2 +:1016700003F0C4FD2800C0B2002804D08621072052 :10168000FFF756FF05002800C0B200280ED06946BB :101690000020FFF734FF002807D068460078BF21FC :1016A0000140802901D1350000E025002800C0B2AA @@ -366,13 +366,13 @@ :1016C00014480670B8480068B8490860012138001D :1016D000FEF734FD07E0B34806700E4804700121A0 :1016E0003800FEF727FD2800C0B2F2BD10B5040097 -:1016F000534A002010601072E168A06802F0B7FC45 -:10170000E168A068FEF71AFD10BD0000B21C0028B9 -:10171000A0860100B51C0028F8B501242000A149CD +:1016F000534A002010601072E168A06802F057FDA4 +:10170000E168A068FEF71AFD10BD0000C21C0028A9 +:10171000A0860100C51C0028F8B501242000A149BD :10172000087000252800A949087001216848FEF7C3 :1017300001FD2E000FE0A6480078002805D0A5483E -:10174000B1014018406903F070F9A248B101401896 -:10175000FFF7CCFF761C042EEDD303F059F900906F +:10174000B1014018406903F010FAA248B1014018F5 +:10175000FFF7CCFF761C042EEDD303F0F9F90090CF :10176000280044E02A0011E0B84984225200424394 :1017700089188A228A5C002A07D197228A5C002A6B :1017800003D198228A5C002AECD022002B007E260E @@ -382,7 +382,7 @@ :1017C000CE552E009627CE552E009727CE552E00AB :1017D0008927CE55D2B2002A08D084228B549C226D :1017E0008A58A023CA5022009823CA54401C0428B7 -:1017F000BAD3009803F010F9F1BD80B573480078B2 +:1017F000BAD3009803F0B0F9F1BD80B57348007812 :1018000000280AD067480078002806D16748664952 :101810000A680368D21A192A00D20FE00968016029 :1018200069460020FFF76BFE002805D06846007867 @@ -397,22 +397,22 @@ :1018B0003FFE06003000C0B2002800D02C7030007F :1018C000C0B2002801D1FFF727FF3000C0B270BDC1 :1018D0000004314038B504003E48A101451868694C -:1018E00003F0A3F82800FFF701FF00212000FFF715 +:1018E00003F043F92800FFF701FF00212000FFF774 :1018F000AFFF32BD70B505003648AA018618C9B2DF :10190000012902D12620345C01E02720345C0F201D -:10191000E840C00701D400200FE0706903F085F8AB +:10191000E840C00701D400200FE0706903F025F90A :101920003000FFF7E3FE2100C9B22800FFF790FF67 -:10193000002801D1002000E0012070BDAB1C002870 -:10194000AC1C002870B504002248A10145183F488E +:10193000002801D1002000E0012070BDBB1C002860 +:10194000BC1C002870B504002248A10145183F487E :101950008421490061434018F421465C83214900F9 :10196000415C00290AD08B21415C002906D1F2217B :10197000465C3100C9B2322900D23226F3214654E6 :10198000FEF712FE3100C9B22000FEF7FAFD002179 -:10199000686902F094FD686903F041F82800FFF7D8 -:1019A000E5FD70BDAF1C0028F01B0028F81B0028C7 +:10199000686902F034FE686903F0E1F82800FFF797 +:1019A000E5FD70BDBF1C0028F81B0028001C0028A6 :1019B00000B50A00D2B2002A07D081228154AD4975 -:1019C0000968016201219522815400BDB51C0028DF -:1019D000AE1C0028ACDC0010842281549C214158AC +:1019C0000968016201219522815400BDC51C0028CF +:1019D000BE1C0028DCE60010842281549C21415862 :1019E000A0228150012198228154704700B59C218A :1019F0004158491C9C2281509C214158002902D108 :101A000001219C22815000210A008423C254A0227B @@ -425,8 +425,8 @@ :101A70008A22815497228154012183228154012199 :101A8000FFF7AAFF01BDF3B583B07C480399842218 :101A90005200514344180020694608700025002078 -:101AA000694648700027002069468870002602F0C9 -:101AB000AFFF01909420205C00284DD08220205C54 +:101AA000694648700027002069468870002603F0C8 +:101AB0004FF801909420205C00284DD08220205CBB :101AC000002849D16E480078002845D12000FEF753 :101AD00028FD002840D06846007CC0B2002809D00C :101AE00064480068E169401A322835D39520205CAB @@ -436,10 +436,10 @@ :101B20001AE08A20205C002807D0A068216988423A :101B300001D2012003E0022001E08020205C694600 :101B4000087068460078002803D001206946487074 -:101B500002E0002069464870019802F05DFF3800FD +:101B500002E0002069464870019802F0FDFF38005D :101B6000C0B2002803D00398FFF7B4FE80E06846B7 :101B70004078002801D100207AE068460178039877 -:101B8000FFF7B8FE002801D1002071E002F040FF0D +:101B8000FFF7B8FE002801D1002071E002F0E0FF6D :101B900001909420205C002856D08220205C0028F0 :101BA00052D13748007800284ED12000FEF7B9FC0A :101BB000002849D02000FFF72FFF002804D005217E @@ -451,18 +451,18 @@ :101C100060540020802160549421605495216054C8 :101C2000812160542000FEF75FFD0398FFF78AFED4 :101C300001266846867007E0FFB2002F03D180209E -:101C40002554012600E00126019802F0E5FE6846D1 +:101C40002554012600E00126019802F085FF684630 :101C5000807800280AD10A480078002804D1039827 :101C6000FFF738FE002801D1002001E03000C0B2AB -:101C700005B0F0BDF01B0028B8880000081300284C -:101C8000AF1C0028F6B583B00D001F000400E4B2BD +:101C700005B0F0BDF81B0028B88800000813002844 +:101C8000BF1C0028F6B583B00D001F000400E4B2AD :101C90009C490978002916D0C0B2FEF72FFC002815 :101CA00011D09948007800280DD198480078002874 :101CB00009D16846057068460078012805D0684655 -:101CC0000078022801D001201AE102F0A1FE019063 +:101CC0000078022801D001201AE102F041FF0190C2 :101CD000842676008E4D2000704328188221405CB7 :101CE000002806D1200070432818FEF71AFC0028AF -:101CF00004D1019802F090FE012001E12000704320 +:101CF00004D1019802F030FF012001E1200070437F :101D000028187E21415C0CA80078002813D10CA86B :101D100001700CA8007800280DD12000704328180D :101D20009522805C002806D020007043281881226C @@ -471,7 +471,7 @@ :101D500000280CD0C9B2002905D00CA8007869462B :101D60000978884203D001206946887002E000208B :101D70006946887068464078002805D0C548A101AA -:101D80004018406902F051FE0A9902976846027CA9 +:101D80004018406902F0F1FE0A9902976846027C09 :101D900000272000704328188223C7542000704376 :101DA00028187F23C7542000704328188A23C25460 :101DB000029B2000704328180361200070432818FC @@ -490,16 +490,16 @@ :101E800068460178200070432818802281548248D7 :101E90000168200070432818C161012120007043AF :101EA0002818942281542000704328189521475403 -:101EB0006643A81981214754019802F0ADFD684698 +:101EB0006643A81981214754019802F04DFE6846F7 :101EC000407800280CD07348A1014018FFF70EFCA1 :101ED00000212000FFF7BCFC002801D101200FE009 :101EE00068468078002801D0002009E00021200009 :101EF000FFF7C9FD002801D0380000E00120C0B282 -:101F000005B0F0BDAD1C0028B01C0028AF1C002897 +:101F000005B0F0BDBD1C0028C01C0028BF1C002867 :101F10000813002880B50121FFF7B5FD01BDF1B51B :101F200086B05E4806998422520051434418002727 -:101F3000002502F06DFD01908220205C694608704A -:101F400068460078002803D1019802F065FD9EE004 +:101F3000002502F00DFE01908220205C69460870A9 +:101F400068460078002803D1019802F005FE9EE063 :101F50007F20205C694608748B20205C69464870AD :101F60009720205C694688700026300082216054EA :101F700030007E21605430007F2160543000802189 @@ -516,17 +516,17 @@ :1020200068464078002809D19320205C002805D01C :102030008620205C002801D1012500E03500280021 :10204000C0B2002805D08620205C401C8621605448 -:1020500001E096202654019802F0DEFC0698FFF776 +:1020500001E096202654019802F07EFD0698FFF7D5 :1020600039FC002813D0EDB2002D10D001200390D0 :102070006846007C02900020019000200090002320 :1020800000223900C9B20698C0B2FFF7FBFD07B0C5 -:10209000F0BD0000ACDC0010F01B00280813002885 +:10209000F0BD0000DCE60010F81B00280813002843 :1020A000F1B584B0B14804998422520051434518D7 -:1020B00002F0AEFC0090AE48046883204000285C2B +:1020B00002F04EFD0090AE48046883204000285C8A :1020C000002818D07E20285C002814D08B20285CA3 :1020D000002810D19420285C00280CD18220285C94 :1020E000002808D1A3480078002804D1C02028582F -:1020F000201A322803D2009802F08EFC34E12868BE +:1020F000201A322803D2009802F02EFD34E128681D :102100000190F020285CF121695C05290AD2C421E4 :1021100069580391BC216958F122AA5C521CF12331 :10212000EA540CE00100C9B289006918C822895834 @@ -535,92 +535,92 @@ :102150009200AA18DC23D450401C0200D2B2052AF7 :1021600000D30020F022A854C0202C50601A029006 :10217000BC202858201A0021FA22D200002302F0A5 -:10218000A3F9FA229200002301F0ABFE0200A42082 +:1021800043FAFA229200002301F04BFF0200A42040 :102190002858904201D2A4202A58AC202858A421C3 -:1021A0006E580021002302F08FF902000B00700826 -:1021B000002180185941A422AA58002301F091FE61 +:1021A0006E580021002302F02FFA02000B00700885 +:1021B000002180185941A422AA58002301F031FFC0 :1021C00006000198C4216958471ABC202858201AD3 :1021D000322812D33000401CB8420ED2F320285CC3 :1021E000002806D00020F321685400210498FEF74F -:1021F000C8F9009802F010FCB6E0BC202858201A5C -:10220000FA2802D30298FA2803D2009802F004FCBC -:10221000AAE002980021FA22D200002302F054F929 -:10222000FA229200002301F05CFE0400002C03D18E -:10223000009802F0F1FB97E001980399401A002101 -:10224000AF4A002302F040F902000B0060080021B1 -:10225000801859412200002301F043FE0190B02074 +:1021F000C8F9009802F0B0FCB6E0BC202858201ABC +:10220000FA2802D30298FA2803D2009802F0A4FC1C +:10221000AAE002980021FA22D200002302F0F4F989 +:10222000FA229200002301F0FCFE0400002C03D1EE +:10223000009802F091FC97E001980399401A002160 +:10224000AF4A002302F0E0F902000B006008002111 +:10225000801859412200002301F0E3FE0190B020D4 :1022600028580290F3202C5C0198B421685030006B :10227000401CB84201D200245BE07F1CB74210D260 :102280002000C0B2322801D2322452E02000C0B275 :102290005F284ED2641D2000C0B2602849D35F245D -:1022A00047E0019800216422002302F00DF90600A6 -:1022B0000F00029800215A22002302F005F98F42F4 +:1022A00047E0019800216422002302F0ADF9060006 +:1022B0000F00029800215A22002302F0A5F98F4254 :1022C00013D801D3864210D22000C0B2322801D2E6 :1022D00032242EE02000C0B25F282AD2641D2000E4 :1022E000C0B2602825D35F2423E0029800216E222B -:1022F000002302F0E9F806000F0001980021642293 -:10230000002302F0E1F88F4213D801D3864210D2A5 +:1022F000002302F089F906000F00019800216422F2 +:10230000002302F081F98F4213D801D3864210D204 :102310002000C0B2332807D32000C0B2372801D331 :10232000FB3406E0322404E02000C0B2002800D0D4 :1023300000242000F321695CC0B2884211D0F32050 :10234000285C002806D12000C0B2322802D3280021 :10235000FEF7CAF9F3202C542100C9B20498FEF705 -:1023600010F9009802F058FB05B0F0BD08130028E2 -:10237000F01B0028AF1C0028FEB5A54800780028F7 -:102380005DD002F045FBC3490978002902D002F074 -:1023900043FB54E001273900BE4A1170B8490A785E -:1023A0006B461A70002422000A7002F035FB684662 +:1023600010F9009802F0F8FB05B0F0BD0813002842 +:10237000F81B0028BF1C0028FEB5A54800780028DF +:102380005DD002F0E5FBC3490978002902D002F0D4 +:10239000E3FB54E001273900BE4A1170B8490A78BE +:1023A0006B461A70002422000A7002F0D5FB6846C2 :1023B000007800282BD0250027E026001AE0684688 -:1023C00000783900A94008421ED002F021FB01909C +:1023C00000783900A94008421ED002F0C1FB0190FC :1023D00084214900B04A28004843101882235B003A :1023E000C05C0028E9D069435018FEF79AF800282D -:1023F000E3D13E00019802F00FFBF6B2002E03D0AD +:1023F000E3D13E00019802F0AFFBF6B2002E03D00D :102400002800C0B200F059F96D1C042DD7D3FEF797 :102410000FFAFFF7F2F9250009E02800FFF77FFD2A :102420002800FFF777FD2800FFF73AFE6D1C042D0A -:10243000F3D302F0EDFA97490C7002F0EDFAF7BD14 +:10243000F3D302F08DFB97490C7002F08DFBF7BDD2 :10244000964800787047F8B50E000700FFB2704953 :102450000978002904D0C0B2FEF750F8002801D155 -:10246000012046E002F0D4FA04008B4884214900A0 +:10246000012046E002F074FB04008B4884214900FF :10247000794345188A480078002804D0200002F0EB -:10248000CBFA012035E0FF20801D285C00280CD00D +:102480006BFB012035E0FF20801D285C00280CD06C :10249000310089B2F820285AFEF739F8002804D014 -:1024A000200002F0B9FA012023E082204000285CDD +:1024A000200002F059FB012023E082204000285C3C :1024B00000280FD0F620285A310089B2884219D15D :1024C00000208221490068546D4801780122BA40F9 :1024D00091430170F8202E52FC2028588021490099 -:1024E00068500120FF21891D6854200002F094FAF1 -:1024F0000020F2BD200002F08FFA0120F9E7000071 +:1024E00068500120FF21891D6854200002F034FB50 +:1024F0000020F2BD200002F02FFB0120F9E70000D0 :10250000A0860100F2B50400E4B24149097800292F :1025100004D0C0B2FDF7F2FF002801D1002025E071 -:1025200002F076FA070084256D005B4E20006843B8 +:1025200002F016FB070084256D005B4E2000684317 :102530003018FDF7F6FF002812D02000684330184D :10254000FF21891D405C00280AD0684600886C4342 :102550003119F822895A80B2814201D1012400E068 -:102560000024380002F058FA2000C0B2F2BDF3B5E2 +:102560000024380002F0F8FA2000C0B2F2BDF3B542 :1025700081B000262DE000200EE0002482204000E3 :10258000385C0028F7D068460189F620385AFDF7F4 :10259000BEFF0028EFD028002043C0B2002817D18A :1025A00068460089F6217852FC203858401CFC21EE :1025B0007850280082214900785431480178B5408C -:1025C0000D430570AF48B1014018406902F02DFA83 +:1025C0000D430570AF48B1014018406902F0CDFAE3 :1025D000761C042E1AD20125684600792900B140E4 :1025E0000842F5D02C488421490071434718FF2048 :1025F000801D385C0028C0D068460189F820385A10 :10260000FDF785FF0028B8D02C00B7E7F7BD000024 -:10261000AD1C0028F1B5002425002EE084214900DE +:10261000BD1C0028F1B5002425002EE084214900CE :102620001D4A68460388280048431018F62683533D :10263000280048431018FC23C3585B1C280048435B :102640001018FC26835101231E002800484310184F :1026500082277F00C655200069435118FF22921D32 :10266000885407480178AB400B4303708548A901A3 -:102670004018406902F0D9F96D1C042DCED3F1BD8C -:10268000B31C002880B50121054A117080B2FFF704 -:10269000C1FF01BDB11C002808130028AF1C002891 -:1026A000B01C002810B5002404E02000C0B200F0E7 +:102670004018406902F079FA6D1C042DCED3F1BDEB +:10268000C31C002880B50121054A117080B2FFF7F4 +:10269000C1FF01BDC11C002808130028BF1C002871 +:1026A000C01C002810B5002404E02000C0B200F0D7 :1026B00004F8641C042CF8D310BDFEB50400E4B289 :1026C000B9490978002904D0C0B2FDF717FF0028E6 -:1026D00001D10120D5E002F09BF9019084256D0025 +:1026D00001D10120D5E002F03BFA019084256D0084 :1026E000B24E2000684330187E21415C20006843D0 :1026F00030188322805C6A461070200068433018CE :102700008A22805C002806D1200068433018972276 @@ -643,17 +643,17 @@ :1028100030189722815468464078002805D0062158 :1028200065437019FFF7D8F80FE0390020006843BE :10283000301884228154200068433018A02147506A -:1028400038006543711998228854019802F0E4F821 +:1028400038006543711998228854019802F084F980 :102850007748007800280BD00A4DA001281840695D -:1028600002F0E3F8A0012818FEF740FF012008E07D +:1028600002F083F9A0012818FEF740FF012008E0DC :102870002000FFF72FF8002801D0380000E00120E9 -:10288000C0B2FEBDACDC0010FEB50D000400E4B229 +:10288000C0B2FEBDDCE60010FEB50D000400E4B2EF :1028900045490978002913D0C0B2FDF72FFE002862 -:1028A0000ED0AC4E307800280AD1684605706846D4 +:1028A0000ED0C04E307800280AD1684605706846C0 :1028B000007832382E2803D25D4D2878002801D0C8 -:1028C00001206FE002F0A4F80190307800280CD1CC +:1028C00001206FE002F044F90190307800280CD12B :1028D0002878002809D184256D00344E20006843F3 -:1028E0003018FDF71EFE002804D1019802F094F87C +:1028E0003018FDF71EFE002804D1019802F034F9DB :1028F000012057E068460178200068433018F42230 :102900008154002739002000684330188322520088 :102910008154200068433018A421475020006843A8 @@ -665,3115 +665,3275 @@ :10297000684330188B21405C002807D165437019EB :102980008221405C002801D10127FFE7FFB2002F20 :1029900004D0684601782000FDF7F3FD019802F0AD -:1029A0003BF80020FEBD0000AD1C002808130028E5 +:1029A000DBF80020FEBD0000BD1C00280813002835 :1029B000F8B5002203920022029201220192002225 :1029C000009200230022C9B2C0B2FFF75BF905B044 -:1029D00000BD38B50400E4B2AE490978002904D03E +:1029D00000BD38B50400E4B28D490978002904D05F :1029E000C0B2FDF78BFD002801D100201FE002F0EE -:1029F0000FF884225200A84B2100514359187E251C +:1029F000AFF884225200874B2100514359187E259D :102A0000495D00290CD12100514359189425495D95 :102A1000002905D1544319199522895C002901D058 -:102A2000012400E0002401F0F7FF2000C0B232BD15 -:102A3000AF1C002838B50C000500EDB2002C1FD0EB -:102A4000C0B2FDF75BFD00281AD06068002817D0DF -:102A50006168280000F00CFF002811D0207C0028BD -:102A600003D06068216888420AD3A068002807D094 -:102A70008A48A9014018006B4000A168884201D231 -:102A8000012000E0002032BDF8B50400E4B2814A24 -:102A90001278002A06D00F003900C0B2FFF7CAFF33 -:102AA000002801D0012053E001F0B2FF00908425FE -:102AB0006D00794E2000684330187E21405C00286C -:102AC00014D12000684330189421405C00280DD1B7 -:102AD0002000684330189521405C002806D1200072 -:102AE000684330188221405C002804D0009801F02F -:102AF00093FF01202CE03968200068433018816082 -:102B00007968200068433018C160B96820006843C4 -:102B10003018B8228150F968200068433150397C60 -:102B20002000684330188922815400212000684326 -:102B3000301883228154200068433018FDF7D4FDFB -:102B40006C433019FDF730FD009801F065FF00205F -:102B5000F2BD0000B01C002870B50C000500EDB2FD -:102B6000002C08D04B490978002904D0C0B2FDF7E9 -:102B7000C5FC002801D1012020E001F049FF84229A -:102B80005200454B2900514359188968216029009A -:102B900051435918C9686160290051435918B82632 -:102BA0008959A160290051435958E1605543591989 -:102BB0008922895C217401F02FFF002070BDF8B5D7 -:102BC0000D000400E4B233490978002918D0C0B2DE -:102BD000FDF794FC002813D07348007800280FD12B -:102BE000C048007800280BD100950098002807D035 -:102BF0002A48A1014018006B40000099884201D288 -:102C0000012036E001F004FF070084256D00B74E77 -:102C10002000684330187E21405C00281BD1200032 -:102C2000684330189421405C002814D12000684388 -:102C300030189521405C00280DD1200068433018E1 -:102C40008221405C002806D1200068433018FDF73F -:102C500068FC002804D1380001F0DEFE012008E005 -:102C600000986C433119B8228850380001F0D4FE26 -:102C70000020F2BD00B59E4800680021FA22D20073 -:102C8000002301F021FCFA229200002301F029F92F -:102C900000BD0000AD1C002808130028ACDC0010AB -:102CA000F8B505000C002E00F6B2002C09D09148B2 -:102CB0000078002805D02800C0B2FDF71FFC0028CE -:102CC00001D101206CE001F0A3FE070088480168F3 -:102CD00084225200854B300050431818806B091A2B -:102CE00025703000504318188E25405D002803D011 -:102CF000332901D2012000E00020607030005043F1 -:102D000018188F25405DA0703000504318187425A6 -:102D1000405BE0803000504318187625405B2081EE -:102D20003000504318187825405B60816E48B5012B -:102D30004019808FA0816078002808D0A0780028F2 -:102D400005D06089A589A84201D3012000E00020B8 -:102D5000E0703000504318188C25405D002807D0E3 -:102D6000300050431818006F032801D2012000E002 -:102D700000202071564398198B22805C60710800F6 -:102D80000021FA22D200002301F09EFBFA229200D9 -:102D9000002301F0A6F82061380001F03DFE00207C -:102DA000F2BDA84908707047B01C0028FEB50500A8 -:102DB0000C002E00F6B2002C09D04E4800780028F6 -:102DC00005D02800C0B2FDF799FB002801D10120F1 -:102DD00086E001F01DFE019084214900434A300045 -:102DE000484310188768300048431018C0680090A6 -:102DF0003000484310188923C05C6070300048439D -:102E000010187E23C05CA070714350188321405C71 -:102E1000E070019801F000FE0098002801D1012027 -:102E20005EE0019700980199884201D200980190D4 -:102E30002D48B1014018C26A257067600098A060F3 -:102E4000226101980021002301F03EFB02000B00EB -:102E500000984008002180185941009A002301F091 -:102E600040F8E06001980021774A002301F02CFB34 -:102E700002000B0000984008002180185941009A78 -:102E8000002301F02EF860620026A661E6612800AA -:102E9000C0B2002805D1E0686061E068A0612662E8 -:102EA0001DE0EDB2012D17D1E068606101980021AD -:102EB000664A002301F008FB02000B00009840085E -:102EC000002180185941009A002301F00AF8A061FE -:102ED000E068E061266202E06661E068206200204E -:102EE000FEBD0000AF1C0028ACDC00100813002859 -:102EF000F01B0028AD1C0028F8B588B00D001600A6 -:102F00000400E4B27A49097800290CD0C0B2FDF778 -:102F1000F5FA002807D077480078002803D17648D2 -:102F20000078002801D001208AE006960795FFF777 -:102F300023FA01F06DFD842676006C4D210071436B -:102F40006918CF6801F068FD03A8029004A80190F9 -:102F500005A80090069B079A39002000FDF73EFB6C -:102F6000002801D101206BE001F052FD070061480B -:102F7000007800280AD160480078002806D1200097 -:102F800070432818FDF7CDFA002804D1380001F06D -:102F900043FD012054E00799200070432818A42223 -:102FA00081500699200070432818A8228150059965 -:102FB000200070432818AC228150049920007043EF -:102FC0002818B02281506846017B200070432818E1 -:102FD000F22281546846017B200070432818F322B6 -:102FE000815401212000704328188322520081540B -:102FF000200070432818FDF7D7FA200070432818E6 -:103000007E21405C00280ED02000704328188B21C0 -:10301000405C002807D16643A8198221405C002843 -:1030200001D1012000E00020C0B2002804D0684691 -:10303000017B2000FDF7A5FA380001F0EDFC00202F -:1030400009B0F0BDB41C002810270000EC130000EC -:1030500070B505000C002E00F6B2002C09D02448F3 -:103060000078002805D02800C0B2FDF747FA0028F4 -:1030700001D1012038E001F0CBFC25708422520000 -:10308000B84B31005143591883256D00495D61707B -:10309000310051435918A425495961603100514309 -:1030A0005918A8254959A160310051435918AC2538 -:1030B0004959E160310051435918B02549592161FE -:1030C000310051435918B4254959616131005143C8 -:1030D0005918F225495D217656439919F322895CE6 -:1030E000617601F099FC002070BD000008130028F3 -:1030F000AD1C0028B01C0028AF1C0028F1B586B01C -:103100000C006846007E01900026300030006946C1 -:1031100008743000694688703000694648709248EB -:103120000078002809D06846007EFDF7E7F90028FE -:1031300003D08E4D2878002801D0012010E103949F -:10314000FFF71AF98A48019989014018C76A03985C -:10315000874201D2012003E101F05AFC029081482C -:10316000019984225200514344188920205C002890 -:1031700012D0E06800280FD08B20205C00280BD1F3 -:103180008220205C002807D12000FDF7CAF9002822 -:1031900002D02878002804D0029801F03DFC0120DC -:1031A000DEE003980021E268002301F08DF90200BF -:1031B0000B0078080021801859413A00002300F0E4 -:1031C00090FE07007E20205C694608702000FEF714 -:1031D0000DFC276101258A20255430008B21605485 -:1031E0003000972160543000832160549420205C8B -:1031F000002819D0A068874201D1300005E0A068FE -:10320000B84201D2280000E00220802160549620BC -:10321000205C00287DD157480068606196202554C5 -:1032200030008621605474E068460078002839D068 -:1032300068460078012802D1A068B84206D36846E3 -:103240000078022804D1A068874201D2280000E05B -:1032500030009621615C002907D146490968616107 -:103260009621655431008622A154C0B2002850D165 -:103270003F48019989014018406901F0D6FB3000B0 -:103280007E2160543000802160543A480068E0613B -:1032900094202554684601782000FEF789FB684693 -:1032A000857036E09520205C00281DD0A0688742FC +:102A2000012400E0002402F097F82000C0B232BD7B +:102A3000BF1C002810B5040075480078002805D098 +:102A40002000C0B2FDF75AFD002801D1002019E096 +:102A50002000C0B2FFF7BDFF002803D02000C0B2A5 +:102A6000FFF72BFE2000C0B200F0E2FC002807D0E8 +:102A70002000C0B2FFF7ADFF002801D1012000E027 +:102A80000020C0B210BD38B50C000500EDB2002C1E +:102A90001FD0C0B2FDF732FD00281AD060680028B0 +:102AA00017D06168280000F049FF002811D0207C71 +:102AB000002803D06068216888420AD3A0680028F3 +:102AC00007D0A348A9014018006B4000A1688842C4 +:102AD00001D2012000E0002032BDF8B50400E4B2CC +:102AE0004B4A1278002A06D00F003900C0B2FFF717 +:102AF000CAFF002801D0012053E002F029F800901D +:102B000084256D00434E2000684330187E21405CD0 +:102B1000002814D12000684330189421405C00281C +:102B20000DD12000684330189521405C002806D163 +:102B30002000684330188221405C002804D00098AF +:102B400002F00AF801202CE03968200068433018B0 +:102B500081607968200068433018C160B96820003E +:102B600068433018B8228150F9682000684331501A +:102B7000397C2000684330188922815400212000CC +:102B80006843301883228154200068433018FDF7D1 +:102B9000ABFD6C433019FDF707FD009801F0DCFF39 +:102BA0000020F2BDC01C002870B50C000500EDB27D +:102BB000002C08D016490978002904D0C0B2FDF7CE +:102BC0009DFC002801D1012020E001F0C1FF8422FA +:102BD0005200104B2900514359188968216029007F +:102BE00051435918C9686160290051435918B826E2 +:102BF0008959A160290051435958E1605543591939 +:102C00008922895C217401F0A7FF002070BD0000BB +:102C1000BD1C00280813002818B585B0040020004A +:102C2000C0B2042801DB012026E02000C0B2FFF77B +:102C3000D0FE002803D02000C0B2FFF73EFD2000E8 +:102C4000C0B200F0F5FB00280CD02000C0B2FFF7A6 +:102C5000C0FE002806D169462000C0B2FFF7A4FFDD +:102C6000002801D0012007E0002069460874694669 +:102C70002000C0B2FFF731FF06B010BDF8B50D005F +:102C80000400E4B275490978002918D0C0B2FDF7F4 +:102C900035FC002813D07248007800280FD1BF48B7 +:102CA000007800280BD100950098002807D028480C +:102CB000A1014018006B40000099884201D2012018 +:102CC00036E001F045FF070084256D00B54E200079 +:102CD000684330187E21405C00281BD120006843E7 +:102CE00030189421405C002814D12000684330182B +:102CF0009521405C00280DD12000684330188221C6 +:102D0000405C002806D1200068433018FDF709FC1C +:102D1000002804D1380001F01FFF012008E00098CE +:102D20006C433119B8228850380001F015FF00209B +:102D3000F2BD00B59C4800680021FA22D2000023B1 +:102D400001F062FCFA229200002301F06AF900BD52 +:102D5000DCE60010F8B505000C002E00F6B2002CE1 +:102D600009D03E480078002805D02800C0B2FDF701 +:102D7000C5FB002801D101206CE001F0E9FE07004D +:102D80008948016884225200864B3000504318184D +:102D9000806B091A25703000504318188E25405D4D +:102DA000002803D0332901D2012000E00020607008 +:102DB0003000504318188F25405DA07030005043FC +:102DC00018187425405BE0803000504318187625B1 +:102DD000405B20813000504318187825405B6081AB +:102DE0006F48B5014019808FA0816078002808D015 +:102DF000A078002805D06089A589A84201D30120C8 +:102E000000E00020E0703000504318188C25405D31 +:102E1000002807D0300050431818006F032801D253 +:102E2000012000E000202071564398198B22805C1D +:102E3000607108000021FA22D200002301F0E4FBB7 +:102E4000FA229200002301F0ECF82061380001F032 +:102E500083FE0020F2BDA84908707047BD1C002801 +:102E6000C01C0028FEB505000C002E00F6B2002C98 +:102E700009D0A2480078002805D02800C0B2FDF78C +:102E80003DFB002801D1012086E001F061FE0190A8 +:102E900084214900434A30004843101887683000B5 +:102EA00048431018C0680090300048431018892328 +:102EB000C05C60703000484310187E23C05CA07076 +:102EC000714350188321405CE070019801F044FE8A +:102ED0000098002801D101205EE001970098019937 +:102EE000884201D2009801902D48B1014018C26A71 +:102EF000257067600098A06022610198002100237E +:102F000001F082FB02000B000098400800218018AD +:102F10005941009A002301F084F8E06001980021F3 +:102F2000774A002301F070FB02000B000098400874 +:102F3000002180185941009A002301F072F8606264 +:102F40000026A661E6612800C0B2002805D1E0682D +:102F50006061E068A06126621DE0EDB2012D17D12D +:102F6000E068606101980021664A002301F04CFB93 +:102F700002000B0000984008002180185941009A77 +:102F8000002301F04EF8A061E068E061266202E0F3 +:102F90006661E06820620020FEBD0000BF1C0028C2 +:102FA000DCE6001008130028F81B0028F8B588B0EC +:102FB0000D0016000400E4B25049097800290CD035 +:102FC000C0B2FDF79BFA002807D0774800780028A8 +:102FD00003D176480078002801D001208AE00696C7 +:102FE0000795FFF7C9F901F0B3FD842676006D4D12 +:102FF000210071436918CF6801F0AEFD03A802906B +:1030000004A8019005A80090069B079A39002000AB +:10301000FDF7E4FA002801D101206BE001F098FDF2 +:1030200007006148007800280AD16048007800282D +:1030300006D1200070432818FDF773FA002804D148 +:10304000380001F089FD012054E007992000704309 +:103050002818A42281500699200070432818A8221D +:1030600081500599200070432818AC2281500499A2 +:10307000200070432818B02281506846017B200050 +:1030800070432818F22281546846017B2000704367 +:103090002818F3228154012120007043281883222C +:1030A00052008154200070432818FDF77DFA20005B +:1030B000704328187E21405C00280ED02000704309 +:1030C00028188B21405C002807D16643A81982216B +:1030D000405C002801D1012000E00020C0B200289F +:1030E00004D06846017B2000FDF74BFA380001F060 +:1030F00033FD002009B0F0BDC41C0028BD1C002811 +:1031000010270000EC13000070B505000C002E0025 +:10311000F6B2002C09D026480078002805D02800F7 +:10312000C0B2FDF7EBF9002801D1012038E001F031 +:103130000FFD257084225200B84B310051435918BD +:1031400083256D00495D6170310051435918A425F4 +:1031500049596160310051435918A8254959A16066 +:10316000310051435918AC254959E16031005143B0 +:103170005918B02549592161310051435918B425D6 +:1031800049596161310051435918F225495D217651 +:1031900056439919F322895C617601F0DDFC002029 +:1031A00070BD000008130028C01C0028BF1C0028A8 +:1031B000BD1C0028F1B586B00C006846007E019069 +:1031C0000026300030006946087430006946887077 +:1031D00030006946487092480078002809D0684657 +:1031E000007EFDF78BF9002803D08E4D287800284B +:1031F00001D0012010E10394FFF7BEF88A4801993D +:1032000089014018C76A0398874201D2012003E16F +:1032100001F09EFC029081480199842252005143A2 +:1032200044188920205C002812D0E06800280FD0C4 +:103230008B20205C00280BD18220205C002807D145 +:103240002000FDF76EF9002802D02878002804D06D +:10325000029801F081FC0120DEE003980021E26881 +:10326000002301F0D1F902000B007808002180183A +:1032700059413A00002300F0D4FE07007E20205C74 +:10328000694608702000FEF7B1FB276101258A20FE +:10329000255430008B216054300097216054300059 +:1032A000832160549420205C002819D0A0688742B4 :1032B00001D1300005E0A068B84201D2280000E04A -:1032C000022080216054206AE061942025549620D9 -:1032D000205C00281DD12748006860619620255495 -:1032E00030008621605414E0A068874206D1300087 -:1032F000862160542000FEF7ABFB0AE0A068B842CC -:1033000002D26846057402E00220694608746846E5 -:103310004570029801F080FB68468078002809D04B -:103320000198FEF7D7FA002801D0300000E028000D -:10333000C0B215E068464078002810D00020039005 -:103340000020029000200190002000903B0001220C -:103350006846017C6846007EFEF794FC00E0002091 -:1033600007B0F0BD08130028AD1C0028AF1C0028D2 -:10337000ACDC0010F01B0028FEB5C0B20400FDF765 -:10338000C9FE019010E0FFB2002F46D0FDF7C2FE4B -:103390000199401A9349884241D234480078002864 -:1033A00001D001F05DFF30BFFEF7E6FF02F013F839 -:1033B00001F02EFB009084256D002B4E2000684309 -:1033C00030189521475C8848007800281AD12000E1 -:1033D00068433018FDF7A5F8002813D02000684393 -:1033E00030187E21405C00280CD120006843301842 -:1033F0009421405C002805D1654370198221405C0E -:10340000002801D0012500E00025009801F004FB10 -:10341000EDB2002DB7D0002002E0012000E0002036 -:10342000FEBD0000FBB51700089C0299002901D1E0 -:10343000002C18D0060001F0EBFA842252006B4BEE -:10344000310051435D58564399194E6801F0E4FA32 -:103450000298002803D00198281A02990860002CCD -:1034600001D0F01B2060F7BD08130028B41C002811 -:10347000F9B585B00D0016006846047D0698002851 -:1034800002D00020069908606846007DFFF774FFAF -:10349000002801D10120A2E02F0001F0B9FA0500B7 -:1034A00030000021FA229200002301F00DF8020002 -:1034B0000B00B348002180185941FA22D2000023A2 -:1034C00000F00FFD49498422520062438918886147 -:1034D000280001F0A1FA00200390002002900120B2 -:1034E000019001200090002300223900C9B26846F3 -:1034F000007DFEF7C7FB002801D001206FE001F03E -:1035000087FA3A498422520062438918C96A0191B4 -:1035100001F082FA0FE0FFB2002F4FD1EDB2002D83 -:1035200002D1F6B2002E49D0D0480078002801D050 -:1035300001F096FE30BFFEF71FFF01F04CFF01F0D7 -:1035400067FA84225200294B2100514359184968D7 -:10355000009121005143591883254F5D21005143AB -:1035600059187E254D5D6243991894228E5C01F0B6 -:1035700053FA00980199401A0428CCD36846007D7C -:10358000FFF79BF8002805D16846007DFFF7F4FEA1 -:10359000002809D1069800900023019A00212000FC -:1035A000FFF740FF01201AE0069800900023019ADF -:1035B00000212000FFF736FF002010E06846007D64 -:1035C000FFF77BF86846007DFFF7D6FE069800906F -:1035D0000023019A00212000FFF724FF012007B0FB -:1035E000F0BD0000C4090000AF1C0028081300282B -:1035F000F1B586B00E0015006846047E3000C0B2FA -:10360000022803D102206946087402E003206946BB -:10361000087405930598002802D0002005990860D9 -:103620000C98002802D000200C9908606846007EA3 -:10363000FFF7A2FE002801D1012014E12F0001F0C4 -:10364000E7F9050038000021FA229200002300F07B -:103650003BFF02000B004A48002180185941FA2222 -:10366000D200002300F03DFC9D49842252006243B9 -:1036700089188861280001F0CFF90020039000200C -:1036800002900120019001200090002300223100CF -:10369000C9B26846007EFEF7F5FA002801D0012085 -:1036A000E1E001F0B5F984256D008D4E21006943FC -:1036B0007118896A0291210069437118C96A0191E0 -:1036C00001F0AAF913E068464078002800D0B9E07C -:1036D00068460078002803D1FFB2002F00D1B1E086 -:1036E00062480078002801D001F0BAFD30BFFEF733 -:1036F00043FE01F070FE01F08BF92100694371185F -:103700008322895C6A4651702100694371187E22C8 -:10371000895C6A46117021006943711894228F5C9C -:103720002100694371189522895C6A46917001F005 -:1037300073F9684640786946097C8842C3D1684677 -:1037400000780028BFD13800C0B20028BBD168463D -:103750008078002816D06846007EFFF70DFE00280E -:1037600010D16846007EFEF7A8FF0C980090059BDC -:10377000019A02992000FFF755FE012073E000BF77 -:10378000CF07000001F044F907002000684330181B -:103790008321405C6946097C88421FD12000684330 -:1037A00030187E21405C002818D120006843301872 -:1037B0009421405C002811D12000684330189521E5 -:1037C000405C00280AD1200068433018FCF7A9FEAD -:1037D000002803D043480078002810D0380001F0BA -:1037E0001BF96846007EFEF768FF0C980090059B69 -:1037F000019A02992000FFF715FE012033E0200016 -:1038000068433058039020006843301840680090A7 -:1038100000206C4331198B228854380001F0FCF8E9 -:103820000598002804D003980299401A0599086069 -:103830000C98002804D000980199401A0C9908604F -:10384000002010E06846007EFEF737FF6846007EE5 -:10385000FFF792FD0C980090059B019A02992000B9 -:10386000FFF7E0FD012007B0F0BD0000B41C002808 -:10387000F2B582B01C4980010818806A00216A46AE -:1038800003C2083A64240025684603C84622002380 -:1038900000F01AFE22002B0000F023FB06000F00B0 -:1038A000684603C88222002300F00EFE22002B008F -:1038B00000F017FB029A082A0FD3029A0023BB429A -:1038C0000BD301D8B24208D3029A0023994204D301 -:1038D00001D8904201D3012000E00020C0B2FEBD1B -:1038E00008130028AF1C0028ACDC0010F9B58FB01D -:1038F0000F0016000FA80478002004900020079005 -:1039000000200A90002000200020002009900020C4 -:10391000089032206946487301250020002069463E -:103920000871002069460875002005A9487000202C -:1039300006902448007800281FD00FA80078FCF7D4 -:10394000DDFD002819D020480078002815D11F4837 -:103950000078002811D10296029800280DD0684600 -:1039600007736846007B002811D06846007B012859 -:103970000DD06846007B022809D01098002804D09A -:1039800005A803C8109A03C2083A012012E201F008 -:103990003FF8009084277F000D4E200078433018B8 -:1039A000FCF7BFFD002815D1009801F035F81098FC -:1039B000002804D005A803C8109A03C2083A0120C1 -:1039C000F8E100BFAD1C0028B01C0028AF1C002887 -:1039D00008130028200078433018C0680B90009826 -:1039E00001F01AF80FA80078FEF767FE002800D053 -:1039F00095E16846007B002860D107A8009004ABE1 -:103A0000029A02210FA80078FFF7F2FD05002800B6 -:103A1000C0B200282BD10798042828D20AAB029AFA -:103A200001210FA80078FFF723FD05002800C0B290 -:103A300000281CD107A8009004AB029A02210FA80D -:103A40000078FFF7D5FD05002800C0B200280ED190 -:103A5000079800210022401C514102000B000A98E7 -:103A600000218B4203D801D3824200D201252800D5 -:103A7000C0B2002820D100F0CBFF00902000784396 -:103A80003018FCF74EFD002804D1009800F0C4FF68 -:103A9000012544E100212000784330188160012194 -:103AA00020007843301889228154009800F0B4FF38 -:103AB00001206946087521E101251FE16846007B68 -:103AC000012830D10020009004AB029A01210FA8F8 -:103AD0000078FFF78DFD05002800C0B2002820D136 -:103AE00000F096FF0090200078433018FCF719FD95 -:103AF000002804D1009800F08FFF01250FE10B99F9 -:103B0000200078433018816001212000784330186C -:103B100089228154009800F07FFF012005A9487098 -:103B2000ECE00125EAE0002000900023029A022147 -:103B30000FA80078FFF75CFD05002800C0B2002840 -:103B400028D100F065FF0500200078433018FCF70D -:103B5000E8FC002804D1280000F05EFF0125DEE02B -:103B6000002120007843301881602000784330180D -:103B700089228154280000F04FFF01206946087512 -:103B80000020009004AB029A01210FA80078FFF7F3 -:103B90002FFD05002800C0B2002800D0ADE0049938 -:103BA0002000FFF765FE002800D1A6E000F030FFFE -:103BB00021007943711883225200895C6A4691730F -:103BC000210079437118A42289580D91210079436D -:103BD0007118A82289580C9100F01EFF6846807B5E -:103BE00000280ED003A8401C029008A8019009A844 -:103BF00000900C9B0D9A04992000FCF7EFFC69469D -:103C0000087100F005FF0090200078433018FCF7A1 -:103C100088FC002804D1009800F0FEFE01257EE01B -:103C20000499200078433018C1600499200078433B -:103C30003018816001212000784330188922815496 -:103C40006846807B00284FD06846007900281FD046 -:103C50000999200078433018AC228150089920003F -:103C600078433018B02281506846417B2000784369 -:103C70003018F22281546846417B20007843301886 -:103C8000F3228154200078433018FCF78DFC2BE0A0 -:103C900000210A0020007843301883235B00C254BF -:103CA000200078433018A422815020007843301837 -:103CB000A8228150200078433018AC228150200087 -:103CC00078433018B0228150200078433018B42255 -:103CD00081503221200078433018F2228154200094 -:103CE00078433018F3228154009800F095FE0120AB -:103CF00005A948700498069000E001252800C0B28C -:103D000000280CD16846007B022808D000F080FE15 -:103D1000210079437118C968069100F07DFE2800E2 -:103D2000C0B200283CD034480078002803D10FA846 -:103D30000078FEF7C2FC00F06BFE00906846007B46 -:103D4000022808D16846007D002804D0049920008C -:103D50007843301881600B99200078433018C16097 -:103D600000210A002000784330188923C2540A0039 -:103D70002000784330188B23C25420007843301839 -:103D8000962281541C480078002801D0072000E0CA -:103D900008207C43311983228854009800F03CFEAF -:103DA0001098002804D005A803C8109A03C2083A46 -:103DB0002800C0B211B0F0BD38B500200F4908701E -:103DC000FDF726FAFDF7C4FAFDF7F0FB050000F059 -:103DD00096FC0400FDF7A6F9EDB2002D06D0E4B282 -:103DE000002C03D0FCF7D2FC002803D1FDF794FC93 -:103DF000012000E0002032BDAF1C0028B01C0028CC -:103E0000D021890040587047C22189004058C00520 -:103E1000C00D704790229200815070478221890026 -:103E20004058C005C00D704700B50068800B800782 -:103E3000800F002801D1802000E0402000BD00B5A7 -:103E4000C02189004058C006C00E082801D20120B8 -:103E500000E00020C0B200BDF8B504000D0016005F -:103E60002000FFF7ECFF002809D02F000025B54205 -:103E700010D22000FFF7C4FF78556D1CF7E72F0024 -:103E8000002505E02000FFF7BBFF690078526D1C9C -:103E9000B542F7D3F1BDF8B507000D0016003800A4 -:103EA000FFF7B2FF0400A64200D23400290022002E -:103EB0003800FFF7D1FF2000F2BDF8B505000C0077 -:103EC00000262800FFF7B0FF07002800FFF7A6FF35 -:103ED000874204D021002800FFF79CFF0126300014 -:103EE000F2BD12422DD0994231D970B500251B4246 -:103EF00009D00C00002112E0110000F0F7F80A00D0 -:103F00000021002370BD0942F6D000240126491883 -:103F10006441944200D3A41A7641F8D331000126BB -:103F200001E0764109D2001864416D41A41A9D4117 -:103F3000F7D2A4185D41B619F5D3300022002B004A -:103F400070BD1B42CFD108B502F0D2FD08BD01D132 -:103F50009042CAD202000B000021002070470000EE -:103F600070B55F4BC018C00900015E4BC31804292F -:103F70000CD21F251C68CE002800B0408443D2B26A -:103F80001540C800854025431D600CE0FC311F250D -:103F90005C68CE002800B0408443D2B21540C8000F -:103FA000854025435D6070BD00B5002A03D1012224 -:103FB0008A40426002E001228A40826000BD30B443 -:103FC00003008C000F25596C2800A0408143154048 -:103FD000A5400D435D6430BC704730B4030001253B -:103FE0009C6C28008840844315408D4025439D6487 -:103FF00030BC704730B403000125DC6C28008840D9 -:10400000844315408D402543DD6430BC704730B497 -:1040100003004C0010340325D96C2800A0408143D4 -:104020001540A5400D43DD6430BC70474269012254 -:104030008A4042614069704730B4030001259C69A1 -:1040400028008840844315408D4025439D6130BC45 -:10405000704730B403004C000325196C2800A040C1 -:1040600081431540A5400D431D6430BC7047F8B531 -:1040700004000025002C30D01600002E2DD00F009B -:10408000326839002000FFF78FFF327A39002000B4 -:10409000FFF766FF726939002000FFF79EFFB269E3 -:1040A00039002000FFF7A6FFF26939002000FFF772 -:1040B000AEFF726839002000FFF781FFF268390017 -:1040C0002000FFF7C6FF39002000FFF7AFFF32697D -:1040D00039002000FFF7B0FF00E0034D2800F2BDDB -:1040E0000000CFBF0000304001005A000022030A48 -:1040F0008B420BD203098B4219D243088B422ED23A -:10410000411A00D20146524110467047FF2209026F -:104110003FD012068B4205D3121209028B4201D303 -:104120001212090203098B4219D300E0090AC309DC -:104130008B4201D3CB01C01A524183098B4201D378 -:104140008B01C01A524143098B4201D34B01C01A63 -:10415000524103098B4201D30B01C01A5241C308DB -:104160008B4201D3CB00C01A524183088B4201D34A -:104170008B00C01A524143088B4201D34B00C01A36 -:104180005241884200D3401A5241CFD201461046D4 -:10419000704708B502F0AEFC08BD0000F8B5012379 -:1041A0001A00002800D151E1002900D14EE1A84AAF -:1041B00012680C7AA74D1540A4048022D202144044 -:1041C0002C430322CE681640A34D25403604C0245C -:1041D000A40234402C430D786E07760F9F4D254086 -:1041E0003606E024E40434402C438E789C4D254070 -:1041F000B4078026F60534402C4328254D5D012662 -:10420000B4431D40254334240C5D0226B5436400AD -:10421000022634402C430D7F0426B443AD0004260F -:10422000354025434C7F0826B543E400082634403A -:104230002C4340254E5D1E408A4D2540B402802609 -:10424000F60034402C4340254D5DEDB26D081E0054 -:104250002E40F6B2844D254074028026B6003440CC -:104260002C4370254E5D814D25403402802676001A -:1042700034402C4371254E5D16407D4D254036035C -:10428000C024A40134402C4304600C7A002C02D1D9 -:104290000023836006E00C7A012C02D14B69836015 -:1042A00000E083600B6A03614B6A4361CB6A836100 -:1042B0000B6BC3614B6903628B6943626D4B1C6876 -:1042C0004423CB5CDBB2FF25AC4323434C240C5D81 -:1042D000E4B2694D1D402404FF231B0423402B43FB -:1042E0005C240C5DE4B21D022D0A23062B436C24D2 -:1042F0000C5DE4B2614D1D402402FF231B022340EC -:104300002B4343645E4B1B6864240C5DE4B25B4D3D -:104310001D402402FF231B0223402B4354240C5D29 -:10432000E4B2FF25AB431C438464564B1C68412315 -:10433000CB5C13400325AC43234360240C5D144045 -:10434000514E1E40A302C0252D011D403543482378 -:10435000CE5C16403023DB4330241D40370127401C -:104360002F4350254D5D1540484E3E402F02C0253D -:10437000AD003D40354358268E5D1640C027BD43F5 -:10438000B701C0263E402E4368254D5D15400C27E1 -:10439000BE43AF000C253D403543C5643C4D2D6800 -:1043A00007267227CF5D374000970727BD432F00B0 -:1043B000009D3D437327CF5D3E407027BD433701CD -:1043C00070263E402E43466535254D5D8567314D4F -:1043D0002D680E7C16400327BD432E43CD7C15402F -:1043E000C027BE43AF01C0253D4035434E7C16403B -:1043F0000C27BD43B7000C263E402E438D7C2A403F -:104400003340120114401C430465234A1268CB88D0 -:1044100094B21A0422438B889BB21B0A9BB2174C9E -:1044200014401B02FF2212021A4022430B78052B74 -:1044300005D10979C9B2FF239A43114304E04978B1 -:10444000FF239A43C9B21143016300221000F2BD59 -:1044500080E90010FFFFFBFFFFFFFCFFFFFFFFF8FD -:10446000FFFFFFBFFFFBFFFFFFFDFFFFFFFEFFFFA3 -:10447000FFCFFFFF84E90010FFFF00FFFF00FFFFF9 -:1044800088E900108CE90010FFF3FFFFFFFCFFFF3D -:1044900090E9001094E9001098E90010016880226A -:1044A00012060A430260704701684900490801602A -:1044B00070474068704701617047006970478160CC -:1044C0007047006A7047000030B4434351435D18A1 -:1044D000010C0C00130C5C432D1980B2434392B2C3 -:1044E00051430024C918644124040B04090C091920 -:1044F0005043C018694130BC7047000000B5022825 -:1045000001D301200FE00B00DBB2042B01DB012003 -:1045100009E0BE4B80001818C9B2405C824201D34A -:10452000012000E0002000BDF8B504001F00022CAF -:1045300001D3012023E015000E002A003100C9B28A -:104540002000FFF7DBFF012801D1012017E0300038 -:10455000C0B2002816D1FF2F12D8AD486103401811 -:10456000A90040188021490140180168A94A0A4061 -:104570003902FF231B020B40134303600020F2BDEE -:104580000120FCE7F6B2012E16D1802040028742BE -:1045900010D29F4861034018A9004018A02149018A -:1045A000401801689C4A0A403902C94B0B4013432A -:1045B0000360E3E70120E2E70120E0E700B2001238 -:1045C000C0B27047F8B505000F001600280000B211 -:1045D000FFF7F4FF04002000C0B2022801D301203D -:1045E0002CE032003900C9B22000C0B2FFF786FFCC -:1045F000012801D1012021E085482100C9B24903E9 -:1046000041182A00D2B292008918C02212018A5899 -:10461000B0491140FFB23B02C02292001A400A4347 -:10462000FF218A43F1B21143E4B262038018EDB274 -:10463000AA008018C022120181500020F2BD70B57E -:104640000400022C01D3012028E015000E002A00EE -:104650003100C9B22000FFF751FF012801D101202C -:104660001CE06B4861034158802212060A43C021B6 -:1046700089041143FF2212040A43964B1340F6B2F9 -:104680003202C021890011401943FF229143EAB24E -:104690000A436103425061034058002070BD70B569 -:1046A0000400022C01D3012028E015000E002A008E -:1046B0003100C9B22000FFF721FF012801D10120FC -:1046C0001CE05348610341588022D2050A43C021AF -:1046D00089041143FF2212040A437E4B1340F6B2B1 -:1046E0003202C021890011401943FF229143EAB2EE -:1046F0000A436103425061034058002070BDF8B581 -:1047000098B00BA8342102F007FA9A4803C801AA0E -:1047100003C2083A03A8A549202200F0E5FAAA48F6 -:104720000078002801D001206DE000252C0007E072 -:104730002800A649620088522800A5490855641C33 -:10474000062C14D2A348142161434118097A0BAAFC -:1047500011720BAA14216143411849681423634361 -:10476000C058FFF784FC0028E2D000204BE06846E8 -:1047700000F0B2F8002801D1002044E000980021A8 -:10478000962292000023FFF79FFE934A00231218FF -:104790004B4110001900914A0023FFF7A2FB0028AB -:1047A00000D1012003AFB8818D4E300002F032FA03 -:1047B00001A9300002F0CAF9002801D0002022E04F -:1047C0002C0006E0142060432818C06802F020FB8B -:1047D000641C062C13D27F4D142060432818007CE3 -:1047E000787103A9142060432818C06802F016FAF3 -:1047F0000028E7D0300002F00DFA002003E001208D -:1048000071490870012019B0F0BD000098E800104F -:1048100000000440FF00FFFFFF0000FFF8B584B078 -:104820000E00C0B2029000252800694608800421CD -:104830002A0003AC200002F05FF92C0062480078E7 -:10484000002806D0674F3878002802D10298062841 -:1048500001D3002039E0012038705E48029914220B -:1048600051434018C0680190019800F0A1F80198E8 -:1048700002F0DAFA019800F07FF800281FD003AAAE -:104880006946019802F0D6FA002818D103A8C0782A -:10489000002814D0684600880005000D694608808D -:1048A000684600884949029A5200885201244848C3 -:1048B00002994454002E02D0684600883080019846 -:1048C00000F076F83D702000C0B205B0F0BD0000E9 -:1048D00000FFFF00FFFCFFFFF8B50700002000907D -:1048E000FF262C363000FFF769FE0500002F04D0AC -:1048F000684602F0AFFF002801D0002038E00098A1 -:10490000394940183949FFF7F1FB0400002C02D067 -:104910003748844201D300202AE0042201212800E4 -:10492000FFF7BDFE002801D0002021E00422012174 -:104930003000FFF747FE002801D0002018E0631E7A -:10494000042201212800FFF7EFFD002801D00020FC -:104950000EE0042201212800FFF771FE002801D09B -:10496000002005E000982100FFF7C0FB386001201F -:10497000F2BD000070E800107CB505001D4C06215A -:1049800000226E46300002F0B7F86946280002F0B7 -:104990003DFB68460078002803D1641E002CF4D14A -:1049A00001E0012000E0002076BD00008CE6001050 -:1049B000E0B511490CC9083969460CC10839694686 -:1049C00002F0CEFA07BD0000A31C0028901B0028AF -:1049D000A81B0028A4DF0010FFC99A3B00CA9A3B1D -:1049E00000109040A41C00285F8DCB00608DCB0090 -:1049F00001000100A086010078E80010000000001E -:104A0000801C800803D0401C801EFCD100BF704772 -:104A1000EFF3108072B6704780F310887047403013 -:104A2000016810220A430260704740300168082282 -:104A30000A43026070470000F8B5012422004C23AD -:104A4000CB5C052B03D24D23CB5C052B01D310008F -:104A5000E2E0002800D1DEE0002900D1DBE06F4A6F -:104A600012684B7923406E4D15409B048022D20280 -:104A700013402B4303228D7915406A4E1E402B04B0 -:104A8000C025AD021D40354307230E7A1E40664FF8 -:104A90002F403606E025ED0435403D43CE79634F87 -:104AA0002F40B5078026F60535403D430E7D012792 -:104AB000BD4326402E4324254D5D0227BE436D0095 -:104AC00002273D40354305600D79060030360096DB -:104AD000009E3668FF27BE43EDB23543009E356029 -:104AE0004D79012D0BD18C79002C02D100248460EA -:104AF00006E08C79012C03D10C68846000E08460AE -:104B0000CC6804610C694461CC6984610C6AC4613D -:104B10000C680462464C25680C7EE4B2FF26B5435F -:104B20002C4330254D5DEEB2424D25403604FF2426 -:104B3000240434402C4340254D5DEDB22402240A68 -:104B40002E06264348240C5DE7B2FF2424023A4D8A -:104B50002E403F02274037434764384E3668382797 -:104B6000CF5DFFB20097FF27BE43009F3743282643 -:104B70008E5DF6B23D40360234402C438464304CA6 -:104B800025688C7D14400326B5432C4325254E5DB6 -:104B900016402C4D2540B602C024240134402C433D -:104BA0002C254D5D15403026B4432E01302535406F -:104BB000254334240C5D1440234E2E402502C0248E -:104BC000A4002C4034433C254D5D1540C026B44321 -:104BD000AE01C0253540254344240C5D22400C2401 -:104BE000A54394000C2222402A43C264174A146849 -:104BF0004C228A5C1A400725AC4322434D240C5DAD -:104C000023407024A2431C017023234013434365B7 -:104C1000497D816700221000F2BD00006CE90010A0 -:104C2000FFFFFBFFFFFFFCFFFFFFFFF8FFFFFFBFE2 -:104C300070E90010FFFF00FFFF00FFFF74E90010A4 -:104C400078E90010FFF3FFFFFFFCFFFF7CE9001095 -:104C50000168802212060A430260704778300168BA -:104C600001220A4302607047C16F0800C007C00FED -:104C70007047010070310A68012313430B60006F15 -:104C80007047000030B5010000221000134B1B6874 -:104C9000002914D08C786407640F0725AB431C43AC -:104CA0000B79002B01D00122FFE763005B08D207DC -:104CB0001A430B4B0024095F89005A5000E0064854 -:104CC00030BD00B5074A1368002B03D0126800B24C -:104CD0008000115000BD00000100560068E900107E -:104CE000008020402412002870B4103A03D378C901 -:104CF000103A78C0FBD2530701D318C918C001D5A8 -:104D000008C908C0D20704D30B880380891C801C03 -:104D1000002A01D50B78037070BC70478B0701D156 -:104D20008307E1D0124205D00B78491C0370401C68 -:104D3000521EF9D170470000F7B5AD4BAD4A15686A -:104D4000AD4A1668AD4A12680192AD4A12680092E7 -:104D5000002422002200002800D11EE10A00002ABF -:104D600000D11AE15168002901D1936805E051682A -:104D7000022901D1230000E0022311695769B942D9 -:104D800001D3116900E05169092909D29D492940DF -:104D90002125555D002D15D080256D000D4313E0B4 -:104DA000112905D2974F2F408021C9013943EFE7E0 -:104DB000212905D2934F2F40802109023943E7E78B -:104DC0008B48EBE0904D0D40D168491E0907090F53 -:104DD0000F27BD4329438D4D0D40802149042943B0 -:104DE0000160117F002901D0210000E0012101258F -:104DF0000127BE43294031430E005168090929406B -:104E00000227BE434900022739403143D67E10278E -:104E1000B943360110273E400E43517E2027BE4342 -:104E200049012027394031431668012E00D0250062 -:104E30004E007608E90731430425A9435D000426A6 -:104E400035400D4308218D43D900082319402943DB -:104E5000537F6D4D0D40190280235B00194029439B -:104E6000957F80239B006A4E0E40690219403143B2 -:104E7000D67F684D0D40B1028026F60031402943AF -:104E80002025565D644D2940F60280273F013E40B3 -:104E90000E4311798F07BF0F5C4931403F06C02692 -:104EA000B6043E400E430662167E009F56493940C6 -:104EB000360280277F003E400E43977E54493140A2 -:104EC0007E021E400E431169491EC906C90E1F27E6 -:104ED000BE433143C026B60081512421515CC9B282 -:104EE0000091C121890041180E68FF27BE43009F31 -:104EF00037430F60167E019F4349394036028027B1 -:104F00007F003E400E435169491EC906C90E1F2746 -:104F1000BE4331438026B60081512C21515CC9B279 -:104F200000918121890041180E68FF27BE43009F30 -:104F300037430F60116B1B4E8151916A184E81519E -:104F40003821515CF026360186190096009E37689C -:104F50002F4E3E4049020B40334300990B603921EC -:104F6000515CF4221201821813681D40C90280238B -:104F70001B011940294311600B4944500298002835 -:104F80000AD002980460029884610298C460029872 -:104F9000C46126480299086223001800FEBD000083 -:104FA000C80F0000880F0000C80E00001B490160F8 -:104FB000C02189040162FF220832C02189004250C9 -:104FC0000021C1239B00C15080239B00C25081223D -:104FD00092008150124A8150154A8150114A8150E5 -:104FE000114A8150134A8150134A81507047000082 -:104FF0000140AA0050E9001054E9001058E90010DF -:105000005CE90010FF3FFFFFFFFEFFFFFFFFFFFC1B -:10501000FFFDFFFFFFFBFFFFFFF7FFFF0F00000398 -:10502000C80E0000C80F0000880F0000EFCDAB00D5 -:10503000880E0000080F0000480F0000F8B50400BB -:105040000D00334F387800280ED02D4E18222D49F0 -:10505000300002F049FC0020F075CF2040002A49C2 -:105060000860002002F0A0FC2000290001223A7014 -:1050700080225204002399420AD301D8904207D3D8 -:10508000244A04000D0024A003C80019694102E06D -:105090000200002000211D4B00241C60204D2A60CE -:1050A000214A146005221A601A68D203FCD51C60DC -:1050B0000029DDD10028DBD13C70F1BD70B50500C1 -:1050C000184E306800280ED10D4C18220D492000D2 -:1050D00002F00AFC0020E075E52040000A49086063 -:1050E000002002F061FC2C0030681049FEF7FEFF42 -:1050F000002122000023FFF7E7F9FFF79FFF70BDB3 -:10510000181B002804E30010E81B002810E000E052 -:10511000AA1C0028FFFFFF00010000FFFFFFFFFFA8 -:1051200014E000E0841C002818E000E040420F007A -:1051300043490A680860704742490A680860704736 -:1051400041490A680860704740490A6801239A4348 -:10515000C0B20300DB07DB0F13430B6070473B4912 -:105160000A6810239A43C0B200011023184010436C -:105170000860704735490A68354B1340C0B20002D9 -:10518000802252001040184308607047314801687F -:1051900001220A430260704710B5FFF739FC040092 -:1051A00000F024F80020FFF7C3FFFA20C001FFF74A -:1051B000C3FF0020FFF7C4FF0020FFF7C5FF012059 -:1051C000FFF7CDFF0020FFF7D5FF00F004F8200027 -:1051D000FFF722FC10BD80B5FFF71AFC1E490A68D4 -:1051E000032313430B60FFF717FC01BD80B5FFF7E6 -:1051F0000FFC19490A6803239A43012313430B60E8 -:105200000A6803239A43022313430B60FFF704FC4D -:1052100001BD80B5FFF7EAFF104801688022120641 -:105220000A430260FFF7D7FF01BD80B5FFF7DEFF3D -:105230000A480168490049080160FFF7CCFF01BD39 -:1052400004C0264008C026400CC0264010C026409E -:10525000FFFEFFFF44C0264040C0264000C026405D -:1052600080B5FFF7C3FFFFF791FFFFF7B4FF01BD64 -:1052700070B53021002422008B4D280001F03CFC49 -:10528000E0212200894D280001F036FC042631007F -:105290002200874D280001F02FFC2200854D3100AF -:1052A000280001F029FC200083490870A44804600C -:1052B00002F0E4FD03F032FB03F0C6FE04F072F8E6 -:1052C000002809D004F071F8002805D003F040FF51 -:1052D000002801D103F0B0FF04F028FB002804D11E -:1052E000062004F0D3FD002016E0FDF7C3FC95492D -:1052F0000860954908609549086095490860954996 -:1053000008600120054908700F21054A1170054AFF -:105310001170B7490870012070BD00000313002808 -:10532000041300280513002838B584B0B14800687C -:10533000002802D0022004F0A9FD04F0BAFD04F018 -:10534000CDFD00282BD003F0F7FB00280ED0AA4893 -:10535000008803F0D7FB012457480470FDF78AFC4E -:10536000A649401876490860B4480470002001003E -:1053700008E002004C4B0C00E4B20C256C431B19F6 -:105380009A72491C0A00D2B2042AF2D39C490870CE -:105390000120AB49087002E0684600F0B9FB68469E -:1053A00004F00CFB002808D00098C0218900884236 -:1053B000F2D0684604F0E8FDF1E700F073FE02F079 -:1053C0005BFE03F00AFB00F0CCFE00F00FFF01F0E3 -:1053D00069FA05B030BDF8B502E0684600F098FB08 -:1053E000684604F0EBFA002808D00098C021890034 -:1053F0008842F2D0684604F0C7FDF1E77D480068B6 -:10540000002802D0022004F041FD04F052FD00F01B -:10541000A8FE01F047FA05B000BDF1B503F08CFB22 -:1054200007006846008803F06DFB68460088FDF7BA -:10543000F1F8FCF7A1FF0026340018E02000C0B20C -:1054400000F071F80500684601882800C0B2FCF73A -:10545000FAFF684601882800C0B202F019FD124820 -:105460002100C9B20C22514340188672641C2000EE -:10547000C0B20428E2D3624806700F207149087058 -:105480007149087001206E49087059490870FFB2CF -:10549000002F07D008490870FDF7ECFB574940186A -:1054A00027490860F1BD0000AC1A0028181900282F -:1054B000601C0028681C0028C81C002800B5401A81 -:1054C000002801D4012000E00020C0B200BD00B5DA -:1054D000401A00B2012801DB012000E00020C0B228 -:1054E00000BD00B500281BD0002919D002780B7828 -:1054F0009A4215D142784B789A4211D182788B78B2 -:105500009A420DD182888B889A4209D1C288CB8871 -:105510009A4205D100890989884201D1012000E021 -:105520000020C0B200BD00B50100C9B2042903D2F9 -:105530004649C0B2085C00E00420C0B200BD0000D3 -:10554000641C00286C1C0028701C0028741C002897 -:10555000781C00287C1C002810B50C000100C9B282 -:10556000042901D2002C01D1002006E0C0B2FFF7CF -:10557000DAFF2100C0B203F06DF910BD00B50028BC -:1055800002D04178042901D3002013E001780A29D0 -:1055900002D001780B2904D10189FA208000484308 -:1055A00008E00189002901D0008903E028494078FA -:1055B0008000085800BD00B5002802D041780429B9 -:1055C00001D3002012E00178032903D0214940785B -:1055D000085C0BE00089401D0A21FEF787FD322898 -:1055E00000D23220602800D35F20C0B200BD00008E -:1055F00006130028DC1B00289E1C0028B80B0000A6 -:10560000C41C002800B5144B1870144B1970002AE4 -:1056100005D01178124B19709188124A1180C0B2CE -:10562000002803D001209C49087002E000209A491C -:10563000087001200249087000BD00000613002810 -:10564000031300280413002805130028A8E90010FC -:1056500044E80010ACE90010C11C0028C21C00285E -:10566000C31C00289E1C0028F8B50500002D05D09D -:105670000C00002C02D01600002E01D1002039E0D1 -:105680000A2100222700380001F036FA68682070ED -:105690006868000A03210A00024062700200D2B268 -:1056A00092080A40A2706A68120CA280AA68E2807E -:1056B000AA68120C22812A68C0239B009A4202D158 -:1056C0002A7B082A03D001203070002012E0F0224B -:1056D0000240102A03D00220307000200AE0207817 -:1056E000401E022802D9C01F072801D8012001E06E -:1056F00031700020F2BD00B5002801D0002901D191 -:10570000002054E04278042A03D3042008700020CB -:105710004DE00278092A05D002780E2A02D00278DC -:105720000F2A06D14278002A03D0042008700020F6 -:105730003DE00278032A09D18278012A0DD08278CF -:10574000022A0AD005200870002030E08278002A62 -:1057500003D005200870002029E00278521E13D0E3 -:10576000521E25D0521E37D0521F012A44D9921EF4 -:105770004DD0521E59D0521E3ED0521E63D0521EE2 -:105780006DD0521E79D083E0C2887C4B9A4207D2FA -:105790000289002A08D000896438794A904203D3EC -:1057A00006200870002002E000200870012000BDE3 -:1057B000C28812B2734BD218734B9A4207D2028935 -:1057C000002A08D0008964386D4A904203D306202D -:1057D00008700020EBE7E7E7C288643A684B9A421A -:1057E00005D20089694A8018694A904203D306208D -:1057F00008700020DBE7D7E7C288002A02D10089C1 -:10580000002803D0062008700020D0E7CCE7C2882B -:10581000AE4B9A4204D100890A38AD4A904203D374 -:10582000062008700020C2E7BEE7C288A94B9A4252 -:1058300004D100890A38A64A904203D30620087092 -:105840000020B4E7B0E7C288A34B9A4202D1008996 -:10585000002803D0062008700020A8E7A4E7C2882B -:10586000012A02D0C288022A02D10089002803D06E -:105870000620087000209AE796E7C288002A02D125 -:105880000089002803D00620087000208FE78BE7EE -:105890000320087000208AE7C71C002800B501001B -:1058A000C9B2012902D0C0B2022801D1012000E012 -:1058B0000020C0B200BD10B504002000C0B2FFF748 -:1058C000EDFF00280AD12000C0B2032806D0200036 -:1058D000C0B20A2802D0E4B20B2C01D1012000E0B2 -:1058E0000020C0B210BD80B58EB00100C9B204293D -:1058F00008D27A490200D2B20C235A438918897A15 -:10590000002901D001200EE06946C0B2FFF724FE55 -:10591000002806D068463221405C002801D00120D2 -:1059200000E00020C0B20FB000BD00B56C480078A8 -:10593000002801D0012000E00020C0B200BD38B531 -:105940008EB067480478002510E069462800C0B290 -:10595000FFF702FE002808D068463221405C00288C -:1059600003D020000124AC4004436D1C2800C0B2C9 -:105970000428EAD32000C0B20FB030BD11270000C8 -:10598000FDE9000010270000214E0000D4FEFFFFBB -:10599000BD02000038B58EB000252C0018E0694625 -:1059A0002800C0B2FFF7D8FD002810D06846417823 -:1059B000042908D04178072905D04178082902D068 -:1059C0004078092803D120000124AC4004436D1C19 -:1059D0002800C0B20428E2D3FCF732FD002802D030 -:1059E00020000F2404432000C0B20FB030BD38B5F2 -:1059F0008EB000252C0010E069462800C0B2FFF7E9 -:105A0000ABFD002808D068463421405C002803D054 -:105A100020000124AC4004436D1C2800C0B20428BF -:105A2000EAD32000C0B20FB030BD80B5FFF787FFCA -:105A30000100002005E00A00D207D20F8018C9B289 -:105A400049080A00D2B2002AF5D1C0B202BD10B591 -:105A50008EB0002418E069462000C0B2FFF77CFD3C -:105A6000002810D068463221415C00290BD0017813 -:105A7000052926D00178062923D00178072920D0CE -:105A8000007808281DD0641C2000C0B204281AD257 -:105A900012482100C9B20C2251434118897A0029C9 -:105AA000D9D02100C9B20C225143415C0A2906D049 -:105AB0002100C9B20C225143405C0B28CBD10120FC -:105AC00002E0012000E000200EB010BD5AA5000049 -:105AD0004F020000524B00003CC30000AC1A0028EB -:105AE000C41C002810B5002400E0641C2000C0B2D3 -:105AF00004280AD22000C0B2FFF715FDC0B2FCF79F -:105B000068FF0028F1D0012000E0002010BD000057 -:105B100070B592B0012421006A461170AF490A683D -:105B2000521C0A606A4601A9FFF79EFD002805D0B5 -:105B3000694601A8FFF7DFFD00280AD1A8480168DF -:105B4000491C016001AA684601780220FFF75AFD4E -:105B5000BCE101AD2878092836D0A2480178002997 -:105B60001ED0A988A04A1288914219D19F48007876 -:105B700000280BD09E4901A8FFF7B3FC002805D0F0 -:105B800001AA00210320FFF73DFD08E094480168C9 -:105B9000491C016001AA08210220FFF733FD95E1AD -:105BA0000078002810D090480188A888FFF78FFC63 -:105BB000002809D18A480168491C016001AA08210E -:105BC0000220FFF71FFD81E12000864908702000B8 -:105BD00086490870A88884490880854801A94CC96D -:105BE0004CC00C390C38287809280CD1A888FFF74C -:105BF00014FC01AA00210420FFF704FDBB48016842 -:105C0000491C016062E128780F280CD1A888FFF7B1 -:105C100004FC01AA00210120FFF7F4FCB34801684D -:105C2000491C016052E12878082815D102F084FF50 -:105C3000002803D0A888FFF7F0FB03E0A988687864 -:105C400000F056F901AA00210120FFF7DBFCA7486C -:105C50000168491C016039E128780C2813D1687863 -:105C60008440C348017821430170C24801780C4345 -:105C7000047001AA00210120FFF7C4FC9B480168C1 -:105C8000491C016022E128780D283BD16878FFF794 -:105C90002AFE002809D0CA480168491C016001AAEF -:105CA00009210220FFF7AEFC10E104F017F90028EB -:105CB0000BD1FCF7C5FB002807D16878FFF733FC50 -:105CC000C0B202F09BFD002805D101AA0B210220E1 -:105CD000FFF798FCFAE0A64801786A782300934021 -:105CE0000B430370A34801786A7894400C43047016 -:105CF00001AA00210120FFF785FC7C480168491CAE -:105D00000160E3E004F0EAF8002805D001AA0B21C5 -:105D10000220FFF777FCD9E028780E286AD102F03C -:105D20000BFF002807D102F0DEF8002803D1FFF7AF -:105D3000FCFD002809D0A2480168491C016001AAA5 -:105D400009210220FFF75EFCC0E0FFF750FE0F289C -:105D50000CD003F02DFB002801D00D2100E007211D -:105D600001AAC9B20220FFF74DFCAFE004F086F8AB -:105D700003F069FA002808D1032004F087F801AA8B -:105D80000E210220FFF73EFCA0E020008D490870A4 -:105D9000FCF770FF8C494018C0490860A988E88862 -:105DA000C0B202F0C6FD002807D101AA0E210220D0 -:105DB000FFF728FCBA48047088E00F206C4908708F -:105DC0006C490870B648047001AA00210120FFF751 -:105DD00019FC46480168491C016077E0481C00280E -:105DE0004C1C0028C51C0028A01C0028C61C00282C -:105DF0009C1B002802F0A0FE002809D07048016812 -:105E0000491C016001AA09210220FFF7FBFB5DE0AC -:105E10002878FFF743FD00281DD004A96878FFF714 -:105E20009BFB002805D101AA0E210220FFF7EAFB07 -:105E30004CE004A83421405C00280CD103F0B8FAEF -:105E4000002801D00D2100E0072101AAC9B20220DB -:105E5000FFF7D8FB3AE0FFF7FAFD002809D05848D1 -:105E60000168491C016001AA09210220FFF7CAFB51 -:105E70002CE028780A2802D028780B2811D102F0CB -:105E800032F8002803D1FFF750FD002812D04C480B -:105E90000168491C016001AA09210220FFF7B2FB39 -:105EA00014E06878FFF71FFD002811D0A9886878F2 -:105EB00000F01EF801A800F05FF801AA00210120FF -:105EC000FFF7A0FB09480168491C016012B070BDD2 -:105ED000FFF7ABFD0428EDD339480168491C016088 -:105EE00001AA0A210220FFF78DFBEFE7541C0028CE -:105EF000F8B504002000C0B2042837D20F002000FB -:105F0000C0B2FFF710FB06000125390089B2280056 -:105F1000B040C0B2FCF72BFBFCF72EFA390089B277 -:105F20003000C0B2FCF78FFABFB239003000C0B207 -:105F300001F0AEFF0020AB492200D2B20C235A433D -:105F400089188872A8490A782800A04082430A70FC -:105F5000074801782A00A2400A43027005480178E8 -:105F60002A00A2400A430270BD480570F1BD00003E -:105F7000041300280513002838B501004C78994D0A -:105F80002000C0B20C22504328180A22FEF7C6FE99 -:105F9000012001002200D2B20C235A43AA189172A8 -:105FA00091490A780300A34013430B70AD490A7866 -:105FB0000300A34013430B70A949087031BD0000D2 -:105FC000501C0028C81C0028B80B0000F8B50400BD -:105FD0006078FFF7A8FA05002000FFF7CFFA070066 -:105FE0002000FFF7E8FA06002078FFF764FC00289D -:105FF00015D003F043FF03F026F9002804D1032055 -:1060000003F044FF002047E003F038FF01209649E9 -:106010000870FCF72FFE95494018954908602078D4 -:10602000012808D0022811D003281BD00A2824D028 -:106030000B2829D02FE0A08800903300DBB23A0073 -:10604000E1882800C0B202F093F925E0A088009012 -:106050003300DBB23A00E18809B22800C0B202F096 -:10606000C7F919E0A08800903300DBB2E288A1787C -:106070002800C0B202F0E4F90EE0A288390028003E -:10608000C0B202F01EFB07E0A28839002800C0B2AF -:1060900002F065FB00E00020F2BD0000641C002857 -:1060A00006130028F8B584B0FCF7E4FD009003F077 -:1060B00015FF002806D16F4801680098FFF7FEF928 -:1060C000002800D14BE0002000E0401C0100C9B2D4 -:1060D000042944D20326684F39780D183540414CC5 -:1060E0002900C9B20C2251436118897A0029ECD0E9 -:1060F00001A82900C9B20C22514361180A22FEF7F7 -:106100000DFE00202900C9B20C225143611888728B -:10611000012435490A782000A84082430A702800EB -:10612000401C06403E70009864305249086001A847 -:10613000FFF74CFF002804D101AA0E210220FFF72F -:1061400061FA484801782200AA400A4302704B488D -:1061500001782200AA400A4302704148047005B049 -:10616000F0BD38B58EB0002435E069462000C0B2DD -:10617000FFF7F2F900282DD0414D2000C0B2285C75 -:1061800000280AD03F482100C9B2382251434118A3 -:10619000684600F079F800281CD03A482100C9B2BE -:1061A00038225143401869463822FEF79DFD0120F0 -:1061B00001002200D2B2A9542A490A780300A34060 -:1061C00013430B702D490A780300A34013430B704F -:1061D00023490870641C2000C0B20428C5D30FB046 -:1061E00030BD0000AC1A0028C41C002838B51E4C75 -:1061F0002078002832D002F09FFC00282ED1FCF736 -:1062000039FD0500FFF791FB002807D101F06BFE77 -:10621000002803D1FFF766FC002804D01348281893 -:10622000134908601AE0124801682800FFF746F990 -:10623000002813D003F022FE03F03CF8002803D11D -:10624000032003F023FE09E003F018FE0020207075 -:106250000120034908700F200849087031BD000073 -:106260000313002804130028C81C0028B80B0000E2 -:10627000641C00286C1C0028C91C00280513002879 -:10628000601C00281819002800B502780B789A4283 -:1062900027D142784B789A4223D182788B789A42E0 -:1062A0001FD1C278CB789A421BD142684B689A4280 -:1062B00017D13022825C3023CB5C9A4211D132223A -:1062C000825C3223CB5C9A420BD13122825C312337 -:1062D000CB5C9A4205D13422805C3422895C8842AE -:1062E00001D0012000E00020C0B200BD00B5007860 -:1062F00000280FD0022811D00ED304280CD00FD3C1 -:1063000006280FD00ED308280CD00BD30A280DD0A6 -:106310000AD30DE000200CE001200AE0022008E092 -:10632000032006E0042004E0062002E0072000E04D -:10633000072000BD00B5407800280ED0022810D0FC -:106340000DD3042811D00ED3062812D00FD308285D -:1063500013D010D3092812D013E0002012E001203E -:1063600010E002200EE003200CE005200AE00420EB -:1063700008E0062006E0072004E0092002E00B20E8 -:1063800000E0092000BD7CB5FFF7D9FA0400FFF753 -:1063900001FB0500684602F0DCFB002805D06846DA -:1063A0004078032801D1012600E0002603F096FD85 -:1063B000002808D003F09CFD002801D1032000E054 -:1063C0000420C0B21BE0FFF742FB002801D00520EB -:1063D00015E0EDB2002D06D1F6B2002E03D103F088 -:1063E00087FD002801D0042009E0E4B2002C03D18D -:1063F00002F0A2FB002801D0022000E0012076BDBF -:10640000F8B584B0FFF79BFA69464871FFF7C2FA06 -:106410000400FFF7ECFA69460871FFF718FB6946BC -:10642000C87002A802F095FBC0B2002805D002A8EF -:106430004078032801D1012000E000202100C9B2EA -:1064400000290AD1C0B2002807D103F051FD00286D -:1064500003D102F0ADFF002801D0012500E00025A6 -:10646000934806780F273E40FFF78DFF0001304329 -:10647000694688708F480078694648708E48007871 -:106480006946087003F02AFD002801D0102600E0BC -:10649000002602F051FB002801D0202000E000205F -:1064A0006946C978002901D0402100E000216A46F0 -:1064B00052793A40164330430143E80108433C40D7 -:1064C000694609790A012243BB4909780F40D02364 -:1064D0003B43694689786C46647824020C43B7498B -:1064E0000988090421436C462478C0B20002204385 -:1064F000D2B214040443DBB21A062243B04803F0BC -:106500009DFA05B0F0BDF1B594B0AE4814A9097874 -:106510000C2251434018019006A914A80078FFF7F7 -:106520001BF8002801D10020C0E006A8FFF7DEFE1E -:10653000040006A8FFF7FEFE070006A8C07869461B -:10654000087006A83221405C002803D006A830213C -:10655000455C00E00025079869464880994814A9E1 -:1065600009780C2251434018807A002817D00198EE -:1065700000780A2803D0019800780B2801D1042460 -:1065800000E001240127019880786946087001988D -:106590008088694648800198FFF70DF8050006AE2F -:1065A0003220305C002808D1864814A909780C22D2 -:1065B00051434018807A002802D00420059001E061 -:1065C000002005903420305C002802D00820049080 -:1065D00001E0002004903420305C002805D00998A8 -:1065E000002802D11020039001E000200390342005 -:1065F000305C002809D00A98002806D009980A992A -:10660000884202D32020029001E00020029070789E -:10661000042802D14020019001E000200190707810 -:10662000072803D0FBF70CFF002801D0802000E0F2 -:106630000020694609788907890F059A0A43049959 -:106640001143039A0A4302991143019A0A431043E2 -:106650003421715C002907D00D998C4A914201D3F5 -:106660008B4A02E00D9A00E08A4A14A90978E4B244 -:1066700023071B0FFFB23C01F02626401E433302C6 -:106680000B43C0B200041843694649880906014318 -:106690006846408880B2000A80B292B21302034377 -:1066A000EDB22A061A437C4803F0C8F915B0F0BDD4 -:1066B000C11C0028C21C0028C31C0028F1B590B0E2 -:1066C00001A910A80078FEF747FF002801D100209B -:1066D00070E0802040020499814203D36D496A46EC -:1066E000518002E004996A4651800599814203D3A2 -:1066F00068486946088002E005986946088007985E -:1067000019303221FDF7F2FC0400FF2C00D9FF24E0 -:1067100001A84078042801D1012700E0002701A842 -:106720004078072803D0FBF78BFE002801D0022514 -:1067300000E0002501A84078082801D1042600E0E7 -:10674000002601A84078092803D002F031FE002875 -:1067500001D0082100E000213D432E4331430F20AA -:1067600001AA93780340090119433123D25C1040F8 -:106770004A4A10AB1B78D25C1201024310A8007881 -:10678000C9B20B02034368464088010419436846B6 -:106790000088E4B223040343D2B212061A434048ED -:1067A00003F04CF9002801D1002003E010A8007884 -:1067B00000F00AF811B0F0BDD01C00289E1C002883 -:1067C00001030000AC1A002878B585B00400200051 -:1067D000C0B2042809D22000C0B2FEF7A4FE694668 -:1067E000C0B2FCF75DFA002801D0002031E0684615 -:1067F0004178002901D0012100E000218278002A9F -:1068000001D0022200E00022C378002B01D0042333 -:1068100000E000230579002D01D0082600E00026C5 -:106820004579002D01D0102500E000250A431343CF -:106830001E433543E4B2EDB22A022243C188090463 -:1068400011430389808902041A43C120800003F0A8 -:10685000F5F806B070BDE0B5684602F07AF9002898 -:1068600001D1002011E068460178427812020A4303 -:1068700081780B041343C178090619438388C088C3 -:1068800002041A43844803F0D9F80EBD1127000012 -:1068900010270000FFFF000002030000681C002812 -:1068A00003030000F8B5FCF7E5F904007B4D296807 -:1068B0002000FEF703FE002805D00120784908706B -:1068C000200064302860774D29682000FEF7F6FD2F -:1068D000002805D001207449087020006430286029 -:1068E00072480078002814D1714801682000FEF732 -:1068F000E5FD00280DD06F4A6F4800781070012028 -:106900006E490B781278050095401D430D7067495C -:1069100008706B480078002814D16A48016820008C -:10692000FEF7CCFD00280DD0674A6848007810704B -:10693000674901200B781278050095401D430D70C2 -:106940005F490870564D287800281ED0FFF758FD83 -:10695000002815D0002028705E490A78521C1207C2 -:10696000120F0A705C490A78002A04D05B4A107042 -:106970005B4A107008705B480168491C016003E0C5 -:1069800059480168491C016085E0474D2878002876 -:106990000FD0FFF760FF002806D000202870514874 -:1069A0000168491C016003E04F480168491C01600F -:1069B00071E0002500E06D1C2800C0B204282CD234 -:1069C0000127AF403D4E30783842F4D02800C0B2A5 -:1069D000FFF799FD00281BD03078B843307033485A -:1069E000017800290FD033490978EDB28D420AD1E0 -:1069F00031490A78521C9207920F0A7000210170E7 -:106A000019342B48046037480168491C016003E0D1 -:106A100035480168491C01603DE0002500E06D1C1F -:106A20002800C0B2042836D20127AF40284E307863 -:106A30003842F4D02800C0B2FFF740FE002825D02D -:106A40003078B843307029482900C9B2415C491CEC -:106A50000907090F2A00D2B2815419480178002988 -:106A60000FD019490978EDB28D420AD117490A7839 -:106A7000521C9207920F0A700021017019341148BC -:106A8000046018480168491C016003E01648016869 -:106A9000491C0160FFE7F1BD06030000701C0028DF -:106AA000031300287C1C002806130028CE1C002895 -:106AB000741C0028CC1C0028CA1C002804130028C1 -:106AC000CF1C0028781C0028CD1C0028CB1C0028D7 -:106AD00005130028D01C0028C71C0028C11C002852 -:106AE000C21C0028581C00285C1C0028681C0028B8 -:106AF00070470000704700001206130A1A43130C77 -:106B00001A4300BF094205D0830707D00270401C1A -:106B1000491EF9D1704700000022FFE71300103929 -:106B200006D330B41400150010393CC0FCD230BC80 -:106B3000490700D30CC000D504C0890002D30280ED -:106B4000801C002900D5027070470000F8B50200D3 -:106B500000231800A94C2468002959D000920A7813 -:106B60001207120F009D10352E680F27BE433243C7 -:106B70002A604A78FF25AC43D2B222438C78002C9D -:106B800001D0012400E01C009D4D1540240280220C -:106B9000520014402C430122CE781640994D2540D6 -:106BA00074028026B60034402C430D79002D01D0AC -:106BB000160000E01E00944D2540B4028026F60029 -:106BC00034402C434D79002D01D0160000E01E000A -:106BD0008E4D254074078026B60534402C438D79B0 -:106BE000002D01D0160000E01E00A14D2540B40785 -:106BF0008026F60534402C43C979002901D01300C2 -:106C0000FFE762005208D9071143009A116000E0C3 -:106C10009848F2BD0021016001617047F0B585B070 -:106C20000C000025019594490E6894490968049167 -:106C300093490968039193490F6893490968029140 -:106C4000002C00D1D4E00090009800F0E7F8029901 -:106C50008020C0000843802189000143802040003B -:106C600008430222024301210A4304201043009AF0 -:106C7000106120784007400F072296433043627826 -:106C80005207520F70239843120170261640064394 -:106C90000322A07810407D4B33400602C0208000C4 -:106CA00030401843E378002B01D00B0000E02B00AC -:106CB000774E0640D80280231B01184030432379C9 -:106CC000002B01D00B0000E02B0046007608D8070F -:106CD0003043009B186060798006800E049B3F263D -:106CE000B3431843A3791340C026B0439B01C02689 -:106CF0001E400643E07943075B0F664830401E02A2 -:106D0000E023DB0033400343207A002801D00D004C -:106D1000FFE75F4E1E40E80280231B01184030430E -:106D2000657A1540874B03402D03C0208001284021 -:106D30001843A57A1540844B0340AD03C0200002E0 -:106D400028401843A3891D052D0D804B03402D04B9 -:106D50007F4828401843A37B0B4045006D08D807A7 -:106D60002843009B5860E07B4007400F039B0725AA -:106D7000AB431843237C0B404025A8439B0140258F -:106D80002B400343607C014080208343C801802165 -:106D900008401843A17C6F4B03400902FF2000020A -:106DA00008401843E17CC906C90E6B4B0340090437 -:106DB000F820400308401843217D0A4067490140FC -:106DC0009205C02000041040084300998860E08AC2 -:106DD000390C090480B20843218B82B208041043A5 -:106DE0000099C86021001A31009800F055F801E0C0 -:106DF00020480190019805B0F0BD0000C0E80010E7 -:106E0000FFFEFFFFFFFDFFFFFFFBFFFFFFFFFFDFB9 -:106E10003830016801220A43026070473830016847 -:106E200001229143016070473C30016801220A430E -:106E30000260704710B503000020002916D0002A18 -:106E400014D05B6A1C000C80190F0C00E407E40FDF -:106E50001470990F0C00E407E40F9470590F0C00A4 -:106E6000E407E40F5470D90FD17000E0014810BD61 -:106E7000FFFFFFBF0100DA00C4E80010C8E80010FF -:106E8000CCE80010D0E80010D4E80010FFFCFFFFB1 -:106E9000FFF7FFFFFFF8FFFFF0B50A00002319001E -:106EA0006F4C2468002A49D05579002D01D0012665 -:106EB00000E01E006B4D2540B4028026F6003440F1 -:106EC0002C431579002D01D0012600E01E00664DEF -:106ED000254074028026B60034402C43D578002D1E -:106EE00001D0012600E01E00604D254034028026BE -:106EF000760034402C435578002D01D0012500E068 -:106F00001D000226B4436D00022635402543147847 -:106F1000002C01D0012400E01C0001260127BD4304 -:106F200034402C439278002A00D11E00042294435E -:106F3000B20004231A402243826100E0474908005E -:106F4000F0BD0000FFCFFFFFFF3FFFFFFFFF00F09E -:106F50000000FF0FFF00FFFFFFFFE0FFFFFF3FFF0D -:106F6000F0B50A0000231900414C2468002A49D0DA -:106F70005579002D01D0012600E01E00394D254035 -:106F8000B4028026F60034402C431579002D01D040 -:106F9000012600E01E00344D254074028026B60014 -:106FA00034402C43D578002D01D0012600E01E008E -:106FB0002E4D254034028026760034402C435578EF -:106FC000002D01D0012500E01D000226B4436D0014 -:106FD0000226354025431478002C01D0012400E01E -:106FE0001C0001260127BD4334402C439278002A1F -:106FF00000D11E0004229443B20004231A4022430D -:10700000026100E015490800F0BD000010B5020063 -:10701000002000291FD01269930A1C00E407E40F26 -:107020004C71530A1C00E407E40F0C71130A1C0096 -:10703000E407E40FCC7053081C00E407E40F4C7025 -:1070400013001C00E407E40F0C7092081300DB0728 -:10705000DB0F8B7000E0014810BD00000100DA007A -:10706000D8E80010FFFBFFFFFFFDFFFFFFFEFFFF63 -:10707000DCE8001000B5012027490A6852080240E8 -:10708000002A01D0022001E00968084000BD27481D -:1070900001680800C007C00F704700B5C21E022A71 -:1070A00001D3012002E0C01E0860002000BD1CB515 -:1070B000FF246946FFF7F1FFC0B2002802D020008C -:1070C000C0B207E03C480099890041580800C00759 -:1070D000C00FC0B216BD00B5002801D0032801D3EF -:1070E000012002E0401E0860002000BD1CB5FF2406 -:1070F0006946FFF7F0FFC0B2002802D02000C0B2FE -:1071000008E03448009909014018C1680800C00728 -:10711000C00FC0B216BD0000241526402E480068DE -:1071200081080800C007C00F7047000040152640C6 -:1071300038B504002000C0B208280DD3274D18220E -:107140002749280000F0D0FB0020E8752548264993 -:107150000860002000F028FC24482100C9B2890002 -:1071600041580A00D205D20F002A05D0E4B2A1008E -:1071700040580007000F00E0FF2032BD38B5050081 -:107180002800C0B208280ED3144C1822144920003D -:1071900000F0AAFB0020E075892000011249086078 -:1071A000002000F001FC1148EDB2A9004058000990 -:1071B0008007800F32BD0000401626400F4800684F -:1071C000000AC0B270470E480068000AC0B270479B -:1071D000000000000019264010002740181B00285E -:1071E0004CE200105B080000E81B0028401226401B -:1071F00004480068000AC0B2704700001010204028 -:107200000C1020400810204038B50400072C0ED385 -:10721000124D18221249280000F066FB0020E87584 -:10722000CE2040000F490860002000F0BDFB0A4856 -:10723000A10040584007400F010009B2042907D1BE -:107240000448A1004058C106C90E802040000843F0 -:1072500000B232BD0001264000122640181B002853 -:10726000A8E20010E81B00281E4909688A03920B57 -:107270000260090E0A00D207D20FC27117490968CD -:107280000A00D204D20C82800A00120CD2B202810F -:10729000090CC9B24181264909680F220B0013402D -:1072A00003730B091A4042730A0AD204D20CC2813A -:1072B000090F8907890F0174094909680A0A5207E9 -:1072C000520F82710A00120CD205D20D4282890F30 -:1072D0000A00D207D20F027570470000341526400D -:1072E0003C152640301526401CB50C006946FFF7BA -:1072F000D4FE0100C9B2002901D0C0B217E00D4888 -:107300000099890040584106490E21601F21020A58 -:107310000A406260020C1140A160010F8907890FC9 -:107320006173C00E0100C907C90F2173002016BD8B -:1073300038152640001626401CB50C006946FFF79C -:10734000CAFE0100C9B2002901D0C0B233E01A4818 -:10735000009909014158CAB222601F220B0A13404A -:1073600063600B0C1A40A260090F8907890F217313 -:107370000099090141184A68D10F61730721130F61 -:107380000B40002B01D0012300E00023A373120265 -:10739000120A2261009A120180188068C20F2275B9 -:1073A000020E1300DB07DB0F63750200A275000CF1 -:1073B0000140E175002016BD0019264080B501008E -:1073C00086481822FDF790FC0120854908700020AE -:1073D00002BD000000B583490968C90F002907D024 -:1073E0007F490978002907D100210160032000BDF1 -:1073F000002101600320FAE7784909680160002054 -:10740000F5E7000010B50400FFF734FE002803D1B3 -:107410000020206003200BE071480078002804D091 -:107420006E4880682060002002E000202060032079 -:1074300010BD00B56A490978002904D06749496838 -:107440000160002002E000210160032000BD000077 -:1074500000B565490968C90F002907D06049097856 -:10746000002907D100210160032000BD0021016037 -:107470000320FAE75949C96801600020F5E70000D8 -:1074800000B55A490968C90F002907D0544909783D -:10749000002907D100210160032000BD0021016007 -:1074A0000320FAE74D49096901600020F5E7000073 -:1074B00010B50400FFF732FE002803D10020206041 -:1074C00003200BE046480078002804D04348406978 -:1074D0002060002002E000202060032010BD00009A -:1074E00010B50C00C0B2FFF78FFE00280CD0401E74 -:1074F0000ED0401E10D087214900401A10D0401EE7 -:1075000012D0C01E14D017E02000FFF763FF16E072 -:107510002000FFF78EFF12E02000FFF773FF0EE060 -:107520002000FFF795FF0AE02000FFF7C1FF06E00B -:107530002000FFF7A5FF02E000202060032010BD1F -:1075400080B501000020FFF7CBFF02BD80B503220C -:10755000D2B2824203D200200860012003E0401C26 -:10756000C0B2FFF7BDFF02BD30B587B0040068466A -:10757000FFF7E6FF0100C9B2002903D00021216016 -:10758000C0B228E001A8FFF76FFE01AD287C0228F9 -:1075900003D10098206000201DE07B480068C00FE8 -:1075A000002808D0FFF773FDC0B2002807D10020E3 -:1075B000206003200FE00098206000200BE000987E -:1075C00001994843A988FCF791FDE979491CFCF72A -:1075D0008DFD2060002007B030BD0000001B00289A -:1075E000A91C002818152640081526400C15264011 -:1075F000F0B58BB004000D0069462000C0B2FFF763 -:10760000A5FF0100C9B2002903D000212960C0B242 -:10761000B7E02000C0B2022848D307A92000C0B2BA -:10762000401CFFF761FEC0B200280DD0824E182228 -:107630008249300000F058F90020F07580488149F7 -:107640000860002000F0B0F97F482100C9B289002D -:10765000401808380068C00F002807D007A8407BF2 -:10766000022807D10098286000208AE0009828604E -:10767000002086E0E4B2641C2000FFF718FD010042 -:10768000C9B2002902D0C0B2FF2803D1002028606F -:10769000032076E00098079948430899FCF726FDF7 -:1076A0000999FCF723FD286000206AE001A9200069 -:1076B000C0B2401CFFF740FEC0B200280DD05E4EA5 -:1076C00018225E49300000F00FF90020F0755F4885 -:1076D0005C490860002000F067F95D482100C9B2EC -:1076E00009014058C00F002807D001AE307B0228A6 -:1076F00007D100982860002043E00098286000200F -:107700003FE0E4B2641C2000FFF7F0FC0100C9B2C6 -:10771000002902D0C0B2FF2803D100202860032036 -:107720002FE0707B012821D100980021019E0027C5 -:107730003F06320A17433606059A002392197B4109 -:10774000FCF7C2FE06000F0002980021039A0023F6 -:10775000FCF7BAFE02000B0030003900FCF7C1FB59 -:10776000000E0A021043090E286009E000980199F2 -:1077700048430299FCF7BAFC0399FCF7B7FC286070 -:1077800000200BB0F0BD00003015264010B50323DB -:10779000421E0400E4B2002C03D10800FFF7E4FE0F -:1077A0000CE01400DBB2E4B2A34204D31000C0B278 -:1077B000FFF71EFF02E0C0B2FFF792FE10BD38B522 -:1077C00004000D002000C0B2FFF7B2FC0100C9B2F6 -:1077D000FF2904D12800FFF7FDFDC0B21BE0694678 -:1077E000C0B2FFF7D3FF0100C9B2002903D00021C6 -:1077F0002960C0B20FE02000C0B2FFF7BFFCC0B2EA -:10780000002805D002280BD006D303280CD00FE0A7 -:1078100000982860002032BD009840082860F9E7F1 -:10782000009880082860F5E70098C0082860F1E714 -:10783000002028600320EEE7181B0028A8E20010B3 -:1078400063090000E81B0028001626407F0900009D -:10785000001926401CB5040069460020FFF7AFFF61 -:107860000100C9B2002903D000212160C0B209E0A3 -:10787000FFF7A9FC01000098C9B2491CFCF736FCCF -:107880002060002016BD1CB5040069460020FFF7EB -:1078900096FF0100C9B2002903D000212160C0B2C7 -:1078A00008E0FFF78BFC01000098491CFCF71EFC68 -:1078B0002060002016BD1CB504006846FFF7E3FFFA -:1078C0000100C9B2002901D0C0B208E0FFF790FC66 -:1078D00001000098491CFCF709FC2060002016BD3F -:1078E00080B5FFF7E8FF02BD71B58B0709D0521EC6 -:1078F00028D30B780370401C1B421FD0491C8B07F8 -:10790000F5D1121F3ED3274CE50140C9331BB343C9 -:107910002B4209D1830716D140C0121F32D340C970 -:10792000331BB3432B42F7D0121DFF231E4205D059 -:107930000670401C360A521E1E42F9D11100002268 -:10794000FFF7E0F871BDDB4216D0401E4670360AE4 -:107950004680360C0671001D121F06D340C9331B2A -:10796000B3432B42F2D0401CDEE7401C0AE040C982 -:10797000331BB3432B42D7D10680360C4680001D03 -:10798000121FF4D2121D0BD00B780370521E07D0B9 -:10799000401C491C1B42F7D10370401C521EFBD1F6 -:1079A00071BD00000101010100B501BEFEE780B517 -:1079B0000C4A0D490B68934210D00A6002684A6075 -:1079C00042688A608268CA60C2680A6102694A6164 -:1079D00042698A618269CA61C069086202F030FE48 -:1079E00001BD0000F3F2F1F0DC1A00287047704787 -:1079F00000B5C0B2042801D2012000E00020C0B2CE -:107A000000BD00B50100C9B2002901D1904813E0C2 -:107A10000100C9B2012902D1AF2040010CE00100F0 -:107A2000C9B2022901D18B4806E0C0B2032802D1B5 -:107A3000E120400100E0002000BD00B50100C9B216 -:107A4000002901D15A2011E00100C9B2012901D158 -:107A50005A200BE00100C9B2022901D15A2005E0E9 -:107A6000C0B2032801D15A2000E0002000BD00B5BB -:107A7000401A002801D4012000E00020C0B200BD5F -:107A800000B5884201D3401A00E0081A00BD00B5D5 -:107A90000200D2B2002A08D1C9B2022902D1E120E3 -:107AA000800001E0FA20800018E00200D2B2012A32 -:107AB00008D1C9B2022902D19620C00001E0AF204E -:107AC00080000BE0C0B2032807D1C9B2022901D15E -:107AD000614801E0C820C00000E0002000BD10B5F2 -:107AE00000280FD00C00002C0CD06178002909D0A0 -:107AF0002169002906D0A168002903D02169826884 -:107B0000914201D2002019E080680021A268002380 -:107B1000FCF7DAFC02000B00206940080021801805 -:107B2000594122690023FCF7DCF96168FFF7A8FFDF -:107B3000032801D2012000E00020C0B210BD00B532 -:107B4000C0B232382E2801D2012000E00020C0B29D -:107B500000BD00B50178022905D00178012904D1C2 -:107B60004078022801D1012000E00020C0B200BD11 -:107B700000B50178032905D00178012904D14078A6 -:107B8000032801D1012000E00020C0B200BD38B5BB -:107B90000C00BE490200D2B23C235A438D18C0B239 -:107BA000FAF78BFD0A202870AC7000203821685449 -:107BB00031BDB649C0B23C225043081809210170BA -:107BC000022181700021382281547047AF49C0B230 -:107BD0003C22504308180021017003228270382291 -:107BE0008154704770B505000C002800C0B2FFF743 -:107BF000FFFE002807D0FAF723FC002803D18020DD -:107C00004002844201D3002020E02800C0B2FAF7ED -:107C100054FD002807D1210089B22800C0B2FAF72C -:107C200012FC002801D0002010E09848EDB23C2161 -:107C30004D4345193C2100222E003000FEF75CFF29 -:107C40006C600120A87038216854012070BD0000CC -:107C5000FC530000901A00006C070000F2B59EB0C3 -:107C6000070016001C00002001903800C0B2FFF78A -:107C7000BFFE002819D029A80078022803D029A81F -:107C80000078032811D13800C0B2FFF7BAFE1E9960 -:107C900088420AD305A93800C0B2FBF787F800284C -:107CA00003D105A84078002801D10020E4E0774DF9 -:107CB0003800C0B23C21484328180490049836216B -:107CC000405C694648706846067027A8007800281E -:107CD00007D168460078FFF732FF002801D1002065 -:107CE000CAE008991E98FFF7CBFE02900394269EE7 -:107CF000289C27A8007800281CD00398002802D0D0 -:107D00000298002816D10298002811D1E4B2002C64 -:107D100008D131003800C0B2FFF764FF002801D15C -:107D20000020A9E03800C0B2FFF743FF0120A3E024 -:107D30000020A1E00FA804993C22FCF7D5FF200009 -:107D4000C0B2002808D131003800C0B2FFF74AFFA6 -:107D5000002801D100208FE03800C0B23C21484308 -:107D60002D18E4B2002C0CD028000FA93C22FCF7FF -:107D7000BBFF01200100A97001003822A954694607 -:107D80004870249C27A8007800282FD02598002828 -:107D900001D0019018E0002C01D0019414E0029869 -:107DA0000021FA2292000023FCF78EFB02000B0058 -:107DB00003980021801859410022401E9141039AE6 -:107DC0000023FCF78EF801900198002807D0029A52 -:107DD00001993800C0B2FBF78FF8002815D00821B0 -:107DE0003800C0B2FFF7D3FE002045E068460178B6 -:107DF0003800C0B2FAF748FD002806D00821380044 -:107E0000C0B2FFF7C4FE002036E029A800786870F1 -:107E1000002C01D0012001E029A8007828701E98CC -:107E2000A860EC60019828610020A861039828628E -:107E3000684600783521685427A8007837216854AF -:107E400068464078362168541E980899884201D3C4 -:107E5000012000E00220342168541E993800C0B28D -:107E6000FBF74CF9002806D008213800C0B2FFF714 -:107E70008EFE002000E001201FB0F0BD10B5F02103 -:107E800000227B4C2000FEF737FE10BD281800288A -:107E9000F8B505000C002800C0B2FFF7A9FD0028C6 -:107EA00013D02800C0B2FAF708FC7148EDB23C21AB -:107EB0004D4345193C21002632002F003800FEF7C3 -:107EC0001BFE6C602E700320A870F1BD38B5040055 -:107ED000002505E021002800C0B2FFF7D9FF6D1C86 -:107EE000042DF7D331BD00B5002000E0401C04286C -:107EF00009D25F493C22424389183822895C002913 -:107F0000F4D0012000E0002000BD78B585B0040069 -:107F100057482300DBB23C256B43C5182878082856 -:107F200035D1696889B22000C0B2FAF7EBFA0028AF -:107F300004D12000C0B2FFF749FE96E02000C0B295 -:107F4000FAF747FD002800D08FE0286B002806D004 -:107F5000296B2000C0B2FAF732FE002812D06968FF -:107F600089B22000C0B2FAF7CDFA002804D120006F -:107F7000C0B2FFF72BFE04E009212000C0B2FFF7DA -:107F800006FE72E02000C0B2FFF713FE6DE0C87875 -:107F900004280BD0C878022808D0C878032805D058 -:107FA000C878052802D0C878012805D10921200009 -:107FB000C0B2FFF7ECFD58E02878012855D0160034 -:107FC000287806281BD1E86AFA21490041183000B8 -:107FD000FFF74DFD002811D069462000C0B2FAF726 -:107FE000BBFD002805D009212000C0B2FFF7CFFD5E -:107FF0003BE00398A862EE620720287035E0E86A4B -:10800000FA21890041183000FFF731FD00282CD0FB -:1080100069462000C0B2FAF79FFD002805D009216B -:108020002000C0B2FFF7B3FD1FE0E86A361A0398DC -:10803000A96A401A00210F4A0023FCF745FA3200D2 -:108040000023FBF74EFF0600002E05D02000C0B233 -:10805000FAF733FB002805D009212000C0B2FFF752 -:1080600096FD02E02E630820287006B070BD000067 -:1080700028180028A0860100F8B592B0FAF77CF91C -:10808000FAF7F8FD0690002007900CE00621280082 -:10809000C0B2FFF77CFD03E02800C0B2FFF789FD06 -:1080A0000798401C07900798042800D348E1079DD3 -:1080B000A44807993C22514344183820205C0028EA -:1080C00006D008A92800C0B2FAF770FE002800D038 -:1080D000E6E7FAF7B5F9002803D108AEF0780728EB -:1080E00005D107212800C0B2FFF751FDD8E761682C -:1080F00089B22800C0B2FAF705FA002804D1280096 -:10810000C0B2FFF763FDCBE7F078062807D12078EF -:10811000082804D02800C0B2FFF758FDC0E7207837 -:10812000012816D1B078002813D06078207020780C -:10813000062802D10698E0620BE0E068002806D02D -:108140000698E168401861694018A06101E00020CC -:10815000A061207806280BD02078072808D0207846 -:10816000082805D02078012809D16078062806D192 -:10817000069A08A92800C0B2FFF7C7FE90E720784A -:1081800004282FD1E1690698FFF771FC002828D058 -:1081900060780590012004903720205C039060688F -:1081A000029020690190E0680090236A3520225CEB -:1081B000A1682800C0B2FFF751FD002811D1616805 -:1081C00089B22800C0B2FAF79DF9002804D128002E -:1081D000C0B2FFF7FBFC04E004212800C0B2FFF7A7 -:1081E000D6FC5DE7F078022802D0F078032801D1B0 -:1081F000012700E00027F078042803D03800C0B23F -:10820000002852D02000FFF7A4FC00280AD008A9BB -:108210002000FFF764FC002804D02800C0B2FFF75C -:10822000C8FC3DE72000FFF794FC002823D036204F -:10823000205C00281FD12800C0B2FAF73EFA0028BF -:108240000CD0FAF7FDF8002801D0072100E0082142 -:10825000C9B22800C0B2FFF79AFC21E704202070C1 -:108260000020A0610698FA21C9004018E0610120B1 -:108270003621605418E03800C0B2002809D0200030 -:10828000FFF776FC002804D02800C0B2FFF791FC6D -:108290000AE0FFB2002F01D0052100E00421C9B29D -:1082A0002800C0B2FFF773FCFAE6F078012804D189 -:1082B0002800C0B2FFF77DFCF2E6F078052805D172 -:1082C00006212800C0B2FFF762FCE9E6A069002899 -:1082D00000D1E5E6A1690698FFF7C9FB002800D1A7 -:1082E000DEE62800C0B2FAF7E8F900280CD0FAF769 -:1082F000A7F8002801D0072100E00821C9B2280012 -:10830000C0B2FFF744FCCBE62078032800D0BDE6DE -:1083100069462800C0B2FAF71FFC002805D00821E2 -:108320002800C0B2FFF733FCBAE60398616A8842BE -:1083300000D0B1E604212800C0B2FFF728FCAFE668 -:1083400013B0F0BD2818002810B586B0022405949B -:108350000024049400240394029300230193002337 -:1083600000930023D2B2C0B2FFF778FC06B010BD74 -:10837000F8B590B00C001D0062498C4211D2160075 -:10838000002E0ED0070006A93800C0B2FAF70EFD85 -:10839000002806D106A84078002802D00A980028B4 -:1083A00001D1002022E0200000210A9A0023FCF7DE -:1083B0008BF802000B005448002180185941534AA1 -:1083C0000023FBF78EFD022105910021049100217D -:1083D00003911699029100210191009600232A0031 -:1083E000D2B201003800C0B2FFF738FC11B0F0BDC6 -:1083F000F0B58BB007000E0014001D0001A9380075 -:10840000C0B2FAF7D3FC002803D101A840780028B5 -:1084100001D1002012E00A988119002901D500211C -:1084200003E03848814200DB38492B0022001098D5 -:108430000090DBB23800C0B2FFF79AFF0BB0F0BD7E -:10844000F6B585B004000E000698002815D01F0070 -:108450003800C0B2FFF773FB00280ED03000C0B266 -:10846000012803D03000C0B2022806D10C992000A8 -:10847000C0B2FFF7B7FB002801D1002040E039006F -:10848000C9B22000C0B2FAF7FFF9002806D00821CF -:108490002000C0B2FFF77BFB002031E053482100F1 -:1084A000C9B23C225143451869462000C0B2FAF7D0 -:1084B00053FB002806D008212000C0B2FFF767FB5D -:1084C00000201DE0039868623100C9B22000C0B2EC -:1084D000FAF76EFA002806D008212000C0B2FFF794 -:1084E00056FB00200CE00120287003206870342027 -:1084F0002E540698E8600020A86135202F540120F2 -:1085000007B0F0BD112700008813000010270000FD -:10851000F6B591B00C001E00129900290BD007008F -:1085200007A93800C0B2FAF741FC002803D107A818 -:108530004078002801D1002055E006940A99069859 -:10854000FFF79EFA0400002C07D1189B32220699EF -:108550003800C0B2FFF7F8FE45E006980A99884255 -:1085600001D3012100E002211298FF22F63290424D -:1085700003D31298A04A851800E0129DC9B23800B2 -:10858000C0B2FFF784FA0021C943491B814201D2DE -:10859000002028E02D1820000021FA22920000235C -:1085A000FBF792FF2A000023FBF79BFC02210591B9 -:1085B00000210491012103911899029101951299CA -:1085C00000910300002206993800C0B2FFF746FB75 -:1085D0000100C9B2002905D00449FFB23C2257432B -:1085E000C9194E61C0B213B0F0BD000028180028B0 -:1085F000F8B58AB007000E0014001D006946380067 -:10860000C0B2FAF7D3FB00280AD1684640780028A8 -:1086100006D00298002803D030000299814201D28E -:10862000002017E00021049A0023FBF74DFF020011 -:108630000B0002984008002180185941029A00233B -:10864000FBF74FFC2B002200D2B201003800C0B271 -:10865000FFF77AFE0BB0F0BDF0B58BB007000E004F -:1086600014001D0001A93800C0B2FAF79FFB0028D2 -:108670000AD101A84078002806D00398002803D02A -:1086800030000399814201D2002018E00021059AB0 -:108690000023FBF719FF02000B000398400800219C -:1086A00080185941039A0023FBF71BFC1099009195 -:1086B0002B00220001003800C0B2FFF729FF0BB0E9 -:1086C000F0BDFEB504000D0016002000C0B2FFF79B -:1086D0008FF9002802D02F00002F01D100203DE0AB -:1086E0002000C0B2FFF7A9F9050031002000C0B298 -:1086F000FFF778FA002807D02900C9B22000C0B2DD -:10870000FAF7C2F8002806D009212000C0B2FFF70E -:108710003EFA002022E005204D492200D2B23C233F -:108720005A4388546B463A0002212000C0B2FBF73E -:10873000DDF8002806D168460178002902D040788B -:10874000002806D109212000C0B2FFF720FA00203E -:1087500004E02000C0B2FFF72CFA0120FEBDFEB5F8 -:1087600004000D0016002000C0B2FFF741F90028F8 -:1087700002D02F00002F01D100203AE02000C0B22B -:10878000FFF75BF9050031002000C0B2FFF72AFABD -:10879000002807D02900C9B22000C0B2FAF774F847 -:1087A000002806D009212000C0B2FFF7F0F9002010 -:1087B0001FE0052026492200D2B23C235A438854A8 -:1087C0006B463A0000212000C0B2FBF78FF800286A -:1087D00003D168460078002806D109212000C0B2E4 -:1087E000FFF7D5F9002004E02000C0B2FFF7E1F95F -:1087F0000120FEBD000000000CFEFFFF70B504006C -:108800002000C0B2FFF7F4F8002809D02000C0B261 -:10881000FAF7DFF8002803D1F9F712FE002801D09B -:10882000002013E00A48E4B23C214C4304193820EC -:10883000205C002801D0002008E065683C2100226F -:1088400026003000FEF758F96560012070BD000079 -:108850002818002838B596B005000C00002C1AD056 -:108860002800C0B2FFF7C4F8002814D069462800D9 -:10887000C0B2FAF79BFA00280DD10FA92800C0B2A8 -:10888000FAF7E6FB002806D10AA92800C0B2FAF7D9 -:1088900063F9002801D000203CE01F48EDB23C21E4 -:1088A0004D43401901782170817861706946CA781A -:1088B000A2708A78E27042686260039AA260019AAC -:1088C000E260029A22610C9A6261149AA261099A8A -:1088D000E261059A2262069A6262079AA262089A87 -:1088E000E2620FAA527E3023E2543622825C3123A8 -:1088F000E2543822825C3223E2543622805C002823 -:1089000001D0012000E000203322A0544878342117 -:108910006054012017B030BD2818002870B53421EC -:1089200000242200B24D2E003000FEF7E5F86C70F6 -:1089300070BDF0B58FB007000E003800C0B200F077 -:108940003EF900900098002807D000F0F5F80028C4 -:1089500003D1FFF7C8FA002801D000203BE0002433 -:10896000250000E06D1C2800C0B2042818D201A91F -:10897000B0482A00D2B2805CFFF76CFF00280DD00F -:1089800001A83421405C002808D005980099496866 -:108990002A00D2B25200895A8842E3D200201AE05B -:1089A00034212200924C25002800FEF7A5F82770FC -:1089B000012001006170A0702681FAF75BF9E06088 -:1089C000E168009800F0D4F9002803D100F00AFB18 -:1089D000002000E001200FB0F0BDFEB50020694688 -:1089E000087000F0A9F8002800D18AE0804C2078B7 -:1089F00000F0E5F80700002F02D100F0F3FA80E064 -:108A0000FAF738F90600E0688B494118300000F0A9 -:108A1000CBF8002805D02089401C80B200F072F805 -:108A20006FE0684600F022F90500684600780028EB -:108A300002D000F0D7FA64E06078012817D1EDB2D7 -:108A4000002D09D032000021380000F0C5F90028BF -:108A500001D100F0C7FA54E02069AD494118300057 -:108A600000F0A2F8002801D000F0BCFA49E0B86894 -:108A7000E17818225143401802902169300000F03B -:108A80009CF801900298007D02281AD1EDB2002DC9 -:108A90000FD0207E002807D1380000F06AFA0028A5 -:108AA00006D100F09FFA03E03100380000F0AFFA81 -:108AB00027E0029880680199884201D200F092FA7A -:108AC0001FE00198616988421BD3EDB2002D04D0EC -:108AD0003100380000F09BFA13E000F01BF9002889 -:108AE00007D02089FFF7F2F93100380000F08FFA43 -:108AF00007E06069864940180199884201D200F078 -:108B000071FAF7BD70B5040000F016F8002809D01E -:108B1000200080B2F9F77EFDF9F72EFCA4B2200008 -:108B2000FFF7D4F9342100242200314D2E0030000B -:108B3000FDF7E2FF6C7070BD00B52D48417801294A -:108B400002D04078022801D1012000E00020C0B20C -:108B500000BD70B50400002C01D1002023E0FFF718 -:108B6000EBFF002807D0FAF785F82149096900F0E2 -:108B700024F8050000E000251D4E30782070707844 -:108B80006070B078A07000F035F8317909010143C8 -:108B9000E170F088A08080204002854201D38B4D97 -:108BA000FFE7E580012070BD00B5401A002801D420 -:108BB000012000E00020C0B200BD401A704710B58F -:108BC000002100E0491C0A00D2B2022A0EDA804AD3 -:108BD0000B00DBB218246343D35C0400E4B2A3426D -:108BE000F0D1C9B218204143501800E0002010BD58 -:108BF000781A002838B58EB000252C0012E069469E -:108C00000C482A00D2B2805CFFF724FE002808D06E -:108C100068463221405C002803D020000124AC408B -:108C200004436D1C2800C0B20428E8D32000C0B261 -:108C30000FB030BD9CE90010C027090000B50178D5 -:108C40000A290ED0417804290BD04178062908D092 -:108C50004178072905D04178082902D040780928B1 -:108C600001D1012000E00020C0B200BDF1B590B0FC -:108C700001242000694608701098002801D10020C6 -:108C800043E0002010990870002617E00498381A75 -:108C900009E001A8FFF7D2FF00282BD10498B842C1 -:108CA000F4D30498C01B01A93222895C002901D1A8 -:108CB000042802D3002069460870761C3000C0B238 -:108CC000042820D2434D3000C0B240002818478B02 -:108CD00001A9C3483200D2B2805CFFF7BBFD002877 -:108CE000D7D128792100B14001432971109804702F -:108CF00000200AE028792100B14001432971109831 -:108D00000470002001E06846007811B0F0BD00005A -:108D10003075000038B58EB0002400E0641C2000DF -:108D2000C0B2042821D22B482100C9B24900401802 -:108D3000458B6946AA482200D2B2805CFFF78AFDC3 -:108D400000280AD06846FFF779FF002805D103986C -:108D5000A84204D30398401B03E0002006E00398D8 -:108D6000281A0428DAD3002000E001200FB030BD1B -:108D7000F8B50600174D2889401C28812961AF48A5 -:108D80006861002400E0641C2000C0B204281AD2EC -:108D900070682100C9B24900405A2100C9B2490097 -:108DA000691848832B895A2270682100C9B249008A -:108DB000415A8B482700FFB2C05DFFF719FC00281D -:108DC000E1D1002000E00120F2BD0000FFFF000023 -:108DD00014E60010781A0028F8B590B00700002FAC -:108DE00004D008003B7BC0B2984201D30020BEE013 -:108DF000B8680B00DBB218246343C0180190904E92 -:108E000002207070F17001980078B07032610198A2 -:108E100040687061002030763089401C308100202D -:108E200016E001990200D2B2520089188989020025 -:108E3000D2B25200B218518301990200D2B252004C -:108E4000891889890200D2B25200B2185185401C9B -:108E50000100C9B20429E4D30198007D012801D1A1 -:108E6000012084E00198007D022863D100241EE0E7 -:108E70002000C0B24000301845840DE0290089B2BE -:108E8000BA8A891880B28142F2DAB88A2818210099 -:108E9000C9B24900711848842000C0B2400030189F -:108EA000408C2100C9B2490071184883641C20001D -:108EB000C0B2042821D201982100C9B2490040184B -:108EC000858902A946482200D2B2805CFFF7C2FC25 -:108ED000002810D00598010089B2BA8A89182A00A2 -:108EE00092B29142CADAB88A281A2100C9B249005E -:108EF00071184884D0E7002039E0002400E0641CA9 -:108F00002000C0B2042813D2338938692100C9B2C5 -:108F1000425C2000C0B240003018418B3048250030 -:108F2000EDB2405DFFF764FB0028E8D100201EE0B1 -:108F300001201CE0002400E0641C2000C0B20428D2 -:108F400014D2308900903D4B01984268019821006D -:108F5000C9B249004018818921482500EDB2405D21 -:108F6000FFF77AFB0028E7D1002000E0012011B0D4 -:108F7000F0BDF8B50600002E01D100202FE0304DE5 -:108F80002889401C288102202876002420000AE03D -:108F90000100C9B249006918498D0200D2B25200DD -:108FA000AA185183401C0100C9B20429F0D300E083 -:108FB000641C2000C0B2042810D22B89B27D20008E -:108FC000C0B240002818418D1E482700FFB2C05D86 -:108FD000FFF70EFB0028EBD1002000E00120F2BDDE -:108FE0009CE9001038B5164D2C89641C200080B215 -:108FF000F9F710FBF9F7C0F9200080B2FEF766FF21 -:109000002C8103206870F9F735FE286131BD38B531 -:109010000A000B4BD978491C0C00057BE4B2AC422A -:1090200003D30021DC88641CDC80C9B2FFF7D4FEC6 -:10903000002801D1FFF7D6FF31BD000030750000D8 -:10904000781A00289CE90010F8B5C0B0002001F0A3 -:1090500072FB20A9002000F016FA070069460120E3 -:1090600000F011FA04003800C0B2022801D1012535 -:1090700000E000252000C0B2022801D1012600E056 -:109080000026300028438749087086480078002869 -:1090900013D1FFB2002F04D120A800F04CFA002811 -:1090A00007D0E4B2002C08D1684600F044FA00284A -:1090B00003D101207C49087002E000207A49087041 -:1090C0007848007800280FD100200100BA4A1170BA -:1090D0007649086005E00021C943754A8300D150F4 -:1090E000401C2028F7D331E0F6B2002E16D0EDB2A6 -:1090F000002D05D02299029800F014FA00280DD016 -:1091000001206A4908600020202814D269468200A4 -:109110008958674A8300D150401CF5E70020634915 -:10912000086006E020A982008958614A8300D15076 -:10913000401C2028F6D35E48C068012803D10120D6 -:109140009D49087002E000209B49087041B0F0BDC5 -:10915000F0B595B053480078002803D096480078C1 -:10916000002801D1002065E0002400E0641C042CEC -:109170004ED2062767433F1D4D4DB800285801A920 -:1091800014226243885001AEB800281840681421A8 -:10919000614371184860B800281880681421614341 -:1091A00071188860B8002818C068142161437118CC -:1091B000C860B800281800690090B80028184069F5 -:1091C000012801D1012000E0002014216143711821 -:1091D0000874142060433018426801A814216143C8 -:1091E00041582000C0B200F02DF9B9006918496952 -:1091F00002290BD20099814208D114206043311812 -:109200002000C0B2F9F716FC0028AFD0002011E012 -:10921000002400E0641C042C0BD201A8142161433B -:1092200041182000C0B2F9F72FFC0028F2D000202E -:1092300000E0012015B0F0BD00205F49087001205A -:1092400019490870704710B5A0B01648007800287A -:1092500003D059480078002804D1002056490870EE -:1092600001201CE00020010006E0114A8B00D258CA -:109270006B468C001A51491C2029F6D30C49896889 -:10928000491C029103901C21684600F097F81C903D -:10929000A048006801214140684600F075F920B0FF -:1092A00010BD0000D11C0028D31C0028801C002801 -:1092B000F8190028F8B5B0B0974F3878002805D0D5 -:1092C0009448006801214140009101E00020009095 -:1092D0000026300005E00021C94310AA8300D150C8 -:1092E000401C2028F7D38D48109008201190387822 -:1092F000002803D08A488068401C00E001201290BA -:109300000120139034001FE0310019E0019810A9EA -:10931000AA00885010A80299AA00821851600399E7 -:10932000AA00821891600499AA008218D160099954 -:10933000AA008218116101A9097C0029E4D0012149 -:10934000AA0080184161641C042C12D206256543D2 -:109350002D1D01A92000C0B2F9F7FEFB002806D19F -:1093600006A92000C0B2F9F721FD0028CED00020C8 -:1093700016E01C2110A800F021F82C903878002865 -:109380000AD022480078002806D010A800F0E7F89C -:10939000002801D0012003E0009910A800F0F4F8A3 -:1093A00031B0F0BDA04800787047A0480078704701 -:1093B0009F48007870470000D21C0028F2B50026B4 -:1093C000F64300210A0000E0521C009B9A421AD288 -:1093D0009300C4580B0000E05B1C042BF4D2350052 -:1093E000E6B26E40240A0D0001E00F0004E0082DF3 -:1093F000F2D2F707F9D5904F7608B4463E0067469B -:109400007E406D1CF3E7F043F2BD0000D21C002843 -:10941000C0018A494018704700B5C0B2002805D085 -:10942000022808D004D3032807D009E0844808E0C4 -:10943000AF20400105E0834803E0E120400100E067 -:10944000002000BD38B50D001400C0B2FFF7E4FFE6 -:1094500002002800002A01D0002C02D10020C043C5 -:1094600010E0844200D2200000210023FBF72CF8FA -:1094700002000B00600800218018594122000023DF -:10948000FAF72FFD32BD10B50C00FFF7C1FF002C1D -:1094900001D100203CE0002104E08A0082588B00CA -:1094A000E250491C2029F8D3E068022801D30020AB -:1094B0002EE02068194988420BD16068082808D13D -:1094C0001C212000FFF77AFF216F814201D1022089 -:1094D0001EE020685C49884202D1606805280DD0F2 -:1094E00020685A49884202D16068062806D0206860 -:1094F000574988420BD16068072808D11C212000F9 -:10950000FFF75CFF216F814201D1012000E00020C4 -:1095100010BD0000801C0028D11C002838564D5377 -:10952000F819002800B5401A012801DB012000E0ED -:109530000020C0B200BD00B5002801D100200DE020 -:10954000002100E0491C202907D28A00825800230C -:10955000DB439A42F6D0002000E0012000BD10B5A8 -:10956000002801D100200EE0042100E0491C1C2944 -:1095700008D28A0082582F4B8C001B599A42F5D092 -:10958000002000E0012010BDFEB50500002D03D035 -:1095900000910098022801D3002043E00098FFF7D3 -:1095A00037FF070001970121380001F0E2F801219F -:1095B000380001F01CF9002801D1002032E000261B -:1095C000340007E00122A0002918A000381801F09B -:1095D00057F9641C202CF5D3300005E08100695850 -:1095E000144A8300D150401C202808D201998200DF -:1095F00089588200AA589142F0D0002012E00098C9 -:109600001449086001200100074A1170E968012926 -:1096100002D10649087002E030000449087004488D -:1096200006700120FEBD0000D11C0028D21C0028BD -:10963000D31C0028F81900282083B8ED000003147B -:10964000FC530000901A000035564D5336564D53CA -:1096500037564D53801C002800B5010009B200297F -:1096600005D40121C006C00E8140AE48016000BD96 -:1096700000B5010009B2002905D40121C006C00EC1 -:109680008140CC48016000BDF0B5020012B2002A52 -:1096900018D41822A44B040024B2A408A4001C5916 -:1096A000FF250600F6001640B540AC438901C9B25B -:1096B0000500ED002A409140214300B2800880005F -:1096C00019501CE00F22BC4C182503001BB213409C -:1096D000083B9B089B00060036B23240083A9208CD -:1096E0009200A258FF260700FF002F40BE40B24361 -:1096F0008901C9B2C0000540A9401143E150F0BD45 -:1097000000B5002A03D101228A40426002E0012212 -:109710008A40826000BD0268CA401000C007C00FC6 -:10972000704700B5022801D301200FE00B00DBB227 -:10973000042B01DB012009E0BC4B80001818C9B2E2 -:10974000405C824201D3012000E0002000BDF8B55A -:1097500004001F00022C01D3012023E015000E009D -:109760002A003100C9B22000FFF7DBFF012801D138 -:10977000012017E03000C0B2002816D1FF2F12D808 -:10978000AB4861034018A9004018802149014018E6 -:109790000168A84A0A403902FF231B020B40134309 -:1097A00003600020F2BD0120FCE7F6B2012E16D1C5 -:1097B00080204002874210D29D4861034018A900D2 -:1097C0004018A0214901401801689B4A0A4039020B -:1097D000C44B0B4013430360E3E70120E2E70120A1 -:1097E000E0E700B20012C0B27047F8B505000F0004 -:1097F0001600280000B2FFF7F4FF04002000C0B2FA -:10980000022801D301202CE032003900C9B2200027 -:10981000C0B2FFF786FF012801D1012021E0844872 -:109820002100C9B2490341182A00D2B29200891816 -:10983000C02212018A58AC491140FFB23B02C0223B -:1098400092001A400A43FF218A43F1B21143E4B265 -:1098500062038018EDB2AA008018C0221201815064 -:109860000020F2BD70B50400022C01D3012028E0D5 -:1098700015000E002A003100C9B22000FFF751FF89 -:10988000012801D101201CE0694861034158802270 -:1098900012060A43C02189041143FF2212040A431D -:1098A000914B1340F6B23202C02189001140194396 -:1098B000FF229143EAB20A436103425061034058D8 -:1098C000002070BD70B50400022C01D3012028E0F7 -:1098D00015000E002A003100C9B22000FFF721FF59 -:1098E000012801D101201CE0514861034158802228 -:1098F000D2050A43C02189041143FF2212040A43FE -:10990000794B1340F6B23202C0218900114019434D -:10991000FF229143EAB20A43610342506103405877 -:10992000002070BD00E100E000E400E038B5002058 -:109930000100974A11700100964A1170964908601B -:1099400000F0D4F8002803D000F02CF9002804D14E -:109950009248B849086000202BE0914C2000FBF7AA -:1099600091F9002804D08D48B2490860002020E019 -:10997000B1490020205EFBF7A4F900210220205EFF -:10998000FFF782FE0220205EFFF772FEAB4D28003B -:1099900001F05AFEAA49280001F0CCFAA549086056 -:1099A000002801D0002004E00220205EFFF754FED2 -:1099B000012032BD80E200E01CED00E038B504007B -:1099C000002C01D100202FE0FBF722F871490A7822 -:1099D00013006F4D2D78DBB2AB4203D1FBF71CF8BF -:1099E000002021E0C44B1500EDB22D015D5925602A -:1099F0001500EDB22D015D196D6865601500EDB2C1 -:109A00002D015D19AD68A5601500EDB22D015B1942 -:109A10001B7B2373521C1300DBB2102B00D30022DC -:109A20000A70FAF7F9FF012032BD000098E8001033 -:109A300000000440FF00FFFFFF0000FFF1B594B0FD -:109A40000D0016005021002422006F463800FDF75B -:109A500053F8149880210901884203D24E480068C7 -:109A6000002804D04D48A9490860002038E0684625 -:109A700021000170210001721499019108214C22EA -:109A800081540395049600E0641C2000C0B20828AD -:109A900021D26A4D2100C9B2280001F02DFF01003A -:109AA000C9B20129F0D0C0B20328EDD0149898496A -:109AB00008606A462100C9B2280001F049FE9349B6 -:109AC0000860002805D193480168491C0160012005 -:109AD00006E0002004E090480168491C0160002075 -:109AE00015B0F0BD00FFFF00FFFCFFFFF8B500253B -:109AF00000956846FDF7AEFE002801D0002046E044 -:109B0000864C0098A04205D300982100FAF7EEFA9F -:109B1000002901D000203AE000982100FAF7E6FA87 -:109B20000400002C03D0FF20801C844201D30020BD -:109B30002DE0FF2608363000FFF753FE0700002215 -:109B400000213800FFF7BEFE002801D000201EE0F3 -:109B5000002200213000FFF748FE002801D000203D -:109B600015E023005B1E002200213800FFF7EFFD07 -:109B7000002801D000200AE0002200213800FFF771 -:109B800071FE002801D1012000E02800C0B2F2BD22 -:109B9000A51C0028A61C0028DC1B00280100620070 -:109BA0000008002818B5A7B01AA85D493422FBF7B1 -:109BB0009BF80DA85B493422FBF796F868465A4992 -:109BC0003422FBF791F8594C1AAA07212000FAF722 -:109BD0004EFA002801D0002024E00DAA0621200022 -:109BE000FAF745FA002801D000201BE06A4601215F -:109BF0002000FAF73CFA002801D0002012E00122F0 -:109C000001212000FFF77CFDFA208000FBF756FAC7 -:109C100001212000FFF77FFD012801D1012000E094 -:109C20000020C0B228B010BD80B5044801F042F851 -:109C300001BD0000BC1B0028299C001000045440FA -:109C40000808002870B51400002C05D0207A0028E0 -:109C500002D12078002800D04DE035480168491C29 -:109C600001606068334908606068C02189008842EB -:109C700014D14C20205C082810D1E068C0B209281B -:109C80000CD1E068000AC0B2102807D12069002872 -:109C900004D1E068000C80B2F8F7BCFC26480178DB -:109CA0000A00521C1300DBB2102B00D30022130059 -:109CB000224D2D78DBB2AB4204D121480168491C0A -:109CC000016018E00C4B65680E00F6B236019D513C -:109CD0004C25655D0E00F6B236019E193573E568B8 -:109CE0000E00F6B236019E1975602469C9B20901E9 -:109CF00059188C60027070BD2817002800B5C0B2DA -:109D0000002802D101200F49086000BDD81B00289F -:109D1000D41B0028C81B0028CC1B0028005A620254 -:109D2000E4E4001018E500104CE50010800131401B -:109D3000C01B0028D01B0028A51C0028A61C00283A -:109D4000C41B0028DC1B00286B490A6808607047A8 -:109D50006A490A6810239A43C0B2000110231840D0 -:109D600010430860704765490A68654B1340C0B2EC -:109D700000028022520010401843086070475F497B -:109D80000A6852005208C0B2C0071043086070470A -:109D9000002070475B480068704710B504005948C0 -:109DA0000460BFF34F8FFFF7F5FFA04201D1012000 -:109DB00000E00020C0B210BDF8B50400FF20E23082 -:109DC0000090FFF7E5FF0700FFF7E4FF01252E00F5 -:109DD00000210A004C4B1A700A004C4B1A70009A72 -:109DE0002240002A02D04A490D7001E0484A117011 -:109DF000610005D50020FFF7D0FF0600FFF7CAFF7E -:109E0000F6B2002E09D04349884206D04249884222 -:109E100007D13800C0B2002803D105203A490870A4 -:109E200012E03B480078002803D00420364908702F -:109E30000AE0FFB2002F07D00800FFF7AEFF0028AE -:109E400002D1052030490870FBF7A6F9FBF7CEF9DF -:109E5000C8200001FFF778FF0120FFF779FF0020FD -:109E6000FFF781FF0120FFF78AFFFBF7B4F9FBF74B -:109E7000D0F92648057000F001F8F1BD80B52348FF -:109E80000078002801D0FBF7EBF901BD80B5010097 -:109E9000C9B200290CD01C490A78002A08D10870E0 -:109EA0000020F8F7EFFBF8F7FDFB0020FEF70EF8B7 -:109EB00001BD80B5FFF76CFFFFF76CFF15498842C5 -:109EC00002D10520FFF7E2FFF8F7BAFA002802D026 -:109ED0000120FFF7DBFFFFF7D1FF01BD00B50A4806 -:109EE0000078002801D0012000E00020C0B200BDB1 -:109EF000054800787047000008C0264010C0264082 -:109F0000FFFEFFFF0C102740B61C0028B81C0028DD -:109F1000B71C002845564F4D41564F4D1CB501F01A -:109F200019FD002803D100F0B9F800202BE001F062 -:109F3000F3FF002803D100F0B1F8002023E0FAF786 -:109F4000DEFB002805D069460520FAF767FC0028EB -:109F500003D100F0A3F8002015E068460088974977 -:109F6000088001249648047000209649086001206A -:109F700000F084FA012000F09DFA64209249086004 -:109F800092480470012016BD80B5002804D1904885 -:109F90000168491C016020E08E490A68521C0A6071 -:109FA00001688D4A891A08D00C3909D092225200D2 -:109FB000891A08D05C3909D00BE000F085F80CE074 -:109FC00000F00EF909E000F06DF906E000F0A0F9EC -:109FD00003E07F480168491C016001BD80B501F0C4 -:109FE000E7FC00F03CF87D480178E02905D00178D5 -:109FF000052902D00078002806D10020A649087063 -:10A000000120724908700EE0A4480178002906D1A9 -:10A01000A1480178002906D00121017003E00078F1 -:10A02000401C9D4908709E480078002814D0B44810 -:10A030000168002910D00168491E016000680028ED -:10A040000AD1B048007801F0D9FF002804D10120DE -:10A05000AD49086000F056FA00F05BFA01BD1CB58E -:10A0600058480168491C016001680A2915D3002479 -:10A07000046069460520FAF7D1FB002807D068463E -:10A0800000884E49088001204D49087005E09F482E -:10A090000168491C01604A48047013BD80B501F095 -:10A0A000FEFC02F083FA01F0C0FF002001007C4AB0 -:10A0B0001170934908600100B64A11707649087022 -:10A0C00001204249087001BD70B5017B08290AD002 -:10A0D0003F480168491C0160002000F0CFF90020D2 -:10A0E00000F0E8F968E00324416822000A40416872 -:10A0F000890823000B404168090925000D400F26FF -:10A100004168090C31404068000D06401000C0B2A3 -:10A11000022803D1012000F0B1F924E0D2B2012AD3 -:10A120001AD11800C0B2012802D0DBB2022B13D121 -:10A130000800C0B200280FD00800C0B206280BD219 -:10A140000800C0B200F028F900280CD102206E49A6 -:10A15000086000F0D7F906E01D480168491C01605D -:10A16000002000F08BF92800C0B2022803D10120A2 -:10A1700000F0A0F920E0EDB2012D16D13000C0B200 -:10A18000002812D03000C0B206280ED2BA4800789B -:10A1900000280AD03000C0B200F03FF900280BD1EF -:10A1A0005948046000F0AEF906E009480168491C0E -:10A1B0000160002000F07EF970BD00009C1C0028AA -:10A1C000C01C0028441C0028401C0028FE12002847 -:10A1D000281C0028241C00289E020000BB1C00280C -:10A1E00080B5017B082904D0B0480168491C016092 -:10A1F00051E0436807214268120C0A404068C00CD5 -:10A200000140DBB2012B07D11000C0B2052803D2F8 -:10A210000800C0B2052804D3A4480168491C0160A5 -:10A2200039E01000C0B2012801D1012005E0D2B20E -:10A23000022A01D1022000E003209D4A107008008C -:10A24000C0B2012801D1012005E0C9B2022901D123 -:10A25000022000E00320A14908701148007800287E -:10A260000AD09F48007800F097F8002804D1042015 -:10A270002549086000F046F90848007800280AD00F -:10A280009848007800F0C9F8002804D105201E493C -:10A29000086000F037F901BDFD120028BA1C002843 -:10A2A000BD1C002880B5017B08290AD00020724916 -:10A2B00008707E480168491C0160002000F0FAF82F -:10A2C0001CE0406800098007800F0100C9B2012925 -:10A2D00002D0C0B2022803D101206749087002E011 -:10A2E00000206549087064480078002806D16F484E -:10A2F0000168491C0160002000F0DCF801BD00008D -:10A300003C1C0028BF1C0028341C0028381C0028D6 -:10A3100010B5017B08290AD064480168491C016016 -:10A32000002000F0ABF8002000F0C4F831E0032476 -:10A33000416821404068800804400800C0B20128FC -:10A340000BD16748007800F027F800280BD10620D1 -:10A35000A849086000F0D6F805E0C9B2022902D188 -:10A36000012000F08BF82000C0B201280BD15D481D -:10A37000007800F052F800280BD107209D490860B2 -:10A3800000F0C0F805E0E4B2022C02D1012000F098 -:10A3900091F810BDFC12002870B50100C9B2032964 -:10A3A00001D3032500E005000100C9B2002903D054 -:10A3B0000100C9B2062901D3002025E03C490A78F2 -:10A3C0002B00DBB29A4200D20D78454908708A4CC6 -:10A3D0002800C0B200F088F820706D1C8748057016 -:10A3E000012587480570874E307800280DD16420FC -:10A3F00001F0B8FD002801D1002005E03570FA20F9 -:10A40000C00081490860012070BD7F4800680028B5 -:10A41000F9D1207801F0F2FDF6E710B50100C9B2DC -:10A42000032901D3032400E004000100C9B200297C -:10A4300007D00100C9B2062903D20F4909780029C3 -:10A4400001D1002017E025490A782300DBB29A42A7 -:10A4500000D20C78234908702000C0B201F00AFB3A -:10A46000002801D1002006E0641C68480470012027 -:10A4700063490870012010BDBE1C002810B50400FF -:10A4800001F0D3FD002001005E4A11705E490860B2 -:10A490000100594A11702100C9B2052900D30400F6 -:10A4A0005648047001205649087010BD281C002829 -:10A4B0000013002810B50400002001F0DBFA00288A -:10A4C00001D102F073F82000C0B2052800D30024A7 -:10A4D0004E48047001204A49087010BD021300283C -:10A4E000FF1200280113002800B50100C9B201299C -:10A4F00001D1322005E0C0B2022801D1462000E09F -:10A50000642000BD80B5FFF7C9FD0120FFF7BEFC48 -:10A5100001BDF8B53E4C2068401C2060384D2878BD -:10A52000002802D12068642862D334480078C0B281 -:10A530004007400F35490978C90038220A400243D4 -:10A54000009234480078002801D0012100E0002169 -:10A5500031480078E02801D0022000E000200843C4 -:10A5600028490978002901D0012100E000212B4A67 -:10A570001278530006221A400A4380235B002849C0 -:10A580000E689E4201D3FF2100E00968254E37681E -:10A590009F4201D3FF2300E03368C0B2D2B212025F -:10A5A0000243214800880704174320480088C9B2A5 -:10A5B00009040143DBB21E060E43002200991C4829 -:10A5C000FFF73CFA00280FD0320039001948FFF796 -:10A5D00035FA002808D018480168491C016000209D -:10A5E00001002970206003E014480168491C0160E3 -:10A5F000F1BD0000341C0028BF1C0028FC120028FC -:10A60000FE120028BD1C00283C1C0028FD1200285A -:10A61000401C0028C01C0028BB1C0028BA1C0028B5 -:10A62000381C0028101C00289C1C00289A1C00289C -:10A63000FA040000050300002C1C0028301C002830 -:10A6400000B5FEE700B5010009B2002905D40121DB -:10A65000C006C00E8140B748016000BDF0B50200E1 -:10A6600012B2002A18D41822844B040024B2A40881 -:10A67000A4001C59FF250600F6001640B540AC4367 -:10A680008901C9B20500ED002A409140214300B282 -:10A690008008800019501CE00F22A74C18250300E9 -:10A6A0001BB21340083B9B089B00060036B23240A9 -:10A6B000083A92089200A258FF260700FF002F4098 -:10A6C000BE40B2438901C9B2C0000540A940114350 -:10A6D000E150F0BD00B59D48012102680A430260C7 -:10A6E00002680A40002AFBD100BD99480168012296 -:10A6F0000A43026070479748016801220A430260DA -:10A7000070471FB5684602F049F900280DD08B4C00 -:10A7100018228B492000FDF7E7F80020E07549205A -:10A72000884908600020FDF73FF901208A49087038 -:10A73000FFF7D0FF1FBD80B5C0B201280ED10321A5 -:10A74000814802F05BF903210320FFF787FF032014 -:10A75000FFF778FF01208149087002E000207F495F -:10A760000870FFF7C2FFFFF7C6FF01207A490870A3 -:10A7700001BD7CB505000E00794803C86A4603C2D6 -:10A78000083A3000C0B2002814D17448007801287B -:10A790000DD06A4C18226A492000FDF7A5F8002068 -:10A7A000E0759420674908600020FDF7FDF800205F -:10A7B0006949087068460121017100242100417136 -:10A7C00000953200D2B26946002002F027FB002833 -:10A7D0000CD05A4D18225A492800FDF785F8EC751F -:10A7E0009E20584908600020FDF7DEF873BD7CB557 -:10A7F00006000D00300002F013FA00280DD04F4C77 -:10A8000018224F492000FDF76FF80020E075B520B1 -:10A810004C4908600020FDF7C7F82800C0B20028A6 -:10A8200014D14E48007801280DD0444C18224449D8 -:10A830002000FDF759F80020E075B9204149086073 -:10A840000020FDF7B1F80020434908700096300061 -:10A8500002F024FA002801D0202001E080208000AE -:10A8600001902A00D2B26946002002F03FFB002886 -:10A8700001D1012000E0002076BD000000E400E0EE -:10A88000F8B584B007000E001500380002F0C8F9D2 -:10A8900000280DD0294C182229492000FDF724F862 -:10A8A0000020E075DF20274908600020FDF77CF8D4 -:10A8B00068461021FCF730F92800C0B2002814D1F6 -:10A8C0002648007801280DD01C4C18221C49200075 -:10A8D000FDF70AF80020E075E6201A49086000201C -:10A8E000FDF762F800201C490870012168460A0043 -:10A8F00002720A00427202228272C1720024210096 -:10A900000173009701962A00D2B26946002002F036 -:10A9100027F900280CD0094D182209492800FCF716 -:10A92000E3FFEC75F520074908600020FDF73CF8CF -:10A9300005B0F0BD00E100E01CED00E0181B0028B0 -:10A9400060E30010E81B002803A700100800244063 -:10A9500000F4244000F52440A71C0028A81C00286F -:10A9600088E8001000B5002801D0002901D1A048D6 -:10A9700008E0A04A904206D1002008808020800193 -:10A980004860002000BD9C4A904205D18020800193 -:10A9900002000A804860F4E7BA4A904206D180205B -:10A9A000C0010880802080014860EAE7B64A9042F2 -:10A9B00006D1C020C0010880802080014860E0E707 -:10A9C000B24A904206D18020000208808020800197 -:10A9D0004860D6E7AE4A904205D10020088080202A -:10A9E00080014860CDE7AB4A904205D180208001CC -:10A9F00002000A804860C4E7A74A904206D180203E -:10AA0000C0010880802080014860BAE7A34A9042D4 -:10AA100006D1C020C0010880802080014860B0E7D6 -:10AA20009F4A904206D18020000208808020800149 -:10AA30004860A6E76E48A5E700B5002100E0491C84 -:10AA40000A290AD2974A18234B43D3589842F6D181 -:10AA5000182041435018001D00E0002000BD10B533 -:10AA60000A00D2B2402A01DB002017E0020C1204D7 -:10AA700080235B02D218AC23C3589B089B049B0C19 -:10AA80009B00D218C9B2884BBC240059000A400769 -:10AA9000400F185C801C41438800101810BD10B591 -:10AAA0000A00D2B2202A01DB002016E0020C1204B8 -:10AAB00080235B02D218C023C3589B089B049B0CC5 -:10AAC0009B00D218C9B2784BC82400594007400FE8 -:10AAD000185C801C41438800101810BD10B50B0095 -:10AAE000DBB2022B01DB002028E0030C1B048024D6 -:10AAF00064021B190C00E4B2002C05D1A0240459F7 -:10AB0000A408A404A40C04E0B0240459A408A404D8 -:10AB1000A40CA4001B19C9B2002904D1BC214058BF -:10AB20004007400F04E0BC21405800094007400F97 -:10AB30005D49085C801C42439000181810BD00B5A8 -:10AB40005A49884201D3052100E00021400A40060D -:10AB5000400E0818C0B200BD38B504000020002C1B -:10AB600044D02000FFF7EBFF0121226D520F0A4075 -:10AB7000002A05D00A004E4B0500EDB26D005A5375 -:10AB8000226D120F0A40002A05D00222484B050010 -:10AB9000EDB26D005A53226DD20E0A40002A05D044 -:10ABA0000322434B0500EDB26D005A53226D920E05 -:10ABB0000A40002A05D004223D4B0500EDB26D008D -:10ABC0005A53226D520E0A40002A05D00522384BF6 -:10ABD0000500EDB26D005A53226D520D114000294F -:10ABE00004D00621324AC0B24000115231BD0000EB -:10ABF00001006200000052400002524070B5002285 -:10AC00001300130000283CD003689B0F1C00E407CE -:10AC1000E40F0C720B7A002B05D10368DB00DB0814 -:10AC20009B144B6003E00368DB00DB084B60436868 -:10AC30005B0D1C00E407E40F0C7043681B0C1B0742 -:10AC40001B0F4C240B554C23CB5C082B01DA130053 -:10AC500002E04C23CB5C083B0AE01400A4B2A40041 -:10AC60000419A4681500ADB2AD004D19EC60521C7A -:10AC700014000D4D1E00B6B2AD5DA4B2ADB2AC4233 -:10AC8000EBD370BD00045240000652400008524011 -:10AC90000000544000025440000454400006544058 -:10ACA000000854405808002880E80010010852406D -:10ACB000301B0028F1B5A8B0002000900020289893 -:10ACC000FFF7BAFE0700002F29D0289E306D974964 -:10ACD0000140002902D02898FFF73EFF0125306D82 -:10ACE000C00C284000281CD1306D2840002868D1B5 -:10ACF000306D00092840002800D0BAE0306D400ACD -:10AD00000540002D0BD030005030016880229200A9 -:10AD10000A4302603868002801D03868804729B0AB -:10AD2000F0BD300050300168802212030A430260F7 -:10AD300098203058002816D0002400E0641C200021 -:10AD4000C0B220282CDA98203058E0402840002853 -:10AD5000F4D02100C9B22898FFF781FE0090A540E9 -:10AD6000982035501CE09C203058002818D0002432 -:10AD700000E0641C2000C0B2202811DA9C2030586A -:10AD8000E04028400028F4D020342100C9B228989F -:10AD9000FFF765FE00902000E03085409C20355094 -:10ADA00000980028BBD013A90098FFF727FF786808 -:10ADB0000028B4D013AA2100C9B200207B689847AC -:10ADC000ADE73000503001682943016017E0289A50 -:10ADD000D4235B00D45801AA0300DBB29B00D450FB -:10ADE000401C02000B00D2B2DBB29A42EFD3B8682B -:10ADF000002804D001AAC9B20020BB689847A4204B -:10AE000030584006400E012889DB2898C0214900AF -:10AE100040582840002822D1A420305800903F24D8 -:10AE20000098020A224000212898FFF757FE0028C8 -:10AE3000E5D013A9FFF7E2FE3000A83001683F22F9 -:10AE40009143009A120A14400C4304607868002869 -:10AE5000D5D013AA002101207B689847CFE734485A -:10AE60002899BC2289584907490F415C891C002058 -:10AE7000B7E730005030016810220A43026017E043 -:10AE8000289ADC235B00D45801AA0300DBB29B00A4 -:10AE9000D450401C02000B00D2B2DBB29A42EFD376 -:10AEA000B868002804D001AAC9B20120BB6898473D -:10AEB000B42030584006400E012800DA2FE72898C9 -:10AEC000C0214900405840082840002822D1B42021 -:10AED000305800903F240098020A2240012128980F -:10AEE000FFF7FCFD0028E3D013A9FFF787FE300031 -:10AEF000B83001683F229143009A120A14400C4373 -:10AF0000046078680028D3D013AA012101207B684F -:10AF10009847CDE706482899BC228958090949076E -:10AF2000490F415C891C0020B4E70000EEE0F73FC8 -:10AF300080E80010F1B594B0D34800681290D3486F -:10AF400000681190D2480768D2480668D248006865 -:10AF50001090D24800680F90D14800680490D14802 -:10AF600000680E90D04800680190D04800680D90AD -:10AF7000CF4800680C90CF4800680B90CE4800681E -:10AF80000A90CE4800680990CD4800680890CD48E6 -:10AF900000680390CC4800680290DC480068079085 -:10AFA000DB48006800901498002810D00C00002C9A -:10AFB0000DD02820205C002802D0E06A002806D0AE -:10AFC0003020205C002804D0606B002801D1D148DB -:10AFD00024E31498FFF730FD002801D1CD481DE38C -:10AFE0002168016061684160A1688160E168C160B9 -:10AFF00021690161149D0120A861A869C007FCD5E1 -:10B000000320A86105A91498FFF7ACFC002801D023 -:10B01000C04803E32820215C129ABF4810400A046C -:10B02000FF21090411400143BC4808406946898A50 -:10B0300089B2890889B289000143842029503020CF -:10B04000205C4006400EFE21C903119BE44A1A40D1 -:10B050000004084010438422AA5892082823E35C85 -:10B06000D2189204920CAD4B03409200DD48104080 -:10B0700018438822A850A06BC000C0087A0F52075E -:10B0800010439022A85007224020205C1040099FC6 -:10B09000D54B3B400702E020C00038401843412315 -:10B0A000E35C13407027B8431F0170233B40034308 -:10B0B0004220205C10400727BB431843BC23E850C4 -:10B0C0004420235C1800C007C00F73005B08C6074C -:10B0D0001E434520205C4006400EC44B1E40070620 -:10B0E000FE20C005384030434626A65D7606760E23 -:10B0F000BB4F07403004084038438826AE59B60895 -:10B100003027E75D7F00F619B604B60C834F074081 -:10B11000B600B44830403843A026A8514820265CE9 -:10B120003000C007C00F109E76007608C00730437D -:10B130004926A65D7606760E03403606FE20C0053B -:10B14000304018434A23E35C5B065B0EA44E064086 -:10B15000180401403143A64FA020285880084623F8 -:10B16000E35C4226A65DBE5DB61C7343C018830433 -:10B170009B0C6A4808409B009A4919400143B02043 -:10B1800029504720205C002801D1002100E0012146 -:10B19000009B012083430800C007C00F18434B21C8 -:10B1A000615C002901D1002100E0012102239843C4 -:10B1B00049000223194001431498C0235B00C15089 -:10B1C000B020285880084A21615C4123E35CFB5C85 -:10B1D0009B1C5943401883049B0C82484F490F9E87 -:10B1E0000E409B0003403343AC26AB514323E35C4A -:10B1F0001A40089B0726B3431A43C823EA507D4AE6 -:10B20000049E16407C4B1E400496AC26AE59B608F0 -:10B2100000964C26A65DB4464026A65DBE5DB61CD3 -:10B2200067467743009EF619B604B60C049F0F409C -:10B23000B60006403E43F027EE510E9F6F4E3E4053 -:10B2400032404D26A65DB606B60E13403604FC22EB -:10B25000920332401A43F023EB589B0814339B04AB -:10B260009B0C11409A0010400843C0216850802276 -:10B2700052021498000C00046946898A401880180C -:10B2800006998B08002125E0E0E80010E4E80010B2 -:10B29000E8E80010ECE80010F0E80010F4E8001016 -:10B2A000F8E80010FCE8001000E9001004E90010C4 -:10B2B00008E900100CE9001010E9001014E9001072 -:10B2C00018E900101CE9001020E9001000260660B3 -:10B2D000001D491C9942F9D301990120084302211C -:10B2E0000143CF480840217D012901D1012100E01F -:10B2F0000021CC4B034048028021890008401843BC -:10B30000217D01290CD101210BE000BF24E90010AF -:10B3100028E9001001006200FFFF00FF0300FFFFAB -:10B320000021C14B03400802802149000840184316 -:10B33000802188434021884320218843102188436D -:10B340000421884301900198A861E08AC005C00DDE -:10B350000D99B64B0B400104B54808401843217EB7 -:10B36000B44B03400902FF200002084018437F232A -:10B37000617E19407F26B0430143A07E1840C90179 -:10B38000C90940060843E861207D012853D11F20E8 -:10B39000A18B01400C9FA84E3E400F04F8214903A9 -:10B3A00039403143A67F3040A44E0E400102F820C0 -:10B3B0004001084030430F21E67F0E40F027B8439C -:10B3C0003701F0263E4006432020205C01400F203C -:10B3D000864331432220205C012811D1012610E050 -:10B3E000FFFF80FFFCFF0000FFF8FFFFFFFFFF8073 -:10B3F00080E80010FFFFFFC0FFFFC0FFFFFFFFBF9F -:10B4000000268F480840F10580263604314001436C -:10B41000E9602320215C19400B9E8A4830400E02CF -:10B42000FE21C901314001432420205C03407F20DC -:10B4300081430B43AB6403203C21635C03400A99C6 -:10B440003026B1431E01302333400B433D21615C64 -:10B4500008400C218B4381000C20084018433E21FA -:10B46000615C012901D1012100E000210223984300 -:10B4700049000223194001433F20205C012801D1EB -:10B48000012000E0002001260123994330400843B9 -:10B49000802168501498000C0004842169588908A0 -:10B4A0008904890C890040188018002105E0E36AAE -:10B4B0008F00DB598F00C351491C2823E35C99425C -:10B4C000F5D31498000C0004882169588908890470 -:10B4D000890C890040188218002308E0606BD900AD -:10B4E000401803C8DF00D71903C7083F5B1C302092 -:10B4F000205C8342F2D3844803990140834A0A4086 -:10B5000083491140834A0A4083491140834A0A40D3 -:10B510004B491140824A0A4082491140824A0A40FE -:10B52000802109031143814A0A4081491140814A1F -:10B530000A40814911403A4A0A4080491140804AF4 -:10B540000A4080491140804A0A4036491140364B32 -:10B550000B4080218B434021C9430B402022D24322 -:10B56000134010271F4308239F430423DB431F403E -:10B570000224E443274037430397039F6F65029FEC -:10B58000384002900298614F074061483840614F4F -:10B59000074061483840614F074029483840604FB4 -:10B5A000074060483840604F0740684838405F4F68 -:10B5B00007405F4838405F4F07405F483840184FAA -:10B5C00007405E4838405E4F07405E4838405E4F57 -:10B5D000074014483840144F0740802087433940C3 -:10B5E0000A40102082430820824313402340012058 -:10B5F0008343AB65079830430440EC651498FFF72C -:10B600009EFA4000B04900220A5201980121884365 -:10B61000A861A86930400028FBD1002015B0F0BD1A -:10B62000FFBFFFFFFFFDFFFFFFFEFFFFFFFF00FE6D -:10B630000000FF01FF00FFFFFFFFE0FFFFE0FFFF53 -:10B64000FFFF7FFFFF80FFFFFEB50700002F01D146 -:10B650009E4857E03800FFF7EFF9002801D19B48DA -:10B6600050E0002404604460C46004613D00012097 -:10B67000A861A96901400029FBD00326AE61694693 -:10B680003800FFF76FF9002801D090483AE0842095 -:10B690002C5088202C508E4890216850BC202C5073 -:10B6A000A0202C50B0202C50C02040003C50AC209A -:10B6B0002C50C8202C50F0202C50C0202C50380C7E -:10B6C0000004694609884018802149024018019900 -:10B6D0008A08210002E00460001D491C9142FAD34F -:10B6E000AE617C48E8617C48E860AC6480202C5006 -:10B6F0006C65AC65EC653800FFF721FA40007249D3 -:10B700000C520020FEBD0000FFFFFFDFFFFFFFEF38 -:10B71000FFFFFFF7FFFFFFFBFFFFFFFDFFFFFFFE48 -:10B72000FFFFBFFFFFFFDFFFFFFFEFFFFFFFFBFF9D -:10B73000FFFFFDFFFFFFFEFFFF7FFFFFFFDFFFFFBC -:10B74000FFEFFFFFFFF7FFFFFFFBFFFFFFFFF7FF2D -:10B75000F8B50600002E02D01400002C01D15B4881 -:10B76000B0E06846017068460078202801DB574841 -:10B77000A8E03000FFF760F9002801D15348A1E0AC -:10B7800037000125B8692840002808D1CC20395855 -:10B7900068460078C1400800C007C00F00E02800DC -:10B7A000C0B2002801D049488CE0684601783000DA -:10B7B000FFF775F9002801D1444883E001000A68C9 -:10B7C000464B13400B60217A012901D12B0000E088 -:10B7D000002302001668424931409B078026F60587 -:10B7E00033400B4313600168890F2940002902D1BF -:10B7F00061688A0400E0626801000B685B0F5B0708 -:10B80000D200D2081A430A60011D0A68354B134062 -:10B810000B60011D0A681202120A0A604C21615C69 -:10B820000B071B0F011D0E682F4A32401B04F02628 -:10B8300036031E4016430E602178012901D12B00EA -:10B8400000E00023021D1668284931405B05802670 -:10B85000B60333400B4313602178012901D12B003B -:10B8600000E00023021D1668214931401B05802697 -:10B87000760333400B4313604C21615C082901DAE5 -:10B88000002102E04C21615C08391A4A89B2515CFE -:10B8900000220AE013009BB29B00E318DB6816004D -:10B8A000B6B2B6008619B360521C13000E00F6B291 -:10B8B0009BB2B6B2B342EDD3684600788540D02043 -:10B8C0003D500020F2BD0000301B00280100620046 -:10B8D000FFFFFF1F030A0006330A0000FFFFFFDF20 -:10B8E000FFFFFFBFFFFF7FFFFFFFF0FFFFFFDFFF57 -:10B8F000FFFFEFFF80E8001010B50200002A03D020 -:10B900000800C0B2202801DB002021E00020012334 -:10B91000CC241459CC401C40002C09D0D420105801 -:10B92000C8401840002801D1180010E003200EE0A4 -:10B93000D8241459CC401C40002C01D0022006E031 -:10B94000DC241259CA401340002B00D00420C0B29E -:10B9500010BD000080B500F029FE00F097FD002822 -:10B9600004D1E02000F01EF9002020E001F024FBCB -:10B97000002804D1E02000F015F9002017E0002095 -:10B9800001006F4A11706F4908606F4908606F4984 -:10B99000086001006E4A117001006E4A11700121A9 -:10B9A0006D4A11706D49086086490860012002BD2A -:10B9B00038B585480168491C0160654C2078042829 -:10B9C00003D3E02000F0EEF853E05D480078002853 -:10B9D00002D000F0EBFD4CE020785E4D2978C0B23B -:10B9E000884208D0207800F062F8002803D1E020D7 -:10B9F00000F0D8F83DE02878002814D0F7F73AF99D -:10BA00007049504A1268801A086008686F49884275 -:10BA100009D36F480168491C01600020207005208F -:10BA200000F0C0F825E048480168491C0160016841 -:10BA30000A291ED30024046001F0CBFA00280AD0A2 -:10BA40004248046001F0D8FA6249088001F0D7FA50 -:10BA5000614908600DE061480168491C01603B488C -:10BA60000168491C01600068032802D3E02000F04F -:10BA700099F831BD00B50100C9B2042901D30020F5 -:10BA80000CE02F490978002905D00100C9B200292E -:10BA900001D0002002E02E490870012000BD80B5D1 -:10BAA00000202B490870E02000F07CF801BD70B543 -:10BAB00004002000C0B200280FD100F077FD254817 -:10BAC00004700120244908700020454908603D4960 -:10BAD00008601C49086001202FE02000C0B200F07F -:10BAE0003FF80500002D01D1002026E000F068FDA0 -:10BAF000002806D0280000F03BFD002808D10020D7 -:10BB00001BE0280000F0E8FC002801D1002014E030 -:10BB1000104E3078002806D1F7F7ACF809490860D4 -:10BB200000202849086034702000C0B200F029F8D5 -:10BB3000094908702A480560012070BD0000000016 -:10BB4000BC1C0028181C00281C1C0028201C0028D5 -:10BB5000B91C0028BA1C0028BB1C0028001C0028A7 -:10BB600000B5C0B2012804D009D3032805D002D300 -:10BB700005E01E2004E03C2002E05A2000E0002006 -:10BB800000BD00B5C0B2012804D009D3032805D0F8 -:10BB900002D305E0022004E0032002E0042000E0DC -:10BBA000012000BD10B5040000F000FD01200D498A -:10BBB0000870002001000C4A1170094908600B4808 -:10BBC000047010BD041C0028081C0028C0270900B0 -:10BBD0000C1C00289A1C0028141C0028101C00288B -:10BBE000001C0028BC1C0028BA1C0028BB1C002814 -:10BBF00070B5B14BC018C0090001C64BC318042969 -:10BC00000CD21F251C68CE002800B0408443D2B25D -:10BC10001540C800854025431D600CE0FC311F2500 -:10BC20005C68CE002800B0408443D2B21540C80002 -:10BC3000854025435D6070BD00B59F4A8018C009EE -:10BC40000001B44A8018042905D20068C900C84020 -:10BC5000C006C00E05E0FC314068C900C840C006FF -:10BC6000C00EC0B200BD00B5002A03D101228A4037 -:10BC7000426002E001228A40826000BD30B40300CD -:10BC80008C000F25596C2800A04081431540A54029 -:10BC90000D435D6430BC704730B403004C00103479 -:10BCA0000325D96C2800A04081431540A5400D43D1 -:10BCB000DD6430BC704700B5022801D301200FE0DD -:10BCC0000B00DBB2042B01DB012009E0A44B800058 -:10BCD0001818C9B2405C824201D3012000E0002064 -:10BCE00000BDF8B504001F00022C01D3012023E0A1 -:10BCF00015000E002A003100C9B22000FFF7DBFF5B -:10BD0000012801D1012017E03000C0B2002816D16F -:10BD1000FF2F12D8B74861034018A90040188021AE -:10BD2000490140180168B44A0A403902FF231B0246 -:10BD30000B40134303600020F2BD0120FCE7F6B284 -:10BD4000012E16D180204002874210D2A9486103FB -:10BD50004018A9004018A021490140180168BB4AB9 -:10BD60000A403902BA4B0B4013430360E3E701205A -:10BD7000E2E70120E0E700B20012C0B27047F8B578 -:10BD800005000F001600280000B2FFF7F4FF0400C2 -:10BD90002000C0B2022801D301202CE0320039007B -:10BDA000C9B22000C0B2FFF786FF012801D10120EF -:10BDB00021E090482100C9B2490341182A00D2B2BB -:10BDC00092008918C02212018A58A2491140FFB27C -:10BDD0003B02C02292001A400A43FF218A43F1B27B -:10BDE0001143E4B262038018EDB2AA008018C022A9 -:10BDF000120181500020F2BD70B50400022C01D365 -:10BE0000012028E015000E002A003100C9B22000F0 -:10BE1000FFF751FF012801D101201CE075486103A3 -:10BE20004158802212060A43C02189041143FF228F -:10BE300012040A43874B1340F6B23202C021890034 -:10BE400011401943FF229143EAB20A436103425071 -:10BE500061034058002070BD70B50400022C01D36E -:10BE6000012028E015000E002A003100C9B2200090 -:10BE7000FFF721FF012801D101201CE05D4861038B -:10BE800041588022D2050A43C02189041143FF2270 -:10BE900012040A436F4B1340F6B23202C0218900EC -:10BEA00011401943FF229143EAB20A436103425011 -:10BEB00061034058002070BD0000CFBFF0B58DB0C9 -:10BEC000684665493422F8F70FFF644F6A4601213E -:10BED0003800F8F7CCF80600002420006946087204 -:10BEE0006A4602213800F8F7C2F805000022012155 -:10BEF0003800FFF7B8FE002202213800FFF7B3FE3A -:10BF00003543002D01D1012000E02000C0B20DB06A -:10BF1000F0BD00000000304010B500F0ABF8002884 -:10BF200001D100201BE04E4C2000F8F7BDFA4D492E -:10BF30002000F8F733F9002801D000200FE020009E -:10BF4000F8F7BFFA4849884207D12000F8F7B5FA58 -:10BF50004649884201D1012000E00020C0B210BD56 -:10BF600098E8001070B5424C0021216000F046F8BE -:10BF7000002803D10120206000203AE0374E002243 -:10BF800001213000FFF76FFE354D37492800F8F7E3 -:10BF900096FA2800F8F782FA2800F8F740FD022008 -:10BFA000F9F78CF82800F8F784FA000405D4022089 -:10BFB000206000F03AF800201BE000220121300050 -:10BFC000FFF76AFE062201213000FFF757FE082224 -:10BFD00001213000FFF70CFE01213000FFF72CFE9D -:10BFE000082805D00320206000F01FF8002000E0A2 -:10BFF000012070BD00000440FF00FFFF38B5652838 -:10C0000001D3002010E000F087F80400144D210057 -:10C010002800F8F750FA2800F8F74FFAA04201D1AB -:10C02000012000E00020C0B232BD10B50C48F8F786 -:10C030003BFA0A4C00220121200000F07BF800228C -:10C040000221200000F076F810BD0000FF0000FF84 -:10C0500000FFFF00FFFCFFFFB0E40010800531404F -:10C06000001E584090E000101F4E0000204E0000BF -:10C07000B81B0028F8B5002500956846FBF7EAFBD9 -:10C08000002801D0002045E0274C0098A04205D3AD -:10C0900000982100F8F72AF8002901D0002039E0A3 -:10C0A00000982100F8F722F80400002C02D01F4865 -:10C0B000844201D300202DE0FF266A363000FFF7CE -:10C0C0005AFE0700002201213800FFF7C5FE0028B4 -:10C0D00001D000201EE0002201213000FFF74FFEBA -:10C0E000002801D0002015E023005B1E0022012162 -:10C0F0003800FFF7F6FD002801D000200AE00022FA -:10C1000001213800FFF778FE002801D1012000E06E -:10C110002800C0B2F2BD000000B5054948436421C3 -:10C12000F7F7E4FF00BD000080841E00010001005D -:10C13000204E000070B505000C0016000022210002 -:10C140002800FFF790FD3200D2B221002800FFF74F -:10C150004FFD002221002800FFF79EFD062221004E -:10C160002800FFF78BFD002221002800FFF77BFD50 -:10C1700070BD000070B5B14BC018C0090001C24BC2 -:10C18000C31804290CD21F251C68CE002800B0401B -:10C190008443D2B21540C800854025431D600CE0A1 -:10C1A000FC311F255C68CE002800B0408443D2B229 -:10C1B0001540C800854025435D6070BD00B59F4AAD -:10C1C0008018C0090001B04A8018042905D200680F -:10C1D000C900C840C006C00E05E0FC314068C90077 -:10C1E000C840C006C00EC0B200BD00B5002A03D1D1 -:10C1F00001228A40426002E001228A40826000BD42 -:10C2000030B403008C000F25596C2800A0408143F6 -:10C210001540A5400D435D6430BC704730B4030049 -:10C220004C0010340325D96C2800A04081431540F0 -:10C23000A5400D43DD6430BC704700B5022801D332 -:10C2400001200FE00B00DBB2042B01DB012009E031 -:10C25000A04B80001818C9B2405C824201D3012073 -:10C2600000E0002000BDF8B504001F00022C01D33F -:10C27000012023E015000E002A003100C9B2200081 -:10C28000FFF7DBFF012801D1012017E03000C0B229 -:10C29000002816D1FF2F12D8B34861034018A90017 -:10C2A00040188021490140180168B04A0A4039020B -:10C2B000FF231B020B40134303600020F2BD01204B -:10C2C000FCE7F6B2012E16D180204002874210D240 -:10C2D000A54861034018A9004018A0214901401851 -:10C2E0000168B14A0A403902BA4B0B40134303605C -:10C2F000E3E70120E2E70120E0E700B20012C0B26C -:10C300007047F8B505000F001600280000B2FFF7CF -:10C31000F4FF04002000C0B2022801D301202CE069 -:10C3200032003900C9B22000C0B2FFF786FF0128F1 -:10C3300001D1012021E08C482100C9B249034118F4 -:10C340002A00D2B292008918C02212018A58A2494A -:10C350001140FFB23B02C02292001A400A43FF2163 -:10C360008A43F1B21143E4B262038018EDB2AA002D -:10C370008018C022120181500020F2BD70B5040067 -:10C38000022C01D3012028E015000E002A00310004 -:10C39000C9B22000FFF751FF012801D101201CE0A4 -:10C3A000714861034158802212060A43C021890462 -:10C3B0001143FF2212040A43874B1340F6B23202A4 -:10C3C000C021890011401943FF229143EAB20A4378 -:10C3D0006103425061034058002070BD70B50400F5 -:10C3E000022C01D3012028E015000E002A003100A4 -:10C3F000C9B22000FFF721FF012801D101201CE074 -:10C400005948610341588022D2050A43C02189045A -:10C410001143FF2212040A436F4B1340F6B232025B -:10C42000C021890011401943FF229143EAB20A4317 -:10C430006103425061034058002070BD0000CFBF2F -:10C4400078B58DB0684665493422F8F74DFC644EE6 -:10C450006A4607213000F7F70AFE04000022072190 -:10C460003000FFF7C2FE00255E480560002C07D1B2 -:10C4700007213000FFF7A2FE002801D1012000E0D3 -:10C480002800C0B20EB070BD0000304010B500F002 -:10C49000B3F8002801D100201AE0534C2000F8F72F -:10C4A00003F852492000F7F779FE002801D0002058 -:10C4B0000EE02000F8F705F84D49884206D120002B -:10C4C000F7F7FBFF002801D1012000E00020C0B2F7 -:10C4D00010BD000098E8001070B5464C00212160A6 -:10C4E00000F046F8002803D10120206000203AE047 -:10C4F0003B4E002207213000FFF777FE3A4D3C49C2 -:10C500002800F7F7DCFF2800F7F7C8FF2800F8F746 -:10C5100086FA0220F8F7D2FD2800F7F7CAFF0004D8 -:10C5200005D40220206000F041F800201BE000222A -:10C5300007213000FFF772FE062207213000FFF7C7 -:10C540005FFE082207213000FFF714FE07213000AC -:10C55000FFF734FE082805D00320206000F026F8FD -:10C56000002000E0012070BD00000440FF00FFFF3C -:10C5700070B50400002C01D0652C01D3002012E01E -:10C58000200000F08BF80600174D31002800F7F767 -:10C5900092FF2800F7F791FFB04201D0002002E09F -:10C5A00010480460012070BDFF0000FF80B50E48F8 -:10C5B000F7F77AFF00F07AF800200A49086001BD19 -:10C5C00080B50948F7F775FFC10B0800C007C00F19 -:10C5D00002BD000000FFFF00FFFCFFFF7CE4001035 -:10C5E00000083140B01B0028802058401CE000109B -:10C5F0001F4E0000B41B0028F8B5002500956846C2 -:10C60000FBF728F9002801D0002045E0354C0098C0 -:10C61000A04205D300982100F7F768FD002901D05A -:10C62000002039E000982100F7F760FD0400002C9D -:10C6300002D02D48844201D300202DE0B726760099 -:10C640003000FFF75AFE0700032201213800FFF7F0 -:10C65000C5FE002801D000201EE003220121300089 -:10C66000FFF74FFE002801D0002015E023005B1EDD -:10C67000032201213800FFF7F6FD002801D0002039 -:10C680000AE0032201213800FFF778FE002801D1DB -:10C69000012000E02800C0B2F2BD000000B513493F -:10C6A00048436421F7F722FD00BD000010B5104C8F -:10C6B000002207212000FFF798FD0022072120001B -:10C6C000FFF758FD002207212000FFF7A7FD0622F3 -:10C6D00007212000FFF794FD002207212000FFF72B -:10C6E00084FD10BD80841E0001000100204E00006A -:10C6F0000008314038B50500082D0DD3914C1822A3 -:10C7000091492000FBF7F0F80020E075E8208F4900 -:10C7100008600020FBF748F98D486901401832BDD8 -:10C72000994B1B689BB212041A43120C120489B273 -:10C73000114381607047C0687047944B1B689BB27F -:10C7400012041A43120C120489B2114301600068EA -:10C750007047C069C00FC0B27047F8B502000E0044 -:10C76000002A01D105204EE00F2089490B681B0AE1 -:10C770000340002B01D1002007E00968090A0840A6 -:10C780000E2801D1012000E00220824940010F184B -:10C79000814C984D280011001022F8F7BFFA286844 -:10C7A00001218843286010212800FBF720F9924BD3 -:10C7B0002A000121380000F04CFC002804D00120A0 -:10C7C00021E0641E002C15D03800FFF7C2FF0028BE -:10C7D000F7D1002E08D010212800FBF707F9300010 -:10C7E00029001022F8F79AFA00F0B4F8012803D1D2 -:10C7F000032008E0022006E000F0ACF8002801D198 -:10C80000002000E00420F2BD38B50100002901D16C -:10C8100005202BE00F205E4A13681B0A0340002B03 -:10C8200001D1002007E01268120A10400E2801D141 -:10C83000012000E00220574A400115186D4C2000ED -:10C840001022F8F76BFA206801218843206010213C -:10C850002000FBF7CCF8684B22000121280000F0F3 -:10C86000F8FB002801D0012000E0002032BDFEB519 -:10C8700003001600002B03D001910198002801D17C -:10C8800005205DE00F2042490A68120A0240002A92 -:10C8900001D1002007E00968090A08400E2801D1EB -:10C8A000012000E002203B49400108180090804C24 -:10C8B000504D280019001022F8F730FA7D4F38004B -:10C8C00001991022F8F72AFA286801218843286084 -:10C8D000386801218843386010212800FBF787F869 -:10C8E00010213800FBF783F83B002A000121009853 -:10C8F00000F0AFFB002804D0012021E0641E002CD2 -:10C9000015D00098FFF725FF0028F7D1002E08D09A -:10C9100010212800FBF76AF8300029001022F8F7F0 -:10C92000FDF900F017F8012803D1032008E00220E8 -:10C9300006E000F00FF8002801D1002000E00420FC -:10C94000FEBD0000181B00289CDE0010E81B00281C -:10C950000010224010B5274C10212000FBF746F8AC -:10C960002068000F0007A0210906884201D100209D -:10C9700009E02068000F0007F0210906884201D174 -:10C98000012000E0022010BD60E9001064E9001001 -:10C990000000204000002240FFFFFF0F38B50400D8 -:10C9A000FFF7D8FF05002800C0B2022801D1424895 -:10C9B0000DE0002C04D0200027491022F8F7AEF932 -:10C9C000EDB2002D01D1002001E02348006832BD06 -:10C9D00000B5010F0907A0221206914201D10020E3 -:10C9E00006E0010F0907F0221206914200D03248FA -:10C9F00000BD0000601B0028E41B00281CB50200DD -:10CA00000B002E4803C86C4603C4083C6C46638088 -:10CA10002B4802606846F8F735F92A490020205E65 -:10CA2000F8F74FF90220FFF765FE0F21264A136839 -:10CA30001B0A0B40002B01D1002307E01268120AE9 -:10CA400011400E2901D1012300E00223002201211F -:10CA50009940FFF765FE13BD601B002870B50026E6 -:10CA600030000220FFF746FE04002000FFF763FEBF -:10CA700005000F2014490A68120A0240002A07D054 -:10CA80000968090A08400E2801D1012600E00226A3 -:10CA90002800F040C00705D509480168002901D0E9 -:10CAA000006880472A0CA9B22000FFF746FE70BD3F -:10CAB000FFFFFF00801B0028FFFFFF0F90E8001022 -:10CAC000E01B00285DCA00100000204050480068AC -:10CAD000410B0800C007C00F70474D480068010BAC -:10CAE0000800C007C00F704700B54A48012102681E -:10CAF0000A43026002680A40002AFBD100BD1FB54C -:10CB00000400C9B2012921D168461021FAF704F8BE -:10CB100069462000FFF721FE0100C9B2012901D1B9 -:10CB20005B481BE00100C9B2022901D13A4815E077 -:10CB3000C0B2042801D1394810E0009800F01CF977 -:10CB400000280BD1FFF7D0FF002007E02000FFF7FF -:10CB50005BFE002801D04E4800E0002004B010BD6C -:10CB60007FB50C001500002C01D14A484DE020682B -:10CB700000F0F0F8012802D06068002801D1454893 -:10CB800043E068461021F9F7C7FF00980002000A49 -:10CB9000C021C90401430091227AFF2000023E49CE -:10CBA000009B0B40120202401A430092637A009EDF -:10CBB000494A32401B04FF2636041E4016430096A5 -:10CBC000E27A019B19401202104008430190A07ABA -:10CBD0000199FF229143C0B208430190207B019943 -:10CBE0000902090A00060843019020680290606863 -:10CBF00003903A48A17A4900415A6068FAF7F7FE73 -:10CC00002900C9B26846FFF77AFF04B070BD000082 -:10CC1000000024400800244010005200FF00520091 -:10CC200010B50400FFF752FF002810D1EC200006D9 -:10CC30002018C0218902884201D2002026E0444801 -:10CC400020188021490288421FD200201EE0C02007 -:10CC50004002EC2109066118814201D2002015E052 -:10CC6000802109026B4AA2188A4201D200200DE0FD -:10CC7000EB221206A218824201D2002006E066488A -:10CC80002018884201D2002000E0012010BD0000E1 -:10CC9000040052000F005200FF00FFFF10B5040017 -:10CCA000FFF714FF002807D12948201880214902E6 -:10CCB00088420FD201200EE0802000025549611801 -:10CCC000814201D2012006E053496118814201D21C -:10CCD000012000E0002010BDFFFF00FFF0E7001082 -:10CCE00010B50400FFF7F9FE002810D1F02000066F -:10CCF0002018FE21C903884201D2002026E06548A1 -:10CD000020188021C90288421FD200201EE0FE2088 -:10CD10008003F02109066118814201D2002015E04C -:10CD2000802189025C4AA2188A4201D200200DE0CB -:10CD3000EE221206A218824201D2002006E05748D5 -:10CD40002018884201D2002000E0012010BD000020 -:10CD50000000FDEB10B504002000FFF761FF002884 -:10CD600001D1002007E02000FFF7BAFF002801D121 -:10CD7000002000E0012010BD80B5FFF729FE00284B -:10CD800001D1002044E04649884201D145483FE0B6 -:10CD90004549401A1CD0801E1DD0401E1DD0401E8B -:10CDA0001DD0401E1DD0001F1DD087381DD0401E35 -:10CDB0001DD012381DD0401E1DD0401E1DD0801E1B -:10CDC0001DD0801E1DD008381DD009381DD01EE092 -:10CDD000A420C0031CE035481AE0354818E0354867 -:10CDE00016E0354814E0354812E0354810E0354883 -:10CDF0000EE035480CE035480AE0354808E0354893 -:10CE000006E0354804E0354802E0354800E02548B2 -:10CE100002BD00000080FEEB0080FEEA38B584B061 -:10CE20000C001500002C01D12E4831E02068FFF7DE -:10CE300091FF012801D12B482AE02078800701D0FA -:10CE4000284825E068461021F9F766FE00980002A0 -:10CE5000000AA02149050143009120790099224A46 -:10CE60000A400002FF21090201401143009160794C -:10CE700000994C4A0A400004FF2109040140114373 -:10CE80000091206801902900C9B26846FFF737FE7B -:10CE900005B030BD000081EF0080C0EF0080C0ED24 -:10CEA000FFFFFF0FFF005200010000F001005200E1 -:10CEB000020052000300520004005200050052001C -:10CEC00006005200070052000800520009005200FC -:10CED0000A0052000B0052000C0052000D005200DC -:10CEE0000E0052000F005200FF00FFFF38B588B05F -:10CEF0000C001500002C01D12E4851E0606800287C -:10CF000001D12C484CE02068FFF78AFE012808D0A8 -:10CF10002068616889004018401EFFF781FE0128E3 -:10CF200001D124483CE068461021F9F7F5FD00984E -:10CF30000002000AA82189050143009120680190A0 -:10CF40006068401E80B20299090C090408430290EF -:10CF5000EDB2012D1CD104A81021F9F7DDFD04A9C3 -:10CF60006846FFF7FAFB0100C9B2012901D1104858 -:10CF700016E00100C9B2022901D10B4810E0C0B28D -:10CF8000042801D109480BE00498FFF7F5FE07E0FB -:10CF90006846FFF739FC002801D0054800E0002072 -:10CFA00009B030BDFFFF00FF10005200FF0052002B -:10CFB000040052000F00520080B5F7F7A0FB0028D4 -:10CFC00001D1002004E001201349087000F001F8AD -:10CFD00002BD80B510480078002805D069460420BD -:10CFE000F7F71CFC002801D1002004E06846008807 -:10CFF0000A490880012002BD08480088704780B5B2 -:10D00000064800880021064A0023F7F75DFA054A22 -:10D010000023F6F766FF02BDA21C0028981C00281A -:10D0200040787D0150FB4A00174A1268120C120426 -:10D0300089B2114381607047C160704701617047D8 -:10D0400000B50068C00F002801D1104800E00020A2 -:10D0500000BDF8B507000C0015001E003800FFF7F2 -:10D06000EFFF00280DD129003800FFF7E5FF310060 -:10D070003800FFF7E3FF21003800FFF7D5FF00205D -:10D0800000E00248F2BD00004CE9001001008A00F7 -:10D09000F8B584B0F8F7C9F8BA490127086803223F -:10D0A000904338430860B8480A6802400A60B749AC -:10D0B0000A6803239A433A430A600A6802400A60F6 -:10D0C000B3490A6803239A433A430A600A68024054 -:10D0D0000A60B0490A6803239A433A430A600A681F -:10D0E00010400860AC4801680F2291433943016049 -:10D0F000AA480168072291430160A94801680722F4 -:10D10000914304220A4302600168F0229143C02245 -:10D110000A4302600168C02292000A43026001686B -:10D12000C02212010A43026001689E4A0A4080211F -:10D13000490111430160E1480168802212060A4357 -:10D140000260DF48016839400029FAD001684908C7 -:10D1500039400029FAD0DB480168DB4A0A40026006 -:10D16000DA480168D84A0A40802149001143016029 -:10D17000D7480168D44A0A40802149001143016020 -:10D18000D4480168D04A0A400260D34801680722A7 -:10D19000914302220A430260D048016849004908CD -:10D1A0000160CF480168890A890229220A43026086 -:10D1B0000168CC4A0A4002600168802252040A4396 -:10D1C00002600168C84A0A400260016880221206B3 -:10D1D0000A430260C5480168C54A0A408021C90067 -:10D1E000114301600168FF229143AF220A430260AC -:10D1F000802189020268BF4B13400B4303608022E9 -:10D2000092040368BC4C1C4014430460BB4B04688C -:10D210001C400460046880252D0625430560B8483D -:10D2200004680725AC43022525430560B54804681A -:10D23000240E2406B44D254305600468B34D2540F3 -:10D24000802464052C430460046880252D06254352 -:10D250000560AF480468640064080460AD4C802534 -:10D26000AD002668A2483040284320602068FF2691 -:10D27000B04362260643266026689E4830408026DA -:10D28000F6020643266026689B483040024322602F -:10D290002068184020602068802212060243226025 -:10D2A0009D4802680724A2430224144304609B485B -:10D2B00002687F24A24328241443046002688C4C33 -:10D2C00014402C43046002688A4C144021430160DE -:10D2D0000168894A0A400260914902680A40026076 -:10D2E00002681A4002600268802424061443046025 -:10D2F0008C4802680724A243022414430460B04807 -:10D3000002687F24A2431E24144304600268784C00 -:10D310001440254305600268764C1440C0229202F6 -:10D32000224302600268744C144004600268114099 -:10D33000016001680B4003600168802212060A4305 -:10D340000260A048006838400028FAD09E48006873 -:10D3500038400028FAD09D48006838400028FAD0AC -:10D360009B48006838400028FAD09A480168072294 -:10D3700091430160684698491022F7F7B5FC0026F2 -:10D3800035E000BFC4132040FFFCFFFF0013204026 -:10D3900080132040A01320400000244000152640A8 -:10D3A00044152640FF8FFFFF32200021F7F746FE8D -:10D3B000300040B2800028180168302291432200DA -:10D3C00052B21201302313400B430360641E20004D -:10D3D00040B26946320052B25200895C00B209B2D2 -:10D3E0008842E1DA32200021F7F728FE761C30006F -:10D3F00040B208283FD2300040B204280DD1EFF3EC -:10D400001084002080F31088FA239B000022012161 -:10D41000102000F00BFA84F31088704D300040B2F9 -:10D420008000281801680F2291436A4633005BB2DE -:10D430005B00D21852781207120F0A4302603000C4 -:10D4400040B280002818016830220A430260300090 -:10D4500040B2800028180168802252000A4302600E -:10D46000300040B2800028180168802212060A436A -:10D4700002600224ABE75A48134A01681140016078 -:10D48000F821C94303680B400360564803681A40FB -:10D490000260026811400160F7F7A8FE5248016877 -:10D4A000802212060A43026001680F430760F7F703 -:10D4B00092FE00F039F805B0F0BD00BF1C15264003 -:10D4C0002415264010102040FF00FFFF08102040C8 -:10D4D0000C1020402003204004122640041926404E -:10D4E00008192640FFFFF8FFFFFFFFEF0019264055 -:10D4F000FFE0FFFFFFFFE0FFFFFFFFF9FFFFFFCFB0 -:10D500000812264014192640F1D24D00FFFFFF8F6C -:10D5100018192640101926400C12264000162640E5 -:10D52000FFFFFFF71012264038B586B068462F4936 -:10D530001822F7F7D9FB6846F9F740FFC0B2002878 -:10D540000ED02B4C18222B492000FAF7CDF90020E1 -:10D55000E075FF20A830284908600020FAF724FA77 -:10D56000264D2800FAF7BCF9C0B200280ED0204C96 -:10D57000182220492000FAF7B7F90020E075FF20B3 -:10D58000AA301D4908600020FAF70EFA1C4C2868E2 -:10D59000206020681B4940181B49F6F7A7FD1B496E -:10D5A00008601B4D20681B494018FA218900F6F7D6 -:10D5B0009DFD28602868C0031749086007B030BD8A -:10D5C000041626400C1926401C19264040162640F9 -:10D5D000441626401412264054E8001040122640FB -:10D5E000080020400804204008152640C4E7001029 -:10D5F000181B0028E4E10010E81B0028841C002808 -:10D60000881C00283F420F0040420F00901C002859 -:10D610008C1C0028E7030000941C0028F3B595B08B -:10D62000170000210D000800684601801C00A4B20C -:10D63000A408200080B280218900884203D30125FC -:10D64000684604807E4C1C9E00F011F9002800D032 -:10D6500099E06846877016A8077801A81021F9F7A5 -:10D660005BFA0198022188433100C9B249000222C5 -:10D67000114001430191019804218843FFB2B90090 -:10D680000422114001430191019808218843694611 -:10D690008978C900082211400143019101981021A5 -:10D6A00088430190019820218843019001984021EE -:10D6B000884301900198802101430191614F0198B5 -:10D6C000384015A909780902F82252010A4002439C -:10D6D000019201985C490140019101980002000A01 -:10D6E000A82149050143019111A81021F9F714FA65 -:10D6F0001198800A8002A4B2A105890D01431191FD -:10D7000052480068002806D101980740D020400107 -:10D710003843019007E0002805D001980740802099 -:10D72000400138430190002211A901A8FFF79FF89A -:10D73000EDB2002D03D06846008800F08DF809A8EE -:10D740001021F9F7E9F9099802218843F6B271002E -:10D75000022211400143099109983D490140099174 -:10D7600009983C49014080204002084309900998EB -:10D770000002000A8821490501430991002109A8F6 -:10D78000FEF7EBFF50E000F07DF80128FBD000F041 -:10D7900073F80128F7D10DA81021F9F7BDF90DA8EC -:10D7A0000078FD2101400DA801700DA800780C2122 -:10D7B00001430DA801700D980002000AB02149052F -:10D7C00001430D9100210DA8FEF7C7FF00F054F8AA -:10D7D000002829D1EDB2002D03D06846008800F062 -:10D7E0003BF805A81021F9F797F90598022188431D -:10D7F000F6B27100022211400143059105981449C7 -:10D8000001400591059813490140802040020843DA -:10D81000059005980002000A8821490501430591F9 -:10D82000002105A8FEF799FF17B0F0BD1CB5012433 -:10D8300000949BB2D2B2C9B2C0B2FFF7EFFE13BDE3 -:10D84000FF010000FFE0FFFFFF1FFFFF3007001791 -:10D85000FF00FFFFFFFF00FF0D490A680D4B13405B -:10D8600080B200050C4A02401A430A60704708481B -:10D870000068C00FC0B27047084801680800C007C0 -:10D88000C00F704705480068C00FC0B27047000065 -:10D8900028102640FFFF0FC00000F03F2C1026404C -:10D8A00000B5010009B2002905D40121C006C00E4F -:10D8B00081408F48016000BDF0B5020012B2002A1D -:10D8C00018D418228B4B040024B2A408A4001C59BD -:10D8D000FF250600F6001640B540AC438901C9B2E9 -:10D8E0000500ED002A409140214300B280088000ED -:10D8F00019501CE00F22804C182503001BB2134066 -:10D90000083B9B089B00060036B23240083A92085A -:10D910009200A258FF260700FF002F40BE40B243EE -:10D920008901C9B2C0000540A9401143E150F0BDD2 -:10D9300080B500F012F87148714902680A4002602F -:10D94000704802680A4002606F4802681140016036 -:10D9500000F092F800F0A9F801BDFEB568466B49E9 -:10D960000CC90CC008390838002630000AE06A46A5 -:10D970000300DBB2DB00D2185268521C11400029B0 -:10D980000ED1401C0100C9B200290AD107216A4604 -:10D990000300DBB2DB00D2580A40002AE7D0FEE7E2 -:10D9A000FEE75B4C072021680140002900D0FEE71C -:10D9B000584F3968491C0840002800D0FEE7350060 -:10D9C00024E068462900C9B2C90040184168684689 -:10D9D0002A00D2B2D200805800F044F815E030009E -:10D9E0000028EED02168491E68462A00D2B2D20033 -:10D9F000805800F037F868462900C9B2C9004018BD -:10DA000041683868401C00F02DF86D1C2800C0B239 -:10DA1000002826D168462900C9B2C900405800280C -:10DA200014D0206869462A00D2B2D20089588842B0 -:10DA30000AD368462900C9B2C90040184068216865 -:10DA4000884201D30120CBE73000C9E768462900AE -:10DA5000C9B2C9004018406821688842BFD301207C -:10DA6000BEE7F7BD80B50022002302E00CC00838F5 -:10DA700008308842FAD301BD30B5274880082749CD -:10DA8000274A002308E01C00E4B2A40014591D003A -:10DA9000EDB2AD004C515B1C1C000500E4B2EDB2D0 -:10DAA000AC42F0D31F48016030BD10B510231121E6 -:10DAB0001A4800221C00E4B2A4001459DBB29B00F7 -:10DAC000C4500B00DBB29B00D258C9B2890042504F -:10DAD00001210020FFF7F0FE00210120FFF7ECFEFE -:10DAE0000020FFF7DDFE0120FFF7DAFE10BD000089 -:10DAF00000E100E000E400E01CED00E00013204045 -:10DB0000FFFFF7FF80132040A0132040B8E800106B -:10DB1000DCE10010E0E1001080000000001D0028A2 -:10DB20000000001008ED00E000B5010009B2002976 -:10DB300005D40121C006C00E81404A48016000BDE5 -:10DB400000B5FEE780B54848006848480068C10F46 -:10DB5000002905D046498005800D8000085880477F -:10DB60000020FFF7E1FF01BD80B542480068424850 -:10DB70000068C10F002905D03D498005800D800057 -:10DB8000085880470120FFF7CFFF01BD80B53B4813 -:10DB900000683B480068C10F002905D03449800562 -:10DBA000800D8000085880470220FFF7BDFF01BDAF -:10DBB00080B53448006834480068C10F002905D09A -:10DBC0002B498005800D8000085880470320FFF70F -:10DBD000ABFF01BD80B52D4800682D480068C10F1E -:10DBE000002905D022498005800D80000858804713 -:10DBF0000420FFF799FF01BD80B52648006826483C -:10DC00000068C10F002905D019498005800D8000EA -:10DC1000085880470520FFF787FF01BD80B51F48E2 -:10DC200000681F480068C10F002905D01049800511 -:10DC3000800D8000085880470620FFF775FF01BD62 -:10DC400080B51848006818480068C10F002905D041 -:10DC500007498005800D8000085880470720FFF79E -:10DC600063FF01BD80E200E02CE9001000112040BC -:10DC70004809002830E900100411204034E9001060 -:10DC80000811204038E900100C1120403CE9001038 -:10DC90001011204040E900101411204044E9001008 -:10DCA0001811204048E900101C112040ACE600107B -:10DCB00004E8001080023140040000000800000069 -:10DCC000800658403A01000000093140020000007F -:10DCD0000A0F0D07E0010000FC530000982100002E -:10DCE000F4010000E8030000F401000038E7001030 -:10DCF00014E8001080023140050000000800000018 -:10DD0000000758403B0100000005314001000000C1 -:10DD10000AF0D07076010000E0150000D417000072 -:10DD20005E010000E8030000F401000054E7001069 -:10DD300024E800100004314000000000080000004A -:10DD400080095840400100000007314000000000F9 -:10DD5000090F0D0795030000901A0000282300000A -:10DD6000F4010000E8030000F401000070E7001077 -:10DD700034E800108000314000000000080000007E -:10DD8000000658403901000000063140050000003F -:10DD900009F0D07087020000201C000098210000CC -:10DDA000F4010000D0070000F401000080B5F3F793 -:10DDB0007FFAFCF773F9FCF761F8FA208000F7F7B7 -:10DDC0007DF9F4E710B5FEF73BFBFEF777F8FFF7B8 -:10DDD0005FF9F3F76DFAFEF733FB002803D0FEF787 -:10DDE0006DF8002801D1FFF7E1FF204C00F042F868 -:10DDF000206000F042F82068FBF7DEFFFCF76EF8C9 -:10DE0000002801D0FFF7D2FF62B6194CF5F7D4FF16 -:10DE100020602068002804D00120FCF737F8FFF7C5 -:10DE2000C5FF0120F4F7BDFFFCF778F8002804D106 -:10DE30000120FCF72BF8FFF7B9FFF7F719FA0028D4 -:10DE400001D1FFF7B3FFF7F76FFAFCF7C7F8FCF75C -:10DE500045F8002803D0F3F72BFAFCF71FF9FCF77D -:10DE60000DF8FA208000F7F729F9ECE7EC1B002801 -:10DE7000281200280648006870470020C043044963 -:10DE800008600449086000200349086070470000EA -:10DE9000001826400418264008102640443A5C68C2 -:10DEA00075616E672E7875657765695C4769745C26 -:10DEB000436F676E69746976655F4167656E745C10 -:10DEC0002E636F6465785F746D705C736561742D2B -:10DED0006669726D776172652D6275696C642D6219 -:10DEE00061643338633535313366393461393362CF -:10DEF0003532633831626334303338363763335CFC -:10DF0000636F6D6D6F6E5C7372635C64726976656E -:10DF100072735C6970635C63795F6970635F64727C -:10DF2000762E6800F1B401684118436858080A1851 -:10DF300000988068DB0701D54B46C01891422DD070 -:10DF40000D78491C032403262E4002D10E78F61CBE -:10DF5000491C2B090F2B07D10B780F33491C03E009 -:10DF60000F78491C0770401C761EF9D1002BE5D0B4 -:10DF70000E78491CAD082C40032C01D10C78491CAB -:10DF800024023419654244190025AE1E9E42D5D0A4 -:10DF90002678641C0670401C6D1CF6E700980C3057 -:10DFA000F2BC704700053140060000000000000090 -:10DFB000801890400200000000063140010000007F -:10DFC00000000000401990400500000000053140AD -:10DFD0000700000000000000C0189040030000008F -:10DFE000000531400500000000000000401890408E -:10DFF00001000000000631400200000000000000A7 -:10E000008019904006000000000631400600000024 -:10E0100000000000801A90400A0000000400000088 -:10E0200000000000000000000000000001000303E9 -:10E030001F4E000000000000000000000000000073 -:10E0400000000000000000000000000000000000D0 -:10E0500000000000000000000000000002030000BB -:10E0600000000000030000000000000003000000AA -:10E07000000000000300000000000000030000009A -:10E080000000000003000000010000000102000089 -:10E09000040000000000000000000000000000007C -:10E0A000010003031F4E00000000000000000000FC -:10E0B000204E0000000000000000000000000000F2 -:10E0C0000000000000000000000000000000000050 -:10E0D0000203000000000000030000000000000038 -:10E0E000030000000000000003000000000000002A -:10E0F0000300000000000000030000000100000019 -:10E100000102000004000000000000000000000008 -:10E110000000000001000303630000000000000095 -:10E1200000000000320000000000000000000000BD -:10E1300000000000000000000000000000000000DF -:10E1400000000000020300000000000003000000C7 -:10E1500000000000030000000000000003000000B9 -:10E1600000000000030000000000000003000000A9 -:10E17000010000000102000072B61048104908605A -:10E18000BFF34F8F0120C0040E490A6802430A60A2 -:10E190000D490A6802430A600C490A6802430A6092 -:10E1A000002000210D4A03C26A45FCD1084FB84740 -:10E1B000084FB847084FB847FEE7000000000010BE -:10E1C00008ED00E00013204080132040A013204001 -:10E1D00031D9001045E60010A9E7001000FF012822 -:10E1E000FFFF0128443A5C6875616E672E7875659B -:10E1F0007765695C4769745C436F676E69746976BB -:10E20000655F4167656E745C6669726D77617265A2 -:10E210005C7432675C747669696268386D5C7372CD -:10E22000635C73797374656D5C7265765F645C734F -:10E23000797374656D5F747669696268386D5F6360 -:10E240006D30706C75732E6300000000443A5C689A -:10E2500075616E672E7875657765695C4769745C72 -:10E26000436F676E69746976655F4167656E745C5C -:10E270006669726D776172655C7432675C74766929 -:10E28000696268386D5C7372635C6472697665722A -:10E29000735C737973636C6B5C63795F73797363BD -:10E2A0006C6B2E6800000000443A5C6875616E6714 -:10E2B0002E7875657765695C4769745C436F676E36 -:10E2C00069746976655F4167656E745C6669726DD5 -:10E2D000776172655C7432675C747669696268380C -:10E2E0006D5C7372635C647269766572735C73797A -:10E2F00073636C6B5C63795F737973636C6B2E63B0 -:10E3000000000000443A5C6875616E672E787565A0 -:10E310007765695C4769745C436F676E6974697699 -:10E32000655F4167656E745C6669726D7761726581 -:10E330005C7432675C636F6D6D6F6E5C7372635C8F -:10E34000647269766572735C7379737469636B5C0C -:10E3500063795F7379737469636B2E6300000000E7 -:10E36000443A5C6875616E672E7875657765695C9F -:10E370004769745C436F676E69746976655F41676E -:10E38000656E745C6669726D776172655C74326724 -:10E390005C636F6D6D6F6E5C7372635C6D775C66F2 -:10E3A0006C6173685C63795F6D775F666C617368DD -:10E3B0002E6300009F0F000000000000000000001E -:10E3C000000000000000000000000300000000004A -:10E3D000000000000000000000030000000000003A -:10E3E0000300000000000000030000000000000027 -:10E3F0000300000000000000030000000100000016 -:10E40000000000000100000000000000000000000B -:10E4100010000000100000001000000001000001CA -:10E4200000000000000000000000000000000000EC -:10E4300000000000000000000000000000000000DC -:10E4400070B40123002413E00168001D194202D0BA -:10E450004D466918491E0C60091D121F042AFAD284 -:10E460000D00960701D50C80AD1C1A4000D02C7011 -:10E470000268001D002AE7D170BC70470000000050 -:10E480000600000000000000000000000000000086 -:10E49000000000000000000000000000000000007C -:10E4A000000000000000000000000000000000006C -:10E4B0000000000006000000000000000000000056 -:10E4C000000000000000000000000000000000004C -:10E4D000000000000000000000000000000000003C -:10E4E000000000000000000008000000150000000F -:10E4F000000000000000000000000000000000001C -:10E50000000000000000000000000000000000000B -:10E510000000000000000000010000000E000000EC -:10E5200015000000000000000000000000000000D6 -:10E5300000000000000000000000000000000000DB -:10E5400000000000000000000000000001000000CA -:10E5500006000000000000000000000000000000B5 -:10E5600000000000000000000000000000000000AB -:10E57000000000000000000000000000000000009B -:10E580000000000006000000000000000000000085 -:10E59000000000000000000000000000000000007B -:10E5A000000000000000000000000000000000006B -:10E5B000000000000200000000000000983A000087 -:10E5C0000E01FA00CC0190010200000003000000DF -:10E5D00000000000983A0000720182001C02CC0189 -:10E5E000020000000500000000000000307500007F -:10E5F000F6001901BD02EE01020000000600000055 -:10E60000000000003075000087018C009501940126 -:10E610000200000001000000A8E80010B4E50010AE -:10E6200002000000A4E9001008003200020000000F -:10E63000B0E80010E4E5001002000000A0E90010BE -:10E640000C00320010B5074979441831064C7C445F -:10E65000163404E0081D0A68891888470100A142A1 -:10E66000F8D110BD0800000024000000D5FDFFFF18 -:10E67000CC0900000813002800000000A9F8FFFFE3 -:10E680005A030000380100000008002800000301C0 -:10E690000000000001000000000000000000000079 -:10E6A00001000000FF0F0100000000004D4F544F1B -:10E6B000525F494E325F4842375F4842385F484FA9 -:10E6C00052495A4F4E54414C0000000004207146FC -:10E6D000084202D0EFF3098001E0EFF3088000B5B3 -:10E6E0000149884700BD0000AF79001000F00EF826 -:10E6F000002801D0FFF7A6FF00BF00BF002000BF29 -:10E7000000BFFFF75FFB00F003F800000020704738 -:10E7100080B500F001F801BD0746384600F002F868 -:10E72000FBE7000080B500BF00BF024A11001820BF -:10E73000ABBEFBE7260002004D4F544F525F494EDF -:10E74000335F4842355F4842365F534541545F501E -:10E75000414E00004D4F544F525F494E345F484286 -:10E76000335F4842345F4241434B524553540000AB -:10E770004D4F544F525F494E315F4842315F4842DE -:10E78000325F4C4547524553540000000420714607 -:10E79000084201D0EFF30980EFF3088000B501498A -:10E7A000884700BD65E800100548014603B4684687 -:10E7B00080F3098800BF00BF00BF00BFFFF796FFCE -:10E7C000A5EDF5FE00127A00000000000024F40020 -:10E7D0000080000000800000008000009E029E0A71 -:10E7E000AA02AA0ACE03CE0B2A042A0C0003000BAD -:10E7F000010002000400080010002000400080001A -:10E8000000010002484F52495A4F4E54414C5F4854 -:10E81000414C4C00534541545F50414E5F48414C80 -:10E820004C0000004241434B524553545F48414C19 -:10E830004C0000004C4547524553545F48414C4CF6 -:10E8400000000000E02E0000401F0000E02E00004D -:10E85000102700000003000100040103020200026F -:10E86000000300058169891E0978C9B201607047FB -:10E870000000000000010101010101000001000091 -:10E880000203040506080C10000000000000000050 -:10E890000200000001000000040300011314001531 -:10E8A000C7010300010000004001BE00F401AE01F9 -:10E8B00087018C009501940100080028FFFF0128C2 -:10E8C0000000000000000000000000000000000048 -:10E8D0000000000000000000000000000000000038 -:10E8E0000000000000000000000000000000000028 -:10E8F0000000000000000000000000000000000018 -:10E900000000000000000000000000000000000007 -:10E9100000000000000000000000000000000000F7 -:10E9200000000000000000000000000000000000E7 -:10E9300000000000000000000000000000000000D7 -:10E9400000000000000000000000000000000000C7 -:10E9500000000000000000000000000000000000B7 -:10E9600000000000000000000000000000000000A7 -:10E970000000000000000000000000000000000097 -:10E980000000000000000000000000000000000087 -:10E990000000000000000000000000000001020371 -:10E9A00032325A325A5A5A32000102035A5A5A5AC9 -:10E9B000FEE70000FEE70000FEE70000FEE70000C3 -:10E9C000FEE70000FEE70000FEE70000FEE70000B3 -:10E9D000FEE70000FEE70000FEE7400455000200ED -:10E9E0000100015003459C0010000132FD0CA00401 -:10E9F0000900040101000112050E83DCE728600410 -:10EA0000FFFFFF1F020225920807F001035240009A -:10EA100001F2060218F2060418F2060618F20608B9 -:10EA200018F306005478F10618F2060418F20606E8 -:10EA300018F2050818F002FF41DB001004F1FF0492 -:10EA4000F1FF04F1FF04F1FF04F1FF04F1FF04F111 -:10EA5000FF04F147046C0248090028060AF3210666 -:10EA60000001F12334F25208680009010101020398 -:10EA70000203010F0F010000000000000000000071 -:10EA80000000000000000000000000000000000086 -:10EA90000000000000000000000000000000000076 -:10EAA0000000000000000000000000000000000066 -:10EAB0000000000000000000000000000000000056 -:10EAC0000000000000000000000000000000000046 +:1032C0000220802160549620205C00287DD1574840 +:1032D000006860619620255430008621605474E0B7 +:1032E00068460078002839D068460078012802D165 +:1032F000A068B84206D368460078022804D1A068C6 +:10330000874201D2280000E030009621615C00294C +:1033100007D14649096861619621655431008622CA +:10332000A154C0B2002850D13F48019989014018EA +:10333000406901F01AFC30007E2160543000802189 +:1033400060543A480068E06194202554684601784A +:103350002000FEF72DFB6846857036E09520205C46 +:1033600000281DD0A068874201D1300005E0A06888 +:10337000B84201D2280000E0022080216054206A77 +:10338000E061942025549620205C00281DD1274818 +:10339000006860619620255430008621605414E056 +:1033A000A068874206D13000862160542000FEF7D5 +:1033B0004FFB0AE0A068B84202D26846057402E0FA +:1033C00002206946087468464570029801F0C4FB03 +:1033D00068468078002809D00198FEF77BFA00281B +:1033E00001D0300000E02800C0B215E06846407807 +:1033F000002810D0002003900020029000200190AF +:10340000002000903B0001226846017C6846007E57 +:10341000FEF738FC00E0002007B0F0BD08130028DC +:10342000BD1C0028BF1C0028DCE60010F81B00288B +:10343000FEB5C0B20400FDF76DFE019010E0FFB2D2 +:10344000002F46D0FDF766FE0199401A9849884240 +:1034500041D234480078002801D001F0A1FF30BFEC +:10346000FEF78AFF02F067F801F072FB00908425F6 +:103470006D002B4E2000684330189521475C8D4825 +:10348000007800281AD1200068433018FDF749F869 +:10349000002813D02000684330187E21405C0028AB +:1034A0000CD12000684330189421405C002805D1DD +:1034B000654370198221405C002801D0012500E09D +:1034C0000025009801F048FBEDB2002DB7D0002098 +:1034D00002E0012000E00020FEBD0000FBB5170067 +:1034E000089C0299002901D1002C18D0060001F097 +:1034F0002FFB84225200704B310051435D585643DC +:1035000099194E6801F028FB0298002803D0019811 +:10351000281A02990860002C01D0F01B2060F7BD2A +:1035200008130028C41C0028F1B586B00E00150051 +:103530006846047E6846007E032802D1022005907A +:1035400001E00420059004930498002802D0002094 +:10355000049908606846007EFFF76AFF002801D1E1 +:103560000120A3E02F0001F0F3FA0500380000214C +:10357000FA229200002301F047F802000B00B34842 +:10358000002180185941FA22D200002300F049FDA1 +:10359000494984225200624389188861280001F059 +:1035A000DBFA00200390002002900120019001200E +:1035B0000090002300223100C9B26846007EFEF769 +:1035C00061FB002801D0012070E001F0C1FA3A4906 +:1035D0008422520062438918C96A019101F0BCFA41 +:1035E0000FE0FFB2002F50D1EDB2002D02D1F6B2A4 +:1035F000002E4AD0D0480078002801D001F0D0FE3B +:1036000030BFFEF7B9FE01F096FF01F0A1FA842267 +:103610005200294B2100514359184968009121005B +:103620005143591883254F5D2100514359187E2578 +:103630004D5D6243991894228E5C01F08DFA0098DA +:103640000199401A05998842CBD36846007EFFF75E +:1036500034F8002805D16846007EFFF7E9FE00280F +:1036600009D1049800900023019A00212000FFF75F +:1036700035FF01201AE0049800900023019A0021F0 +:103680002000FFF72BFF002010E06846007EFFF7C8 +:1036900014F86846007EFFF7CBFE049800900023E4 +:1036A000019A00212000FFF719FF012007B0F0BDAB +:1036B000C4090000BF1C002808130028F1B586B01B +:1036C0000E0015006846047E3000C0B2022803D107 +:1036D00002206946087402E00320694608740593D5 +:1036E0000598002802D00020059908600C98002851 +:1036F00002D000200C9908606846007EFFF798FE13 +:10370000002801D1012014E12F0001F021FA050069 +:1037100038000021FA229200002300F075FF020019 +:103720000B004A48002180185941FA22D200002398 +:1037300000F077FC9D498422520062438918886119 +:10374000280001F009FA00200390002002900120D7 +:10375000019001200090002300223100C9B2684688 +:10376000007EFEF78FFA002801D00120E1E001F091 +:10377000EFF984256D008D4E210069437118896A27 +:103780000291210069437118C96A019101F0E4F9BD +:1037900013E068464078002800D0B9E06846007819 +:1037A000002803D1FFB2002F00D1B1E062480078B9 +:1037B000002801D001F0F4FD30BFFEF7DDFD01F07F +:1037C000BAFE01F0C5F92100694371188322895CB2 +:1037D0006A4651702100694371187E22895C6A46ED +:1037E000117021006943711894228F5C2100694394 +:1037F00071189522895C6A46917001F0ADF96846AE +:1038000040786946097C8842C3D168460078002820 +:10381000BFD13800C0B20028BBD1684680780028EC +:1038200016D06846007EFFF703FE002810D16846D8 +:10383000007EFEF742FF0C980090059B019A0299CA +:103840002000FFF74BFE012073E000BFCF07000010 +:1038500001F07EF907002000684330188321405CA6 +:103860006946097C88421FD12000684330187E21B8 +:10387000405C002818D12000684330189421405C37 +:10388000002811D12000684330189521405C0028A1 +:103890000AD1200068433018FCF743FE002803D00B +:1038A00043480078002810D0380001F055F96846E8 +:1038B000007EFEF702FF0C980090059B019A02998A +:1038C0002000FFF70BFE012033E020006843305852 +:1038D00003902000684330184068009000206C433B +:1038E00031198B228854380001F036F905980028E8 +:1038F00004D003980299401A059908600C98002892 +:1039000004D000980199401A0C990860002010E03A +:103910006846007EFEF7D1FE6846007EFFF788FD10 +:103920000C980090059B019A02992000FFF7D6FDA4 +:10393000012007B0F0BD0000C41C0028F2B582B021 +:103940001C4980010818806A00216A4603C2083AAF +:1039500064240025684603C84622002300F054FE74 +:1039600022002B0000F05DFB06000F00684603C834 +:103970008222002300F048FE22002B0000F051FBC1 +:10398000029A082A0FD3029A0023BB420BD301D814 +:10399000B24208D3029A0023994204D301D890423C +:1039A00001D3012000E00020C0B2FEBD08130028B2 +:1039B000BF1C0028DCE60010F1B590B00F00160027 +:1039C00010A80478002004900020089000200C909B +:1039D00000200B9010A80078032802D102200E903E +:1039E00001E004200E900020002000200020002094 +:1039F0000A90002009903220694648730125002072 +:103A0000002069460871002069460875002005A954 +:103A100048700020069007932348007800281FD0A4 +:103A200010A80078FCF76AFD002819D01F4800781C +:103A3000002815D11E480078002811D1029602985E +:103A400000280DD0684607736846007B002811D017 +:103A50006846007B01280DD06846007B022809D00B +:103A60000798002804D005A803C8079A03C2083A9B +:103A700001203EE201F06CF8009084277F000D4E9B +:103A8000200078433018FCF74CFD002814D1009832 +:103A900001F062F80798002804D005A803C8079A27 +:103AA00003C2083A012024E2BD1C0028C01C0028E3 +:103AB000BF1C002808130028200078433018C06875 +:103AC0000D90009801F048F810A80078FEF7F5FD79 +:103AD000002800D0C2E16846007B002800D08CE0BE +:103AE00008A8009004AB029A022110A80078FFF702 +:103AF000E5FD05002800C0B2002857D108980E99AE +:103B0000884253D20020694608701CE010A8007853 +:103B1000032806D13C2110A80078FEF7B5FE002846 +:103B200022D168460078022808D200200B900BAB07 +:103B3000029A022110A80078FFF7F6FC6846007888 +:103B4000401C694608706846007803280DD20CAB0B +:103B5000029A012110A80078FFF7E6FC0500280072 +:103B6000C0B20028D2D100E001252800C0B2002850 +:103B70001CD108A8009004AB029A022110A800787A +:103B8000FFF79CFD05002800C0B200280ED1089860 +:103B900000210022401C514102000B000C98002122 +:103BA0008B4203D801D3824200D201252800C0B243 +:103BB000002820D100F0CCFF00902000784330187E +:103BC000FCF7AFFC002804D1009800F0C5FF0125E8 +:103BD00044E1002120007843301881600121200059 +:103BE0007843301889228154009800F0B5FF0120F5 +:103BF0006946087521E101251FE16846007B01281F +:103C000030D10020009004AB029A012110A8007866 +:103C1000FFF754FD05002800C0B2002820D100F0B5 +:103C200097FF0090200078433018FCF77AFC0028BA +:103C300004D1009800F090FF01250FE10D992000BC +:103C400078433018816001212000784330188922A0 +:103C50008154009800F080FF012005A94870ECE035 +:103C60000125EAE0002000900023029A022110A81A +:103C70000078FFF723FD05002800C0B2002828D1F6 +:103C800000F066FF0500200078433018FCF749FC7F +:103C9000002804D1280000F05FFF0125DEE00021AC +:103CA0002000784330188160200078433018892242 +:103CB0008154280000F050FF01206946087500205B +:103CC000009004AB029A012110A80078FFF7F6FCDF +:103CD00005002800C0B2002800D0ADE00499200003 +:103CE000FFF72CFE002800D1A6E000F031FF2100F4 +:103CF0007943711883225200895C6A4691732100CE +:103D000079437118A42289580F91210079437118C1 +:103D1000A82289580E9100F01FFF6846807B00287A +:103D20000ED003A8401C029009A801900AA8009098 +:103D30000E9B0F9A04992000FCF750FC694608710D +:103D400000F006FF0090200078433018FCF7E9FBF4 +:103D5000002804D1009800F0FFFE01257EE00499C0 +:103D6000200078433018C16004992000784330184F +:103D700081600121200078433018892281546846EF +:103D8000807B00284FD06846007900281FD00A9910 +:103D9000200078433018AC228150099920007843E4 +:103DA0003018B02281506846417B2000784330189B +:103DB000F22281546846417B200078433018F32278 +:103DC0008154200078433018FCF7EEFB2BE00021F3 +:103DD0000A0020007843301883235B00C25420007F +:103DE00078433018A4228150200078433018A8224C +:103DF0008150200078433018AC2281502000784355 +:103E00003018B0228150200078433018B4228150FD +:103E10003221200078433018F22281542000784368 +:103E20003018F3228154009800F096FE012005A975 +:103E300048700498069000E001252800C0B20028D0 +:103E40000CD16846007B022808D000F081FE2100DA +:103E500079437118C968069100F07EFE2800C0B24F +:103E600000283CD034480078002803D110A80078FE +:103E7000FEF723FC00F06CFE00906846007B0228F1 +:103E800008D16846007D002804D0049920007843BA +:103E9000301881600D99200078433018C1600021EE +:103EA0000A002000784330188923C2540A002000F9 +:103EB000784330188B23C254200078433018962260 +:103EC00081541D480078002801D0072000E0082018 +:103ED0007C43311983228854009800F03DFE0798F6 +:103EE000002804D005A803C8079A03C2083A28008E +:103EF000C0B211B0F0BD38B5002010490870FDF710 +:103F000087F9FDF725FAFDF751FB050000F097FC56 +:103F10000400FDF707F9EDB2002D06D0E4B2002C45 +:103F200003D0FCF733FC002803D1FDF7F5FB01209B +:103F300000E0002032BD0000BF1C0028C01C00288B +:103F4000D021890040587047C22189004058C005DF +:103F5000C00D7047902292008150704782218900E5 +:103F60004058C005C00D704700B50068800B800741 +:103F7000800F002801D1802000E0402000BD00B566 +:103F8000C02189004058C006C00E082801D2012077 +:103F900000E00020C0B200BDF8B504000D0016001E +:103FA0002000FFF7ECFF002809D02F000025B542C4 +:103FB00010D22000FFF7C4FF78556D1CF7E72F00E3 +:103FC000002505E02000FFF7BBFF690078526D1C5B +:103FD000B542F7D3F1BDF8B507000D001600380063 +:103FE000FFF7B2FF0400A64200D2340029002200ED +:103FF0003800FFF7D1FF2000F2BDF8B505000C0036 +:1040000000262800FFF7B0FF07002800FFF7A6FFF3 +:10401000874204D021002800FFF79CFF01263000D2 +:10402000F2BD12422DD0994231D970B500251B4204 +:1040300009D00C00002112E0110000F0F7F80A008E +:104040000021002370BD0942F6D000240126491842 +:104050006441944200D3A41A7641F8D3310001267A +:1040600001E0764109D2001864416D41A41A9D41D6 +:10407000F7D2A4185D41B619F5D3300022002B0009 +:1040800070BD1B42CFD108B503F066F808BD01D161 +:104090009042CAD202000B000021002070470000AD +:1040A00070B55F4BC018C00900015E4BC3180429EE +:1040B0000CD21F251C68CE002800B0408443D2B229 +:1040C0001540C800854025431D600CE0FC311F25CC +:1040D0005C68CE002800B0408443D2B21540C800CE +:1040E000854025435D6070BD00B5002A03D10122E3 +:1040F0008A40426002E001228A40826000BD30B402 +:1041000003008C000F25596C2800A0408143154006 +:10411000A5400D435D6430BC704730B403000125F9 +:104120009C6C28008840844315408D4025439D6445 +:1041300030BC704730B403000125DC6C2800884097 +:10414000844315408D402543DD6430BC704730B456 +:1041500003004C0010340325D96C2800A040814393 +:104160001540A5400D43DD6430BC70474269012213 +:104170008A4042614069704730B4030001259C6960 +:1041800028008840844315408D4025439D6130BC04 +:10419000704730B403004C000325196C2800A04080 +:1041A00081431540A5400D431D6430BC7047F8B5F0 +:1041B00004000025002C30D01600002E2DD00F005A +:1041C000326839002000FFF78FFF327A3900200073 +:1041D000FFF766FF726939002000FFF79EFFB269A2 +:1041E00039002000FFF7A6FFF26939002000FFF731 +:1041F000AEFF726839002000FFF781FFF2683900D6 +:104200002000FFF7C6FF39002000FFF7AFFF32693B +:1042100039002000FFF7B0FF00E0034D2800F2BD99 +:104220000000CFBF0000304001005A000022030A06 +:104230008B420BD203098B4219D243088B422ED2F8 +:10424000411A00D20146524110467047FF2209022E +:104250003FD012068B4205D3121209028B4201D3C2 +:104260001212090203098B4219D300E0090AC3099B +:104270008B4201D3CB01C01A524183098B4201D337 +:104280008B01C01A524143098B4201D34B01C01A22 +:10429000524103098B4201D30B01C01A5241C3089A +:1042A0008B4201D3CB00C01A524183088B4201D309 +:1042B0008B00C01A524143088B4201D34B00C01AF5 +:1042C0005241884200D3401A5241CFD20146104693 +:1042D000704708B502F042FF08BD0000F8B50123A1 +:1042E0001A00002800D151E1002900D14EE1A84A6E +:1042F00012680C7AA74D1540A4048022D202144003 +:104300002C430322CE681640A34D25403604C0241A +:10431000A40234402C430D786E07760F9F4D254044 +:104320003606E024E40434402C438E789C4D25402E +:10433000B4078026F60534402C4328254D5D012620 +:10434000B4431D40254334240C5D0226B54364006C +:10435000022634402C430D7F0426B443AD000426CE +:10436000354025434C7F0826B543E40008263440F9 +:104370002C4340254E5D1E408A4D2540B4028026C8 +:10438000F60034402C4340254D5DEDB26D081E0013 +:104390002E40F6B2844D254074028026B60034408B +:1043A0002C4370254E5D814D2540340280267600D9 +:1043B00034402C4371254E5D16407D4D254036031B +:1043C000C024A40134402C4304600C7A002C02D198 +:1043D0000023836006E00C7A012C02D14B698360D4 +:1043E00000E083600B6A03614B6A4361CB6A8361BF +:1043F0000B6BC3614B6903628B6943626D4B1C6835 +:104400004423CB5CDBB2FF25AC4323434C240C5D3F +:10441000E4B2694D1D402404FF231B0423402B43B9 +:104420005C240C5DE4B21D022D0A23062B436C2490 +:104430000C5DE4B2614D1D402402FF231B022340AA +:104440002B4343645E4B1B6864240C5DE4B25B4DFC +:104450001D402402FF231B0223402B4354240C5DE8 +:10446000E4B2FF25AB431C438464564B1C684123D4 +:10447000CB5C13400325AC43234360240C5D144004 +:10448000514E1E40A302C0252D011D403543482337 +:10449000CE5C16403023DB4330241D4037012740DB +:1044A0002F4350254D5D1540484E3E402F02C025FC +:1044B000AD003D40354358268E5D1640C027BD43B4 +:1044C000B701C0263E402E4368254D5D15400C27A0 +:1044D000BE43AF000C253D403543C5643C4D2D68BF +:1044E00007267227CF5D374000970727BD432F006F +:1044F000009D3D437327CF5D3E407027BD4337018C +:1045000070263E402E43466535254D5D8567314D0D +:104510002D680E7C16400327BD432E43CD7C1540ED +:10452000C027BE43AF01C0253D4035434E7C1640F9 +:104530000C27BD43B7000C263E402E438D7C2A40FD +:104540003340120114401C430465234A1268CB888F +:1045500094B21A0422438B889BB21B0A9BB2174C5D +:1045600014401B02FF2212021A4022430B78052B33 +:1045700005D10979C9B2FF239A43114304E0497870 +:10458000FF239A43C9B21143016300221000F2BD18 +:1045900084F30010FFFFFBFFFFFFFCFFFFFFFFF8AE +:1045A000FFFFFFBFFFFBFFFFFFFDFFFFFFFEFFFF62 +:1045B000FFCFFFFF88F30010FFFF00FFFF00FFFFAA +:1045C0008CF3001090F30010FFF3FFFFFFFCFFFFE0 +:1045D00094F3001098F300109CF3001001688022FF +:1045E00012060A43026070470168490049080160E9 +:1045F000704740687047016170470069704781608B +:104600007047006A7047000030B4434351435D185F +:10461000010C0C00130C5C432D1980B2434392B281 +:1046200051430024C918644124040B04090C0919DE +:104630005043C018694130BC7047000000B50228E3 +:1046400001D301200FE00B00DBB2042B01DB0120C2 +:1046500009E0BE4B80001818C9B2405C824201D309 +:10466000012000E0002000BDF8B504001F00022C6E +:1046700001D3012023E015000E002A003100C9B249 +:104680002000FFF7DBFF012801D1012017E03000F7 +:10469000C0B2002816D1FF2F12D8AD4861034018D0 +:1046A000A90040188021490140180168A94A0A4020 +:1046B0003902FF231B020B40134303600020F2BDAD +:1046C0000120FCE7F6B2012E16D18020400287427D +:1046D00010D29F4861034018A9004018A021490149 +:1046E000401801689C4A0A403902C94B0B401343E9 +:1046F0000360E3E70120E2E70120E0E700B20012F7 +:10470000C0B27047F8B505000F001600280000B2CF +:10471000FFF7F4FF04002000C0B2022801D30120FB +:104720002CE032003900C9B22000C0B2FFF786FF8A +:10473000012801D1012021E085482100C9B24903A7 +:1047400041182A00D2B292008918C02212018A5858 +:10475000B0491140FFB23B02C02292001A400A4306 +:10476000FF218A43F1B21143E4B262038018EDB233 +:10477000AA008018C022120181500020F2BD70B53D +:104780000400022C01D3012028E015000E002A00AD +:104790003100C9B22000FFF751FF012801D10120EB +:1047A0001CE06B4861034158802212060A43C02175 +:1047B00089041143FF2212040A43964B1340F6B2B8 +:1047C0003202C021890011401943FF229143EAB20D +:1047D0000A436103425061034058002070BD70B528 +:1047E0000400022C01D3012028E015000E002A004D +:1047F0003100C9B22000FFF721FF012801D10120BB +:104800001CE05348610341588022D2050A43C0216D +:1048100089041143FF2212040A437E4B1340F6B26F +:104820003202C021890011401943FF229143EAB2AC +:104830000A436103425061034058002070BDF8B53F +:1048400098B00BA8342102F09BFC9A4803C801AA37 +:1048500003C2083A03A8A549202200F0E5FAAA48B5 +:104860000078002801D001206DE000252C0007E031 +:104870002800A649620088522800A5490855641CF2 +:10488000062C14D2A348142161434118097A0BAABB +:1048900011720BAA14216143411849681423634320 +:1048A000C058FFF784FC0028E2D000204BE06846A7 +:1048B00000F0B2F8002801D1002044E00098002167 +:1048C000962292000023FFF79FFE934A00231218BE +:1048D0004B4110001900914A0023FFF7A2FB00286A +:1048E00000D1012003AFB8818D4E300002F0C6FC2C +:1048F00001A9300002F05EFC002801D0002022E077 +:104900002C0006E0142060432818C06802F0B4FDB3 +:10491000641C062C13D27F4D142060432818007CA1 +:10492000787103A9142060432818C06802F0AAFC1B +:104930000028E7D0300002F0A1FC002003E00120B5 +:1049400071490870012019B0F0BD00009CF2001000 +:1049500000000440FF00FFFFFF0000FFF8B584B037 +:104960000E00C0B20290002528006946088004218C +:104970002A0003AC200002F0F3FB2C006248007810 +:10498000002806D0674F3878002802D10298062800 +:1049900001D3002039E0012038705E4802991422CA +:1049A00051434018C0680190019800F0A1F80198A7 +:1049B00002F06EFD019800F07FF800281FD003AAD6 +:1049C0006946019802F06AFD002818D103A8C07852 +:1049D000002814D0684600880005000D694608804C +:1049E000684600884949029A520088520124484882 +:1049F00002994454002E02D0684600883080019805 +:104A000000F076F83D702000C0B205B0F0BD0000A7 +:104A100000FFFF00FFFCFFFFF8B50700002000903B +:104A2000FF262C363000FFF769FE0500002F04D06A +:104A3000684603F043FA002801D0002038E00098CF +:104A4000394940183949FFF7F1FB0400002C02D026 +:104A50003748844201D300202AE0042201212800A3 +:104A6000FFF7BDFE002801D0002021E00422012133 +:104A70003000FFF747FE002801D0002018E0631E39 +:104A8000042201212800FFF7EFFD002801D00020BB +:104A90000EE0042201212800FFF771FE002801D05A +:104AA000002005E000982100FFF7C0FB38600120DE +:104AB000F2BD000074F200107CB505001D4C06210B +:104AC00000226E46300002F04BFB6946280002F0DF +:104AD000D1FD68460078002803D1641E002CF4D173 +:104AE00001E0012000E0002076BD00008CF0001005 +:104AF000E0B511490CC9083969460CC10839694645 +:104B000002F062FD07BD0000B31C0028901B0028C6 +:104B1000A81B00284CE90010FFC99A3B00CA9A3B29 +:104B200000109040B41C00285F8DCB00608DCB003E +:104B300001000100A08601007CF2001000000000CE +:104B4000801C800803D0401C801EFCD100BF704731 +:104B5000EFF3108072B6704780F3108870474030D2 +:104B6000016810220A430260704740300168082241 +:104B70000A43026070470000F8B5012422004C236C +:104B8000CB5C052B03D24D23CB5C052B01D310004E +:104B9000E2E0002800D1DEE0002900D1DBE06F4A2E +:104BA00012684B7923406E4D15409B048022D2023F +:104BB00013402B4303228D7915406A4E1E402B046F +:104BC000C025AD021D40354307230E7A1E40664FB7 +:104BD0002F403606E025ED0435403D43CE79634F46 +:104BE0002F40B5078026F60535403D430E7D012751 +:104BF000BD4326402E4324254D5D0227BE436D0054 +:104C000002273D40354305600D7906003036009699 +:104C1000009E3668FF27BE43EDB23543009E3560E7 +:104C20004D79012D0BD18C79002C02D100248460A8 +:104C300006E08C79012C03D10C68846000E084606C +:104C4000CC6804610C694461CC6984610C6AC461FC +:104C50000C680462464C25680C7EE4B2FF26B5431E +:104C60002C4330254D5DEEB2424D25403604FF24E5 +:104C7000240434402C4340254D5DEDB22402240A27 +:104C80002E06264348240C5DE7B2FF2424023A4D49 +:104C90002E403F02274037434764384E3668382756 +:104CA000CF5DFFB20097FF27BE43009F3743282602 +:104CB0008E5DF6B23D40360234402C438464304C65 +:104CC00025688C7D14400326B5432C4325254E5D75 +:104CD00016402C4D2540B602C024240134402C43FC +:104CE0002C254D5D15403026B4432E01302535402E +:104CF000254334240C5D1440234E2E402502C0244D +:104D0000A4002C4034433C254D5D1540C026B443DF +:104D1000AE01C0253540254344240C5D22400C24BF +:104D2000A54394000C2222402A43C264174A146807 +:104D30004C228A5C1A400725AC4322434D240C5D6B +:104D400023407024A2431C01702323401343436576 +:104D5000497D816700221000F2BD000070F3001051 +:104D6000FFFFFBFFFFFFFCFFFFFFFFF8FFFFFFBFA1 +:104D700074F30010FFFF00FFFF00FFFF78F3001047 +:104D80007CF30010FFF3FFFFFFFCFFFF80F3001038 +:104D90000168802212060A43026070477830016879 +:104DA00001220A4302607047C16F0800C007C00FAC +:104DB0007047010070310A68012313430B60006FD4 +:104DC0007047000030B5010000221000134B1B6833 +:104DD000002914D08C786407640F0725AB431C436B +:104DE0000B79002B01D00122FFE763005B08D2079B +:104DF0001A430B4B0024095F89005A5000E0064813 +:104E000030BD00B5074A1368002B03D0126800B20A +:104E10008000115000BD0000010056006CF300102E +:104E2000008020402412002870B4103A03D378C9BF +:104E3000103A78C0FBD2530701D318C918C001D566 +:104E400008C908C0D20704D30B880380891C801CC2 +:104E5000002A01D50B78037070BC70478B0701D115 +:104E60008307E1D0124205D00B78491C0370401C27 +:104E7000521EF9D170470000F7B5AD4BAD4A156829 +:104E8000AD4A1668AD4A12680192AD4A12680092A6 +:104E9000002422002200002800D11EE10A00002A7E +:104EA00000D11AE15168002901D1936805E05168E9 +:104EB000022901D1230000E0022311695769B94298 +:104EC00001D3116900E05169092909D29D4929409E +:104ED0002125555D002D15D080256D000D4313E073 +:104EE000112905D2974F2F408021C9013943EFE79F +:104EF000212905D2934F2F40802109023943E7E74A +:104F00008B48EBE0904D0D40D168491E0907090F11 +:104F10000F27BD4329438D4D0D408021490429436E +:104F20000160117F002901D0210000E0012101254D +:104F30000127BE43294031430E0051680909294029 +:104F40000227BE434900022739403143D67E10274D +:104F5000B943360110273E400E43517E2027BE4301 +:104F600049012027394031431668012E00D0250021 +:104F70004E007608E90731430425A9435D00042665 +:104F800035400D4308218D43D9000823194029439A +:104F9000537F6D4D0D40190280235B00194029435A +:104FA000957F80239B006A4E0E4069021940314371 +:104FB000D67F684D0D40B1028026F600314029436E +:104FC0002025565D644D2940F60280273F013E4072 +:104FD0000E4311798F07BF0F5C4931403F06C02651 +:104FE000B6043E400E430662167E009F5649394085 +:104FF000360280277F003E400E43977E5449314061 +:105000007E021E400E431169491EC906C90E1F27A4 +:10501000BE433143C026B60081512421515CC9B240 +:105020000091C121890041180E68FF27BE43009FEF +:1050300037430F60167E019F43493940360280276F +:105040007F003E400E435169491EC906C90E1F2705 +:10505000BE4331438026B60081512C21515CC9B238 +:1050600000918121890041180E68FF27BE43009FEF +:1050700037430F60116B1B4E8151916A184E81515D +:105080003821515CF026360186190096009E37685B +:105090002F4E3E4049020B40334300990B603921AB +:1050A000515CF4221201821813681D40C90280234A +:1050B0001B011940294311600B49445002980028F4 +:1050C0000AD002980460029884610298C460029831 +:1050D000C46126480299086223001800FEBD000042 +:1050E000C80F0000880F0000C80E00001B490160B7 +:1050F000C02189040162FF220832C0218900425088 +:105100000021C1239B00C15080239B00C2508122FB +:1051100092008150124A8150154A8150114A8150A3 +:10512000114A8150134A8150134A81507047000040 +:105130000140AA0054F3001058F300105CF3001073 +:1051400060F30010FF3FFFFFFFFEFFFFFFFFFFFCCC +:10515000FFFDFFFFFFFBFFFFFFF7FFFF0F00000357 +:10516000C80E0000C80F0000880F0000EFCDAB0094 +:10517000880E0000080F0000480F0000F8B504007A +:105180000D00334F387800280ED02D4E18222D49AF +:10519000300002F0DDFE0020F075CF2040002A49EB +:1051A0000860002002F034FF2000290001223A703C +:1051B00080225204002399420AD301D8904207D397 +:1051C000244A04000D0024A003C80019694102E02C +:1051D0000200002000211D4B00241C60204D2A608D +:1051E000214A146005221A601A68D203FCD51C609B +:1051F0000029DDD10028DBD13C70F1BD70B5050080 +:10520000184E306800280ED10D4C18220D49200090 +:1052100002F09EFE0020E075E52040000A4908608B +:10522000002002F0F5FE2C0030681049FEF7FEFF6A +:10523000002122000023FFF7E7F9FFF79FFF70BD71 +:10524000181B0028ACEC0010F01B002810E000E058 +:10525000BA1C0028FFFFFF00010000FFFFFFFFFF57 +:1052600014E000E0901C002818E000E040420F002D +:1052700043490A680860704742490A6808607047F5 +:1052800041490A680860704740490A6801239A4307 +:10529000C0B20300DB07DB0F13430B6070473B49D1 +:1052A0000A6810239A43C0B200011023184010432B +:1052B0000860704735490A68354B1340C0B2000298 +:1052C000802252001040184308607047314801683E +:1052D00001220A430260704710B5FFF739FC040051 +:1052E00000F024F80020FFF7C3FFFA20C001FFF709 +:1052F000C3FF0020FFF7C4FF0020FFF7C5FF012018 +:10530000FFF7CDFF0020FFF7D5FF00F004F82000E5 +:10531000FFF722FC10BD80B5FFF71AFC1E490A6892 +:10532000032313430B60FFF717FC01BD80B5FFF7A4 +:105330000FFC19490A6803239A43012313430B60A6 +:105340000A6803239A43022313430B60FFF704FC0C +:1053500001BD80B5FFF7EAFF104801688022120600 +:105360000A430260FFF7D7FF01BD80B5FFF7DEFFFC +:105370000A480168490049080160FFF7CCFF01BDF8 +:1053800004C0264008C026400CC0264010C026405D +:10539000FFFEFFFF44C0264040C0264000C026401C +:1053A00080B5FFF7C3FFFFF791FFFFF7B4FF01BD23 +:1053B00070B5302100242200744D280001F0D0FE89 +:1053C000E0212200954D280001F0CAFE042631009C +:1053D0002200934D280001F0C3FE2200914D3100C0 +:1053E000280001F0BDFE072122008F4D280001F0AA +:1053F000B7FE20008D49087020008D4908808D4837 +:10540000046020008C4908708C48046003F06AF83E +:1054100003F0C8FD04F05CF904F008FB002809D093 +:1054200004F007FB002805D004F0D6F9002801D1CC +:1054300004F046FA04F03EFE002804D1062005F0F0 +:10544000ADF9002016E0FDF774FC9E4908609E4906 +:1054500008609E4908609E4908609E4908600120D6 +:105460009D4908700F219D4A11709D4A1170B649DF +:105470000870012070BD38B584B09A4800680028D3 +:1054800002D0022005F08AF905F0A0F905F0B6F97E +:1054900000282BD003F094FE00280ED0AB480088E3 +:1054A00003F074FE012464480470FDF742FCB64921 +:1054B000401862490860A44804700020010008E018 +:1054C0000200324B0C00E4B20C256C431B199A729B +:1054D000491C0A00D2B2042AF2D3AC490870012058 +:1054E0007D49087002E0684600F0D4FB684604F08D +:1054F00029FE002811D00098C02189008842F2D0EE +:105500000098BC218900884203D1684600F0F8FD6C +:10551000ECE7684605F020FAE8E701F0F6F803F05A +:10552000DFF803F09EFD01F04FF901F095F901F06D +:10553000EDFC05B030BDF8B502E0684600F0AAFB0E +:10554000684604F0FFFD002811D00098C0218900B2 +:105550008842F2D00098BC218900884203D1684675 +:1055600000F0CEFDECE7684605F0F6F9E8E75D48A7 +:105570000068002802D0022005F010F905F026F995 +:1055800001F022F901F0C2FC05B000BDAC1A002800 +:10559000F1B503F015FE07006846008803F0F6FD3C +:1055A00068460088FDF736F8FCF7E6FE0026340072 +:1055B00018E02000C0B200F078F8050068460188C5 +:1055C0002800C0B2FCF73FFF684601882800C0B23F +:1055D00002F092FF7C482100C9B20C2251434018CE +:1055E0008672641C2000C0B20428E2D367480670AB +:1055F0000F203A4908703A4908700120364908706E +:1056000051490870FFB2002F07D00B490870FDF711 +:1056100090FB5D49401809490860F1BD1819002840 +:10562000681C0028701C0028B01B0028E31C002800 +:10563000B01C0028881C0028DA1C00286C1C0028DC +:1056400000B5401A002801D4012000E00020C0B2BB +:1056500000BD00B5401A00B2012801DB012000E0C6 +:105660000020C0B200BD00B500281BD0002919D011 +:1056700002780B789A4215D142784B789A4211D130 +:1056800082788B789A420DD182888B889A4209D190 +:10569000C288CB889A4205D100890989884201D104 +:1056A000012000E00020C0B200BD00B50100C9B279 +:1056B000042903D24549C0B2085C00E00420C0B20E +:1056C00000BD0000741C0028781C00287C1C0028E9 +:1056D000801C0028841C00280313002804130028C1 +:1056E00005130028E41B002810B50C000100C9B206 +:1056F000042901D2002C01D1002006E0C0B2FFF73E +:10570000D4FF2100C0B203F0E9FB10BD00B50028B2 +:1057100002D04178042901D3002013E001780A293E +:1057200002D001780B2904D10189FA208000484376 +:1057300008E00189002901D0008903E0244940786C +:105740008000085800BD000006130028AC1C00288B +:1057500000B5002802D04178042901D3002012E0CE +:105760000178032903D01B494078085C0BE00089CD +:10577000401D0A21FEF75AFD322800D2322060284F +:1057800000D35F20C0B200BDB80B0000D61C0028BB +:1057900000B5114B1870114B1970002A05D0117803 +:1057A0000F4B197091880F4A1180C0B2002803D0A6 +:1057B00001209949087002E00020974908700120F3 +:1057C0009649087000BD0000AC1A0028ACF3001028 +:1057D00048F20010B0F30010D31C0028D41C00289D +:1057E000D51C0028AC1C0028F8B50500002D05D0FC +:1057F0000C00002C02D01600002E01D1002039E050 +:105800000A2100222700380001F0AAFC68682070F5 +:105810006868000A03210A00024062700200D2B2E6 +:1058200092080A40A2706A68120CA280AA68E280FC +:10583000AA68120C22812A68C0239B009A4202D1D6 +:105840002A7B082A03D001203070002012E0F022C9 +:105850000240102A03D00220307000200AE0207895 +:10586000401E022802D9C01F072801D8012001E0EC +:1058700031700020F2BD00B5002801D0002901D10F +:10588000002054E04278042A03D30420087000204A +:105890004DE00278092A05D002780E2A02D002785B +:1058A0000F2A06D14278002A03D004200870002075 +:1058B0003DE00278032A09D18278012A0DD082784E +:1058C000022A0AD005200870002030E08278002AE1 +:1058D00003D005200870002029E00278521E13D062 +:1058E000521E25D0521E37D0521F012A44D9921E73 +:1058F0004DD0521E59D0521E3ED0521E63D0521E61 +:105900006DD0521E79D083E0C2887D4B9A4207D277 +:105910000289002A08D0008964387A4A904203D369 +:1059200006200870002002E000200870012000BD61 +:10593000C28812B2744BD218744B9A4207D20289B1 +:10594000002A08D0008964386E4A904203D30620AA +:1059500008700020EBE7E7E7C288643A694B9A4297 +:1059600005D200896A4A80186A4A904203D3062009 +:1059700008700020DBE7D7E7C288002A02D100893F +:10598000002803D0062008700020D0E7CCE7C288AA +:10599000AF4B9A4204D100890A38AE4A904203D3F1 +:1059A000062008700020C2E7BEE7C288AA4B9A42D0 +:1059B00004D100890A38A74A904203D30620087010 +:1059C0000020B4E7B0E7C288A44B9A4202D1008914 +:1059D000002803D0062008700020A8E7A4E7C288AA +:1059E000012A02D0C288022A02D10089002803D0ED +:1059F0000620087000209AE796E7C288002A02D1A4 +:105A00000089002803D00620087000208FE78BE76C +:105A10000320087000208AE7D91C002803130028FF +:105A200000B50100C9B2012902D0C0B2022801D1DB +:105A3000012000E00020C0B200BD10B5040020002D +:105A4000C0B2FFF7EDFF00280AD12000C0B2032842 +:105A500006D02000C0B20A2802D0E4B20B2C01D13B +:105A6000012000E00020C0B210BD80B58EB0010062 +:105A7000C9B2042908D27A490200D2B20C235A438F +:105A80008918897A002901D001200EE06946C0B248 +:105A9000FFF72AFE002806D068463221405C002825 +:105AA00001D0012000E00020C0B20FB000BD00B561 +:105AB0006C480078002801D0012000E00020C0B22E +:105AC00000BD38B58EB067480478002510E06946FF +:105AD0002800C0B2FFF708FE002808D0684632212F +:105AE000405C002803D020000124AC4004436D1C1E +:105AF0002800C0B20428EAD32000C0B20FB030BDE5 +:105B000011270000FDE9000010270000214E0000D1 +:105B1000D4FEFFFFBD02000038B58EB000252C007A +:105B200018E069462800C0B2FFF7DEFD002810D05B +:105B300068464178042908D04178072905D0417882 +:105B4000082902D04078092803D120000124AC4064 +:105B500004436D1C2800C0B20428E2D3FCF770FC9B +:105B6000002802D020000F2404432000C0B20FB050 +:105B700030BD38B58EB000252C0010E069462800F5 +:105B8000C0B2FFF7B1FD002808D068463421405C60 +:105B9000002803D020000124AC4004436D1C2800E1 +:105BA000C0B20428EAD32000C0B20FB030BD80B527 +:105BB000FFF787FF0100002005E00A00D207D20F9F +:105BC0008018C9B249080A00D2B2002AF5D1C0B281 +:105BD00002BD10B58EB0002418E069462000C0B2A6 +:105BE000FFF782FD002810D068463221415C002971 +:105BF0000BD00178052926D00178062923D0017819 +:105C0000072920D0007808281DD0641C2000C0B2CD +:105C100004281AD212482100C9B20C22514341185B +:105C2000897A0029D9D02100C9B20C225143415CA4 +:105C30000A2906D02100C9B20C225143405C0B282E +:105C4000CBD1012002E0012000E000200EB010BD09 +:105C50005AA500004F020000524B00003CC3000058 +:105C6000AC1A0028D61C002810B5002400E0641CE3 +:105C70002000C0B204280AD22000C0B2FFF715FDF0 +:105C8000C0B2FCF7A6FE0028F1D0012000E0002001 +:105C900010BD000070B592B0012421006A46117059 +:105CA000AF490A68521C0A606A4601A9FFF79CFDC9 +:105CB000002805D0694601A8FFF7DDFD00280AD1BC +:105CC000A8480168491C016001AA684601780220C1 +:105CD000FFF75EFDBCE101AD2878092836D0A24867 +:105CE000017800291ED0A988A04A1288914219D1B2 +:105CF0009F48007800280BD09E4901A8FFF7B3FC0D +:105D0000002805D001AA00210320FFF741FD08E08B +:105D100094480168491C016001AA08210220FFF78C +:105D200037FD95E10078002810D090480188A888B8 +:105D3000FFF78FFC002809D18A480168491C0160DF +:105D400001AA08210220FFF723FD81E120008649F6 +:105D50000870200086490870A88884490880854812 +:105D600001A94CC94CC00C390C38287809280CD131 +:105D7000A888FFF70DFC01AA00210420FFF708FD09 +:105D8000BB480168491C016062E128780F280CD1EA +:105D9000A888FFF7FDFB01AA00210120FFF7F8FC0E +:105DA000B3480168491C016052E12878082815D1E0 +:105DB00003F006FA002803D0A888FFF7E9FB03E008 +:105DC000A988687800F0D6FB01AA00210120FFF71E +:105DD000DFFCA7480168491C016039E128780C28DC +:105DE00013D168788440BE48017821430170BD48D2 +:105DF00001780C43047001AA00210120FFF7C8FCC0 +:105E00009B480168491C016022E128780D283BD19C +:105E10006878FFF72AFE002809D0B3480168491CBA +:105E2000016001AA09210220FFF7B2FC10E104F091 +:105E3000E5FC00280BD1FCF703FB002807D16878AC +:105E4000FFF733FCC0B203F01DF8002805D101AA0A +:105E50000B210220FFF79CFCFAE0A14801786A7848 +:105E6000230093400B4303709E4801786A78944066 +:105E70000C43047001AA00210120FFF789FC7C4833 +:105E80000168491C0160E3E004F0B8FC002805D07B +:105E900001AA0B210220FFF77BFCD9E028780E280D +:105EA0006AD103F08DF9002807D102F050FB0028D9 +:105EB00003D1FFF7FCFD002809D08B480168491C7D +:105EC000016001AA09210220FFF762FCC0E0FFF790 +:105ED00050FE0F280CD003F0AFFD002801D00D219B +:105EE00000E0072101AAC9B20220FFF751FCAFE090 +:105EF00004F044FC03F0EBFC002808D1032004F07C +:105F00004DFC01AA0E210220FFF742FCA0E0200078 +:105F100076490870FCF70DFF75494018754908600F +:105F2000A988E888C0B203F048F8002807D101AA80 +:105F30000E210220FFF72CFC6F48047088E00F2030 +:105F400067490870674908706B48047001AA00210E +:105F50000120FFF71DFC46480168491C016077E0FD +:105F6000501C0028541C0028D71C0028AE1C0028F8 +:105F7000D81C00289C1B002803F022F9002809D017 +:105F800059480168491C016001AA09210220FFF754 +:105F9000FFFB5DE02878FFF743FD00281DD004A932 +:105FA0006878FFF7A1FB002805D101AA0E21022085 +:105FB000FFF7EEFB4CE004A83421405C00280CD134 +:105FC00003F03AFD002801D00D2100E0072101AACD +:105FD000C9B20220FFF7DCFB3AE0FFF7FAFD002828 +:105FE00009D041480168491C016001AA0921022029 +:105FF000FFF7CEFB2CE028780A2802D028780B285F +:1060000011D102F0A4FA002803D1FFF750FD0028B7 +:1060100012D035480168491C016001AA09210220FB +:10602000FFF7B6FB14E06878FFF71FFD002811D0DA +:10603000A988687800F09EFA01A800F0DAFA01AAAF +:1060400000210120FFF7A4FB09480168491C0160F9 +:1060500012B070BDFFF7ABFD0428EDD322480168F4 +:10606000491C016001AA0A210220FFF791FBEFE71A +:106070005C1C00287CB5069D6C465A262670607014 +:10608000A1701000E070100080B2000A20716371EE +:10609000A5710020E07106E0E1790200D2B2A25CB5 +:1060A0008918E171401C0100C9B20729F4D3207896 +:1060B000617809020143A07800040843E1780906E9 +:1060C00001432079627912020243A079000410434F +:1060D000E27912060243094804F074F876BD000024 +:1060E0000413002805130028581C0028DA1C002877 +:1060F000B80B00006C1C002806130028F1020000F9 +:10610000F8B592B000252A002E0029006B4659717F +:106110002C00002802D0017B082900D019E202A936 +:1061200043680B7043681B0A4B7043681B0C8B70F1 +:1061300043681B0ECB7083680B7183681B0A4B711D +:1061400083681B0C8B718068000EC871280004E006 +:106150000300DBB2CB5CD218401C0300DBB2072B80 +:10616000F6D30878A52803D1C879D2B2824200D0EC +:10617000EFE14F7888786A461071C8780A79120280 +:1061800002436846C2804A798879000210433A0087 +:10619000D2B2012A1BD03A00D2B2022A17D03A005A +:1061A000D2B2032A13D03A00D2B2052A0FD03A0055 +:1061B000D2B2062A0BD00020009005236846C28880 +:1061C000684601793800C0B2FFF754FFC1E16A4662 +:1061D0001279002A21D14879532802D1887946289A +:1061E00001D004260BE0884807706846C0888749BC +:1061F0000880FCF79EFD864940188649086068467D +:10620000407900903300DBB26846C2886846017965 +:106210003800C0B2FFF72EFF9BE17B4909783A00B6 +:10622000D2B291420CD17949098880B2814207D11A +:10623000FCF77FFD77490968FFF702FA00280BD0C9 +:106240000020009004236846C2886846017938001F +:10625000C0B2FFF70FFF7CE128006B4908702800EF +:106260006A4908806B48056068460079012800D0BB +:106270009FE03800C0B2012808D002283BD0032894 +:1062800048D0052868D006286ED091E06846C088BE +:10629000FFF77EF90220FFF708FAC0B2FCF7BCFC5A +:1062A000002801D1012400E02C002000C0B2002809 +:1062B0001DD003F005FB01252800A7493A00D2B202 +:1062C00088542800A5490870FCF733FDA4494018FC +:1062D000A4490860A44904200A78030013430B7002 +:1062E000A2490A7810430870A148057002E0E22034 +:1062F0006946487112E16846C088FFF749F903F022 +:10630000A1FB040094483900C9B2445401209849C3 +:10631000087003E16846C088FFF73AF90020FFF7EC +:10632000C4F9C0B2FCF786FB002805D0FFF79CFC3F +:10633000002801D1012400E02C0087483900C9B2AF +:1063400044542000C0B2002802D06846457102E0E3 +:10635000E32069464871E1E004F0A6FB04007E48B2 +:106360003900C9B24454D9E06846C088FFF710F933 +:1063700004F084FB6846C08804F05AFA04007648AA +:106380003900C9B244542000C0B200280FD0002008 +:10639000009000236846C288684601793800C0B280 +:1063A000FFF768FEA448FEF729FF04F06FFAB5E096 +:1063B000B4E068460079022853D13800C0B2012801 +:1063C00008D0022828D003282AD0052830D0062853 +:1063D00032D03DE004A90220FFF786F900280AD058 +:1063E00004A83421405C002805D003F0A7FA002857 +:1063F00001D0012400E02C002000C0B2002802D00F +:1064000028005649087023E0E31C0028B01C00282F +:1064100030750000881C002803F06AFB040017E0B8 +:10642000FFF722FC002801D1012400E02C000FE03E +:1064300004F03FFB04000BE004F03BFA002805D019 +:1064400004F0DCF9002801D1012400E02C00FFE772 +:106450002000C0B2002861D03F483900C9B245547D +:106460005CE068460079032857D13800C0B20128A3 +:1064700008D002281DD003282BD005283CD00628A0 +:106480003ED049E004A90220FFF72EF900280ED0E3 +:1064900004A83421405C002809D003F0C7FA002882 +:1064A00005D003F0C6FA002801D0012400E02C003A +:1064B00034E003F0BBFA002809D003F0BAFA002850 +:1064C00005D003F0B9FA002801D1012400E02C0026 +:1064D00024E004A90020FFF707F900280AD004A847 +:1064E0003421405C002805D0FFF7BEFB002801D115 +:1064F000012400E02C0011E004F0E8FA04000DE0B3 +:1065000004F0D7F9002805D004F078F9002801D16B +:10651000012400E02C0001E000E005263000C0B2BC +:10652000002809D1E4B2002C06D16846007903287E +:1065300001D1012600E00226684640790090330030 +:10654000DBB26846C288684601793800C0B2FFF7FE +:1065500091FD13B0F0BD0000B01B0028DA1C00282C +:10656000B80B00006C1C0028041300280513002839 +:1065700003130028F8B504002000C0B2042837D265 +:106580000F002000C0B2FFF790F806000125390087 +:1065900089B22800B040C0B2FBF7E9FFFBF7ECFE80 +:1065A000390089B23000C0B2FBF74DFFBFB23900ED +:1065B0003000C0B201F0A0FF0020A3492200D2B2F7 +:1065C0000C235A4389188872A0490A782800A040F1 +:1065D00082430A709E4801782A00A2400A43027052 +:1065E0009C4801782A00A2400A430270B74805700F +:1065F000F1BD38B501004C78934D2000C0B20C229B +:10660000504328180A22FEF729FC0120010022002D +:10661000D2B20C235A43AA1891728C490A7803000B +:10662000A34013430B708A490A780300A340134325 +:106630000B70A649087031BD88130000F8B504003E +:106640006078FFF732F805002000FFF75FF80700D9 +:106650002000FFF77DF806002078FFF7EEF900280C +:1066600015D004F08BF803F032F9002804D1032090 +:1066700004F094F8002047E004F080F801209449E9 +:106680000870FCF756FB934940189349086020783E +:10669000012808D0022811D003281BD00A2824D0B2 +:1066A0000B2829D02FE0A08800903300DBB23A00FD +:1066B000E1882800C0B202F09FF925E0A088009090 +:1066C0003300DBB23A00E18809B22800C0B202F020 +:1066D000D3F919E0A08800903300DBB2E288A178FA +:1066E0002800C0B202F0F0F90EE0A28839002800BC +:1066F000C0B202F02AFB07E0A28839002800C0B22D +:1067000002F071FB00E00020F2BDF8B584B0FCF7A8 +:1067100010FB009004F072F8002806D16F48016861 +:106720000098FEF78DFF002800D14BE0002000E02C +:10673000401C0100C9B2042944D20326684F3978AD +:106740000D183540404C2900C9B20C225143611844 +:10675000897A0029ECD001A82900C9B20C22514342 +:1067600061180A22FEF77AFB00202900C9B20C2228 +:10677000514361188872012434490A782000A840E6 +:1067800082430A702800401C06403E700098643026 +:106790005249086001A8FFF751FF002804D101AA5F +:1067A0000E210220FEF7F4FF294801782200AA40BA +:1067B0000A430270274801782200AA400A43027067 +:1067C0004248047005B0F0BD38B58EB0002435E005 +:1067D00069462000C0B2FEF787FF00282DD0414D4A +:1067E0002000C0B2285C00280AD03F482100C9B26E +:1067F000382251434118684600F078F800281CD030 +:1068000039482100C9B2382251434018694638221C +:10681000FEF70AFB012001002200D2B2A9540C4964 +:106820000A780300A34013430B700A490A78030057 +:10683000A34013430B7025490870641C2000C0B2AC +:106840000428C5D30FB030BDAC1A0028D61C0028D0 +:10685000041300280513002838B51D4C20780028A3 +:1068600032D002F0ADFC00282ED1FCF762FA050010 +:10687000FFF71DF9002807D101F069FE002803D1B8 +:10688000FFF7F2F9002804D01248281812490860CE +:106890001AE0114801682800FEF7D2FE002813D044 +:1068A00003F06CFF03F04AF8002803D1032003F043 +:1068B00075FF09E003F062FF00202070012003490A +:1068C00008700F20A849087031BD0000031300288C +:1068D000DA1C0028B80B00006C1C0028741C00286F +:1068E000DB1C0028681C00281819002800B5027855 +:1068F0000B789A4227D142784B789A4223D18278FA +:106900008B789A421FD1C278CB789A421BD14268C9 +:106910004B689A4217D13022825C3023CB5C9A427A +:1069200011D13222825C3223CB5C9A420BD13122CC +:10693000825C3123CB5C9A4205D13422805C3422C4 +:10694000895C884201D0012000E00020C0B200BD77 +:1069500000B5007800280FD0022811D00ED30428EB +:106960000CD00FD306280FD00ED308280CD00BD391 +:106970000A280DD00AD30DE000200CE001200AE027 +:10698000022008E0032006E0042004E0062002E0E4 +:10699000072000E0072000BD00B5407800280ED099 +:1069A000022810D00DD3042811D00ED3062812D0FF +:1069B0000FD3082813D010D3092812D013E00020D9 +:1069C00012E0012010E002200EE003200CE0052080 +:1069D0000AE0042008E0062006E0072004E0092081 +:1069E00002E00B2000E0092000BD7CB5FFF769F84C +:1069F0000400FFF791F80500684602F0EEFB00285E +:106A000005D068464078032801D1012600E0002621 +:106A100003F0F4FE002808D003F0FAFE002801D1AC +:106A2000032000E00420C0B21BE0FFF7D2F80028EA +:106A300001D0052015E0EDB2002D06D1F6B2002EF2 +:106A400003D103F0E5FE002801D0042009E0E4B200 +:106A5000002C03D102F0B4FB002801D0022000E09A +:106A6000012076BDF8B584B0FFF72BF86946487170 +:106A7000FFF752F80700FFF77CF869460871FFF747 +:106A8000A8F86946C87002A802F0A7FBC0B20028A7 +:106A900005D002A84078032801D1012000E00020A1 +:106AA0003900C9B200290AD1C0B2002807D103F0C9 +:106AB000AFFE002803D102F0BFFF002801D001245F +:106AC00000E00024944806780F252E40FFF78DFF44 +:106AD00000013043694688709048007869464870E4 +:106AE0008F4800786946087003F088FE002801D0BE +:106AF000102600E0002602F063FB002801D02020D1 +:106B000000E000206946C978002901D0402100E05A +:106B100000216A4652792A40164330430143E0017E +:106B200008433D40694609790A012A43BC4909786E +:106B3000F0230B43694689786C46647824020C4341 +:106B4000B8490988090421436C462478C0B2000280 +:106B50002043D2B214040443DBB21A062243B248E3 +:106B600003F030FB05B0F0BD05130028F1B594B07B +:106B7000AE4814A909780C2251434018019006A987 +:106B800014A80078FEF7B0FD002801D10020C0E075 +:106B900006A8FFF7DDFE040006A8FFF7FDFE0700CC +:106BA00006A8C0786946087006A83221405C002813 +:106BB00003D006A83021455C00E00025079869460F +:106BC00048809A4814A909780C2251434018807AC9 +:106BD000002817D0019800780A2803D0019800787F +:106BE0000B2801D1042400E00124012701988078BA +:106BF0006946087001988088694648800198FEF7C8 +:106C0000A7FD050006AE3220305C002808D1874879 +:106C100014A909780C2251434018807A002802D028 +:106C20000420059001E0002005903420305C00280D +:106C300002D00820049001E0002004903420305C51 +:106C4000002805D00998002802D11020039001E007 +:106C5000002003903420305C002809D00A980028D6 +:106C600006D009980A99884202D32020029001E0B8 +:106C7000002002907078042802D14020019001E0A9 +:106C8000002001907078072803D0FBF7D9FB00287B +:106C900001D0802000E00020694609788907890F2B +:106CA000059A0A4304991143039A0A43029911432E +:106CB000019A0A4310433421715C002907D00D99D1 +:106CC0008C4A914201D38C4A02E00D9A00E08B4A33 +:106CD00014A90978E4B223071B0FFFB23C01F02688 +:106CE00026401E4333020B43C0B2000418436946DA +:106CF0004988090601436846408880B2000A80B28C +:106D000092B213020343EDB22A061A437C4803F001 +:106D100059FA15B0F0BD0000D31C0028D41C00287F +:106D2000D51C0028F1B590B001A910A80078FEF795 +:106D3000DBFC002801D1002070E080204002049993 +:106D4000814203D36D496A46518002E004996A4644 +:106D500051800599814203D368486946088002E062 +:106D6000059869460880079819303221FDF75EFAC8 +:106D70000400FF2C00D9FF2401A84078042801D189 +:106D8000012700E0002701A84078072803D0FBF77F +:106D900057FB002801D0022500E0002501A840781B +:106DA000082801D1042600E0002601A8407809281F +:106DB00003D002F041FE002801D0082100E00021AC +:106DC0003D432E4331430F2001AA9378034009012C +:106DD00019433123D25C10404A4A10AB1B78D25C75 +:106DE0001201024310A80078C9B20B02034368469F +:106DF00040880104194368460088E4B22304034331 +:106E0000D2B212061A43404803F0DCF9002801D13F +:106E1000002003E010A8007800F00AF811B0F0BDDF +:106E2000E21C0028AC1C002801030000AC1A00285A +:106E300078B585B004002000C0B2042809D2200033 +:106E4000C0B2FEF732FC6946C0B2FBF783FF0028F0 +:106E500001D0002031E068464178002901D00121AD +:106E600000E000218278002A01D0022200E0002206 +:106E7000C378002B01D0042300E000230579002D06 +:106E800001D0082600E000264579002D01D010250C +:106E900000E000250A4313431E433543E4B2EDB23C +:106EA0002A022243C188090411430389808902040C +:106EB0001A43C120800003F085F906B070BDE0B52B +:106EC000684602F08AF9002801D1002011E06846E6 +:106ED0000178427812020A4381780B041343C17887 +:106EE000090619438388C08802041A43844803F0C2 +:106EF00069F90EBD1127000010270000FFFF0000F8 +:106F000002030000701C002803030000F8B5FBF723 +:106F100010FF04007B4D29682000FEF791FB00283C +:106F200005D0012078490870200064302860774D32 +:106F300029682000FEF784FB002805D00120744951 +:106F4000087020006430286072480078002814D14E +:106F5000714801682000FEF773FB00280DD06F4ACE +:106F60006F480078107001206E490B781278050088 +:106F700095401D430D70674908706B4800780028E4 +:106F800014D16A4801682000FEF75AFB00280DD092 +:106F9000674A684800781070674901200B781278BA +:106FA000050095401D430D705F490870564D2878C7 +:106FB00000281ED0FFF756FD002815D000202870AD +:106FC0005E490A78521C1207120F0A705C490A784F +:106FD000002A04D05B4A10705B4A107008705B484E +:106FE0000168491C016003E059480168491C0160BF +:106FF00085E0474D287800280FD0FFF760FF002874 +:1070000006D00020287051480168491C016003E047 +:107010004F480168491C016071E0002500E06D1CCB +:107020002800C0B204282CD20127AF403D4E307852 +:107030003842F4D02800C0B2FFF798FD00281BD0DA +:107040003078B84330703348017800290FD0334985 +:107050000978EDB28D420AD131490A78521C920763 +:10706000920F0A700021017019342B4804603748D0 +:107070000168491C016003E035480168491C016052 +:107080003DE0002500E06D1C2800C0B2042836D287 +:107090000127AF40284E30783842F4D02800C0B2E3 +:1070A000FFF740FE002825D03078B84330702948DB +:1070B0002900C9B2415C491C0907090F2A00D2B254 +:1070C00081541948017800290FD019490978EDB287 +:1070D0008D420AD117490A78521C9207920F0A7002 +:1070E0000021017019341148046018480168491CD6 +:1070F000016003E016480168491C0160FFE7F1BD2B +:1071000006030000781C002803130028841C0028B4 +:1071100006130028E01C00287C1C0028DE1C002828 +:10712000DC1C002804130028E11C0028801C002817 +:10713000DF1C0028DD1C002805130028E21C0028A5 +:10714000D91C0028D31C0028D41C0028601C00284F +:10715000641C0028701C0028704700007047000065 +:107160001206130A1A43130C1A4300BF094205D032 +:10717000830707D00270401C491EF9D170470000F8 +:107180000022FFE71300103906D330B414001500B5 +:1071900010393CC0FCD230BC490700D30CC000D52C +:1071A00004C0890002D30280801C002900D502702F +:1071B00070470000F8B5020000231800A94C2468AD +:1071C000002959D000920A781207120F009D10353D +:1071D0002E680F27BE4332432A604A78FF25AC430E +:1071E000D2B222438C78002C01D0012400E01C0094 +:1071F0009D4D154024028022520014402C43012250 +:10720000CE781640994D254074028026B600344051 +:107210002C430D79002D01D0160000E01E00944D86 +:107220002540B4028026F60034402C434D79002DD1 +:1072300001D0160000E01E008E4D25407407802608 +:10724000B60534402C438D79002D01D0160000E0A6 +:107250001E00A14D2540B4078026F60534402C437E +:10726000C979002901D01300FFE762005208D9074D +:107270001143009A116000E09848F2BD00210160BE +:1072800001617047F0B585B00C0000250195944967 +:107290000E689449096804919349096803919349D8 +:1072A0000F68934909680291002C00D1D4E0009046 +:1072B000009800F0E7F802998020C0000843802180 +:1072C000890001438020400008430222024301213B +:1072D0000A4304201043009A106120784007400FB1 +:1072E00007229643304362785207520F7023984327 +:1072F00012017026164006430322A07810407D4BF1 +:1073000033400602C020800030401843E378002B51 +:1073100001D00B0000E02B00774E0640D8028023FE +:107320001B01184030432379002B01D00B0000E0F3 +:107330002B0046007608D8073043009B1860607920 +:107340008006800E049B3F26B3431843A379134065 +:10735000C026B0439B01C0261E400643E079430788 +:107360005B0F664830401E02E023DB0033400343DE +:10737000207A002801D00D00FFE75F4E1E40E80292 +:1073800080231B0118403043657A1540874B03402A +:107390002D03C020800128401843A57A1540844B56 +:1073A0000340AD03C020000228401843A3891D05F7 +:1073B0002D0D804B03402D047F4828401843A37BAC +:1073C0000B4045006D08D8072843009B5860E07BC0 +:1073D0004007400F039B0725AB431843237C0B401A +:1073E0004025A8439B0140252B400343607C01407E +:1073F00080208343C801802108401843A17C6F4B43 +:1074000003400902FF20000208401843E17CC9063E +:10741000C90E6B4B03400904F82040030840184391 +:10742000217D0A40674901409205C02000041040B8 +:10743000084300998860E08A390C090480B2084347 +:10744000218B82B2080410430099C86021001A31D0 +:10745000009800F055F801E020480190019805B02F +:10746000F0BD0000C4F20010FFFEFFFFFFFDFFFFB4 +:10747000FFFBFFFFFFFFFFDF3830016801220A43F7 +:107480000260704738300168012291430160704703 +:107490003C30016801220A430260704710B50300C6 +:1074A0000020002916D0002A14D05B6A1C000C8032 +:1074B000190F0C00E407E40F1470990F0C00E40797 +:1074C000E40F9470590F0C00E407E40F5470D90FC7 +:1074D000D17000E0014810BDFFFFFFBF0100DA00DE +:1074E000C8F20010CCF20010D0F20010D4F200105C +:1074F000D8F20010FFFCFFFFFFF7FFFFFFF8FFFFD0 +:10750000F0B50A00002319006F4C2468002A49D006 +:107510005579002D01D0012600E01E006B4D25405D +:10752000B4028026F60034402C431579002D01D09A +:10753000012600E01E00664D254074028026B6003C +:1075400034402C43D578002D01D0012600E01E00E8 +:10755000604D254034028026760034402C43557817 +:10756000002D01D0012500E01D000226B4436D006E +:107570000226354025431478002C01D0012400E078 +:107580001C0001260127BD4334402C439278002A79 +:1075900000D11E0004229443B20004231A40224367 +:1075A000826100E047490800F0BD0000FFCFFFFF07 +:1075B000FF3FFFFFFFFF00F00000FF0FFF00FFFF96 +:1075C000FFFFE0FFFFFF3FFFF0B50A0000231900B7 +:1075D000414C2468002A49D05579002D01D001265C +:1075E00000E01E00394D2540B4028026F6003440EC +:1075F0002C431579002D01D0012600E01E00344DEA +:10760000254074028026B60034402C43D578002DE6 +:1076100001D0012600E01E002E4D254034028026B8 +:10762000760034402C435578002D01D0012500E030 +:107630001D000226B4436D00022635402543147810 +:10764000002C01D0012400E01C0001260127BD43CD +:1076500034402C439278002A00D11E000422944327 +:10766000B20004231A402243026100E015490800D9 +:10767000F0BD000010B50200002000291FD01269E3 +:10768000930A1C00E407E40F4C71530A1C00E40742 +:10769000E40F0C71130A1C00E407E40FCC705308CC +:1076A0001C00E407E40F4C7013001C00E407E40F17 +:1076B0000C7092081300DB07DB0F8B7000E00148B1 +:1076C00010BD00000100DA00DCF20010FFFBFFFF3C +:1076D000FFFDFFFFFFFEFFFFE0F2001000B50120FD +:1076E00027490A6852080240002A01D0022001E01E +:1076F0000968084000BD274801680800C007C00F9E +:10770000704700B5C21E022A01D3012002E0C01E4C +:107710000860002000BD1CB5FF246946FFF7F1FF9B +:10772000C0B2002802D02000C0B207E03C48009957 +:10773000890041580800C007C00FC0B216BD00B58F +:10774000002801D0032801D3012002E0401E086078 +:10775000002000BD1CB5FF246946FFF7F0FFC0B252 +:10776000002802D02000C0B208E034480099090186 +:107770004018C1680800C007C00FC0B216BD0000A5 +:10778000241526402E48006881080800C007C00F55 +:10779000704700004015264038B504002000C0B2F4 +:1077A00008280DD3274D18222749280000F0D0FBC8 +:1077B0000020E875254826490860002000F028FCD4 +:1077C00024482100C9B2890041580A00D205D20FCD +:1077D000002A05D0E4B2A10040580007000F00E0E5 +:1077E000FF2032BD38B505002800C0B208280ED3EE +:1077F000144C18221449200000F0AAFB0020E07568 +:107800008920000112490860002000F001FC1148A5 +:10781000EDB2A900405800098007800F32BD00007A +:10782000401626400F480068000AC0B270470E4854 +:107830000068000AC0B2704700000000001926402E +:1078400010002740181B0028F4EB00105B08000014 +:10785000F01B00284012264004480068000AC0B20D +:1078600070470000101020400C10204008102040ED +:1078700038B50400072C0ED3124D182212492800E7 +:1078800000F066FB0020E875CE2040000F4908603C +:10789000002000F0BDFB0A48A10040584007400FFF +:1078A000010009B2042907D10448A1004058C106CB +:1078B000C90E80204000084300B232BD00012640BE +:1078C00000122640181B002850EC0010F01B002866 +:1078D0001E4909688A03920B0260090E0A00D2074A +:1078E000D20FC271174909680A00D204D20C8280F3 +:1078F0000A00120CD2B20281090CC9B24181264998 +:1079000009680F220B00134003730B091A404273DE +:107910000A0AD204D20CC281090F8907890F0174A7 +:10792000094909680A0A5207520F82710A00120CAB +:10793000D205D20D4282890F0A00D207D20F0275FA +:1079400070470000341526403C152640301526406F +:107950001CB50C006946FFF7D4FE0100C9B200292E +:1079600001D0C0B217E00D48009989004058410687 +:10797000490E21601F21020A0A406260020C114078 +:10798000A160010F8907890F6173C00E0100C9074B +:10799000C90F2173002016BD381526400016264059 +:1079A0001CB50C006946FFF7CAFE0100C9B20029E8 +:1079B00001D0C0B233E01A48009909014158CAB257 +:1079C00022601F220B0A134063600B0C1A40A26056 +:1079D000090F8907890F21730099090141184A6825 +:1079E000D10F61730721130F0B40002B01D001232E +:1079F00000E00023A3731202120A2261009A12010E +:107A000080188068C20F2275020E1300DB07DB0F9F +:107A100063750200A275000C0140E175002016BDDF +:107A20000019264080B5010086481822FDF7FCF9B0 +:107A3000012085490870002002BD000000B583497F +:107A40000968C90F002907D07F490978002907D1A3 +:107A500000210160032000BD002101600320FAE73E +:107A60007849096801600020F5E7000010B50400BE +:107A7000FFF734FE002803D10020206003200BE034 +:107A800071480078002804D06E488068206000208B +:107A900002E000202060032010BD00B56A4909788B +:107AA000002904D0674949680160002002E00021F4 +:107AB0000160032000BD000000B565490968C90FD9 +:107AC000002907D060490978002907D10021016009 +:107AD000032000BD002101600320FAE75949C9686D +:107AE00001600020F5E7000000B55A490968C90F98 +:107AF000002907D054490978002907D100210160E5 +:107B0000032000BD002101600320FAE74D49096907 +:107B100001600020F5E7000010B50400FFF732FE19 +:107B2000002803D10020206003200BE046480078A5 +:107B3000002804D0434840692060002002E0002073 +:107B40002060032010BD000010B50C00C0B2FFF78C +:107B50008FFE00280CD0401E0ED0401E10D0872172 +:107B60004900401A10D0401E12D0C01E14D017E099 +:107B70002000FFF763FF16E02000FFF78EFF12E002 +:107B80002000FFF773FF0EE02000FFF795FF0AE0EB +:107B90002000FFF7C1FF06E02000FFF7A5FF02E08D +:107BA00000202060032010BD80B501000020FFF7F9 +:107BB000CBFF02BD80B50322D2B2824203D20020A5 +:107BC0000860012003E0401CC0B2FFF7BDFF02BD0A +:107BD00030B587B004006846FFF7E6FF0100C9B280 +:107BE000002903D000212160C0B228E001A8FFF7DE +:107BF0006FFE01AD287C022803D100982060002090 +:107C00001DE07B480068C00F002808D0FFF773FD17 +:107C1000C0B2002807D10020206003200FE00098A8 +:107C2000206000200BE0009801994843A988FCF7E8 +:107C3000FDFAE979491CFCF7F9FA2060002007B049 +:107C400030BD0000001B0028B91C00281815264074 +:107C5000081526400C152640F0B58BB004000D0029 +:107C600069462000C0B2FFF7A5FF0100C9B2002994 +:107C700003D000212960C0B2B7E02000C0B20228C2 +:107C800048D307A92000C0B2401CFFF761FEC0B274 +:107C900000280DD0824E18228249300000F058F999 +:107CA0000020F075804881490860002000F0B0F99C +:107CB0007F482100C9B28900401808380068C00F09 +:107CC000002807D007A8407B022807D10098286029 +:107CD00000208AE000982860002086E0E4B2641C5E +:107CE0002000FFF718FD0100C9B2002902D0C0B280 +:107CF000FF2803D100202860032076E00098079930 +:107D000048430899FCF792FA0999FCF78FFA286022 +:107D100000206AE001A92000C0B2401CFFF740FE2D +:107D2000C0B200280DD05E4E18225E49300000F02F +:107D30000FF90020F0755F485C490860002000F0F2 +:107D400067F95D482100C9B209014058C00F0028F9 +:107D500007D001AE307B022807D1009828600020B0 +:107D600043E00098286000203FE0E4B2641C20005B +:107D7000FFF7F0FC0100C9B2002902D0C0B2FF2811 +:107D800003D10020286003202FE0707B012821D13F +:107D900000980021019E00273F06320A174336064D +:107DA000059A002392197B41FCF72EFC06000F0078 +:107DB00002980021039A0023FCF726FC02000B0026 +:107DC00030003900FCF72DF9000E0A021043090EAD +:107DD000286009E00098019948430299FCF726FAC7 +:107DE0000399FCF723FA286000200BB0F0BD0000D7 +:107DF0003015264010B50323421E0400E4B2002CC7 +:107E000003D10800FFF7E4FE0CE01400DBB2E4B29B +:107E1000A34204D31000C0B2FFF71EFF02E0C0B2BD +:107E2000FFF792FE10BD38B504000D002000C0B26F +:107E3000FFF7B2FC0100C9B2FF2904D12800FFF707 +:107E4000FDFDC0B21BE06946C0B2FFF7D3FF0100E1 +:107E5000C9B2002903D000212960C0B20FE0200080 +:107E6000C0B2FFF7BFFCC0B2002805D002280BD07B +:107E700006D303280CD00FE000982860002032BD04 +:107E8000009840082860F9E7009880082860F5E726 +:107E90000098C0082860F1E7002028600320EEE782 +:107EA000181B002850EC001063090000F01B00288C +:107EB000001626407F090000001926401CB504006A +:107EC00069460020FFF7AFFF0100C9B2002903D0C7 +:107ED00000212160C0B209E0FFF7A9FC0100009871 +:107EE000C9B2491CFCF7A2F92060002016BD1CB5E0 +:107EF000040069460020FFF796FF0100C9B200297F +:107F000003D000212160C0B208E0FFF78BFC010024 +:107F10000098491CFCF78AF92060002016BD1CB5AA +:107F200004006846FFF7E3FF0100C9B2002901D051 +:107F3000C0B208E0FFF790FC01000098491CFCF774 +:107F400075F92060002016BD80B5FFF7E8FF02BD7F +:107F500071B58B0709D0521E28D30B780370401CD3 +:107F60001B421FD0491C8B07F5D1121F3ED3274C53 +:107F7000E50140C9331BB3432B4209D1830716D116 +:107F800040C0121F32D340C9331BB3432B42F7D03A +:107F9000121DFF231E4205D00670401C360A521ED9 +:107FA0001E42F9D111000022FFF7E0F871BDDB425B +:107FB00016D0401E4670360A4680360C0671001DEB +:107FC000121F06D340C9331BB3432B42F2D0401CCF +:107FD000DEE7401C0AE040C9331BB3432B42D7D134 +:107FE0000680360C4680001D121FF4D2121D0BD0E5 +:107FF0000B780370521E07D0401C491C1B42F7D15E +:108000000370401C521EFBD171BD00000101010133 +:1080100000B501BEFEE780B50C4A0D490B689342DE +:1080200010D00A6002684A6042688A608268CA604A +:10803000C2680A6102694A6142698A618269CA61E9 +:10804000C069086203F014F801BD0000F3F2F1F01A +:10805000DC1A00287047704700B5C0B2042801D26E +:10806000012000E00020C0B200BD00B50100C9B28F +:10807000002901D1904813E00100C9B2012902D1C1 +:10808000AF2040010CE00100C9B2022901D18B48A8 +:1080900006E0C0B2032802D1E120400100E0002048 +:1080A00000BD00B50100C9B2002901D15A2011E07C +:1080B0000100C9B2012901D15A200BE00100C9B267 +:1080C000022901D15A2005E0C0B2032801D15A206B +:1080D00000E0002000BD00B5401A002801D40120B6 +:1080E00000E00020C0B200BD00B5884201D3401AB4 +:1080F00000E0081A00BD00B50200D2B2002A08D183 +:10810000C9B2022902D1E120800001E0FA208000FA +:1081100018E00200D2B2012A08D1C9B2022902D164 +:108120009620C00001E0AF2080000BE0C0B2032821 +:1081300007D1C9B2022901D1614801E0C820C000BD +:1081400000E0002000BD10B500280FD00C00002C6E +:108150000CD06178002909D02169002906D0A168D6 +:10816000002903D021698268914201D2002019E0E0 +:1081700080680021A2680023FCF746FA02000B0089 +:108180002069400800218018594122690023FBF72B +:1081900048FF6168FFF7A8FF052801D2012000E031 +:1081A0000020C0B210BD00B5C0B232382E2801D2B6 +:1081B000012000E00020C0B200BD00B50178022916 +:1081C00005D00178012904D14078022801D101208D +:1081D00000E00020C0B200BD00B50178032905D041 +:1081E0000178012904D14078032801D1012000E061 +:1081F0000020C0B200BD38B50C00BE490200D2B2AA +:108200003C235A438D18C0B2FAF757FA0A20287057 +:10821000AC7000203821685431BDB649C0B23C2250 +:108220005043081809210170022181700021382271 +:1082300081547047AF49C0B23C2250430818002116 +:1082400001700322827038228154704770B5050096 +:108250000C002800C0B2FFF7FFFE002807D0FAF795 +:10826000EFF8002803D180204002844201D300208F +:1082700020E02800C0B2FAF720FA002807D1210038 +:1082800089B22800C0B2FAF7DEF8002801D0002039 +:1082900010E09848EDB23C214D4345193C210022A5 +:1082A0002E003000FEF75CFF6C600120A8703821C2 +:1082B0006854012070BD0000FC530000901A0000BB +:1082C0006C070000F2B59EB0070016001C000020ED +:1082D00001903800C0B2FFF7BFFE002819D029A8CE +:1082E0000078022803D029A80078032811D138008B +:1082F000C0B2FFF7BAFE1E9988420AD305A938001A +:10830000C0B2FAF7AFFD002803D105A840780028D5 +:1083100001D10020E4E0774D3800C0B23C21484351 +:108320002818049004983621405C694648706846D5 +:10833000067027A80078002807D168460078FFF764 +:1083400032FF002801D10020CAE008991E98FFF7EB +:10835000CBFE02900394269E289C27A80078002834 +:108360001CD00398002802D00298002816D1029849 +:10837000002811D1E4B2002C08D131003800C0B27D +:10838000FFF764FF002801D10020A9E03800C0B247 +:10839000FFF743FF0120A3E00020A1E00FA804990C +:1083A0003C22FCF741FD2000C0B2002808D131007A +:1083B0003800C0B2FFF74AFF002801D100208FE04B +:1083C0003800C0B23C2148432D18E4B2002C0CD038 +:1083D00028000FA93C22FCF727FD01200100A9700D +:1083E00001003822A95469464870249C27A80078C7 +:1083F00000282FD02598002801D0019018E0002CEB +:1084000001D0019414E002980021FA229200002386 +:10841000FCF7FAF802000B0003980021801859417C +:108420000022401E9141039A0023FBF7FAFD0190C0 +:108430000198002807D0029A01993800C0B2FAF7D3 +:10844000B5FD002815D008213800C0B2FFF7D3FED3 +:10845000002045E0684601783800C0B2FAF714FA07 +:10846000002806D008213800C0B2FFF7C4FE002063 +:1084700036E029A800786870002C01D0012001E0C6 +:1084800029A8007828701E98A860EC6001982861DF +:108490000020A86103982862684600783521685456 +:1084A00027A80078372168546846407836216854F8 +:1084B0001E980899884201D3012000E0022034214F +:1084C00068541E993800C0B2FAF774FE002806D02E +:1084D00008213800C0B2FFF78EFE002000E0012026 +:1084E0001FB0F0BD10B5F02100227B4C2000FEF73C +:1084F00037FE10BD28180028F8B505000C0028002C +:10850000C0B2FFF7A9FD002813D02800C0B2FAF7C7 +:10851000D4F87148EDB23C214D4345193C21002669 +:1085200032002F003800FEF71BFE6C602E70032017 +:10853000A870F1BD38B50400002505E02100280031 +:10854000C0B2FFF7D9FF6D1C042DF7D331BD00B5C4 +:10855000002000E0401C042809D25F493C2242432D +:1085600089183822895C0029F4D0012000E000201D +:1085700000BD78B585B0040057482300DBB23C2528 +:108580006B43C5182878082835D1696889B220005E +:10859000C0B2F9F7B7FF002804D12000C0B2FFF73E +:1085A00049FE96E02000C0B2FAF713FA002800D086 +:1085B0008FE0286B002806D0296B2000C0B2FAF7A4 +:1085C0005DFB002812D0696889B22000C0B2F9F7BB +:1085D00099FF002804D12000C0B2FFF72BFE04E071 +:1085E00009212000C0B2FFF706FE72E02000C0B2F1 +:1085F000FFF713FE6DE0C87804280BD0C878022876 +:1086000008D0C878032805D0C878052802D0C878D3 +:10861000012805D109212000C0B2FFF7ECFD58E088 +:108620002878012855D01600287806281BD1E86A3A +:10863000FA21490041183000FFF74DFD002811D004 +:1086400069462000C0B2FAF7AFFA002805D0092128 +:108650002000C0B2FFF7CFFD3BE00398A862EE62B6 +:108660000720287035E0E86AFA21890041183000B7 +:10867000FFF731FD00282CD069462000C0B2FAF780 +:1086800093FA002805D009212000C0B2FFF7B3FDFE +:108690001FE0E86A361A0398A96A401A00210F4AB7 +:1086A0000023FBF7B1FF32000023FBF7BAFC060002 +:1086B000002E05D02000C0B2F9F7FFFF002805D03A +:1086C00009212000C0B2FFF796FD02E02E630820CA +:1086D000287006B070BD000028180028A086010090 +:1086E000F8B592B0F9F748FEFAF723FB06900020A0 +:1086F00007900CE006212800C0B2FFF77CFD03E0E4 +:108700002800C0B2FFF789FD0798401C0790079822 +:10871000042800D358E1079DAC4807993C225143F7 +:1087200044183820205C002806D008A92800C0B2D0 +:10873000FAF798FB002800D0E6E7F9F781FE002859 +:1087400003D108AEF078072805D107212800C0B270 +:10875000FFF751FDD8E7616889B22800C0B2F9F788 +:10876000D1FE002804D12800C0B2FFF763FDCBE79B +:10877000F078062807D12078082804D02800C0B255 +:10878000FFF758FDC0E72078012816D1B0780028FF +:1087900013D0607820702078062802D10698E06215 +:1087A0000BE0E068002806D00698E168401861698F +:1087B0004018A06101E00020A061207806280BD0BD +:1087C0002078072808D02078082805D020780128AC +:1087D00009D16078062806D1069A08A92800C0B2F7 +:1087E000FFF7C7FE90E7207804282FD1E1690698AB +:1087F000FFF771FC002828D06078059001200490D4 +:108800003720205C03906068029020690190E06846 +:108810000090236A3520225CA1682800C0B2FFF7CF +:1088200051FD002811D1616889B22800C0B2F9F762 +:1088300069FE002804D12800C0B2FFF7FBFC04E069 +:1088400004212800C0B2FFF7D6FC5DE7F0780228CB +:1088500002D0F078032801D1012700E00027F0784A +:10886000042803D03800C0B2002852D02000FFF7FF +:10887000A4FC00280AD008A92000FFF764FC002807 +:1088800004D02800C0B2FFF7C8FC3DE72000FFF786 +:1088900094FC002823D03620205C00281FD128001B +:1088A000C0B2F9F70AFF00280CD0F9F7C9FD00287B +:1088B00001D0072100E00821C9B22800C0B2FFF7AB +:1088C0009AFC21E7042020700020A0610698FA217C +:1088D000C9004018E06101203621605418E03800DA +:1088E000C0B2002809D02000FFF776FC002804D091 +:1088F0002800C0B2FFF791FC0AE0FFB2002F01D0C0 +:10890000052100E00421C9B22800C0B2FFF773FCC2 +:10891000FAE6F078012804D12800C0B2FFF77DFC08 +:10892000F2E6F078052815D12000FFF746FC002874 +:108930000AD008A92000FFF706FC002804D0280070 +:10894000C0B2FFF76AFCDFE606212800C0B2FFF7DD +:1089500052FCD9E6A069002800D1D5E6A1690698A5 +:10896000FFF7B9FB002800D1CEE62800C0B2F9F726 +:10897000A4FE00280CD0F9F763FD002801D00721E0 +:1089800000E00821C9B22800C0B2FFF734FCBBE602 +:108990002078032800D0ADE669462800C0B2FAF777 +:1089A00003F9002805D008212800C0B2FFF723FCF6 +:1089B000AAE60398616A884200D0A1E60421280053 +:1089C000C0B2FFF718FC9FE613B0F0BD28180028CE +:1089D00010B586B002240594002404940024039466 +:1089E000029300230193002300930023D2B2C0B26C +:1089F000FFF768FC06B010BDF8B590B00C001D0084 +:108A000062498C4211D21600002E0ED0070006A932 +:108A10003800C0B2FAF726FA002806D106A8407836 +:108A2000002802D00A98002801D1002022E020006E +:108A300000210A9A0023FBF7E7FD02000B005448CF +:108A4000002180185941534A0023FBF7EAFA02211A +:108A500005910021049100210391169902910021B2 +:108A60000191009600232A00D2B201003800C0B262 +:108A7000FFF728FC11B0F0BDF0B58BB007000E0079 +:108A800014001D0001A93800C0B2FAF7EBF9002864 +:108A900003D101A84078002801D1002012E00A98F3 +:108AA0008119002901D5002103E03848814200DB0B +:108AB00038492B00220010980090DBB23800C0B279 +:108AC000FFF79AFF0BB0F0BDF6B585B004000E00BD +:108AD0000698002815D01F003800C0B2FFF763FBCE +:108AE00000280ED03000C0B2012803D03000C0B240 +:108AF000022806D10C992000C0B2FFF7A7FB00287E +:108B000001D1002040E03900C9B22000C0B2F9F71D +:108B1000BBFE002806D008212000C0B2FFF76BFB87 +:108B2000002031E053482100C9B23C22514345188E +:108B300069462000C0B2FAF737F8002806D00821AD +:108B40002000C0B2FFF757FB00201DE003986862C9 +:108B50003100C9B22000C0B2F9F72AFF002806D0C0 +:108B600008212000C0B2FFF746FB00200CE00120E6 +:108B700028700320687034202E540698E860002086 +:108B8000A86135202F54012007B0F0BD1127000047 +:108B90008813000010270000F6B591B00C001E00ED +:108BA000129900290BD0070007A93800C0B2FAF7C4 +:108BB00059F9002803D107A84078002801D10020E6 +:108BC00055E006940A990698FFF78EFA0400002CE7 +:108BD00007D1189B322206993800C0B2FFF7F8FE81 +:108BE00045E006980A99884201D3012100E002215C +:108BF0001298FF22F632904203D31298A04A8518A9 +:108C000000E0129DC9B23800C0B2FFF774FA00212B +:108C1000C943491B814201D2002028E02D182000C1 +:108C20000021FA2292000023FBF7EEFC2A00002329 +:108C3000FBF7F7F90221059100210491012103912D +:108C4000189902910195129900910300002206994A +:108C50003800C0B2FFF736FB0100C9B2002905D0C9 +:108C60000449FFB23C225743C9194E61C0B213B048 +:108C7000F0BD000028180028F8B58AB007000E00E3 +:108C800014001D0069463800C0B2FAF7EBF800285E +:108C90000AD168464078002806D00298002803D000 +:108CA00030000299814201D2002017E00021049A8D +:108CB0000023FBF7A9FC02000B00029840080021EA +:108CC00080185941029A0023FBF7ABF92B002200D0 +:108CD000D2B201003800C0B2FFF77AFE0BB0F0BD8F +:108CE000F0B58BB007000E0014001D0001A938007C +:108CF000C0B2FAF7B7F800280AD101A840780028D6 +:108D000006D00398002803D030000399814201D295 +:108D1000002018E00021059A0023FBF775FC0200F3 +:108D20000B0003984008002180185941039A002342 +:108D3000FBF777F9109900912B0022000100380011 +:108D4000C0B2FFF729FF0BB0F0BDFEB504000D0067 +:108D500016002000C0B2FFF77FF9002802D02F00D4 +:108D6000002F01D100203DE02000C0B2FFF799F9AB +:108D7000050031002000C0B2FFF768FA002807D0D4 +:108D80002900C9B22000C0B2F9F77EFD002806D044 +:108D900009212000C0B2FFF72EFA002022E00520B2 +:108DA0004D492200D2B23C235A4388546B463A00C4 +:108DB00002212000C0B2FAF7FFFD002806D1684664 +:108DC0000178002902D04078002806D1092120002E +:108DD000C0B2FFF710FA002004E02000C0B2FFF795 +:108DE0001CFA0120FEBDFEB504000D001600200097 +:108DF000C0B2FFF731F9002802D02F00002F01D1B7 +:108E000000203AE02000C0B2FFF74BF90500310026 +:108E10002000C0B2FFF71AFA002807D02900C9B213 +:108E20002000C0B2F9F730FD002806D0092120004B +:108E3000C0B2FFF7E0F900201FE00520264922001C +:108E4000D2B23C235A4388546B463A00002120009A +:108E5000C0B2FAF7B1FD002803D1684600780028B7 +:108E600006D109212000C0B2FFF7C5F9002004E0B7 +:108E70002000C0B2FFF7D1F90120FEBD00000000C4 +:108E80000CFEFFFF70B504002000C0B2FFF7E4F84D +:108E9000002809D02000C0B2F9F79BFD002803D1BB +:108EA000F9F7CEFA002801D0002013E00A48E4B216 +:108EB0003C214C4304193820205C002801D00020BC +:108EC00008E065683C21002226003000FEF748F9E2 +:108ED0006560012070BD00002818002838B596B0E4 +:108EE00005000C00002C1AD02800C0B2FFF7B4F81F +:108EF000002814D069462800C0B2F9F7B3FF002853 +:108F00000DD10FA92800C0B2FAF7FEF8002806D14B +:108F10000AA92800C0B2F9F747FE002801D00020B6 +:108F20003CE01F48EDB23C214D43401901782170CF +:108F3000817861706946CA78A2708A78E270426866 +:108F40006260039AA260019AE260029A22610C9A1E +:108F50006261149AA261099AE261059A2262069AF4 +:108F60006262079AA262089AE2620FAA527E3023D6 +:108F7000E2543622825C3123E2543822825C32236E +:108F8000E2543622805C002801D0012000E000205D +:108F90003322A054487834216054012017B030BDEA +:108FA0002818002870B5342100242200B24D2E006C +:108FB0003000FEF7D5F86C7070BDF0B58FB00700CB +:108FC0000E003800C0B200F03EF900900098002872 +:108FD00007D000F0F5F8002803D1FFF7B8FA002811 +:108FE00001D000203BE00024250000E06D1C28009B +:108FF000C0B2042818D201A9B0482A00D2B2805CBD +:10900000FFF76CFF00280DD001A83421405C002838 +:1090100008D00598009949682A00D2B25200895AAE +:109020008842E3D200201AE034212200924C25002D +:109030002800FEF795F82770012001006170A070EC +:109040002681F9F776FEE060E168009800F0D4F937 +:10905000002803D100F00AFB002000E001200FB03F +:10906000F0BDFEB500206946087000F0A9F80028A0 +:1090700000D18AE0804C207800F0E5F80700002F4E +:1090800002D100F0F3FA80E0F9F753FE0600E06841 +:109090008B494118300000F0CBF8002805D020891A +:1090A000401C80B200F072F86FE0684600F022F9D0 +:1090B000050068460078002802D000F0D7FA64E086 +:1090C0006078012817D1EDB2002D09D032000021BF +:1090D000380000F0C5F9002801D100F0C7FA54E0CB +:1090E0002069AD494118300000F0A2F8002801D0F5 +:1090F00000F0BCFA49E0B868E17818225143401802 +:1091000002902169300000F09CF801900298007DE7 +:1091100002281AD1EDB2002D0FD0207E002807D1F1 +:10912000380000F06AFA002806D100F09FFA03E048 +:109130003100380000F0AFFA27E00298806801990A +:10914000884201D200F092FA1FE0019861698842DA +:109150001BD3EDB2002D04D03100380000F09BFA93 +:1091600013E000F01BF9002807D02089FFF7E2F98F +:109170003100380000F08FFA07E060698649401836 +:109180000199884201D200F071FAF7BD70B5040070 +:1091900000F016F8002809D0200080B2F9F73AFA5A +:1091A000F9F7EAF8A4B22000FFF7C4F9342100244B +:1091B0002200314D2E003000FDF7D2FF6C7070BDE3 +:1091C00000B52D484178012902D04078022801D10C +:1091D000012000E00020C0B200BD70B50400002CEA +:1091E00001D1002023E0FFF7EBFF002807D0F9F7BB +:1091F000A0FD2149096900F024F8050000E00025E0 +:109200001D4E3078207070786070B078A07000F0DB +:1092100035F8317909010143E170F088A0808020A0 +:109220004002854201D38B4DFFE7E580012070BDF0 +:1092300000B5401A002801D4012000E00020C0B28F +:1092400000BD401A704710B5002100E0491C0A001B +:10925000D2B2022A0EDA804A0B00DBB21824634332 +:10926000D35C0400E4B2A342F0D1C9B21820414358 +:10927000501800E0002010BD781A002838B58EB0D4 +:1092800000252C0012E069460C482A00D2B2805C0E +:10929000FFF724FE002808D068463221405C0028F1 +:1092A00003D020000124AC4004436D1C2800C0B250 +:1092B0000428E8D32000C0B20FB030BDA0F30010E6 +:1092C000C027090000B501780A290ED04178042989 +:1092D0000BD04178062908D04178072905D041787C +:1092E000082902D04078092801D1012000E000209F +:1092F000C0B200BDF1B590B00124200069460870ED +:109300001098002801D1002043E000201099087037 +:10931000002617E00498381A09E001A8FFF7D2FFE9 +:1093200000282BD10498B842F4D30498C01B01A99B +:109330003222895C002901D1042802D30020694629 +:109340000870761C3000C0B2042820D2434D300093 +:10935000C0B240002818478B01A9C3483200D2B2DE +:10936000805CFFF7BBFD0028D7D128792100B140F0 +:10937000014329711098047000200AE02879210027 +:10938000B1400143297110980470002001E0684643 +:10939000007811B0F0BD00003075000038B58EB017 +:1093A000002400E0641C2000C0B2042821D22B4815 +:1093B0002100C9B249004018458B6946AA482200DD +:1093C000D2B2805CFFF78AFD00280AD06846FFF71A +:1093D00079FF002805D10398A84204D30398401BC5 +:1093E00003E0002006E00398281A0428DAD30020BE +:1093F00000E001200FB030BDF8B50600174D2889F8 +:10940000401C28812961AF486861002400E0641C89 +:109410002000C0B204281AD270682100C9B24900E5 +:10942000405A2100C9B24900691848832B895A2241 +:1094300070682100C9B24900415A8B482700FFB229 +:10944000C05DFFF719FC0028E1D1002000E00120F9 +:10945000F2BD0000FFFF000014F00010781A002891 +:10946000F8B590B00700002F04D008003B7BC0B2D5 +:10947000984201D30020BEE0B8680B00DBB218248C +:109480006343C0180190904E02207070F1700198F3 +:109490000078B070326101984068706100203076C9 +:1094A0003089401C3081002016E001990200D2B2C0 +:1094B0005200891889890200D2B25200B218518331 +:1094C00001990200D2B25200891889890200D2B2F1 +:1094D0005200B2185185401C0100C9B20429E4D3DE +:1094E0000198007D012801D1012084E00198007DD0 +:1094F000022863D100241EE02000C0B240003018D2 +:1095000045840DE0290089B2BA8A891880B2814267 +:10951000F2DAB88A28182100C9B2490071184884C3 +:109520002000C0B240003018408C2100C9B2490070 +:1095300071184883641C2000C0B2042821D201980D +:109540002100C9B249004018858902A94648220075 +:10955000D2B2805CFFF7C2FC002810D00598010051 +:1095600089B2BA8A89182A0092B29142CADAB88AB4 +:10957000281A2100C9B2490071184884D0E7002098 +:1095800039E0002400E0641C2000C0B2042813D29B +:10959000338938692100C9B2425C2000C0B2400062 +:1095A0003018418B30482500EDB2405DFFF764FB79 +:1095B0000028E8D100201EE001201CE0002400E08B +:1095C000641C2000C0B2042814D2308900903D4BA6 +:1095D0000198426801982100C9B249004018818968 +:1095E00021482500EDB2405DFFF77AFB0028E7D166 +:1095F000002000E0012011B0F0BDF8B50600002EFB +:1096000001D100202FE0304D2889401C2881022004 +:109610002876002420000AE00100C9B24900691838 +:10962000498D0200D2B25200AA185183401C010099 +:10963000C9B20429F0D300E0641C2000C0B20428A1 +:1096400010D22B89B27D2000C0B240002818418D75 +:109650001E482700FFB2C05DFFF70EFB0028EBD1CC +:10966000002000E00120F2BDA0F3001038B5164D37 +:109670002C89641C200080B2F8F7CCFFF8F77CFE40 +:10968000200080B2FEF756FF2C8103206870F9F7A6 +:1096900050FB286131BD38B50A000B4BD978491C05 +:1096A0000C00057BE4B2AC4203D30021DC88641CCF +:1096B000DC80C9B2FFF7D4FE002801D1FFF7D6FF46 +:1096C00031BD000030750000781A0028A0F30010AA +:1096D000F8B5C0B0002001F046FD20A9002000F040 +:1096E00098FA07006946012000F093FA0400380058 +:1096F000C0B2022801D1012500E000252000C0B23F +:10970000022801D1012600E00026300028438749C5 +:10971000087086480078002813D1FFB2002F04D1CA +:1097200020A800F0CAFA002807D0E4B2002C08D123 +:10973000684600F0C2FA002803D101207C49087075 +:1097400002E000207A4908707848007800280FD19C +:1097500000200100BA4A11707649086005E0002136 +:10976000C943754A8300D150401C2028F7D331E00B +:10977000F6B2002E16D0EDB2002D05D02299029837 +:1097800000F092FA00280DD001206A4908600020FC +:10979000202814D2694682008958674A8300D15034 +:1097A000401CF5E700206349086006E020A982001C +:1097B0008958614A8300D150401C2028F6D35E4866 +:1097C000C068012803D101209D49087002E00020F3 +:1097D0009B49087041B0F0BDF0B595B05348007892 +:1097E000002803D096480078002801D1002065E0C9 +:1097F000002400E0641C042C4ED2062767433F1D62 +:109800004D4DB800285801A914226243885001AE7A +:10981000B800281840681421614371184860B800E6 +:10982000281880681421614371188860B8002818CE +:10983000C068142161437118C860B8002818006915 +:109840000090B80028184069012801D1012000E0EB +:1098500000201421614371180874142060433018EB +:10986000426801A81421614341582000C0B200F0B1 +:10987000AFF9B9006918496902290BD200998142F0 +:1098800008D11420604331182000C0B2F9F7FBF86A +:109890000028AFD0002011E0002400E0641C042C5C +:1098A0000BD201A81421614341182000C0B2F9F77E +:1098B00014F90028F2D0002000E0012015B0F0BD1E +:1098C00000205F490870012019490870704710B5E1 +:1098D000A0B016480078002803D059480078002826 +:1098E00004D100205649087001201CE0002001002E +:1098F00006E0114A8B00D2586B468C001A51491C65 +:109900002029F6D30C498968491C029103901C2137 +:10991000684600F014F91C90A948006801214140F4 +:10992000684600F0F3F920B010BD0000E41C0028E8 +:10993000E61C00288C1C0028F8190028F8B5B0B0E7 +:10994000A04F3878002805D09D480068012141408B +:10995000009101E0002000900026300005E0002189 +:10996000C94310AA8300D150401C2028F7D3964841 +:109970001090082011903878002803D09348806810 +:10998000401C00E0012012900120139034001FE0E1 +:10999000310019E0019810A9AA00885010A8029976 +:1099A000AA00821851600399AA0082189160049954 +:1099B000AA008218D1600999AA008218116101A930 +:1099C000097C0029E4D00121AA0080184161641CAF +:1099D000042C12D2062565432D1D01A92000C0B21A +:1099E000F9F7E2F8002806D106A92000C0B2F9F77D +:1099F00039FA0028CED0002016E01C2110A800F073 +:109A00009EF82C90387800280AD0A54800780028C5 +:109A100006D010A800F065F9002801D0012003E06D +:109A2000009910A800F072F931B0F0BD65480078D7 +:109A300070479B48007870479A480078704700004C +:109A4000E51C0028F0B5A1B05E480078002803D0DE +:109A500093480078002801D1002047E00027380013 +:109A600006E05A498200895801AA8300D150401C5F +:109A70002028F6D355488068401C039001251C21FE +:109A800001A800F05CF868401D904D4800686840EF +:109A900000F07CF8060000960121300001F081FB07 +:109AA0000121300001F0BBFB002801D100201DE0A6 +:109AB0003C0008E0012201A8A1004118A0003018D4 +:109AC00001F0F6FB641C202CF4D300E07F1C202F57 +:109AD00009D20098B900405801A9BA0089588842B3 +:109AE000F4D0002002E06F480570012021B0F0BDE5 +:109AF00010B5A0B033480078002801D100201CE048 +:109B0000002006E03149820089586A468300D1501E +:109B1000401C2028F6D32D488068801C0290012428 +:109B200003941C21684600F00AF81C909F480068C6 +:109B300044402100684600F0E9F820B010BDF2B5BD +:109B40000026F64300210A0000E0521C009B9A42C6 +:109B50001AD29300C4580B0000E05B1C042BF4D213 +:109B60003500E6B26E40240A0D0001E00F0004E06B +:109B7000082DF2D2F707F9D58D4F7608B4463E008E +:109B800067467E406D1CF3E7F043F2BDC001894992 +:109B90004018704700B5C0B2002805D0022808D090 +:109BA00004D3032807D009E0834808E0AF20400130 +:109BB00005E0824803E0E120400100E0002000BD14 +:109BC0008C1C0028E41C002838564D53F819002836 +:109BD00038B50D001400C0B2FFF7DCFF020028000A +:109BE000002A01D0002C02D10020C04310E08442A2 +:109BF00000D2200000210023FAF706FD02000B002E +:109C0000600800218018594122000023FAF709FA60 +:109C100032BD10B50C00FFF7B9FF002C01D10020B8 +:109C20003CE0002104E08A0082588B00E250491C8D +:109C30002029F8D3E068022801D300202EE0206814 +:109C40005F4988420BD16068082808D11C21200098 +:109C5000FFF775FF216F814201D102201EE02068CD +:109C60005849884202D1606805280DD020685649BD +:109C7000884202D16068062806D02068534988428D +:109C80000BD16068072808D11C212000FFF757FF7F +:109C9000216F814201D1012000E0002010BD0000B1 +:109CA000E51C0028E61C002800B5401A012801DB4D +:109CB000012000E00020C0B200BD00B5002801D1A5 +:109CC00000200DE0002100E0491C202907D28A0075 +:109CD00082580023DB439A42F6D0002000E00120A6 +:109CE00000BD10B5002801D100200EE0042100E0E5 +:109CF000491C1C2908D28A008258354B8C001B59FC +:109D00009A42F5D0002000E0012010BDFEB505000C +:109D1000002D03D000910098022801D3002043E0D9 +:109D20000098FFF733FF070001970121380001F089 +:109D300038FA0121380001F072FA002801D1002020 +:109D400032E00026340007E00122A0002918A0001C +:109D5000381801F0ADFA641C202CF5D3300005E072 +:109D6000810069581A4A8300D150401C202808D22B +:109D70000199820089588200AA589142F0D00020AF +:109D800012E000980949086001200100114A117091 +:109D9000E968012902D11049087002E030000E493B +:109DA00008700E4806700120FEBD00008C1C0028C3 +:109DB0002083B8ED00000314FC530000901A00004B +:109DC00038564D5335564D5336564D5337564D53E1 +:109DD000F8190028E41C0028E51C0028E61C0028CF +:109DE00000B5010009B2002905D40121C006C00E4A +:109DF0008140AE48016000BD00B5010009B20029F4 +:109E000005D40121C006C00E8140CC48016000BDD0 +:109E1000F0B5020012B2002A18D41822A44B040094 +:109E200024B2A408A4001C59FF250600F600164021 +:109E3000B540AC438901C9B20500ED002A4091400C +:109E4000214300B28008800019501CE00F22BC4C56 +:109E5000182503001BB21340083B9B089B0006001B +:109E600036B23240083A92089200A258FF26070004 +:109E7000FF002F40BE40B2438901C9B2C000054077 +:109E8000A9401143E150F0BD00B5002A03D10122E1 +:109E90008A40426002E001228A40826000BD02687E +:109EA000CA401000C007C00F704700B5022801D398 +:109EB00001200FE00B00DBB2042B01DB012009E0E5 +:109EC000BC4B80001818C9B2405C824201D301200B +:109ED00000E0002000BDF8B504001F00022C01D3F3 +:109EE000012023E015000E002A003100C9B2200035 +:109EF000FFF7DBFF012801D1012017E03000C0B2DD +:109F0000002816D1FF2F12D8AB4861034018A900D2 +:109F100040188021490140180168A84A0A403902C6 +:109F2000FF231B020B40134303600020F2BD0120FE +:109F3000FCE7F6B2012E16D180204002874210D2F3 +:109F40009D4861034018A9004018A021490140180C +:109F500001689B4A0A403902C44B0B40134303601B +:109F6000E3E70120E2E70120E0E700B20012C0B21F +:109F70007047F8B505000F001600280000B2FFF783 +:109F8000F4FF04002000C0B2022801D301202CE01D +:109F900032003900C9B22000C0B2FFF786FF0128A5 +:109FA00001D1012021E084482100C9B249034118B0 +:109FB0002A00D2B292008918C02212018A58AC49F4 +:109FC0001140FFB23B02C02292001A400A43FF2117 +:109FD0008A43F1B21143E4B262038018EDB2AA00E1 +:109FE0008018C022120181500020F2BD70B504001B +:109FF000022C01D3012028E015000E002A003100B8 +:10A00000C9B22000FFF751FF012801D101201CE057 +:10A01000694861034158802212060A43C02189041D +:10A020001143FF2212040A43914B1340F6B232024D +:10A03000C021890011401943FF229143EAB20A432B +:10A040006103425061034058002070BD70B50400A8 +:10A05000022C01D3012028E015000E002A00310057 +:10A06000C9B22000FFF721FF012801D101201CE027 +:10A070005148610341588022D2050A43C021890416 +:10A080001143FF2212040A43794B1340F6B2320205 +:10A09000C021890011401943FF229143EAB20A43CB +:10A0A0006103425061034058002070BD00E100E0B0 +:10A0B00000E400E038B500200100974A117001006B +:10A0C000964A11709649086000F0D4F8002803D031 +:10A0D00000F02CF9002804D19248B849086000200B +:10A0E0002BE0914C2000FAF76DFE002804D08D483B +:10A0F000B2490860002020E0B1490020205EFAF754 +:10A1000080FE00210220205EFFF782FE0220205EFA +:10A11000FFF772FEAB4D280001F0AEFFAA49280000 +:10A1200001F020FCA5490860002801D0002004E0CF +:10A130000220205EFFF754FE012032BD80E200E0E5 +:10A140001CED00E038B50400002C01D100202FE008 +:10A15000FAF7FEFC71490A7813006F4D2D78DBB2D7 +:10A16000AB4203D1FAF7F8FC002021E0C44B150004 +:10A17000EDB22D015D5925601500EDB22D015D197F +:10A180006D6865601500EDB22D015D19AD68A560C3 +:10A190001500EDB22D015B191B7B2373521C1300BC +:10A1A000DBB2102B00D300220A70FAF7D5FC012095 +:10A1B00032BD00009CF2001000000440FF00FFFFD1 +:10A1C000FF0000FFF1B594B00D00160050210024EF +:10A1D00022006F463800FCF7C3FF14988021090164 +:10A1E000884203D24E480068002804D04D48A9494F +:10A1F0000860002038E068462100017021000172EB +:10A200001499019108214C2281540395049600E091 +:10A21000641C2000C0B2082821D26A4D2100C9B2B6 +:10A22000280002F081F80100C9B20129F0D0C0B2C3 +:10A230000328EDD01498984908606A462100C9B2F5 +:10A24000280001F09DFF93490860002805D193483C +:10A250000168491C0160012006E0002004E09048EC +:10A260000168491C0160002015B0F0BD00FFFF002F +:10A27000FFFCFFFFF8B5002500956846FDF71EFEC0 +:10A28000002801D0002046E0864C0098A04205D36B +:10A2900000982100F9F7CAFF002901D000203AE018 +:10A2A00000982100F9F7C2FF0400002C03D0FF2022 +:10A2B000801C844201D300202DE0FF2608363000A8 +:10A2C000FFF753FE0700002200213800FFF7BEFE13 +:10A2D000002801D000201EE0002200213000FFF7FE +:10A2E00048FE002801D0002015E023005B1E00225C +:10A2F00000213800FFF7EFFD002801D000200AE020 +:10A30000002200213800FFF771FE002801D1012052 +:10A3100000E02800C0B2F2BDB51C0028B61C002821 +:10A32000E41B0028010062000008002818B5A7B04F +:10A330001AA85D493422FAF777FD0DA85B4934224B +:10A34000FAF772FD68465A493422FAF76DFD594C06 +:10A350001AAA07212000F9F72AFF002801D00020BF +:10A3600024E00DAA06212000F9F721FF002801D0E2 +:10A3700000201BE06A4601212000F9F718FF0028A1 +:10A3800001D0002012E0012201212000FFF77CFD16 +:10A39000FA208000FAF732FF01212000FFF77FFD4D +:10A3A000012801D1012000E00020C0B228B010BD7A +:10A3B00080B5044801F096F901BD0000C41B0028D7 +:10A3C000B1A30010000454400808002870B5140020 +:10A3D000002C05D0207A002802D12078002800D057 +:10A3E0004DE035480168491C0160606833490860E8 +:10A3F0006068C0218900884214D14C20205C082864 +:10A4000010D1E068C0B209280CD1E068000AC0B2DF +:10A41000102807D12069002804D1E068000C80B220 +:10A42000F8F7F8F8264801780A00521C1300DBB24E +:10A43000102B00D300221300224D2D78DBB2AB424B +:10A4400004D121480168491C016018E00C4B656883 +:10A450000E00F6B236019D514C25655D0E00F6B238 +:10A4600036019E193573E5680E00F6B236019E1965 +:10A4700075602469C9B2090159188C60027070BDF9 +:10A480002817002800B5C0B2002802D101200F49CA +:10A49000086000BDE01B0028DC1B0028D01B002842 +:10A4A000D41B0028005A6202E4EE001018EF0010DE +:10A4B0004CEF001080013140C81B0028D81B002839 +:10A4C000B51C0028B61C0028CC1B0028E41B002863 +:10A4D00000B5BFF34F8F3D48AE490860BFF34F8FC3 +:10A4E00000BFFDE7AC490A6808607047B5490A68D3 +:10A4F00010239A43C0B20001102318401043086093 +:10A500007047B0490A68B04B1340C0B200028022C5 +:10A5100052001040184308607047AA490A68B64BB9 +:10A520001340C0B20003802252011040184308605B +:10A530007047A4490A6852005208C0B2C0071043CD +:10A5400008607047B4480068704700207047B348FF +:10A550000068704710B50400B0480460BFF34F8F27 +:10A56000FFF7F5FFA04201D1012000E00020C0B2BA +:10A5700010BD38B5C824C0B2002801D0012505E0BF +:10A58000002503E00120FAF739FE641EA4490120EA +:10A590000A680240AA4203D0002C01D0020000E069 +:10A5A0000022D2B2002AEDD109680140A94200D0B0 +:10A5B0000020C0B232BD00209A4908609A49086064 +:10A5C0009A490860BFF34F8F704700000400FA05F6 +:10A5D000FEB50400FF20E230019001252F00FAF7BC +:10A5E000C4FE0020FFF7C5FF69464870FFF7ADFFC6 +:10A5F00069460870FFF7ABFF06008A4800688A4981 +:10A6000009688A4A1268A04B98420DD14140002344 +:10A61000DB434B409A4207D101992140002901D1E7 +:10A62000E10601D5290000E000210022A24B1A70AA +:10A630000022A24B1A700022A14B1A70019A2240EC +:10A64000002A02D19F4A117002E02A009D4B1A7025 +:10A650009D4A117061000CD50020FFF77BFF0700B9 +:10A66000FFF775FF0600FFF7A6FF00209649087068 +:10A670000BE095490978002902D0FFF79CFF04E020 +:10A680008149884201D1FFF796FFFFB2002F09D020 +:10A690008E48864206D08E48864207D169460978A0 +:10A6A000002903D105208449087016E085490978FE +:10A6B000002907D084490978002903D104207E4964 +:10A6C00008700AE069460978002906D0FFF742FFC2 +:10A6D000002802D105207849087068464078002893 +:10A6E00002D17548057048E0FAF7F6FDFAF71EFE4C +:10A6F000C82424012000FFF7F5FE0120FFF7F6FE35 +:10A700000020FFF7FEFE0020FFF707FF0120FFF704 +:10A7100010FFFAF700FE20480068A0420BD129483C +:10A72000016809092940002905D00068010B0800CB +:10A73000C007C00F00E02800C0B2002802D05E4869 +:10A7400005701AE0FAF705FE0120FFF712FF002856 +:10A7500002D15948057010E0FAF722FEFA20800075 +:10A76000FAF74CFDFFF7EEFE002802D152480570C3 +:10A7700003E05248057000F001F8F7BD80B54F487E +:10A780000078002805D04E480078002801D1FAF75B +:10A7900007FE01BD0CED00E008C0264080B50100B9 +:10A7A000C9B200290CD044490A78002A08D108709F +:10A7B0000020F7F767FFF7F775FF0020FDF7BAFEF7 +:10A7C00001BD000010C02640FFFEFFFF80B5FFF76F +:10A7D000BCFEFFF7BCFE3D49884202D10520FFF7D1 +:10A7E000DDFFF7F72DFE002802D00120FFF7D6FF8E +:10A7F000FFF7C4FF01BD0000FFEFFFFF00B52E48CB +:10A800000078002801D0012000E00020C0B200BD87 +:10A81000294800787047000014C026400C102740DB +:10A8200000C0264000102740041027400810274091 +:10A8300038B522490978002903D0214C2178002914 +:10A8400001D000201FE0234B0F491960020092B293 +:10A85000214D2A6080B2214A424021480260BFF364 +:10A860004F8F1B688B4202D10068904203D0FFF7E4 +:10A87000A2FE002007E00020F8F7EDFAFAF790FDBD +:10A8800001202070012032BD364C494880B50C486B +:10A890000078002801D101BD00BFFFF753FEC82199 +:10A8A00009018842F8D3BFF34F8FFFF711FE00BFB5 +:10A8B000FDE7054800787047C61C0028C81C002822 +:10A8C000C91C0028C71C0028CA1C002845564F4D2B +:10A8D00041564F4D0010274004102740C9B3B6B76A +:10A8E000081027401CB501F04DFD002803D100F0F1 +:10A8F000C5F800202FE002F027F8002803D100F06F +:10A90000BDF8002027E0F9F79AFF002805D0694636 +:10A910000520FAF723F8002803D100F0AFF8002053 +:10A9200019E0684600886E49088001246D4804706B +:10A9300000206D4908606D4800886D49088001203D +:10A9400000F0ACFA012000F0C5FA64206949086003 +:10A95000A6480470012016BD80B5002804D1A44883 +:10A960000168491C016020E0A2490A68521C0A6083 +:10A970000168A14A891A08D00C3909D092225200E4 +:10A98000891A08D05C3909D00BE000F0B5F80CE06A +:10A9900000F03AF909E000F099F906E000F0CAF990 +:10A9A00003E093480168491C016001BD80B501F0D6 +:10A9B00017FD4E484E490A8803889A4201D2008802 +:10A9C000088000F03CF88D480178E02905D0017836 +:10A9D000052902D00078002806D100208849087097 +:10A9E0000120824908700EE086480178002906D1CE +:10A9F00083480178002906D00121017003E0007826 +:10AA0000401C7F490870AE480078002814D0AD483B +:10AA10000168002910D00168491E01600068002803 +:10AA20000AD1A948007802F001F8002804D10120D9 +:10AA3000BD49086000F078FA00F07DFA01BD1CB550 +:10AA400029480168491C016001680A2915D30024BE +:10AA5000046069460520F9F781FF002807D06846A1 +:10AA600000881F49088001201E49087005E0AF4892 +:10AA70000168491C01601B48047013BD80B501F0DA +:10AA800026FD02F0ABFA01F0E8FF002001008C4A3D +:10AA900011708C4908600100A54A1170584908706E +:10AAA00001205249087001BD80B5022000F084F9F0 +:10AAB00002BD80B5012000F0F1F98148007800283E +:10AAC00001D1012000E00020C0B202BD00B57C48E9 +:10AAD0000078002801D1012000E00020C0B200BDB4 +:10AAE000A81C0028D21C00284C1C0028A61C0028EA +:10AAF000AA1C0028481C002870B5017B08290AD030 +:10AB00003B480168491C0160002000F0C7F90020A3 +:10AB100000F0E0F968E00324416822000A4041683F +:10AB2000890823000B404168090925000D400F26C4 +:10AB30004168090C31404068000D06401000C0B269 +:10AB4000022803D1012000F0A9F924E0D2B2012AA1 +:10AB50001AD11800C0B2012802D0DBB2022B13D1E7 +:10AB60000800C0B200280FD00800C0B206280BD2DF +:10AB70000800C0B200F020F900280CD102206A4978 +:10AB8000086000F0D1F906E019480168491C01602D +:10AB9000002000F083F92800C0B2022803D1012070 +:10ABA00000F098F920E0EDB2012D16D13000C0B2CE +:10ABB000002812D03000C0B206280ED2B648007865 +:10ABC00000280AD03000C0B200F037F900280BD1BD +:10ABD0005548046000F0A8F906E005480168491CE2 +:10ABE0000160002000F076F970BD0000FE12002820 +:10ABF000301C00282C1C00289E020000CD1C0028C0 +:10AC0000FD120028CC1C002880B5017B082904D047 +:10AC1000AE480168491C016051E043680721426861 +:10AC2000120C0A404068C00C0140DBB2012B07D176 +:10AC30001000C0B2052803D20800C0B2052804D312 +:10AC4000A2480168491C016039E01000C0B2012827 +:10AC500001D1012005E0D2B2022A01D1022000E098 +:10AC600003209B4A10700800C0B2012801D10120C6 +:10AC700005E0C9B2022901D1022000E003209F496A +:10AC800008700F48007800280AD09D48007800F02E +:10AC900093F8002804D104202349086000F044F907 +:10ACA0009848007800280AD09748007800F0C5F846 +:10ACB000002804D105201C49086000F035F901BDC9 +:10ACC000CF1C0028441C0028D11C002880B5017B23 +:10ACD00008290AD00020704908707C480168491C86 +:10ACE0000160002000F0F6F81CE0406800098007D1 +:10ACF000800F0100C9B2012902D0C0B2022803D1DD +:10AD000001206549087002E000206349087062482C +:10AD10000078002806D16D480168491C01600020B8 +:10AD200000F0D8F801BD00003C1C0028401C0028A1 +:10AD3000FC12002810B5017B08290AD0634801687D +:10AD4000491C0160002000F0A9F8002000F0C2F8C2 +:10AD500031E0032441682140406880080440080035 +:10AD6000C0B201280BD16648007800F025F8002811 +:10AD70000BD10620AA49086000F0D6F805E0C9B258 +:10AD8000022902D1012000F089F82000C0B2012878 +:10AD90000BD15D48007800F050F800280BD1072057 +:10ADA0009F49086000F0C0F805E0E4B2022C02D12F +:10ADB000012000F08FF810BD70B50100C9B2032961 +:10ADC00001D3032500E005000100C9B2002903D02A +:10ADD0000100C9B2062901D3002025E03C490A78C8 +:10ADE0002B00DBB29A4200D20D78454908708D4C99 +:10ADF0002800C0B200F08AF820706D1C8A480570E7 +:10AE000001258A4805708A4E307800280DD16420CB +:10AE100001F0C0FD002801D1002005E03570FA20C6 +:10AE2000C00084490860012070BD82480068002885 +:10AE3000F9D1207801F0FAFDF6E710B50100C9B2AA +:10AE4000032901D3032400E004000100C9B2002952 +:10AE500007D00100C9B2062903D20F490978002999 +:10AE600001D1002017E025490A782300DBB29A427D +:10AE700000D20C78244908702000C0B201F012FB07 +:10AE8000002801D1002006E0641C6B4804700120FA +:10AE900066490870012010BDD01C002810B50400C0 +:10AEA00001F0DBFD00200100614A1170614908607A +:10AEB00001005C4A11702100C9B2052900D30400C9 +:10AEC0005948047001205949087010BD301C0028F1 +:10AED0000013002810B50400002001F0E3FA002858 +:10AEE00001D102F07BF82000C0B2052800D3002475 +:10AEF0005148047001204D49087010BD021300280C +:10AF0000FF120028CC1C00280113002800B5010006 +:10AF1000C9B2012901D1322005E0C0B2022801D115 +:10AF2000462000E0642000BD80B5FFF7A7FD0120AA +:10AF3000FFF734FC01BDFEB5404C2068401C20608A +:10AF40003A4E3078002802D12068642866D336480B +:10AF50000078C0B24007400F37490978C90038224D +:10AF60000A400243019236480078002801D00121AE +:10AF700000E0002133480078E02801D0022000E002 +:10AF8000002008432A490978002901D0012100E066 +:10AF900000212D4A1278530006221A400A438023CA +:10AFA0005B002A490D689D4201D3FF2100E009683A +:10AFB000274D2F689F4201D3FF2300E02B68C0B2CA +:10AFC000D2B21202024323480088000410430090CA +:10AFD000214D2888C9B209040143DBB21F060F4383 +:10AFE000002201991D48FFF7EDF8002812D03A0021 +:10AFF00000991B48FFF7E6F800280BD019480168B4 +:10B00000491C016018480088288000200100317028 +:10B01000206003E015480168491C0160F7BD00008D +:10B020003C1C0028D11C0028FC120028FE1200281D +:10B03000CF1C0028441C0028FD120028481C0028B2 +:10B04000D21C0028CD1C0028CC1C0028401C002845 +:10B05000181C0028A81C0028AA1C0028FA040000BC +:10B0600005030000341C0028A61C0028381C0028FA +:10B0700000B5FEE700B5010009B2002905D40121A1 +:10B08000C006C00E8140B748016000BDF0B50200A7 +:10B0900012B2002A18D41822844B040024B2A40847 +:10B0A000A4001C59FF250600F6001640B540AC432D +:10B0B0008901C9B20500ED002A409140214300B248 +:10B0C0008008800019501CE00F22A74C18250300AF +:10B0D0001BB21340083B9B089B00060036B232406F +:10B0E000083A92089200A258FF260700FF002F405E +:10B0F000BE40B2438901C9B2C0000540A940114316 +:10B10000E150F0BD00B59D48012102680A4302608C +:10B1100002680A40002AFBD100BD9948016801225B +:10B120000A43026070479748016801220A4302609F +:10B1300070471FB5684602F049F900280DD08B4CC6 +:10B1400018228B492000FCF703FF0020E0754920FE +:10B15000884908600020FCF75BFF01208A490870DD +:10B16000FFF7D0FF1FBD80B5C0B201280ED103216B +:10B17000814802F05BF903210320FFF787FF0320DA +:10B18000FFF778FF01208149087002E000207F4925 +:10B190000870FFF7C2FFFFF7C6FF01207A49087069 +:10B1A00001BD7CB505000E00794803C86A4603C29C +:10B1B000083A3000C0B2002814D174480078012841 +:10B1C0000DD06A4C18226A492000FCF7C1FE00200D +:10B1D000E0759420674908600020FCF719FF002003 +:10B1E00069490870684601210171002421004171FC +:10B1F00000953200D2B26946002002F027FB0028F9 +:10B200000CD05A4D18225A492800FCF7A1FEEC75C3 +:10B210009E20584908600020FCF7FAFE73BD7CB5FB +:10B2200006000D00300002F013FA00280DD04F4C3C +:10B2300018224F492000FCF78BFE0020E075B52056 +:10B240004C4908600020FCF7E3FE2800C0B200284B +:10B2500014D14E48007801280DD0444C182244499E +:10B260002000FCF775FE0020E075B9204149086018 +:10B270000020FCF7CDFE0020434908700096300006 +:10B2800002F024FA002801D0202001E08020800074 +:10B2900001902A00D2B26946002002F03FFB00284C +:10B2A00001D1012000E0002076BD000000E400E0B4 +:10B2B000F8B584B007000E001500380002F0C8F998 +:10B2C00000280DD0294C182229492000FCF740FE07 +:10B2D0000020E075DF20274908600020FCF798FE79 +:10B2E00068461021FBF74CFF2800C0B2002814D19B +:10B2F0002648007801280DD01C4C18221C4920003B +:10B30000FCF726FE0020E075E6201A4908600020C0 +:10B31000FCF77EFE00201C490870012168460A00E7 +:10B3200002720A00427202228272C172002421005B +:10B330000173009701962A00D2B26946002002F0FC +:10B3400027F900280CD0094D182209492800FCF7DC +:10B35000FFFDEC75F520074908600020FCF758FE5A +:10B3600005B0F0BD00E100E01CED00E0181B002876 +:10B3700060ED0010F01B002833B1001008002440DD +:10B3800000F4244000F52440B71C0028B81C002815 +:10B390008CF2001000B5002801D0002901D1A0488E +:10B3A00008E0A04A904206D1002008808020800159 +:10B3B0004860002000BD9C4A904205D18020800159 +:10B3C00002000A804860F4E7BA4A904206D1802021 +:10B3D000C0010880802080014860EAE7B64A9042B8 +:10B3E00006D1C020C0010880802080014860E0E7CD +:10B3F000B24A904206D1802000020880802080015D +:10B400004860D6E7AE4A904205D1002008808020EF +:10B4100080014860CDE7AB4A904205D18020800191 +:10B4200002000A804860C4E7A74A904206D1802003 +:10B43000C0010880802080014860BAE7A34A90429A +:10B4400006D1C020C0010880802080014860B0E79C +:10B450009F4A904206D1802000020880802080010F +:10B460004860A6E76E48A5E700B5002100E0491C4A +:10B470000A290AD2974A18234B43D3589842F6D147 +:10B48000182041435018001D00E0002000BD10B5F9 +:10B490000A00D2B2402A01DB002017E0020C12049D +:10B4A00080235B02D218AC23C3589B089B049B0CDF +:10B4B0009B00D218C9B2884BBC240059000A40072F +:10B4C000400F185C801C41438800101810BD10B557 +:10B4D0000A00D2B2202A01DB002016E0020C12047E +:10B4E00080235B02D218C023C3589B089B049B0C8B +:10B4F0009B00D218C9B2784BC82400594007400FAE +:10B50000185C801C41438800101810BD10B50B005A +:10B51000DBB2022B01DB002028E0030C1B0480249B +:10B5200064021B190C00E4B2002C05D1A0240459BC +:10B53000A408A404A40C04E0B0240459A408A4049E +:10B54000A40CA4001B19C9B2002904D1BC21405885 +:10B550004007400F04E0BC21405800094007400F5D +:10B560005D49085C801C42439000181810BD00B56E +:10B570005A49884201D3052100E00021400A4006D3 +:10B58000400E0818C0B200BD38B504000020002CE1 +:10B5900044D02000FFF7EBFF0121226D520F0A403B +:10B5A000002A05D00A004E4B0500EDB26D005A533B +:10B5B000226D120F0A40002A05D00222484B0500D6 +:10B5C000EDB26D005A53226DD20E0A40002A05D00A +:10B5D0000322434B0500EDB26D005A53226D920ECB +:10B5E0000A40002A05D004223D4B0500EDB26D0053 +:10B5F0005A53226D520E0A40002A05D00522384BBC +:10B600000500EDB26D005A53226D520D1140002914 +:10B6100004D00621324AC0B24000115231BD0000B0 +:10B6200001006200000052400002524070B500224A +:10B630001300130000283CD003689B0F1C00E40794 +:10B64000E40F0C720B7A002B05D10368DB00DB08DA +:10B650009B144B6003E00368DB00DB084B6043682E +:10B660005B0D1C00E407E40F0C7043681B0C1B0708 +:10B670001B0F4C240B554C23CB5C082B01DA130019 +:10B6800002E04C23CB5C083B0AE01400A4B2A40007 +:10B690000419A4681500ADB2AD004D19EC60521C40 +:10B6A00014000D4D1E00B6B2AD5DA4B2ADB2AC42F9 +:10B6B000EBD370BD000452400006524000085240D7 +:10B6C000000054400002544000045440000654401E +:10B6D000000854405808002884F200100108524025 +:10B6E000301B0028F1B5A8B0002000900020289859 +:10B6F000FFF7BAFE0700002F29D0289E306D97492A +:10B700000140002902D02898FFF73EFF0125306D47 +:10B71000C00C284000281CD1306D2840002868D17A +:10B72000306D00092840002800D0BAE0306D400A92 +:10B730000540002D0BD0300050300168802292006F +:10B740000A4302603868002801D03868804729B071 +:10B75000F0BD300050300168802212030A430260BD +:10B7600098203058002816D0002400E0641C2000E7 +:10B77000C0B220282CDA98203058E0402840002819 +:10B78000F4D02100C9B22898FFF781FE0090A540AF +:10B79000982035501CE09C203058002818D00024F8 +:10B7A00000E0641C2000C0B2202811DA9C20305830 +:10B7B000E04028400028F4D020342100C9B2289865 +:10B7C000FFF765FE00902000E03085409C2035505A +:10B7D00000980028BBD013A90098FFF727FF7868CE +:10B7E0000028B4D013AA2100C9B200207B68984772 +:10B7F000ADE73000503001682943016017E0289A16 +:10B80000D4235B00D45801AA0300DBB29B00D450C0 +:10B81000401C02000B00D2B2DBB29A42EFD3B868F0 +:10B82000002804D001AAC9B20020BB689847A42010 +:10B8300030584006400E012889DB2898C021490075 +:10B8400040582840002822D1A420305800903F249E +:10B850000098020A224000212898FFF757FE00288E +:10B86000E5D013A9FFF7E2FE3000A83001683F22BF +:10B870009143009A120A14400C430460786800282F +:10B88000D5D013AA002101207B689847CFE7344820 +:10B890002899BC2289584907490F415C891C00201E +:10B8A000B7E730005030016810220A43026017E009 +:10B8B000289ADC235B00D45801AA0300DBB29B006A +:10B8C000D450401C02000B00D2B2DBB29A42EFD33C +:10B8D000B868002804D001AAC9B20120BB68984703 +:10B8E000B42030584006400E012800DA2FE728988F +:10B8F000C0214900405840082840002822D1B420E7 +:10B90000305800903F240098020A224001212898D4 +:10B91000FFF7FCFD0028E3D013A9FFF787FE3000F6 +:10B92000B83001683F229143009A120A14400C4338 +:10B93000046078680028D3D013AA012101207B6815 +:10B940009847CDE706482899BC2289580909490734 +:10B95000490F415C891C0020B4E70000EEE0F73F8E +:10B9600084F20010F1B594B0D34800681290D34827 +:10B9700000681190D2480768D2480668D24800682B +:10B980001090D24800680F90D14800680490D148C8 +:10B9900000680E90D04800680190D04800680D9073 +:10B9A000CF4800680C90CF4800680B90CE480068E4 +:10B9B0000A90CE4800680990CD4800680890CD48AC +:10B9C00000680390CC4800680290DC48006807904B +:10B9D000DB48006800901498002810D00C00002C60 +:10B9E0000DD02820205C002802D0E06A002806D074 +:10B9F0003020205C002804D0606B002801D1D148A1 +:10BA000024E31498FFF730FD002801D1CD481DE351 +:10BA10002168016061684160A1688160E168C1607E +:10BA200021690161149D0120A861A869C007FCD5A6 +:10BA30000320A86105A91498FFF7ACFC002801D0E9 +:10BA4000C04803E32820215C129ABF4810400A0432 +:10BA5000FF21090411400143BC4808406946898A16 +:10BA600089B2890889B28900014384202950302095 +:10BA7000205C4006400EFE21C903119BE44A1A4097 +:10BA80000004084010438422AA5892082823E35C4B +:10BA9000D2189204920CAD4B03409200DD48104046 +:10BAA00018438822A850A06BC000C0087A0F520724 +:10BAB00010439022A85007224020205C1040099F8C +:10BAC000D54B3B400702E020C000384018434123DB +:10BAD000E35C13407027B8431F0170233B400343CE +:10BAE0004220205C10400727BB431843BC23E8508A +:10BAF0004420235C1800C007C00F73005B08C60712 +:10BB00001E434520205C4006400EC44B1E400706E5 +:10BB1000FE20C005384030434626A65D7606760EE8 +:10BB2000BB4F07403004084038438826AE59B6085A +:10BB30003027E75D7F00F619B604B60C834F074047 +:10BB4000B600B44830403843A026A8514820265CAF +:10BB50003000C007C00F109E76007608C007304343 +:10BB60004926A65D7606760E03403606FE20C00501 +:10BB7000304018434A23E35C5B065B0EA44E06404C +:10BB8000180401403143A64FA020285880084623BE +:10BB9000E35C4226A65DBE5DB61C7343C0188304F9 +:10BBA0009B0C6A4808409B009A4919400143B02009 +:10BBB00029504720205C002801D1002100E001210C +:10BBC000009B012083430800C007C00F18434B218E +:10BBD000615C002901D1002100E00121022398438A +:10BBE00049000223194001431498C0235B00C1504F +:10BBF000B020285880084A21615C4123E35CFB5C4B +:10BC00009B1C5943401883049B0C82484F490F9E4C +:10BC10000E409B0003403343AC26AB514323E35C0F +:10BC20001A40089B0726B3431A43C823EA507D4AAB +:10BC3000049E16407C4B1E400496AC26AE59B608B6 +:10BC400000964C26A65DB4464026A65DBE5DB61C99 +:10BC500067467743009EF619B604B60C049F0F4062 +:10BC6000B60006403E43F027EE510E9F6F4E3E4019 +:10BC700032404D26A65DB606B60E13403604FC22B1 +:10BC8000920332401A43F023EB589B0814339B0471 +:10BC90009B0C11409A0010400843C021685080223C +:10BCA00052021498000C00046946898A40188018D2 +:10BCB00006998B08002125E0E4F20010E8F200105C +:10BCC000ECF20010F0F20010F4F20010F8F20010A4 +:10BCD000FCF2001000F3001004F3001008F3001051 +:10BCE0000CF3001010F3001014F3001018F3001000 +:10BCF0001CF3001020F3001024F30010002606604F +:10BD0000001D491C9942F9D30199012008430221E1 +:10BD10000143CF480840217D012901D1012100E0E4 +:10BD20000021CC4B03404802802189000840184381 +:10BD3000217D01290CD101210BE000BF28F3001067 +:10BD40002CF3001001006200FFFF00FF0300FFFF63 +:10BD50000021C14B034008028021490008401843DC +:10BD60008021884340218843202188431021884333 +:10BD70000421884301900198A861E08AC005C00DA4 +:10BD80000D99B64B0B400104B54808401843217E7D +:10BD9000B44B03400902FF200002084018437F23F0 +:10BDA000617E19407F26B0430143A07E1840C9013F +:10BDB000C90940060843E861207D012853D11F20AE +:10BDC000A18B01400C9FA84E3E400F04F82149036F +:10BDD00039403143A67F3040A44E0E400102F82086 +:10BDE0004001084030430F21E67F0E40F027B84362 +:10BDF0003701F0263E4006432020205C01400F2002 +:10BE0000864331432220205C012811D1012610E015 +:10BE1000FFFF80FFFCFF0000FFF8FFFFFFFFFF8038 +:10BE200084F20010FFFFFFC0FFFFC0FFFFFFFFBF56 +:10BE300000268F480840F105802636043140014332 +:10BE4000E9602320215C19400B9E8A4830400E0295 +:10BE5000FE21C901314001432420205C03407F20A2 +:10BE600081430B43AB6403203C21635C03400A998C +:10BE70003026B1431E01302333400B433D21615C2A +:10BE800008400C218B4381000C20084018433E21C0 +:10BE9000615C012901D1012100E0002102239843C6 +:10BEA00049000223194001433F20205C012801D1B1 +:10BEB000012000E00020012601239943304008437F +:10BEC000802168501498000C000484216958890866 +:10BED0008904890C890040188018002105E0E36A74 +:10BEE0008F00DB598F00C351491C2823E35C994222 +:10BEF000F5D31498000C0004882169588908890436 +:10BF0000890C890040188218002308E0606BD90072 +:10BF1000401803C8DF00D71903C7083F5B1C302057 +:10BF2000205C8342F2D3844803990140834A0A404B +:10BF300083491140834A0A4083491140834A0A4099 +:10BF40004B491140824A0A4082491140824A0A40C4 +:10BF5000802109031143814A0A4081491140814AE5 +:10BF60000A40814911403A4A0A4080491140804ABA +:10BF70000A4080491140804A0A4036491140364BF8 +:10BF80000B4080218B434021C9430B402022D243E8 +:10BF9000134010271F4308239F430423DB431F4004 +:10BFA0000224E443274037430397039F6F65029FB2 +:10BFB000384002900298614F074061483840614F15 +:10BFC000074061483840614F074029483840604F7A +:10BFD000074060483840604F0740684838405F4F2E +:10BFE00007405F4838405F4F07405F483840184F70 +:10BFF00007405E4838405E4F07405E4838405E4F1D +:10C00000074014483840144F074080208743394088 +:10C010000A4010208243082082431340234001201D +:10C020008343AB65079830430440EC651498FFF7F1 +:10C030009EFA4000B04900220A520198012188432B +:10C04000A861A86930400028FBD1002015B0F0BDE0 +:10C05000FFBFFFFFFFFDFFFFFFFEFFFFFFFF00FE33 +:10C060000000FF01FF00FFFFFFFFE0FFFFE0FFFF19 +:10C07000FFFF7FFFFF80FFFFFEB50700002F01D10C +:10C080009E4857E03800FFF7EFF9002801D19B48A0 +:10C0900050E0002404604460C46004613D0001205D +:10C0A000A861A96901400029FBD00326AE61694659 +:10C0B0003800FFF76FF9002801D090483AE084205B +:10C0C0002C5088202C508E4890216850BC202C5039 +:10C0D000A0202C50B0202C50C02040003C50AC2060 +:10C0E0002C50C8202C50F0202C50C0202C50380C44 +:10C0F00000046946098840188021490240180199C6 +:10C100008A08210002E00460001D491C9142FAD314 +:10C11000AE617C48E8617C48E860AC6480202C50CB +:10C120006C65AC65EC653800FFF721FA4000724998 +:10C130000C520020FEBD0000FFFFFFDFFFFFFFEFFE +:10C14000FFFFFFF7FFFFFFFBFFFFFFFDFFFFFFFE0E +:10C15000FFFFBFFFFFFFDFFFFFFFEFFFFFFFFBFF63 +:10C16000FFFFFDFFFFFFFEFFFF7FFFFFFFDFFFFF82 +:10C17000FFEFFFFFFFF7FFFFFFFBFFFFFFFFF7FFF3 +:10C18000F8B50600002E02D01400002C01D15B4847 +:10C19000B0E06846017068460078202801DB574807 +:10C1A000A8E03000FFF760F9002801D15348A1E072 +:10C1B00037000125B8692840002808D1CC2039581B +:10C1C00068460078C1400800C007C00F00E02800A2 +:10C1D000C0B2002801D049488CE0684601783000A0 +:10C1E000FFF775F9002801D1444883E001000A688F +:10C1F000464B13400B60217A012901D12B0000E04E +:10C20000002302001668424931409B078026F6054C +:10C2100033400B4313600168890F2940002902D184 +:10C2200061688A0400E0626801000B685B0F5B07CD +:10C23000D200D2081A430A60011D0A68354B134028 +:10C240000B60011D0A681202120A0A604C21615C2F +:10C250000B071B0F011D0E682F4A32401B04F026EE +:10C2600036031E4016430E602178012901D12B00B0 +:10C2700000E00023021D1668284931405B05802636 +:10C28000B60333400B4313602178012901D12B0001 +:10C2900000E00023021D1668214931401B0580265D +:10C2A000760333400B4313604C21615C082901DAAB +:10C2B000002102E04C21615C08391A4A89B2515CC4 +:10C2C00000220AE013009BB29B00E318DB68160013 +:10C2D000B6B2B6008619B360521C13000E00F6B257 +:10C2E0009BB2B6B2B342EDD3684600788540D02009 +:10C2F0003D500020F2BD0000301B0028010062000C +:10C30000FFFFFF1F030A0006330A0000FFFFFFDFE5 +:10C31000FFFFFFBFFFFF7FFFFFFFF0FFFFFFDFFF1C +:10C32000FFFFEFFF84F2001010B50200002A03D0D7 +:10C330000800C0B2202801DB002021E000200123FA +:10C34000CC241459CC401C40002C09D0D4201058C7 +:10C35000C8401840002801D1180010E003200EE06A +:10C36000D8241459CC401C40002C01D0022006E0F7 +:10C37000DC241259CA401340002B00D00420C0B264 +:10C3800010BD000080B500F029FE00F097FD0028E8 +:10C3900004D1E02000F01EF9002020E001F024FB91 +:10C3A000002804D1E02000F015F9002017E000205B +:10C3B00001006F4A11706F4908606F4908606F494A +:10C3C000086001006E4A117001006E4A117001216F +:10C3D0006D4A11706D49086086490860012002BDF0 +:10C3E00038B585480168491C0160654C20780428EF +:10C3F00003D3E02000F0EEF853E05D480078002819 +:10C4000002D000F0EBFD4CE020785E4D2978C0B200 +:10C41000884208D0207800F062F8002803D1E0209C +:10C4200000F0D8F83DE02878002814D0F6F781FC19 +:10C430007049504A1268801A086008686F4988423B +:10C4400009D36F480168491C016000202070052055 +:10C4500000F0C0F825E048480168491C0160016807 +:10C4600007291ED30024046001F0CBFA00280AD06B +:10C470004248046001F0D8FA6249088001F0D7FA16 +:10C48000614908600DE061480168491C01603B4852 +:10C490000168491C01600068032802D3E02000F015 +:10C4A00099F831BD00B50100C9B2042901D30020BB +:10C4B0000CE02F490978002905D00100C9B20029F4 +:10C4C00001D0002002E02E490870012000BD80B597 +:10C4D00000202B490870E02000F07CF801BD70B509 +:10C4E00004002000C0B200280FD100F077FD2548DD +:10C4F00004700120244908700020454908603D4926 +:10C5000008601C49086001202FE02000C0B200F044 +:10C510003FF80500002D01D1002026E000F068FD65 +:10C52000002806D0280000F03BFD002808D100209C +:10C530001BE0280000F0E8FC002801D1002014E0F6 +:10C54000104E3078002806D1F6F7F3FB0949086051 +:10C5500000202849086034702000C0B200F029F89B +:10C56000094908702A480560012070BD00000000DC +:10C57000CE1C0028201C0028241C0028281C002871 +:10C58000CB1C0028CC1C0028CD1C0028081C00282F +:10C5900000B5C0B2012804D009D3032805D002D3C6 +:10C5A00005E01E2004E03C2002E05A2000E00020CC +:10C5B00000BD00B5C0B2012804D009D3032805D0BE +:10C5C00002D305E0022004E0032002E0042000E0A2 +:10C5D000012000BD10B5040000F000FD01200D4950 +:10C5E0000870002001000C4A1170094908600B48CE +:10C5F000047010BD0C1C0028101C0028C027090066 +:10C60000141C0028A61C00281C1C0028181C00282C +:10C61000081C0028CE1C0028CC1C0028CD1C00289B +:10C6200070B5B14BC018C0090001C64BC31804292E +:10C630000CD21F251C68CE002800B0408443D2B223 +:10C640001540C800854025431D600CE0FC311F25C6 +:10C650005C68CE002800B0408443D2B21540C800C8 +:10C66000854025435D6070BD00B59F4A8018C009B4 +:10C670000001B44A8018042905D20068C900C840E6 +:10C68000C006C00E05E0FC314068C900C840C006C5 +:10C69000C00EC0B200BD00B5002A03D101228A40FD +:10C6A000426002E001228A40826000BD30B4030093 +:10C6B0008C000F25596C2800A04081431540A540EF +:10C6C0000D435D6430BC704730B403004C0010343F +:10C6D0000325D96C2800A04081431540A5400D4397 +:10C6E000DD6430BC704700B5022801D301200FE0A3 +:10C6F0000B00DBB2042B01DB012009E0A44B80001E +:10C700001818C9B2405C824201D3012000E0002029 +:10C7100000BDF8B504001F00022C01D3012023E066 +:10C7200015000E002A003100C9B22000FFF7DBFF20 +:10C73000012801D1012017E03000C0B2002816D135 +:10C74000FF2F12D8B74861034018A9004018802174 +:10C75000490140180168B44A0A403902FF231B020C +:10C760000B40134303600020F2BD0120FCE7F6B24A +:10C77000012E16D180204002874210D2A9486103C1 +:10C780004018A9004018A021490140180168BB4A7F +:10C790000A403902BA4B0B4013430360E3E7012020 +:10C7A000E2E70120E0E700B20012C0B27047F8B53E +:10C7B00005000F001600280000B2FFF7F4FF040088 +:10C7C0002000C0B2022801D301202CE03200390041 +:10C7D000C9B22000C0B2FFF786FF012801D10120B5 +:10C7E00021E090482100C9B2490341182A00D2B281 +:10C7F00092008918C02212018A58A2491140FFB242 +:10C800003B02C02292001A400A43FF218A43F1B240 +:10C810001143E4B262038018EDB2AA008018C0226E +:10C82000120181500020F2BD70B50400022C01D32A +:10C83000012028E015000E002A003100C9B22000B6 +:10C84000FFF751FF012801D101201CE07548610369 +:10C850004158802212060A43C02189041143FF2255 +:10C8600012040A43874B1340F6B23202C0218900FA +:10C8700011401943FF229143EAB20A436103425037 +:10C8800061034058002070BD70B50400022C01D334 +:10C89000012028E015000E002A003100C9B2200056 +:10C8A000FFF721FF012801D101201CE05D48610351 +:10C8B00041588022D2050A43C02189041143FF2236 +:10C8C00012040A436F4B1340F6B23202C0218900B2 +:10C8D00011401943FF229143EAB20A4361034250D7 +:10C8E00061034058002070BD0000CFBFF0B58DB08F +:10C8F000684665493422F8F797FA644F6A46012181 +:10C900003800F7F754FC060000242000694608723E +:10C910006A4602213800F7F74AFC0500002201218F +:10C920003800FFF7B8FE002202213800FFF7B3FEFF +:10C930003543002D01D1012000E02000C0B20DB030 +:10C94000F0BD00000000304010B500F0ABF800284A +:10C9500001D100201BE04E4C2000F7F745FE4D4969 +:10C960002000F7F7BBFC002801D000200FE02000DA +:10C97000F7F747FE4849884207D12000F7F73DFE08 +:10C980004649884201D1012000E00020C0B210BD1C +:10C990009CF2001070B5424C0021216000F046F876 +:10C9A000002803D10120206000203AE0374E002209 +:10C9B00001213000FFF76FFE354D37492800F7F7AA +:10C9C0001EFE2800F7F70AFE2800F8F7C8F8022034 +:10C9D000F8F714FC2800F7F70CFE000405D4022039 +:10C9E000206000F03AF800201BE000220121300016 +:10C9F000FFF76AFE062201213000FFF757FE0822EA +:10CA000001213000FFF70CFE01213000FFF72CFE62 +:10CA1000082805D00320206000F01FF8002000E067 +:10CA2000012070BD00000440FF00FFFF38B56528FD +:10CA300001D3002010E000F087F80400144D21001D +:10CA40002800F7F7D8FD2800F7F7D7FDA04201D15D +:10CA5000012000E00020C0B232BD10B50C48F7F74D +:10CA6000C3FD0A4C00220121200000F07BF80022C7 +:10CA70000221200000F076F810BD0000FF0000FF4A +:10CA800000FFFF00FFFCFFFFB0EE0010800531400B +:10CA9000001E584038EA00101F4E0000204E0000D3 +:10CAA000C01B0028F8B5002500956846FBF706FA7C +:10CAB000002801D0002045E0274C0098A04205D373 +:10CAC00000982100F7F7B2FB002901D0002039E0DF +:10CAD00000982100F7F7AAFB0400002C02D01F48A1 +:10CAE000844201D300202DE0FF266A363000FFF794 +:10CAF0005AFE0700002201213800FFF7C5FE00287A +:10CB000001D000201EE0002201213000FFF74FFE7F +:10CB1000002801D0002015E023005B1E0022012127 +:10CB20003800FFF7F6FD002801D000200AE00022BF +:10CB300001213800FFF778FE002801D1012000E034 +:10CB40002800C0B2F2BD000000B505494843642189 +:10CB5000F7F76CFB00BD000080841E00010001009F +:10CB6000204E000070B505000C00160000222100C8 +:10CB70002800FFF790FD3200D2B221002800FFF715 +:10CB80004FFD002221002800FFF79EFD0622210014 +:10CB90002800FFF78BFD002221002800FFF77BFD16 +:10CBA00070BD000070B5B14BC018C0090001C24B88 +:10CBB000C31804290CD21F251C68CE002800B040E1 +:10CBC0008443D2B21540C800854025431D600CE067 +:10CBD000FC311F255C68CE002800B0408443D2B2EF +:10CBE0001540C800854025435D6070BD00B59F4A73 +:10CBF0008018C0090001B04A8018042905D20068D5 +:10CC0000C900C840C006C00E05E0FC314068C9003C +:10CC1000C840C006C00EC0B200BD00B5002A03D196 +:10CC200001228A40426002E001228A40826000BD07 +:10CC300030B403008C000F25596C2800A0408143BC +:10CC40001540A5400D435D6430BC704730B403000F +:10CC50004C0010340325D96C2800A04081431540B6 +:10CC6000A5400D43DD6430BC704700B5022801D3F8 +:10CC700001200FE00B00DBB2042B01DB012009E0F7 +:10CC8000A04B80001818C9B2405C824201D3012039 +:10CC900000E0002000BDF8B504001F00022C01D305 +:10CCA000012023E015000E002A003100C9B2200047 +:10CCB000FFF7DBFF012801D1012017E03000C0B2EF +:10CCC000002816D1FF2F12D8B34861034018A900DD +:10CCD00040188021490140180168B04A0A403902D1 +:10CCE000FF231B020B40134303600020F2BD012011 +:10CCF000FCE7F6B2012E16D180204002874210D206 +:10CD0000A54861034018A9004018A0214901401816 +:10CD10000168B14A0A403902BA4B0B401343036021 +:10CD2000E3E70120E2E70120E0E700B20012C0B231 +:10CD30007047F8B505000F001600280000B2FFF795 +:10CD4000F4FF04002000C0B2022801D301202CE02F +:10CD500032003900C9B22000C0B2FFF786FF0128B7 +:10CD600001D1012021E08C482100C9B249034118BA +:10CD70002A00D2B292008918C02212018A58A24910 +:10CD80001140FFB23B02C02292001A400A43FF2129 +:10CD90008A43F1B21143E4B262038018EDB2AA00F3 +:10CDA0008018C022120181500020F2BD70B504002D +:10CDB000022C01D3012028E015000E002A003100CA +:10CDC000C9B22000FFF751FF012801D101201CE06A +:10CDD000714861034158802212060A43C021890428 +:10CDE0001143FF2212040A43874B1340F6B232026A +:10CDF000C021890011401943FF229143EAB20A433E +:10CE00006103425061034058002070BD70B50400BA +:10CE1000022C01D3012028E015000E002A00310069 +:10CE2000C9B22000FFF721FF012801D101201CE039 +:10CE30005948610341588022D2050A43C021890420 +:10CE40001143FF2212040A436F4B1340F6B2320221 +:10CE5000C021890011401943FF229143EAB20A43DD +:10CE60006103425061034058002070BD0000CFBFF5 +:10CE700078B58DB0684665493422F7F7D5FF644E22 +:10CE80006A4607213000F7F792F9040000220721D3 +:10CE90003000FFF7C2FE00255E480560002C07D178 +:10CEA00007213000FFF7A2FE002801D1012000E099 +:10CEB0002800C0B20EB070BD0000304010B500F0C8 +:10CEC000B3F8002801D100201AE0534C2000F7F7F6 +:10CED0008BFB52492000F7F701FA002801D000200F +:10CEE0000EE02000F7F78DFB4D49884206D1200067 +:10CEF000F7F783FB002801D1012000E00020C0B239 +:10CF000010BD00009CF2001070B5464C002121605D +:10CF100000F046F8002803D10120206000203AE00C +:10CF20003B4E002207213000FFF777FE3A4D3C4987 +:10CF30002800F7F764FB2800F7F750FB2800F7F705 +:10CF40000EFE0220F8F75AF92800F7F752FB00040A +:10CF500005D40220206000F041F800201BE00022F0 +:10CF600007213000FFF772FE062207213000FFF78D +:10CF70005FFE082207213000FFF714FE0721300072 +:10CF8000FFF734FE082805D00320206000F026F8C3 +:10CF9000002000E0012070BD00000440FF00FFFF02 +:10CFA00070B50400002C01D0652C01D3002012E0E4 +:10CFB000200000F08BF80600174D31002800F7F72D +:10CFC0001AFB2800F7F719FBB04201D0002002E05D +:10CFD00010480460012070BDFF0000FF80B50E48BE +:10CFE000F7F702FB00F07AF800200A49086001BD5B +:10CFF00080B50948F7F7FDFAC10B0800C007C00F5C +:10D0000002BD000000FFFF00FFFCFFFF7CEE0010F0 +:10D0100000083140B81B002880205840C4E90010A7 +:10D020001F4E0000BC1B0028F8B50025009568467F +:10D03000FAF744FF002801D0002045E0354C009865 +:10D04000A04205D300982100F7F7F0F8002901D09D +:10D05000002039E000982100F7F7E8F80400002CE0 +:10D0600002D02D48844201D300202DE0B72676005F +:10D070003000FFF75AFE0700032201213800FFF7B6 +:10D08000C5FE002801D000201EE00322012130004F +:10D09000FFF74FFE002801D0002015E023005B1EA3 +:10D0A000032201213800FFF7F6FD002801D00020FF +:10D0B0000AE0032201213800FFF778FE002801D1A1 +:10D0C000012000E02800C0B2F2BD000000B5134905 +:10D0D00048436421F7F7AAF800BD000010B5104CD2 +:10D0E000002207212000FFF798FD002207212000E1 +:10D0F000FFF758FD002207212000FFF7A7FD0622B9 +:10D1000007212000FFF794FD002207212000FFF7F0 +:10D1100084FD10BD80841E0001000100204E00002F +:10D120000008314038B50500082D0DD3914C182268 +:10D1300091492000FAF70CFF0020E075E8208F49A4 +:10D1400008600020FAF764FF8D486901401832BD7D +:10D15000994B1B689BB212041A43120C120489B239 +:10D16000114381607047C0687047944B1B689BB245 +:10D1700012041A43120C120489B2114301600068B0 +:10D180007047C069C00FC0B27047F8B502000E000A +:10D19000002A01D105204EE00F2089490B681B0AA7 +:10D1A0000340002B01D1002007E00968090A08406C +:10D1B0000E2801D1012000E00220824940010F1811 +:10D1C000814C984D280011001022F7F747FE28687F +:10D1D00001218843286010212800FAF73CFF924B78 +:10D1E0002A000121380000F04CFC002804D0012066 +:10D1F00021E0641E002C15D03800FFF7C2FF002884 +:10D20000F7D1002E08D010212800FAF723FF3000B4 +:10D2100029001022F7F722FE00F0B4F8012803D10C +:10D22000032008E0022006E000F0ACF8002801D15D +:10D23000002000E00420F2BD38B50100002901D132 +:10D2400005202BE00F205E4A13681B0A0340002BC9 +:10D2500001D1002007E01268120A10400E2801D107 +:10D26000012000E00220574A400115186D4C2000B3 +:10D270001022F7F7F3FD2068012188432060102178 +:10D280002000FAF7E8FE684B22000121280000F098 +:10D29000F8FB002801D0012000E0002032BDFEB5DF +:10D2A00003001600002B03D001910198002801D142 +:10D2B00005205DE00F2042490A68120A0240002A58 +:10D2C00001D1002007E00968090A08400E2801D1B1 +:10D2D000012000E002203B49400108180090804CEA +:10D2E000504D280019001022F7F7B8FD7D4F380087 +:10D2F00001991022F7F7B2FD2868012188432860C0 +:10D30000386801218843386010212800FAF7A3FE0D +:10D3100010213800FAF79FFE3B002A0001210098F7 +:10D3200000F0AFFB002804D0012021E0641E002C97 +:10D3300015D00098FFF725FF0028F7D1002E08D060 +:10D3400010212800FAF786FE300029001022F7F796 +:10D3500085FD00F017F8012803D1032008E0022022 +:10D3600006E000F00FF8002801D1002000E00420C2 +:10D37000FEBD0000181B002808ED0010F01B00285F +:10D380000010224010B5274C10212000FAF762FE51 +:10D390002068000F0007A0210906884201D1002063 +:10D3A00009E02068000F0007F0210906884201D13A +:10D3B000012000E0022010BD64F3001068F30010AB +:10D3C0000000204000002240FFFFFF0F38B504009E +:10D3D000FFF7D8FF05002800C0B2022801D142485B +:10D3E0000DE0002C04D0200027491022F7F736FD6D +:10D3F000EDB2002D01D1002001E02348006832BDCC +:10D4000000B5010F0907A0221206914201D10020A8 +:10D4100006E0010F0907F0221206914200D03248BF +:10D4200000BD0000601B0028EC1B00281CB502009A +:10D430000B002E4803C86C4603C4083C6C4663804E +:10D440002B4802606846F7F7BDFC2A490020205EA1 +:10D45000F7F7D7FC0220FFF765FE0F21264A136875 +:10D460001B0A0B40002B01D1002307E01268120AAF +:10D4700011400E2901D1012300E0022300220121E5 +:10D480009940FFF765FE13BD601B002870B50026AC +:10D4900030000220FFF746FE04002000FFF763FE85 +:10D4A00005000F2014490A68120A0240002A07D01A +:10D4B0000968090A08400E2801D1012600E0022669 +:10D4C0002800F040C00705D509480168002901D0AF +:10D4D000006880472A0CA9B22000FFF746FE70BD05 +:10D4E000FFFFFF00801B0028FFFFFF0F94F20010DA +:10D4F000E81B00288DD40010000020405048006830 +:10D50000410B0800C007C00F70474D480068010B71 +:10D510000800C007C00F704700B54A4801210268E3 +:10D520000A43026002680A40002AFBD100BD1FB511 +:10D530000400C9B2012921D168461021F9F720FE63 +:10D5400069462000FFF721FE0100C9B2012901D17F +:10D550005B481BE00100C9B2022901D13A4815E03D +:10D56000C0B2042801D1394810E0009800F01CF93D +:10D5700000280BD1FFF7D0FF002007E02000FFF7C5 +:10D580005BFE002801D04E4800E0002004B010BD32 +:10D590007FB50C001500002C01D14A484DE02068F1 +:10D5A00000F0F0F8012802D06068002801D1454859 +:10D5B00043E068461021F9F7E3FD00980002000AF5 +:10D5C000C021C90401430091227AFF2000023E4994 +:10D5D000009B0B40120202401A430092637A009EA5 +:10D5E000494A32401B04FF2636041E40164300966B +:10D5F000E27A019B19401202104008430190A07A80 +:10D600000199FF229143C0B208430190207B019908 +:10D610000902090A00060843019020680290606828 +:10D6200003903A48A17A4900415A6068FAF713FD1D +:10D630002900C9B26846FFF77AFF04B070BD000048 +:10D64000000024400800244010005200FF00520057 +:10D6500010B50400FFF752FF002810D1EC2000069F +:10D660002018C0218902884201D2002026E04448C7 +:10D6700020188021490288421FD200201EE0C020CD +:10D680004002EC2109066118814201D2002015E018 +:10D69000802109026B4AA2188A4201D200200DE0C3 +:10D6A000EB221206A218824201D2002006E0664850 +:10D6B0002018884201D2002000E0012010BD0000A7 +:10D6C000040052000F005200FF00FFFF10B50400DD +:10D6D000FFF714FF002807D12948201880214902AC +:10D6E00088420FD201200EE08020000255496118C7 +:10D6F000814201D2012006E053496118814201D2E2 +:10D70000012000E0002010BDFFFF00FFF4F1001039 +:10D7100010B50400FFF7F9FE002810D1F020000634 +:10D720002018FE21C903884201D2002026E0654866 +:10D7300020188021C90288421FD200201EE0FE204E +:10D740008003F02109066118814201D2002015E012 +:10D75000802189025C4AA2188A4201D200200DE091 +:10D76000EE221206A218824201D2002006E057489B +:10D770002018884201D2002000E0012010BD0000E6 +:10D780000000FDEB10B504002000FFF761FF00284A +:10D7900001D1002007E02000FFF7BAFF002801D1E7 +:10D7A000002000E0012010BD80B5FFF729FE002811 +:10D7B00001D1002044E04649884201D145483FE07C +:10D7C0004549401A1CD0801E1DD0401E1DD0401E51 +:10D7D0001DD0401E1DD0001F1DD087381DD0401EFB +:10D7E0001DD012381DD0401E1DD0401E1DD0801EE1 +:10D7F0001DD0801E1DD008381DD009381DD01EE058 +:10D80000A420C0031CE035481AE0354818E035482C +:10D8100016E0354814E0354812E0354810E0354848 +:10D820000EE035480CE035480AE0354808E0354858 +:10D8300006E0354804E0354802E0354800E0254878 +:10D8400002BD00000080FEEB0080FEEA38B584B027 +:10D850000C001500002C01D12E4831E02068FFF7A4 +:10D8600091FF012801D12B482AE02078800701D0C0 +:10D87000284825E068461021F9F782FC009800024C +:10D88000000AA02149050143009120790099224A0C +:10D890000A400002FF210902014011430091607912 +:10D8A00000994C4A0A400004FF2109040140114339 +:10D8B0000091206801902900C9B26846FFF737FE41 +:10D8C00005B030BD000081EF0080C0EF0080C0EDEA +:10D8D000FFFFFF0FFF005200010000F001005200A7 +:10D8E00002005200030052000400520005005200E2 +:10D8F00006005200070052000800520009005200C2 +:10D900000A0052000B0052000C0052000D005200A1 +:10D910000E0052000F005200FF00FFFF38B588B024 +:10D920000C001500002C01D12E4851E06068002841 +:10D9300001D12C484CE02068FFF78AFE012808D06E +:10D940002068616889004018401EFFF781FE0128A9 +:10D9500001D124483CE068461021F9F711FC0098F9 +:10D960000002000AA8218905014300912068019066 +:10D970006068401E80B20299090C090408430290B5 +:10D98000EDB2012D1CD104A81021F9F7F9FB04A96F +:10D990006846FFF7FAFB0100C9B2012901D110481E +:10D9A00016E00100C9B2022901D10B4810E0C0B253 +:10D9B000042801D109480BE00498FFF7F5FE07E0C1 +:10D9C0006846FFF739FC002801D0054800E0002038 +:10D9D00009B030BDFFFF00FF10005200FF005200F1 +:10D9E000040052000F00520080B5F6F728FF00280F +:10D9F00001D1002004E001201349087000F001F873 +:10DA000002BD80B510480078002805D06946042082 +:10DA1000F6F7A4FF002801D1002004E06846008842 +:10DA20000A490880012002BD08480088704780B577 +:10DA3000064800880021064A0023F6F7E5FD054A5E +:10DA40000023F6F7EEFA02BDB21C0028A41C002841 +:10DA500040787D0150FB4A00174A1268120C1204EC +:10DA600089B2114381607047C1607047016170479E +:10DA700000B50068C00F002801D1104800E0002068 +:10DA800000BDF8B507000C0015001E003800FFF7B8 +:10DA9000EFFF00280DD129003800FFF7E5FF310026 +:10DAA0003800FFF7E3FF21003800FFF7D5FF002023 +:10DAB00000E00248F2BD000050F3001001008A00AF +:10DAC000F8B584B0F7F751FCBA490127086803227A +:10DAD000904338430860B8480A6802400A60B74972 +:10DAE0000A6803239A433A430A600A6802400A60BC +:10DAF000B3490A6803239A433A430A600A6802401A +:10DB00000A60B0490A6803239A433A430A600A68E4 +:10DB100010400860AC4801680F229143394301600E +:10DB2000AA480168072291430160A94801680722B9 +:10DB3000914304220A4302600168F0229143C0220B +:10DB40000A4302600168C02292000A430260016831 +:10DB5000C02212010A43026001689E4A0A408021E5 +:10DB6000490111430160E1480168802212060A431D +:10DB70000260DF48016839400029FAD0016849088D +:10DB800039400029FAD0DB480168DB4A0A400260CC +:10DB9000DA480168D84A0A408021490011430160EF +:10DBA000D7480168D44A0A408021490011430160E6 +:10DBB000D4480168D04A0A400260D348016807226D +:10DBC000914302220A430260D04801684900490893 +:10DBD0000160CF480168890A890229220A4302604C +:10DBE0000168CC4A0A4002600168802252040A435C +:10DBF00002600168C84A0A40026001688022120679 +:10DC00000A430260C5480168C54A0A408021C9002C +:10DC1000114301600168FF229143AF220A43026071 +:10DC2000802189020268BF4B13400B4303608022AE +:10DC300092040368BC4C1C4014430460BB4B046852 +:10DC40001C400460046880252D0625430560B84803 +:10DC500004680725AC43022525430560B5480468E0 +:10DC6000240E2406B44D254305600468B34D2540B9 +:10DC7000802464052C430460046880252D06254318 +:10DC80000560AF480468640064080460AD4C8025FA +:10DC9000AD002668A2483040284320602068FF2657 +:10DCA000B04362260643266026689E4830408026A0 +:10DCB000F6020643266026689B48304002432260F5 +:10DCC00020681840206020688022120602432260EB +:10DCD0009D4802680724A2430224144304609B4821 +:10DCE00002687F24A24328241443046002688C4CF9 +:10DCF00014402C43046002688A4C144021430160A4 +:10DD00000168894A0A400260914902680A4002603B +:10DD100002681A40026002688024240614430460EA +:10DD20008C4802680724A243022414430460B048CC +:10DD300002687F24A2431E24144304600268784CC6 +:10DD40001440254305600268764C1440C0229202BC +:10DD5000224302600268744C14400460026811405F +:10DD6000016001680B4003600168802212060A43CB +:10DD70000260A048006838400028FAD09E48006839 +:10DD800038400028FAD09D48006838400028FAD072 +:10DD90009B48006838400028FAD09A48016807225A +:10DDA00091430160684698491022F7F73DF8002634 +:10DDB00035E000BFC4132040FFFCFFFF00132040EC +:10DDC00080132040A013204000002440001526406E +:10DDD00044152640FF8FFFFF32200021F7F7CEF9D0 +:10DDE000300040B2800028180168302291432200A0 +:10DDF00052B21201302313400B430360641E200013 +:10DE000040B26946320052B25200895C00B209B297 +:10DE10008842E1DA32200021F7F7B0F9761C3000B1 +:10DE200040B208283FD2300040B204280DD1EFF3B1 +:10DE30001084002080F31088FA239B000022012127 +:10DE4000102000F00BFA84F31088704D300040B2BF +:10DE50008000281801680F2291436A4633005BB2A4 +:10DE60005B00D21852781207120F0A43026030008A +:10DE700040B280002818016830220A430260300056 +:10DE800040B2800028180168802252000A430260D4 +:10DE9000300040B2800028180168802212060A4330 +:10DEA00002600224ABE75A48134A0168114001603E +:10DEB000F821C94303680B400360564803681A40C1 +:10DEC0000260026811400160F7F730FA52480168B9 +:10DED000802212060A43026001680F430760F7F7C9 +:10DEE0001AFA00F039F805B0F0BD00BF1C15264045 +:10DEF0002415264010102040FF00FFFF081020408E +:10DF00000C10204020032040041226400419264013 +:10DF100008192640FFFFF8FFFFFFFFEF001926401A +:10DF2000FFE0FFFFFFFFE0FFFFFFFFF9FFFFFFCF75 +:10DF30000812264014192640F1D24D00FFFFFF8F32 +:10DF400018192640101926400C12264000162640AB +:10DF5000FFFFFFF71012264038B586B068462F49FC +:10DF60001822F6F761FF6846F9F75CFDC0B2002899 +:10DF70000ED02B4C18222B492000F9F7E9FF002086 +:10DF8000E075FF20A830284908600020FAF740F823 +:10DF9000264D2800F9F7D8FFC0B200280ED0204C3B +:10DFA000182220492000F9F7D3FF0020E075FF2058 +:10DFB000AA301D4908600020FAF72AF81C4C28688E +:10DFC000206020681B4940181B49F6F72FF91B49B0 +:10DFD00008601B4D20681B494018FA218900F6F79C +:10DFE00025F928602868C0031749086007B030BDCC +:10DFF000041626400C1926401C19264040162640BF +:10E00000441626401412264058F2001040122640B2 +:10E01000080020400804204008152640DCF10010CC +:10E02000181B00288CEB0010F01B0028901C002807 +:10E03000941C00283F420F0040420F009C1C002807 +:10E04000981C0028E7030000A01C0028F3B595B039 +:10E05000170000210D000800684601801C00A4B2D2 +:10E06000A408200080B280218900884203D30125C2 +:10E07000684604807E4C1C9E00F011F9002800D0F8 +:10E0800099E06846877016A8077801A81021F9F76B +:10E0900077F80198022188433100C9B24900022271 +:10E0A000114001430191019804218843FFB2B90056 +:10E0B00004221140014301910198082188436946D7 +:10E0C0008978C9000822114001430191019810216B +:10E0D00088430190019820218843019001984021B4 +:10E0E000884301900198802101430191614F01987B +:10E0F000384015A909780902F82252010A40024362 +:10E10000019201985C490140019101980002000AC6 +:10E11000A82149050143019111A81021F9F730F810 +:10E120001198800A8002A4B2A105890D01431191C2 +:10E1300052480068002806D101980740D0204001CD +:10E140003843019007E0002805D00198074080205F +:10E15000400138430190002211A901A8FFF79FF860 +:10E16000EDB2002D03D06846008800F08DF809A8B4 +:10E170001021F9F705F8099802218843F6B27100D9 +:10E18000022211400143099109983D49014009913A +:10E1900009983C49014080204002084309900998B1 +:10E1A0000002000A8821490501430991002109A8BC +:10E1B000FEF7EBFF50E000F07DF80128FBD000F007 +:10E1C00073F80128F7D10DA81021F8F7D9FF0DA891 +:10E1D0000078FD2101400DA801700DA800780C21E8 +:10E1E00001430DA801700D980002000AB0214905F5 +:10E1F00001430D9100210DA8FEF7C7FF00F054F870 +:10E20000002829D1EDB2002D03D06846008800F027 +:10E210003BF805A81021F8F7B3FF059802218843C1 +:10E22000F6B271000222114001430591059814498C +:10E2300001400591059813490140802040020843A0 +:10E24000059005980002000A8821490501430591BF +:10E25000002105A8FEF799FF17B0F0BD1CB50124F9 +:10E2600000949BB2D2B2C9B2C0B2FFF7EFFE13BDA9 +:10E27000FF010000FFE0FFFFFF1FFFFF3007001757 +:10E28000FF00FFFFFFFF00FF0D490A680D4B134021 +:10E2900080B200050C4A02401A430A6070470848E1 +:10E2A0000068C00FC0B27047084801680800C00786 +:10E2B000C00F704705480068C00FC0B2704700002B +:10E2C00028102640FFFF0FC00000F03F2C10264012 +:10E2D00000B5010009B2002905D40121C006C00E15 +:10E2E00081408F48016000BDF0B5020012B2002AE3 +:10E2F00018D418228B4B040024B2A408A4001C5983 +:10E30000FF250600F6001640B540AC438901C9B2AE +:10E310000500ED002A409140214300B280088000B2 +:10E3200019501CE00F22804C182503001BB213402B +:10E33000083B9B089B00060036B23240083A920820 +:10E340009200A258FF260700FF002F40BE40B243B4 +:10E350008901C9B2C0000540A9401143E150F0BD98 +:10E3600080B500F012F87148714902680A400260F5 +:10E37000704802680A4002606F48026811400160FC +:10E3800000F092F800F0A9F801BDFEB568466B49AF +:10E390000CC90CC008390838002630000AE06A466B +:10E3A0000300DBB2DB00D2185268521C1140002976 +:10E3B0000ED1401C0100C9B200290AD107216A46CA +:10E3C0000300DBB2DB00D2580A40002AE7D0FEE7A8 +:10E3D000FEE75B4C072021680140002900D0FEE7E2 +:10E3E000584F3968491C0840002800D0FEE7350026 +:10E3F00024E068462900C9B2C9004018416868464F +:10E400002A00D2B2D200805800F044F815E0300063 +:10E410000028EED02168491E68462A00D2B2D200F8 +:10E42000805800F037F868462900C9B2C900401882 +:10E4300041683868401C00F02DF86D1C2800C0B2FF +:10E44000002826D168462900C9B2C90040580028D2 +:10E4500014D0206869462A00D2B2D2008958884276 +:10E460000AD368462900C9B2C9004018406821682B +:10E47000884201D30120CBE73000C9E76846290074 +:10E48000C9B2C9004018406821688842BFD3012042 +:10E49000BEE7F7BD80B50022002302E00CC00838BB +:10E4A00008308842FAD301BD30B527488008274993 +:10E4B000274A002308E01C00E4B2A40014591D0000 +:10E4C000EDB2AD004C515B1C1C000500E4B2EDB296 +:10E4D000AC42F0D31F48016030BD10B510231121AC +:10E4E0001A4800221C00E4B2A4001459DBB29B00BD +:10E4F000C4500B00DBB29B00D258C9B28900425015 +:10E5000001210020FFF7F0FE00210120FFF7ECFEC3 +:10E510000020FFF7DDFE0120FFF7DAFE10BD00004E +:10E5200000E100E000E400E01CED00E0001320400A +:10E53000FFFFF7FF80132040A0132040BCF2001023 +:10E5400084EB001088EB001080000000001D002804 +:10E550000000001008ED00E000B5010009B200293C +:10E5600005D40121C006C00E81404A48016000BDAB +:10E5700000B5FEE780B54848006848480068C10F0C +:10E58000002905D046498005800D80000858804745 +:10E590000020FFF7E1FF01BD80B542480068424816 +:10E5A0000068C10F002905D03D498005800D80001D +:10E5B000085880470120FFF7CFFF01BD80B53B48D9 +:10E5C00000683B480068C10F002905D03449800528 +:10E5D000800D8000085880470220FFF7BDFF01BD75 +:10E5E00080B53448006834480068C10F002905D060 +:10E5F0002B498005800D8000085880470320FFF7D5 +:10E60000ABFF01BD80B52D4800682D480068C10FE3 +:10E61000002905D022498005800D800008588047D8 +:10E620000420FFF799FF01BD80B526480068264801 +:10E630000068C10F002905D019498005800D8000B0 +:10E64000085880470520FFF787FF01BD80B51F48A8 +:10E6500000681F480068C10F002905D010498005D7 +:10E66000800D8000085880470620FFF775FF01BD28 +:10E6700080B51848006818480068C10F002905D007 +:10E6800007498005800D8000085880470720FFF764 +:10E6900063FF01BD80E200E030F300100011204074 +:10E6A0004809002834F300100411204038F300100A +:10E6B000081120403CF300100C11204040F30010E2 +:10E6C0001011204044F300101411204048F30010B2 +:10E6D000181120404CF300101C112040ACF0001029 +:10E6E00008F2001080023140040000000800000021 +:10E6F000800658403A010000000931400200000045 +:10E700000A0F0D07E0010000FC53000098210000F3 +:10E71000F4010000E8030000F401000038F10010EB +:10E7200018F20010800231400500000008000000CF +:10E73000000758403B010000000531400100000087 +:10E740000AF0D07076010000E0150000D417000038 +:10E750005E010000E8030000F401000054F1001025 +:10E7600028F2001000043140000000000800000002 +:10E7700080095840400100000007314000000000BF +:10E78000090F0D0795030000901A000028230000D0 +:10E79000F4010000E8030000F401000070F1001033 +:10E7A00038F2001080003140000000000800000036 +:10E7B0000006584039010000000631400500000005 +:10E7C00009F0D07087020000201C00009821000092 +:10E7D000F4010000D0070000F401000080B5F2F75A +:10E7E00067FDFCF74BF9FBF7C9FFFA208000F6F74D +:10E7F00005FDF4E710B5FEF73BFBFEF777F8FFF7F2 +:10E800005FF9F2F755FDFEF733FB002803D0FEF762 +:10E810006DF8002801D1FFF7E1FF204C00F042F82D +:10E82000206000F042F82068FBF7D2FEFBF7E6FF1D +:10E83000002801D0FFF7D2FF62B6194CF5F75BFB59 +:10E8400020602068002804D00120FBF7A7FFFFF715 +:10E85000C5FF0120F4F7FFFAFCF744F8002804D1C3 +:10E860000120FBF79BFFFFF7B9FFF6F7A1FD00289A +:10E8700001D1FFF7B3FFF6F7FEFDFCF797F8FBF7C2 +:10E88000BDFF002803D0F2F713FDFCF7F7F8FBF704 +:10E8900075FFFA208000F6F7B1FCECE7F41B0028C6 +:10E8A000281200280648006870470020C043044929 +:10E8B00008600449086000200349086070470000B0 +:10E8C000001826400418264008102640F1B40168BC +:10E8D0004118436858080A1800988068DB0701D57A +:10E8E0004B46C01891422DD00D78491C03240326B5 +:10E8F0002E4002D10E78F61C491C2B090F2B07D194 +:10E900000B780F33491C03E00F78491C0770401C3B +:10E91000761EF9D1002BE5D00E78491CAD082C40AD +:10E92000032C01D10C78491C240234196542441986 +:10E930000025AE1E9E42D5D02678641C0670401C71 +:10E940006D1CF6E700980C30F2BC704700053140B2 +:10E950000600000000000000801890400200000047 +:10E960000006314001000000000000004019904006 +:10E970000500000000053140070000000000000015 +:10E98000C018904003000000000531400500000061 +:10E9900000000000401890400100000000063140D7 +:10E9A00002000000000000008019904006000000F6 +:10E9B000000631400600000000000000801A904070 +:10E9C0000A00000004000000000000000000000039 +:10E9D00000000000010003031F4E000000000000C3 +:10E9E0000000000000000000000000000000000027 +:10E9F0000000000000000000000000000000000017 +:10EA000000000000020300000000000003000000FE +:10EA100000000000030000000000000003000000F0 +:10EA200000000000030000000000000003000000E0 +:10EA300001000000010200000400000000000000CE +:10EA40000000000000000000010003031F4E000052 +:10EA50000000000000000000204E00000000000048 +:10EA600000000000000000000000000000000000A6 +:10EA70000000000000000000020300000000000091 +:10EA80000300000000000000030000000000000080 +:10EA90000300000000000000030000000000000070 +:10EAA000030000000100000001020000040000005B +:10EAB000000000000000000000000000010003034F +:10EAC00063000000000000000000000032000000B1 :10EAD0000000000000000000000000000000000036 -:10EAE0000000000000000000000000000000000026 -:10EAF0000000000000000000000000000000000016 -:10EB00000000000000000000000000000000000005 -:10EB100000000000000000000000000000000000F5 -:10EB200000000000000000000000000000000000E5 -:10EB300000000000000000000000000000000000D5 -:10EB400000000000000000000000000000000000C5 -:10EB500000000000000000000000000000000000B5 -:10EB600000000000000000000000000000000000A5 -:10EB70000000000000000000000000000000000095 -:10EB80000000000000000000000000000000000085 -:10EB90000000000000000000000000000000000075 -:10EBA0000000000000000000000000000000000065 -:10EBB0000000000000000000000000000000000055 -:10EBC0000000000000000000000000000000000045 -:10EBD0000000000000000000000000000000000035 -:10EBE0000000000000000000000000000000000025 -:01EBF0000024 -:040000051000E7A957 +:10EAE0000000000000000000000000000203000021 +:10EAF0000000000003000000000000000300000010 +:10EB000000000000030000000000000003000000FF +:10EB100000000000030000000100000001020000EE +:10EB200072B6104810490860BFF34F8F0120C0042F +:10EB30000E490A6802430A600D490A6802430A60E6 +:10EB40000C490A6802430A60002000210D4A03C2F2 +:10EB50006A45FCD1084FB847084FB847084FB84737 +:10EB6000FEE700000000001008ED00E00013204068 +:10EB700080132040A013204061E3001045F00010F6 +:10EB8000A9F1001000FF0128FFFF0128443A5C684A +:10EB900075616E672E7875657765695C4769745C29 +:10EBA000436F676E69746976655F4167656E745C13 +:10EBB0006669726D776172655C7432675C747669E0 +:10EBC000696268386D5C7372635C73797374656DC8 +:10EBD0005C7265765F645C73797374656D5F74767F +:10EBE00069696268386D5F636D30706C75732E6330 +:10EBF00000000000443A5C6875616E672E787565A8 +:10EC00007765695C4769745C436F676E69746976A0 +:10EC1000655F4167656E745C6669726D7761726588 +:10EC20005C7432675C747669696268386D5C7372B3 +:10EC3000635C647269766572735C737973636C6B21 +:10EC40005C63795F737973636C6B2E6800000000FE +:10EC5000443A5C6875616E672E7875657765695CA6 +:10EC60004769745C436F676E69746976655F416775 +:10EC7000656E745C6669726D776172655C7432672B +:10EC80005C747669696268386D5C7372635C647227 +:10EC900069766572735C737973636C6B5C63795FBF +:10ECA000737973636C6B2E6300000000443A5C68F8 +:10ECB00075616E672E7875657765695C4769745C08 +:10ECC000436F676E69746976655F4167656E745CF2 +:10ECD0006669726D776172655C7432675C636F6DD3 +:10ECE0006D6F6E5C7372635C647269766572735C7F +:10ECF0007379737469636B5C63795F737973746937 +:10ED0000636B2E6300000000443A5C6875616E67B7 +:10ED10002E7875657765695C4769745C436F676ECB +:10ED200069746976655F4167656E745C6669726D6A +:10ED3000776172655C7432675C636F6D6D6F6E5C7A +:10ED40007372635C647269766572735C6970635C2C +:10ED500063795F6970635F6472762E6800000000FB +:10ED6000443A5C6875616E672E7875657765695C95 +:10ED70004769745C436F676E69746976655F416764 +:10ED8000656E745C6669726D776172655C7432671A +:10ED90005C636F6D6D6F6E5C7372635C6D775C66E8 +:10EDA0006C6173685C63795F6D775F666C617368D3 +:10EDB0002E6300009F0F0000000000000000000014 +:10EDC0000000000000000000000003000000000040 +:10EDD0000000000000000000000300000000000030 +:10EDE000030000000000000003000000000000001D +:10EDF000030000000000000003000000010000000C +:10EE00000000000001000000000000000000000001 +:10EE100010000000100000001000000001000001C0 +:10EE200000000000000000000000000000000000E2 +:10EE300000000000000000000000000000000000D2 +:10EE400070B40123002413E00168001D194202D0B0 +:10EE50004D466918491E0C60091D121F042AFAD27A +:10EE60000D00960701D50C80AD1C1A4000D02C7007 +:10EE70000268001D002AE7D170BC70470000000046 +:10EE8000060000000000000000000000000000007C +:10EE90000000000000000000000000000000000072 +:10EEA0000000000000000000000000000000000062 +:10EEB000000000000600000000000000000000004C +:10EEC0000000000000000000000000000000000042 +:10EED0000000000000000000000000000000000032 +:10EEE0000000000000000000080000001500000005 +:10EEF0000000000000000000000000000000000012 +:10EF00000000000000000000000000000000000001 +:10EF10000000000000000000010000000E000000E2 +:10EF200015000000000000000000000000000000CC +:10EF300000000000000000000000000000000000D1 +:10EF400000000000000000000000000001000000C0 +:10EF500006000000000000000000000000000000AB +:10EF600000000000000000000000000000000000A1 +:10EF70000000000000000000000000000000000091 +:10EF8000000000000600000000000000000000007B +:10EF90000000000000000000000000000000000071 +:10EFA0000000000000000000000000000000000061 +:10EFB000000000000200000000000000983A00007D +:10EFC0000E01FA00CC0190010200000003000000D5 +:10EFD00000000000983A0000720182001C02CC017F +:10EFE0000200000005000000000000003075000075 +:10EFF000F6001901BD02EE0102000000060000004B +:10F00000000000003075000087018C00950194011C +:10F010000200000001000000ACF20010B4EF00108C +:10F0200002000000A8F300100800320002000000F7 +:10F03000B4F20010E4EF001002000000A4F300108E +:10F040000C00320010B5074979441831064C7C4455 +:10F05000163404E0081D0A68891888470100A14297 +:10F06000F8D110BD0800000024000000D5FDFFFF0E +:10F07000E0090000081300280000000051F8FFFF1D +:10F080005E0300003A0100000008002800000301B0 +:10F09000000000000100000000000000000000006F +:10F0A00001000000FF0F0100000000004D4F544F11 +:10F0B000525F494E325F4842375F4842385F484F9F +:10F0C00052495A4F4E54414C0000000004207146F2 +:10F0D000084202D0EFF3098001E0EFF3088000B5A9 +:10F0E0000149884700BD00001780001000F00EF8AD +:10F0F000002801D0FFF7A6FF00BF00BF002000BF1F +:10F1000000BFFFF777FB00F003F800000020704716 +:10F1100080B500F001F801BD0746384600F002F85E +:10F12000FBE7000080B500BF00BF024A11001820B5 +:10F13000ABBEFBE7260002004D4F544F525F494ED5 +:10F14000335F4842355F4842365F534541545F5014 +:10F15000414E00004D4F544F525F494E345F48427C +:10F16000335F4842345F4241434B524553540000A1 +:10F170004D4F544F525F494E315F4842315F4842D4 +:10F18000325F4C45475245535400000004207146FD +:10F19000084201D0EFF30980EFF3088000B5014980 +:10F1A000884700BD69F200100548014603B468466F +:10F1B00080F3098800BF00BF00BF00BFFFF796FFC4 +:10F1C000A5EDF5FE9E029E0AAA02AA0ACE03CE0B68 +:10F1D0002A042A0C0003000BF002F00A00127A0045 +:10F1E000000000000024F400008000000080000007 +:10F1F0000080000001000200040008001000200050 +:10F200004000800000010002484F52495A4F4E54BE +:10F21000414C5F48414C4C00534541545F50414E76 +:10F220005F48414C4C0000004241434B524553540F +:10F230005F48414C4C0000004C4547524553545FD9 +:10F2400048414C4C00000000E02E0000401F000030 +:10F25000E02E0000307500000003000100040103EF +:10F2600002020002000300058169891E0978C9B203 +:10F270000160704700000000000101010101010070 +:10F28000000100000203040506080C100000000045 +:10F290000000000002000000010000000403000163 +:10F2A00013140015C7010300010000004001BE0057 +:10F2B000F401AE0187018C0095019401000800283B +:10F2C000FFFF012800000000000000000000000017 +:10F2D000000000000000000000000000000000002E +:10F2E000000000000000000000000000000000001E +:10F2F000000000000000000000000000000000000E +:10F3000000000000000000000000000000000000FD +:10F3100000000000000000000000000000000000ED +:10F3200000000000000000000000000000000000DD +:10F3300000000000000000000000000000000000CD +:10F3400000000000000000000000000000000000BD +:10F3500000000000000000000000000000000000AD +:10F36000000000000000000000000000000000009D +:10F37000000000000000000000000000000000008D +:10F38000000000000000000000000000000000007D +:10F39000000000000000000000000000000000006D +:10F3A0000001020332325A325A5A5A320001020321 +:10F3B0005A5A5A5AFEE70000FEE70000FEE7000036 +:10F3C000FEE70000FEE70000FEE70000FEE70000A9 +:10F3D000FEE70000FEE70000FEE70000FEE7400455 +:10F3E000550002000100015003CDA30010000123CD +:10F3F00085A40CA0040900040101000112060E837B +:10F40000C4F1286004FFFFFF1F020225920807F0E5 +:10F41000010352400001F2060218F2060418F20637 +:10F420000618F2060818F306005478F10618F206DA +:10F430000418F2060618F2050818F002FF71E5003C +:10F440001004F1FF04F1FF04F1FF04F1FF04F1FFE8 +:10F4500004F1FF04F1FF04F147046C02480900289D +:10F46000060AF321060001F12334F252086800096C +:10F4700001010102030203010F0F0100000000005F +:10F48000000000000000000000000000000000007C +:10F49000000000000000000000000000000000006C +:10F4A000000000000000000000000000000000005C +:10F4B000000000000000000000000000000000004C +:10F4C000000000000000000000000000000000003C +:10F4D000000000000000000000000000000000002C +:10F4E000000000000000000000000000000000001C +:10F4F000000000000000000000000000000000000C +:10F5000000000000000000000000000000000000FB +:10F5100000000000000000000000000000000000EB +:10F5200000000000000000000000000000000000DB +:10F5300000000000000000000000000000000000CB +:10F5400000000000000000000000000000000000BB +:10F5500000000000000000000000000000000000AB +:10F56000000000000000000000000000000000009B +:10F57000000000000000000000000000000000008B +:10F58000000000000000000000000000000000007B +:10F59000000000000000000000000000000000006B +:10F5A000000000000000000000000000000000005B +:10F5B000000000000000000000000000000000004B +:10F5C000000000000000000000000000000000003B +:10F5D000000000000000000000000000000000002B +:10F5E000000000000000000000000000000000001B +:05F5F000000000000016 +:040000051000F1A94D :00000001FF diff --git a/firmware/t2g/Seat_Controller_demo/IAR/rev_d/Exe/Seat_Controller_demo.out b/firmware/t2g/Seat_Controller_demo/IAR/rev_d/Exe/Seat_Controller_demo.out index 87949f4..63442d1 100755 Binary files a/firmware/t2g/Seat_Controller_demo/IAR/rev_d/Exe/Seat_Controller_demo.out and b/firmware/t2g/Seat_Controller_demo/IAR/rev_d/Exe/Seat_Controller_demo.out differ diff --git a/firmware/t2g/Seat_Controller_demo/IAR/rev_d/Exe/Seat_Controller_demo.sim b/firmware/t2g/Seat_Controller_demo/IAR/rev_d/Exe/Seat_Controller_demo.sim index 19e8ea5..917ce09 100755 Binary files a/firmware/t2g/Seat_Controller_demo/IAR/rev_d/Exe/Seat_Controller_demo.sim and b/firmware/t2g/Seat_Controller_demo/IAR/rev_d/Exe/Seat_Controller_demo.sim differ diff --git a/src/cognitive_agent/application/seat_service.py b/src/cognitive_agent/application/seat_service.py index fa31355..557482b 100755 --- a/src/cognitive_agent/application/seat_service.py +++ b/src/cognitive_agent/application/seat_service.py @@ -62,6 +62,9 @@ from cognitive_agent.application.vehicle_profile import ( # noqa: E402 VehicleProfile, VehicleProfileRegistry, ) +from cognitive_agent.application.zcan_seat_executor import ( # noqa: E402 + ZcanBridgeSeatExecutor, +) from cognitive_agent.infrastructure.llm.openai_responses import ( # noqa: E402 OpenAIIntentError, OpenAIIntentInterpreter, @@ -217,7 +220,7 @@ class SeatDemoService: "execution_modes": ["dry_run", "simulated_hardware", "hardware"], "hardware_execution_allowed": ( self.hardware_settings.configured - and self.vehicle_can_settings.configured + or self.vehicle_can_settings.configured ), "hardware": hardware_info, "vehicle_can": self.vehicle_can_settings.public_info(), @@ -334,6 +337,29 @@ class SeatDemoService: def _new_hardware_executor( self, bus_factory: Any | None = None ) -> HardwareSeatExecutor: + shared_bridge_enabled = os.getenv( + "COGNITIVE_AGENT_SEAT_SHARED_ZCANPRO_BRIDGE_ENABLED", "true" + ).strip().lower() in {"1", "true", "yes", "on"} + if bus_factory is None and shared_bridge_enabled: + # Import lazily so the ordinary dry-run service does not initialize + # any self-repair runtime state. Both modules then share the one + # process that is allowed to own the Windows ZLG adapter. + from cognitive_agent.application.self_repair.service import ( + BRIDGE_MANAGER, + PENDING_DIR, + REQUIRED_BRIDGE_VERSION, + STATUS_PATH, + ZCANPRO_EXE, + ) + if ZCANPRO_EXE.is_file(): + return ZcanBridgeSeatExecutor( + self.hardware_matrix, + BRIDGE_MANAGER, + STATUS_PATH, + PENDING_DIR, + required_version=REQUIRED_BRIDGE_VERSION, + auto_home=self.hardware_settings.auto_home_enabled, + ) resolved_bus_factory = bus_factory or self.hardware_settings.bus_factory() return HardwareSeatExecutor( self.hardware_matrix, @@ -554,7 +580,8 @@ class SeatDemoService: ) parsed = merge_native_can_intent(parsed, utterance) parsed = self._partition_native_actions( - parsed, promote_supported=hardware_request + parsed, + promote_supported=(hardware_request and self.vehicle_can_settings.enabled), ) if hardware_request and not control_plane_request: if parsed.get("actions"): diff --git a/src/cognitive_agent/application/self_repair/service.py b/src/cognitive_agent/application/self_repair/service.py index 2325fc9..abc2e24 100644 --- a/src/cognitive_agent/application/self_repair/service.py +++ b/src/cognitive_agent/application/self_repair/service.py @@ -4,7 +4,8 @@ The original HIL demo mixed HTTP hosting, business state, firmware tooling and ZCANPRO process control in one script. This module keeps the proven state machine and diagnostic rules while exposing them through the repository's existing server. Every machine-specific path is supplied through environment -configuration; importing the module never launches hardware tooling. +configuration or discovered standard installations; importing the module never +launches hardware tooling. """ from __future__ import unicode_literals @@ -29,6 +30,9 @@ from .signal_diagnostic import ( from .zcan_bridge import ( ZcanBridgeManager, run_self_test as run_bridge_manager_self_test, ) +from cognitive_agent.infrastructure.firmware.t2g_seat import ( + EXPECTED_FIRMWARE_REVISION, +) REPOSITORY_ROOT = Path(__file__).resolve().parents[4] @@ -39,6 +43,17 @@ def _env_path(name, default): return Path(value).expanduser() if value else Path(default) +def _env_or_installed_path(name, candidates, fallback): + value = os.getenv(name, "").strip() + if value: + return Path(value).expanduser() + for candidate in candidates: + path = Path(candidate) + if path.exists(): + return path + return Path(fallback) + + def _env_flag(name, default=False): value = os.getenv(name) if value is None: @@ -71,16 +86,28 @@ HARDWARE_LOG_ROOT = _env_path( REPOSITORY_ROOT / "artifacts" / "self-repair" / "hardware", ) PROJECT_DIR = _env_path( - "SELF_REPAIR_FIRMWARE_ROOT", REPOSITORY_ROOT / "__unconfigured_firmware__") + "SELF_REPAIR_FIRMWARE_ROOT", + REPOSITORY_ROOT / "firmware" / "t2g" / "Seat_Controller_demo") IAR_PROJECT_PATH = PROJECT_DIR / "IAR" / "Seat_Controller_demo.ewp" FIRMWARE_OUT_PATH = PROJECT_DIR / "IAR" / "rev_d" / "Exe" / \ "Seat_Controller_demo.out" FIRMWARE_HEX_PATH = PROJECT_DIR / "IAR" / "rev_d" / "Exe" / \ "Seat_Controller_demo.hex" -IAR_BUILD_PATH = _env_path( - "SELF_REPAIR_IAR_BUILD_PATH", REPOSITORY_ROOT / "__unconfigured_iar_build__") -CSPY_BAT_PATH = _env_path( - "SELF_REPAIR_CSPY_BAT_PATH", REPOSITORY_ROOT / "__unconfigured_cspy__") +IAR_INSTALL_ROOTS = ( + Path(r"D:\Program Files\IAR Systems\Embedded Workbench 9.2"), + Path(r"C:\Program Files\IAR Systems\Embedded Workbench 9.2"), + Path(r"C:\Program Files\IAR Systems\Embedded Workbench 9.4"), +) +IAR_BUILD_PATH = _env_or_installed_path( + "SELF_REPAIR_IAR_BUILD_PATH", + tuple(root / "common" / "bin" / "iarbuild.exe" + for root in IAR_INSTALL_ROOTS), + REPOSITORY_ROOT / "__unconfigured_iar_build__") +CSPY_BAT_PATH = _env_or_installed_path( + "SELF_REPAIR_CSPY_BAT_PATH", + tuple(root / "common" / "bin" / "CSpyBat.exe" + for root in IAR_INSTALL_ROOTS), + REPOSITORY_ROOT / "__unconfigured_cspy__") CSPY_GENERAL_PATH = _env_path( "SELF_REPAIR_CSPY_GENERAL_PATH", PROJECT_DIR / "IAR" / "settings" / "Seat_Controller_demo.rev_d.general.xcl", @@ -96,13 +123,19 @@ FIRMWARE_LOG_ROOT = _env_path( FIRMWARE_SOURCE_ROOTS = tuple( PROJECT_DIR / name for name in ("App", "Bsp", "Config", "Driver")) FIRMWARE_SOURCE_SUFFIXES = frozenset((".c", ".h", ".s", ".asm")) -REQUIRED_BRIDGE_VERSION = "2026-08-07-reset-home-far-target-v15" -ZCANPRO_EXE = _env_path( - "SELF_REPAIR_ZCANPRO_EXE", REPOSITORY_ROOT / "__unconfigured_zcanpro__") -ZCANPRO_SCRIPT_CONFIG = _env_path( - "SELF_REPAIR_ZCANPRO_SCRIPT_CONFIG", - REPOSITORY_ROOT / "__unconfigured_zcanpro_script_config__", +REQUIRED_BRIDGE_VERSION = "2026-08-09-real-self-heal-v32" +ZCANPRO_ROOTS = ( + Path(r"C:\Program Files (x86)\ZCANPRO"), + Path(r"C:\Program Files\ZCANPRO"), ) +ZCANPRO_EXE = _env_or_installed_path( + "SELF_REPAIR_ZCANPRO_EXE", + tuple(root / "ZCANPRO.exe" for root in ZCANPRO_ROOTS), + REPOSITORY_ROOT / "__unconfigured_zcanpro__") +ZCANPRO_SCRIPT_CONFIG = _env_or_installed_path( + "SELF_REPAIR_ZCANPRO_SCRIPT_CONFIG", + tuple(root / "config" / "extend_script.ini" for root in ZCANPRO_ROOTS), + REPOSITORY_ROOT / "__unconfigured_zcanpro_script_config__") BRIDGE_MANAGER = ZcanBridgeManager( STATUS_PATH, BRIDGE_SCRIPT_PATH, required_version=REQUIRED_BRIDGE_VERSION, @@ -268,6 +301,13 @@ class ConsoleState(object): "CAN链路有流量但缺少0x301~0x305,判定为未烧录/固件不匹配类问题" if bridge.get("bus_traffic") else "桥接在线但座椅协议无报文,判定为未烧录/固件未运行类问题") + elif not bridge.get("firmware_revision_ok"): + reason = "FIRMWARE_REVISION_MISMATCH" + detail = ( + "Seat_Controller_demo固件revision=%s,期望revision=%s," + "需要自动重新构建并烧录" % + (bridge.get("firmware_revision", "未知"), + EXPECTED_FIRMWARE_REVISION)) else: return { "ready": True, "auto_flash": False, @@ -334,7 +374,8 @@ class ConsoleState(object): last_bridge = self._bridge_summary(last_status, time.time()) if (last_bridge.get("online") and (not require_protocol or - last_bridge.get("protocol_online"))): + (last_bridge.get("protocol_online") and + last_bridge.get("firmware_revision_ok")))): return last_status, last_bridge time.sleep(0.25) return last_status, last_bridge or {} @@ -385,7 +426,8 @@ class ConsoleState(object): trigger_reason=qualification.get("reason_code")) status, bridge = self._wait_bridge(require_protocol=True, timeout_s=12.0) - if not bridge.get("protocol_online"): + if (not bridge.get("protocol_online") or + not bridge.get("firmware_revision_ok")): detail = ("自动烧录已执行,但仍未收到0x301~0x305;" "硬件诊断未启动,请检查ECU供电或烧录日志") with self.lock: @@ -430,6 +472,7 @@ class ConsoleState(object): online = age is not None and age < 3.0 and version_ok system = {} if not isinstance(status, dict) else ( status.get("system") or {}) + firmware_revision = system.get("firmware_revision") frame_epochs = {} if not isinstance(status, dict) else ( status.get("frame_epochs") or {}) recent_frame_ids = [] @@ -460,6 +503,10 @@ class ConsoleState(object): "current_request_id": None if not isinstance(status, dict) else status.get( "current_request_id"), "position_valid_mask": int(system.get("position_valid_mask", 0)), + "firmware_revision": firmware_revision, + "expected_firmware_revision": EXPECTED_FIRMWARE_REVISION, + "firmware_revision_ok": + firmware_revision == EXPECTED_FIRMWARE_REVISION, "active_mask": int(system.get("active_mask", 0)), "faulted_mask": int(system.get("faulted_mask", 0)), "bus": {} if not isinstance(status, dict) else ( @@ -618,6 +665,16 @@ class ConsoleState(object): self.hardware_active = False if not self.hardware_run_id or self.hardware_report_path is not None: return + active_test = (self.hardware_result or {}).get("active_test") or {} + test_phase = active_test.get("phase") + if test_phase in ("PASSED", "FAILED"): + self.hardware_prepare.update({ + "state": "DIAGNOSTIC_%s" % test_phase, + "detail": active_test.get("detail") or + active_test.get("title") or + "21针主动检测已结束", + "finished_epoch": now, + }) report = { "schema": "seat-hardware-diagnostic-report-v1", "run_id": self.hardware_run_id, @@ -625,8 +682,7 @@ class ConsoleState(object): "events": list(self.hardware_events), "diagnosis": self.hardware_result, "startup_rule_check": self.hardware_self_test, - "active_pin_test": (self.hardware_result or {}).get( - "active_test"), + "active_pin_test": active_test, "bridge": self._bridge_summary(status, now), } path = HARDWARE_LOG_ROOT / self.hardware_run_id / \ @@ -839,10 +895,11 @@ class ConsoleState(object): "firmware": self._firmware_snapshot(), } - def start(self, case_id, execution_mode="shadow"): + def start(self, case_id, execution_mode="shadow", allow_batch=False): with self.lock: if execution_mode == "bench": - if self.hardware_active or self.batch.get("active"): + if (self.hardware_active or + (self.batch.get("active") and not allow_batch)): raise ValueError("硬件诊断或批量验证正在运行,不能启动实物故障用例") scenario = SCENARIO_BY_ID.get(case_id) or {} if not (scenario.get("bench") or {}).get("supported", False): @@ -850,8 +907,9 @@ class ConsoleState(object): "该用例没有安全的实物注入手段,请使用影子仿真") self.bridge_manager.ensure_async() now = time.time() - status = _read_json(STATUS_PATH) - bridge = self._bridge_summary(status, now) + status, bridge = self._wait_bridge( + require_protocol=True, timeout_s=12.0) + now = time.time() if not bridge.get("online"): raise ValueError("ZCANPRO桥接未在线,不能向实物ECU写入故障") if not bridge.get("protocol_online"): @@ -888,7 +946,8 @@ class ConsoleState(object): self.bench_request_id = None return self.engine.start(case_id, execution_mode="shadow") - def reset(self, execution_mode="shadow"): + def reset(self, execution_mode="shadow", allow_batch=False, + force_all_axes=True, home_nonzero_axes=False): with self.lock: if (self.engine.execution_mode == "bench" and self.engine.phase not in ("IDLE", PHASE_PASSED, @@ -907,12 +966,14 @@ class ConsoleState(object): }) return {"healing": self.engine.snapshot(), "bench_reset": dict(self.bench_reset)} - if self.hardware_active or self.batch.get("active"): + if (self.hardware_active or + (self.batch.get("active") and not allow_batch)): raise ValueError("硬件诊断或批量验证正在运行,不能执行四轴归零") self.bridge_manager.ensure_async() now = time.time() - status = _read_json(STATUS_PATH) - bridge = self._bridge_summary(status, now) + status, bridge = self._wait_bridge( + require_protocol=True, timeout_s=12.0) + now = time.time() if not bridge.get("online") or not bridge.get("protocol_online"): raise ValueError("CAN桥接或座椅ECU协议未在线,不能执行四轴归零") if (status or {}).get("current_request_id"): @@ -925,7 +986,10 @@ class ConsoleState(object): "armed_until_epoch": now + 600.0, "source": "seat_self_healing_console", "action": "initialize_known_ranges", - "payload": {"force_all_axes": True}, + "payload": { + "force_all_axes": bool(force_all_axes), + "home_nonzero_axes": bool(home_nonzero_axes), + }, } zero = self._bench_zero_snapshot(status) self.bench_reset = { @@ -938,13 +1002,64 @@ class ConsoleState(object): return {"healing": self.engine.snapshot(), "bench_reset": dict(self.bench_reset)} + def _wait_bench_reset(self, timeout_s=620.0): + """Wait for the bridge-owned four-axis homing request to finish.""" + deadline = time.time() + float(timeout_s) + last = None + while time.time() < deadline: + last = self.snapshot() + reset = last.get("bench_reset") or {} + if reset.get("phase") in ("PASSED", "FAILED"): + return reset + time.sleep(0.2) + with self.lock: + self.bench_reset.update({ + "phase": "FAILED", + "finished_epoch": time.time(), + "summary": "四轴归零等待超时,批量验证已停止", + }) + return dict(self.bench_reset) + + @staticmethod + def _wait_bench_bridge_idle(timeout_s=8.0): + """Wait until the bridge clears its just-published request result.""" + deadline = time.time() + float(timeout_s) + while time.time() < deadline: + status = _read_json(STATUS_PATH) or {} + if not status.get("current_request_id"): + return True + time.sleep(0.05) + return False + def _batch_worker(self, execution_mode): try: for scenario in public_scenarios(): with self.lock: self.batch["current_case_id"] = scenario["id"] self.latest_report_path = None - self.start(scenario["id"], execution_mode) + if execution_mode == "bench": + if not self._wait_bench_bridge_idle(): + raise ValueError( + "%s前台架桥接任务未在安全窗口内结束" % scenario["id"]) + reset = {} + for reset_attempt in range(2): + self.reset( + "bench", allow_batch=True, + force_all_axes=False, + home_nonzero_axes=True) + reset = self._wait_bench_reset() + if (reset.get("phase") == "PASSED" and + reset.get("all_zero")): + break + if reset_attempt == 0: + time.sleep(1.0) + if (reset.get("phase") != "PASSED" or + not reset.get("all_zero")): + raise ValueError( + "%s前四轴自动归零失败:%s" % + (scenario["id"], reset.get("summary", "未知错误"))) + self.start( + scenario["id"], execution_mode, allow_batch=True) while True: value = self.snapshot() phase = value["healing"]["phase"] @@ -961,9 +1076,12 @@ class ConsoleState(object): "duration_s": value["healing"].get("elapsed_s"), "diagnosed_code": value["healing"].get("diagnosed_code"), "execution_mode": execution_mode, - "snapshot_path": (None if self.latest_report_path is None else - str(self.latest_report_path.parent / - "diagnostic_snapshot_success.json")), + "report_path": (None if self.latest_report_path is None else + str(self.latest_report_path)), + "snapshot_path": ( + None if self.latest_report_path is None or not passed else + str(self.latest_report_path.parent / + "diagnostic_snapshot_success.json")), } self.batch["results"].append(result) self.batch["completed"] += 1 @@ -990,8 +1108,9 @@ class ConsoleState(object): if execution_mode not in ("shadow", "bench"): raise ValueError("未知批量验证方式") if execution_mode == "bench": - raise ValueError( - "实物台架需逐项验证:每个用例前请人工点击重置并确认四轴归零") + if self.hardware_active: + raise ValueError("硬件诊断正在运行,不能启动实物批量验证") + self.bridge_manager.ensure_async() self.batch = self._new_batch_state(execution_mode) self.batch["active"] = True self.batch["started_epoch"] = time.time() @@ -1376,7 +1495,10 @@ class SelfRepairService(object): return self.state.start_batch(payload.get("execution_mode", "shadow")) def reset_healing(self, payload): - return self.state.reset(payload.get("execution_mode", "shadow")) + return self.state.reset( + payload.get("execution_mode", "shadow"), + force_all_axes=bool(payload.get("force_all_axes", True)), + home_nonzero_axes=bool(payload.get("home_nonzero_axes", False))) def start_hardware(self): return self.state.start_hardware() diff --git a/src/cognitive_agent/application/self_repair/zcan_bridge.py b/src/cognitive_agent/application/self_repair/zcan_bridge.py index 819d6cb..156251a 100644 --- a/src/cognitive_agent/application/self_repair/zcan_bridge.py +++ b/src/cognitive_agent/application/self_repair/zcan_bridge.py @@ -24,6 +24,7 @@ class ZcanBridgeManager(object): def __init__(self, status_path, script_path, heartbeat_stale_s=3.0, poll_s=1.0, retry_cooldown_s=15.0, + busy_heartbeat_grace_s=45.0, required_version=None, zcanpro_exe=None, script_config_path=None, auto_start=False): self.status_path = Path(status_path) @@ -34,6 +35,7 @@ class ZcanBridgeManager(object): self.heartbeat_stale_s = float(heartbeat_stale_s) self.poll_s = float(poll_s) self.retry_cooldown_s = float(retry_cooldown_s) + self.busy_heartbeat_grace_s = float(busy_heartbeat_grace_s) self.required_version = required_version self.lock = threading.RLock() self.stop_event = threading.Event() @@ -79,6 +81,7 @@ class ZcanBridgeManager(object): "last_attempt_epoch": self.last_attempt_epoch, "last_online_epoch": self.last_online_epoch, "heartbeat_age_s": None if age is None else round(age, 2), + "busy_heartbeat_grace_s": self.busy_heartbeat_grace_s, "zcan_window_found": self.zcan_window_found, "retry_armed": self.retry_requested, "zcan_exe": str(self.zcanpro_exe), @@ -120,6 +123,20 @@ class ZcanBridgeManager(object): return False return True + def _bridge_busy_within_grace(self): + try: + import json + with self.status_path.open("r", encoding="utf-8") as stream: + status = json.load(stream) + heartbeat = float(status.get("heartbeat_epoch", 0) or 0) + age = max(0.0, time.time() - heartbeat) + return bool( + status.get("current_request_id") and + status.get("bridge_state") == "RUNNING" and + heartbeat > 0 and age <= self.busy_heartbeat_grace_s) + except (OSError, ValueError, TypeError): + return False + def _take_retry_request(self): with self.lock: if not self.retry_requested: @@ -130,15 +147,22 @@ class ZcanBridgeManager(object): def _monitor(self): while not self.stop_event.is_set(): if self._heartbeat_online(): + with self.lock: + # A defensive ensure request is already satisfied by a + # healthy bridge. Do not carry it into a later live task. + self.retry_requested = False self._set_state( "ONLINE", "CAN桥接在线,由ZCANPRO扩展脚本持续提供数据", last_online_epoch=time.time()) + elif self._bridge_busy_within_grace(): + self._set_state( + "BUSY", "CAN bridge request is active; restart is deferred") else: with self.lock: # A bridge that was genuinely online gets one automatic # recovery attempt. A failed recovery is not repeated # until an explicit Start action calls ``ensure_async``. - if self.state == "ONLINE": + if self.state in ("ONLINE", "BUSY"): self.retry_requested = True if self._take_retry_request(): self._attempt_start() diff --git a/src/cognitive_agent/application/zcan_seat_executor.py b/src/cognitive_agent/application/zcan_seat_executor.py new file mode 100644 index 0000000..2f64e89 --- /dev/null +++ b/src/cognitive_agent/application/zcan_seat_executor.py @@ -0,0 +1,254 @@ +"""Execute normal seat command plans through the shared ZCANPRO bridge. + +ZLG's Windows driver gives one process exclusive ownership of a USBCAN device. +Self-repair already keeps that ownership inside ZCANPRO, so opening the same +adapter again from the web server makes both user and admin orchestration fail. +This executor keeps one owner and exchanges bounded, armed JSON requests with +the bridge instead. +""" + +from __future__ import annotations + +from datetime import UTC, datetime +import json +import os +from pathlib import Path +import time +from typing import Any +import uuid + + +def _now() -> str: + return datetime.now(UTC).isoformat().replace("+00:00", "Z") + + +def _read_json(path: Path) -> dict[str, Any] | None: + try: + value = json.loads(path.read_text(encoding="utf-8")) + except (OSError, ValueError, TypeError): + return None + return value if isinstance(value, dict) else None + + +def _atomic_json(path: Path, value: dict[str, Any]) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + temporary = path.with_name( + f".{path.name}.{os.getpid()}.{time.time_ns()}.tmp" + ) + temporary.write_text( + json.dumps(value, ensure_ascii=False, indent=2), encoding="utf-8" + ) + os.replace(temporary, path) + + +class ZcanBridgeSeatExecutor: + """Hardware-seat executor compatible with ``HardwareSeatExecutor``.""" + + def __init__( + self, + matrix: Any, + bridge_manager: Any, + status_path: Path, + pending_dir: Path, + *, + required_version: str, + auto_home: bool, + startup_timeout_s: float = 12.0, + request_timeout_s: float = 660.0, + ) -> None: + self.matrix = matrix + self.bridge_manager = bridge_manager + self.status_path = Path(status_path) + self.pending_dir = Path(pending_dir) + self.required_version = required_version + self.auto_home = bool(auto_home) + self.startup_timeout_s = float(startup_timeout_s) + self.request_timeout_s = float(request_timeout_s) + + def _online_status(self, *, require_protocol: bool) -> dict[str, Any] | None: + value = _read_json(self.status_path) + if value is None or value.get("bridge_version") != self.required_version: + return None + try: + fresh = time.time() - float(value.get("heartbeat_epoch", 0)) < 3.0 + except (TypeError, ValueError): + fresh = False + if not fresh: + return None + if require_protocol and not (value.get("system") and value.get("frame_epochs")): + return None + return value + + def _wait_online(self, *, require_protocol: bool) -> dict[str, Any]: + self.bridge_manager.ensure_async() + deadline = time.time() + self.startup_timeout_s + while time.time() < deadline: + value = self._online_status(require_protocol=require_protocol) + if value is not None: + return value + time.sleep(0.1) + qualifier = "及座椅ECU协议" if require_protocol else "" + raise RuntimeError(f"ZCANPRO桥接{qualifier}未在线") + + def _payload( + self, + command_plan: dict[str, Any], + function_config: dict[str, Any], + ) -> dict[str, Any]: + commands = [] + for command in command_plan["spec"]["commands"]: + encoded = self.matrix.encode(command["message"], command["signals"]) + item = dict(command) + item["frame_id"] = int(encoded["frame_id"], 16) + item["data"] = list(bytes.fromhex(encoded["data_hex"])) + commands.append(item) + return { + "name": command_plan.get("metadata", {}).get( + "name", "自然语言座椅控制" + ), + "commands": commands, + "operations": list(function_config["spec"]["operations"]), + "allow_auto_home": self.auto_home, + } + + def _submit(self, payload: dict[str, Any]) -> dict[str, Any]: + status = self._wait_online(require_protocol=True) + idle_deadline = time.time() + self.startup_timeout_s + while status.get("current_request_id") and time.time() < idle_deadline: + time.sleep(0.1) + status = self._wait_online(require_protocol=True) + if status.get("current_request_id"): + raise RuntimeError( + "ZCANPRO桥接正在执行其他台架任务:%s" % + status.get("current_request_id") + ) + + request_id = "SEAT_ORCH_%d_%s" % ( + int(time.time() * 1000), uuid.uuid4().hex[:6] + ) + request = { + "schema": "seat-function-request-v1", + "request_id": request_id, + "created_epoch": time.time(), + "armed_until_epoch": time.time() + self.request_timeout_s + 30.0, + "source": "cabin_cognitive_orchestrator", + "action": "execute_command_plan", + "payload": payload, + } + _atomic_json(self.pending_dir / f"{request_id}.json", request) + + deadline = time.time() + self.request_timeout_s + while time.time() < deadline: + status = self._online_status(require_protocol=False) + if status is None: + time.sleep(0.1) + continue + result = status.get("last_result") or {} + if result.get("request_id") == request_id: + return result + time.sleep(0.1) + raise RuntimeError("ZCANPRO桥接执行座椅请求超时,已停止等待") + + @staticmethod + def _report( + function_config: dict[str, Any], + started_at: str, + bridge_result: dict[str, Any] | None, + error: Exception | None, + ) -> dict[str, Any]: + request_id = function_config["metadata"]["request_id"] + passed = error is None and (bridge_result or {}).get("result") == "PASS" + detail = (bridge_result or {}).get("details") or {} + message = ( + detail.get("summary") + or (bridge_result or {}).get("summary") + or (str(error) if error is not None else "ZCANPRO桥接未返回通过结果") + ) + results = [ + { + "ref": operation["id"], + "domain": "seat", + "status": "succeeded" if passed else "failed", + "message": message, + "telemetry": { + "transport": "zcanpro_shared_bridge", + "hardware_feedback": passed, + "simulated": False, + "bridge_result": bridge_result, + "error_type": type(error).__name__ if error is not None else None, + "stop_all_attempted": bool(detail.get("stop_all_attempted")), + }, + } + for operation in function_config["spec"]["operations"] + ] + return { + "apiVersion": "cognitive-agent/v1alpha1", + "kind": "ExecutionReport", + "metadata": { + "id": f"report-{request_id}", + "name": "T2G seat ZCANPRO bridge execution report", + "version": "1.0.0", + "request_id": request_id, + "labels": {"simulation": "false", "feedback": "physical_can"}, + }, + "spec": { + "mode": "hil", + "status": "succeeded" if passed else "failed", + "started_at": started_at, + "finished_at": _now(), + "results": results, + }, + } + + def execute( + self, + command_plan: dict[str, Any], + function_config: dict[str, Any], + actuator_state: dict[str, Any] | None = None, + ) -> dict[str, Any]: + del actuator_state + started_at = _now() + try: + result = self._submit(self._payload(command_plan, function_config)) + except Exception as exc: # normalize bridge/startup failures for the API + return self._report(function_config, started_at, None, exc) + return self._report(function_config, started_at, result, None) + + def read_physical_state(self) -> dict[str, Any]: + status = self._wait_online(require_protocol=True) + axes = ("longitudinal", "cushion_tilt", "backrest_recline", "legrest_height") + positions: dict[str, Any] = {} + missing = [] + motors = status.get("motors") or [] + for motor, axis in enumerate(axes): + item = motors[motor] if motor < len(motors) else None + if not isinstance(item, dict): + missing.append(axis) + continue + positions[axis] = { + "position_pct": round(int(item.get("position", 0)) / 100), + "position_valid": bool(item.get("position_valid")), + "motion_state": "moving" if item.get("active") else "stopped", + } + thermal = status.get("thermal") or [] + thermal_byte = int(thermal[0]) if thermal else 0 + ventilation_raw = thermal_byte & 0x07 + heating_raw = (thermal_byte >> 3) & 0x07 + return { + "position": positions, + "ventilation": { + "state": "off" if ventilation_raw <= 1 else "on", + "level": max(0, ventilation_raw - 1), + }, + "heating": { + "state": "off" if heating_raw <= 1 else "on", + "level": max(0, heating_raw - 1), + }, + "captured_at": _now(), + "source": "physical_can", + "target": { + "device": "seat", "zone": "front_right", "instance": "passenger" + }, + "complete": not missing, + "missing": missing, + } diff --git a/src/cognitive_agent/infrastructure/can/hardware.py b/src/cognitive_agent/infrastructure/can/hardware.py index 0b76b37..82e2c5a 100755 --- a/src/cognitive_agent/infrastructure/can/hardware.py +++ b/src/cognitive_agent/infrastructure/can/hardware.py @@ -504,7 +504,11 @@ class VehicleCanSettings: repository_root=repository_root, enabled=_env_bool( "COGNITIVE_AGENT_VEHICLE_CAN_ENABLED", - default=_env_bool("COGNITIVE_AGENT_HARDWARE_EXECUTION_ENABLED"), + # The seat bench and the vehicle CAN harness are independent + # pieces of hardware. Enabling physical seat execution must + # not silently open/transmit on the unconnected vehicle + # channel; dual-channel execution is an explicit opt-in. + default=False, ), approval_required=_env_bool( "COGNITIVE_AGENT_HARDWARE_APPROVAL_TOKEN_REQUIRED", default=True diff --git a/src/cognitive_agent/infrastructure/firmware/t2g_seat.py b/src/cognitive_agent/infrastructure/firmware/t2g_seat.py index 4fccdb5..4384ab7 100755 --- a/src/cognitive_agent/infrastructure/firmware/t2g_seat.py +++ b/src/cognitive_agent/infrastructure/firmware/t2g_seat.py @@ -7,16 +7,17 @@ import subprocess import time from dataclasses import dataclass from pathlib import Path -from typing import Any, Callable +from typing import TYPE_CHECKING, Any, Callable -from cognitive_agent.infrastructure.can.gateway import CanBus +if TYPE_CHECKING: + from cognitive_agent.infrastructure.can.gateway import CanBus FIRMWARE_PROTOCOL_SIGNATURE = "seat-controller-smv8-dynamic-modes-v13" FIRMWARE_PROTOCOL_FRAME_IDS = frozenset( {0x301, 0x302, 0x303, 0x304, 0x305, 0x306, 0x4FA} ) -EXPECTED_FIRMWARE_REVISION = 13 +EXPECTED_FIRMWARE_REVISION = 15 EXPECTED_MOTOR_MAX_HALL = (480, 374, 917, 647) diff --git a/tests/e2e/test_seat_web_api.py b/tests/e2e/test_seat_web_api.py index e217eb9..70e4a0e 100755 --- a/tests/e2e/test_seat_web_api.py +++ b/tests/e2e/test_seat_web_api.py @@ -115,7 +115,7 @@ class SeatWebApiTests(unittest.TestCase): def test_static_console_and_runtime_endpoint(self) -> None: with self.opener.open(f"{self.base_url}/", timeout=3) as response: html = response.read().decode("utf-8") - with self.opener.open(f"{self.base_url}/app.js?v=seat-hil-43", timeout=3) as response: + with self.opener.open(f"{self.base_url}/app.js?v=seat-hil-44", timeout=3) as response: app_script = response.read().decode("utf-8") with self.opener.open( f"{self.base_url}/gesture-control.js?v=android-pad-6", timeout=3 @@ -150,7 +150,7 @@ class SeatWebApiTests(unittest.TestCase): self.assertIn("整车孪生界面", html) self.assertIn("阅读灯", html) self.assertNotIn("透明车体 · 实体设备", html) - self.assertIn('src="/app.js?v=seat-hil-43"', html) + self.assertIn('src="/app.js?v=seat-hil-44"', html) self.assertIn('src="/gesture-control.js?v=android-pad-6"', html) self.assertNotIn('class="vehicle-system-hud"', html) self.assertIn('src="/console-v2.js?v=desktop-refactor-28"', html) @@ -229,6 +229,12 @@ class SeatWebApiTests(unittest.TestCase): self.assertNotIn('id="releaseHardwareAccess"', html) self.assertIn('const dynamicModeOrder = ["rocking_horse", "dynamic_cradle"]', app_script) self.assertIn('divider.className = "mode-group-divider"', app_script) + self.assertIn( + 'mode === "hardware" && !state.runtime?.hardware_execution_allowed', + app_script, + ) + self.assertIn("hardwareButton.disabled = !hardwareExecutionReady", app_script) + self.assertIn("车端 CAN 未启用,其他领域保持虚拟执行", app_script) self.assertIn("function extractReferenceWindowPanes", app_script) self.assertIn("function collectReferenceFrontLampMeshes", app_script) self.assertIn("function emphasizeReferenceWindowPanes", app_script) diff --git a/tests/e2e/test_self_repair_api.py b/tests/e2e/test_self_repair_api.py index f9688ea..1108979 100644 --- a/tests/e2e/test_self_repair_api.py +++ b/tests/e2e/test_self_repair_api.py @@ -5,6 +5,7 @@ import threading import urllib.error import urllib.request from http.server import ThreadingHTTPServer +from pathlib import Path import pytest @@ -134,15 +135,15 @@ class TestSelfRepairApi: with urllib.request.urlopen(f"{self.base_url}/", timeout=3) as response: html = response.read().decode("utf-8") with urllib.request.urlopen( - f"{self.base_url}/self-repair.js?v=repair-15", timeout=3 + f"{self.base_url}/self-repair.js?v=repair-17", timeout=3 ) as response: script = response.read().decode("utf-8") with urllib.request.urlopen( - f"{self.base_url}/self-repair.css?v=repair-15", timeout=3 + f"{self.base_url}/self-repair.css?v=repair-17", timeout=3 ) as response: styles = response.read().decode("utf-8") with urllib.request.urlopen( - f"{self.base_url}/self-repair-seat3d.js?v=repair-15", timeout=3 + f"{self.base_url}/self-repair-seat3d.js?v=repair-17", timeout=3 ) as response: seat3d = response.read().decode("utf-8") with urllib.request.urlopen( @@ -150,10 +151,15 @@ class TestSelfRepairApi: ) as response: console_script = response.read().decode("utf-8") - assert 'href="/self-repair.css?v=repair-15"' in html - assert 'src="/self-repair.js?v=repair-15"' in html - assert 'src="/self-repair-seat3d.js?v=repair-15"' in html + assert 'href="/self-repair.css?v=repair-17"' in html + assert 'src="/self-repair.js?v=repair-17"' in html + assert 'src="/self-repair-seat3d.js?v=repair-17"' in html assert "量产故障用例" in script + assert 'id="repairConfirmDialog"' in script + assert "confirmAction(" in script + assert "window.confirm" not in script + assert 'hardware.link?.adapter === "OK"' in script + assert 'PASSED: ["21针通过", "online"]' in script assert "connectorRows" in script assert "Polling refreshes data only" in script assert "renderRecords();\n showView(activeView);" not in script @@ -172,3 +178,18 @@ class TestSelfRepairApi: assert 'window.addEventListener("self-repair-seat-reset"' in seat3d assert '["self-calibration", "self-repair"].includes(module)' in console_script assert 'roleSelect.disabled = ui.activeModule === "self-repair"' in console_script + + +def test_self_repair_bridge_uses_the_backend_runtime_directory() -> None: + source = ( + Path(__file__).resolve().parents[2] + / "tools" + / "zcan" + / "seat_self_repair_bridge.py" + ).read_text(encoding="utf-8") + + assert '"artifacts", "tmp", "self-repair", "runtime"' in source + assert 'os.path.join(BASE_DIR, "seat_function_runtime")' not in source + assert "A silent or disconnected CAN bus must not kill" in source + assert 'self.message("GUI STOP_ALL发送失败' in source + assert 'self.message("GUI thermal off发送失败' in source diff --git a/tests/fixtures/seat_frontend_hil_suite.json b/tests/fixtures/seat_frontend_hil_suite.json index 723ef25..646ca10 100644 --- a/tests/fixtures/seat_frontend_hil_suite.json +++ b/tests/fixtures/seat_frontend_hil_suite.json @@ -353,7 +353,11 @@ ]}, {"mode_id": "zero_gravity", "expected": {"longitudinal": 100, "cushion_tilt": 100, "backrest_recline": 81, "legrest_height": 94}, "variants": [ {"id": "MODE-ZERO-GRAVITY-OPEN", "utterance": "打开零重力模式"}, {"id": "MODE-ZERO-GRAVITY-ENTER", "utterance": "副驾进入零重力"}, {"id": "MODE-ZERO-GRAVITY-ENGLISH", "utterance": "开启 zero-gravity 模式"} - ]} + ]}, + {"id": "MODE-ROCKING-HORSE-START", "mode_id": "rocking_horse", "utterance": "开启木马模式", "expected": {}, "expected_dynamic_mode": {"mode_id": 1, "state": "running"}}, + {"id": "MODE-ROCKING-HORSE-STOP", "utterance": "关闭木马模式", "expected": {}, "expected_dynamic_mode": {"mode_id": 0, "state": "idle"}}, + {"id": "MODE-DYNAMIC-CRADLE-START", "mode_id": "dynamic_cradle", "utterance": "开启动态摇篮模式", "expected": {}, "expected_dynamic_mode": {"mode_id": 2, "state": "running"}}, + {"id": "MODE-DYNAMIC-CRADLE-STOP", "utterance": "关闭动态摇篮模式", "expected": {}, "expected_dynamic_mode": {"mode_id": 0, "state": "idle"}} ], "model_cases": [ { diff --git a/tests/integration/test_seat_frontend_input_coverage.py b/tests/integration/test_seat_frontend_input_coverage.py index b12ed0d..ace1d4d 100644 --- a/tests/integration/test_seat_frontend_input_coverage.py +++ b/tests/integration/test_seat_frontend_input_coverage.py @@ -66,7 +66,11 @@ class SeatFrontendInputCoverageTests(unittest.TestCase): {"thermal", "motion", "combined", "mode"}, ) self.assertEqual( - {case["mode_id"] for case in self.positive_cases if case["group"] == "mode"}, + { + case["mode_id"] + for case in self.positive_cases + if case["group"] == "mode" and case.get("mode_id") + }, { "easy_entry_exit", "office", @@ -79,6 +83,8 @@ class SeatFrontendInputCoverageTests(unittest.TestCase): "electric_beach_chair", "nap", "zero_gravity", + "rocking_horse", + "dynamic_cradle", }, ) @@ -150,6 +156,19 @@ class SeatFrontendInputCoverageTests(unittest.TestCase): for field, expected in expected_motion.items(): if field != "axis": self.assertEqual(operation["motion"][field], expected) + expected_dynamic_mode = case.get("expected_dynamic_mode") + if expected_dynamic_mode: + capability = ( + "seat.stop_dynamic_mode" + if expected_dynamic_mode["mode_id"] == 0 + else "seat.start_dynamic_mode" + ) + self.assertIn(capability, by_capability) + if expected_dynamic_mode["mode_id"]: + self.assertEqual( + by_capability[capability]["parameters"]["mode_id"], + expected_dynamic_mode["mode_id"], + ) def test_every_rejection_utterance_stops_before_execution(self) -> None: for case in self.rejection_cases: diff --git a/tests/unit/test_native_can_integration.py b/tests/unit/test_native_can_integration.py index a8b515f..dc32ec6 100644 --- a/tests/unit/test_native_can_integration.py +++ b/tests/unit/test_native_can_integration.py @@ -1,5 +1,6 @@ from __future__ import annotations +import os import unittest from pathlib import Path from unittest.mock import patch @@ -162,6 +163,17 @@ class NativeCanIntegrationTests(unittest.TestCase): self.assertEqual(info["data"]["bitrate"], 2_000_000) self.assertEqual(info["data"]["sample_point_percent"], 80) + def test_enabling_seat_hardware_does_not_implicitly_enable_vehicle_can(self) -> None: + with patch.dict( + os.environ, + {"COGNITIVE_AGENT_HARDWARE_EXECUTION_ENABLED": "true"}, + clear=False, + ): + os.environ.pop("COGNITIVE_AGENT_VEHICLE_CAN_ENABLED", None) + settings = VehicleCanSettings.from_env(Path(REPOSITORY_ROOT)) + + self.assertFalse(settings.enabled) + if __name__ == "__main__": unittest.main() diff --git a/tests/unit/test_self_repair.py b/tests/unit/test_self_repair.py index 544ed0b..30ef5c7 100644 --- a/tests/unit/test_self_repair.py +++ b/tests/unit/test_self_repair.py @@ -1,5 +1,7 @@ from __future__ import annotations +import json +import time from pathlib import Path from cognitive_agent.application.self_repair.healing_model import ( @@ -81,3 +83,24 @@ def test_bridge_manager_does_not_arm_visible_tooling_by_default(tmp_path: Path) assert snapshot["state"] == "IDLE" assert snapshot["retry_armed"] is False assert snapshot["attempts"] == 0 + + +def test_bridge_manager_does_not_restart_a_live_busy_request(tmp_path: Path) -> None: + status_path = tmp_path / "bridge.json" + status_path.write_text( + json.dumps({ + "heartbeat_epoch": time.time() - 5.0, + "bridge_state": "RUNNING", + "current_request_id": "SELF_HEAL_BENCH_1", + }), + encoding="utf-8", + ) + manager = ZcanBridgeManager( + status_path, + tmp_path / "bridge.py", + heartbeat_stale_s=3.0, + busy_heartbeat_grace_s=45.0, + ) + + assert manager._heartbeat_online() is False + assert manager._bridge_busy_within_grace() is True diff --git a/tools/run_seat_frontend_hil_suite.py b/tools/run_seat_frontend_hil_suite.py index 7379e8d..f3663e1 100644 --- a/tools/run_seat_frontend_hil_suite.py +++ b/tools/run_seat_frontend_hil_suite.py @@ -106,6 +106,7 @@ def expected_operation_errors( result: dict[str, Any], expected: dict[str, int], expected_motion: dict[str, Any] | None = None, + expected_dynamic_mode: dict[str, Any] | None = None, ) -> list[str]: errors: list[str] = [] seat_config = (result.get("function_configs") or {}).get("seat") or result.get( @@ -151,6 +152,47 @@ def expected_operation_errors( f"{capability} motion.{field}={actual_value}, " f"expected={expected_value}" ) + if expected_dynamic_mode: + expected_mode_id = int(expected_dynamic_mode["mode_id"]) + capability = ( + "seat.stop_dynamic_mode" + if expected_mode_id == 0 + else "seat.start_dynamic_mode" + ) + operation = by_capability.get(capability) + if operation is None: + errors.append(f"expected capability was not generated: {capability}") + elif expected_mode_id and dig(operation, "parameters", "mode_id") != expected_mode_id: + errors.append( + f"{capability} mode_id={dig(operation, 'parameters', 'mode_id')}, " + f"expected={expected_mode_id}" + ) + + hardware_results = dig(result, "execution_report", "spec", "results") or [] + telemetry = next( + ( + item.get("telemetry", {}) + for item in hardware_results + if item.get("domain") == "seat" + and item.get("telemetry", {}).get("dynamic_mode_id") is not None + ), + None, + ) + if telemetry is None: + errors.append("dynamic-mode execution did not include physical 0x306 telemetry") + else: + if telemetry.get("dynamic_mode_id") != expected_mode_id: + errors.append( + f"dynamic telemetry mode_id={telemetry.get('dynamic_mode_id')}, " + f"expected={expected_mode_id}" + ) + dynamic_state = telemetry.get("dynamic_state") + accepted_states = {0} if expected_mode_id == 0 else {1, 2} + if dynamic_state not in accepted_states: + errors.append( + f"dynamic telemetry state={dynamic_state}, " + f"expected one of {sorted(accepted_states)}" + ) return errors @@ -306,6 +348,7 @@ def run_case( result, case.get("expected", {}), case.get("expected_motion"), + case.get("expected_dynamic_mode"), ) ) seat_config = (result.get("function_configs") or {}).get( @@ -359,6 +402,18 @@ def run_case( record["errors"].extend( validate_physical_state(state, case.get("expected", {}), tolerance) ) + expected_dynamic_mode = case.get("expected_dynamic_mode") + if expected_dynamic_mode: + actual_dynamic_mode = dig( + state, "actuator_state", "passenger", "dynamic_mode" + ) or {} + for field in ("mode_id", "state"): + expected_value = expected_dynamic_mode[field] + if actual_dynamic_mode.get(field) != expected_value: + record["errors"].append( + f"dynamic_mode.{field}={actual_dynamic_mode.get(field)}, " + f"expected={expected_value}" + ) record["physical_state"] = state.get("physical_state") record["status"] = "passed" if not record["errors"] else "failed" except Exception as exc: # continue the suite after transport and parse errors diff --git a/tools/zcan/seat_self_repair_bridge.py b/tools/zcan/seat_self_repair_bridge.py index cd48966..970a05d 100644 --- a/tools/zcan/seat_self_repair_bridge.py +++ b/tools/zcan/seat_self_repair_bridge.py @@ -1,7 +1,7 @@ -"""ZCANPRO bridge for the standalone selectable seat-function GUI. +"""ZCANPRO bridge for the web-console self-repair hardware workflow. Run this file in ZCANPRO's extension-script window and leave it running. The -normal Windows GUI writes armed JSON requests into ``seat_function_runtime``; +web console writes armed JSON requests into the repository self-repair runtime; this bridge is the only process that imports and calls ``zcanpro``. """ @@ -18,6 +18,19 @@ import time import zcanpro +# ZCANPRO executes extension scripts without adding the script directory or +# the firmware HIL helpers to ``sys.path``. A fresh ZCANPRO process therefore +# could only start this bridge when another script happened to have imported +# ``hil_common`` first. Resolve the repository helper explicitly so bridge +# startup is deterministic after a reboot. +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +REPOSITORY_ROOT = os.path.dirname(os.path.dirname(BASE_DIR)) +HIL_COMMON_DIR = os.path.join( + REPOSITORY_ROOT, "firmware", "t2g", "Seat_Controller_demo", + "Tests", "manual_hil") +if HIL_COMMON_DIR not in sys.path: + sys.path.insert(0, HIL_COMMON_DIR) + if "hil_common" in sys.modules: _hil_common = importlib.reload(sys.modules["hil_common"]) else: @@ -31,15 +44,15 @@ parse_303 = _hil_common.parse_303 parse_304 = _hil_common.parse_304 parse_305 = _hil_common.parse_305 - -BASE_DIR = os.path.dirname(os.path.abspath(__file__)) -RUNTIME_DIR = os.path.join(BASE_DIR, "seat_function_runtime") +RUNTIME_DIR = os.path.join( + REPOSITORY_ROOT, "artifacts", "tmp", "self-repair", "runtime") PENDING_DIR = os.path.join(RUNTIME_DIR, "requests", "pending") PROCESSING_DIR = os.path.join(RUNTIME_DIR, "requests", "processing") COMPLETED_DIR = os.path.join(RUNTIME_DIR, "requests", "completed") STATUS_PATH = os.path.join(RUNTIME_DIR, "bridge_status.json") EMERGENCY_PATH = os.path.join(RUNTIME_DIR, "emergency_stop.json") -LOG_ROOT = os.path.join(BASE_DIR, "logs", "05_seat_function_gui") +LOG_ROOT = os.path.join( + REPOSITORY_ROOT, "artifacts", "self-repair", "hardware") CONFIRMED_MAX_HALL = (480, 374, 917, 647) POSITION_TIMEOUT_MS = 30000 NORMAL_TASK_MIN_OBSERVE_S = 5.0 @@ -81,7 +94,14 @@ SELF_HEAL_HOOK_CASES = { "normal_task": "用户调整腿托后调用刚保存的舒适位置", "fault_reaction": "CRC校验失败,腿托调用目标被挂起", "resume_reaction": "重建双槽后继续执行原腿托舒适位置", - "demo_motor": 3, "demo_delta": 2200, "prelude_delta": 2800, + # Keep both physical legs inside the connected seat's repeatedly + # observed M3 travel window. The CRC scenario needs a real saved move + # and a later restored move; it does not require a long-range pose. + # Save one reachable short-travel comfort pose, retreat from it, then + # use the saved pose itself as the post-repair recall target. This is + # both semantically accurate and independent of the connected seat's + # much shorter M3 internal-limit window. + "demo_motor": 3, "demo_delta": 200, "prelude_delta": 200, "normal_observe_s": NORMAL_TASK_MIN_OBSERVE_S, "inject": "向真实SMV8备用槽写入更新序号但CRC损坏的记录", "repair": "保留旧有效槽并以更高序号重新原子提交SMV8冗余记录", @@ -142,7 +162,7 @@ HOME_LEG_TIMEOUT_S = 120 SIGNAL_WINDOW_S = 2.5 HEATER_CURRENT_ACTIVE_DELTA_RAW = 500 FAN_CURRENT_ACTIVE_DELTA_RAW = 40 -BRIDGE_VERSION = "2026-08-07-reset-home-far-target-v15" +BRIDGE_VERSION = "2026-08-09-real-self-heal-v32" HARDWARE_MOTOR_PINS = { 0: ("JA1-4", "JA1-5", "JC1-9"), 1: ("JB1-6", "JB1-8", "JC1-15"), @@ -177,9 +197,18 @@ def _atomic_json(path, value): for attempt in range(8): try: os.replace(temporary, path) - return + return True except PermissionError: if attempt >= 7: + # The status file is a best-effort telemetry snapshot. + # Windows readers may briefly deny FILE_SHARE_DELETE; + # dropping one snapshot is safe because the 10 ms bridge + # loop republishes the retained state (and last_result). + # Raising here would terminate the live ZCAN bridge and + # lose the in-flight request result. + if os.path.normcase(os.path.abspath(path)) == \ + os.path.normcase(os.path.abspath(STATUS_PATH)): + return False raise # The web console polls this file frequently. Windows can # briefly deny replacement while a reader is closing it. @@ -189,6 +218,7 @@ def _atomic_json(path, value): os.remove(temporary) except OSError: pass + return False def _read_json(path): @@ -287,6 +317,7 @@ class SeatFunctionBridge(object): self.latest_currents = [None, None, None, None] self.latest_thermal_current = None self.latest_thermal = None + self.latest_dynamic = None self.frame_epochs = {} self.motor_current_history = [[], [], [], []] self.motor_hall_history = [[], [], [], []] @@ -390,6 +421,7 @@ class SeatFunctionBridge(object): "currents": self.latest_currents, "thermal_current": self.latest_thermal_current, "thermal": self.latest_thermal, + "dynamic": self.latest_dynamic, "frame_epochs": self.frame_epochs, "signal_window": self.signal_window(), "last_result": self.last_result, @@ -459,6 +491,16 @@ class SeatFunctionBridge(object): "raw": value["heater_raw"], "valid": value["heater_sample_valid"], }, received_epoch) + elif can_id == 0x306 and len(data) >= 8: + self.latest_dynamic = { + "mode_id": data[0], + "state": data[1], + "phase": data[2], + "active_mask": data[3] & 0x0F, + "fault_mask": (data[3] >> 4) & 0x0F, + "cycle_index": data[4] | (data[5] << 8), + "phase_elapsed_ms": data[6] | (data[7] << 8), + } elif can_id == 0x4FA and len(data) >= 1: self.latest_thermal = data output.append((can_id, data)) @@ -484,11 +526,21 @@ class SeatFunctionBridge(object): return False self.message("执行GUI紧急STOP_ALL %s" % request_id) sequence = self.next_sequence() - self.transmit(0x300, command_payload(0x09, 0, 0, sequence), - "GUI EMERGENCY STOP_ALL") + # A silent or disconnected CAN bus must not kill the long-running + # bridge. The request still interrupts any active workflow, while + # each shutdown frame is attempted independently so observation can + # resume after a firmware flash or a temporary bus interruption. + try: + self.transmit(0x300, command_payload(0x09, 0, 0, sequence), + "GUI EMERGENCY STOP_ALL") + except Exception as error: + self.message("GUI STOP_ALL发送失败:%r" % error) if request.get("thermal_off", True): - self.transmit(0x42A, [0x0A, 0, 0, 0, 0, 0, 0, 0], - "GUI emergency thermal off") + try: + self.transmit(0x42A, [0x0A, 0, 0, 0, 0, 0, 0, 0], + "GUI emergency thermal off") + except Exception as error: + self.message("GUI thermal off发送失败:%r" % error) return True def wait(self, predicate, timeout_s, allow_emergency=True): @@ -550,11 +602,12 @@ class SeatFunctionBridge(object): current = int(status.get("position", 0)) if not status.get("position_valid"): return None - magnitude = max(600, min(2800, int(delta))) + magnitude = max(100, min(2800, int(delta))) target = current + magnitude if current <= 5000 else current - magnitude - target = max(800, min(9200, target)) - if abs(target - current) < 500: - target = 8000 if current < 5000 else 2000 + target = max(100, min(9200, target)) + if abs(target - current) < 100: + target = min(9200, current + 100) if current < 5000 else \ + max(100, current - 100) return {"motor": int(motor), "start": current, "target": target, "sequence": None, "ack": None} @@ -789,6 +842,7 @@ class SeatFunctionBridge(object): # signal only when each direction produces Hall movement at least once. # This remains sensitive to a disconnected/intermittent pin, for which # one direction (or both) never produces a valid edge in either cycle. + hall_direction_ok = { direction: any( item["direction"] == direction and @@ -816,6 +870,75 @@ class SeatFunctionBridge(object): "hall_ok": hall_ok, "hall_direction_ok": hall_direction_ok, "runs": runs} + def _depart_legrest_endpoint_for_home(self): + """Move M3 off its hard stop with a bounded adaptive timed profile. + + Absolute homing cannot prove an endpoint when the loaded legrest is + statically wedged and its first Hall edge never arrives. The active + pin diagnostic normally releases this bench with a bounded near/far + pair at 60% PWM. Loaded repetitions can need additional breakaway + torque, so retry at 75% and finally the ECU's normal 90% duty. Every + leg remains limited to 900 ms and is followed by STOP; multiple real + Hall edges are still required before proceeding. + """ + motor = 3 + attempts = [] + initial = self.latest_diagnostics[motor] + initial_hall = None if initial is None else int(initial["hall"]) + for attempt, duty_x10 in enumerate((600, 750, 900), start=1): + for direction in (2, 1): + before = self.latest_diagnostics[motor] + before_hall = None if before is None else int(before["hall"]) + sequence = self.next_sequence() + state, response = self.send_command( + command_payload(0x03, motor, direction, sequence, + 900, duty_x10), + 1, 3.0, + "M3 HOME breakaway attempt=%d direction=%d" % + (attempt, direction)) + if state == "EMERGENCY": + return False, { + "summary": "M3端点脱离期间收到紧急停止", + "attempts": attempts, + } + self.capture(1.45) + stop_sequence = self.next_sequence() + self.send_command( + command_payload(0x08, motor, 0, stop_sequence), + 1, 2.0, "M3 HOME breakaway bounded stop") + self.capture(0.35) + after = self.latest_diagnostics[motor] + after_hall = None if after is None else int(after["hall"]) + hall_delta = None if before_hall is None or \ + after_hall is None else abs(after_hall - before_hall) + cumulative_hall_delta = None if initial_hall is None or \ + after_hall is None else abs(after_hall - initial_hall) + accepted = (state == "OK" and response is not None and + int(response.get("reject", 1)) == 0) + attempts.append({ + "attempt": attempt, + "direction": direction, + "duty_percent": duty_x10 // 10, + "accepted": accepted, + "hall_before": before_hall, + "hall_after": after_hall, + "hall_delta": hall_delta, + "cumulative_hall_delta": cumulative_hall_delta, + }) + if(direction == 1 and accepted and + ((hall_delta is not None and hall_delta >= 3) or + (cumulative_hall_delta is not None and + cumulative_hall_delta >= 2))): + return True, { + "summary": "M3已用%d%%受控近/远端序列脱离硬端点" % + (duty_x10 // 10), + "attempts": attempts, + } + return False, { + "summary": "M3受控脱离重试后仍无真实Hall边沿", + "attempts": attempts, + } + def execute_hardware_diagnostic(self, request): request_id = request.get("request_id") pin_results = { @@ -884,7 +1007,12 @@ class SeatFunctionBridge(object): self.transmit(0x42A, [0x0A, 0, 0, 0, 0, 0, 0, 0], "HW fan safe off") - # Heater branch: low level only, bounded to three seconds. + # Heater branch: use high level for a short, bounded interval. + # The heater PWM is 100 Hz while 0x305 is published every 100 ms; + # at low duty those periods can stay phase-aligned on the OFF + # portion and hide a healthy load. High duty breaks that sampling + # blind spot while the three-second bound keeps the diagnostic + # thermally safe. self.capture(0.5) heater_baseline = int((self.latest_thermal_current or {}).get( "heater_raw", 0)) @@ -893,8 +1021,8 @@ class SeatFunctionBridge(object): "HW heater mode") self.transmit(0x2AA, [0x01, 0, 0x1B, 0, 0, 0, 0, 0], "HW heater config") - self.transmit(0x29E, [0x12, 0, 0x10, 0, 0, 0, 0, 0], - "HW heater level 1") + self.transmit(0x29E, [0x12, 0, 0x30, 0, 0, 0, 0, 0], + "HW heater level 3 diagnostic pulse") self.capture(3.0) heater_samples = [int(sample.get("raw", 0)) for _, sample in self.heater_current_history @@ -1005,6 +1133,283 @@ class SeatFunctionBridge(object): expected_position)) return issues + def execute_command_plan(self, request): + """Execute a compiler-produced normal seat plan with this CAN owner. + + The web server has already validated the FunctionConfig and CommandPlan. + This boundary validates the small physical allow-list again, replaces + placeholder motion sequences, and requires ECU acknowledgement plus + the matching physical feedback before reporting PASS. + """ + payload = request.get("payload") or {} + commands = payload.get("commands") or [] + operations = payload.get("operations") or [] + operation_by_id = dict((item.get("id"), item) for item in operations) + if not commands or not operations: + return "BLOCKED", {"summary": "座椅命令计划为空"} + + allowed_messages = { + "T2G_Seat_Move_Command_300": 0x300, + "T2G_Seat_Thermal_Control_29E": 0x29E, + "T2G_Seat_Thermal_Mode_3CE": 0x3CE, + } + for command in commands: + message = command.get("message") + if message not in allowed_messages or \ + int(command.get("frame_id", -1)) != allowed_messages[message]: + return "BLOCKED", { + "summary": "桥接拒绝未授权CAN消息 %s" % message, + } + data = command.get("data") or [] + if len(data) != 8 or any(int(value) < 0 or int(value) > 255 + for value in data): + return "BLOCKED", {"summary": "%s的CAN数据无效" % message} + refs = str(command.get("operation_ref", "")).split(",") + if not refs or any(ref not in operation_by_id for ref in refs): + return "BLOCKED", {"summary": "%s引用了未知操作" % message} + + self.capture(0.8) + if self.latest_system is None: + return "BLOCKED", {"summary": "未收到0x301系统反馈"} + motion_commands = [ + command for command in commands + if command.get("message") == "T2G_Seat_Move_Command_300" and + int((command.get("signals") or {}).get("Opcode", -1)) not in (0x09, 0x0F) + ] + if motion_commands and not self.stop_all_sync(): + return "FAIL", { + "summary": "自然语言座椅控制前的STOP_ALL无有效ACK", + "stop_all_attempted": True, + } + + results = [] + for command in commands: + if self.check_emergency(): + return "STOPPED", { + "summary": "座椅控制过程中收到紧急停止", + "results": results, + "stop_all_attempted": bool(motion_commands), + } + message = command["message"] + refs = str(command["operation_ref"]).split(",") + referenced = [operation_by_id[ref] for ref in refs] + signals = command.get("signals") or {} + + if message == "T2G_Seat_Thermal_Mode_3CE": + data = [int(value) & 0xFF for value in command["data"]] + if (data[0] & ~0x30) or any(data[1:]): + return "BLOCKED", {"summary": "3CE包含未授权位"} + self.transmit(0x3CE, data, command.get("id", "thermal mode")) + results.append({ + "command_id": command.get("id"), "result": "PASS", + "summary": "热管理手动模式已下发", + }) + continue + + if message == "T2G_Seat_Thermal_Control_29E": + data = [int(value) & 0xFF for value in command["data"]] + if (data[0] & ~0x3F) or any(data[index] for index in (1, 3, 4, 5, 6, 7)): + return "BLOCKED", {"summary": "29E包含未授权位"} + expected = {} + for operation in referenced: + capability = operation.get("capability") + state = (operation.get("parameters") or {}).get("state") + level = int((operation.get("parameters") or {}).get("level", 1)) + raw = 1 if state == "off" else min(level, 3) + 1 + if capability == "seat.set_ventilation": + expected["ventilation"] = raw + elif capability == "seat.set_heating": + expected["heating"] = raw + else: + return "BLOCKED", { + "summary": "29E引用了非热管理操作 %s" % capability, + } + self.transmit(0x29E, data, command.get("id", "thermal control")) + + def thermal_predicate(can_id, frame_data): + if can_id != 0x4FA or len(frame_data) < 1: + return None + ventilation = frame_data[0] & 0x07 + heating = (frame_data[0] >> 3) & 0x07 + if ("ventilation" in expected and + ventilation != expected["ventilation"]): + return None + if "heating" in expected and heating != expected["heating"]: + return None + return list(frame_data) + + wait_state, feedback = self.wait( + thermal_predicate, + max(1.0, float((command.get("completion") or {}).get( + "timeout_ms", 3000)) / 1000.0)) + if wait_state != "OK" or feedback is None: + return "FAIL", { + "summary": "0x4FA未确认热管理目标", + "results": results, + "expected": expected, + } + results.append({ + "command_id": command.get("id"), "result": "PASS", + "summary": "0x4FA已确认热管理目标", "feedback": feedback, + }) + continue + + opcode = int(signals.get("Opcode", -1)) + motor = int(signals.get("Motor_Selector", -1)) + direction = int(signals.get("Direction", 0)) + param_a = int(signals.get("Param_A", 0)) + param_b = int(signals.get("Param_B", 0)) + if opcode not in (0x01, 0x03, 0x09, 0x0B, 0x0E, 0x0F) or \ + motor not in range(4): + return "BLOCKED", { + "summary": "0x300操作码或电机号未授权:opcode=0x%02X motor=%d" % + (opcode, motor), + } + + if opcode in (0x01, 0x03) and self.latest_system is not None and \ + not (self.latest_system["position_valid_mask"] & (1 << motor)): + if not payload.get("allow_auto_home", False): + return "BLOCKED", { + "summary": "M%d位置无效且请求未授权自动归零" % motor, + } + home_result, home_details = self.execute_initialize_known_ranges({ + "payload": {"force_all_axes": False}, + }) + if home_result != "PASS": + return home_result, { + "summary": "自然语言控制前自动归零失败:%s" % + home_details.get("summary", ""), + "auto_home": home_details, + } + + completion = command.get("completion") or {} + target = int(completion.get("value", param_a)) + tolerance = max(0, int(completion.get("tolerance", 100))) + current = self.latest_motors[motor] or {} + already_at_target = ( + opcode in (0x01, 0x0B) and + bool(current.get("position_valid")) and + not bool(current.get("active")) and + abs(int(current.get("position", -100000)) - target) <= tolerance) + if opcode == 0x0B: + already_at_target = already_at_target and bool(current.get("near")) + if already_at_target: + results.append({ + "command_id": command.get("id"), "result": "PASS", + "summary": "M%d已由真实CAN确认处于目标位置,未重复驱动机械端点" % motor, + "terminal": current, "motion_skipped": True, + "skip_reason": "PHYSICAL_TARGET_ALREADY_CONFIRMED", + }) + continue + + sequence = self.next_sequence() + expected_ack = 4 if opcode == 0x09 else 1 + send_state, acknowledgement = self.send_command( + command_payload(opcode, motor, direction, sequence, + param_a, param_b), + expected_ack, 2.5, command.get("id", "orchestration")) + if send_state == "EMERGENCY": + return "STOPPED", {"summary": "下发时收到紧急停止"} + if send_state != "OK" or acknowledgement is None or \ + acknowledgement.get("reject") != 0: + self.stop_all_sync() + return "FAIL", { + "summary": "0x300命令未被ECU接受", + "command_id": command.get("id"), + "acknowledgement": acknowledgement, + "stop_all_attempted": True, + } + + if opcode == 0x09: + results.append({ + "command_id": command.get("id"), "result": "PASS", + "summary": "STOP_ALL已确认", + "acknowledgement": acknowledgement, + }) + continue + + if opcode in (0x0E, 0x0F): + mode_id = 0 if opcode == 0x0F else param_a + accepted_states = set( + (command.get("completion") or {}).get("accepted_states", [1, 2])) + + def dynamic_predicate(can_id, frame_data): + if can_id != 0x306 or len(frame_data) < 8: + return None + if opcode == 0x0F: + matched = frame_data[0] == 0 and frame_data[1] == 0 + else: + matched = frame_data[0] == mode_id and \ + frame_data[1] in accepted_states + return list(frame_data) if matched else None + + dynamic_state, dynamic_feedback = self.wait( + dynamic_predicate, + max(1.0, float((command.get("completion") or {}).get( + "timeout_ms", 5000)) / 1000.0)) + if dynamic_state != "OK" or dynamic_feedback is None: + self.stop_all_sync() + return "FAIL", { + "summary": "0x306未确认动态模式状态", + "mode_id": mode_id, + "stop_all_attempted": True, + } + results.append({ + "command_id": command.get("id"), "result": "PASS", + "summary": "0x301/0x306已确认动态模式", + "feedback": dynamic_feedback, + }) + continue + + timeout_s = max( + 1.0, float((command.get("completion") or {}).get( + "timeout_ms", POSITION_TIMEOUT_MS)) / 1000.0) + + def motor_predicate(can_id, frame_data): + if can_id != 0x302: + return None + value = parse_302(frame_data) + if value is None or value["motor"] != motor or \ + value["sequence"] != sequence: + return None + if not value["active"] and value["task"] in (6, 7): + return value + return None + + motor_state, terminal = self.wait(motor_predicate, timeout_s + 2.0) + passed = (motor_state == "OK" and terminal is not None and + terminal.get("task") == 6 and + terminal.get("result") in (2, 4)) + if opcode in (0x01, 0x0B): + passed = (passed and terminal.get("position_valid") and + abs(int(terminal.get("position", -100000)) - target) <= + tolerance) + if not passed: + self.stop_all_sync() + return "FAIL", { + "summary": "M%d运动反馈未达到目标" % motor, + "command_id": command.get("id"), + "target": target, "tolerance": tolerance, + "terminal": terminal, "stop_all_attempted": True, + } + results.append({ + "command_id": command.get("id"), "result": "PASS", + "summary": "M%d物理反馈已达到目标" % motor, + "terminal": terminal, + }) + + self.capture(0.3) + return "PASS", { + "summary": "ZCANPRO共享桥接已完成%d条座椅命令并验证实物反馈" % + len(commands), + "results": results, + "system": self.latest_system, + "motors": self.latest_motors, + "thermal": self.latest_thermal, + "dynamic": self.latest_dynamic, + "stop_all_attempted": bool(motion_commands), + } + def execute_mode(self, request): payload = request.get("payload") or {} axes = payload.get("axes") or [] @@ -1174,6 +1579,7 @@ class SeatFunctionBridge(object): def execute_initialize_known_ranges(self, request): payload = request.get("payload") or request force_all_axes = bool(payload.get("force_all_axes", False)) + home_nonzero_axes = bool(payload.get("home_nonzero_axes", False)) if not self.stop_all_sync(): return "FAIL", {"summary": "基线STOP_ALL无有效ACK"} if not self.capture(1.2): @@ -1182,13 +1588,27 @@ class SeatFunctionBridge(object): self.latest_system["position_valid_mask"] homed = [] for motor, expected_max in enumerate(CONFIRMED_MAX_HALL): - if not force_all_axes and (initial_mask & (1 << motor)) != 0: + initial_status = self.latest_motors[motor] + initial_diag = self.latest_diagnostics[motor] + already_zero = bool( + initial_status is not None and + initial_status.get("position_valid") and + initial_status.get("near") and + int(initial_status.get("position", 65535)) <= 100 and + initial_diag is not None and + int(initial_diag.get("hall", 65535)) <= 2) + position_valid = (initial_mask & (1 << motor)) != 0 + should_home = (force_all_axes or not position_valid or + (home_nonzero_axes and not already_zero)) + if not should_home: homed.append({ "motor": motor, "result": "ALREADY_VALID_NOT_HOMED", - "status": self.latest_motors[motor], - "diagnostic": self.latest_diagnostics[motor], - "note": "位置记录有效,未执行机械归零", + "status": initial_status, + "diagnostic": initial_diag, + "note": ("位置已有效且处于零位,未重复机械归零" if + already_zero else + "位置记录有效,未执行机械归零"), }) continue if self.check_emergency(): @@ -1196,8 +1616,6 @@ class SeatFunctionBridge(object): "summary": "回最近端过程中收到紧急停止", "axes": homed, } - initial_status = self.latest_motors[motor] - initial_diag = self.latest_diagnostics[motor] initial_current = self.latest_currents[motor] initial_status = dict(initial_status) \ if initial_status is not None else None @@ -1210,6 +1628,28 @@ class SeatFunctionBridge(object): if initial_diag is not None: observed_halls.append(int(initial_diag["hall"])) current_peak = initial_current + endpoint_departure = None + if motor == 3 and (initial_status is None or + not initial_status.get("position_valid") or + initial_status.get("near") or + int(initial_status.get("position", 0)) <= 300): + departure_ok, endpoint_departure = \ + self._depart_legrest_endpoint_for_home() + if not departure_ok: + self.stop_all_sync() + homed.append({ + "motor": motor, + "result": "FAIL", + "endpoint_departure": endpoint_departure, + "initial_status": initial_status, + "initial_diagnostic": initial_diag, + "initial_current": initial_current, + }) + return "FAIL", { + "summary": endpoint_departure.get( + "summary", "M3端点脱离失败"), + "axes": homed, + } home_started = time.monotonic() sequence = self.next_sequence() state, response = self.send_command( @@ -1299,6 +1739,7 @@ class SeatFunctionBridge(object): "initial_status": initial_status, "initial_diagnostic": initial_diag, "initial_current": initial_current, + "endpoint_departure": endpoint_departure, "peak_current": current_peak, "home_elapsed_s": round(time.monotonic() - home_started, 3), "observed_hall_values": distinct_halls, @@ -1371,6 +1812,7 @@ class SeatFunctionBridge(object): "initial_position_valid_mask": initial_mask, "final_position_valid_mask": final_mask, "force_all_axes": force_all_axes, + "home_nonzero_axes": home_nonzero_axes, "actually_homed_axes": actually_homed, "axes": homed, "range_issues": range_issues, @@ -1517,10 +1959,17 @@ class SeatFunctionBridge(object): arm_payload = self._self_heal_hook_payload( case_index, 0, arm_token) self.drain() - self.transmit(SELF_HEAL_HOOK_REQUEST_ID, arm_payload, - "ARM " + note) - arm_ack = self._wait_self_heal_hook_response( - case_index, 0, arm_token, 3.0) + arm_ack = None + # A controlled watchdog case deliberately makes CAN disappear between + # INJECT and REPAIR. Repeat the idempotent ARM exchange while the ECU + # reboots instead of classifying that bounded outage as CAN failure. + arm_deadline = time.monotonic() + 12.0 + while arm_ack is None and time.monotonic() < arm_deadline: + self.transmit(SELF_HEAL_HOOK_REQUEST_ID, arm_payload, + "ARM " + note) + arm_ack = self._wait_self_heal_hook_response( + case_index, 0, arm_token, + min(2.0, max(0.1, arm_deadline - time.monotonic()))) if arm_ack is None or arm_ack["result"] != 0: return None if after_arm is not None and not after_arm(): @@ -1579,6 +2028,17 @@ class SeatFunctionBridge(object): self._publish_healing_progress( request_id, case_id, "BASELINE", "正常任务持续运行", prelude_telemetry["bench_reaction"], prelude_telemetry) + departure_ok, departure = \ + self._depart_legrest_endpoint_for_home() + base["normal_task_endpoint_departure"] = departure + if not departure_ok: + self._publish_healing_progress( + request_id, case_id, "FAILED", "正常任务未建立", + "CRC用例的故障前腿托无法真实离开机械端点,未注入故障", + dict(base, request_feedback_match=False)) + return "FAIL", { + "summary": departure.get( + "summary", "CRC用例腿托端点脱离失败")} prelude = self._demo_axis_task( profile["demo_motor"], profile.get("prelude_delta", 900)) if (prelude is None or @@ -1590,11 +2050,49 @@ class SeatFunctionBridge(object): "CRC用例的故障前腿托调整未完成,未注入故障", dict(base, request_feedback_match=False)) return "FAIL", {"summary": "CRC用例的正常腿托调整未完成"} - self.capture(1.0) - if "demo_endpoints" in profile: + # The ECU marks SMV8 dirty before motion and only commits the + # settled clean record after a 3000 ms quiet period. Injecting + # CRC corruption earlier is correctly rejected by the firmware + # because there is not yet a saved comfort position to protect. + self.capture(3.5) + saved_target = int(prelude["target"]) + self.capture(0.35) + current_status = self.latest_motors[profile["demo_motor"]] or {} + retreat_start = int(current_status.get( + "position", saved_target)) + retreat_target = max(100, retreat_start - 200) + retreat = { + "motor": int(profile["demo_motor"]), + "start": retreat_start, + "target": retreat_target, + "sequence": None, + "ack": None, + } + if (not current_status.get("position_valid") or + not self._start_demo_axis_task( + retreat, "NORMAL TASK leave saved comfort pose") or + not self._wait_demo_axis_task(retreat)): + self._publish_healing_progress( + request_id, case_id, "FAILED", "正常任务未建立", + "CRC用例无法从已保存舒适位安全回退,未注入故障", + dict(base, request_feedback_match=False)) + return "FAIL", {"summary": "CRC用例舒适位回退未完成"} + # Retreat is another persisted position transaction. Wait + # through its clean SMV8 commit before deliberately writing a + # higher-sequence corrupt inactive slot; otherwise the ECU + # correctly rejects the HIL injection while the store is dirty. + self.capture(3.5) + demo_task = { + "motor": int(profile["demo_motor"]), + "start": int(retreat["target"]), + "target": saved_target, + "sequence": None, + "ack": None, + } + if demo_task is None and "demo_endpoints" in profile: demo_task = self._demo_axis_far_endpoint_task( profile["demo_motor"], profile["demo_endpoints"]) - else: + elif demo_task is None: demo_task = self._demo_axis_task( profile["demo_motor"], profile.get("demo_delta", 2000)) if demo_task is None: @@ -1662,6 +2160,19 @@ class SeatFunctionBridge(object): self._publish_healing_progress( request_id, case_id, "BASELINE", "正常任务持续运行", fan_running["bench_reaction"], fan_running) + self.latest_thermal = None + self.transmit(0x2AA, [0x01, 0, 0x1B, 0, 0, 0, 0, 0], + "FI-05 normal fan configuration") + self.transmit(0x29E, [0x25, 0, 0x02, 0, 0, 0, 0, 0], + "FI-05 normal fan gear 2") + if self._wait_thermal_feedback(0x0B, 3.0) is None: + return False + if not self.capture(profile.get("normal_observe_s", 5.5)): + return False + self.latest_thermal = None + self.transmit(0x42A, [0x0A, 0, 0, 0, 0, 0, 0, 0], + "FI-05 user requested fan off") + return self._wait_thermal_feedback(0x09, 3.0) is not None return True try: injection_ack = self._run_self_heal_hook( @@ -1721,6 +2232,16 @@ class SeatFunctionBridge(object): "未收到台架故障钩子成功应答,AI拒绝执行修复", fault) return "FAIL", { "summary": "0x2F0故障注入没有收到有效0x2F1成功应答"} + if case_id == "FI-FIELD-05": + reentry_feedback = self._wait_thermal_feedback(0x0B, 3.0) + fault["fan_reentry_feedback"] = reentry_feedback + if reentry_feedback is None: + self._publish_healing_progress( + request_id, case_id, "FAILED", "风扇异常重启未建立", + "0x2F1已确认注入,但实物0x4FA未出现风扇2挡重入", + fault) + return "FAIL", { + "summary": "风扇重入故障没有形成实物反馈"} self._publish_healing_progress( request_id, case_id, "INJECTED", "实物故障已写入", profile["fault_reaction"], fault) @@ -1738,6 +2259,15 @@ class SeatFunctionBridge(object): profile["fault_code"]) if not self.capture(1.2): return "STOPPED", {"summary": "诊断展示阶段收到紧急停止"} + if case_id == "FI-FIELD-06": + # The real watchdog upper limit is 3200 ticks. The generic + # 1.8 s + 1.2 s display window ends just before expiry, which + # can race the repair request against the pending reset. Keep + # observing through the actual reboot; ARM below already + # retries idempotently while CAN is temporarily absent. + if not self.capture(2.0): + return "STOPPED", { + "summary": "WDT复位观察阶段收到紧急停止"} repairing = dict(fault) repairing["repair_action"] = profile["repair"] @@ -1809,6 +2339,33 @@ class SeatFunctionBridge(object): profile["index"], 3, 120.0, "SELF HEAL VERIFY HOOK %s" % case_id) protection_ok = verify_ack is not None and verify_ack["result"] == 0 + fan_cycle_evidence = [] + if protection_ok and case_id == "FI-FIELD-05": + for cycle in range(1, 4): + self.latest_thermal = None + self.transmit( + 0x2AA, [0x01, 0, 0x1B, 0, 0, 0, 0, 0], + "FI-05 verify cycle %d config" % cycle) + self.transmit( + 0x29E, [0x25, 0, 0x01, 0, 0, 0, 0, 0], + "FI-05 verify cycle %d fan on" % cycle) + on_feedback = self._wait_thermal_feedback(0x0A, 3.0) + if on_feedback is not None: + self.capture(0.8) + self.latest_thermal = None + self.transmit( + 0x42A, [0x0A, 0, 0, 0, 0, 0, 0, 0], + "FI-05 verify cycle %d fan off" % cycle) + off_feedback = self._wait_thermal_feedback(0x09, 3.0) + cycle_ok = on_feedback is not None and \ + off_feedback is not None + fan_cycle_evidence.append({ + "cycle": cycle, "pass": cycle_ok, + "on_feedback": on_feedback, + "off_feedback": off_feedback, + }) + protection_ok = protection_ok and cycle_ok + verifying["fan_stop_cycles"] = fan_cycle_evidence self.message( "SAFETY VERIFY %s: %s" % ("PASS" if protection_ok else "FAIL", @@ -2145,6 +2702,8 @@ class SeatFunctionBridge(object): if not valid: result = "BLOCKED" details = {"summary": "请求已过期或schema无效,未驱动任何输出"} + elif request.get("action") == "execute_command_plan": + result, details = self.execute_command_plan(request) elif request.get("action") == "execute_mode": result, details = self.execute_mode(request) elif request.get("action") == "execute_thermal":