Compare commits
65 Commits
zelda.upda
...
master
| Author | SHA1 | Date |
|---|---|---|
|
|
f0bed712e6 | |
|
|
f1de8cb627 | |
|
|
b50dc96ce2 | |
|
|
744c206743 | |
|
|
a23f2155dc | |
|
|
25918fcb62 | |
|
|
607882343a | |
|
|
8cd93c578e | |
|
|
755297e5b0 | |
|
|
a3ec46db0a | |
|
|
ab7ccbe194 | |
|
|
4eb3dda0e1 | |
|
|
1cd6b3a108 | |
|
|
935e88bb72 | |
|
|
2675a60ffc | |
|
|
95e4e833b5 | |
|
|
8ad0ba9c25 | |
|
|
574e92bd23 | |
|
|
925823c525 | |
|
|
a594ba5ba2 | |
|
|
683f85efd4 | |
|
|
6a1e19ec7f | |
|
|
8e54ca0ceb | |
|
|
0f2d5db8a3 | |
|
|
980676fe16 | |
|
|
9d536955e4 | |
|
|
a5fa0cbcda | |
|
|
0a4332729d | |
|
|
2f1e26d3f6 | |
|
|
3d1b43e200 | |
|
|
8d86fc2182 | |
|
|
54b8b9737b | |
|
|
42c5791da8 | |
|
|
8d5199342d | |
|
|
beccf5796c | |
|
|
baa3216c69 | |
|
|
de351f0877 | |
|
|
2c94e91668 | |
|
|
b22c9b9cc5 | |
|
|
f494367683 | |
|
|
61124cd9bb | |
|
|
78066f624e | |
|
|
d7b7a61511 | |
|
|
8f30081e55 | |
|
|
a0bfb19a34 | |
|
|
7e369785d5 | |
|
|
54046ac676 | |
|
|
9f921750fc | |
|
|
bd0d4fa13b | |
|
|
f5362e54ef | |
|
|
17dc0c3374 | |
|
|
29dc787c65 | |
|
|
6ccf5e9e8a | |
|
|
5736166da3 | |
|
|
7be6a12edc | |
|
|
70436f737f | |
|
|
25162be83d | |
|
|
06027e8f23 | |
|
|
8c7a24d31c | |
|
|
1f08e2b503 | |
|
|
9d77dfc5d6 | |
|
|
24bd605b7c | |
|
|
9183540976 | |
|
|
790cab255d | |
|
|
487f4227d8 |
|
|
@ -3,6 +3,7 @@
|
|||
namespace Modules\Admin\app\Http\Controllers;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Http\Request;
|
||||
use Modules\Admin\app\Models\Category;
|
||||
|
||||
|
|
@ -29,4 +30,45 @@ class CategoryController extends Controller
|
|||
$data = Category::where('c_type', '=', $type)->where('c_active', '=', 1)->select('id', 'c_code', 'c_name', 'c_value', 'c_type')->get();
|
||||
return $data;
|
||||
}
|
||||
|
||||
public function workDays()
|
||||
{
|
||||
$saturday_work_schedules = Category::where('c_type', 'SATURDAY_WORK_SCHEDULE')
|
||||
->get();
|
||||
|
||||
return response()->json([
|
||||
'data' => $saturday_work_schedules,
|
||||
'status' => true
|
||||
]);
|
||||
}
|
||||
|
||||
public function updateWorkDays(Request $request)
|
||||
{
|
||||
$request->validate([
|
||||
'c_code' => 'required|date_format:d-m-Y',
|
||||
]);
|
||||
|
||||
$schedule = Category::where('c_type', 'SATURDAY_WORK_SCHEDULE')->first();
|
||||
|
||||
if (!$schedule) {
|
||||
$schedule = Category::create([
|
||||
'c_type' => 'SATURDAY_WORK_SCHEDULE',
|
||||
'c_name' => "Ngày bắt đầu làm việc thứ 7 trong năm",
|
||||
'c_code' => $request->c_code,
|
||||
'c_value' => Carbon::now()->year,
|
||||
'c_active' => true,
|
||||
'created_at' => now(),
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
} else {
|
||||
$schedule->update([
|
||||
'c_code' => $request->c_code,
|
||||
]);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'status' => true,
|
||||
'message' => 'Saturday work schedule updated successfully'
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,359 @@
|
|||
<?php
|
||||
|
||||
namespace Modules\Admin\app\Http\Controllers;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Traits\HasFilterRequest;
|
||||
use App\Traits\HasOrderByRequest;
|
||||
use App\Traits\HasSearchRequest;
|
||||
use Illuminate\Http\Request;
|
||||
use Modules\Admin\app\Models\ElectricityBill;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Barryvdh\DomPDF\Facade\Pdf;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
|
||||
class ElectricityBillController extends Controller
|
||||
{
|
||||
use HasOrderByRequest;
|
||||
use HasFilterRequest;
|
||||
use HasSearchRequest;
|
||||
|
||||
/**
|
||||
* Get all electricity bills with pagination
|
||||
*/
|
||||
public function index(Request $request)
|
||||
{
|
||||
try {
|
||||
$bills = new ElectricityBill;
|
||||
|
||||
// Order by
|
||||
$this->orderByRequest($bills, $request);
|
||||
|
||||
// Filter
|
||||
$this->filterRequest(
|
||||
builder: $bills,
|
||||
request: $request,
|
||||
filterKeys: [
|
||||
'billing_date' => self::F_TEXT,
|
||||
]
|
||||
);
|
||||
|
||||
// Search
|
||||
$this->searchRequest(
|
||||
builder: $bills,
|
||||
value: $request->get('search'),
|
||||
fields: ['billing_date', 'notes']
|
||||
);
|
||||
|
||||
$responseData = $bills
|
||||
->leftJoin('users as creator', 'electricity_bills.created_by', '=', 'creator.id')
|
||||
->leftJoin('users as updater', 'electricity_bills.updated_by', '=', 'updater.id')
|
||||
->orderBy('electricity_bills.billing_date', 'desc')
|
||||
->select(
|
||||
'electricity_bills.*',
|
||||
'creator.name as creator_name',
|
||||
'updater.name as updater_name'
|
||||
)
|
||||
->paginate($request->get('per_page', 15));
|
||||
|
||||
return AbstractController::ResultSuccess($responseData);
|
||||
} catch (\Exception $e) {
|
||||
Log::error('Error fetching electricity bills: ' . $e->getMessage());
|
||||
return AbstractController::ResultError($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create new electricity bill
|
||||
*/
|
||||
public function create(Request $request)
|
||||
{
|
||||
try {
|
||||
$validated = $request->validate([
|
||||
'billing_date' => 'required|string',
|
||||
'previous_reading' => 'required|numeric|min:0',
|
||||
'current_reading' => 'required|numeric|min:0',
|
||||
'unit_price' => 'required|numeric|min:0',
|
||||
'notes' => 'nullable|string',
|
||||
]);
|
||||
|
||||
// Check if billing_date already exists
|
||||
$existingBill = ElectricityBill::where('billing_date', $validated['billing_date'])->first();
|
||||
if ($existingBill) {
|
||||
return AbstractController::ResultError('Bill for this month already exists', 422);
|
||||
}
|
||||
|
||||
// Calculate total amount
|
||||
$consumption = $validated['current_reading'] - $validated['previous_reading'];
|
||||
$totalAmount = $consumption * $validated['unit_price'];
|
||||
|
||||
$bill = ElectricityBill::create([
|
||||
'billing_date' => $validated['billing_date'],
|
||||
'previous_reading' => $validated['previous_reading'],
|
||||
'current_reading' => $validated['current_reading'],
|
||||
'unit_price' => $validated['unit_price'],
|
||||
'total_amount' => $totalAmount,
|
||||
'notes' => $validated['notes'] ?? null,
|
||||
'created_by' => auth('admins')->user()->id ?? null,
|
||||
]);
|
||||
|
||||
return AbstractController::ResultSuccess($bill, 'Electricity bill created successfully');
|
||||
} catch (\Exception $e) {
|
||||
Log::error('Error creating electricity bill: ' . $e->getMessage());
|
||||
return AbstractController::ResultError($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Update electricity bill
|
||||
*/
|
||||
public function update(Request $request, $id)
|
||||
{
|
||||
try {
|
||||
$validated = $request->validate([
|
||||
'billing_date' => 'sometimes|string',
|
||||
'previous_reading' => 'sometimes|numeric|min:0',
|
||||
'current_reading' => 'sometimes|numeric|min:0',
|
||||
'unit_price' => 'sometimes|numeric|min:0',
|
||||
'notes' => 'nullable|string',
|
||||
]);
|
||||
|
||||
$bill = ElectricityBill::findOrFail($id);
|
||||
|
||||
// Check if billing_date already exists (excluding current record)
|
||||
if (isset($validated['billing_date'])) {
|
||||
$existingBill = ElectricityBill::where('billing_date', $validated['billing_date'])
|
||||
->where('id', '!=', $id)
|
||||
->first();
|
||||
if ($existingBill) {
|
||||
return AbstractController::ResultError('Bill for this month already exists', 422);
|
||||
}
|
||||
}
|
||||
|
||||
// Recalculate total if any reading or price changed
|
||||
$previousReading = $validated['previous_reading'] ?? $bill->previous_reading;
|
||||
$currentReading = $validated['current_reading'] ?? $bill->current_reading;
|
||||
$unitPrice = $validated['unit_price'] ?? $bill->unit_price;
|
||||
$consumption = $currentReading - $previousReading;
|
||||
$totalAmount = $consumption * $unitPrice;
|
||||
|
||||
$bill->update(array_merge($validated, [
|
||||
'total_amount' => $totalAmount,
|
||||
'updated_by' => auth('admins')->user()->id ?? null,
|
||||
]));
|
||||
|
||||
return AbstractController::ResultSuccess($bill, 'Electricity bill updated successfully');
|
||||
} catch (\Exception $e) {
|
||||
Log::error('Error updating electricity bill: ' . $e->getMessage());
|
||||
return AbstractController::ResultError($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete electricity bill
|
||||
*/
|
||||
public function delete(Request $request, $id)
|
||||
{
|
||||
try {
|
||||
$bill = ElectricityBill::findOrFail($id);
|
||||
$bill->delete();
|
||||
|
||||
return AbstractController::ResultSuccess(null, 'Electricity bill deleted successfully');
|
||||
} catch (\Exception $e) {
|
||||
Log::error('Error deleting electricity bill: ' . $e->getMessage());
|
||||
return AbstractController::ResultError($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Export electricity bill to PDF
|
||||
*/
|
||||
public function exportPdf(Request $request, $id)
|
||||
{
|
||||
try {
|
||||
$bill = ElectricityBill::findOrFail($id);
|
||||
|
||||
// Get month name from billing_date
|
||||
$consumption = $bill->current_reading - $bill->previous_reading;
|
||||
$totalText = $this->numberToVietnamese($bill->total_amount);
|
||||
$date = Carbon::parse($bill->billing_date);
|
||||
|
||||
$dateNow = 'Ngày ' . $date->day .
|
||||
' tháng ' . $date->month .
|
||||
' năm ' . $date->year;
|
||||
|
||||
// Generate PDF
|
||||
$pdf = Pdf::loadView('admin::admin.electricity_bills.pdf', [
|
||||
'bill' => $bill,
|
||||
'consumption' => $consumption,
|
||||
'dateNow' => $dateNow,
|
||||
'totalText' => $totalText
|
||||
]);
|
||||
|
||||
$fileName = 'electricity_bill_' . $bill->billing_date . '.pdf';
|
||||
$filePath = 'electricity_bills/' . $fileName;
|
||||
|
||||
// đảm bảo folder tồn tại
|
||||
if (!Storage::disk('public')->exists('electricity_bills')) {
|
||||
Storage::disk('public')->makeDirectory('electricity_bills');
|
||||
}
|
||||
|
||||
// 👇 render 1 lần
|
||||
$pdfContent = $pdf->output();
|
||||
|
||||
// 👇 lưu file
|
||||
Storage::disk('public')->put($filePath, $pdfContent);
|
||||
|
||||
// update DB
|
||||
$bill->update(['file_path' => $filePath]);
|
||||
|
||||
// 👇 trả về đúng file đã tạo
|
||||
return response($pdfContent)
|
||||
->header('Content-Type', 'application/pdf')
|
||||
->header('Content-Disposition', 'attachment; filename="' . $fileName . '"');
|
||||
} catch (\Exception $e) {
|
||||
Log::error('Error exporting electricity bill to PDF: ' . $e->getMessage());
|
||||
return AbstractController::ResultError($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get electricity bill by ID
|
||||
*/
|
||||
public function show($id)
|
||||
{
|
||||
try {
|
||||
$bill = ElectricityBill::with(['creator', 'updater'])->findOrFail($id);
|
||||
return AbstractController::ResultSuccess($bill);
|
||||
} catch (\Exception $e) {
|
||||
Log::error('Error fetching electricity bill: ' . $e->getMessage());
|
||||
return AbstractController::ResultError($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Upload an attachment (PDF or image) for an electricity bill
|
||||
*/
|
||||
public function uploadAttachment(Request $request, $id)
|
||||
{
|
||||
try {
|
||||
$request->validate([
|
||||
'file' => 'required|file|mimes:pdf,jpg,jpeg,png,gif,webp|max:10240',
|
||||
]);
|
||||
|
||||
$bill = ElectricityBill::findOrFail($id);
|
||||
|
||||
$file = $request->file('file');
|
||||
$extension = $file->getClientOriginalExtension();
|
||||
$filename = 'bill_' . $bill->id . '_' . time() . '.' . $extension;
|
||||
$directory = 'electricity_bills/attachments';
|
||||
|
||||
if (!Storage::disk('public')->exists($directory)) {
|
||||
Storage::disk('public')->makeDirectory($directory);
|
||||
}
|
||||
|
||||
// Delete old attachment if exists
|
||||
if ($bill->attachment_path && Storage::disk('public')->exists($bill->attachment_path)) {
|
||||
Storage::disk('public')->delete($bill->attachment_path);
|
||||
}
|
||||
|
||||
$path = $file->storeAs($directory, $filename, 'public');
|
||||
|
||||
$bill->update([
|
||||
'attachment_path' => $path,
|
||||
'updated_by' => auth('admins')->user()->id ?? null,
|
||||
]);
|
||||
|
||||
return AbstractController::ResultSuccess($bill, 'Attachment uploaded successfully');
|
||||
} catch (\Exception $e) {
|
||||
Log::error('Error uploading electricity bill attachment: ' . $e->getMessage());
|
||||
return AbstractController::ResultError($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete the attachment of an electricity bill
|
||||
*/
|
||||
public function deleteAttachment($id)
|
||||
{
|
||||
try {
|
||||
$bill = ElectricityBill::findOrFail($id);
|
||||
|
||||
if ($bill->attachment_path && Storage::disk('public')->exists($bill->attachment_path)) {
|
||||
Storage::disk('public')->delete($bill->attachment_path);
|
||||
}
|
||||
|
||||
$bill->update([
|
||||
'attachment_path' => null,
|
||||
'updated_by' => auth('admins')->user()->id ?? null,
|
||||
]);
|
||||
|
||||
return AbstractController::ResultSuccess($bill, 'Attachment deleted successfully');
|
||||
} catch (\Exception $e) {
|
||||
Log::error('Error deleting electricity bill attachment: ' . $e->getMessage());
|
||||
return AbstractController::ResultError($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
function numberToVietnamese($number)
|
||||
{
|
||||
$units = ["", "một", "hai", "ba", "bốn", "năm", "sáu", "bảy", "tám", "chín"];
|
||||
$levels = ["", "nghìn", "triệu", "tỷ"];
|
||||
|
||||
if ($number == 0) return "không đồng";
|
||||
|
||||
$number = (int)$number;
|
||||
$result = "";
|
||||
$level = 0;
|
||||
|
||||
while ($number > 0) {
|
||||
$threeDigits = $number % 1000;
|
||||
if ($threeDigits != 0) {
|
||||
$result = $this->readThreeDigits($threeDigits, $units) . " " . $levels[$level] . " " . $result;
|
||||
}
|
||||
$number = floor($number / 1000);
|
||||
$level++;
|
||||
}
|
||||
|
||||
return ucfirst(trim(preg_replace('/\s+/', ' ', $result))) . " đồng";
|
||||
}
|
||||
|
||||
function readThreeDigits($number, $units)
|
||||
{
|
||||
$hundreds = floor($number / 100);
|
||||
$tens = floor(($number % 100) / 10);
|
||||
$ones = $number % 10;
|
||||
|
||||
$result = "";
|
||||
|
||||
if ($hundreds > 0) {
|
||||
$result .= $units[$hundreds] . " trăm";
|
||||
if ($tens == 0 && $ones > 0) {
|
||||
$result .= " lẻ";
|
||||
}
|
||||
}
|
||||
|
||||
if ($tens > 1) {
|
||||
$result .= " " . $units[$tens] . " mươi";
|
||||
if ($ones == 1) {
|
||||
$result .= " mốt";
|
||||
} elseif ($ones == 5) {
|
||||
$result .= " lăm";
|
||||
} elseif ($ones > 0) {
|
||||
$result .= " " . $units[$ones];
|
||||
}
|
||||
} elseif ($tens == 1) {
|
||||
$result .= " mười";
|
||||
if ($ones == 5) {
|
||||
$result .= " lăm";
|
||||
} elseif ($ones > 0) {
|
||||
$result .= " " . $units[$ones];
|
||||
}
|
||||
} elseif ($ones > 0) {
|
||||
$result .= " " . $units[$ones];
|
||||
}
|
||||
|
||||
return trim($result);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,517 @@
|
|||
<?php
|
||||
|
||||
namespace Modules\Admin\app\Http\Controllers;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Traits\HasFilterRequest;
|
||||
use App\Traits\HasOrderByRequest;
|
||||
use App\Traits\HasSearchRequest;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Carbon;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Modules\Admin\app\Models\Admin;
|
||||
use Modules\Admin\app\Models\Equipment;
|
||||
use Modules\Admin\app\Models\EquipmentAssignment;
|
||||
|
||||
class EquipmentController extends Controller
|
||||
{
|
||||
use HasOrderByRequest;
|
||||
use HasFilterRequest;
|
||||
use HasSearchRequest;
|
||||
|
||||
/**
|
||||
* Get all equipments with pagination + filter + search.
|
||||
*/
|
||||
public function index(Request $request)
|
||||
{
|
||||
try {
|
||||
$equipments = new Equipment;
|
||||
|
||||
$this->orderByRequest($equipments, $request);
|
||||
|
||||
$this->filterRequest(
|
||||
builder: $equipments,
|
||||
request: $request,
|
||||
filterKeys: [
|
||||
'code' => self::F_TEXT,
|
||||
'name' => self::F_TEXT,
|
||||
'note' => self::F_TEXT,
|
||||
]
|
||||
);
|
||||
|
||||
$this->searchRequest(
|
||||
builder: $equipments,
|
||||
value: $request->get('search'),
|
||||
fields: ['equipments.code', 'equipments.name', 'equipments.note']
|
||||
);
|
||||
|
||||
// Optional filter: assigned (in use) vs warehouse
|
||||
$assignedFilter = $request->get('assigned');
|
||||
if ($assignedFilter === 'in_use') {
|
||||
$equipments->whereNotNull('equipments.current_user_id');
|
||||
} elseif ($assignedFilter === 'warehouse') {
|
||||
$equipments->whereNull('equipments.current_user_id');
|
||||
}
|
||||
|
||||
$responseData = $equipments
|
||||
->leftJoin('users as holder', 'equipments.current_user_id', '=', 'holder.id')
|
||||
->orderBy('equipments.updated_at', 'desc')
|
||||
->select(
|
||||
'equipments.*',
|
||||
'holder.name as current_user_name'
|
||||
)
|
||||
->paginate($request->get('per_page', 15));
|
||||
|
||||
return AbstractController::ResultSuccess($responseData);
|
||||
} catch (\Exception $e) {
|
||||
Log::error('Error fetching equipments: ' . $e->getMessage());
|
||||
return AbstractController::ResultError($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a single equipment by code (for barcode scan).
|
||||
*/
|
||||
public function showByCode(Request $request)
|
||||
{
|
||||
try {
|
||||
$code = trim((string) $request->get('code'));
|
||||
if ($code === '') {
|
||||
return AbstractController::ResultError('Code is required', 422);
|
||||
}
|
||||
|
||||
$equipment = Equipment::leftJoin('users as holder', 'equipments.current_user_id', '=', 'holder.id')
|
||||
->where('equipments.code', $code)
|
||||
->select('equipments.*', 'holder.name as current_user_name')
|
||||
->first();
|
||||
|
||||
if (!$equipment) {
|
||||
return AbstractController::ResultSuccess(null, 'Equipment not found');
|
||||
}
|
||||
|
||||
$history = EquipmentAssignment::leftJoin('users', 'equipment_assignments.user_id', '=', 'users.id')
|
||||
->where('equipment_assignments.equipment_id', $equipment->id)
|
||||
->orderBy('equipment_assignments.assigned_at', 'desc')
|
||||
->select(
|
||||
'equipment_assignments.*',
|
||||
'users.name as user_name'
|
||||
)
|
||||
->get();
|
||||
|
||||
$equipment->history = $history;
|
||||
|
||||
return AbstractController::ResultSuccess($equipment);
|
||||
} catch (\Exception $e) {
|
||||
Log::error('Error fetching equipment by code: ' . $e->getMessage());
|
||||
return AbstractController::ResultError($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get assignment history for an equipment.
|
||||
*/
|
||||
public function history($id)
|
||||
{
|
||||
try {
|
||||
$history = EquipmentAssignment::leftJoin('users', 'equipment_assignments.user_id', '=', 'users.id')
|
||||
->where('equipment_assignments.equipment_id', $id)
|
||||
->orderBy('equipment_assignments.assigned_at', 'desc')
|
||||
->select(
|
||||
'equipment_assignments.*',
|
||||
'users.name as user_name'
|
||||
)
|
||||
->get();
|
||||
|
||||
return AbstractController::ResultSuccess($history);
|
||||
} catch (\Exception $e) {
|
||||
Log::error('Error fetching equipment history: ' . $e->getMessage());
|
||||
return AbstractController::ResultError($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all users for assignment selectbox.
|
||||
*/
|
||||
public function userOptions()
|
||||
{
|
||||
try {
|
||||
$users = Admin::orderBy('name', 'asc')
|
||||
->select('id', 'name', 'email')
|
||||
->get();
|
||||
return AbstractController::ResultSuccess($users);
|
||||
} catch (\Exception $e) {
|
||||
Log::error('Error fetching user options: ' . $e->getMessage());
|
||||
return AbstractController::ResultError($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create new equipment. Accepts multipart with optional image file.
|
||||
*/
|
||||
public function create(Request $request)
|
||||
{
|
||||
try {
|
||||
$validated = $request->validate([
|
||||
'code' => 'required|string|max:255|unique:equipments,code',
|
||||
'name' => 'required|string|max:255',
|
||||
'note' => 'nullable|string',
|
||||
'current_user_id' => 'nullable|integer|exists:users,id',
|
||||
'image' => 'nullable|file|mimes:jpg,jpeg,png,gif,webp|max:10240',
|
||||
]);
|
||||
|
||||
$authId = auth('admins')->user()->id ?? null;
|
||||
|
||||
$imagePath = null;
|
||||
if ($request->hasFile('image')) {
|
||||
$directory = 'equipments/images';
|
||||
if (!Storage::disk('public')->exists($directory)) {
|
||||
Storage::disk('public')->makeDirectory($directory);
|
||||
}
|
||||
$imagePath = $request->file('image')->store($directory, 'public');
|
||||
}
|
||||
|
||||
$equipment = DB::transaction(function () use ($validated, $authId, $imagePath) {
|
||||
$now = Carbon::now();
|
||||
$currentUserId = $validated['current_user_id'] ?? null;
|
||||
|
||||
$equipment = Equipment::create([
|
||||
'code' => $validated['code'],
|
||||
'name' => $validated['name'],
|
||||
'note' => $validated['note'] ?? null,
|
||||
'image_path' => $imagePath,
|
||||
'current_user_id' => $currentUserId,
|
||||
'assigned_at' => $now,
|
||||
'created_by' => $authId,
|
||||
]);
|
||||
|
||||
// Always create an initial assignment record so the history
|
||||
// shows the very first state (warehouse or user).
|
||||
EquipmentAssignment::create([
|
||||
'equipment_id' => $equipment->id,
|
||||
'user_id' => $currentUserId, // null = at warehouse
|
||||
'assigned_at' => $now,
|
||||
'note' => $currentUserId ? 'Initial assignment' : 'Initial — at warehouse',
|
||||
'created_by' => $authId,
|
||||
]);
|
||||
|
||||
return $equipment;
|
||||
});
|
||||
|
||||
return AbstractController::ResultSuccess($equipment, 'Equipment created successfully');
|
||||
} catch (\Illuminate\Validation\ValidationException $e) {
|
||||
return AbstractController::ResultError($e->getMessage(), 422);
|
||||
} catch (\Exception $e) {
|
||||
Log::error('Error creating equipment: ' . $e->getMessage());
|
||||
return AbstractController::ResultError($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Upload / replace the equipment image (optional, post-create or edit).
|
||||
*/
|
||||
public function uploadImage(Request $request, $id)
|
||||
{
|
||||
try {
|
||||
$request->validate([
|
||||
'image' => 'required|file|mimes:jpg,jpeg,png,gif,webp|max:10240',
|
||||
]);
|
||||
|
||||
$equipment = Equipment::findOrFail($id);
|
||||
|
||||
// Delete old image if present
|
||||
if ($equipment->image_path && Storage::disk('public')->exists($equipment->image_path)) {
|
||||
Storage::disk('public')->delete($equipment->image_path);
|
||||
}
|
||||
|
||||
$directory = 'equipments/images';
|
||||
if (!Storage::disk('public')->exists($directory)) {
|
||||
Storage::disk('public')->makeDirectory($directory);
|
||||
}
|
||||
$path = $request->file('image')->store($directory, 'public');
|
||||
|
||||
$equipment->update([
|
||||
'image_path' => $path,
|
||||
'updated_by' => auth('admins')->user()->id ?? null,
|
||||
]);
|
||||
|
||||
return AbstractController::ResultSuccess($equipment, 'Image uploaded');
|
||||
} catch (\Exception $e) {
|
||||
Log::error('Error uploading equipment image: ' . $e->getMessage());
|
||||
return AbstractController::ResultError($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete the equipment image.
|
||||
*/
|
||||
public function deleteImage($id)
|
||||
{
|
||||
try {
|
||||
$equipment = Equipment::findOrFail($id);
|
||||
if ($equipment->image_path && Storage::disk('public')->exists($equipment->image_path)) {
|
||||
Storage::disk('public')->delete($equipment->image_path);
|
||||
}
|
||||
$equipment->update([
|
||||
'image_path' => null,
|
||||
'updated_by' => auth('admins')->user()->id ?? null,
|
||||
]);
|
||||
return AbstractController::ResultSuccess($equipment, 'Image deleted');
|
||||
} catch (\Exception $e) {
|
||||
Log::error('Error deleting equipment image: ' . $e->getMessage());
|
||||
return AbstractController::ResultError($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Update equipment basic info (code, name, note).
|
||||
*/
|
||||
public function update(Request $request, $id)
|
||||
{
|
||||
try {
|
||||
$equipment = Equipment::findOrFail($id);
|
||||
|
||||
$validated = $request->validate([
|
||||
'code' => 'sometimes|string|max:255|unique:equipments,code,' . $id,
|
||||
'name' => 'sometimes|string|max:255',
|
||||
'note' => 'nullable|string',
|
||||
]);
|
||||
|
||||
$equipment->update(array_merge($validated, [
|
||||
'updated_by' => auth('admins')->user()->id ?? null,
|
||||
]));
|
||||
|
||||
return AbstractController::ResultSuccess($equipment, 'Equipment updated successfully');
|
||||
} catch (\Exception $e) {
|
||||
Log::error('Error updating equipment: ' . $e->getMessage());
|
||||
return AbstractController::ResultError($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Assign equipment to a user, or return to warehouse (user_id = null).
|
||||
* Every state change is recorded: closes the previous open record AND opens
|
||||
* a new one for the new holder (user or warehouse).
|
||||
*/
|
||||
public function assign(Request $request, $id)
|
||||
{
|
||||
try {
|
||||
$validated = $request->validate([
|
||||
'user_id' => 'nullable|integer|exists:users,id',
|
||||
'note' => 'nullable|string',
|
||||
]);
|
||||
|
||||
$authId = auth('admins')->user()->id ?? null;
|
||||
|
||||
$equipment = DB::transaction(function () use ($id, $validated, $authId) {
|
||||
$equipment = Equipment::lockForUpdate()->findOrFail($id);
|
||||
$now = Carbon::now();
|
||||
$newUserId = $validated['user_id'] ?? null;
|
||||
|
||||
// No-op guard: if assigning to the same holder, skip to avoid duplicate history rows
|
||||
if ($equipment->current_user_id == $newUserId) {
|
||||
return $equipment;
|
||||
}
|
||||
|
||||
// Close any currently open assignment (records who/Kho was holding it until now)
|
||||
EquipmentAssignment::where('equipment_id', $equipment->id)
|
||||
->whereNull('returned_at')
|
||||
->update([
|
||||
'returned_at' => $now,
|
||||
'updated_at' => $now,
|
||||
]);
|
||||
|
||||
// Always open a new assignment row — for a user OR for the warehouse.
|
||||
// user_id = null means "currently at warehouse".
|
||||
EquipmentAssignment::create([
|
||||
'equipment_id' => $equipment->id,
|
||||
'user_id' => $newUserId,
|
||||
'assigned_at' => $now,
|
||||
'note' => $validated['note'] ?? ($newUserId === null ? 'Returned to warehouse' : null),
|
||||
'created_by' => $authId,
|
||||
]);
|
||||
|
||||
$equipment->update([
|
||||
'current_user_id' => $newUserId,
|
||||
'assigned_at' => $now,
|
||||
'updated_by' => $authId,
|
||||
]);
|
||||
|
||||
return $equipment->fresh();
|
||||
});
|
||||
|
||||
return AbstractController::ResultSuccess($equipment, 'Equipment assignment updated');
|
||||
} catch (\Exception $e) {
|
||||
Log::error('Error assigning equipment: ' . $e->getMessage());
|
||||
return AbstractController::ResultError($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Statistics: list users grouped with the equipments they are currently holding.
|
||||
*/
|
||||
public function userStatistics(Request $request)
|
||||
{
|
||||
try {
|
||||
$search = trim((string) $request->get('search', ''));
|
||||
|
||||
$usersQuery = DB::table('equipments')
|
||||
->join('users', 'equipments.current_user_id', '=', 'users.id')
|
||||
->whereNotNull('equipments.current_user_id');
|
||||
|
||||
if ($search !== '') {
|
||||
$usersQuery->where(function ($q) use ($search) {
|
||||
$q->where('users.name', 'like', "%{$search}%")
|
||||
->orWhere('users.email', 'like', "%{$search}%")
|
||||
->orWhere('equipments.code', 'like', "%{$search}%")
|
||||
->orWhere('equipments.name', 'like', "%{$search}%");
|
||||
});
|
||||
}
|
||||
|
||||
$userTotals = (clone $usersQuery)
|
||||
->select(
|
||||
'users.id as user_id',
|
||||
'users.name as user_name',
|
||||
'users.email as user_email',
|
||||
DB::raw('COUNT(equipments.id) as equipment_count')
|
||||
)
|
||||
->groupBy('users.id', 'users.name', 'users.email')
|
||||
->orderByDesc('equipment_count')
|
||||
->orderBy('users.name')
|
||||
->get();
|
||||
|
||||
$userIds = $userTotals->pluck('user_id')->all();
|
||||
|
||||
$devices = Equipment::leftJoin('users as holder', 'equipments.current_user_id', '=', 'holder.id')
|
||||
->whereIn('equipments.current_user_id', $userIds)
|
||||
->select(
|
||||
'equipments.id',
|
||||
'equipments.code',
|
||||
'equipments.name',
|
||||
'equipments.note',
|
||||
'equipments.image_path',
|
||||
'equipments.current_user_id',
|
||||
'equipments.assigned_at'
|
||||
)
|
||||
->orderBy('equipments.assigned_at', 'desc')
|
||||
->get()
|
||||
->groupBy('current_user_id');
|
||||
|
||||
$result = $userTotals->map(function ($u) use ($devices) {
|
||||
return [
|
||||
'user_id' => $u->user_id,
|
||||
'user_name' => $u->user_name,
|
||||
'user_email' => $u->user_email,
|
||||
'equipment_count' => (int) $u->equipment_count,
|
||||
'equipments' => ($devices->get($u->user_id) ?? collect())->values(),
|
||||
];
|
||||
});
|
||||
|
||||
// Also include warehouse summary
|
||||
$warehouseCount = Equipment::whereNull('current_user_id')->count();
|
||||
|
||||
return AbstractController::ResultSuccess([
|
||||
'users' => $result,
|
||||
'warehouse_count' => $warehouseCount,
|
||||
'total_equipment' => Equipment::count(),
|
||||
]);
|
||||
} catch (\Exception $e) {
|
||||
Log::error('Error fetching equipment user statistics: ' . $e->getMessage());
|
||||
return AbstractController::ResultError($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete equipment (and its history via cascade).
|
||||
*/
|
||||
public function delete($id)
|
||||
{
|
||||
try {
|
||||
$equipment = Equipment::findOrFail($id);
|
||||
$equipment->delete();
|
||||
return AbstractController::ResultSuccess(null, 'Equipment deleted successfully');
|
||||
} catch (\Exception $e) {
|
||||
Log::error('Error deleting equipment: ' . $e->getMessage());
|
||||
return AbstractController::ResultError($e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Export the (filtered) equipment list as CSV.
|
||||
*/
|
||||
public function export(Request $request)
|
||||
{
|
||||
try {
|
||||
$equipments = new Equipment;
|
||||
|
||||
$this->filterRequest(
|
||||
builder: $equipments,
|
||||
request: $request,
|
||||
filterKeys: [
|
||||
'code' => self::F_TEXT,
|
||||
'name' => self::F_TEXT,
|
||||
'note' => self::F_TEXT,
|
||||
]
|
||||
);
|
||||
|
||||
$this->searchRequest(
|
||||
builder: $equipments,
|
||||
value: $request->get('search'),
|
||||
fields: ['equipments.code', 'equipments.name', 'equipments.note']
|
||||
);
|
||||
|
||||
$assignedFilter = $request->get('assigned');
|
||||
if ($assignedFilter === 'in_use') {
|
||||
$equipments->whereNotNull('equipments.current_user_id');
|
||||
} elseif ($assignedFilter === 'warehouse') {
|
||||
$equipments->whereNull('equipments.current_user_id');
|
||||
}
|
||||
|
||||
$rows = $equipments
|
||||
->leftJoin('users as holder', 'equipments.current_user_id', '=', 'holder.id')
|
||||
->orderBy('equipments.updated_at', 'desc')
|
||||
->select(
|
||||
'equipments.id',
|
||||
'equipments.code',
|
||||
'equipments.name',
|
||||
'equipments.note',
|
||||
'equipments.assigned_at',
|
||||
'equipments.created_at',
|
||||
'equipments.updated_at',
|
||||
'holder.name as current_user_name'
|
||||
)
|
||||
->get();
|
||||
|
||||
$filename = 'equipments_' . date('Y-m-d_His') . '.csv';
|
||||
|
||||
$callback = function () use ($rows) {
|
||||
$out = fopen('php://output', 'w');
|
||||
// BOM for Excel UTF-8
|
||||
fwrite($out, "\xEF\xBB\xBF");
|
||||
fputcsv($out, ['ID', 'Code', 'Name', 'Note', 'Current Holder', 'Assigned At', 'Created At', 'Updated At']);
|
||||
foreach ($rows as $r) {
|
||||
fputcsv($out, [
|
||||
$r->id,
|
||||
$r->code,
|
||||
$r->name,
|
||||
$r->note,
|
||||
$r->current_user_name ?: 'Kho',
|
||||
$r->assigned_at,
|
||||
$r->created_at,
|
||||
$r->updated_at,
|
||||
]);
|
||||
}
|
||||
fclose($out);
|
||||
};
|
||||
|
||||
return response()->stream($callback, 200, [
|
||||
'Content-Type' => 'text/csv; charset=UTF-8',
|
||||
'Content-Disposition' => 'attachment; filename="' . $filename . '"',
|
||||
]);
|
||||
} catch (\Exception $e) {
|
||||
Log::error('Error exporting equipments: ' . $e->getMessage());
|
||||
return AbstractController::ResultError($e->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -726,6 +726,40 @@ class TicketController extends Controller
|
|||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Khởi tạo dữ liệu ngày phép cho user nếu chưa có
|
||||
*
|
||||
* @param UserModel $user
|
||||
* @param int $year
|
||||
* @return LeaveDays|null
|
||||
*/
|
||||
private function initializeLeaveDaysForYear($user, int $year): ?LeaveDays
|
||||
{
|
||||
// Nếu là nhân viên chưa chính thức, ko cộng phép
|
||||
if (!$user->is_permanent) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Nếu là nhân viên nghỉ việc, ko cộng phép
|
||||
if ($user->is_separated) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Nếu chưa có dữ liệu năm hiện tại, tạo mới
|
||||
// Số ngày phép bằng với tháng hiện tại
|
||||
$leaveDaysInfo = new LeaveDays([
|
||||
'ld_user_id' => $user->id,
|
||||
'ld_day_total' => 1,
|
||||
'ld_year' => $year,
|
||||
'ld_additional_day' => 0,
|
||||
'ld_note' => 'Khởi tạo ngày phép tháng 1 khi tạo ticket cho năm sau',
|
||||
'ld_special_leave_day' => 0,
|
||||
]);
|
||||
$leaveDaysInfo->save();
|
||||
|
||||
return $leaveDaysInfo;
|
||||
}
|
||||
|
||||
//Tính tổng số ngày nghỉ có phép đến tháng hiện tại
|
||||
private function getTotalLeaveDaysInMonthToMonth($user, int $year, int $month): float
|
||||
{
|
||||
|
|
@ -746,6 +780,12 @@ class TicketController extends Controller
|
|||
->where('ld_year', $year)
|
||||
->first();
|
||||
|
||||
if (!$leaveDaysInfo) {
|
||||
$leaveDaysInfo = $this->initializeLeaveDaysForYear($user, $year);
|
||||
if (!$leaveDaysInfo) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
$totalAllocated = 0;
|
||||
// Xử lý gửi ticket sau tháng hiện tại
|
||||
if ($leaveDaysInfo && $user->is_permanent) {
|
||||
|
|
|
|||
|
|
@ -8,4 +8,12 @@ use Illuminate\Database\Eloquent\Model;
|
|||
class Category extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
|
||||
protected $fillable = [
|
||||
'c_type',
|
||||
'c_name',
|
||||
'c_code',
|
||||
'c_value',
|
||||
'c_active',
|
||||
];
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,52 @@
|
|||
<?php
|
||||
|
||||
namespace Modules\Admin\app\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use App\Traits\HasCacheModel;
|
||||
|
||||
class ElectricityBill extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
use HasCacheModel;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->table = 'electricity_bills';
|
||||
$this->guarded = [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate total amount based on reading difference and unit price
|
||||
*/
|
||||
public function calculateTotal(): float
|
||||
{
|
||||
$consumption = $this->current_reading - $this->previous_reading;
|
||||
return round($consumption * $this->unit_price, 2);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get consumption in kWh
|
||||
*/
|
||||
public function getConsumption(): float
|
||||
{
|
||||
return $this->current_reading - $this->previous_reading;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get user who created this record
|
||||
*/
|
||||
public function creator()
|
||||
{
|
||||
return $this->belongsTo(\App\Models\User::class, 'created_by');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get user who updated this record
|
||||
*/
|
||||
public function updater()
|
||||
{
|
||||
return $this->belongsTo(\App\Models\User::class, 'updated_by');
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
<?php
|
||||
|
||||
namespace Modules\Admin\app\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class Equipment extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->table = 'equipments';
|
||||
$this->guarded = [];
|
||||
}
|
||||
|
||||
public function currentUser()
|
||||
{
|
||||
return $this->belongsTo(\App\Models\User::class, 'current_user_id');
|
||||
}
|
||||
|
||||
public function assignments()
|
||||
{
|
||||
return $this->hasMany(EquipmentAssignment::class, 'equipment_id')->orderBy('assigned_at', 'desc');
|
||||
}
|
||||
|
||||
public function creator()
|
||||
{
|
||||
return $this->belongsTo(\App\Models\User::class, 'created_by');
|
||||
}
|
||||
|
||||
public function updater()
|
||||
{
|
||||
return $this->belongsTo(\App\Models\User::class, 'updated_by');
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
<?php
|
||||
|
||||
namespace Modules\Admin\app\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
class EquipmentAssignment extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
$this->table = 'equipment_assignments';
|
||||
$this->guarded = [];
|
||||
}
|
||||
|
||||
public function equipment()
|
||||
{
|
||||
return $this->belongsTo(Equipment::class, 'equipment_id');
|
||||
}
|
||||
|
||||
public function user()
|
||||
{
|
||||
return $this->belongsTo(\App\Models\User::class, 'user_id');
|
||||
}
|
||||
|
||||
public function creator()
|
||||
{
|
||||
return $this->belongsTo(\App\Models\User::class, 'created_by');
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,98 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="vi">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>Bảng kê thanh toán tiền điện</title>
|
||||
<style>
|
||||
body {
|
||||
font-family: DejaVu Sans, sans-serif;
|
||||
font-size: 14px;
|
||||
}
|
||||
.text-center {
|
||||
text-align: center;
|
||||
}
|
||||
.mt-10 {
|
||||
margin-top: 10px;
|
||||
}
|
||||
.mt-20 {
|
||||
margin-top: 20px;
|
||||
}
|
||||
table {
|
||||
width: 100%;
|
||||
border-collapse: collapse;
|
||||
margin-top: 15px;
|
||||
}
|
||||
table, th, td {
|
||||
border: 1px solid #000;
|
||||
}
|
||||
th, td {
|
||||
padding: 8px;
|
||||
text-align: center;
|
||||
}
|
||||
.no-border {
|
||||
border: none;
|
||||
}
|
||||
.signature {
|
||||
width: 100%;
|
||||
margin-top: 50px;
|
||||
}
|
||||
.signature td {
|
||||
border: none;
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<h3 class="text-center">BẢNG KÊ THANH TOÁN TIỀN ĐIỆN</h3>
|
||||
<p class="text-center">({{ $dateNow ?? '' }})</p>
|
||||
|
||||
<div class="mt-20">
|
||||
<p>- Tên doanh nghiệp: Công ty TNHH Kỹ Thuật Công Nghệ APAC</p>
|
||||
<p>- Mã số thuế: 0110038408</p>
|
||||
<p>- Địa chỉ: Số 219/26/3 đường Lĩnh Nam, Phường Vĩnh Hưng, thành phố Hà Nội, Việt Nam</p>
|
||||
<p>- Tên chủ sở hữu cho thuê địa điểm sản xuất kinh doanh: Lâm Văn Mười</p>
|
||||
<p>- Địa chỉ thuê: 50B31 tại Khu dân cư 91B giai đoạn 3, phường Tân An, thành phố Cần Thơ</p>
|
||||
</div>
|
||||
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>Số điện đầu kỳ</th>
|
||||
<th>Số điện cuối kỳ</th>
|
||||
<th>Số điện tiêu thụ</th>
|
||||
<th>Đơn giá</th>
|
||||
<th>Thành tiền</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>{{ number_format($bill->previous_reading) ?? 0 }}</td>
|
||||
<td>{{ number_format($bill->current_reading) ?? 0 }}</td>
|
||||
<td>{{ $consumption ?? 0 }}</td>
|
||||
<td>{{ number_format($bill->unit_price) ?? '0' }}</td>
|
||||
<td>{{ number_format($bill->total_amount) ?? '0' }}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
|
||||
<p class="mt-20">
|
||||
- Tổng tiền thanh toán: <strong>{{ number_format($bill->total_amount) ?? '0' }} VND</strong>
|
||||
({{ $totalText ?? '' }})
|
||||
</p>
|
||||
|
||||
<table class="signature no-border">
|
||||
<tr>
|
||||
<td>
|
||||
Người lập bảng kê<br>
|
||||
(Ký, ghi rõ họ tên)
|
||||
</td>
|
||||
<td>
|
||||
Đại diện doanh nghiệp<br>
|
||||
(Ký, ghi rõ họ tên)
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -23,6 +23,8 @@ use Modules\Admin\app\Http\Controllers\ProjectReviewController;
|
|||
use Modules\Admin\app\Http\Controllers\ProfileController;
|
||||
use Modules\Admin\app\Http\Controllers\TechnicalController;
|
||||
use Modules\Admin\app\Http\Controllers\TestCaseForSprintController;
|
||||
use Modules\Admin\app\Http\Controllers\ElectricityBillController;
|
||||
use Modules\Admin\app\Http\Controllers\EquipmentController;
|
||||
use Modules\Admin\app\Http\Middleware\AdminMiddleware;
|
||||
|
||||
/*
|
||||
|
|
@ -149,6 +151,8 @@ Route::middleware('api')
|
|||
'prefix' => 'category',
|
||||
], function () {
|
||||
Route::get('/get-list-master', [CategoryController::class, 'getListMaster']);
|
||||
Route::get('/work-days', [CategoryController::class, 'workDays'])->middleware('check.permission:admin.hr');
|
||||
Route::put('/update-work-days', [CategoryController::class, 'updateWorkDays'])->middleware('check.permission:admin.hr');
|
||||
});
|
||||
|
||||
Route::group([
|
||||
|
|
@ -171,6 +175,38 @@ Route::middleware('api')
|
|||
Route::post('/handle-ticket', [TicketController::class, 'handleTicket'])->middleware('check.permission:admin');
|
||||
});
|
||||
|
||||
// Electricity Bills
|
||||
Route::group([
|
||||
'prefix' => 'electricity-bill',
|
||||
], function () {
|
||||
Route::get('/', [ElectricityBillController::class, 'index'])->middleware('check.permission:admin.hr.staff.accountant');
|
||||
Route::get('/{id}', [ElectricityBillController::class, 'show'])->middleware('check.permission:admin.hr.staff.accountant');
|
||||
Route::post('/create', [ElectricityBillController::class, 'create'])->middleware('check.permission:admin.hr.staff.accountant');
|
||||
Route::put('/{id}', [ElectricityBillController::class, 'update'])->middleware('check.permission:admin.hr.staff.accountant');
|
||||
Route::get('/delete/{id}', [ElectricityBillController::class, 'delete'])->middleware('check.permission:admin.hr.staff.accountant');
|
||||
Route::get('/export-pdf/{id}', [ElectricityBillController::class, 'exportPdf'])->middleware('check.permission:admin.hr.staff.accountant');
|
||||
Route::post('/upload-attachment/{id}', [ElectricityBillController::class, 'uploadAttachment'])->middleware('check.permission:admin.hr.staff.accountant');
|
||||
Route::delete('/delete-attachment/{id}', [ElectricityBillController::class, 'deleteAttachment'])->middleware('check.permission:admin.hr.staff.accountant');
|
||||
});
|
||||
|
||||
// Equipments
|
||||
Route::group([
|
||||
'prefix' => 'equipment',
|
||||
], function () {
|
||||
Route::get('/', [EquipmentController::class, 'index'])->middleware('check.permission:admin.hr.staff.accountant');
|
||||
Route::get('/users', [EquipmentController::class, 'userOptions'])->middleware('check.permission:admin.hr.staff.accountant');
|
||||
Route::get('/user-statistics', [EquipmentController::class, 'userStatistics'])->middleware('check.permission:admin.hr.staff.accountant');
|
||||
Route::get('/export', [EquipmentController::class, 'export'])->middleware('check.permission:admin.hr.staff.accountant');
|
||||
Route::get('/by-code', [EquipmentController::class, 'showByCode'])->middleware('check.permission:admin.hr.staff.accountant');
|
||||
Route::get('/history/{id}', [EquipmentController::class, 'history'])->middleware('check.permission:admin.hr.staff.accountant');
|
||||
Route::post('/create', [EquipmentController::class, 'create'])->middleware('check.permission:admin.hr.staff.accountant');
|
||||
Route::put('/{id}', [EquipmentController::class, 'update'])->middleware('check.permission:admin.hr.staff.accountant');
|
||||
Route::post('/{id}/assign', [EquipmentController::class, 'assign'])->middleware('check.permission:admin.hr.staff.accountant');
|
||||
Route::post('/{id}/upload-image', [EquipmentController::class, 'uploadImage'])->middleware('check.permission:admin.hr.staff.accountant');
|
||||
Route::delete('/{id}/image', [EquipmentController::class, 'deleteImage'])->middleware('check.permission:admin.hr.staff.accountant');
|
||||
Route::get('/delete/{id}', [EquipmentController::class, 'delete'])->middleware('check.permission:admin.hr.staff.accountant');
|
||||
});
|
||||
|
||||
Route::group([
|
||||
'prefix' => 'profile',
|
||||
], function () {
|
||||
|
|
|
|||
|
|
@ -24,9 +24,11 @@ class Kernel extends ConsoleKernel
|
|||
// $schedule->command('daily:api-call')
|
||||
// ->dailyAt('18:00');
|
||||
|
||||
// Chạy command vào ngày 31/12 lúc 23:59:59 mỗi năm
|
||||
$schedule->command('initialize:leavedays')->yearlyOn(12, 31, '23:59:59');
|
||||
$schedule->command('leave:deduct')->yearlyOn(3, 31, '23:59:59');
|
||||
// Chạy command vào ngày 01/01 lúc 00:00 mỗi năm
|
||||
$schedule->command('initialize:leavedays')->yearlyOn(1, 1, '00:00');
|
||||
|
||||
// Chạy command vào ngày 01/04 lúc 00:00 mỗi năm
|
||||
$schedule->command('leave:deduct')->yearlyOn(4, 1, '00:00');
|
||||
|
||||
// Chạy buổi sáng lúc 12:00
|
||||
$schedule->command('attendance:check S')->dailyAt('12:00');
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@
|
|||
namespace App\Jobs;
|
||||
|
||||
use App\Models\LeaveDays;
|
||||
use App\Models\Notes;
|
||||
use App\Models\User;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Bus\Queueable;
|
||||
|
|
@ -11,6 +12,7 @@ use Illuminate\Foundation\Bus\Dispatchable;
|
|||
use Illuminate\Queue\InteractsWithQueue;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
use Modules\Admin\app\Models\Category;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class AddMonthlyLeaveDays implements ShouldQueue
|
||||
{
|
||||
|
|
@ -46,15 +48,48 @@ class AddMonthlyLeaveDays implements ShouldQueue
|
|||
->where('ld_year', $this->year)
|
||||
->first();
|
||||
|
||||
if (!$leaveDay) {
|
||||
if (!$leaveDay && $this->month > 1) {
|
||||
// Nếu chưa có dữ liệu năm hiện tại, tạo mới
|
||||
// Số ngày phép bằng với tháng hiện tại
|
||||
$previousYearData = LeaveDays::where('ld_user_id', $user->id)
|
||||
->where('ld_year', $this->year - 1)
|
||||
->first();
|
||||
$ld_additional_day = 0;
|
||||
$ld_note = '';
|
||||
|
||||
if ($previousYearData) {
|
||||
$ld_additional_day = $previousYearData->ld_day_total + $previousYearData->ld_additional_day + $previousYearData->ld_special_leave_day;
|
||||
$totalLeaveDaysByMonth = Notes::join('categories', function ($join) {
|
||||
$join->on('notes.n_time_type', '=', 'categories.c_code')
|
||||
->where('categories.c_type', 'TIME_TYPE');
|
||||
})
|
||||
->select(
|
||||
DB::raw('notes.n_user_id as n_user_id'),
|
||||
DB::raw('notes.n_year as year'),
|
||||
DB::raw('SUM(categories.c_value) as leave_days')
|
||||
)
|
||||
->where('notes.n_year', $this->year - 1)
|
||||
->where('notes.n_user_id', $user->id)
|
||||
->where('notes.n_reason', 'ONLEAVE')
|
||||
->groupBy(DB::raw('notes.n_year'))
|
||||
->first();
|
||||
if ($totalLeaveDaysByMonth) {
|
||||
$ld_additional_day = $ld_additional_day - $totalLeaveDaysByMonth->leave_days;
|
||||
if ($ld_additional_day < 0) {
|
||||
$ld_additional_day = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if ($ld_additional_day > 0) {
|
||||
$ld_note = "Cộng " . $ld_additional_day . " ngày phép tồn năm trước. \n";
|
||||
}
|
||||
}
|
||||
|
||||
$leaveDay = new LeaveDays([
|
||||
'ld_user_id' => $user->id,
|
||||
'ld_day_total' => $this->month, // Số ngày phép bằng tháng hiện tại
|
||||
'ld_year' => $this->year,
|
||||
'ld_additional_day' => 0,
|
||||
'ld_note' => 'Khởi tạo ngày phép đến tháng ' . $this->month,
|
||||
'ld_additional_day' => $ld_additional_day,
|
||||
'ld_note' => $ld_note,
|
||||
'ld_special_leave_day' => 0,
|
||||
]);
|
||||
$leaveDay->save();
|
||||
|
|
|
|||
|
|
@ -55,10 +55,12 @@ class DeductLeaveDays implements ShouldQueue
|
|||
if ($usedOnleaveDaysTotal) {
|
||||
if ($existingData->ld_additional_day > $usedOnleaveDaysTotal) {
|
||||
$ld_note = "Trừ " . $existingData->ld_additional_day - $usedOnleaveDaysTotal . " ngày phép tồn năm trước. \n";
|
||||
$existingData->ld_note = $existingData->ld_note . "\n" . $ld_note;
|
||||
$existingData->ld_note = $existingData->ld_note . $ld_note;
|
||||
$existingData->ld_additional_day = $usedOnleaveDaysTotal;
|
||||
}
|
||||
} else {
|
||||
$ld_note = "Trừ " . $existingData->ld_additional_day . " ngày phép tồn năm trước. \n";
|
||||
$existingData->ld_note = $existingData->ld_note . $ld_note;
|
||||
$existingData->ld_additional_day = 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -42,16 +42,6 @@ class InitializeLeaveDays implements ShouldQueue
|
|||
continue;
|
||||
}
|
||||
|
||||
// Kiểm tra xem dữ liệu của user này đã tồn tại cho năm hiện tại chưa
|
||||
$existingData = LeaveDays::where('ld_user_id', $user->id)
|
||||
->where('ld_year', $this->year)
|
||||
->first();
|
||||
|
||||
if ($existingData) {
|
||||
// Nếu dữ liệu đã tồn tại, bỏ qua user này
|
||||
continue;
|
||||
}
|
||||
|
||||
// Kiểm tra dữ liệu của user này trong năm trước
|
||||
$previousYearData = LeaveDays::where('ld_user_id', $user->id)
|
||||
->where('ld_year', $this->year - 1)
|
||||
|
|
@ -61,7 +51,7 @@ class InitializeLeaveDays implements ShouldQueue
|
|||
$ld_note = '';
|
||||
|
||||
if ($previousYearData) {
|
||||
$ld_additional_day = $previousYearData->ld_day_total + $previousYearData->ld_additional_day;
|
||||
$ld_additional_day = $previousYearData->ld_day_total + $previousYearData->ld_additional_day + $previousYearData->ld_special_leave_day;
|
||||
$totalLeaveDaysByMonth = Notes::join('categories', function ($join) {
|
||||
$join->on('notes.n_time_type', '=', 'categories.c_code')
|
||||
->where('categories.c_type', 'TIME_TYPE');
|
||||
|
|
@ -88,6 +78,19 @@ class InitializeLeaveDays implements ShouldQueue
|
|||
}
|
||||
}
|
||||
|
||||
// Kiểm tra xem dữ liệu của user này đã tồn tại cho năm hiện tại chưa
|
||||
$existingData = LeaveDays::where('ld_user_id', $user->id)
|
||||
->where('ld_year', $this->year)
|
||||
->first();
|
||||
|
||||
if ($existingData) {
|
||||
// Nếu dữ liệu đã tồn tại, update lại phép tồn
|
||||
$existingData->ld_note = $ld_note;
|
||||
$existingData->ld_additional_day = $ld_additional_day;
|
||||
$existingData->save();
|
||||
continue;
|
||||
}
|
||||
|
||||
// Tạo dữ liệu cho năm hiện tại
|
||||
LeaveDays::insert([
|
||||
'ld_user_id' => $user->id,
|
||||
|
|
|
|||
|
|
@ -2,11 +2,16 @@
|
|||
"name": "laravel/laravel",
|
||||
"type": "project",
|
||||
"description": "The skeleton application for the Laravel framework.",
|
||||
"keywords": ["laravel", "framework"],
|
||||
"keywords": [
|
||||
"laravel",
|
||||
"framework"
|
||||
],
|
||||
"license": "MIT",
|
||||
"require": {
|
||||
"php": "^8.2",
|
||||
"barryvdh/laravel-debugbar": "^3.9",
|
||||
"barryvdh/laravel-dompdf": "^2.0",
|
||||
"doctrine/dbal": "^3.10",
|
||||
"drnxloc/laravel-simple-html-dom": "^1.9",
|
||||
"guzzlehttp/guzzle": "^7.8",
|
||||
"laravel/framework": "^10.10",
|
||||
|
|
|
|||
|
|
@ -0,0 +1,39 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('electricity_bills', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->date('billing_date')->comment('Ngày lập hóa đơn');
|
||||
$table->decimal('previous_reading', 12, 2)->comment('Số điện kỳ trước');
|
||||
$table->decimal('current_reading', 12, 2)->comment('Số điện kỳ này');
|
||||
$table->decimal('unit_price', 12, 2)->comment('Đơn giá điện');
|
||||
$table->decimal('total_amount', 12, 2)->comment('Tổng tiền điện');
|
||||
$table->string('notes')->nullable()->comment('Ghi chú');
|
||||
$table->string('file_path')->nullable()->comment('Đường dẫn file PDF');
|
||||
$table->unsignedBigInteger('created_by')->nullable();
|
||||
$table->unsignedBigInteger('updated_by')->nullable();
|
||||
$table->timestamps();
|
||||
|
||||
$table->foreign('created_by')->references('id')->on('users')->onDelete('set null');
|
||||
$table->foreign('updated_by')->references('id')->on('users')->onDelete('set null');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('electricity_bills');
|
||||
}
|
||||
};
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
Schema::table('electricity_bills', function (Blueprint $table) {
|
||||
$table->string('attachment_path')->nullable()->after('file_path')
|
||||
->comment('User-uploaded attachment (PDF or image)');
|
||||
});
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('electricity_bills', function (Blueprint $table) {
|
||||
$table->dropColumn('attachment_path');
|
||||
});
|
||||
}
|
||||
};
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('equipments', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->string('code')->unique()->comment('Mã thiết bị (dùng để scan barcode)');
|
||||
$table->string('name')->comment('Tên thiết bị');
|
||||
$table->text('note')->nullable()->comment('Ghi chú');
|
||||
$table->unsignedBigInteger('current_user_id')->nullable()->comment('Người đang sử dụng, null = đang ở kho');
|
||||
$table->timestamp('assigned_at')->nullable()->comment('Thời điểm giao thiết bị hiện tại');
|
||||
$table->unsignedBigInteger('created_by')->nullable();
|
||||
$table->unsignedBigInteger('updated_by')->nullable();
|
||||
$table->timestamps();
|
||||
|
||||
$table->foreign('current_user_id')->references('id')->on('users')->onDelete('set null');
|
||||
$table->foreign('created_by')->references('id')->on('users')->onDelete('set null');
|
||||
$table->foreign('updated_by')->references('id')->on('users')->onDelete('set null');
|
||||
});
|
||||
|
||||
Schema::create('equipment_assignments', function (Blueprint $table) {
|
||||
$table->id();
|
||||
$table->unsignedBigInteger('equipment_id');
|
||||
$table->unsignedBigInteger('user_id')->nullable()->comment('null = trả về kho');
|
||||
$table->timestamp('assigned_at')->comment('Bắt đầu sử dụng');
|
||||
$table->timestamp('returned_at')->nullable()->comment('Trả thiết bị');
|
||||
$table->text('note')->nullable();
|
||||
$table->unsignedBigInteger('created_by')->nullable();
|
||||
$table->timestamps();
|
||||
|
||||
$table->foreign('equipment_id')->references('id')->on('equipments')->onDelete('cascade');
|
||||
$table->foreign('user_id')->references('id')->on('users')->onDelete('set null');
|
||||
$table->foreign('created_by')->references('id')->on('users')->onDelete('set null');
|
||||
|
||||
$table->index(['equipment_id', 'returned_at']);
|
||||
});
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
Schema::dropIfExists('equipment_assignments');
|
||||
Schema::dropIfExists('equipments');
|
||||
}
|
||||
};
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
public function up(): void
|
||||
{
|
||||
Schema::table('equipments', function (Blueprint $table) {
|
||||
$table->string('image_path')->nullable()->after('note')
|
||||
->comment('Ảnh thiết bị (tùy chọn)');
|
||||
});
|
||||
}
|
||||
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('equipments', function (Blueprint $table) {
|
||||
$table->dropColumn('image_path');
|
||||
});
|
||||
}
|
||||
};
|
||||
|
|
@ -23,6 +23,8 @@
|
|||
"@tabler/icons-react": "^3.19.0",
|
||||
"@uiw/react-codemirror": "^4.23.5",
|
||||
"@vanilla-extract/css": "^1.16.0",
|
||||
"@zxing/browser": "^0.2.0",
|
||||
"@zxing/library": "^0.23.0",
|
||||
"axios": "^1.6.1",
|
||||
"clsx": "^2.1.1",
|
||||
"dayjs": "^1.11.10",
|
||||
|
|
|
|||
|
|
@ -35,6 +35,8 @@ export const updateWorkingDays =
|
|||
|
||||
//Category
|
||||
export const getListMaster = API_URL + 'v1/admin/category/get-list-master'
|
||||
export const getWorkDay = API_URL + 'v1/admin/category/work-days'
|
||||
export const updateWorkDay = API_URL + 'v1/admin/category/update-work-days'
|
||||
|
||||
//LeaveManagement
|
||||
export const getLeaveManagement = API_URL + 'v1/admin/leave-management'
|
||||
|
|
@ -123,6 +125,44 @@ export const deleteDocument = API_URL + 'v1/admin/document/delete'
|
|||
// Download File
|
||||
export const downloadFile = API_URL + 'v1/admin/download-file'
|
||||
|
||||
// Electricity Bills
|
||||
export const getElectricityBills = API_URL + 'v1/admin/electricity-bill'
|
||||
export const getElectricityBillById = (id: number) =>
|
||||
API_URL + `v1/admin/electricity-bill/${id}`
|
||||
export const createElectricityBill =
|
||||
API_URL + 'v1/admin/electricity-bill/create'
|
||||
export const updateElectricityBill = (id: number) =>
|
||||
API_URL + `v1/admin/electricity-bill/${id}`
|
||||
export const deleteElectricityBill = (id: number) =>
|
||||
API_URL + `v1/admin/electricity-bill/delete/${id}`
|
||||
export const exportElectricityBillPdf = (id: number) =>
|
||||
API_URL + `v1/admin/electricity-bill/export-pdf/${id}`
|
||||
export const uploadElectricityBillAttachment = (id: number) =>
|
||||
API_URL + `v1/admin/electricity-bill/upload-attachment/${id}`
|
||||
export const deleteElectricityBillAttachment = (id: number) =>
|
||||
API_URL + `v1/admin/electricity-bill/delete-attachment/${id}`
|
||||
|
||||
// Equipments
|
||||
export const getEquipments = API_URL + 'v1/admin/equipment'
|
||||
export const getEquipmentUserOptions = API_URL + 'v1/admin/equipment/users'
|
||||
export const getEquipmentUserStatistics =
|
||||
API_URL + 'v1/admin/equipment/user-statistics'
|
||||
export const exportEquipments = API_URL + 'v1/admin/equipment/export'
|
||||
export const getEquipmentByCode = API_URL + 'v1/admin/equipment/by-code'
|
||||
export const getEquipmentHistory = (id: number) =>
|
||||
API_URL + `v1/admin/equipment/history/${id}`
|
||||
export const createEquipment = API_URL + 'v1/admin/equipment/create'
|
||||
export const updateEquipment = (id: number) =>
|
||||
API_URL + `v1/admin/equipment/${id}`
|
||||
export const assignEquipment = (id: number) =>
|
||||
API_URL + `v1/admin/equipment/${id}/assign`
|
||||
export const uploadEquipmentImage = (id: number) =>
|
||||
API_URL + `v1/admin/equipment/${id}/upload-image`
|
||||
export const deleteEquipmentImage = (id: number) =>
|
||||
API_URL + `v1/admin/equipment/${id}/image`
|
||||
export const deleteEquipment = (id: number) =>
|
||||
API_URL + `v1/admin/equipment/delete/${id}`
|
||||
|
||||
// Files APIs
|
||||
export const getFiles = API_URL + 'v1/admin/profile/files'
|
||||
export const uploadFiles = API_URL + 'v1/admin/profile/upload-files'
|
||||
|
|
|
|||
|
|
@ -250,7 +250,14 @@ export const DataTableAll = ({
|
|||
if (query !== '') {
|
||||
setTData(
|
||||
data.filter((obj) =>
|
||||
Object.values(obj)?.find((c: any) => c.toString().normalize('NFC').toLowerCase().includes(query.normalize('NFC').toLowerCase())))
|
||||
Object.values(obj)?.find((c: any) =>
|
||||
c
|
||||
.toString()
|
||||
.normalize('NFC')
|
||||
.toLowerCase()
|
||||
.includes(query.normalize('NFC').toLowerCase()),
|
||||
),
|
||||
),
|
||||
)
|
||||
} else {
|
||||
if (pagination) {
|
||||
|
|
@ -456,7 +463,7 @@ export const DataTablePagination = ({
|
|||
})
|
||||
const [selectedRows, setSelectedRows] = useState<any[]>([])
|
||||
const navigate = useNavigate()
|
||||
const urlParams = new URLSearchParams(location.search)
|
||||
let urlParams = new URLSearchParams(location.search)
|
||||
|
||||
// Render headers
|
||||
const headers = columns.map((col) => (
|
||||
|
|
@ -596,7 +603,7 @@ export const DataTablePagination = ({
|
|||
|
||||
// Remove specific parameters
|
||||
params.delete(name)
|
||||
|
||||
urlParams.delete(name)
|
||||
// Update the URL without reloading the page
|
||||
window.history.replaceState({}, document.title, url.toString())
|
||||
}
|
||||
|
|
@ -660,9 +667,8 @@ export const DataTablePagination = ({
|
|||
date_used_to: date_used,
|
||||
})
|
||||
}
|
||||
|
||||
// Add all attributes in 'params' to URL params
|
||||
Object.entries(params).forEach((param) => urlParams.set(...param))
|
||||
urlParams = new URLSearchParams(Object.entries(params))
|
||||
Object.entries(dataFilter).forEach(([key, value]) => {
|
||||
const typeFilter = filterInfo.find((o) => o.key === key).type
|
||||
const hasType = {
|
||||
|
|
@ -679,17 +685,16 @@ export const DataTablePagination = ({
|
|||
if (hasType.Date) {
|
||||
value = value ? Date.parse(String(value)) / 1000 : '' // to unix timestamp
|
||||
}
|
||||
|
||||
console.log(String(value))
|
||||
String(value).length
|
||||
? urlParams.set(key, String(value))
|
||||
: urlParams.delete(key)
|
||||
})
|
||||
|
||||
// Request to get data API
|
||||
const res = await get(url, Object.fromEntries(urlParams.entries()))
|
||||
if (res.status) {
|
||||
setBaseData(res)
|
||||
setTData(res.data)
|
||||
setBaseData(res.data?.links ? res?.data : res)
|
||||
setTData(res.data?.data ? res.data?.data : res.data)
|
||||
setSkeletion(false)
|
||||
navigate({
|
||||
pathname: location.pathname,
|
||||
|
|
@ -765,7 +770,7 @@ export const DataTablePagination = ({
|
|||
|
||||
if (order_by_) {
|
||||
const sortParam = {
|
||||
name: order_by_.split('=')[0].split('_')[2],
|
||||
name: order_by_.split('=')[0].split('_').slice(2).join('_'),
|
||||
status: order_by_.split('=')[1],
|
||||
}
|
||||
if (JSON.stringify(sortParam) !== JSON.stringify(statusSort)) {
|
||||
|
|
|
|||
|
|
@ -39,6 +39,7 @@ import {
|
|||
IconReport,
|
||||
IconScan,
|
||||
IconSettings,
|
||||
IconShredder,
|
||||
IconSun,
|
||||
IconTicket,
|
||||
IconUsersGroup,
|
||||
|
|
@ -146,8 +147,8 @@ const data = [
|
|||
link: '/organization-settings',
|
||||
label: 'Organization Settings',
|
||||
icon: IconSettings,
|
||||
group: 'admin',
|
||||
permissions: 'admin',
|
||||
group: 'other',
|
||||
permissions: 'admin,hr',
|
||||
},
|
||||
{
|
||||
link: '/profiles',
|
||||
|
|
@ -156,6 +157,13 @@ const data = [
|
|||
group: 'admin',
|
||||
permissions: 'admin,accountant',
|
||||
},
|
||||
{
|
||||
link: '/office-support',
|
||||
label: 'Office Support',
|
||||
icon: IconShredder,
|
||||
group: 'other',
|
||||
permissions: 'admin,hr,accountant',
|
||||
},
|
||||
// { link: '/jira', label: 'Jira', icon: IconSubtask },
|
||||
// { link: '/custom-theme', label: 'Custom Theme', icon: IconBrush },
|
||||
// { link: '/general-setting', label: 'General Setting', icon: IconSettings },
|
||||
|
|
|
|||
|
|
@ -0,0 +1,48 @@
|
|||
.title {
|
||||
background-color: light-dark(var(white), var(--mantine-color-dark-7));
|
||||
z-index: 100;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
padding: 0 var(--mantine-spacing-sm) var(--mantine-spacing-lg)
|
||||
var(--mantine-spacing-sm);
|
||||
border-bottom: solid rgba(201, 201, 201, 0.377) 1px;
|
||||
}
|
||||
|
||||
.optionIcon {
|
||||
display: flex;
|
||||
justify-content: space-evenly;
|
||||
}
|
||||
|
||||
.deleteIcon {
|
||||
color: red;
|
||||
cursor: pointer;
|
||||
padding: 2px;
|
||||
border-radius: 25%;
|
||||
}
|
||||
|
||||
|
||||
.editIcon {
|
||||
color: rgb(9, 132, 132);
|
||||
cursor: pointer;
|
||||
padding: 2px;
|
||||
border-radius: 25%;
|
||||
}
|
||||
|
||||
.editIcon:hover {
|
||||
background-color: rgba(203, 203, 203, 0.809);
|
||||
}
|
||||
|
||||
.deleteIcon:hover {
|
||||
background-color: rgba(203, 203, 203, 0.809);
|
||||
}
|
||||
|
||||
.dialog {
|
||||
background-color: light-dark(white, #2d353c);
|
||||
text-align: center;
|
||||
border: solid 1px rgb(255, 145, 0);
|
||||
}
|
||||
|
||||
.dialogText {
|
||||
color: light-dark(#2d353c, white);
|
||||
}
|
||||
|
|
@ -0,0 +1,876 @@
|
|||
import {
|
||||
createElectricityBill,
|
||||
deleteElectricityBill,
|
||||
deleteElectricityBillAttachment,
|
||||
exportElectricityBillPdf,
|
||||
getElectricityBills,
|
||||
updateElectricityBill,
|
||||
uploadElectricityBillAttachment,
|
||||
} from '@/api/Admin'
|
||||
import { DataTablePagination } from '@/components/DataTable/DataTable'
|
||||
import { Xdelete } from '@/rtk/helpers/CRUD'
|
||||
import { get, post, put } from '@/rtk/helpers/apiService'
|
||||
import {
|
||||
Box,
|
||||
Button,
|
||||
Dialog,
|
||||
FileButton,
|
||||
Group,
|
||||
Modal,
|
||||
NumberInput,
|
||||
Text,
|
||||
Tabs,
|
||||
Flex,
|
||||
ActionIcon,
|
||||
} from '@mantine/core'
|
||||
import { useForm } from '@mantine/form'
|
||||
import { notifications } from '@mantine/notifications'
|
||||
import axios from 'axios'
|
||||
import {
|
||||
IconDevices,
|
||||
IconDownload,
|
||||
IconEdit,
|
||||
IconEye,
|
||||
IconFileInvoice,
|
||||
IconTrash,
|
||||
IconUpload,
|
||||
IconX,
|
||||
} from '@tabler/icons-react'
|
||||
import moment from 'moment'
|
||||
import { useEffect, useState } from 'react'
|
||||
import classes from './OfficeSupport.module.css'
|
||||
import { _NOTIFICATION_MESS } from '@/rtk/helpers/notificationMess'
|
||||
import { getHeaderInfo } from '@/rtk/helpers/tokenCreator'
|
||||
import { DateInput } from '@mantine/dates'
|
||||
import EquipmentManagement from './EquipmentManagement'
|
||||
|
||||
interface ElectricityBill {
|
||||
id: number
|
||||
billing_date: string
|
||||
previous_reading: number
|
||||
current_reading: number
|
||||
unit_price: number
|
||||
total_amount: number
|
||||
notes: string | null
|
||||
file_path: string | null
|
||||
attachment_path: string | null
|
||||
created_by: number | null
|
||||
updated_by: number | null
|
||||
created_at: string | null
|
||||
updated_at: string | null
|
||||
creator_name?: string
|
||||
updater_name?: string
|
||||
}
|
||||
|
||||
interface ElectricityBillsResponse {
|
||||
data: ElectricityBill[]
|
||||
current_page: number
|
||||
last_page: number
|
||||
per_page: number
|
||||
total: number
|
||||
}
|
||||
|
||||
const OfficeSupport = () => {
|
||||
const [activeTab, setActiveTab] = useState<string | null>('calculate')
|
||||
const [listBills, setListBills] = useState<ElectricityBillsResponse>({
|
||||
data: [],
|
||||
current_page: 1,
|
||||
last_page: 1,
|
||||
per_page: 15,
|
||||
total: 0,
|
||||
})
|
||||
const [action, setAction] = useState('')
|
||||
const [item, setItem] = useState<ElectricityBill | null>(null)
|
||||
const [activeBtn, setActiveBtn] = useState(false)
|
||||
const [disableBtn, setDisableBtn] = useState(false)
|
||||
|
||||
const [confirmModal, setConfirmModal] = useState(false)
|
||||
const [confirmMessage, setConfirmMessage] = useState('')
|
||||
const [confirmValues, setConfirmValues] = useState<any>(null)
|
||||
const [confirmLoading, setConfirmLoading] = useState(false)
|
||||
const [attachmentToDelete, setAttachmentToDelete] =
|
||||
useState<ElectricityBill | null>(null)
|
||||
const filterInfo: any[] = []
|
||||
|
||||
const getAllBills = async (page: number = 1) => {
|
||||
try {
|
||||
const params = { page }
|
||||
const res = await get(getElectricityBills, params)
|
||||
if (res?.data) {
|
||||
setListBills(res?.data)
|
||||
}
|
||||
} catch (error: any) {
|
||||
notifications.show({
|
||||
title: 'Error',
|
||||
message: error.message ?? error,
|
||||
color: 'red',
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
useEffect(() => {
|
||||
getAllBills()
|
||||
}, [])
|
||||
|
||||
const columns = [
|
||||
{
|
||||
name: 'billing_date',
|
||||
size: '15%',
|
||||
header: 'Date',
|
||||
render: (row: ElectricityBill) => {
|
||||
const date = new Date(row.billing_date)
|
||||
return <Text fz={'sm'}>{moment(date).format('DD MMMM YYYY')}</Text>
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'previous_reading',
|
||||
size: '15%',
|
||||
header: 'Previous Reading',
|
||||
render: (row: ElectricityBill) => (
|
||||
<Text fz={'sm'}>
|
||||
{Number(row.previous_reading)?.toLocaleString()} kWh
|
||||
</Text>
|
||||
),
|
||||
},
|
||||
{
|
||||
name: 'current_reading',
|
||||
size: '15%',
|
||||
header: 'Current Reading',
|
||||
render: (row: ElectricityBill) => (
|
||||
<Text fz={'sm'}>
|
||||
{Number(row.current_reading)?.toLocaleString()} kWh
|
||||
</Text>
|
||||
),
|
||||
},
|
||||
{
|
||||
name: '#',
|
||||
size: '10%',
|
||||
header: 'Consumption',
|
||||
render: (row: ElectricityBill) => {
|
||||
const consumption =
|
||||
Number(row.current_reading) - Number(row.previous_reading)
|
||||
return (
|
||||
<Text fz={'sm'} fw={600}>
|
||||
{consumption.toLocaleString()} kWh
|
||||
</Text>
|
||||
)
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'unit_price',
|
||||
size: '10%',
|
||||
header: 'Unit Price',
|
||||
render: (row: ElectricityBill) => (
|
||||
<Text fz={'sm'}>
|
||||
{Number(row.unit_price)?.toLocaleString(undefined, {
|
||||
minimumFractionDigits: 0,
|
||||
})}{' '}
|
||||
VNĐ
|
||||
</Text>
|
||||
),
|
||||
},
|
||||
{
|
||||
name: 'total_amount',
|
||||
size: '15%',
|
||||
header: 'Total Amount',
|
||||
render: (row: ElectricityBill) => (
|
||||
<Text fz={'sm'} fw={700} c="green">
|
||||
{Number(row.total_amount)?.toLocaleString(undefined, {
|
||||
minimumFractionDigits: 0,
|
||||
})}{' '}
|
||||
VNĐ
|
||||
</Text>
|
||||
),
|
||||
},
|
||||
{
|
||||
name: 'actions',
|
||||
size: '15%',
|
||||
header: 'Actions',
|
||||
render: (row: ElectricityBill) => {
|
||||
return (
|
||||
<Group gap="xs">
|
||||
<ActionIcon
|
||||
disabled={disableBtn}
|
||||
onClick={() => handleExportPdf(row.id, row.billing_date)}
|
||||
variant="outline"
|
||||
w={20}
|
||||
h={20}
|
||||
color={'blue'}
|
||||
title="Export PDF"
|
||||
>
|
||||
<IconDownload className={classes.deleteIcon} color="blue" />
|
||||
</ActionIcon>
|
||||
<FileButton
|
||||
onChange={(file) => handleUploadAttachment(row.id, file)}
|
||||
accept="application/pdf,image/jpeg,image/png"
|
||||
>
|
||||
{(props) => (
|
||||
<ActionIcon
|
||||
{...props}
|
||||
disabled={disableBtn}
|
||||
variant="outline"
|
||||
w={20}
|
||||
h={20}
|
||||
color={'purple'}
|
||||
title={
|
||||
row.attachment_path
|
||||
? 'Replace attachment'
|
||||
: 'Upload attachment'
|
||||
}
|
||||
>
|
||||
<IconUpload className={classes.deleteIcon} color="purple" />
|
||||
</ActionIcon>
|
||||
)}
|
||||
</FileButton>
|
||||
{row.attachment_path && (
|
||||
<>
|
||||
<ActionIcon
|
||||
disabled={disableBtn}
|
||||
onClick={() =>
|
||||
window.open(
|
||||
buildAttachmentUrl(row.attachment_path as string),
|
||||
'_blank',
|
||||
)
|
||||
}
|
||||
variant="outline"
|
||||
w={20}
|
||||
h={20}
|
||||
color={'teal'}
|
||||
title="View attachment"
|
||||
>
|
||||
<IconEye className={classes.deleteIcon} color="teal" />
|
||||
</ActionIcon>
|
||||
<ActionIcon
|
||||
disabled={disableBtn}
|
||||
onClick={() => setAttachmentToDelete(row)}
|
||||
variant="outline"
|
||||
w={20}
|
||||
h={20}
|
||||
color={'orange'}
|
||||
title="Remove attachment"
|
||||
>
|
||||
<IconX className={classes.deleteIcon} color="orange" />
|
||||
</ActionIcon>
|
||||
</>
|
||||
)}
|
||||
<ActionIcon
|
||||
disabled={disableBtn}
|
||||
onClick={() => {
|
||||
setItem(row)
|
||||
setAction('edit')
|
||||
form.setFieldValue(
|
||||
'billing_date',
|
||||
row?.billing_date || moment().format('YYYY-MM-DD'),
|
||||
)
|
||||
form.setFieldValue(
|
||||
'current_reading',
|
||||
Number(row?.current_reading) || 0,
|
||||
)
|
||||
form.setFieldValue(
|
||||
'previous_reading',
|
||||
Number(row?.previous_reading) || 0,
|
||||
)
|
||||
form.setFieldValue('unit_price', row?.unit_price || 4000)
|
||||
form.setFieldValue('notes', row?.notes || '')
|
||||
}}
|
||||
variant="outline"
|
||||
w={20}
|
||||
h={20}
|
||||
color={'green'}
|
||||
title="Edit"
|
||||
>
|
||||
<IconEdit className={classes.deleteIcon} color="green" />
|
||||
</ActionIcon>
|
||||
<ActionIcon
|
||||
disabled={disableBtn}
|
||||
onClick={() => {
|
||||
setAction('delete')
|
||||
setItem(row)
|
||||
}}
|
||||
variant="outline"
|
||||
w={20}
|
||||
h={20}
|
||||
color={'red'}
|
||||
title="Delete"
|
||||
>
|
||||
<IconTrash className={classes.deleteIcon} color="red" />
|
||||
</ActionIcon>
|
||||
</Group>
|
||||
)
|
||||
},
|
||||
},
|
||||
]
|
||||
|
||||
const handleCreate = async (values: any) => {
|
||||
try {
|
||||
setDisableBtn(true)
|
||||
|
||||
const params = {
|
||||
billing_date: values.billing_date,
|
||||
previous_reading: values.previous_reading,
|
||||
current_reading: values.current_reading,
|
||||
unit_price: values.unit_price,
|
||||
notes: values.notes || null,
|
||||
}
|
||||
|
||||
let res
|
||||
if (action === 'add') {
|
||||
res = await post(createElectricityBill, params)
|
||||
} else if (action === 'edit' && item) {
|
||||
res = await put(updateElectricityBill(item.id), params)
|
||||
}
|
||||
|
||||
if (res?.status) {
|
||||
notifications.show({
|
||||
title: 'Success',
|
||||
message:
|
||||
action === 'add'
|
||||
? _NOTIFICATION_MESS.create_success
|
||||
: 'Updated successfully',
|
||||
color: 'green',
|
||||
})
|
||||
setAction('')
|
||||
form.reset()
|
||||
|
||||
// Auto export PDF after creating
|
||||
if (action === 'add' && res.data?.id) {
|
||||
handleExportPdf(res.data.id, res.data.billing_date)
|
||||
}
|
||||
|
||||
getAllBills()
|
||||
} else if (!res?.status && res?.errors) {
|
||||
if (!res?.data?.status && res?.data?.message) {
|
||||
setConfirmMessage(res.data?.message)
|
||||
setConfirmValues(values)
|
||||
setConfirmModal(true)
|
||||
} else {
|
||||
notifications.show({
|
||||
title: 'Error',
|
||||
message: res.message ?? _NOTIFICATION_MESS.create_error,
|
||||
color: 'red',
|
||||
})
|
||||
}
|
||||
}
|
||||
} catch (error: any) {
|
||||
if (error.response?.message) {
|
||||
const errorMess = error.response.message
|
||||
notifications.show({
|
||||
title: 'Error',
|
||||
message: errorMess,
|
||||
color: 'red',
|
||||
})
|
||||
}
|
||||
} finally {
|
||||
setDisableBtn(false)
|
||||
}
|
||||
}
|
||||
|
||||
const handleDelete = async (id: number) => {
|
||||
try {
|
||||
await Xdelete(deleteElectricityBill(id), {}, () => getAllBills())
|
||||
} catch (error) {
|
||||
console.log(error)
|
||||
}
|
||||
}
|
||||
|
||||
const handleExportPdf = async (id: number, date: string) => {
|
||||
try {
|
||||
setDisableBtn(true)
|
||||
const header = await getHeaderInfo()
|
||||
const res = await fetch(exportElectricityBillPdf(id), { ...header })
|
||||
|
||||
if (!res.ok) throw new Error('Export failed')
|
||||
|
||||
const blob = await res.blob()
|
||||
const url = window.URL.createObjectURL(blob)
|
||||
const newDate = moment(new Date(date)).format('DD-M-YYYY')
|
||||
const a = document.createElement('a')
|
||||
a.href = url
|
||||
a.download = `Bảng thanh toán tiền điện APAC - ${newDate}.pdf`
|
||||
a.click()
|
||||
|
||||
// notifications.show({
|
||||
// title: 'Success',
|
||||
// message: 'PDF exported successfully',
|
||||
// color: 'green',
|
||||
// })
|
||||
setDisableBtn(false)
|
||||
} catch (error: any) {
|
||||
setDisableBtn(false)
|
||||
notifications.show({
|
||||
title: 'Error',
|
||||
message: error.message,
|
||||
color: 'red',
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
const handleUploadAttachment = async (id: number, file: File | null) => {
|
||||
if (!file) return
|
||||
|
||||
const allowedTypes = [
|
||||
'application/pdf',
|
||||
'image/jpeg',
|
||||
'image/png',
|
||||
'image/gif',
|
||||
'image/webp',
|
||||
]
|
||||
if (!allowedTypes.includes(file.type)) {
|
||||
notifications.show({
|
||||
title: 'Error',
|
||||
message: 'Only PDF or image files are allowed',
|
||||
color: 'red',
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
if (file.size > 10 * 1024 * 1024) {
|
||||
notifications.show({
|
||||
title: 'Error',
|
||||
message: 'File size must be 10MB or less',
|
||||
color: 'red',
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
try {
|
||||
setDisableBtn(true)
|
||||
const header = await getHeaderInfo()
|
||||
header.headers['Content-Type'] = 'multipart/form-data'
|
||||
const formData = new FormData()
|
||||
formData.append('file', file)
|
||||
|
||||
const res = await axios.post(
|
||||
uploadElectricityBillAttachment(id),
|
||||
formData,
|
||||
header,
|
||||
)
|
||||
|
||||
if (res?.data?.status) {
|
||||
notifications.show({
|
||||
title: 'Success',
|
||||
message: 'Attachment uploaded successfully',
|
||||
color: 'green',
|
||||
})
|
||||
getAllBills(listBills.current_page)
|
||||
} else {
|
||||
notifications.show({
|
||||
title: 'Error',
|
||||
message: res?.data?.message ?? 'Upload failed',
|
||||
color: 'red',
|
||||
})
|
||||
}
|
||||
} catch (error: any) {
|
||||
notifications.show({
|
||||
title: 'Error',
|
||||
message: error?.response?.data?.message ?? error.message,
|
||||
color: 'red',
|
||||
})
|
||||
} finally {
|
||||
setDisableBtn(false)
|
||||
}
|
||||
}
|
||||
|
||||
const handleDeleteAttachment = async (id: number) => {
|
||||
try {
|
||||
setDisableBtn(true)
|
||||
const header = await getHeaderInfo()
|
||||
const res = await axios.delete(
|
||||
deleteElectricityBillAttachment(id),
|
||||
header,
|
||||
)
|
||||
|
||||
if (res?.data?.status) {
|
||||
notifications.show({
|
||||
title: 'Success',
|
||||
message: 'Attachment deleted successfully',
|
||||
color: 'green',
|
||||
})
|
||||
getAllBills(listBills.current_page)
|
||||
} else {
|
||||
notifications.show({
|
||||
title: 'Error',
|
||||
message: res?.data?.message ?? 'Delete failed',
|
||||
color: 'red',
|
||||
})
|
||||
}
|
||||
} catch (error: any) {
|
||||
notifications.show({
|
||||
title: 'Error',
|
||||
message: error?.response?.data?.message ?? error.message,
|
||||
color: 'red',
|
||||
})
|
||||
} finally {
|
||||
setDisableBtn(false)
|
||||
setAttachmentToDelete(null)
|
||||
}
|
||||
}
|
||||
|
||||
const buildAttachmentUrl = (path: string) => {
|
||||
const base = import.meta.env.VITE_BACKEND_URL
|
||||
return base.includes('local')
|
||||
? base + 'storage/' + path
|
||||
: base + 'image/storage/' + path
|
||||
}
|
||||
|
||||
const getLastReading = () => {
|
||||
if (!listBills?.data?.length) return 0
|
||||
|
||||
const sorted = [...listBills.data].sort(
|
||||
(a, b) =>
|
||||
new Date(b.billing_date).getTime() - new Date(a.billing_date).getTime(),
|
||||
)
|
||||
return sorted[0] ? Number(sorted[0]?.current_reading) : 0
|
||||
}
|
||||
|
||||
const form = useForm({
|
||||
initialValues: {
|
||||
id: 0,
|
||||
billing_date: moment().format('YYYY-MM-DD'),
|
||||
previous_reading: 0,
|
||||
current_reading: 0,
|
||||
unit_price: 4000,
|
||||
notes: '',
|
||||
},
|
||||
validate: {
|
||||
billing_date: (value) => (!value ? 'Date is required' : null),
|
||||
previous_reading: (value) =>
|
||||
value < 0 ? 'Previous reading must be positive' : null,
|
||||
current_reading: (value) =>
|
||||
value < 0 ? 'Current reading must be positive' : null,
|
||||
unit_price: (value) =>
|
||||
value <= 0 ? 'Unit price must be greater than 0' : null,
|
||||
},
|
||||
})
|
||||
|
||||
// Calculate preview
|
||||
const calculatePreview = () => {
|
||||
const consumption =
|
||||
form.values.current_reading - form.values.previous_reading
|
||||
const total = consumption * form.values.unit_price
|
||||
return { consumption, total }
|
||||
}
|
||||
|
||||
return (
|
||||
<div>
|
||||
<div className={classes.title}>
|
||||
<h3>Office Support</h3>
|
||||
</div>
|
||||
|
||||
<Box p={20}>
|
||||
<Tabs value={activeTab} onChange={setActiveTab}>
|
||||
<Tabs.List>
|
||||
<Tabs.Tab
|
||||
value="calculate"
|
||||
leftSection={<IconFileInvoice size={16} />}
|
||||
>
|
||||
Electricity Bill
|
||||
</Tabs.Tab>
|
||||
<Tabs.Tab
|
||||
value="equipment"
|
||||
leftSection={<IconDevices size={16} />}
|
||||
>
|
||||
Equipment Management
|
||||
</Tabs.Tab>
|
||||
</Tabs.List>
|
||||
|
||||
<Tabs.Panel value="calculate" pt="md">
|
||||
{/* Calculate Tab Content */}
|
||||
<Box>
|
||||
<Button
|
||||
m={5}
|
||||
onClick={() => {
|
||||
setAction('add')
|
||||
form.reset()
|
||||
form.setFieldValue('previous_reading', getLastReading())
|
||||
form.setFieldValue('current_reading', getLastReading())
|
||||
}}
|
||||
>
|
||||
+ Add New Bill
|
||||
</Button>
|
||||
</Box>
|
||||
{/* History Tab Content */}
|
||||
{listBills.data.length > 0 ? (
|
||||
<DataTablePagination
|
||||
filterInfo={filterInfo}
|
||||
data={listBills}
|
||||
columns={columns}
|
||||
searchInput
|
||||
size=""
|
||||
/>
|
||||
) : (
|
||||
<Text c="dimmed" ta="center" py="xl">
|
||||
No electricity bills found.
|
||||
</Text>
|
||||
)}
|
||||
</Tabs.Panel>
|
||||
|
||||
<Tabs.Panel value="equipment" pt="md">
|
||||
<EquipmentManagement />
|
||||
</Tabs.Panel>
|
||||
</Tabs>
|
||||
</Box>
|
||||
|
||||
{/* Add/Edit Modal */}
|
||||
<Modal
|
||||
opened={action === 'add' || action === 'edit'}
|
||||
onClose={() => {
|
||||
setAction('')
|
||||
setItem(null)
|
||||
form.reset()
|
||||
}}
|
||||
title={
|
||||
<Text pl={'sm'} fw={700} fz={'lg'}>
|
||||
{action === 'add' && 'Add Electricity Bill'}
|
||||
{action === 'edit' && 'Edit Electricity Bill'}
|
||||
</Text>
|
||||
}
|
||||
size="lg"
|
||||
>
|
||||
<form
|
||||
onSubmit={form.onSubmit(async (values) => {
|
||||
setDisableBtn(true)
|
||||
await handleCreate(values)
|
||||
setDisableBtn(false)
|
||||
})}
|
||||
>
|
||||
<Box pl={'md'} pr={'md'}>
|
||||
<DateInput
|
||||
required
|
||||
mb="md"
|
||||
label="Billing Date"
|
||||
placeholder="Pick date"
|
||||
valueFormat="DD-MM-YYYY"
|
||||
value={
|
||||
form.values.billing_date
|
||||
? new Date(form.values.billing_date)
|
||||
: null
|
||||
}
|
||||
error={form.errors.billing_date}
|
||||
onChange={(date) =>
|
||||
form.setFieldValue(
|
||||
'billing_date',
|
||||
date ? moment(date).format('YYYY-MM-DD') : '',
|
||||
)
|
||||
}
|
||||
/>
|
||||
|
||||
<Flex gap={'md'}>
|
||||
<Box style={{ flex: 1 }}>
|
||||
<NumberInput
|
||||
required
|
||||
mb={'md'}
|
||||
label={'Previous Reading (kWh)'}
|
||||
value={form.values.previous_reading}
|
||||
error={form.errors.previous_reading}
|
||||
onChange={(e) =>
|
||||
form.setFieldValue('previous_reading', Number(e))
|
||||
}
|
||||
min={0}
|
||||
thousandSeparator=","
|
||||
/>
|
||||
</Box>
|
||||
<Box style={{ flex: 1 }}>
|
||||
<NumberInput
|
||||
required
|
||||
mb={'md'}
|
||||
label={'Current Reading (kWh)'}
|
||||
value={form.values.current_reading}
|
||||
error={form.errors.current_reading}
|
||||
onChange={(e) =>
|
||||
form.setFieldValue('current_reading', Number(e))
|
||||
}
|
||||
min={0}
|
||||
thousandSeparator=","
|
||||
/>
|
||||
</Box>
|
||||
</Flex>
|
||||
|
||||
<NumberInput
|
||||
required
|
||||
mb={'md'}
|
||||
label={'Unit Price (VNĐ/kWh)'}
|
||||
value={form.values.unit_price}
|
||||
error={form.errors.unit_price}
|
||||
onChange={(e) => form.setFieldValue('unit_price', Number(e))}
|
||||
min={0}
|
||||
thousandSeparator=","
|
||||
/>
|
||||
|
||||
{/* Preview */}
|
||||
<Box
|
||||
p="md"
|
||||
style={{
|
||||
backgroundColor: '#f8f9fa',
|
||||
borderRadius: '8px',
|
||||
marginBottom: '16px',
|
||||
}}
|
||||
>
|
||||
<Text fw={600} mb="sm">
|
||||
Preview:
|
||||
</Text>
|
||||
<Text>
|
||||
Consumption:{' '}
|
||||
<Text span fw={600}>
|
||||
{calculatePreview().consumption.toLocaleString()} kWh
|
||||
</Text>
|
||||
</Text>
|
||||
<Text>
|
||||
Total Amount:{' '}
|
||||
<Text span fw={700} c="green" size="lg">
|
||||
{calculatePreview().total.toLocaleString()} VNĐ
|
||||
</Text>
|
||||
</Text>
|
||||
</Box>
|
||||
|
||||
<Box ta={'center'}>
|
||||
<Button
|
||||
mt={'lg'}
|
||||
bg={'green'}
|
||||
type="submit"
|
||||
disabled={disableBtn}
|
||||
>
|
||||
{action === 'add' ? 'Create & Export PDF' : 'Update'}
|
||||
</Button>
|
||||
</Box>
|
||||
</Box>
|
||||
</form>
|
||||
</Modal>
|
||||
|
||||
{/* Delete Confirmation Dialog */}
|
||||
<Dialog
|
||||
className={classes.dialog}
|
||||
opened={action === 'delete'}
|
||||
withCloseButton
|
||||
onClose={() => setAction('')}
|
||||
size="lg"
|
||||
radius="md"
|
||||
position={{ top: 30, right: 10 }}
|
||||
>
|
||||
<Text className={classes.dialogText} size="sm" mb="xs" fw={500}>
|
||||
Do you want to delete this record?
|
||||
<Group justify="center" m={10}>
|
||||
<Button
|
||||
disabled={activeBtn}
|
||||
fw={700}
|
||||
size="xs"
|
||||
variant="light"
|
||||
onClick={async () => {
|
||||
setActiveBtn(true)
|
||||
if (item) {
|
||||
await handleDelete(item.id)
|
||||
}
|
||||
setActiveBtn(false)
|
||||
setAction('')
|
||||
setItem(null)
|
||||
}}
|
||||
>
|
||||
Yes
|
||||
</Button>
|
||||
<Button
|
||||
fw={700}
|
||||
size="xs"
|
||||
variant="light"
|
||||
onClick={() => {
|
||||
setAction('')
|
||||
setItem(null)
|
||||
}}
|
||||
>
|
||||
Cancel
|
||||
</Button>
|
||||
</Group>
|
||||
</Text>
|
||||
</Dialog>
|
||||
|
||||
{/* Remove Attachment Confirmation */}
|
||||
<Modal
|
||||
opened={!!attachmentToDelete}
|
||||
onClose={() => setAttachmentToDelete(null)}
|
||||
title={
|
||||
<Text fw={700} fz="lg">
|
||||
Remove Attachment
|
||||
</Text>
|
||||
}
|
||||
centered
|
||||
>
|
||||
<Box p="md">
|
||||
<Text mb={20}>
|
||||
Are you sure you want to remove the attached file for this bill?
|
||||
</Text>
|
||||
<Group justify="center">
|
||||
<Button
|
||||
color="red"
|
||||
disabled={disableBtn}
|
||||
onClick={() => {
|
||||
if (attachmentToDelete) {
|
||||
handleDeleteAttachment(attachmentToDelete.id)
|
||||
}
|
||||
}}
|
||||
>
|
||||
Remove
|
||||
</Button>
|
||||
<Button
|
||||
variant="default"
|
||||
disabled={disableBtn}
|
||||
onClick={() => setAttachmentToDelete(null)}
|
||||
>
|
||||
Cancel
|
||||
</Button>
|
||||
</Group>
|
||||
</Box>
|
||||
</Modal>
|
||||
|
||||
{/* Confirm Modal */}
|
||||
<Modal
|
||||
opened={confirmModal}
|
||||
onClose={() => !confirmLoading && setConfirmModal(false)}
|
||||
title={
|
||||
<Text fw={700} fz="lg">
|
||||
Warning
|
||||
</Text>
|
||||
}
|
||||
centered
|
||||
closeOnClickOutside={!confirmLoading}
|
||||
closeOnEscape={!confirmLoading}
|
||||
>
|
||||
<Box p="md">
|
||||
<Text style={{ whiteSpace: 'pre-line' }} mb={20}>
|
||||
{confirmMessage}
|
||||
</Text>
|
||||
<Group justify="center">
|
||||
<Button
|
||||
color="green"
|
||||
loading={confirmLoading}
|
||||
onClick={async () => {
|
||||
if (confirmValues) {
|
||||
try {
|
||||
setConfirmLoading(true)
|
||||
await handleCreate(confirmValues)
|
||||
setConfirmLoading(false)
|
||||
setConfirmModal(false)
|
||||
} catch (error) {
|
||||
setConfirmLoading(false)
|
||||
console.error(error)
|
||||
}
|
||||
}
|
||||
}}
|
||||
>
|
||||
Confirm
|
||||
</Button>
|
||||
<Button
|
||||
color="red"
|
||||
disabled={confirmLoading}
|
||||
onClick={() => {
|
||||
setConfirmModal(false)
|
||||
}}
|
||||
>
|
||||
Cancel
|
||||
</Button>
|
||||
</Group>
|
||||
</Box>
|
||||
</Modal>
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
export default OfficeSupport
|
||||
|
|
@ -1,28 +1,47 @@
|
|||
import { useEffect, useState } from 'react'
|
||||
import {
|
||||
Alert,
|
||||
Box,
|
||||
Button,
|
||||
Code,
|
||||
Dialog,
|
||||
Flex,
|
||||
Grid,
|
||||
Group,
|
||||
Loader,
|
||||
LoadingOverlay,
|
||||
Modal,
|
||||
Paper,
|
||||
Select,
|
||||
Tabs,
|
||||
Text,
|
||||
TextInput,
|
||||
Title,
|
||||
} from '@mantine/core'
|
||||
import classes from './OrganizationSettings.module.css'
|
||||
import DataTableAll from '@/components/DataTable/DataTable'
|
||||
import { get, post } from '@/rtk/helpers/apiService'
|
||||
import { get, post, put } from '@/rtk/helpers/apiService'
|
||||
import { notifications } from '@mantine/notifications'
|
||||
import { createTechnical, deleteTechnical, listTechnical } from '@/api/Admin'
|
||||
import {
|
||||
createTechnical,
|
||||
deleteTechnical,
|
||||
getWorkDay,
|
||||
listTechnical,
|
||||
updateWorkDay,
|
||||
} from '@/api/Admin'
|
||||
import { useForm } from '@mantine/form'
|
||||
import { Xdelete } from '@/rtk/helpers/CRUD'
|
||||
import moment from 'moment'
|
||||
import { DatePickerInput } from '@mantine/dates'
|
||||
import { IconInfoCircle } from '@tabler/icons-react'
|
||||
import dayjs from 'dayjs'
|
||||
import customParseFormat from 'dayjs/plugin/customParseFormat'
|
||||
import { checkPermissionAdmin } from '@/rtk/localStorage'
|
||||
|
||||
dayjs.extend(customParseFormat)
|
||||
|
||||
function OrganizationSettings() {
|
||||
const [activeTab, setActiveTab] = useState<string | null>('technical')
|
||||
const [activeTab, setActiveTab] = useState<string | null>('work-day')
|
||||
|
||||
return (
|
||||
<div>
|
||||
|
|
@ -36,22 +55,22 @@ function OrganizationSettings() {
|
|||
<Box w="100%" display={'flex'} mt={15} ml={10}>
|
||||
<Tabs w="100%" value={activeTab} onChange={setActiveTab}>
|
||||
<Tabs.List>
|
||||
<Tabs.Tab value="work-day">Work Day Setting</Tabs.Tab>
|
||||
|
||||
{checkPermissionAdmin('admin') && (
|
||||
<Tabs.Tab value="technical">Technical Setting</Tabs.Tab>
|
||||
<Tabs.Tab value="second">Setting 2</Tabs.Tab>
|
||||
<Tabs.Tab value="third">Setting 3</Tabs.Tab>
|
||||
)}
|
||||
</Tabs.List>
|
||||
|
||||
<Tabs.Panel value="work-day" pt="xs">
|
||||
<WorkDaySettingTab />
|
||||
</Tabs.Panel>
|
||||
|
||||
{checkPermissionAdmin('admin') && (
|
||||
<Tabs.Panel value="technical" pt="xs">
|
||||
<TechnicalSettingTab />
|
||||
</Tabs.Panel>
|
||||
|
||||
<Tabs.Panel value="second" pt="xs">
|
||||
Setting 2
|
||||
</Tabs.Panel>
|
||||
|
||||
<Tabs.Panel value="third" pt="xs">
|
||||
Setting 3
|
||||
</Tabs.Panel>
|
||||
)}
|
||||
</Tabs>
|
||||
</Box>
|
||||
</div>
|
||||
|
|
@ -330,4 +349,126 @@ const TechnicalSettingTab = () => {
|
|||
)
|
||||
}
|
||||
|
||||
const WorkDaySettingTab = () => {
|
||||
const [workDay, setWorkDay] = useState<any>(null)
|
||||
const [isLoading, setIsLoading] = useState(false)
|
||||
const [isSaving, setIsSaving] = useState(false)
|
||||
const [selectedDate, setSelectedDate] = useState<Date | null>(null)
|
||||
|
||||
useEffect(() => {
|
||||
getWorkDays()
|
||||
}, [])
|
||||
|
||||
const getWorkDays = async () => {
|
||||
try {
|
||||
setIsLoading(true)
|
||||
const res = await get(getWorkDay, {})
|
||||
if (res.status && res.data?.length > 0) {
|
||||
const item = res.data[0]
|
||||
setWorkDay(item)
|
||||
const parsed = dayjs(item.c_code, 'DD-MM-YYYY').toDate()
|
||||
setSelectedDate(parsed)
|
||||
}
|
||||
} catch (error: any) {
|
||||
notifications.show({
|
||||
title: 'Error',
|
||||
message: error.message ?? error,
|
||||
color: 'red',
|
||||
})
|
||||
} finally {
|
||||
setIsLoading(false)
|
||||
}
|
||||
}
|
||||
|
||||
const handleSave = async () => {
|
||||
if (!selectedDate) return
|
||||
try {
|
||||
setIsSaving(true)
|
||||
const payload = {
|
||||
c_code: dayjs(selectedDate).format('DD-MM-YYYY'),
|
||||
}
|
||||
const res = await put(`${updateWorkDay}`, payload)
|
||||
if (res.status) {
|
||||
notifications.show({
|
||||
title: 'Success',
|
||||
message: res.message,
|
||||
color: 'green',
|
||||
})
|
||||
}
|
||||
} catch (error: any) {
|
||||
notifications.show({
|
||||
title: 'Error',
|
||||
message: error.message ?? error,
|
||||
color: 'red',
|
||||
})
|
||||
} finally {
|
||||
setIsSaving(false)
|
||||
}
|
||||
}
|
||||
|
||||
const handleReset = () => {
|
||||
if (!workDay) return
|
||||
const parsed = dayjs(workDay.c_code, 'DD-MM-YYYY').toDate()
|
||||
setSelectedDate(parsed)
|
||||
}
|
||||
|
||||
return (
|
||||
<Box>
|
||||
<LoadingOverlay visible={isLoading} />
|
||||
|
||||
<Title order={4} mb="xs">
|
||||
Set up Saturday as a working day.
|
||||
</Title>
|
||||
|
||||
<Paper withBorder p="lg" radius="md">
|
||||
<Grid>
|
||||
<Grid.Col span={12}>
|
||||
<DatePickerInput
|
||||
label="Saturday Work Start Date"
|
||||
description="Weeks starting from this date will include Saturday as a working day."
|
||||
placeholder="Select Date"
|
||||
value={selectedDate}
|
||||
onChange={setSelectedDate}
|
||||
valueFormat="DD/MM/YYYY"
|
||||
clearable={false}
|
||||
excludeDate={(date) => date.getDay() === 0}
|
||||
/>
|
||||
</Grid.Col>
|
||||
</Grid>
|
||||
|
||||
{selectedDate && (
|
||||
<Alert
|
||||
mt="md"
|
||||
variant="light"
|
||||
color="blue"
|
||||
icon={<IconInfoCircle size={16} />}
|
||||
>
|
||||
Starting from{' '}
|
||||
<Text span fw={500}>
|
||||
{dayjs(selectedDate).format('DD/MM/YYYY')}
|
||||
</Text>
|
||||
, Saturdays will be treated as working days in applicable weeks.
|
||||
</Alert>
|
||||
)}
|
||||
|
||||
<Group justify="flex-end" mt="lg" gap="sm">
|
||||
<Button variant="default" onClick={handleReset} disabled={isSaving}>
|
||||
Cancel
|
||||
</Button>
|
||||
<Button onClick={handleSave} loading={isSaving}>
|
||||
Save change
|
||||
</Button>
|
||||
</Group>
|
||||
</Paper>
|
||||
|
||||
<Paper withBorder p="sm" radius="md" mt="sm" bg="gray.0">
|
||||
<Text size="xs" c="dimmed">
|
||||
Setting type:{' '}
|
||||
<Code>{workDay?.c_type ?? 'SATURDAY_WORK_SCHEDULE'}</Code>
|
||||
</Text>
|
||||
</Paper>
|
||||
</Box>
|
||||
)
|
||||
}
|
||||
|
||||
export default OrganizationSettings
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ import PageLogin from '@/pages/Auth/Login/Login'
|
|||
import Document from '@/pages/Document/Document'
|
||||
import LeaveManagement from '@/pages/LeaveManagement/LeaveManagement'
|
||||
import PageNotFound from '@/pages/NotFound/NotFound'
|
||||
import OfficeSupport from '@/pages/OfficeSupport/OfficeSupport'
|
||||
import OrganizationSettings from '@/pages/OrganizationSettings/OrganizationSettings'
|
||||
import Profile from '@/pages/Profile/Profile'
|
||||
import SprintReview from '@/pages/SprintReview/SprintReview'
|
||||
|
|
@ -239,7 +240,7 @@ const mainRoutes = [
|
|||
{
|
||||
path: '/organization-settings',
|
||||
element: (
|
||||
<ProtectedRoute mode="route" permission="admin">
|
||||
<ProtectedRoute mode="route" permission="admin,hr">
|
||||
<BasePage
|
||||
main={
|
||||
<>
|
||||
|
|
@ -264,6 +265,20 @@ const mainRoutes = [
|
|||
</ProtectedRoute>
|
||||
),
|
||||
},
|
||||
{
|
||||
path: '/office-support',
|
||||
element: (
|
||||
<ProtectedRoute mode="route" permission="admin,hr,accountant">
|
||||
<BasePage
|
||||
main={
|
||||
<>
|
||||
<OfficeSupport />
|
||||
</>
|
||||
}
|
||||
></BasePage>
|
||||
</ProtectedRoute>
|
||||
),
|
||||
},
|
||||
// {
|
||||
// path: '/packages',
|
||||
// element: (
|
||||
|
|
|
|||
|
|
@ -36,7 +36,11 @@ export const create = async (
|
|||
if (res.status === false) {
|
||||
notifications.show({
|
||||
title: 'Error',
|
||||
message: <div style={{ whiteSpace: 'pre-line' }}>{res.message ?? _NOTIFICATION_MESS.create_error}</div>,
|
||||
message: (
|
||||
<div style={{ whiteSpace: 'pre-line' }}>
|
||||
{res.message ?? _NOTIFICATION_MESS.create_error}
|
||||
</div>
|
||||
),
|
||||
color: 'red',
|
||||
})
|
||||
}
|
||||
|
|
@ -116,7 +120,7 @@ export const Xdelete = async (url: string, data: any, fnc?: () => void) => {
|
|||
try {
|
||||
const res = await get(url, data)
|
||||
|
||||
if (res.status) {
|
||||
if (res.status || res.success) {
|
||||
notifications.show({
|
||||
title: 'Success',
|
||||
message: _NOTIFICATION_MESS.delete_success,
|
||||
|
|
@ -124,7 +128,7 @@ export const Xdelete = async (url: string, data: any, fnc?: () => void) => {
|
|||
})
|
||||
fnc && fnc()
|
||||
}
|
||||
if (res.status === false) {
|
||||
if (res.status === false && !res.success) {
|
||||
notifications.show({
|
||||
title: 'Error',
|
||||
message: res.message ?? _NOTIFICATION_MESS.delete_error,
|
||||
|
|
|
|||
|
|
@ -1,2 +1,6 @@
|
|||
path
|
||||
__pycache__
|
||||
images
|
||||
uploads
|
||||
venv
|
||||
log.log
|
||||
|
|
@ -0,0 +1 @@
|
|||
{}
|
||||
|
|
@ -0,0 +1,134 @@
|
|||
# TrackingToolWeb — CLAUDE.md
|
||||
|
||||
## Tổng quan dự án
|
||||
|
||||
Hệ thống điểm danh khuôn mặt (Face Check-in) tích hợp với Management System tại `ms.prology.net`. Camera nhận diện khuôn mặt → FastAPI backend so khớp → ghi log → đồng bộ sang hệ thống quản lý.
|
||||
|
||||
---
|
||||
|
||||
## Kiến trúc
|
||||
|
||||
```
|
||||
Frontend (React/Vite) → Backend (FastAPI/Python) → MySQL
|
||||
↓
|
||||
External MS API (ms.prology.net)
|
||||
```
|
||||
|
||||
**Backend**: `main.py` (FastAPI) + `api.py` (external calls) + `sync.py` (data sync)
|
||||
**Frontend**: `client/src/` — React 19, TypeScript, TailwindCSS, Zustand
|
||||
**Database**: MySQL — database `face_checkin`
|
||||
**Deployment**: Backend phục vụ luôn frontend build (`static/`) qua route `/`
|
||||
|
||||
---
|
||||
|
||||
## Commands
|
||||
|
||||
### Backend
|
||||
```bash
|
||||
# Development
|
||||
uvicorn main:app --reload
|
||||
|
||||
# Production
|
||||
nohup uvicorn main:app --host 172.16.6.38 --port 8080 > log.log 2>&1 &
|
||||
```
|
||||
|
||||
### Frontend
|
||||
```bash
|
||||
cd client
|
||||
npm run dev # dev server (Vite HMR)
|
||||
npm run build # build to client/dist/
|
||||
npm run lint # ESLint
|
||||
```
|
||||
|
||||
### Deploy frontend
|
||||
Sau khi build, copy `client/dist/` vào `static/`. Đảm bảo asset paths trong `index.html` dùng prefix `/camera/static/assets/`.
|
||||
|
||||
---
|
||||
|
||||
## Cấu hình
|
||||
|
||||
### Backend (hardcoded — cần đưa vào .env)
|
||||
| Biến | Giá trị hiện tại | File |
|
||||
|------|-----------------|------|
|
||||
| DB URL | `mysql+pymysql://root:123@localhost/face_checkin` | `database.py` |
|
||||
| MS API base | `https://ms.prology.net/api/v1` | `api.py` |
|
||||
| JWT token | hardcoded string | `api.py` |
|
||||
| Face threshold | `0.42` | `main.py:217` |
|
||||
| Ratio threshold | `0.85` | `main.py:286` |
|
||||
| Recent check window | 0.5 phút | `main.py` |
|
||||
|
||||
### Frontend (.env trong `client/`)
|
||||
```
|
||||
VITE_API_BASE_URL=/camera # production (proxy qua nginx)
|
||||
VITE_API_BASE_MS=https://ms.prology.net
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## API Endpoints
|
||||
|
||||
| Method | Path | Mô tả |
|
||||
|--------|------|-------|
|
||||
| GET | `/` | Phục vụ `static/index.html` |
|
||||
| POST | `/register` | Đăng ký khuôn mặt (name, email, file ảnh) |
|
||||
| POST | `/register-simple` | Đăng ký/cập nhật user không cần ảnh |
|
||||
| POST | `/checkin` | Nhận diện & điểm danh (file ảnh, camera_id) |
|
||||
| GET | `/logs` | 20 log điểm danh gần nhất |
|
||||
| GET | `/users` | Danh sách users + 5 checkpoint gần nhất |
|
||||
|
||||
---
|
||||
|
||||
## Database Schema
|
||||
|
||||
```sql
|
||||
students (id, name, email UNIQUE, avatar)
|
||||
student_encodings (id, student_id FK, encoding BLOB[1024 bytes = 128 float64], created_at)
|
||||
checkin_logs (id, student_id FK, time, camera_id, status[check in/check out])
|
||||
```
|
||||
|
||||
**Encoding format**: `np.float64` array 128 chiều → `.tobytes()` → BLOB 1024 bytes
|
||||
**Giải mã**: `np.frombuffer(blob, dtype=np.float64)` — validate `enc.size == 128`
|
||||
|
||||
---
|
||||
|
||||
## Logic nhận diện khuôn mặt (`/checkin`)
|
||||
|
||||
1. Nhận ảnh JPEG → lưu tạm `uploads/checkin.jpg`
|
||||
2. `face_recognition.face_encodings()` → encoding 128-dim
|
||||
3. Load **tất cả** encodings từ DB → so khớp `face_recognition.face_distance()`
|
||||
4. Chọn student có `min_dist` nhỏ nhất
|
||||
5. Kiểm tra: `best_distance ≤ 0.42` **AND** `ratio = best/second_best ≤ 0.85`
|
||||
6. Kiểm tra recent check (tránh điểm danh 2 lần trong 30 giây)
|
||||
7. Ghi `checkin_logs` → `BackgroundTask`: gửi ảnh + tạo history trên MS API
|
||||
|
||||
**Bottleneck chính**: Bước 3 — load toàn bộ encodings, giải mã numpy, so khớp tuần tự trong request.
|
||||
|
||||
---
|
||||
|
||||
## External API (ms.prology.net)
|
||||
|
||||
- `POST /api/v1/admin/tracking/scan-create` — tạo history check-in
|
||||
- `POST /api/v1/admin/tracking/send-image` — upload ảnh check-in
|
||||
- `GET /api/v1/admin/timekeeping` — lấy dữ liệu chấm công (dùng trong `sync.py`)
|
||||
|
||||
Token JWT được hardcode trong `api.py` — cần chuyển sang env variable.
|
||||
|
||||
---
|
||||
|
||||
## Frontend State Management
|
||||
|
||||
**Zustand stores:**
|
||||
- `use-app-store.ts` — `isAutoChecking`, `isCountDown`, `refreshLog`, video/canvas refs
|
||||
- `use-user-store.ts` — `currentUser` (user được chọn cho checkpoint)
|
||||
|
||||
**Auto check-in**: interval 3000ms, gọi `/checkin` liên tục khi `isAutoChecking = true`
|
||||
|
||||
---
|
||||
|
||||
## Các lưu ý quan trọng
|
||||
|
||||
- `UPLOAD_DIR = ./uploads/` — lưu ảnh tạm check-in, bị ghi đè mỗi lần (`checkin.jpg`)
|
||||
- `images/{YYYY_MM_DD}/` — lưu ảnh vĩnh viễn theo ngày (tạo trong `sync.py`)
|
||||
- DB session trong `/checkin` dùng `Depends(get_db)`, các endpoint khác tạo `SessionLocal()` trực tiếp — cần thống nhất
|
||||
- Tối đa 10 encodings/user (giới hạn trong `sync.py`)
|
||||
- CORS `allow_origins=["*"]` — chấp nhận vì deploy nội bộ
|
||||
|
|
@ -1,5 +1,11 @@
|
|||
Run client: npm run dev or npm run build && npm run preview
|
||||
Run client: cd client && npm run dev or npm run build && npm run preview
|
||||
|
||||
==> Build client xong => coppy file asset và index vào folder static của server => thêm prefix static vào link của assets trong file index VD: /static/assets
|
||||
==> Build client xong => coppy file asset và index vào folder static của server => thêm prefix static vào link của assets trong file index VD: /camera/static/assets
|
||||
|
||||
Run server uvicorn main:app --reload
|
||||
|
||||
nohup uvicorn main:app --host 172.16.6.38 --port 8080 > log.log 2>&1 &
|
||||
|
||||
ps aux | grep uvicorn
|
||||
|
||||
truncate -s 0 log.log
|
||||
|
|
|
|||
|
|
@ -4,49 +4,38 @@ import datetime
|
|||
import requests
|
||||
from fastapi import UploadFile
|
||||
|
||||
URL_API = "https://ms.prology.net/api/v1"
|
||||
URL_API = "http://172.16.6.38:8000/api/v1"
|
||||
|
||||
def send_image(id, file: UploadFile, student_name: str, status: str):
|
||||
|
||||
def send_image(id, image_bytes, student_name: str, status: str):
|
||||
id = str(id)
|
||||
|
||||
# Tạo folder theo ngày
|
||||
today = datetime.datetime.now().strftime("%Y_%m_%d")
|
||||
folder_path = f"./images/{today}"
|
||||
os.makedirs(folder_path, exist_ok=True)
|
||||
|
||||
if not os.path.exists(folder_path):
|
||||
os.makedirs(folder_path)
|
||||
|
||||
# Tạo file name chuẩn
|
||||
file_name = (
|
||||
f"{student_name}_"
|
||||
f"{status}_at_{datetime.datetime.now().strftime('%Y_%m_%d_%H_%M_%S')}.png"
|
||||
)
|
||||
safe_student = "".join(c for c in student_name if c.isalnum() or c in ("-", "_"))
|
||||
safe_status = "".join(c for c in status if c.isalnum() or c in ("-", "_"))
|
||||
timestamp = datetime.datetime.now().strftime("%Y_%m_%d_%H_%M_%S")
|
||||
|
||||
file_name = f"{safe_student}_{safe_status}_at_{timestamp}.png"
|
||||
file_path = os.path.join(folder_path, file_name)
|
||||
|
||||
# Lưu file UploadFile xuống
|
||||
# Lưu xuống
|
||||
with open(file_path, "wb") as f:
|
||||
f.write(file.file.read())
|
||||
|
||||
# Mở lại file để gửi API
|
||||
with open(file_path, "rb") as image_file:
|
||||
files = {"image": image_file}
|
||||
data = {"id": id, "file_name": file_name}
|
||||
f.write(image_bytes)
|
||||
|
||||
# Gửi API
|
||||
try:
|
||||
with open(file_path, "rb") as image_file:
|
||||
response = requests.post(
|
||||
URL_API + "/admin/tracking/send-image",
|
||||
data=data,
|
||||
files=files
|
||||
data={"id": id, "file_name": file_name},
|
||||
files={"image": image_file}
|
||||
)
|
||||
response.raise_for_status()
|
||||
res = response.json()
|
||||
except Exception as e:
|
||||
return {"status": False, "message": str(e)}
|
||||
|
||||
return res
|
||||
|
||||
|
||||
print("Send image failed:", e)
|
||||
|
||||
|
||||
def create_history(data):
|
||||
|
|
@ -57,3 +46,11 @@ def create_history(data):
|
|||
print(res)
|
||||
|
||||
return res
|
||||
|
||||
|
||||
def users(params):
|
||||
# Gửi yêu cầu POST với dữ liệu đã chỉ định
|
||||
response = requests.get(URL_API+"/admin/timekeeping", params=params, headers={"authorization": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL21zLnByb2xvZ3kubmV0L2FwaS92MS9hZG1pbi9sb2dpbiIsImlhdCI6MTc1Njg2MDQ1OSwiZXhwIjoxNzg4Mzk2NDU5LCJuYmYiOjE3NTY4NjA0NTksImp0aSI6IkRrb0NLbHBKV1pkNnZCN0QiLCJzdWIiOiIxNSIsInBydiI6ImQyZmYyOTMzOWE4YTNlODJjMzU4MmE1YThlNzM5ZGYxNzg5YmIxMmYifQ.DoHqHeAGGxpvzlNQ9dAZjZf2Yl573XCgNBT8ZiSx5N4"})
|
||||
res = response.json()
|
||||
|
||||
return res
|
||||
|
|
|
|||
|
|
@ -1,2 +1,3 @@
|
|||
VITE_API_BASE_URL = "/"
|
||||
VITE_API_BASE_URL = "/camera"
|
||||
# VITE_API_BASE_URL = "http://127.0.0.1:8000"
|
||||
VITE_API_BASE_MS = "https://ms.prology.net"
|
||||
|
|
|
|||
|
|
@ -22,3 +22,4 @@ dist-ssr
|
|||
*.njsproj
|
||||
*.sln
|
||||
*.sw?
|
||||
*.env
|
||||
|
|
|
|||
|
|
@ -20,6 +20,7 @@
|
|||
"axios": "^1.13.2",
|
||||
"class-variance-authority": "^0.7.1",
|
||||
"clsx": "^2.1.1",
|
||||
"face-api.js": "^0.22.2",
|
||||
"framer-motion": "^12.23.25",
|
||||
"lucide-react": "^0.556.0",
|
||||
"moment": "^2.30.1",
|
||||
|
|
@ -2445,6 +2446,22 @@
|
|||
"vite": "^5.2.0 || ^6 || ^7"
|
||||
}
|
||||
},
|
||||
"node_modules/@tensorflow/tfjs-core": {
|
||||
"version": "1.7.0",
|
||||
"resolved": "https://registry.npmjs.org/@tensorflow/tfjs-core/-/tfjs-core-1.7.0.tgz",
|
||||
"integrity": "sha512-uwQdiklNjqBnHPeseOdG0sGxrI3+d6lybaKu2+ou3ajVeKdPEwpWbgqA6iHjq1iylnOGkgkbbnQ6r2lwkiIIHw==",
|
||||
"dependencies": {
|
||||
"@types/offscreencanvas": "~2019.3.0",
|
||||
"@types/seedrandom": "2.4.27",
|
||||
"@types/webgl-ext": "0.0.30",
|
||||
"@types/webgl2": "0.0.4",
|
||||
"node-fetch": "~2.1.2",
|
||||
"seedrandom": "2.4.3"
|
||||
},
|
||||
"engines": {
|
||||
"yarn": ">= 1.3.2"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/babel__core": {
|
||||
"version": "7.20.5",
|
||||
"resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
|
||||
|
|
@ -2513,6 +2530,11 @@
|
|||
"undici-types": "~7.16.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/offscreencanvas": {
|
||||
"version": "2019.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.3.0.tgz",
|
||||
"integrity": "sha512-esIJx9bQg+QYF0ra8GnvfianIY8qWB0GBx54PK5Eps6m+xTj86KLavHv6qDhzKcu5UUOgNfJ2pWaIIV7TRUd9Q=="
|
||||
},
|
||||
"node_modules/@types/react": {
|
||||
"version": "19.2.7",
|
||||
"resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.7.tgz",
|
||||
|
|
@ -2533,6 +2555,21 @@
|
|||
"@types/react": "^19.2.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/seedrandom": {
|
||||
"version": "2.4.27",
|
||||
"resolved": "https://registry.npmjs.org/@types/seedrandom/-/seedrandom-2.4.27.tgz",
|
||||
"integrity": "sha512-YvMLqFak/7rt//lPBtEHv3M4sRNA+HGxrhFZ+DQs9K2IkYJbNwVIb8avtJfhDiuaUBX/AW0jnjv48FV8h3u9bQ=="
|
||||
},
|
||||
"node_modules/@types/webgl-ext": {
|
||||
"version": "0.0.30",
|
||||
"resolved": "https://registry.npmjs.org/@types/webgl-ext/-/webgl-ext-0.0.30.tgz",
|
||||
"integrity": "sha512-LKVgNmBxN0BbljJrVUwkxwRYqzsAEPcZOe6S2T6ZaBDIrFp0qu4FNlpc5sM1tGbXUYFgdVQIoeLk1Y1UoblyEg=="
|
||||
},
|
||||
"node_modules/@types/webgl2": {
|
||||
"version": "0.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@types/webgl2/-/webgl2-0.0.4.tgz",
|
||||
"integrity": "sha512-PACt1xdErJbMUOUweSrbVM7gSIYm1vTncW2hF6Os/EeWi6TXYAYMPp+8v6rzHmypE5gHrxaxZNXgMkJVIdZpHw=="
|
||||
},
|
||||
"node_modules/@typescript-eslint/eslint-plugin": {
|
||||
"version": "8.49.0",
|
||||
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.49.0.tgz",
|
||||
|
|
@ -3513,6 +3550,20 @@
|
|||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/face-api.js": {
|
||||
"version": "0.22.2",
|
||||
"resolved": "https://registry.npmjs.org/face-api.js/-/face-api.js-0.22.2.tgz",
|
||||
"integrity": "sha512-9Bbv/yaBRTKCXjiDqzryeKhYxmgSjJ7ukvOvEBy6krA0Ah/vNBlsf7iBNfJljWiPA8Tys1/MnB3lyP2Hfmsuyw==",
|
||||
"dependencies": {
|
||||
"@tensorflow/tfjs-core": "1.7.0",
|
||||
"tslib": "^1.11.1"
|
||||
}
|
||||
},
|
||||
"node_modules/face-api.js/node_modules/tslib": {
|
||||
"version": "1.14.1",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
|
||||
"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
|
||||
},
|
||||
"node_modules/fast-deep-equal": {
|
||||
"version": "3.1.3",
|
||||
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
|
||||
|
|
@ -4430,6 +4481,14 @@
|
|||
"react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc"
|
||||
}
|
||||
},
|
||||
"node_modules/node-fetch": {
|
||||
"version": "2.1.2",
|
||||
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.1.2.tgz",
|
||||
"integrity": "sha512-IHLHYskTc2arMYsHZH82PVX8CSKT5lzb7AXeyO06QnjGDKtkv+pv3mEki6S7reB/x1QPo+YPxQRNEVgR5V/w3Q==",
|
||||
"engines": {
|
||||
"node": "4.x || >=6.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/node-releases": {
|
||||
"version": "2.0.27",
|
||||
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz",
|
||||
|
|
@ -4765,6 +4824,11 @@
|
|||
"integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/seedrandom": {
|
||||
"version": "2.4.3",
|
||||
"resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-2.4.3.tgz",
|
||||
"integrity": "sha512-2CkZ9Wn2dS4mMUWQaXLsOAfGD+irMlLEeSP3cMxpGbgyOOzJGFa+MWCOMTOCMyZinHRPxyOj/S/C57li/1to6Q=="
|
||||
},
|
||||
"node_modules/semver": {
|
||||
"version": "6.3.1",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
|
||||
|
|
|
|||
|
|
@ -22,6 +22,7 @@
|
|||
"axios": "^1.13.2",
|
||||
"class-variance-authority": "^0.7.1",
|
||||
"clsx": "^2.1.1",
|
||||
"face-api.js": "^0.22.2",
|
||||
"framer-motion": "^12.23.25",
|
||||
"lucide-react": "^0.556.0",
|
||||
"moment": "^2.30.1",
|
||||
|
|
|
|||
|
|
@ -0,0 +1 @@
|
|||
[{"weights":[{"name":"conv0/filters","shape":[3,3,3,16],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.009007044399485869,"min":-1.2069439495311063}},{"name":"conv0/bias","shape":[16],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.005263455241334205,"min":-0.9211046672334858}},{"name":"conv1/depthwise_filter","shape":[3,3,16,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.004001977630690033,"min":-0.5042491814669441}},{"name":"conv1/pointwise_filter","shape":[1,1,16,32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.013836609615999109,"min":-1.411334180831909}},{"name":"conv1/bias","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0015159862590771096,"min":-0.30926119685173037}},{"name":"conv2/depthwise_filter","shape":[3,3,32,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.002666276225856706,"min":-0.317286870876948}},{"name":"conv2/pointwise_filter","shape":[1,1,32,64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.015265831292844286,"min":-1.6792414422128714}},{"name":"conv2/bias","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0020280554598453,"min":-0.37113414915168985}},{"name":"conv3/depthwise_filter","shape":[3,3,64,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.006100742489683862,"min":-0.8907084034938438}},{"name":"conv3/pointwise_filter","shape":[1,1,64,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.016276211832083907,"min":-2.0508026908425725}},{"name":"conv3/bias","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.003394414279975143,"min":-0.7637432129944072}},{"name":"conv4/depthwise_filter","shape":[3,3,128,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.006716050119961009,"min":-0.8059260143953211}},{"name":"conv4/pointwise_filter","shape":[1,1,128,256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.021875603993733724,"min":-2.8875797271728514}},{"name":"conv4/bias","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0041141652009066415,"min":-0.8187188749804216}},{"name":"conv5/depthwise_filter","shape":[3,3,256,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.008423839597141042,"min":-0.9013508368940915}},{"name":"conv5/pointwise_filter","shape":[1,1,256,512],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.030007277283014035,"min":-3.8709387695088107}},{"name":"conv5/bias","shape":[512],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.008402082966823203,"min":-1.4871686851277068}},{"name":"conv8/filters","shape":[1,1,512,25],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.028336129469030042,"min":-4.675461362389957}},{"name":"conv8/bias","shape":[25],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.002268134028303857,"min":-0.41053225912299807}}],"paths":["tiny_face_detector_model-shard1"]}]
|
||||
|
|
@ -9,7 +9,7 @@ class MsApi {
|
|||
Authorization:
|
||||
"Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL21zLnByb2xvZ3kubmV0L2FwaS92MS9hZG1pbi9sb2dpbiIsImlhdCI6MTc1Njg2MDQ1OSwiZXhwIjoxNzg4Mzk2NDU5LCJuYmYiOjE3NTY4NjA0NTksImp0aSI6IkRrb0NLbHBKV1pkNnZCN0QiLCJzdWIiOiIxNSIsInBydiI6ImQyZmYyOTMzOWE4YTNlODJjMzU4MmE1YThlNzM5ZGYxNzg5YmIxMmYifQ.DoHqHeAGGxpvzlNQ9dAZjZf2Yl573XCgNBT8ZiSx5N4",
|
||||
},
|
||||
baseURL: "https://ms.prology.net/api/v1/admin",
|
||||
baseURL: import.meta.env.VITE_API_BASE_MS + "/api/v1/admin",
|
||||
method: "GET",
|
||||
url: "timekeeping",
|
||||
params: {
|
||||
|
|
|
|||
|
|
@ -0,0 +1,388 @@
|
|||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||
import { useEffect, useRef, useState, type RefObject } from "react";
|
||||
|
||||
export type FaceZoomTransform = {
|
||||
scale: number;
|
||||
translateX: number; // percent of element width
|
||||
translateY: number; // percent of element height
|
||||
};
|
||||
|
||||
export type FaceBox = {
|
||||
/** All values are ratios (0..1) of the source video frame. */
|
||||
x: number;
|
||||
y: number;
|
||||
width: number;
|
||||
height: number;
|
||||
};
|
||||
|
||||
export type FaceZoomResult = {
|
||||
transform: FaceZoomTransform;
|
||||
box: FaceBox | null;
|
||||
/** Detector confidence (0..1). */
|
||||
confidence: number;
|
||||
/** 0..1 fill progress of the stable-face timer. Updates at 60fps. */
|
||||
stabilityProgress: number;
|
||||
};
|
||||
|
||||
const IDLE_TRANSFORM: FaceZoomTransform = {
|
||||
scale: 1,
|
||||
translateX: 0,
|
||||
translateY: 0,
|
||||
};
|
||||
|
||||
type Options = {
|
||||
enabled?: boolean;
|
||||
intervalMs?: number;
|
||||
targetFaceRatio?: number;
|
||||
minScale?: number;
|
||||
maxScale?: number;
|
||||
/** Per-frame lerp factor at 60fps (0..1). Higher = snappier. */
|
||||
followSpeed?: number;
|
||||
/** EMA weight on each new detection (0..1). Lower = smoother target. */
|
||||
detectionSmoothing?: number;
|
||||
detectorInputSize?: number;
|
||||
detectorScoreThreshold?: number;
|
||||
|
||||
// --- Stable-face auto trigger ---
|
||||
/** Enable the stable-face callback. */
|
||||
stabilityEnabled?: boolean;
|
||||
/** Continuous duration (ms) the same face must stay before firing. */
|
||||
stableMs?: number;
|
||||
/** Max center movement (frame ratio) to still count as same face. */
|
||||
stabilityPositionThreshold?: number;
|
||||
/** Max relative face-size change to still count as same face. */
|
||||
stabilitySizeThreshold?: number;
|
||||
/** Fires once when stability duration is met; re-arms on absence/new person. */
|
||||
onStableFace?: () => void;
|
||||
};
|
||||
|
||||
type FilteredSample = {
|
||||
fx: number; // face center x ratio
|
||||
fy: number; // face center y ratio
|
||||
fh: number; // face height ratio
|
||||
};
|
||||
|
||||
export function useFaceZoom(
|
||||
videoRef: RefObject<HTMLVideoElement | null>,
|
||||
{
|
||||
enabled = true,
|
||||
intervalMs = 120,
|
||||
targetFaceRatio = 0.6,
|
||||
minScale = 1.35,
|
||||
maxScale = 4,
|
||||
followSpeed = 0.11,
|
||||
detectionSmoothing = 0.35,
|
||||
detectorInputSize = 416,
|
||||
detectorScoreThreshold = 0.3,
|
||||
stabilityEnabled = false,
|
||||
stableMs = 2000,
|
||||
stabilityPositionThreshold = 0.12,
|
||||
stabilitySizeThreshold = 0.4,
|
||||
onStableFace,
|
||||
}: Options = {}
|
||||
): FaceZoomResult {
|
||||
const [transform, setTransform] = useState<FaceZoomTransform>(IDLE_TRANSFORM);
|
||||
const [box, setBox] = useState<FaceBox | null>(null);
|
||||
const [confidence, setConfidence] = useState(0);
|
||||
const [stabilityProgress, setStabilityProgress] = useState(0);
|
||||
const stabilityProgressRef = useRef(0);
|
||||
const currentRef = useRef<FaceZoomTransform>(IDLE_TRANSFORM);
|
||||
const targetRef = useRef<FaceZoomTransform>(IDLE_TRANSFORM);
|
||||
const filteredRef = useRef<FilteredSample | null>(null);
|
||||
const filteredBoxRef = useRef<FaceBox | null>(null);
|
||||
const filteredConfRef = useRef(0);
|
||||
const missCountRef = useRef(0);
|
||||
|
||||
// Stability state — kept in refs so they survive ticks without re-rendering.
|
||||
const stableSinceRef = useRef<number | null>(null);
|
||||
const stableFiredRef = useRef(false);
|
||||
const stablePrevRef = useRef<FilteredSample | null>(null);
|
||||
// Latest stability config (so updating it doesn't tear down the detection loop).
|
||||
const stabilityCfgRef = useRef({
|
||||
enabled: stabilityEnabled,
|
||||
stableMs,
|
||||
positionThreshold: stabilityPositionThreshold,
|
||||
sizeThreshold: stabilitySizeThreshold,
|
||||
onStableFace,
|
||||
});
|
||||
useEffect(() => {
|
||||
stabilityCfgRef.current = {
|
||||
enabled: stabilityEnabled,
|
||||
stableMs,
|
||||
positionThreshold: stabilityPositionThreshold,
|
||||
sizeThreshold: stabilitySizeThreshold,
|
||||
onStableFace,
|
||||
};
|
||||
// When disabling, also clear pending state so it re-arms cleanly next time.
|
||||
if (!stabilityEnabled) {
|
||||
stableSinceRef.current = null;
|
||||
stableFiredRef.current = false;
|
||||
stablePrevRef.current = null;
|
||||
}
|
||||
}, [
|
||||
stabilityEnabled,
|
||||
stableMs,
|
||||
stabilityPositionThreshold,
|
||||
stabilitySizeThreshold,
|
||||
onStableFace,
|
||||
]);
|
||||
|
||||
useEffect(() => {
|
||||
if (!enabled) {
|
||||
currentRef.current = IDLE_TRANSFORM;
|
||||
targetRef.current = IDLE_TRANSFORM;
|
||||
filteredRef.current = null;
|
||||
filteredBoxRef.current = null;
|
||||
filteredConfRef.current = 0;
|
||||
setTransform(IDLE_TRANSFORM);
|
||||
setBox(null);
|
||||
setConfidence(0);
|
||||
return;
|
||||
}
|
||||
|
||||
let cancelled = false;
|
||||
let intervalId: number | null = null;
|
||||
let rafId: number | null = null;
|
||||
let lastTs = 0;
|
||||
let faceapi: any = null;
|
||||
let detectorOptions: any = null;
|
||||
let running = false;
|
||||
|
||||
const animate = (ts: number) => {
|
||||
if (cancelled) return;
|
||||
const dt = lastTs ? (ts - lastTs) / 1000 : 1 / 60;
|
||||
lastTs = ts;
|
||||
// Frame-rate-aware lerp: stays consistent at 60/120Hz.
|
||||
const k = 1 - Math.pow(1 - followSpeed, dt * 60);
|
||||
|
||||
const cur = currentRef.current;
|
||||
const tgt = targetRef.current;
|
||||
const next: FaceZoomTransform = {
|
||||
scale: cur.scale + (tgt.scale - cur.scale) * k,
|
||||
translateX: cur.translateX + (tgt.translateX - cur.translateX) * k,
|
||||
translateY: cur.translateY + (tgt.translateY - cur.translateY) * k,
|
||||
};
|
||||
|
||||
currentRef.current = next;
|
||||
|
||||
const dScale = Math.abs(next.scale - tgt.scale);
|
||||
const dTx = Math.abs(next.translateX - tgt.translateX);
|
||||
const dTy = Math.abs(next.translateY - tgt.translateY);
|
||||
// Skip re-render when essentially settled — avoids React churn.
|
||||
if (dScale > 0.0005 || dTx > 0.02 || dTy > 0.02) {
|
||||
setTransform(next);
|
||||
} else if (
|
||||
next.scale !== tgt.scale ||
|
||||
next.translateX !== tgt.translateX ||
|
||||
next.translateY !== tgt.translateY
|
||||
) {
|
||||
currentRef.current = tgt;
|
||||
setTransform(tgt);
|
||||
}
|
||||
|
||||
// Smooth 60fps fill of the stability progress (independent of the
|
||||
// ~110ms detector tick → no stair-step in the progress bar).
|
||||
const cfg = stabilityCfgRef.current;
|
||||
let nextProgress = 0;
|
||||
if (cfg.enabled) {
|
||||
if (stableFiredRef.current) {
|
||||
nextProgress = 1;
|
||||
} else if (stableSinceRef.current !== null && cfg.stableMs > 0) {
|
||||
nextProgress = Math.min(
|
||||
1,
|
||||
(ts - stableSinceRef.current) / cfg.stableMs
|
||||
);
|
||||
}
|
||||
}
|
||||
if (Math.abs(nextProgress - stabilityProgressRef.current) > 0.003) {
|
||||
stabilityProgressRef.current = nextProgress;
|
||||
setStabilityProgress(nextProgress);
|
||||
} else if (
|
||||
(nextProgress === 0 || nextProgress === 1) &&
|
||||
stabilityProgressRef.current !== nextProgress
|
||||
) {
|
||||
// Snap to exact endpoints so the bar fully clears / fills.
|
||||
stabilityProgressRef.current = nextProgress;
|
||||
setStabilityProgress(nextProgress);
|
||||
}
|
||||
|
||||
rafId = requestAnimationFrame(animate);
|
||||
};
|
||||
|
||||
const tick = async () => {
|
||||
if (running) return;
|
||||
const video = videoRef.current;
|
||||
if (!video || video.readyState < 2 || !video.videoWidth) return;
|
||||
running = true;
|
||||
try {
|
||||
const detection = await faceapi.detectSingleFace(video, detectorOptions);
|
||||
if (cancelled) return;
|
||||
|
||||
if (!detection) {
|
||||
missCountRef.current += 1;
|
||||
// Stability resets quickly so the timer truly restarts on absence.
|
||||
if (missCountRef.current >= 2) {
|
||||
stableSinceRef.current = null;
|
||||
stableFiredRef.current = false;
|
||||
stablePrevRef.current = null;
|
||||
}
|
||||
// Hold zoom position longer to avoid jarring zoom-out on brief misses.
|
||||
if (missCountRef.current >= 25) {
|
||||
targetRef.current = IDLE_TRANSFORM;
|
||||
filteredRef.current = null;
|
||||
filteredBoxRef.current = null;
|
||||
filteredConfRef.current = 0;
|
||||
setBox(null);
|
||||
setConfidence(0);
|
||||
}
|
||||
return;
|
||||
}
|
||||
missCountRef.current = 0;
|
||||
|
||||
const { x, y, width, height } = detection.box;
|
||||
const score = detection.score ?? detection.classScore ?? 0;
|
||||
const vw = video.videoWidth;
|
||||
const vh = video.videoHeight;
|
||||
if (!vw || !vh) return;
|
||||
|
||||
const sample: FilteredSample = {
|
||||
fx: (x + width / 2) / vw,
|
||||
fy: (y + height / 2) / vh,
|
||||
fh: height / vh,
|
||||
};
|
||||
const sampleBox: FaceBox = {
|
||||
x: x / vw,
|
||||
y: y / vh,
|
||||
width: width / vw,
|
||||
height: height / vh,
|
||||
};
|
||||
|
||||
const a = detectionSmoothing;
|
||||
const prev = filteredRef.current;
|
||||
const filt: FilteredSample = prev
|
||||
? {
|
||||
fx: prev.fx + (sample.fx - prev.fx) * a,
|
||||
fy: prev.fy + (sample.fy - prev.fy) * a,
|
||||
fh: prev.fh + (sample.fh - prev.fh) * a,
|
||||
}
|
||||
: sample;
|
||||
filteredRef.current = filt;
|
||||
|
||||
const prevBox = filteredBoxRef.current;
|
||||
const filtBox: FaceBox = prevBox
|
||||
? {
|
||||
x: prevBox.x + (sampleBox.x - prevBox.x) * a,
|
||||
y: prevBox.y + (sampleBox.y - prevBox.y) * a,
|
||||
width: prevBox.width + (sampleBox.width - prevBox.width) * a,
|
||||
height: prevBox.height + (sampleBox.height - prevBox.height) * a,
|
||||
}
|
||||
: sampleBox;
|
||||
filteredBoxRef.current = filtBox;
|
||||
setBox(filtBox);
|
||||
|
||||
const filtConf =
|
||||
filteredConfRef.current + (score - filteredConfRef.current) * a;
|
||||
filteredConfRef.current = filtConf;
|
||||
setConfidence(filtConf);
|
||||
|
||||
// --- Stable-face tracking (uses RAW sample so a new person trips it
|
||||
// immediately, before EMA can drift toward the new position). ---
|
||||
const cfg = stabilityCfgRef.current;
|
||||
if (cfg.enabled) {
|
||||
const prevS = stablePrevRef.current;
|
||||
const now = performance.now();
|
||||
let sameFace = false;
|
||||
if (prevS) {
|
||||
const dx = Math.abs(sample.fx - prevS.fx);
|
||||
const dy = Math.abs(sample.fy - prevS.fy);
|
||||
const dh =
|
||||
Math.abs(sample.fh - prevS.fh) / Math.max(prevS.fh, 0.01);
|
||||
sameFace =
|
||||
dx < cfg.positionThreshold &&
|
||||
dy < cfg.positionThreshold &&
|
||||
dh < cfg.sizeThreshold;
|
||||
}
|
||||
|
||||
if (!sameFace) {
|
||||
// First detection after absence OR a different person → restart timer.
|
||||
stableSinceRef.current = now;
|
||||
stableFiredRef.current = false;
|
||||
} else if (
|
||||
!stableFiredRef.current &&
|
||||
stableSinceRef.current !== null &&
|
||||
now - stableSinceRef.current >= cfg.stableMs
|
||||
) {
|
||||
stableFiredRef.current = true;
|
||||
try {
|
||||
cfg.onStableFace?.();
|
||||
} catch (e) {
|
||||
console.error("onStableFace handler threw", e);
|
||||
}
|
||||
}
|
||||
stablePrevRef.current = sample;
|
||||
}
|
||||
|
||||
let scale = targetFaceRatio / Math.max(filt.fh, 0.05);
|
||||
scale = Math.max(minScale, Math.min(scale, maxScale));
|
||||
|
||||
const halfViewX = 0.5 / scale;
|
||||
const halfViewY = 0.5 / scale;
|
||||
const fx = Math.min(1 - halfViewX, Math.max(halfViewX, filt.fx));
|
||||
const fy = Math.min(1 - halfViewY, Math.max(halfViewY, filt.fy));
|
||||
|
||||
targetRef.current = {
|
||||
scale,
|
||||
translateX: (0.5 - fx * scale) * 100,
|
||||
translateY: (0.5 - fy * scale) * 100,
|
||||
};
|
||||
} catch (err) {
|
||||
console.debug("face detect error", err);
|
||||
} finally {
|
||||
running = false;
|
||||
}
|
||||
};
|
||||
|
||||
const load = async () => {
|
||||
try {
|
||||
faceapi = await import("face-api.js");
|
||||
const modelUrl = `${import.meta.env.BASE_URL}models`.replace(
|
||||
/\/\/+/g,
|
||||
"/"
|
||||
);
|
||||
if (!faceapi.nets.tinyFaceDetector.isLoaded) {
|
||||
await faceapi.nets.tinyFaceDetector.loadFromUri(modelUrl);
|
||||
}
|
||||
if (cancelled) return;
|
||||
detectorOptions = new faceapi.TinyFaceDetectorOptions({
|
||||
inputSize: detectorInputSize,
|
||||
scoreThreshold: detectorScoreThreshold,
|
||||
});
|
||||
intervalId = window.setInterval(tick, intervalMs);
|
||||
rafId = requestAnimationFrame(animate);
|
||||
} catch (err) {
|
||||
console.error("[useFaceZoom] failed to load face-api models", err);
|
||||
}
|
||||
};
|
||||
|
||||
load();
|
||||
|
||||
return () => {
|
||||
cancelled = true;
|
||||
if (intervalId !== null) clearInterval(intervalId);
|
||||
if (rafId !== null) cancelAnimationFrame(rafId);
|
||||
};
|
||||
}, [
|
||||
videoRef,
|
||||
enabled,
|
||||
intervalMs,
|
||||
targetFaceRatio,
|
||||
minScale,
|
||||
maxScale,
|
||||
followSpeed,
|
||||
detectionSmoothing,
|
||||
detectorInputSize,
|
||||
detectorScoreThreshold,
|
||||
]);
|
||||
|
||||
return { transform, box, confidence, stabilityProgress };
|
||||
}
|
||||
|
|
@ -2,6 +2,7 @@
|
|||
import { clsx, type ClassValue } from "clsx";
|
||||
import moment from "moment";
|
||||
import { twMerge } from "tailwind-merge";
|
||||
import useAppStore from "@/stores/use-app-store";
|
||||
|
||||
export function cn(...inputs: ClassValue[]) {
|
||||
return twMerge(clsx(inputs));
|
||||
|
|
@ -18,12 +19,50 @@ export function capture(videoRef: any, canvasRef: any) {
|
|||
const video = videoRef.current;
|
||||
const context = canvas.getContext("2d");
|
||||
|
||||
const vw: number = video.videoWidth;
|
||||
const vh: number = video.videoHeight;
|
||||
|
||||
// Crop to the same region the user sees on screen (zoomed/focused view).
|
||||
// The video element has transform: translate(tx%, ty%) scale(s) with
|
||||
// transform-origin (0,0). The visible source region in video coords is:
|
||||
// srcX = (-tx/100)/s * vw
|
||||
// srcY = (-ty/100)/s * vh
|
||||
// srcW = vw / s
|
||||
// srcH = vh / s
|
||||
let srcX = 0;
|
||||
let srcY = 0;
|
||||
let srcW = vw;
|
||||
let srcH = vh;
|
||||
|
||||
const t = useAppStore.getState().faceZoomTransform;
|
||||
if (t && t.scale > 1.0001) {
|
||||
const s = t.scale;
|
||||
srcW = vw / s;
|
||||
srcH = vh / s;
|
||||
srcX = (-t.translateX / 100 / s) * vw;
|
||||
srcY = (-t.translateY / 100 / s) * vh;
|
||||
// Clamp inside the source frame (the on-screen clamp already prevents
|
||||
// empty edges, but rounding can drift a sub-pixel out of range).
|
||||
srcX = Math.max(0, Math.min(vw - srcW, srcX));
|
||||
srcY = Math.max(0, Math.min(vh - srcH, srcY));
|
||||
}
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
try {
|
||||
canvas.width = video.videoWidth;
|
||||
canvas.height = video.videoHeight;
|
||||
canvas.width = Math.round(srcW);
|
||||
canvas.height = Math.round(srcH);
|
||||
|
||||
context.drawImage(video, 0, 0, canvas.width, canvas.height);
|
||||
context.drawImage(
|
||||
video,
|
||||
srcX,
|
||||
srcY,
|
||||
srcW,
|
||||
srcH,
|
||||
0,
|
||||
0,
|
||||
canvas.width,
|
||||
canvas.height
|
||||
);
|
||||
|
||||
canvas.toBlob(
|
||||
(blob: unknown) => {
|
||||
|
|
|
|||
|
|
@ -0,0 +1,94 @@
|
|||
import type { FaceBox, FaceZoomTransform } from "@/lib/use-face-zoom";
|
||||
|
||||
type Props = {
|
||||
box: FaceBox | null;
|
||||
transform: FaceZoomTransform;
|
||||
/** 0..1 stability fill — drives the progress bar above the brackets. */
|
||||
progress: number;
|
||||
};
|
||||
|
||||
/**
|
||||
* Renders 4 AF-style corner brackets around the detected face, plus a thin
|
||||
* progress bar above them that fills as the same face remains in view.
|
||||
*
|
||||
* Coordinates: `box` is in source-video ratios (0..1). The video element on
|
||||
* screen has a zoom transform applied. We re-apply the same `translate + scale`
|
||||
* to the bracket position so it stays glued to the face — but place it OUTSIDE
|
||||
* the transformed element so border width does not scale with zoom.
|
||||
*/
|
||||
export default function FaceBracket({ box, transform, progress }: Props) {
|
||||
if (!box) return null;
|
||||
|
||||
const s = transform.scale;
|
||||
const tx = transform.translateX / 100;
|
||||
const ty = transform.translateY / 100;
|
||||
|
||||
// Apply the same transform as the video (origin 0,0): point' = point * s + t
|
||||
const left = box.x * s + tx;
|
||||
const top = box.y * s + ty;
|
||||
const width = box.width * s;
|
||||
const height = box.height * s;
|
||||
|
||||
if (
|
||||
left + width < -0.05 ||
|
||||
top + height < -0.05 ||
|
||||
left > 1.05 ||
|
||||
top > 1.05 ||
|
||||
width <= 0 ||
|
||||
height <= 0
|
||||
) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const armPx = Math.max(14, Math.min(40, width * 1000 * 0.18));
|
||||
const cornerSize = { width: armPx, height: armPx } as const;
|
||||
|
||||
const cornerBase =
|
||||
"absolute border-emerald-400/90 transition-opacity duration-150";
|
||||
|
||||
const clamped = Math.max(0, Math.min(1, progress));
|
||||
const isFull = clamped >= 0.999;
|
||||
|
||||
return (
|
||||
<div
|
||||
className="absolute pointer-events-none"
|
||||
style={{
|
||||
left: `${left * 100}%`,
|
||||
top: `${top * 100}%`,
|
||||
width: `${width * 100}%`,
|
||||
height: `${height * 100}%`,
|
||||
}}
|
||||
>
|
||||
<div
|
||||
className={`${cornerBase} border-t-[3px] border-l-[3px] rounded-tl-md`}
|
||||
style={{ ...cornerSize, left: 0, top: 0 }}
|
||||
/>
|
||||
<div
|
||||
className={`${cornerBase} border-t-[3px] border-r-[3px] rounded-tr-md`}
|
||||
style={{ ...cornerSize, right: 0, top: 0 }}
|
||||
/>
|
||||
<div
|
||||
className={`${cornerBase} border-b-[3px] border-l-[3px] rounded-bl-md`}
|
||||
style={{ ...cornerSize, left: 0, bottom: 0 }}
|
||||
/>
|
||||
<div
|
||||
className={`${cornerBase} border-b-[3px] border-r-[3px] rounded-br-md`}
|
||||
style={{ ...cornerSize, right: 0, bottom: 0 }}
|
||||
/>
|
||||
|
||||
{/* Stability progress bar — sits above the box. Width is driven by the
|
||||
60fps `progress` value from the hook, so no CSS transition is needed
|
||||
(and a transition would actually fight the rAF updates). */}
|
||||
<div className="absolute left-0 right-0 -top-3 h-1.5 rounded-full bg-white/25 overflow-hidden backdrop-blur-sm">
|
||||
<div
|
||||
className={`h-full rounded-full ${
|
||||
isFull
|
||||
? "bg-emerald-300 shadow-[0_0_12px_rgba(110,231,183,0.9)]"
|
||||
: "bg-emerald-400"
|
||||
}`}
|
||||
style={{ width: `${clamped * 100}%` }}
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
|
@ -19,27 +19,17 @@ export default function TabFeatures() {
|
|||
|
||||
const { currentUser, setCurrentUser } = useUserStore();
|
||||
|
||||
const { isAutoChecking, setIsAutoChecking, setRefreshLog } = useAppStore();
|
||||
|
||||
const autoCheckIntervalRef = useRef<any>(null);
|
||||
const { isAutoChecking, setIsAutoChecking, setRefreshLog, autoCheckinTick } =
|
||||
useAppStore();
|
||||
|
||||
const [loading, setLoading] = useState(false);
|
||||
|
||||
const [checkPoinLoading, setCheckPoinLoading] = useState(false);
|
||||
|
||||
const toggleAutoCheck = () => {
|
||||
if (isAutoChecking) {
|
||||
if (autoCheckIntervalRef.current) {
|
||||
clearInterval(autoCheckIntervalRef.current);
|
||||
autoCheckIntervalRef.current = null;
|
||||
}
|
||||
setIsAutoChecking(false);
|
||||
} else {
|
||||
autoCheckIntervalRef.current = setInterval(() => {
|
||||
captureAndCheck();
|
||||
}, 3000);
|
||||
setIsAutoChecking(true);
|
||||
}
|
||||
// Auto mode is now driven by stable-face detection in <Main> — toggling
|
||||
// this flag enables/disables the 2s presence timer + auto fire.
|
||||
setIsAutoChecking(!isAutoChecking);
|
||||
};
|
||||
|
||||
const createCheckpoint = async () => {
|
||||
|
|
@ -84,40 +74,31 @@ export default function TabFeatures() {
|
|||
|
||||
const { data } = await checkingApi.checkin({ file });
|
||||
|
||||
if (!data || !data?.data) {
|
||||
if (!data || !data?.status) {
|
||||
toast.error(
|
||||
(data as any)?.message || "Error In Checking: " + JSON.stringify(data)
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
if (data?.checking) {
|
||||
setCurrentUser(data?.data || null);
|
||||
|
||||
// Set timeout mới
|
||||
timeoutRef.current = setTimeout(() => {
|
||||
setCurrentUser(null);
|
||||
timeoutRef.current = null;
|
||||
}, 2000);
|
||||
}
|
||||
|
||||
const message =
|
||||
(data as any)?.message ||
|
||||
`Checking thành công lúc: ${formatTime(new Date().toLocaleString())}`;
|
||||
|
||||
toast.success(message);
|
||||
|
||||
if (!data?.status) return;
|
||||
|
||||
speak({ type: data?.status });
|
||||
speak({ type: data?.status_type });
|
||||
setRefreshLog(true);
|
||||
} catch (error) {
|
||||
const data = error as AxiosError;
|
||||
|
||||
toast.error(
|
||||
const message =
|
||||
(data.response?.data as any)?.message ||
|
||||
"Error In Checking: " + JSON.stringify(data)
|
||||
);
|
||||
"Error In Checking: " + JSON.stringify(data);
|
||||
|
||||
if ((message as string).includes("No face detected")) return;
|
||||
|
||||
toast.error(message);
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
|
|
@ -129,13 +110,25 @@ export default function TabFeatures() {
|
|||
};
|
||||
}, []);
|
||||
|
||||
// Stable-face auto trigger: Main bumps autoCheckinTick when a face has been
|
||||
// present for 2s, and we fire the same checkin path used by the manual
|
||||
// button. Skip the initial 0 tick on mount.
|
||||
const lastHandledTick = useRef(0);
|
||||
useEffect(() => {
|
||||
if (autoCheckinTick === 0) return;
|
||||
if (autoCheckinTick === lastHandledTick.current) return;
|
||||
lastHandledTick.current = autoCheckinTick;
|
||||
if (loading) return;
|
||||
captureAndCheck();
|
||||
}, [autoCheckinTick, captureAndCheck, loading]);
|
||||
|
||||
useEffect(() => {
|
||||
const down = (e: KeyboardEvent) => {
|
||||
if (e.code === "Space") {
|
||||
// ← cách đúng nhất để detect phím cách
|
||||
e.preventDefault(); // nếu không muốn scroll
|
||||
|
||||
if (!loading) return;
|
||||
if (loading) return;
|
||||
|
||||
captureAndCheck();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,24 +1,12 @@
|
|||
/* eslint-disable no-constant-binary-expression */
|
||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||
"use client";
|
||||
|
||||
import type React from "react";
|
||||
|
||||
import { checkingApi } from "@/api/checking-api";
|
||||
import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar";
|
||||
import { Button } from "@/components/ui/button";
|
||||
import { Card } from "@/components/ui/card";
|
||||
import {
|
||||
DropdownMenu,
|
||||
DropdownMenuContent,
|
||||
DropdownMenuItem,
|
||||
DropdownMenuSeparator,
|
||||
DropdownMenuTrigger,
|
||||
} from "@/components/ui/dropdown-menu";
|
||||
import { TabsContent } from "@/components/ui/tabs";
|
||||
import { cn } from "@/lib/utils";
|
||||
import useUserStore from "@/stores/use-user-store";
|
||||
import { Edit, MoreVertical, Trash2, UserCheck, Users } from "lucide-react";
|
||||
import { Users } from "lucide-react";
|
||||
import { useEffect, useState } from "react";
|
||||
|
||||
export default function TabUsers({ value }: { value: string }) {
|
||||
|
|
@ -47,24 +35,6 @@ export default function TabUsers({ value }: { value: string }) {
|
|||
}
|
||||
};
|
||||
|
||||
const handleEdit = (user: IUser, e: React.MouseEvent) => {
|
||||
e.stopPropagation();
|
||||
console.log("Edit user:", user);
|
||||
// TODO: Implement edit functionality
|
||||
};
|
||||
|
||||
const handleDelete = (user: IUser, e: React.MouseEvent) => {
|
||||
e.stopPropagation();
|
||||
console.log("Delete user:", user);
|
||||
// TODO: Implement delete functionality
|
||||
};
|
||||
|
||||
const handleViewDetails = (user: IUser, e: React.MouseEvent) => {
|
||||
e.stopPropagation();
|
||||
console.log("View details:", user);
|
||||
// TODO: Implement view details functionality
|
||||
};
|
||||
|
||||
useEffect(() => {
|
||||
// eslint-disable-next-line react-hooks/set-state-in-effect
|
||||
loadUsers();
|
||||
|
|
@ -102,7 +72,7 @@ export default function TabUsers({ value }: { value: string }) {
|
|||
</p>
|
||||
</div>
|
||||
|
||||
<DropdownMenu>
|
||||
{/* <DropdownMenu>
|
||||
<DropdownMenuTrigger
|
||||
asChild
|
||||
onClick={(e) => e.stopPropagation()}
|
||||
|
|
@ -130,7 +100,7 @@ export default function TabUsers({ value }: { value: string }) {
|
|||
<span>Xóa</span>
|
||||
</DropdownMenuItem>
|
||||
</DropdownMenuContent>
|
||||
</DropdownMenu>
|
||||
</DropdownMenu> */}
|
||||
</div>
|
||||
</Card>
|
||||
))}
|
||||
|
|
|
|||
|
|
@ -6,27 +6,64 @@ import { checkingApi } from "@/api/checking-api";
|
|||
import { msApi } from "@/api/ms-api";
|
||||
import { Button } from "@/components/ui/button";
|
||||
import { Card } from "@/components/ui/card";
|
||||
import { useFaceZoom } from "@/lib/use-face-zoom";
|
||||
import { capture, cn } from "@/lib/utils";
|
||||
import useAppStore from "@/stores/use-app-store";
|
||||
import { AnimatePresence, motion } from "framer-motion";
|
||||
import { ChevronLeft, ChevronRight } from "lucide-react";
|
||||
import { useEffect, useRef, useState } from "react";
|
||||
import { useCallback, useEffect, useRef, useState } from "react";
|
||||
import CountDown from "./components/count-down";
|
||||
import FaceBracket from "./components/face-bracket";
|
||||
import LeftSlidebar from "./components/left-slidebar";
|
||||
import RightSlidebar from "./components/right-slidebar";
|
||||
import TabFeatures from "./components/tab-features";
|
||||
|
||||
export default function Main() {
|
||||
const [isSidebarOpen, setIsSidebarOpen] = useState(true);
|
||||
const [isLeftSidebarOpen, setIsLeftSidebarOpen] = useState(true);
|
||||
const [isLeftSidebarOpen, setIsLeftSidebarOpen] = useState(false);
|
||||
// const { currentUser, setCurrentUser } = useUserStore();
|
||||
|
||||
const { setCanvasRef, setVideoRef } = useAppStore();
|
||||
const {
|
||||
setCanvasRef,
|
||||
setVideoRef,
|
||||
setFaceZoomTransform,
|
||||
isAutoChecking,
|
||||
bumpAutoCheckinTick,
|
||||
} = useAppStore();
|
||||
const { isCountDown, setCaptureRegisterImage, setIsCountDown } =
|
||||
useAppStore();
|
||||
|
||||
const [flashKey, setFlashKey] = useState(0);
|
||||
|
||||
const videoRef = useRef<HTMLVideoElement>(null);
|
||||
const canvasRef = useRef<HTMLCanvasElement>(null);
|
||||
|
||||
const onStableFace = useCallback(() => {
|
||||
// Fire the same path as the "Điểm Danh Ngay" button via the store trigger,
|
||||
// and play a camera-shutter flash to acknowledge the capture.
|
||||
setFlashKey((k) => k + 1);
|
||||
bumpAutoCheckinTick();
|
||||
}, [bumpAutoCheckinTick]);
|
||||
|
||||
const {
|
||||
transform: faceZoom,
|
||||
box: faceBox,
|
||||
stabilityProgress: faceStability,
|
||||
} = useFaceZoom(videoRef, {
|
||||
enabled: true,
|
||||
intervalMs: 110,
|
||||
targetFaceRatio: 0.6,
|
||||
minScale: 1.35,
|
||||
maxScale: 4,
|
||||
followSpeed: 0.11,
|
||||
detectionSmoothing: 0.3,
|
||||
detectorInputSize: 416,
|
||||
detectorScoreThreshold: 0.3,
|
||||
stabilityEnabled: isAutoChecking,
|
||||
stableMs: 2000,
|
||||
onStableFace,
|
||||
});
|
||||
|
||||
const sync = async () => {
|
||||
try {
|
||||
const { data } = await msApi.timekeepings();
|
||||
|
|
@ -88,6 +125,12 @@ export default function Main() {
|
|||
setVideoRef(videoRef);
|
||||
}, [videoRef, canvasRef]);
|
||||
|
||||
// Keep store in sync with the live zoom so capture() can crop to the
|
||||
// visible focused region instead of the full frame.
|
||||
useEffect(() => {
|
||||
setFaceZoomTransform(faceZoom);
|
||||
}, [faceZoom, setFaceZoomTransform]);
|
||||
|
||||
return (
|
||||
<div className="min-h-screen bg-white">
|
||||
<div className="flex h-screen">
|
||||
|
|
@ -107,10 +150,34 @@ export default function Main() {
|
|||
ref={videoRef}
|
||||
autoPlay
|
||||
playsInline
|
||||
className="w-full h-full object-cover"
|
||||
className="w-full h-full object-cover will-change-transform"
|
||||
style={{
|
||||
transformOrigin: "0 0",
|
||||
transform: `translate3d(${faceZoom.translateX}%, ${faceZoom.translateY}%, 0) scale(${faceZoom.scale})`,
|
||||
backfaceVisibility: "hidden",
|
||||
}}
|
||||
/>
|
||||
<div className="absolute inset-0 border-4 border-blue-500/30 pointer-events-none" />
|
||||
|
||||
<FaceBracket
|
||||
box={faceBox}
|
||||
transform={faceZoom}
|
||||
progress={isAutoChecking ? faceStability : 0}
|
||||
/>
|
||||
|
||||
{/* Camera shutter flash — keyed so each fire replays the animation. */}
|
||||
<AnimatePresence>
|
||||
{flashKey > 0 && (
|
||||
<motion.div
|
||||
key={flashKey}
|
||||
initial={{ opacity: 0 }}
|
||||
animate={{ opacity: [0, 0.85, 0] }}
|
||||
transition={{ duration: 0.45, times: [0, 0.18, 1] }}
|
||||
className="absolute inset-0 bg-white pointer-events-none z-40"
|
||||
/>
|
||||
)}
|
||||
</AnimatePresence>
|
||||
|
||||
{/* <AnimatePresence>
|
||||
{currentUser && (
|
||||
<motion.div
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||
// src/stores/useUserStore.ts
|
||||
import type { FaceZoomTransform } from "@/lib/use-face-zoom";
|
||||
import { create } from "zustand";
|
||||
|
||||
type AppState = {
|
||||
|
|
@ -9,6 +10,9 @@ type AppState = {
|
|||
captureRegisterImage: any;
|
||||
videoRef: any;
|
||||
canvasRef: any;
|
||||
faceZoomTransform: FaceZoomTransform | null;
|
||||
/** Incrementing trigger — bumped when the stable-face timer fires. */
|
||||
autoCheckinTick: number;
|
||||
|
||||
// actions
|
||||
setIsAutoChecking: (data: boolean) => void;
|
||||
|
|
@ -17,6 +21,8 @@ type AppState = {
|
|||
setVideoRef: (data: any) => void;
|
||||
setCanvasRef: (data: any) => void;
|
||||
setCaptureRegisterImage: (data: any) => void;
|
||||
setFaceZoomTransform: (data: FaceZoomTransform | null) => void;
|
||||
bumpAutoCheckinTick: () => void;
|
||||
};
|
||||
|
||||
const useAppStore = create<AppState>((set) => ({
|
||||
|
|
@ -26,6 +32,8 @@ const useAppStore = create<AppState>((set) => ({
|
|||
canvasRef: null,
|
||||
videoRef: null,
|
||||
refreshLog: false,
|
||||
faceZoomTransform: null,
|
||||
autoCheckinTick: 0,
|
||||
|
||||
setIsAutoChecking: (data) => set({ isAutoChecking: data }),
|
||||
setRefreshLog: (data) => set({ refreshLog: data }),
|
||||
|
|
@ -33,6 +41,9 @@ const useAppStore = create<AppState>((set) => ({
|
|||
setCaptureRegisterImage: (data) => set({ captureRegisterImage: data }),
|
||||
setVideoRef: (data) => set({ videoRef: data }),
|
||||
setCanvasRef: (data) => set({ canvasRef: data }),
|
||||
setFaceZoomTransform: (data) => set({ faceZoomTransform: data }),
|
||||
bumpAutoCheckinTick: () =>
|
||||
set((s) => ({ autoCheckinTick: s.autoCheckinTick + 1 })),
|
||||
}));
|
||||
|
||||
export default useAppStore;
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
from sqlalchemy import create_engine
|
||||
from sqlalchemy.orm import sessionmaker, declarative_base
|
||||
|
||||
DATABASE_URL = "mysql+pymysql://root:123@localhost/face_checkin?charset=utf8mb4"
|
||||
DATABASE_URL = "mysql+pymysql://admin:Work1234%^@localhost/face_checkin?charset=utf8mb4"
|
||||
|
||||
engine = create_engine(DATABASE_URL)
|
||||
SessionLocal = sessionmaker(bind=engine, autoflush=False)
|
||||
|
|
|
|||
|
Before Width: | Height: | Size: 246 KiB |
|
Before Width: | Height: | Size: 252 KiB |
|
Before Width: | Height: | Size: 234 KiB |
|
Before Width: | Height: | Size: 235 KiB |
|
Before Width: | Height: | Size: 248 KiB |
|
Before Width: | Height: | Size: 248 KiB |
|
Before Width: | Height: | Size: 250 KiB |
|
Before Width: | Height: | Size: 249 KiB |
|
Before Width: | Height: | Size: 232 KiB |
|
Before Width: | Height: | Size: 232 KiB |
|
|
@ -0,0 +1,10 @@
|
|||
nohup: ignoring input
|
||||
INFO: Started server process [32945]
|
||||
INFO: Waiting for application startup.
|
||||
INFO: Application startup complete.
|
||||
INFO: Uvicorn running on http://172.16.6.38:8080 (Press CTRL+C to quit)
|
||||
INFO: 172.16.6.38:57742 - "GET / HTTP/1.1" 200 OK
|
||||
INFO: 172.16.6.38:57748 - "GET /static/assets/index-CDZdzCu6.css HTTP/1.1" 304 Not Modified
|
||||
INFO: 172.16.6.38:57764 - "GET /static/assets/index-DW_Nku2j.js HTTP/1.1" 304 Not Modified
|
||||
INFO: 172.16.6.38:57790 - "GET /logs HTTP/1.1" 200 OK
|
||||
INFO: 172.16.6.38:57776 - "GET /users HTTP/1.1" 200 OK
|
||||
|
|
@ -1,10 +1,13 @@
|
|||
from fastapi import FastAPI, UploadFile, File, Form, Depends, HTTPException
|
||||
from fastapi import FastAPI, UploadFile, File, Form, Depends, HTTPException, BackgroundTasks
|
||||
from fastapi.responses import JSONResponse
|
||||
from sqlalchemy.orm import Session
|
||||
import face_recognition
|
||||
import numpy as np
|
||||
import os
|
||||
import datetime
|
||||
import threading
|
||||
import logging
|
||||
import cv2
|
||||
from fastapi.staticfiles import StaticFiles
|
||||
from fastapi.responses import FileResponse
|
||||
from database import SessionLocal, engine
|
||||
|
|
@ -14,6 +17,71 @@ from sqlalchemy import text
|
|||
from fastapi.middleware.cors import CORSMiddleware
|
||||
from api import create_history, send_image
|
||||
|
||||
logging.basicConfig(level=logging.INFO)
|
||||
|
||||
# --- Encoding cache (Phương án 1: RAM cache) ---
|
||||
_enc_matrix: np.ndarray | None = None # shape (N, 128)
|
||||
_enc_student_ids: np.ndarray | None = None # shape (N,) int64
|
||||
_enc_student_names: dict = {}
|
||||
_cache_lock = threading.Lock()
|
||||
_cache_dirty = True
|
||||
|
||||
|
||||
def invalidate_encoding_cache():
|
||||
global _cache_dirty
|
||||
_cache_dirty = True
|
||||
|
||||
|
||||
def _load_encoding_cache(db):
|
||||
global _enc_matrix, _enc_student_ids, _enc_student_names, _cache_dirty
|
||||
with _cache_lock:
|
||||
if not _cache_dirty and _enc_matrix is not None:
|
||||
return _enc_matrix, _enc_student_ids, _enc_student_names
|
||||
|
||||
rows = db.execute(
|
||||
text("""
|
||||
SELECT s.id AS student_id, s.name AS student_name, se.encoding AS encoding_blob
|
||||
FROM student_encodings se
|
||||
JOIN students s ON s.id = se.student_id
|
||||
""")
|
||||
).fetchall()
|
||||
|
||||
encodings, student_ids, names = [], [], {}
|
||||
for r in rows:
|
||||
try:
|
||||
enc = np.frombuffer(r.encoding_blob, dtype=np.float64)
|
||||
if enc.size == 128:
|
||||
encodings.append(enc)
|
||||
student_ids.append(r.student_id)
|
||||
names[r.student_id] = r.student_name
|
||||
else:
|
||||
logging.warning(f"encoding size invalid for student {r.student_id}: {enc.size}")
|
||||
except Exception as e:
|
||||
logging.exception(f"Error decoding encoding for student {r.student_id}: {e}")
|
||||
|
||||
if encodings:
|
||||
_enc_matrix = np.vstack(encodings)
|
||||
_enc_student_ids = np.array(student_ids, dtype=np.int64)
|
||||
else:
|
||||
_enc_matrix = np.empty((0, 128), dtype=np.float64)
|
||||
_enc_student_ids = np.array([], dtype=np.int64)
|
||||
|
||||
_enc_student_names = names
|
||||
_cache_dirty = False
|
||||
logging.info(f"Encoding cache loaded: {_enc_matrix.shape[0]} encodings, {len(names)} students")
|
||||
return _enc_matrix, _enc_student_ids, _enc_student_names
|
||||
|
||||
|
||||
# --- Image preprocessing (Phương án 3: resize trước khi detect) ---
|
||||
def _preprocess_image(image_data: bytes, max_width: int = 640) -> np.ndarray:
|
||||
nparr = np.frombuffer(image_data, np.uint8)
|
||||
img = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
|
||||
h, w = img.shape[:2]
|
||||
if w > max_width:
|
||||
scale = max_width / w
|
||||
img = cv2.resize(img, (int(w * scale), int(h * scale)), interpolation=cv2.INTER_AREA)
|
||||
return cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
|
||||
|
||||
app = FastAPI()
|
||||
|
||||
# --- CORS ---
|
||||
|
|
@ -38,6 +106,7 @@ def get_db():
|
|||
db.close()
|
||||
app.mount("/static", StaticFiles(directory="static"), name="static")
|
||||
|
||||
|
||||
@app.get("/")
|
||||
def root():
|
||||
return FileResponse("static/index.html")
|
||||
|
|
@ -63,8 +132,8 @@ async def register_face(
|
|||
with open(image_path, "wb") as f:
|
||||
f.write(image_data)
|
||||
|
||||
# Encode face
|
||||
image = face_recognition.load_image_file(image_path)
|
||||
# Encode face — dùng _preprocess_image để tránh load lại từ disk
|
||||
image = _preprocess_image(image_data)
|
||||
encodings = face_recognition.face_encodings(image)
|
||||
|
||||
if not encodings:
|
||||
|
|
@ -88,7 +157,7 @@ async def register_face(
|
|||
{"student_id": student_id, "encoding": encoding_bytes}
|
||||
)
|
||||
db.commit()
|
||||
|
||||
invalidate_encoding_cache()
|
||||
return {"message": "Đã thêm encoding mới."}
|
||||
|
||||
else:
|
||||
|
|
@ -117,7 +186,7 @@ async def register_face(
|
|||
{"student_id": student_id, "encoding": encoding_bytes}
|
||||
)
|
||||
db.commit()
|
||||
|
||||
invalidate_encoding_cache()
|
||||
return {"message": "Đăng ký thành công."}
|
||||
|
||||
except IntegrityError:
|
||||
|
|
@ -189,38 +258,64 @@ async def register_student(
|
|||
db.close()
|
||||
|
||||
|
||||
|
||||
@app.post("/checkin")
|
||||
async def checkin(file: UploadFile = File(...), camera_id: str = Form("cam1"), db: Session = Depends(get_db)):
|
||||
async def checkin(background_tasks: BackgroundTasks, file: UploadFile = File(...), camera_id: str = Form("cam1"), db: Session = Depends(get_db)):
|
||||
image_data = await file.read()
|
||||
path = os.path.join(UPLOAD_DIR, "checkin.jpg")
|
||||
with open(path, "wb") as f:
|
||||
f.write(image_data)
|
||||
|
||||
unknown_img = face_recognition.load_image_file(path)
|
||||
# Phương án 3: resize ảnh trước khi detect — bỏ disk I/O
|
||||
unknown_img = _preprocess_image(image_data)
|
||||
unknown_encodings = face_recognition.face_encodings(unknown_img)
|
||||
|
||||
if not unknown_encodings:
|
||||
return {"message": "No face detected."}
|
||||
return {"message": "No face detected.", "status": False}
|
||||
|
||||
unknown_encoding = unknown_encodings[0]
|
||||
|
||||
# Get all encodings with student info
|
||||
encodings = db.execute(
|
||||
text("""
|
||||
SELECT s.id, s.name, s.email, s.avatar, se.encoding
|
||||
FROM student_encodings se
|
||||
JOIN students s ON s.id = se.student_id
|
||||
""")
|
||||
).fetchall()
|
||||
# TÙY CHỈNH: threshold nhỏ hơn → ít nhầm lẫn, nhưng dễ false negative.
|
||||
# Thử: 0.4 (chặt), 0.45 (cân bằng), 0.55 (lỏng)
|
||||
DIST_THRESHOLD = 0.42
|
||||
|
||||
for encoding in encodings:
|
||||
known_encoding = np.frombuffer(encoding.encoding)
|
||||
result = face_recognition.compare_faces([known_encoding], unknown_encoding, tolerance=0.5)
|
||||
if result[0]:
|
||||
# Phương án 1: dùng cache RAM thay vì query DB mỗi request
|
||||
enc_matrix, enc_sids, enc_names = _load_encoding_cache(db)
|
||||
|
||||
if enc_matrix.shape[0] == 0:
|
||||
return {"message": "No known encodings in DB.", "status": False}
|
||||
|
||||
# Phương án 2: vectorized — tính tất cả distances 1 lần qua BLAS
|
||||
all_dists = face_recognition.face_distance(enc_matrix, unknown_encoding)
|
||||
|
||||
# Tìm min distance theo từng student
|
||||
best_student = None
|
||||
best_distance = float("inf")
|
||||
second_best_distance = float("inf")
|
||||
|
||||
for sid in np.unique(enc_sids):
|
||||
mask = enc_sids == sid
|
||||
min_dist = float(np.min(all_dists[mask]))
|
||||
logging.info(f"Student {sid} ({enc_names.get(sid)}) min_dist = {min_dist:.4f}")
|
||||
|
||||
if min_dist < best_distance:
|
||||
second_best_distance = best_distance
|
||||
best_distance = min_dist
|
||||
best_student = int(sid)
|
||||
elif min_dist < second_best_distance:
|
||||
second_best_distance = min_dist
|
||||
|
||||
# Debug log best/second distances
|
||||
logging.info(f"Best student {best_student} dist={best_distance:.4f}, second_best={second_best_distance:.4f}")
|
||||
|
||||
# Ratio check: nếu best much better than second best => more confident
|
||||
ratio_ok = True
|
||||
if second_best_distance < float("inf"):
|
||||
ratio = best_distance / (second_best_distance + 1e-8)
|
||||
logging.info(f"Distance ratio (best/second) = {ratio:.4f}")
|
||||
# Nếu ratio quá gần 1 (ví dụ > 0.85) => không đủ phân biệt
|
||||
if ratio > 0.85:
|
||||
ratio_ok = False
|
||||
|
||||
# Quyết định match nếu best_distance nhỏ hơn threshold và ratio ok
|
||||
if best_distance <= DIST_THRESHOLD and ratio_ok and best_student is not None:
|
||||
# kiểm tra recent check (nửa phút trước)
|
||||
now = datetime.datetime.now()
|
||||
|
||||
# Check recent checkin
|
||||
recent_check = db.execute(
|
||||
text("""
|
||||
SELECT id FROM checkin_logs
|
||||
|
|
@ -228,75 +323,94 @@ async def checkin(file: UploadFile = File(...), camera_id: str = Form("cam1"), d
|
|||
AND time > :time_threshold
|
||||
"""),
|
||||
{
|
||||
"student_id": encoding.id,
|
||||
"time_threshold": now - datetime.timedelta(minutes=5)
|
||||
"student_id": best_student,
|
||||
"time_threshold": now - datetime.timedelta(minutes=0.5)
|
||||
}
|
||||
).fetchone()
|
||||
|
||||
if recent_check:
|
||||
return {
|
||||
"message": f"{encoding.name} already checked in recently.",
|
||||
"checking": False,
|
||||
"data": {
|
||||
"id": encoding.id,
|
||||
"name": encoding.name,
|
||||
"email": encoding.email,
|
||||
"avatar": encoding.avatar,
|
||||
"camera_id": camera_id,
|
||||
"time": now.isoformat()
|
||||
}
|
||||
}
|
||||
return {"message": f"{enc_names.get(best_student)} already checked in recently.", "status": True}
|
||||
|
||||
last_log = db.execute(
|
||||
text("""
|
||||
SELECT status FROM checkin_logs
|
||||
WHERE student_id = :student_id
|
||||
ORDER BY time DESC LIMIT 1
|
||||
"""),
|
||||
{"student_id": best_student}
|
||||
).fetchone()
|
||||
status = "check out" if last_log and last_log.status == "check in" else "check in"
|
||||
|
||||
|
||||
# thêm dô đây
|
||||
id_log = 0
|
||||
ms_response = create_history({"name": encoding.name.split('\n')[0], "time_string": f"{datetime.datetime.now()}", "status": "check in"})
|
||||
id_log = ms_response.get('data').get('id')
|
||||
status = ms_response.get('data').get('status')
|
||||
|
||||
# reset pointer
|
||||
file.file.seek(0)
|
||||
|
||||
send_image_res = send_image(
|
||||
id=id_log,
|
||||
file=file,
|
||||
student_name=encoding.name,
|
||||
status=status
|
||||
)
|
||||
|
||||
print(id_log, send_image_res)
|
||||
|
||||
# Insert new checkin
|
||||
db.execute(
|
||||
insert_result = db.execute(
|
||||
text("""
|
||||
INSERT INTO checkin_logs (student_id, time, camera_id, status)
|
||||
VALUES (:student_id, :time, :camera_id, :status)
|
||||
"""),
|
||||
{
|
||||
"student_id": encoding.id,
|
||||
"student_id": best_student,
|
||||
"time": now,
|
||||
"camera_id": camera_id,
|
||||
"status": status
|
||||
}
|
||||
)
|
||||
log_id = insert_result.lastrowid
|
||||
db.commit()
|
||||
|
||||
return {
|
||||
"message": f"Check-in successful for {encoding.name}",
|
||||
"checking": True,
|
||||
"status": status,
|
||||
"data": {
|
||||
"id": encoding.id,
|
||||
"name": encoding.name,
|
||||
"email": encoding.email,
|
||||
"avatar": encoding.avatar,
|
||||
"camera_id": camera_id,
|
||||
"time": now.isoformat()
|
||||
}
|
||||
}
|
||||
def _sync_to_ms(name: str, time_string: str, img_data: bytes, local_status: str, checkin_log_id: int):
|
||||
try:
|
||||
ms_response = create_history({"name": name.split('\n')[0], "time_string": time_string, "status": local_status})
|
||||
id_log = ms_response.get('data', {}).get('id', 0)
|
||||
ms_status = ms_response.get('data', {}).get('status', local_status)
|
||||
if ms_status != local_status:
|
||||
fix_db = SessionLocal()
|
||||
try:
|
||||
fix_db.execute(
|
||||
text("UPDATE checkin_logs SET status = :status WHERE id = :id"),
|
||||
{"status": ms_status, "id": checkin_log_id}
|
||||
)
|
||||
fix_db.commit()
|
||||
logging.info(f"Corrected log #{checkin_log_id} status: {local_status} → {ms_status}")
|
||||
finally:
|
||||
fix_db.close()
|
||||
send_image(id_log, img_data, name, ms_status)
|
||||
except Exception as e:
|
||||
logging.error(f"MS sync error: {e}")
|
||||
|
||||
return {"message": "No match found."}
|
||||
background_tasks.add_task(
|
||||
_sync_to_ms,
|
||||
enc_names.get(best_student),
|
||||
f"{datetime.datetime.now()}",
|
||||
image_data,
|
||||
status,
|
||||
log_id,
|
||||
)
|
||||
|
||||
student = db.execute(
|
||||
text("""
|
||||
SELECT id, name, email
|
||||
FROM students
|
||||
WHERE id = :id
|
||||
"""),
|
||||
{"id": best_student}
|
||||
).fetchone()
|
||||
|
||||
user_data = {
|
||||
"id": student.id,
|
||||
"name": student.name,
|
||||
"email": student.email,
|
||||
} if student else None
|
||||
|
||||
return {"message": f"{status} successful for {enc_names.get(best_student)} (dist={best_distance:.4f})", "status": True, "status_type": status, "data": user_data}
|
||||
|
||||
# Nếu không thỏa threshold/rule thì trả no match (và log lý do)
|
||||
reasons = []
|
||||
if best_distance > DIST_THRESHOLD:
|
||||
reasons.append(f"best_distance({best_distance:.4f}) > threshold({DIST_THRESHOLD})")
|
||||
if not ratio_ok:
|
||||
reasons.append(f"ratio not confident ({best_distance:.4f}/{second_best_distance:.4f})")
|
||||
|
||||
logging.info("No confident match: " + "; ".join(reasons))
|
||||
return {"message": "No match found.", "reasons": reasons, "status": False}
|
||||
|
||||
|
||||
@app.get("/logs")
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ class Student(Base):
|
|||
id = Column(Integer, primary_key=True, index=True)
|
||||
name = Column(String(100), nullable=False)
|
||||
email = Column(String(100), nullable=False, unique=True, index=True)
|
||||
avatar = Column(String(500), nullable=True, unique=True, index=True)
|
||||
avatar = Column(String(500), nullable=True, index=True)
|
||||
|
||||
__table_args__ = (UniqueConstraint('email', name='uq_student_email'),)
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"name": "school-checkin",
|
||||
"name": "TrackingToolWeb",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
<!DOCTYPE html>
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
|
|
@ -8,12 +8,12 @@
|
|||
<script
|
||||
type="module"
|
||||
crossorigin
|
||||
src="/camera/static/assets/index-NzXShqcn.js"
|
||||
src="/camera/static/assets/index-_MGhSlOr.js"
|
||||
></script>
|
||||
<link
|
||||
rel="stylesheet"
|
||||
crossorigin
|
||||
href="/camera/static/assets/index-CDZdzCu6.css"
|
||||
href="/camera/static/assets/index-B9NPk65I.css"
|
||||
/>
|
||||
</head>
|
||||
<body>
|
||||
|
|
|
|||
|
|
@ -0,0 +1 @@
|
|||
[{"weights":[{"name":"conv0/filters","shape":[3,3,3,16],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.009007044399485869,"min":-1.2069439495311063}},{"name":"conv0/bias","shape":[16],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.005263455241334205,"min":-0.9211046672334858}},{"name":"conv1/depthwise_filter","shape":[3,3,16,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.004001977630690033,"min":-0.5042491814669441}},{"name":"conv1/pointwise_filter","shape":[1,1,16,32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.013836609615999109,"min":-1.411334180831909}},{"name":"conv1/bias","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0015159862590771096,"min":-0.30926119685173037}},{"name":"conv2/depthwise_filter","shape":[3,3,32,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.002666276225856706,"min":-0.317286870876948}},{"name":"conv2/pointwise_filter","shape":[1,1,32,64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.015265831292844286,"min":-1.6792414422128714}},{"name":"conv2/bias","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0020280554598453,"min":-0.37113414915168985}},{"name":"conv3/depthwise_filter","shape":[3,3,64,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.006100742489683862,"min":-0.8907084034938438}},{"name":"conv3/pointwise_filter","shape":[1,1,64,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.016276211832083907,"min":-2.0508026908425725}},{"name":"conv3/bias","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.003394414279975143,"min":-0.7637432129944072}},{"name":"conv4/depthwise_filter","shape":[3,3,128,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.006716050119961009,"min":-0.8059260143953211}},{"name":"conv4/pointwise_filter","shape":[1,1,128,256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.021875603993733724,"min":-2.8875797271728514}},{"name":"conv4/bias","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0041141652009066415,"min":-0.8187188749804216}},{"name":"conv5/depthwise_filter","shape":[3,3,256,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.008423839597141042,"min":-0.9013508368940915}},{"name":"conv5/pointwise_filter","shape":[1,1,256,512],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.030007277283014035,"min":-3.8709387695088107}},{"name":"conv5/bias","shape":[512],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.008402082966823203,"min":-1.4871686851277068}},{"name":"conv8/filters","shape":[1,1,512,25],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.028336129469030042,"min":-4.675461362389957}},{"name":"conv8/bias","shape":[25],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.002268134028303857,"min":-0.41053225912299807}}],"paths":["tiny_face_detector_model-shard1"]}]
|
||||
|
|
@ -0,0 +1,120 @@
|
|||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (1, 1, 0x000000A0A564C1BF00000040C9E8C73F000000E09BEAA33F00000080C54D99BF000000800B4FA7BF00000000341CA9BF00000000940CADBF000000004BA8B6BF000000C000C7C03F00000000CC09ABBF000000A02DBFD23F00000060C8B2ACBF0000008077B0C4BF000000E04048C8BF00000000E32592BF000000009208C83F000000A06309C9BF000000006BACC3BF000000C05BAD9ABF000000003563ADBF00000060AC64AD3F0000004028139CBF0000000016859EBF000000406D68A13F00000060DB97BFBF000000C0ABEDD4BF000000809E0890BF00000000C147B9BF000000C03C84A33F000000C06355B8BF00000080EDCCABBF000000408352A63F00000000A78CCABF000000E08B38BEBF0000002060ABB03F000000809B33B53F000000202392A4BF00000040F65FAEBF000000E022D3CA3F00000000C95AADBF00000040A781C1BF00000000B2B4A63F000000A0DC4EBD3F00000080CC49D33F000000809C64C83F000000203BEDA83F0000002076F9A1BF00000080FDE7A1BF00000000CF8AC23F000000E02814C6BF000000009D1D9A3F00000020B6E6BE3F000000407B67C23F000000400D44B73F0000002057B4B23F000000E038BAC4BF00000000EC25A23F000000808365B73F000000003B88C8BF000000E01E9E97BF000000007DDA8C3F000000C0B81DBCBF000000E0BF27A6BF0000000071F6B7BF00000080A8BED03F00000080E957B73F00000080449CB3BF0000000069BABABF00000000588DC43F000000A0FCB0A7BF000000A0F9DBAABF000000006489903F000000208D1EBEBF000000805E04C5BF00000040B35ED0BF000000003780B23F000000809815D43F000000204AC0C33F00000040DD19CABF000000208509B43F00000000699FAA3F0000000042168DBF000000A07A72BC3F00000080E104B63F000000009CE5A6BF000000005D228DBF000000A0E0D89FBF0000000063A7933F00000040EEBAC53F00000000D713813F000000A06953B1BF000000403FE8C13F000000806602A3BF00000040CF17A43F000000E08116A13F000000C04328B7BF00000000ADC99DBF000000C074CAAE3F000000803FFFC3BF00000080CAAB973F000000403CF4A23F000000C0ADBFAEBF0000000020C151BF00000040484FB63F000000606628C4BF00000080D8ABA13F000000405F6AAD3F000000607DB7A33F000000C0D774A6BF0000000051AFA23F00000040B7E4B5BF000000006D2F903F000000207588B03F000000207AFBD1BF00000040BD1CD63F0000004044E8C33F000000C09169A73F000000208DC0C33F00000080EE5EBB3F000000005CFD7BBF000000C07D94B23F000000807BF09BBF0000006045BAC2BF000000602818B9BF00000060D154C03F0000004015DDA2BF0000000085F7C33F00000040C88A9E3F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (2, 1, 0x000000E0D016C0BF000000C06578BE3F000000007C8261BF00000000A78A96BF000000803F7EB5BF0000000029F98BBF000000E0F889A6BF00000060FEABADBF000000E0FA09C03F00000000999BA8BF000000801601D03F000000C08E77A5BF0000004097D5C6BF00000020E431C2BF00000000481898BF00000060D07FC83F00000000237BC7BF000000A044BEC5BF000000E02FF99CBF00000040840DA5BF000000A0E4A4B03F00000060D9F694BF000000802AB0A5BF0000008051A59E3F00000040431DBEBF000000608D72D3BF000000000320803F00000040869CB1BF000000205131AB3F000000A046FFC2BF000000803E15ABBF000000404344B03F00000080F927CABF000000C09762B8BF00000060A63FB63F000000E00BB5BD3F00000080C128A1BF000000404E74A3BF000000C0A719C73F000000C01B7192BF000000405C1AC5BF00000000C10C9B3F000000403FFDB43F00000040082AD23F0000008043D2C63F00000080DC9FBB3F000000C0DAC9B0BF00000000FF38A5BF00000040E713BF3F000000600400CDBF000000E0E559B13F00000000101AB83F000000E01E15C13F000000805286AF3F00000000C2DFA83F000000803D96C9BF000000003890863F00000040B584B53F0000004017A2C6BF000000806A52843F00000000C963903F000000803331C0BF00000080B35A96BF0000008064F6B7BF000000C0B545D13F0000006069F4B13F000000E09517B5BF00000000679EB2BF000000408A84C83F000000406555A1BF000000A0B3E4ACBF000000807A42903F000000600DA9B1BF000000208D84C5BF00000000C8F6CCBF000000007A87AF3F00000080B369D53F0000002023C6C33F000000C03F89CDBF00000040B089A63F00000000929CA93F00000000723C783F000000C02117B83F000000C00EF9B43F00000040AE21A7BF00000080928C90BF00000020605BB1BF00000000D1F391BF00000060B0CBC63F00000000BC0B863F000000C005C2B0BF00000080771CC33F00000080FE53A2BF000000C0FE6AA83F000000003243AD3F00000040574EAEBF0000004087D3A9BF00000080672D993F000000203E98C5BF0000004080D7B3BF000000208089A83F000000C070F4ADBF00000000F05154BF000000603CEAC03F000000C0CA4DC0BF0000004069ACB33F00000000A101983F000000203EA09B3F00000000576B9CBF0000008007E6A73F000000C0570CB0BF00000000086673BF00000020EC78B03F00000080EC84D0BF000000604F76D43F000000C0D77DC43F000000E0DD65B03F00000040E439C43F000000602487BA3F000000000212943F000000C0ABB1B23F00000080911A9DBF000000600FF9C4BF000000404054BABF000000E08B56BE3F000000004D06A4BF000000800BCFC23F000000003220A83F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (3, 1, 0x000000C0544BC1BF000000E02A2CC33F000000C03AAEA53F00000000D41C79BF00000040823FA2BF00000080D3C59FBF000000E0CF2DA3BF00000080D22CBABF000000C0F5B8BF3F0000000009D4ADBF000000A0E2C3D23F00000000AB06AFBF0000000031BDC5BF0000006004DBC7BF000000000A08A0BF00000060B107C83F00000000A3EDC5BF000000E0ACF6C4BF00000080BC5FADBF000000801784A8BF0000008079A3A93F000000A0CEB2A8BF000000A0111896BF00000080835B943F000000409110BFBF000000609461D5BF00000000A65779BF0000000007DFB3BF00000000BA3052BF00000020E8F2C0BF00000080D575AEBF000000A0E6F4B73F000000C0BED5C7BF000000C01A90BFBF000000805130AA3F000000006195BB3F00000040DB77A4BF00000080DF3BA1BF000000A0AE49CA3F00000080C78D9CBF000000800261C6BF00000000AF42B23F000000C04E89B93F000000E0F65FD43F000000C0E49FCA3F000000C0E9EFB33F000000C093C5ADBF000000C02A14B0BF000000806919C33F000000E0C065C9BF000000E086498FBF00000000B9E7BE3F00000040B469C23F000000005E38B13F00000000BC07AA3F000000E0AF85C4BF00000000F877A13F0000000085C5B13F000000C06BF4C7BF0000004063DDA0BF00000000694F833F000000A08221C3BF00000040E6A49EBF000000C0E9DDBDBF000000C03757CE3F0000000000E5B53F000000604577B3BF000000C0789EB3BF00000000D2D5C33F000000004155A8BF000000405084ADBF00000000ED0CA53F000000002A61BBBF000000E064D5C8BF0000000084FFD0BF000000008639A83F000000803411D63F00000000D9EDC33F000000405068CCBF00000020A1B8A63F00000020213CA13F000000008499743F00000020D836BE3F00000020A85AB83F000000E022C5ACBF00000000348C82BF0000008074F3A9BF000000806786A0BF000000A07A8CC63F0000000040F9933F000000203667B4BF000000E0F4DDC03F00000020265496BF0000000083D8AC3F00000000579FAA3F00000040176AB3BF00000080C3B9A6BF00000080C2F1AC3F000000A09A68C9BF00000080B38399BF0000000020524EBF000000A0F6D0B2BF000000001AAB813F00000040B024B43F000000A0F3C1C3BF000000A01816B13F000000805926A83F0000002074BAA43F0000000064899ABF000000806B77A23F000000003410ADBF00000000697B903F000000C0AA71B23F00000020ACCFD2BF00000060F5F4D13F00000080C539C93F000000002241AC3F000000E06937C43F000000402DBFC03F000000805425923F00000000013B963F00000000801556BF00000020F29CC4BF000000C03DB2B6BF00000080719AC03F00000080C2D099BF000000809398C43F000000004264903F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (4, 1, 0x000000E09E48C0BF000000A0A223C33F00000000C0BC8B3F000000404D4C85BF000000805FCCACBF00000000942F64BF000000005554A9BF000000A0CD79B3BF000000403E03BC3F00000060A4A1ADBF000000402BB4D03F000000E0ADBEB2BF0000000022BBC5BF000000C03475C4BF0000008093E39FBF000000407DBEC83F00000060BD61C5BF000000C0FFA2C9BF00000020C4909FBF00000000D25385BF000000E00AA2B43F000000607CB8ADBF000000208997AFBF00000080DB719F3F00000000174EC3BF000000002409D4BF000000008D4B873F00000040E1D4B6BF0000004049BE923F00000060DC07C4BF0000000086B3B1BF00000080352DAC3F000000204834CABF00000080CAB9B8BF000000809186AE3F000000C0C86FBF3F000000C0E2A0ACBF000000805683A2BF000000809DD9CA3F00000000C0CF93BF000000803A80C8BF00000080878DA83F000000A0F349B93F000000E02A7ED33F00000080D9F8C83F000000E00C7BB33F000000C0B181A9BF00000080CAFAACBF000000E0A7B3C13F000000C05C23CCBF000000E0DA70A73F000000C01160BD3F00000040B0DFC63F000000C03B38C03F00000080C618A13F00000000F8FFC6BF000000001B66A33F00000080CCDAB63F000000E02CCAC8BF0000008082E5933F00000000EC27813F00000060B750C1BF000000C09B948D3F000000C00B5FB2BF000000A076B9D13F00000000574BB33F0000006062B9B2BF000000C0EDF8B4BF00000020B67FC63F000000A051B89ABF000000003B3AB1BF000000C0508BA83F000000802916B9BF000000A0FE73C8BF000000802407D1BF000000009F5DB03F000000408343D43F00000080D8E2C33F000000C084D4CBBF0000008035549D3F000000C0A0449C3F000000006CA46ABF00000040D9C9B83F000000E081C2B33F000000A00050A3BF000000803BC4A1BF00000040E148A9BF00000000F0C9633F00000040FFC0CB3F0000000054B57FBF000000003CABB3BF000000A0E27BBE3F0000006018BD9FBF000000C0C3BDA23F000000A090449E3F00000080D3B3A5BF00000080D0E0A5BF00000000C45EAD3F000000006469C4BF000000C0AAE2A8BF000000800059943F000000A0B24DACBF000000005E1A8D3F000000000F85C03F00000060FDF4C3BF000000806354AE3F000000005FD9A33F000000C0DC949B3F000000C0BDB5A3BF000000004B9AA93F00000080E6CDB3BF00000000C0056F3F00000060717BB03F000000400AF7D1BF000000807CD8D53F000000C0DB93C73F000000603E4CB33F000000007A18C03F0000008021D0BD3F00000000DC0180BF00000080EBA1B03F00000000A9A9A2BF00000020E7C5C4BF00000080F0C7B3BF000000C0390CC23F00000000804C5B3F000000403F3DC33F00000040B477A53F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (5, 1, 0x000000408A65B9BF000000807975BB3F000000A0CC35B33F00000020E1629E3F0000006072E2B3BF00000000440C74BF000000603C26AABF000000007838B2BF00000020468FBC3F000000002EC0B9BF000000E08B83CF3F00000080333EB9BF000000C01CC2C8BF000000C0CC95BABF000000C02DFFA1BF000000408313CF3F0000000089A6C1BF000000C0D3E9B9BF000000C0AC39B7BF000000200BD3B1BF000000E08A51A53F00000040B3B896BF000000C003159CBF000000804EBF993F000000A0760DB2BF00000080AF43D5BF000000001D8195BF00000060E49FA9BF00000000F71EA93F000000E0C33DC0BF00000000B3D9BDBF00000080B97BAD3F000000A06F3BC8BF0000000030D8C0BF00000020BC3BB13F00000000F50AB73F0000000096FBA4BF00000080F046A4BF00000040F691C43F000000C00EFAA5BF000000403D4DC5BF00000000721BB23F00000080D545B73F000000E0EF80D03F00000000203FC63F00000000DA68BB3F000000802017A5BF00000080F4C6B3BF00000000D37EBC3F00000000071BCABF00000040FD839A3F000000605F3DB73F000000C06174B53F000000E01D5DB73F0000008097DBAB3F000000006E27C4BF00000000A0C86B3F000000005496C03F0000002025D8C2BF000000E037D1AB3F000000801517993F000000405487C0BF00000060C20BADBF00000040C207B0BF00000000DE5AD03F00000060B8BAB33F000000C0262CB8BF00000040EDB2C0BF000000E0178BC93F00000000830BA8BF00000040ADEFA8BF00000000B8516DBF000000A0FB67B9BF00000020FF75C5BF00000020E0C1D2BF000000C0AB24B73F00000020739FD83F00000060BE0BBD3F00000040D474CDBF000000209046AF3F000000E05589A33F00000000F1D8803F00000080CDD3C03F000000E00122C23F00000000809B81BF000000C088C8A6BF000000005A2E7ABF00000000E05C73BF0000000095BAC33F000000007A8E8BBF00000000CB8AADBF00000000A79DC63F00000020A120A0BF000000C09421A43F00000020E4909D3F00000000CA537EBF000000C080E2AABF00000040EF37993F000000C06930C8BF0000008088EAA9BF00000000689AB83F00000040DF95AFBF00000000E2A0843F000000E04B1FBE3F000000002170C3BF000000C0EBD5B03F00000000C43C7A3F000000C076DCA73F000000803AF6A83F000000C0782AB33F000000A0E44ABBBF00000000A3DC91BF000000601F6AB83F000000C07E96D2BF00000080792AD33F000000407374CC3F000000401E75AC3F000000C0D39FBB3F0000000094CCC03F000000002859A83F0000000034ABC03F00000000FC067A3F000000E0D0A8C6BF0000008032C9B9BF000000E0828CC03F000000009F4A9EBF00000080D42DAF3F000000A0E2CDA83F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (6, 1, 0x00000000D9B4BFBF00000080E7E5C33F00000020665EB23F0000000000D8AEBE000000C0C48BA7BF00000000B2CE713F00000000316DA1BF00000000B45ABABF000000405335BC3F00000080B934B3BF000000609812D03F000000006C0FAABF00000080CA94CBBF00000040473DBFBF00000000B089583F000000A0D4E1C93F000000401142C5BF00000080F704C3BF000000C064F3B8BF00000040CFC1A4BF000000006600A63F000000800C41B0BF00000000509088BF00000000161A8DBF000000000338BBBF000000003DD8D3BF0000004080AD97BF000000C04D83B2BF000000403C6DAD3F000000C08D2FB5BF000000E092CDB5BF000000808EEEA33F000000803743CABF000000603F7DC1BF000000C0B695A93F000000000266BB3F000000A02531B3BF0000000048FC7E3F00000080E1C4C83F000000604DE09CBF000000802DF4C6BF00000000407BAE3F00000080EFB7B03F000000E0DA8DD23F00000020EB43C93F000000A036F1B53F0000006097BAA2BF000000007D5FA5BF00000020D45AB43F000000A0B47CD1BF00000080EE43B63F000000C0F498B83F00000080F8D0C33F000000C02240BA3F00000040E202B43F000000E08207C6BF00000000F08271BF000000E05AE4BC3F000000C0884DC5BF0000000033F5B03F000000C0CC3CAA3F00000040EE03C2BF000000E0DC56AABF0000000038CFB5BF00000080D1DACF3F0000000046F3B83F000000C064A1BBBF000000005C88B4BF0000008041FBC53F00000000D0D5413F000000C0AC22A0BF000000209348A33F000000C0AA25BBBF0000008017AAC6BF000000A0C554D3BF000000C0A805B63F00000040D3D6D93F00000060F468C33F000000C05BDDCABF00000000E6B4853F00000000ADD87EBF00000000F469673F0000004051ACB93F000000C0C8D3B13F000000404825A2BF00000000C6F091BF0000000040958CBF000000000EE4A23F00000040E8DBC03F000000004404A1BF000000201EFAB6BF000000400A43C53F00000000D876A3BF000000A018FAAD3F0000000022AF6C3F000000003BB091BF0000000072C78BBF000000005D6073BF000000006FA5CBBF000000C07C26B1BF000000E0BC6EAE3F000000604AACAEBF00000000D652963F000000008127BA3F00000040AD02C2BF00000000FF52AE3F0000004085F1A93F000000E02CD7A83F0000000077F3883F000000801566AB3F000000E09CF1BCBF000000000078F53E00000080F64EBC3F000000600ECCD2BF00000040E44CD33F00000060A78CCE3F00000020F01A973F000000C0D66AB53F00000060F2F6C13F00000000801494BF000000A03947B93F0000000000D392BF000000804318C6BF000000200856B5BF000000206BA4C13F00000000C8E4643F000000400EA7BB3F00000000164CB03F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (7, 1, 0x000000C01C9BBFBF000000E09F87C13F00000080897E873F000000003B25A5BF00000020768CABBF000000C0DCDFA1BF000000809DC19BBF000000E0E6A2B6BF000000C07A24BE3F000000E06250A3BF000000200521D23F00000060A1A6AEBF000000A07399C6BF000000806B6EC8BF00000040A913A2BF000000002463C83F00000000F089C7BF00000000D016C2BF000000603346A4BF00000080A5579DBF00000080939BB03F0000000066A2A5BF000000E0643F9ABF00000000FE20A23F000000E0850BB7BF00000080CCC9D3BF00000000140280BF000000C0EE2EB6BF000000E009E7963F000000C02A86BEBF000000C0EBCAA8BF000000E0DDE6AE3F00000000B9DCC6BF000000C0DCAEBDBF000000805862B33F000000C05187B93F000000A049ECA8BF00000000AAF5A3BF00000060D10FCB3F000000605155A7BF000000C02798C4BF000000800F46AD3F00000000AED0B83F0000004074DFD23F000000601E3BCA3F000000E09745B13F000000207947A4BF0000008006D1AFBF000000000803C13F00000040A50FC8BF00000080E3C3983F00000060C5CFBB3F000000403BB1C23F000000C04932B03F000000A0FB2FAD3F00000020ADC4C6BF000000006609903F000000E0AA4BB63F000000804ACBC5BF00000040B4EF95BF0000008047D0963F0000002014B4C0BF00000060261AA4BF00000000899DB9BF000000A01ED2CE3F00000000DE74B13F000000007360B8BF000000404D53B8BF000000407BDDC63F000000009D48A3BF00000040D976ACBF00000080B7FE903F000000807409BDBF00000000B9B0C6BF00000060ABF5CEBF000000C0FF2CB13F00000080F8AED43F00000020A447C43F000000800314CDBF0000004026C5A93F00000040D7C29E3F00000080FB2E953F000000200CB0BC3F000000A0E1CCB73F000000405BC0A1BF00000000A5468BBF000000008DF6AABF00000000F4238BBF00000000B8C0C13F00000000293F8BBF000000A0291CB1BF00000080B85DC13F000000E0D8249CBF000000403FC8AB3F00000020C65DA53F00000020A5E6B3BF00000080F530A0BF000000406D23B23F000000407B86C7BF000000006C948BBF000000C09718A43F000000C0FD6DB0BF000000007B4CA03F000000802BD0B93F00000080E33DC1BF00000080B912AC3F000000C017B0A43F00000080159DA43F000000C05474A0BF00000000F4EF9E3F00000080B616B0BF000000005FE9903F00000080C8B4B13F00000000C94ED1BF000000C01EAAD43F0000006041FEC53F00000040D542AE3F00000040DBBFC23F00000060C98AC03F00000000A8818F3F000000606D7DB13F00000000A7D997BF0000000016BBC4BF000000C0B9C4B3BF000000C024C1BD3F00000000ECBC86BF000000C08A1BC43F000000C0D3E99B3F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (8, 1, 0x0000004004C4C0BF00000000F96DC63F000000A0B03B903F0000000087577EBF000000C03BD2ACBF000000C0E306B0BF000000C09763A7BF000000C0ECDDB5BF00000000E078C03F000000006FDE98BF000000C02C8DD13F000000407C57AFBF00000000ECA9C5BF000000A05823C7BF000000C0E42BA3BF0000008085FFC93F000000005D2EC8BF000000401631C1BF00000040AC4EAEBF000000407D94A1BF0000008097F9AB3F00000000A323A6BF000000C0339398BF000000801CC69F3F00000020EE54B2BF00000000DE00D5BF00000040367891BF00000040CC37B9BF00000060C041AB3F00000040092DBFBF000000406411ACBF000000C0B4CDA53F000000003EC3C7BF000000C0EE4BC1BF000000C028B4B13F000000C00876B33F000000A09965A9BF000000800F22A1BF00000080D788CB3F00000040712EB4BF000000C0FE5EC3BF000000C0F757B03F00000060680AB93F00000020A4AAD23F00000040F8D4C83F000000203898B33F000000C0451296BF000000002195ABBF000000C06625BC3F00000040B495C6BF00000080A9309C3F000000805FD3BC3F0000008041B8C13F00000040341EB73F0000000018F9AC3F000000C0ED8EC6BF000000000C898A3F0000004039DDB33F000000A051C9C6BF00000000438D78BF000000800E5AA13F0000006092AABEBF000000007604ADBF000000400BD2B4BF000000401252D13F000000C0C8E9B23F000000A04D03B9BF000000A0ACFDB9BF000000009FF4C43F0000006091DAACBF000000C00A78A0BF00000080BE418B3F00000080B55CBABF00000040D427C6BF000000E0BC01D0BF00000000E8D0B23F000000806D38D53F000000E02386C23F00000080E89BCCBF00000020D6E5AE3F00000060AC469A3F00000000A07C64BF000000806BA0BA3F000000E02E3CB63F000000004E53A3BF00000080942291BF00000000C888A7BF00000000FEB9823F000000600B0EC33F00000080D84891BF000000E07AC6B0BF000000200DF3C03F00000080B3E298BF000000009D0EAA3F000000400330923F000000A08F5CB1BF00000000AA2C91BF000000806452A93F0000008025D9C3BF000000006A44893F00000040FFB0AE3F00000000A725ABBF00000000D895783F000000007571B33F0000004022E6BDBF00000080A456AA3F00000040FDF2AA3F00000080C4FDAA3F000000407A78A5BF00000000CD88A53F000000A0C2C5B4BF00000000C00B833F00000000CE57B63F000000C01A37D1BF000000E0BAA5D73F00000080C3F7C53F000000809106A73F00000080FADAC13F000000409B87BB3F0000000044A3863F000000807C5EB43F000000805B9B99BF0000002028DCC2BF000000603E9BB6BF000000A03E14BF3F0000008090359BBF000000C03007C43F000000C0C1ABA23F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (9, 1, 0x0000004082C8C0BF00000080AC9FC83F00000000FF4EAC3F00000000188A493F00000000A94EA9BF0000000052F8A3BF00000040E040A4BF000000A09334B8BF000000E05135BD3F000000A0FFD598BF0000002085CAD13F000000C0C5C0AEBF000000803A1ACABF00000080C66BC6BF000000003074403F000000A0EC15C93F000000C02578C4BF00000060FCDCC6BF00000020A057A6BF00000000B67BA1BF000000C08F4AB33F000000E0E47CA1BF00000000FA0EA8BF0000000008839E3F000000C03DE0BFBF000000C084E4D3BF00000000579685BF00000000AAE8B5BF000000C0DF7EA13F000000E00D40C3BF000000200454B1BF0000000038176A3F00000080EAD7C8BF0000004093E2BCBF000000E0EE1EB13F000000E0E439C03F00000080DF06B2BF00000040D09CA5BF000000002877C93F000000C08356A8BF000000A01797C8BF00000000AE45B13F000000A0DBC4B73F000000A026CBD33F0000004028F0C93F000000E06E16B83F000000E05431A9BF00000000AB5BAABF000000A026DCBC3F00000020FBCAC8BF000000C0E7B9B33F00000080BDA8BD3F000000C0B042C63F00000080BDBDB73F00000040BC1DAB3F0000006090DFC7BF00000000284782BF000000E0831DBA3F000000400237CCBF0000000032C4713F00000080082FA33F000000C0212AC3BF000000407DB2A3BF000000E0A57CB7BF000000404F15D03F00000080FEAEB73F000000C0C1F1BABF000000002B67B2BF000000C061FAC23F00000060A4B9B1BF000000E06712AABF000000405166A13F000000A01A66B7BF000000002CB3C7BF000000006DD7D0BF000000005192B43F00000040E260D53F000000207364C13F0000006067A3CEBF00000060ECBA9F3F000000C081EDAF3F0000000014958B3F00000080FD3FBD3F000000E02C4FBB3F000000007B5198BF00000000CEC083BF00000040BBBAAABF000000009838813F000000C07B16C43F000000005A8699BF000000000115ABBF000000E09508C33F00000040B483A2BF000000004F4FA73F000000808DC2963F000000808508ABBF0000008090F698BF000000C03E4DA53F000000800A7BC2BF0000000000CEA1BF000000C02318A23F000000803D48A9BF0000000084F0883F00000040105CB33F000000407E79C1BF000000401F53AC3F00000000FF2BB33F000000E08CA7A63F00000000E8999CBF00000000771E993F000000005AC4B1BF0000000093B292BF000000203249B63F00000060994ED3BF00000080D414D63F000000409CDDC73F000000C0A9CB813F000000C0E8FBC03F0000004016E0B93F00000000FFEA8B3F000000E02288B53F000000C036C6A7BF00000000620CC4BF00000040300BB2BF000000407BF6C03F000000801E5395BF000000005513C63F000000A02E18A13F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (10, 1, 0x00000040E49ABEBF0000000051E8C13F000000C0CF61963F000000E06F03A2BF00000080E02AADBF000000C07A0FA0BF00000080968F97BF000000A0D40EB5BF000000408211BF3F000000604713B1BF000000807D9BD33F00000000FF7AB0BF000000E0552CCBBF000000A03417C3BF00000000F52398BF000000803323C93F00000060F544C7BF000000403574C1BF00000000F05AB0BF000000A0AA10B0BF0000004097D1AF3F0000004027A6ADBF000000C0688EA8BF000000400DA7A23F0000004013CFBBBF000000C04AD4D4BF00000000379C8DBF00000040057FB2BF000000C0E320AF3F00000060FF9FC0BF000000A01101B0BF000000409C75AA3F00000040D816C9BF00000000E424BEBF000000C0BC38B23F00000020D5C8B43F000000004757A7BF000000004331A5BF000000606487CA3F0000004085E293BF000000A06B49C3BF000000801A27A53F00000040723FB33F000000007180D33F000000A0E67BC83F000000E01DD1B43F000000E0C568A1BF000000004B71A2BF000000A08A8DBE3F00000040F385CDBF00000000A1F89B3F000000A0ED70BE3F00000060E3AAC23F00000040D14DB73F000000A001B5A93F000000A026FEC5BF0000000028A5803F000000808148B43F00000080465EC9BF00000000CD307A3F0000008073A9953F000000E095E0C1BF00000000BA2FA6BF000000809594B6BF00000000BCBCD03F00000020D13FB63F000000000887BBBF00000040BA05B5BF000000E0D399C63F000000003E71A8BF00000020D723A1BF000000002409753F0000000016B8BBBF000000E0FEB7C7BF000000E099B0CDBF000000800EF6B43F0000008054F5D53F000000800D3CC73F00000080AA7FCBBF00000040F215AD3F000000801275833F00000000304267BF000000A03796BD3F000000205E34B43F000000C07C4994BF0000000048F25EBF00000080B08A98BF000000000603A13F000000E0547FC33F0000008009C99CBF0000000010DEB1BF000000A0C655C63F000000400387A9BF000000404CB4AC3F000000C058A5A03F000000006C5CADBF000000C0D7A6A7BF00000040A7B3A13F000000C05AEAC3BF00000000FEFF9DBF0000002050A0AF3F000000804F6FAABF00000000AD96A63F00000080D74EB43F00000000E7B1C1BF000000C0A8B7B23F000000406DABA03F000000408B38A83F000000805EC797BF0000000092DFA13F000000608471B4BF000000002856753F000000C07454B33F000000A0D864D2BF00000080D229D63F000000C04222C93F00000040B921A43F000000E0B8CDC03F0000002040CEBD3F00000000B98C97BF00000020AFCDB93F000000003984A3BF00000060B636C1BF000000C05034B9BF000000406FBCBD3F0000008078CD95BF000000E0FF3AC33F0000000048B4803F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (11, 2, 0x00000040F72BBFBF00000080C104C53F000000E08808A63F000000C023F69ABF00000040E280ABBF000000E09E9BA7BF000000C095E1ABBF00000040E90EC2BF00000020AA58C23F0000000020ED95BF000000809E96D13F00000080307883BF0000000054D1D1BF000000209A01C6BF000000003FB17CBF000000A0F9B3C33F00000040AAF0C2BF0000006069A2C5BF00000000B738B3BF000000C0A227A53F000000E04B11A33F00000080534C733F00000000835BA83F00000000ED25923F00000000D0EAADBF0000002061C2D8BF000000802351A4BF000000805E78B9BF000000003385A8BF00000000962E9EBF0000004099E3A4BF000000A0903EB03F0000000076F4CABF000000A05886B8BF00000000AC34913F00000060B256C13F000000008A9C87BF000000A0D710A43F000000A00B2EC93F000000C095A591BF000000005177CABF000000006F96A9BF0000000096E2803F000000C03CC8D03F00000020C521C43F000000A04EAEAA3F00000040B8D8A63F000000C04382BBBF00000080F8BAA03F00000040D8F9C5BF000000001F49B73F000000C07FF0C43F0000008070EDBB3F000000402577A03F0000008036C6923F000000803A71C5BF00000000281588BF000000C0ACA6B33F000000E0E955C3BF000000804AAB95BF000000401DC6B63F00000040CA2BBCBF000000C0BF26BABF00000060EE53BEBF000000C087C6D23F000000C09084AE3F000000A012FBB9BF000000601280C4BF000000804F18C03F000000A0324AB7BF000000E0EB42B9BF000000601628AC3F00000060DD54C4BF00000080E47BC5BF000000409596D5BF000000C09A93B53F000000807FE8D93F000000E07E19B73F00000080710ECEBF000000E0A3F7AD3F000000403CABB5BF000000803169A2BF00000020AA43B33F000000E03F99B83F00000000DC8285BF000000007AFDB73F00000080938BC1BF00000000104A6BBF000000C03259C33F00000060C900B2BF00000040B9DEA0BF000000607C98C63F00000000C80197BF00000040FA85B73F00000040A446A83F00000040BB8FA1BF00000000805D2FBF000000A09F42AC3F000000C03322C6BF00000000F24698BF000000A0490DAE3F00000080906EA2BF000000001824683F00000000D717B03F000000C09C03B9BF000000802AB8A53F000000C049C6A33F000000C049FEA13F0000008063F8A63F0000000078706A3F000000800547BBBF000000C0CA5AC7BF00000000FC1FC43F00000040E705CEBF0000008064DDCC3F0000006053E0C23F000000C0031AA33F00000040E277C13F0000004059CDBD3F00000080447BC33F000000001A6087BF000000004715933F000000C0229BC9BF00000040520D90BF000000208705C23F00000080CAC19C3F00000040E096B93F00000080D8F5A73F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (12, 2, 0x00000000E22FC3BF00000040A4E9C53F000000C0F96AA23F00000080E8C1663F00000040D2A4A0BF000000807CF7B1BF000000000600ACBF000000C0FA95C0BF00000080380CC33F000000C0B793A5BF0000006032ABD13F000000A0D9BCA3BF00000080D7BFD0BF000000A0B5A4C7BF00000000C2D269BF00000040D554C53F00000080F3C0C3BF000000E0070DBFBF000000202A82B4BF00000000387C933F00000080895EA43F00000080D30A6A3F000000C022B8B23F00000080740B9A3F000000C03DC5ABBF00000000F353DCBF000000E0D904B3BF00000000F312B7BF00000080ACB99BBF000000000E7B95BF000000C002B5B0BF00000020477AAF3F000000407381C9BF000000408E7BBABF0000000064EC943F000000C0F51AC13F00000000263076BF00000000B61C903F0000004028BECA3F000000608BF2A2BF000000A00E60CBBF00000080242AACBF000000802A49A13F000000805F1ED13F000000401E47C73F0000000062D19E3F000000409B6BA43F0000000026FCBABF000000A0BD72B23F00000060F46FC5BF00000040FA7CAA3F00000000038DC43F000000C05D1ABA3F000000C0D621A03F000000007EE68D3F00000000675EC0BF00000000008E163F000000800770BA3F0000004093EAC2BF00000060DE75AABF000000807AEDB63F000000C08681C1BF00000080BD42BABF00000040B2E5B4BF00000000BB14D33F00000000AC64B53F00000000A1E8B9BF000000403889C7BF000000C08101C23F000000003D83BEBF000000C0C0EBA3BF00000080FE7AB23F000000003E79C3BF00000080DE2BC8BF000000C09CAAD5BF000000805E44B73F000000407A71DA3F00000040B347BB3F0000002002F1C9BF000000E0FE55B23F00000040F36CBEBF00000000383A9ABF000000A070E0BA3F0000002040F8BC3F000000C0998398BF000000209DE0B23F000000A0BDBDC3BF000000008038453F000000C0177AC73F00000000FD32B1BF0000004033B2A1BF00000020FD72C73F00000000DCA87ABF00000040C9D9BD3F000000402B0DA83F000000409B0DA7BF000000C02673A1BF0000000001BCA13F000000A08C85C6BF00000000641C7CBF000000201B6AB03F000000C0D9EBA6BF000000000058E8BE000000404E3BB13F0000008091CBBDBF000000405A01AA3F000000C03905A23F00000080C67DA23F000000E02DBFB03F0000000022248DBF000000E0D490B8BF00000080404EC5BF000000E0C9D2C13F00000040E061CEBF000000E0E878CA3F000000407179C13F000000208035A73F000000C0583BC53F00000020C829C03F000000A02B27C33F00000000CD6C90BF00000000D82C68BF000000006854C9BF0000004081D0663F000000208682C23F00000080CE74943F00000080B3CBB83F00000000FE00813F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (13, 2, 0x00000040F802C0BF000000406FBEC73F000000A074E8A33F000000C076ADA3BF000000C048F4AABF00000080A1F1ABBF000000602354AABF00000000318DBFBF000000A0A5DDC43F000000808941B4BF000000E07C3DD03F000000C07683A4BF000000C03435D2BF00000000B280BEBF000000A0ECC9A5BF0000006063C8C53F0000008016BCC7BF000000A0D5FAC1BF000000E00E35AEBF00000040D139A13F000000E0DBF4AD3F00000000301B86BF00000040E801AA3F000000000B818E3F000000802EC699BF000000002C02D9BF000000C0FE40B5BF000000400490B0BF00000000AAD0A8BF000000008EEF98BF000000E05E8EA3BF000000008A53AA3F000000C0504BCABF0000006044D6B5BF00000000503058BF000000E0094EB73F0000000042B19FBF0000008031C9913F000000A0FEA4CB3F00000020007491BF00000040B872C8BF00000080F7E9AEBF000000000A41913F000000A076FFD03F00000000C3DDC23F00000040665BAE3F000000003405A53F000000207830C0BF00000000C88D963F000000C0B381C5BF00000040358DB33F000000A02B5EC43F00000000A82CB73F000000C045F6AA3F0000000028C65FBF000000A0052CC6BF0000000094F88B3F000000C0DD5FB83F00000080207DBCBF00000080A06E86BF000000C050ACBA3F000000E0FB0BC4BF00000000A618B3BF000000C050CAB0BF000000E0D69ED63F000000C0B13EB13F000000A04B02BDBF000000C09049C7BF000000C068D4C23F000000C021DDB3BF000000C00C60B0BF00000080389BB23F000000A0CA8AC1BF00000080E8BCC3BF000000609FF7D3BF00000000C5C8B13F000000004AACDA3F000000C063E6B33F000000803787C8BF000000600534A83F000000C020F2C1BF000000603920A6BF000000C03376B93F00000000A103C33F0000004089A3A0BF000000807D91AE3F00000040BCE6C3BF00000000BEA5843F000000C03531C63F000000E0E43BB3BF000000C0ACABB1BF000000C049F7C73F000000005EFE7ABF000000601D23BA3F0000002083089A3F000000C065F2A4BF00000040EF53A1BF000000E0996CA63F000000002C59C3BF00000080E70499BF00000020FEEFB03F00000040898AA3BF00000000E000A7BF000000A05F8AB93F00000060DF28B9BF00000080DB43A53F00000000A305923F0000008023C0A03F000000005B719D3F000000005A409CBF000000A09BFCB8BF00000000D261C3BF00000080F84BC13F000000805F14D0BF00000040E11DCA3F00000000010CC13F000000E0124FA93F000000C07F36C33F000000E01D7CBF3F00000080DA7BC23F000000007C98723F00000000CCE396BF000000608AB8CCBF000000E066C18B3F0000004092BDC23F000000C09FF8A43F000000001278BF3F000000C0A837A13F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (14, 2, 0x000000E0CDDFBABF000000206BABC63F000000202D5FA23F000000C04E2797BF000000402CAEA8BF000000C0E790B2BF000000C05ADEABBF000000E08D83C2BF00000020BFBFC43F000000C07DBEB3BF000000E0BE6CD03F000000E0FBB29DBF00000040B43ED1BF000000406734C3BF00000060D957A3BF000000809CF8C63F000000400563C8BF000000A05CC1C3BF000000E0A252ACBF00000000B6B7893F00000080DB27AA3F000000606A268F3F000000605E8AB43F00000000542F7D3F0000000043F981BF00000060AE23DABF000000C01670AEBF00000080E687B5BF000000C0BE1692BF00000000DD9DA8BF00000000B21AA5BF000000800BA8A73F000000C02659CBBF000000401A63B2BF000000001360893F00000080354BBA3F00000000EBE48CBF0000008008DC913F000000405E37CC3F000000006A938F3F00000080A7CEC4BF000000008EC9B0BF00000000914DA1BF00000060350ED23F000000C0E56CC73F000000C05074B23F000000E0D74AA03F000000E0AFACC3BF000000A030A5B13F000000E042C9C5BF000000408DD5AB3F00000040037BC13F000000C0E6A1BA3F00000000D4D6773F00000000294A89BF000000607ACEC4BF0000000030DB743F000000A08CD5AF3F000000C08A4CC2BF00000000B9F290BF00000040FD6EB73F00000020057FC5BF000000A0ABC3BABF000000C0FA95B3BF00000040A5CDD53F000000002FDD9E3F00000000AF00BCBF000000201C15C2BF000000408277C13F00000040F8D1B6BF000000201839ADBF00000080E703A43F000000C046E5BFBF000000E008B8C3BF0000008094D5D3BF000000803D92A63F000000E0210CDA3F00000000BD97AC3F000000C0DFD4CBBF00000040D9C8A63F00000040AC87BBBF00000000A46D96BF000000E02747B93F000000600887C13F00000020C607ADBF000000801F21AF3F000000003680C6BF0000000092998C3F000000A07CB3C53F000000801BC3BCBF000000C058EFAABF000000000B6DC83F000000C0B328A9BF000000C08564C13F000000800EF3983F00000080BCFAA9BF00000080BFFAA5BF000000E03107B13F00000040637CC2BF000000803EEDA5BF000000807616B73F00000080E5CBA3BF00000000C75D94BF000000005E5FB33F00000040B508BCBF00000080DD9DA23F00000000001921BF000000A0CBB9973F000000C03235AA3F0000004080B7B2BF000000C057DCBCBF000000E05016C4BF00000000D462C33F000000E0A1E7CCBF000000C0DE39CB3F000000C045B1C43F000000C0BC3AA33F0000008036D5C53F00000000669FBC3F00000040F804C13F00000000CC5E8FBF000000001E8387BF0000004067FECCBF000000C0042E8F3F000000400FA2C23F000000006C47A83F000000C08D73BD3F00000000F1B6853F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (15, 2, 0x00000080C0D0B9BF000000609CAFC33F00000080D7B0AD3F000000008CF54CBF00000000ADFBA9BF000000204230AFBF000000403D85ADBF00000020373FC2BF000000000AFEBA3F000000605D049DBF00000040F33AD23F00000000A3499DBF000000C0BFC0D0BF000000C021B0C3BF000000000A8491BF000000201517C33F00000020AD5FC1BF000000C05870C4BF00000080CD1FBABF00000080C920AD3F000000C03533AD3F00000020AEC7913F000000C0E2F7AD3F00000000445C693F000000807E72ABBF000000808FA9D8BF00000000F319A9BF000000406A18B8BF000000C0E6A28ABF00000000A8DE7B3F00000060D144B3BF000000C07681A13F000000A0FB52CCBF000000200C27B8BF00000000F625843F000000603861B73F00000000FBB790BF00000080FA52923F00000060CD17C83F00000020141FA6BF000000604116D0BF00000000F0B272BF000000009A749D3F0000006003C0CC3F000000C05BA3C83F0000004098E5AA3F000000A0D304A53F0000004082E3BCBF000000C00988A43F0000008069DAC8BF000000C08043BC3F000000C07C1EC33F000000C0F8DABA3F000000801C5E9D3F0000008050AD933F000000409E15C5BF0000000006849CBF000000C02D8BB33F0000004032C9C0BF00000000369A5D3F000000003A64B93F00000080BC77BBBF0000006032A6B4BF000000808CCCBFBF000000406FE9D03F00000000C08EA93F00000000C010BBBF000000A0D5DCC3BF00000060230CC23F000000803E87BCBF000000E042D3B1BF000000C067B0B33F00000080567DC3BF00000080EEF9C5BF00000040ED71D6BF0000004024E4B33F000000C0C3A0DA3F00000060F862B43F00000060C760CBBF000000E0DF74B23F000000202200B4BF00000080A57B90BF00000000ED5CB53F000000A07EF8B83F00000000F52B833F000000A07556B23F000000C011AFC3BF0000000080A13E3F00000080353AC83F00000020D1DEB5BF00000000EDCEA2BF0000008016E9CA3F000000C04A479FBF000000A0876EB83F00000080017FAA3F0000000063AF843F00000000105F5A3F00000060053B973F000000A0F088C5BF0000000078FB913F000000C02469AA3F000000406F00A5BF0000000086DD9CBF000000C086ABAF3F000000C0A822B3BF000000807D09A43F000000803173933F00000060A996B03F000000403954AA3F0000000039B69CBF00000060600FB7BF0000000086D0C3BF0000000086E2C13F000000E078E0CABF00000000739DCD3F0000004078F7BE3F000000C07DFBAD3F00000080BFEFBE3F000000A07F69BF3F000000403745BF3F0000000058927CBF0000000068086FBF000000E013DECEBF00000080C0CD9BBF000000008AA9C13F0000000020F6323F000000C0632CB93F00000040BC83B13F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (16, 2, 0x000000E04AA7C3BF000000E0C84CC13F000000E0EF9AAE3F00000080538B963F00000080F34CBABF0000004082C69BBF00000040F7B3AABF000000C00682C6BF000000001F90C13F000000C053FCB5BF000000807A60D33F00000080DA8F913F000000002C7ECABF000000607572C1BF00000020D04BA3BF00000020C3A8C43F00000000A2D6C2BF000000E0EC8BC9BF0000008021498FBF0000004019DBA63F00000080D77BA43F0000006063C485BF000000C0FA1CAE3F00000080BCCBA53F00000080DA90BFBF00000020A534D6BF000000605D5FAEBF000000A04700B7BF00000020AD65723F00000080F6C7A5BF0000000027D7B2BF0000006022E2B53F000000C0E4F4C7BF000000C03408A5BF000000801294983F000000A0D79CB63F00000000047F98BF000000001777A33F000000400FB7CA3F000000C0482282BF00000040E09AD2BF00000000580495BF00000080C45095BF0000004013AED03F00000000EBCEC63F000000806FC487BF00000080830C8A3F00000080E5B4B2BF00000000BA459E3F0000008006AFC7BF00000000C3E2AE3F000000800E9BC43F00000000D1CEC03F00000000500B783F000000E0EFABA1BF000000A0071BC4BF00000000A699B1BF000000C0AE22B93F00000080C0FFC3BF00000080FD24803F00000000242EAC3F00000020A1EBC3BF00000060B0A4ACBF000000C058A5B7BF000000E00B97CB3F00000040E59ABD3F000000E053BCB9BF000000803E5ACABF00000000DBD4C33F000000C00B8FC0BF000000C0DC21B2BF000000400DCCBB3F00000040B38BBFBF00000080A6B9CCBF000000C07C1DD0BF00000000D7AB9F3F000000400177D63F000000002248B43F000000402DB4C9BF00000080C17CB23F000000C09F40B3BF000000805703A1BF00000000F422983F0000004068F6BA3F0000000009FA8C3F00000060ADB1B43F000000E0FC77BABF000000005456ABBF00000040A671C83F000000E026EBB0BF0000008006459DBF00000080A225CF3F0000008002DBA6BF0000000069BEAD3F000000C07C21B43F0000000070C96E3F00000000F8358C3F000000800750AE3F000000808E64C1BF000000809A7F91BF00000080D89EA2BF00000080ED6EB6BF00000000206645BF0000000071D89D3F000000800014C2BF00000060B692BA3F00000000C6747E3F00000000D1FAB43F00000000AF389D3F000000000C4F7DBF000000008E99B9BF000000C0D57CBFBF000000C0FAF2C33F000000001AFFD1BF000000E0BEF8D03F0000008080ABC43F00000040043CB13F000000C0245CC43F00000000D881C03F000000A042E0B13F00000000C1C5943F0000000071309ABF000000009ADFC5BF000000A0155D96BF000000004A1AC13F000000C00952B9BF000000C07913B03F00000080430BA43F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (17, 2, 0x000000005CDBC0BF000000E0B824C13F00000080972BB03F00000040153993BF000000A0146AC0BF000000806A5D90BF000000C05BE0B3BF000000004899C5BF000000C0D5E7C23F00000060D8C9BDBF000000A09DB4D13F000000C06EAFA33F00000060F237CEBF00000020405ABCBF00000020C4B1B3BF0000000066C7C83F00000000137AC5BF000000A0D8D4C7BF000000A0BA97983F0000008093EBA03F000000806D4EB93F000000003AE15ABF0000000066D3A73F00000000FD12823F000000C09DE2C0BF000000E0D9A5D6BF0000000034F5B1BF000000601640A7BF0000008018C6AEBF000000007E219FBF00000080D57BB1BF000000406661AC3F000000C0409BC8BF000000801265A6BF000000000C13AF3F000000C0BBECBA3F00000000FA20AABF00000080EC4491BF000000C07834CA3F000000C0B4DF98BF000000C0EDA5D3BF000000009454983F000000C0F775A53F000000005889CE3F00000000706DC23F000000404E6F90BF00000000BD97963F000000800289C1BF000000809CFAB03F000000605AC0C8BF000000006855AE3F000000C0D7E8C63F000000800B28B73F0000000085B38B3F00000040800EA5BF000000E057F2C0BF0000000030C69EBF000000A01641C13F00000020341DC6BF00000000137075BF000000A01DD6BF3F0000004058C3C5BF000000E03C8BB2BF000000A05E84BBBF00000060EA08C83F000000C0931CC13F00000040CCB9BFBF0000000012EACFBF000000A0B82AC13F0000002044F4BEBF000000E083E3B2BF000000C09187BD3F00000040C41BC1BF00000060903CD0BF000000805EABCDBF000000005CB8A13F000000202B83D83F000000A0FD8CBA3F000000C00C6FC4BF000000802D8DAB3F000000C0BE89B2BF0000000090E662BF000000000B29B33F000000008502C13F00000040DC72AF3F00000080664FAB3F00000080A6A4B8BF0000000038FC6ABF000000C0A1C8CB3F000000602242B4BF00000060241DA6BF000000C0E6F3CE3F00000000D9527CBF0000000033ECB23F0000008095F1A63F000000809874A93F00000080A8C09EBF000000409058B63F000000C09CE2C3BF00000000D83C613F00000080D1CD99BF00000000715FB0BF000000007859813F000000A0FD0BB03F000000C052F1BEBF000000C0DC48B93F00000080099891BF00000040D6D7AE3F000000405670A33F0000000043FDA2BF00000020B44BB8BF000000405B26BDBF000000000921BC3F000000A0DBC8D1BF000000202B73D13F000000406F70C43F000000C0A84CB33F00000080229DC33F0000008064D2C13F000000E07646B23F00000080FD23A33F0000006009BFB3BF0000006031C1CBBF0000000047669DBF0000000066C7BD3F000000C06C72B1BF000000404691B83F00000000846778BF, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (18, 2, 0x000000807576C2BF00000020A1F5C73F000000C07739B03F000000C03B778BBF00000000D4D6B0BF000000209711A8BF000000809D58AFBF000000C056F1C1BF000000C0BC21C43F000000208230B5BF00000020C5B6CF3F000000C0A7709ABF000000801CABCEBF00000000634CC0BF0000008068C599BF00000060E074C73F0000002049E7C4BF000000A0A5A9C4BF000000001D03B3BF000000007C637C3F000000E0C450AC3F000000604E9A8D3F000000801F5AA73F000000001ECD953F00000000182F7BBF000000201C5FD9BF00000000E5B8B2BF00000000EB9AB4BF00000060513A9ABF00000080BF2BB0BF000000808710B2BF000000A0092CA83F00000020D9ABC9BF0000002005ACB5BF00000000B0A74BBF000000C0E603BC3F0000000002B992BF0000000010825E3F00000040154BC93F000000008EEC7CBF000000004B5BCABF0000000046B793BF00000000F41766BF000000E06B56D13F000000806501C43F000000E0FFBCAD3F000000C0FC03923F00000000CD98BFBF000000C0D713A63F000000E057CFC3BF000000A0BEB0A23F00000040C437C63F000000C0AC27B63F0000004022F2A73F00000080AD3995BF00000080280DC4BF00000000001B773F000000403A14AA3F000000001193BDBF00000020FE359FBF00000000E34ABA3F000000201615C6BF00000080C58DB9BF000000403B22B8BF0000006097F7D43F000000207E6AB33F000000C0C6E8BABF00000020A366C6BF000000C09F0CBC3F000000E0F15CB3BF000000E0E669B3BF00000000B76EAE3F000000E00ED5C3BF00000000A088C3BF000000A0E7D6D1BF00000000AE20B63F000000409F44DB3F000000602E7BAF3F00000020DF79CBBF000000C0A7E2AA3F000000C07755C1BF00000000C9BF91BF00000060F4B4B43F000000A0B954C23F000000209358A1BF000000C0BD7FB13F000000E0C572C1BF00000000E8D2683F0000006004A7C53F00000080EA53B5BF00000000ACF3A4BF000000000467C73F000000C0807992BF000000005C03BD3F0000008009819C3F0000000030499BBF00000000201193BF000000601C38A93F000000A0F8E2C1BF0000004038ABA1BF000000001FF3B33F000000003B31ACBF00000000C02BA0BF000000A02F31B23F00000060EE2BC0BF00000000BC99AB3F00000080C8E7943F000000C06733A53F00000060C30BAD3F00000000281A8CBF0000002072DAB9BF000000401F48C3BF000000C0FB91C23F000000A01229CFBF0000000030DDCC3F00000080EBC7C63F000000C0AFF4A13F0000004056F9C33F00000080EB39C03F000000800C1EC53F000000002EBE94BF00000000586966BF00000040FB77CABF000000A03B5176BF000000800C46C53F00000000BA65A93F000000808E54B53F00000040329E953F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (19, 2, 0x000000C07082C2BF00000020C56EC73F000000A07585B33F000000A0653B843F000000405132A0BF000000A0ECA9A3BF0000004030F29FBF00000040DE6DC0BF000000C04E67C23F000000A070DA9EBF000000C0AE90D03F00000040DCDA93BF000000004880D2BF000000608C26C4BF0000004038B296BF000000401BC7C23F000000C0CC36C2BF00000020A86FC3BF00000020B854B8BF0000000018268F3F000000801381A43F0000004051549B3F00000080A6E2B03F00000000EEE2883F000000C0730CA9BF000000C0206AD8BF000000C0B9A4A1BF000000404F25BBBF00000000981B95BF000000006C1F74BF000000406F2FA9BF000000E05F42A23F0000008032D9C9BF000000E07144B7BF00000080AC2A92BF0000008093F8B43F00000000000718BF00000000C571AA3F0000004018A6CB3F000000605CD1A4BF000000C0F283CABF0000000035FAA9BF00000000B5B69B3F000000402F8DD03F00000000C10CC63F000000A04A4BAB3F00000080A3E69C3F000000C09DF1B9BF00000000DA49A03F000000A07C11C8BF000000E0E3F9B13F000000A0E559C43F00000020ADB9BB3F00000080FDEC9C3F000000000F5E9D3F000000C0CCBAC6BF00000000180BA2BF00000000DB8DAC3F00000000D301C0BF00000000D5BC7DBF000000000DD5B03F000000E0A3B5BBBF00000000F9E8B5BF000000C03846B9BF000000404328D43F00000020B224A93F000000A0AD5AB8BF00000040F827C2BF00000080419BC33F0000006090E6BEBF00000080D178ABBF000000E0E5F9B13F000000A01F14C1BF0000004015B6C2BF000000C021ECD4BF00000000A44BB53F0000004023B7D93F000000C0D134B23F000000007FD5CBBF00000020A67FB33F00000000A6A8BABF00000080CC309DBF00000000FA3FB43F000000E0B7EDB93F000000809045A9BF000000E00C49B83F00000040CC80C0BF00000000914C93BF000000600DC3C43F000000E0C0C1B0BF000000807C439EBF00000020FE81C93F000000003A9F733F000000E0C40EB53F000000A0686AB33F000000408A6CA8BF0000000000F8403F00000040DBBF903F000000E0763DC7BF00000000468E863F000000004048A63F00000000B8F4B0BF0000000050AD6E3F000000E0C2C1A53F000000A0CB42BABF000000005D67993F000000400BBEA13F000000803C39A03F000000605346A83F000000005828853F000000A0C5F4BBBF000000A0E96FC6BF00000000100BC63F000000A019CECCBF00000000A613CB3F00000040407BBF3F00000080887E973F00000000050FC33F0000000078F6BD3F000000A06CA1C53F00000000BEF496BF00000000234EA53F00000060CF9CC5BF000000C0057384BF00000000780FC43F000000009D2C91BF000000400D81BA3F00000040EC9EAD3F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (20, 2, 0x00000000BB60C2BF000000A057DEC73F00000040FE36B03F000000002CF17FBF00000080E907A6BF000000C0B575B4BF000000402AFCAABF000000205181C2BF000000001547C33F00000060385EB4BF000000806442D13F00000020819198BF000000004A09D1BF000000809C38C3BF000000006FF4813F000000C089A8C43F000000208A5FC3BF0000000022D5BDBF000000E03E9EB4BF00000000C5ED913F000000A07F92A73F00000080FA1D8A3F00000000BB37B23F00000080EEF7993F000000008C2B7A3F000000A0C7CFD9BF00000000590DBABF00000080961FB2BF000000C0D7449EBF00000080B074A6BF000000C04296B0BF000000C03C77A23F000000A08002C8BF000000002F94B8BF0000000020D5583F0000000012FFB73F00000000EE8886BF00000000B33B8A3F000000C05E3DC93F0000000073A286BF00000080738DC8BF000000008974ACBF00000000B41C783F0000002057DCD13F0000002006A3C33F000000E078A9AF3F0000004091BD913F000000804FBEB8BF000000808755A63F000000605C63C5BF00000040B2B0B03F00000080AA76C33F000000605122B63F000000006042A43F00000000BE2771BF000000202970C5BF00000000D08B643F0000008014C3B13F000000002326C2BF000000A0BB2E92BF000000A046F1B83F000000002A09C5BF000000602352C0BF00000000E57EB0BF0000008006D2D53F00000000D379BA3F00000060555FC0BF000000C0542BC6BF000000801AA8BD3F0000008032CCB7BF000000C0A952A8BF00000060ED5CB13F000000C07A19C6BF000000208DD1C4BF00000080C60CD3BF000000408F00B93F000000C0366CDA3F0000000055F2B03F000000E081DBCBBF000000C0C99B993F000000A07A42C1BF0000008093B890BF0000008059DCB53F000000C0D937C33F0000000068CC9BBF00000020EF8CB33F00000060EFA5C2BF00000000A28F8A3F000000C06A24C23F000000607C23B5BF000000A0D4CBADBF000000803365CC3F00000000845F81BF000000202867BD3F000000E0CF929B3F00000080D4CD9CBF0000000001E98ABF000000005835813F000000E0D857C5BF00000000E867A0BF000000E0BB9FB93F000000403C6EA9BF000000000B3FA4BF00000000BD29B33F000000006E9DBFBF000000806516AE3F00000040FDABA33F000000004B3DA23F000000C079CEAC3F00000080FC7EA3BF0000006059BCBABF000000008A53C4BF000000E05088C13F000000E0E1D1CEBF000000A046E5CB3F000000A054CFC43F000000408C96A93F000000409A1BC43F000000403930B93F000000C08D9DC23F000000000000B63E0000000001A092BF000000809E87C7BF000000001524543F0000006068A4C33F000000C057F4A43F00000000ED6EB53F000000004E9D7E3F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (21, 3, 0x000000E0731CC5BF000000A02224C33F000000C023E79B3F00000080F70DB7BF000000007985B6BF000000A012C8B7BF00000080CAC892BF00000020919FC3BF00000040802FC23F00000000D6C2B6BF0000006057A1D33F00000060130F96BF000000A00BB3CABF00000060EA80C8BF00000000985E793F000000C01F32CB3F000000004FCAD0BF000000C0BD37C0BF00000040569CA5BF00000000FC03ADBF00000000686BB93F00000020115F98BF00000080D44FAB3F0000000047DBA33F000000C0EED8AFBF000000808D2FDABF000000800152B8BF0000006082C3B0BF000000003E10573F00000080A9A4ABBF000000E06D0AA3BF000000E0B045B73F000000203C07C9BF000000201685C0BF00000080BE0D9A3F00000020A89DC13F000000C00EB5A4BF000000806A2DA4BF000000E04107C13F000000E0F8BEA6BF00000020AB0CBDBF00000000409E71BF000000402F36B53F000000A03EF4D13F00000000CA70C63F0000004054CF8D3F000000E0DAB2AD3F000000801776B9BF00000000E45DB73F000000C0E96EC4BF00000000678E8E3F000000207C76BC3F000000A06F90B43F000000C0113FBA3F00000020BEF0AE3F0000004069C8C1BF000000808E23B43F000000C02BA2A93F000000C095F6C1BF000000A0C768A1BF0000000060A8B83F000000C0E0BDBBBF000000A04C9AA9BF000000806F6BB1BF00000000BDE1CF3F000000206B98B13F000000C00FCCB5BF00000040D10CC5BF000000803FBEB33F000000201889A9BF000000A0D519B3BF0000008022809B3F00000000954FCABF000000400E72C5BF000000C03923D3BF00000080EE71AC3F000000800E8AD73F000000809B22BA3F000000209679C5BF000000002C339A3F000000C01E7DA5BF00000080126D94BF000000C0D5E1C03F000000E0EE31B83F00000080D43297BF00000040485EA83F00000080D393C4BF00000080AF33BD3F00000080851AC13F00000060D669B4BF000000C02866B0BF000000E0DE61CA3F0000000040A3683F00000040F6C6BB3F000000C09ED4AA3F000000008D18A03F00000080A718AABF000000C00A76BB3F000000C054F7C4BF00000080F46C953F00000040F45CB93F000000209FDAB0BF00000000DB349BBF00000080D88FAC3F000000A0D69DB3BF000000A07961B13F000000005DE98B3F000000E03091B23F000000C0136CB1BF00000000FA8CACBF000000006D86C0BF00000080BDF9A8BF00000000DC7FB23F000000C001B9CABF000000608E07D03F000000A0A342CE3F00000060203A913F000000A076B4C23F0000002063AFB33F00000040DC14A83F0000000013ED91BF000000806B12A9BF000000402A26C2BF000000805AED863F000000E05E94BB3F000000C0A3B1A03F000000C03E70B43F000000008CAC6F3F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (22, 3, 0x00000080DD79C1BF000000608A1DC23F00000020572BB23F000000009517BABF000000C0B5A0B2BF0000004014A1A3BF000000C0A3FB92BF000000A0E527C2BF00000080D860C13F00000040ED19BEBF0000000087C5D13F000000A0FA80ACBF00000080552CD0BF000000008786C6BF0000000016B5733F000000C082D1CA3F0000004007A2CCBF000000000E4CC2BF000000E06176A1BF000000C043F0AABF00000020C918B63F000000C067D97B3F00000040CAA4B03F000000006CBF77BF00000080F8F7B9BF000000801C1DD9BF0000004054E8BCBF000000006C62ABBF00000060D58FAEBF00000040F6E1B3BF00000080B7C3B0BF0000008070F5B63F000000009D55CCBF000000000335BCBF000000406E10A43F00000040A02BC23F000000803593A2BF00000080158F94BF000000602A22BF3F000000C0892D87BF000000009A11BCBF00000000BC3A8BBF00000000861BB43F0000006094F6D03F000000008D1FC93F00000040150DA63F000000A09496973F00000000C4FBBBBF00000060B58BB63F00000040B8A4C2BF000000803DE6A93F00000080E677B53F000000806B81A83F000000002C35B93F000000009C6BB13F000000001AD9C2BF0000000045D8AA3F000000006DE3B73F000000806340BABF00000000BE2C653F00000080F5FEB53F00000040A403C4BF000000007DF7A2BF000000A05696A8BF00000040C93FD03F000000C0BFC0A63F000000C0820FB4BF00000020C95EC8BF000000A03002BB3F000000C02C46A5BF000000E000C4AEBF000000C0227DB43F0000006069C4C8BF000000401336C0BF0000008070D7D3BF00000000DD93953F00000060A43BD63F000000A0E4F3B13F00000060D188C7BF000000605D7292BF000000C047C0A2BF00000000645867BF000000809B1FC23F000000C0EC94BD3F000000805E3F85BF000000E05933B03F000000C02688C5BF000000009C18B73F00000000832DC73F00000080E8D6AEBF00000000D03CB7BF0000008035E3CD3F00000020B3C59FBF000000E0FC0EBC3F00000020A1CEB03F0000000067EA883F00000080074BAFBF000000C0F2D8A83F000000A0035AC7BF000000C0EF05A8BF000000C05D84B33F000000400B77B2BF000000407AD2B1BF00000040DA79BE3F000000207307B6BF0000000045C3AB3F00000000D26D99BF000000403F8DB23F000000E00133B8BF000000C0A37EB8BF00000000A521BABF00000000D66494BF00000020BD33B73F00000000562DCEBF000000E06D24C83F0000002047CCCB3F000000C092C9773F00000020961BBC3F000000C0983AB23F000000805A23A33F0000008079B49FBF000000808085AEBF00000060938EC7BF00000060DC26903F000000E0D54BBD3F000000803C7AA63F00000040AE9ABF3F00000000C0D66D3F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (23, 3, 0x00000040DE8DC2BF000000E06BB6C43F000000A0B265A33F00000000D6B6BCBF0000008040BDB8BF00000060EE67A9BF000000402F219FBF00000080410AC1BF00000000D460C23F0000002005D8AFBF000000408E92D23F000000E077B2A3BF00000020A1FCCCBF00000080B9A7C8BF000000803B3C95BF000000205080CB3F000000402423CFBF000000A04241C5BF000000C03EA496BF00000000256BA6BF00000060B3AABA3F00000000217E89BF000000E03B6EAC3F000000007856883F000000C0A798BCBF000000204F78D9BF000000207A7EB7BF000000405882B2BF000000C0EC8095BF00000080EB39B7BF000000405114A5BF000000C0F3BDB63F000000803490CDBF000000006310C1BF000000C081B4A93F00000060457FC23F000000C0FCD9A0BF000000C01990A2BF000000C0BDA3C13F00000080D2CA9CBF000000803726BFBF000000000E4481BF000000804053B73F00000080F502D13F000000E0F57EC53F00000020B811A03F000000C0578CA93F000000002841BBBF0000004085F5AF3F00000020F342C3BF000000C0CC63A63F000000C05152BD3F000000A0AD35A63F000000E04135BC3F0000000016B2A03F000000407FEAC3BF00000000BD0BAD3F000000804856B53F000000E010B4C0BF000000A0000791BF00000060A582B63F000000802530BEBF000000E0A564B0BF000000402269B0BF000000C07359D03F0000002007DCAE3F000000C0FD06B8BF000000A08EDAC7BF000000E045C9B93F00000000CF71A0BF00000000B440B3BF00000080170DA63F000000C00DD7C8BF0000004092EAC1BF000000409695D3BF0000000050BDA63F000000E065C7D63F000000609524B23F000000C01323C9BF0000000072C6783F000000C0E2379FBF000000004E1A75BF00000020D8A0BB3F000000608554BD3F000000C0EA5792BF000000005F6DB43F000000601F5AC3BF000000C0F306BA3F000000007073C33F000000C04898AEBF000000E016E0B2BF000000004581CA3F00000000CC8589BF00000080F70CC03F000000C06AB5B13F00000080F847A83F000000C038A5ABBF000000C02AABB23F00000040C7F3C6BF00000000E62D7CBF000000C0B39EB53F000000A0FF31A6BF00000000A2ADAEBF000000609B67BD3F00000040A441ADBF000000C0EF30AF3F00000000689C623F000000C0EB55AB3F000000409A38BBBF00000000BFAEB2BF0000000038ABB6BF000000004903ABBF000000E095E5B43F000000801516CBBF00000080A637CE3F000000C0EBFECD3F000000A0B368923F000000806E58C03F00000000E2D5B93F000000804AF1A03F00000000100150BF0000008003B6A9BF00000000187FC6BF00000080EFA0833F00000040726CBB3F00000080BA11923F00000080ECD1B83F000000007CC46F3F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (24, 3, 0x000000E0E424B7BF0000004032EDC03F000000A0FED8B43F000000A060F0B4BF000000C0E4DDB3BF000000805A0D90BF00000000F1A184BF00000080863BC4BF000000802BC2C63F00000080544EBCBF000000802E77D33F000000E0287589BF000000604FCCCDBF00000000E6AEC6BF000000008CC9603F0000004056B2CA3F000000804095C9BF000000805B5BC3BF0000004024C792BF00000000EB149BBF000000400BFDBB3F000000009107803F0000006057D2B23F000000803DD091BF00000020F2CDBCBF00000080E47FD8BF000000800790C2BF00000040EEF2AEBF000000C0187D8A3F000000009651B3BF000000C0F7FDB5BF00000080F37EA23F000000008847CFBF000000A03538BEBF000000809B91A53F000000A0C73CC13F000000C0AA4FA8BF00000000990AA1BF000000C0F6A9C03F00000000BCC169BF00000060A2ECC0BF00000000E227AA3F0000000008FCA93F00000020EB21D03F00000000F7F9C43F00000080F8C1AB3F000000001EDAA63F000000A06136C1BF000000802E31AA3F00000040CDE5C1BF000000C07C28BE3F0000000000EEB93F000000802206B03F0000000010D5B63F000000C034D2A23F00000080B1A6C3BF000000004445823F00000040CB8DBC3F0000002072ABBCBF000000A08916A43F000000C0F8F2BA3F00000040CF6FB7BF00000000BF4BB1BF000000405506A2BF00000000C103CE3F00000080F7F7B13F00000020769FB9BF00000080F08FCABF000000C0DD8FB43F000000A0CF1FB1BF000000803569B1BF00000060912EA23F00000060F584CABF000000203799C0BF000000C08FA4D3BF0000000043C8AC3F000000C0B703D83F000000200223A43F000000004ECACDBF000000008C93773F000000C05FC1A6BF00000000124E903F000000003FBFBF3F000000C00420C13F000000000011873F000000401A81B43F0000002075D2C4BF000000C0896DB33F00000060FDE9C53F0000008027B4B8BF000000801EEBA8BF000000608546D13F00000000940D9ABF000000A005A0BC3F000000A01FB8A93F00000040CB33A13F000000003C8CAEBF000000A05CCEA13F000000A0C7A6C6BF0000000034DDB2BF000000C02D6AB63F00000080230E9DBF000000807EF5B2BF00000080FA8CC03F000000200A44BEBF000000805414B73F00000000B9F684BF000000001357A93F00000080EAE89EBF000000C093A5B4BF000000809235BBBF000000C06774B4BF000000A0FC8BBA3F000000A0302BCCBF00000000140DCC3F00000040B074CD3F00000080528E803F00000060E724BA3F000000C02F1EBA3F000000C03B02B03F00000000C780843F0000000010299BBF000000C01D79C9BF00000000DD0C983F00000040A583B83F00000000F789893F00000040296EB43F00000000C482643F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (25, 3, 0x0000004001E8C3BF000000E0F3E2C03F00000080C2C3903F000000C0342EB2BF000000807BE7B0BF000000E0BFC6B3BF000000A0974BA3BF0000004034D4C4BF000000202ADEC43F00000040A035B7BF00000040009BD23F000000C05A6391BF000000200396CCBF000000C0FA60C8BF00000000625481BF000000407387CD3F00000020D956D0BF00000040C997C3BF000000804462A7BF00000080AB25A3BF000000C056B8B53F0000002062199CBF0000008068BDAE3F000000805014A83F000000E00051B2BF000000409675DABF000000C0711CBBBF00000060FFF9BBBF000000803A54A1BF00000080F825ADBF000000807A019EBF000000E0ED08B03F000000406751CBBF000000C0D4B5BFBF0000000044F3913F00000000F7A9BC3F000000C0D26DA0BF000000000F66A3BF000000803B21C33F000000603A9CA1BF00000060FC38BFBF00000000A0D889BF00000080AA4EAE3F00000040A614D13F000000203660C13F0000000026B3893F000000405C40AC3F000000C01829BBBF000000E09164B03F00000060AC18C4BF0000008055B2773F000000C01076B93F000000E0809AB33F00000080DB8AB53F0000008059B59D3F000000C06900C2BF0000008089F2B53F00000040BAAAB23F00000060D720C6BF00000000D0D690BF00000000BD28B63F000000A09695C0BF000000C083DBB4BF000000A09D01A6BF00000080B39CD13F0000000022FAB73F000000204346B3BF000000400242C5BF00000080674CBB3F000000204699A8BF000000608AF4A6BF000000000295993F000000C086F4C8BF000000C0AC4EC7BF000000E0BFF7D2BF00000000398C9A3F00000080DDA4D73F00000000ACFBB03F000000405A7BC8BF00000000362E993F00000020A41FB0BF00000000B8D5683F00000080A342C03F00000020C33CB53F00000000B5B580BF000000C068BEA63F000000C0CD69C4BF000000809224B83F000000409072C23F000000C071EBB3BF00000020645EA7BF000000807A0DC93F0000000044D251BF000000C081E4B63F000000C0A002B13F00000000B6817F3F00000000CAA89EBF00000000A51EB43F00000000A729C5BF00000080EBE49B3F000000406BA0AF3F000000C09F18A4BF00000000AC91A4BF000000408A6AA03F00000020A055B1BF00000000B3D5A43F000000C09AEEA13F00000000C1529B3F00000000C2BAAFBF000000009850A9BF000000600629C1BF000000407B01B6BF000000C0701DBA3F000000003C2FCBBF000000607516D03F000000007A4FCD3F000000C00537973F00000000F492C33F000000C0E482A93F000000C0A1FDAF3F000000803CC3AABF000000400F17A9BF0000004051A7C7BF0000002029FE993F000000E07D57C03F00000000062E953F000000C02FF9B33F000000005E3282BF, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (26, 3, 0x000000A043F2C4BF000000C04B35BE3F000000408FC3933F000000A08099B2BF000000E0183DB9BF000000405084B6BF00000000EAF877BF000000E0F17CC4BF00000000FEC9C03F000000C0476EB1BF00000040826AD33F000000A00B1CAFBF000000A0E928CCBF000000C0CC81C9BF0000000054CE80BF000000603CE9CC3F000000A08B16D0BF0000004050AFBFBF00000000D1B574BF0000000073E2A3BF000000C02856B53F000000C0688185BF00000080E44DB13F000000C09428AC3F000000E0DC44B1BF000000E00E82DBBF00000000B081B9BF000000A08403C3BF000000002AD892BF00000040FA71B1BF00000040B21AA6BF000000401088BA3F000000408280C7BF000000E00052BBBF0000008071C3963F000000807E25B33F000000C0B1949EBF000000C03669A3BF000000007F21C43F00000080F0C292BF000000402C7FC0BF00000080F588A4BF000000400260B03F00000000F921D13F00000000717BBE3F000000002CD0663F000000007DF9B43F000000805895B7BF00000000E8B8A63F000000A09B54BEBF0000000034FDA03F000000C0C636B53F000000E0DDB4B83F0000004072EAA13F0000000004509E3F000000C0F255C1BF00000000F6CC913F000000E0F1CDA33F000000204537C6BF00000000DB5C89BF000000C05F88BD3F000000405A73B4BF000000803B88BABF000000C09A91B3BF00000080E72AD23F00000000D62BBA3F00000000AC26B9BF000000609F22C3BF00000080FED9BE3F000000C0C96CA9BF00000080A72DB1BF00000080B5FE883F00000060F74ACABF000000A0F0D3C4BF000000E0CE7CD1BF000000004B399E3F000000C086C4D63F000000C0B767AC3F000000C00C3AC6BF00000000F4FA59BF00000020DBB2B4BF0000000081158FBF000000C07A4FBA3F000000E0D840BA3F00000000494593BF00000060DA5FB03F000000408F34BEBF000000403ACFB73F000000802F1CBC3F00000080927EB5BF000000E081C6AEBF00000020C3C4C73F00000080345596BF00000080A08FB53F000000C0E9EFA23F00000080404092BF00000080115A9FBF000000008C9BB33F000000005E27C1BF0000000083BE8D3F00000000B3FCAA3F00000060EE63ABBF000000801BE1A0BF000000A0B7D2B03F00000060A2E2B6BF00000040E795A63F0000000086C79C3F00000040F9DA983F000000C08188AEBF000000807120A6BF000000209E29C1BF00000000ACC4B1BF0000008042B3B53F00000080CD55CABF000000E04BC3CC3F000000C00BF5C83F000000000C23A63F00000060AF19C23F00000040BB4AAA3F00000000BAA8A33F00000000B21D99BF0000004021DFAEBF000000E0651CC9BF000000E01D3E9D3F000000A096D3C33F00000000AEDF7C3F000000403958B33F000000006F8585BF, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (27, 3, 0x000000E0C4D9C0BF000000804CEDBA3F00000040A6B9A53F00000020CD52BABF00000040459FB1BF000000409F5DB8BF00000000C9CAAEBF000000C03332C2BF000000C06696C03F000000E00CD7B9BF00000080264AD23F0000008043249FBF0000000088F4C9BF000000003C48C9BF0000008084909E3F000000002A73CA3F000000E01DEBD0BF0000004030DAC2BF000000C0706A8ABF00000000C38DADBF00000040FCFAB23F00000080D7A293BF00000080757EB03F00000000B710A03F00000080E361B8BF000000404878DABF00000080E128BFBF0000004011C4B5BF0000008011C186BF000000805DC1A3BF0000000025DD9FBF000000E0B956B33F000000406642CBBF000000A05677B8BF000000008C90923F000000A03C45BD3F00000000B0538DBF000000007CA98CBF000000805B0EC23F00000060C54E9BBF000000C0B854C1BF00000000288481BF000000406218A53F000000C01F0AD03F000000804C33C63F000000000020A93F00000040AD39A13F000000406BB2B3BF00000000D0B2B33F00000020D51FC5BF000000C087B9AB3F000000A0C3A2BA3F000000E0BB99B43F00000000CBDFB23F0000008035D1A43F000000C010CDC0BF00000000A38CA93F000000C05DC1BB3F000000C0225EC6BF000000A040EA86BF000000007332AE3F000000C0CC7CC1BF000000C0F380A5BF00000000BFFBB3BF0000008021ACD03F000000C05D0EB73F00000040F1FABABF000000A00D07C3BF000000A033AAB63F00000080155DA9BF00000020F478B2BF000000009BD0983F0000008005B9C7BF00000080A0B4C5BF000000C04403D6BF00000000E0DBA53F000000006A9AD33F0000006023B9B73F00000040C5CDC8BF0000008002F2813F00000000460587BF00000000344166BF000000002FA6BF3F0000002091D1BA3F000000C0752F9CBF000000C0713AAA3F000000A004B5C1BF000000C082FDB63F00000000E986BD3F000000009444B2BF00000000AC32AFBF00000020E816CC3F000000804396A9BF000000409057C33F00000080DCE49C3F000000C07600A43F00000000661EA6BF000000203E04B43F00000040E5ACC3BF0000008002A59B3F000000C00E87B73F000000C0C15A88BF000000000657A0BF0000000061EFB33F000000C0EB19B1BF000000C07520B23F00000000AC7368BF000000406BADA53F000000000047B6BF00000080AA50AFBF000000C0097BB8BF00000000B31AADBF000000A01638B53F000000404B7CCCBF0000008003D4CE3F00000000F16CCF3F000000804610743F000000E01A7DC43F000000E024D2B13F00000000F17B903F00000040EB4FA6BF00000060532AB4BF0000004068AFC9BF000000E0483F9B3F000000002B50C13F000000006FDB803F00000000566DBA3F00000000514C933F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (28, 3, 0x00000000D520C5BF0000002080DFBE3F000000009ACB4FBF000000807D97B4BF000000005447ACBF00000080FC7BA5BF00000000A622663F000000407CF2BEBF000000602D3DC53F00000040F806AABF000000A03D25D13F000000807DEA91BF000000001AC7C8BF00000080D395CCBF000000005F06943F00000040D623CB3F000000803D42CFBF00000040F741C5BF00000000752CA3BF000000A04317B5BF000000802DBFB53F000000802BED693F000000C06D97A43F000000006609A23F000000E092A8C5BF000000809AEDD9BF000000005374B3BF000000600043C0BF00000000B5FF8FBF000000009218B2BF000000005BDFAABF000000C02C01B83F000000605D05CBBF00000080E9E9C0BF000000E0DD7FB03F00000060B95DC53F00000000540E783F0000008001E789BF000000C04E4BBE3F000000006AF393BF000000005A6EC2BF000000001FF59DBF000000808F77BD3F000000403046D23F000000805179C63F00000080AC228C3F0000008095378E3F0000000070759BBF000000C05B32B03F00000080972ECBBF00000040369CB03F000000604D59AC3F00000040298EB63F0000006082FCB43F00000040B63BB13F0000002084A6C4BF00000000B6539B3F000000400743BA3F000000E076B2C8BF000000001D9E82BF000000007A0EA03F000000A005B0C2BF00000060D36CB5BF000000C0C6FA95BF00000060B3FACE3F000000808375C03F0000006083B7B9BF000000601AD6C2BF000000407A35B73F000000C04D7FAEBF000000807BF9A8BF00000040A795943F000000C0DE70C4BF000000802DDBC4BF000000A0E600D7BF00000000E427AE3F000000C04CB8D83F00000080E042B93F00000080DC9DC9BF000000801164943F00000080A2B190BF000000006D42933F000000408A4CC03F000000208F25B73F000000C06E84A1BF000000C03391B23F000000A0C17DC2BF000000403782BA3F000000608DC1BC3F00000000F20E9FBF000000607082B5BF000000A02819C83F000000A068AEABBF000000809070BC3F000000209EC6AD3F00000000D838AE3F00000080A329AEBF000000C07838A73F00000020F6A6C4BF0000008081A498BF000000004D2FBC3F00000060E36599BF000000005D9E91BF000000C0F0CABC3F000000C05B45BABF00000000FDECA53F0000000007C1913F00000000AF2B923F00000040FA5BB0BF00000080A0A4A6BF000000A07CD1B2BF0000008093EBA5BF000000E0546EB23F000000A0982CCEBF000000600E2ECC3F000000C0CDDDCE3F00000000C731A1BF000000A0A7EEC63F000000008B88B23F00000080710793BF00000000C0CD6B3F000000401291ABBF000000201BBDC6BF0000002005BD893F000000009E6DBC3F00000000A0795DBF000000C07B8EB83F000000006E197F3F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (29, 3, 0x000000403B92C6BF000000E09E0FC53F00000000B71D733F00000040E255B0BF00000000F268BBBF000000005255B0BF000000404331903F00000000B0E5C0BF000000801702C83F000000606622B4BF000000800E24D23F000000A00FD6A7BF000000800589CEBF00000020CD8DC4BF0000000012CC943F000000C024B6CA3F000000003CC4CEBF0000004072F4C0BF000000801BD3A0BF000000A06430B0BF00000040DBC9BC3F00000000614266BF000000009096B03F000000C059A9A63F000000C06F4BB3BF000000A093C9DBBF00000080FBB8BABF000000801FF8B8BF000000C02A9584BF000000C010EEBABF000000A042DFA5BF00000020109FB83F000000C000BBC7BF000000803E12C2BF0000000044CD7F3F000000C0C5B9BD3F0000000056369FBF0000004002B9B0BF00000000C850C23F00000080000597BF000000001F7FC0BF00000080F1ADA0BF000000402F2DB03F00000020D5B2D23F0000006056E2C13F000000E06F14913F00000080C1F19E3F000000C00F55B4BF00000040CBA3B13F000000E06408C4BF000000A08046883F000000C07243BC3F000000E07D28A93F00000000A867B23F00000000AF59A93F00000060A858C1BF00000080D2F0B23F00000040778AA53F000000E02ACBC6BF000000C0F85CB0BF000000A00A82BE3F000000408B15B9BF00000060EE2DABBF00000080AB40A9BF000000806886D13F00000040BF85BA3F0000006042BAB0BF000000809C2BC2BF000000A0D7F7B23F00000080C87BADBF000000401713AFBF00000000A8C1763F00000080F54ACABF0000008005E1C5BF000000A0BF2DD2BF000000807206AC3F000000E082F5D73F00000000464BB43F000000400251C4BF000000E0DFC9933F000000A0337CAEBF000000007A797A3F000000405EBEC33F00000020EDEFB53F000000409509A4BF00000080BDC0A73F000000C02221C6BF00000040D2ABB83F00000060C247C03F000000A0795DB0BF00000020209FB4BF00000040D95DC93F0000000084C56C3F000000606221B73F000000401EF1B53F000000807EC5973F0000000016D1ABBF00000000D59BB23F00000040D12FC5BF0000008042F1953F00000080189DB53F000000A0CA35B2BF00000080AC8BAFBF000000605C49B33F000000C02132B8BF000000004526A63F0000000096E89C3F00000040C4A3A13F00000080567FB4BF00000040DA4FB1BF000000E0B049C2BF000000809671ACBF000000C04549B33F00000020DE4ECCBF000000804A43CB3F00000040E73FCB3F000000A0B29F8EBF000000009EA5C53F0000004018EEAF3F000000007ACAAA3F000000405B1AA2BF000000C037B3A6BF000000600558C5BF00000040DA9C8C3F000000E0F3A6C23F000000007ECCA73F00000000E993B13F00000000BE2782BF, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (30, 3, 0x00000080D031C5BF000000007610C33F00000040EDC4AA3F00000000B854C0BF000000E066BDB6BF00000080A839A6BF00000080B6D281BF000000E0A4D1BEBF0000002037CAC53F000000803507BBBF000000A0C5BDD13F00000040948E98BF00000000F3D7C8BF000000A07A0CC6BF000000C0634BA53F000000208823C93F000000E0D164D0BF000000200A3BC2BF00000080D223A0BF000000C01625A9BF000000E0FB9EB93F00000020B7FF9D3F000000000779B03F00000000B8CA743F000000804AACB8BF000000604BCBDABF000000E0FE47B8BF000000005E35B5BF00000080149E84BF000000007388A1BF000000004C019EBF00000080F9D9A13F00000040D5F8CBBF000000A0D2D1BCBF00000080CB869C3F00000080A647BF3F000000C0677AA4BF000000E0198BB3BF000000605030C33F00000000478B7D3F00000080F1E6C6BF00000000105797BF000000206F65B43F000000604D64CC3F000000404CFAC23F000000804C11853F000000C01467993F0000004026B1BBBF000000E0E5ACC03F000000C034FFC3BF00000000AB546F3F000000C09219BE3F000000406273AC3F00000080F91BB23F00000000BE3D953F000000E0326EC3BF00000000BCA3AD3F000000E0DD29B53F000000003F15C5BF000000001FDCA1BF0000002001A2B33F00000080407ABABF000000C0908AA2BF00000040A708AEBF00000040628BCE3F000000C06892B83F00000040640FBABF000000603D49C8BF0000006098D3B23F000000600558A1BF000000C0E0E0B0BF0000000027B8AE3F0000002003A0C8BF000000C09E15C5BF00000040C869D2BF000000007282953F00000020AD9CD53F0000006062DEA23F000000C0C099C2BF000000408FB796BF00000000A7ABB8BF00000000B3EB8ABF00000000A7EBB53F00000040BEB8BE3F00000040AB49A5BF00000060DD26B43F000000E063F7C1BF000000C0C1CFB03F000000A00D53C83F000000E000D8B1BF000000C093C1AEBF00000040118ACF3F000000E0CE5D99BF00000080E090C33F000000E0137C9D3F000000407C6FA63F000000604122B7BF00000020E8A0B23F000000E08473C4BF0000000001DB85BF000000C0E89DB43F0000006071D7B3BF000000808C42A6BF000000008E20BB3F000000205362C3BF000000405D36B33F00000000862F7C3F00000000E9B5A83F000000C0381EB1BF000000400E61B6BF000000A0B2ADBABF000000808F82A2BF000000C068D9B73F0000008079ECC6BF000000809CB7CC3F00000020CBC0CE3F000000601984A23F00000080DF37C43F000000C09AE2C13F00000000E8E66FBF00000000177DA2BF000000406EE8AFBF0000006010A6C9BF00000040E63E9A3F00000000EFEFBB3F0000000067E4953F000000008A81B43F00000000F80457BF, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (31, 4, 0x00000040B926B7BF000000405FD1A33F000000004A2A45BF0000004099B5B0BF0000000013DE88BF00000060E8A6B6BF000000404DB8A2BF000000A081CBBCBF000000C0BFB9C23F00000040F8B9BABF00000040A80ED13F00000000E25CB6BF000000E08B32C8BF000000E0C673CABF00000000F72C813F000000400055C83F0000004033ECC3BF00000000C8ACB5BF000000209248AABF000000C03FC9A9BF00000080BB0EA43F00000020F8CDA7BF000000404D45AC3F000000007C09BB3F00000000B1D7BABF000000600EC0D6BF000000809A84BBBF00000080C660BABF000000009C5B8E3F000000003C51A3BF000000C0D4C0ADBF000000802625C03F00000000E144C2BF00000000BA48B3BF000000006335993F00000020D64BBF3F000000C02F7AA23F00000040251495BF00000000EC1AC93F000000C03F049CBF00000000C469C5BF000000002EAFA1BF000000006899883F00000060F01BD13F000000805F2FCB3F000000A083D9A53F00000000FB258A3F000000407AF5B5BF00000000EB5FBF3F00000020A9FAC0BF0000002046099B3F000000E03B1ABD3F00000020E0EDB43F000000C0FCA3A73F0000000097B882BF00000020A2FAB3BF000000007842B53F000000C09005BB3F000000C09B4BC7BF000000A04F30A8BF00000040F925A73F0000002074DBC3BF0000008029EEA8BF000000E0724BA4BF0000002073A2D23F00000080BAAFB33F000000C095E2BEBF00000060F487C4BF00000020908DC33F000000C0C5CDC1BF00000040190CA8BF00000020403BA03F000000000B9CC7BF000000609AD6C1BF0000000034BDD5BF0000000022F5AB3F000000003B7BD53F000000A018CCBD3F00000000DB0BCBBF000000800354B33F000000006E3CB1BF000000008AF181BF000000404938C43F00000040706CC23F00000060D15C96BF0000000019A390BF000000C03DEAB9BF0000000050A18CBF000000809724C63F000000200652B0BF000000004056A3BF00000040B042C93F000000C09AB193BF000000A00F2EB93F00000040E32F9F3F00000000BC4D9DBF0000008021F6A9BF00000080D7DAB33F000000200229BBBF000000800C3DA03F000000C0D72DBB3F00000080740B9EBF0000008066E4A03F00000000B267B73F000000C039C8C3BF00000040BFB3BD3F00000000CCBC6E3F00000040B9D2A73F000000C0D63EB23F0000000080E66ABF000000C0F168BDBF00000000DA43BEBF00000080AFA6C03F00000000D2E5CCBF000000A04F70C83F000000602B80C63F000000E05F3EBA3F00000000A53CC03F000000006349BC3F000000C09593BF3F00000000F8EA80BF00000000F8107FBF000000602345C8BF00000040A976A03F00000040DD8AC23F0000008048F5A1BF00000080F870B93F000000001ED4793F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (32, 4, 0x000000003CEBADBF000000C0CFC6B63F0000004027CB613F00000000162FA3BF00000000741F75BF00000000D18B85BF00000060C83BAFBF000000809A7DBBBF000000002C29BE3F00000080E145BCBF0000000075F9CB3F00000020F224A8BF0000004048CECABF00000020B3F5C1BF000000000A0395BF000000C03402C53F000000A02E28CABF000000800D6CB4BF000000200A2EA1BF000000805C59A9BF000000C041E7AB3F000000007CD8A93F000000A0E02FA33F000000C00232A53F000000E08762BCBF000000806FB2D7BF000000A0938EB4BF000000C0D9ECB4BF0000002002EE7B3F0000000070328CBF000000E0A9C9B1BF000000C04D22C03F00000080AD1AC7BF00000080FE85A3BF0000000073B7AB3F0000002097CBC13F00000000608354BF00000000FEDE8FBF000000802F2CC83F000000800C679C3F000000A079ACBDBF00000000326A873F000000004C0B9E3F000000A08BA8D23F00000000CC12CC3F00000040AECDA03F00000080C2D5853F000000C02228B5BF000000400748BE3F000000C06352C2BF000000004E31943F000000C05D07C43F00000020CA72B93F000000E01A8BB93F00000000AD238FBF00000060F1E2B5BF000000003E46AC3F0000008088FBB23F00000000C206BDBF000000C09C4B91BF00000000EDCFA83F0000006092A3C4BF000000A0933C9BBF0000008085E79DBF000000005605D23F000000002C3BA03F000000A0BAD5BDBF000000408E75C7BF00000040159EBC3F00000000D9E5C1BF000000600500BCBF000000002A1A843F000000C0F2E0C5BF000000E0F6ABBCBF000000203244D4BF000000000217AA3F000000A04B0FD43F000000201623BE3F000000400ABCCABF000000402318BA3F000000C0F7CCACBF00000080C305A0BF000000E01600C43F000000408C96C83F00000000874E74BF00000000433F813F00000000BA66B3BF00000000DA0A943F000000807CEFCB3F0000004087E0AEBF00000020CF4AB2BF000000E038D7CB3F000000809DFEA0BF00000060B712BD3F00000040D06EA43F000000C04A37A7BF0000008096B0ABBF000000209D3DA83F000000002DEBB9BF0000000086B481BF000000008803B83F00000000EEF2A3BF000000008469813F00000040D2C3C23F00000000B80BC4BF000000003F9DC13F000000804197A2BF00000000BF11B13F00000000295DBC3F00000000D37393BF000000A04CADBDBF00000040B198B6BF000000404EE3C03F000000C0611ACFBF0000000097B6CA3F000000C08030C53F0000006064AAAA3F0000006048C6BD3F00000020DFF2BE3F000000400FE9BE3F0000000070904BBF00000000C2ED9A3F000000E067EDCDBF000000E07AEE9CBF00000080A7F4BF3F00000000062A783F00000000961FB43F00000080ABDB86BF, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (33, 4, 0x00000040DDA0ABBF000000009F7AB43F000000C0501D713F00000080E82A7BBF0000000020A2573F0000000045249ABF000000A00473A8BF000000A0B026BBBF000000E0E5E0C23F0000008028EFB7BF000000A0A15FCE3F000000C02961ADBF0000008084B2CCBF00000080D3BDC0BF00000080A1EC9BBF00000040A7E9C43F00000000F2FCC6BF00000080C764B4BF000000E074E394BF00000040655CACBF000000402D2AB23F00000020E912873F000000802F0AAA3F000000000230A83F00000040A0A3C0BF000000808C55D6BF000000A05121B3BF000000C0EE2EB2BF00000000E349743F00000000E4329BBF000000805E99B2BF00000080A344C03F000000A00B4CC4BF000000C0BB25AFBF00000080786DAF3F000000C01C16C33F000000005BB59FBF00000080FE7199BF00000000D1ADCD3F00000080AA3188BF00000000A266BFBF00000000ECD17FBF000000C0E689A23F00000060E748D33F0000006062B8C73F000000C09D4AA53F0000008005B9603F000000004F55B7BF000000C023B2B63F000000A0079FC1BF000000407D8B8D3F000000000C75C53F00000020D17FBA3F000000C016BEBA3F00000080CAA7A2BF00000040EC89BABF000000007DF4AF3F000000C0597BBA3F000000E0C6EEBCBF000000808B11A0BF0000004050BEA53F000000E00A24C7BF00000080B3178ABF00000000D3ED9BBF000000C0F83CD43F000000400C3DA23F00000080DB2EC0BF000000409752C3BF00000000C9E5B83F000000E035B1BFBF000000A07F47BABF000000001CE67D3F00000040E824C7BF000000407E91C0BF000000C026A6D5BF00000000E2CBA13F0000008012DDD43F000000E087EFB63F000000C09124CABF000000005BD8B73F00000020104BA8BF00000000647493BF000000208B7DC33F00000040B143C93F000000A00BF3A2BF000000008AF5823F000000E071BBB5BF000000000896853F000000A09605CB3F000000A026CDB0BF000000C03407B5BF0000008068DFC63F0000008040398DBF00000000F5EFBE3F000000803FFAA23F00000000EA58ABBF000000804953AABF00000020CFFDA53F00000080923ABEBF00000000B22B7BBF0000002010BEB63F0000000028E09FBF000000000B70973F000000E02DEBC33F000000E0426DC6BF000000E0489ABD3F00000000749B74BF00000020BDCEA63F00000060FFCDBD3F00000000748878BF0000004063F1BEBF000000E0D9D3BBBF000000C02E48C13F000000601875D0BF000000208392C93F00000040A902C73F000000407B58B63F000000805B2DC03F000000C0D028C03F00000040D353BC3F0000000058CE64BF000000004837A83F00000040909CCDBF00000000610B853F00000000B36AC03F0000000044C96C3F0000004020D6BB3F00000000327773BF, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (34, 4, 0x000000408404A0BF000000E088A9B23F000000803B00A93F00000080F2A59EBF000000008F339CBF00000000BAD488BF000000A08BDFA9BF00000040D406C0BF000000C0A6CFC23F000000007F34C0BF0000002075C5CD3F000000204250A0BF000000C00C00C9BF00000080FB6CBFBF000000008A378ABF000000A0EDEDC63F000000806891C7BF000000605020B8BF000000608BDE95BF000000001572A3BF0000004060BFA73F000000804074A63F00000060FCA6A83F000000006617973F0000002047EBBCBF000000C0B628D8BF000000800D8DB6BF00000040947DB8BF000000A077E8703F00000000D55795BF000000400433B2BF00000060A3EEBC3F000000A08E18BCBF00000000ED0186BF000000803B7CB23F0000004034CABD3F00000000E2808DBF0000008074C998BF00000040E1C6CD3F0000008073F68A3F000000409175C6BF00000000D64E90BF00000040B00DA13F00000000C8B2D13F000000207628C63F000000207B4F9D3F000000403C3EA13F00000000EBF6B5BF000000408E1FC23F000000003B00C1BF0000002059B5A53F000000001411C33F000000804542BB3F000000C06B63B33F00000080D049963F000000C06573B8BF000000005A47A53F00000080224ABD3F000000E0BF69BCBF000000004288703F00000080F4E3B03F000000C04B17C3BF00000080442D8EBF000000006D278CBF000000600B55D23F000000209CCCA23F000000C05D60C2BF000000C0E137C3BF00000000CDA2B43F000000C0AD0CC0BF00000040F34EBCBF00000000C2FD793F00000000E31FC8BF000000E01A8DC0BF000000607BD0D3BF000000007E9A913F000000C0044BD73F000000609542B53F000000C0ADEBCBBF000000A08E06B03F000000E0076FA3BF000000204F47A0BF000000004FF4C53F00000000B571CC3F000000A0F9ED9CBF000000800174983F00000000B38DB3BF00000000B60891BF000000E03C46CB3F00000080F485B1BF0000002019C7A8BF000000C00B7DCC3F0000006092A4A3BF000000E0E90BC13F000000007032433F000000C0650BA3BF00000040A8ACABBF000000201803A83F000000A0FAB2B3BF00000000D05892BF000000E01E56B53F000000C0958F9EBF00000000AB6E903F000000802B6FC23F000000804976C9BF00000080EA96C03F00000000FE5E9BBF000000005E73B43F000000C0F293BF3F000000001C9E7F3F000000C0D4B4B9BF000000609154BDBF000000E0E04CC13F000000C045B9CEBF000000008D8BC43F000000802234C73F000000C0F3ABA73F00000000FB5FBC3F00000000D3B5BC3F000000604855B93F0000000096F97E3F0000000090888E3F00000080A0FCCDBF000000A0DDA5773F0000002001DFBD3F00000000164284BF00000080E43FB03F000000009D118BBF, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (35, 4, 0x00000040F0BCAABF000000207C4CB03F00000000F929AF3F0000002042E69DBF000000009BEF92BF0000000034FC84BF00000060C693B5BF000000804B71BFBF000000001F14C13F00000040697DC1BF0000000037B8CC3F00000040C77193BF000000006F05C8BF00000020E7C7BFBF0000000077C7A0BF000000E04F47C73F000000C0B033C7BF000000A0C4A4BDBF0000002095E09CBF0000000042C699BF00000000DFB7A53F00000080E25AAC3F000000C0AEFCA13F0000000006AE943F000000E0A4FEBDBF000000006B37D8BF000000C0E301BBBF000000A0DB03B3BF0000008040598CBF00000000F0D57FBF00000000FDF4B9BF000000801131BB3F0000000079F9B8BF00000000924675BF000000A05B81B63F00000080488EC03F00000000AEFB90BF0000000094288FBF000000801B96C93F000000E0BF71913F0000004054DFC6BF00000000667F813F000000C0EE49AC3F000000C0AE71D23F000000C0EC24C93F00000000BFEBA93F000000604EDAA13F000000C084A9BBBF000000A0A6EDC03F000000E0BAF2C0BF000000A0EC8FA53F000000C03665C53F000000E0C871BA3F000000C03B2EB73F000000806DAA9C3F00000040591EBCBF00000000EEDDA33F000000800CF8BC3F000000C0ECAFBBBF000000C0CDDD813F00000000BAB3AB3F000000801FB8C3BF000000601BE584BF00000000605895BF000000C01530D23F000000402FDCAD3F00000000C9E0C3BF000000E08EA3C6BF00000020ED00BB3F0000000030C6C0BF000000C074E3BDBF00000000A02561BF000000803E8CC9BF000000001F5DC1BF0000000080CCD4BF0000000030A2903F000000A085C9D63F00000000A76CB53F00000040767ACABF0000002008FFB53F000000C095A399BF00000000DACE92BF000000609659C33F000000E02B6FCC3F000000803C27ABBF000000005404983F000000C0BF08B3BF000000002D0F95BF0000002049DCCB3F000000807BD6A9BF000000404F1AA9BF000000C03B88C83F00000040BF92A0BF0000000097AEBD3F00000040BD5EA13F000000008EE184BF00000040DBA9AEBF000000008AD8A33F000000C0A0F5BBBF00000000AFB288BF00000080D339AE3F0000002097F9A4BF00000000DED6953F000000400C34C23F000000A0DF8DC5BF00000000EBD1C03F00000080811D9BBF000000400D9EB13F0000006026FFB83F00000000809D8A3F000000C068E3BBBF00000020BF06BBBF000000A08C13C03F00000000CE85CFBF00000020D1C9C63F000000C03D12C73F000000A02744B53F00000060559BBF3F00000000D0ABC03F00000040DAA8BC3F000000003E5680BF000000000E719A3F000000E06358CBBF000000A0792D78BF000000C09915BB3F000000007AFD7FBF0000000057C5B43F00000000E8216E3F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (36, 4, 0x000000A0BC53B2BF000000406433B53F000000008104B93F0000000048C26EBF00000080DEEC9BBF000000003F528ABF000000407B6DA9BF00000040413DA7BF000000E0939BC13F000000804271C0BF000000807867CE3F000000204E9EA9BF00000020FBB7CCBF00000020AC7EB4BF0000000001BA8E3F000000E09D0AC53F00000040521CC8BF000000E00E79BABF000000A07013A6BF00000000857497BF000000802458BA3F000000E04DFEA13F0000008047FC923F00000080B82196BF00000000C19DB8BF000000A0F4B0D9BF000000A041E7BBBF00000020731BB6BF000000C03B22A73F00000000D6CAA8BF000000A0A8E4B6BF00000000B88A993F000000604B40C0BF000000808EEB92BF0000000098C1903F00000060D49DAC3F00000080DAA8A4BF00000060B987B4BF000000207E72CC3F000000C0BFC5A63F000000C04EC7C9BF00000000D0EB5CBF0000000070794EBF00000000A867D03F000000800DA7C03F00000040A998A33F000000402BE4A03F000000C0569AB6BF000000608860B53F00000060EB1DC4BF0000004006AFB43F00000040B615C73F000000808057B93F000000E042CDBA3F00000000DC6F963F00000080E854BDBF000000007C8D8E3F000000C01D19B23F0000004042D3C0BF00000040E689923F000000A059E0B33F000000C0ABDAC1BF000000C0E06FA7BF00000080B39FB0BF0000000046CBCE3F000000A00F12B13F00000000EC0EC0BF000000806F2BC5BF00000080E270B53F000000A081DBBABF000000002DC7B4BF000000C09A88953F00000040F58AC6BF0000000027A8C2BF000000A0CBD0D2BF00000080763EB03F000000A0F244D73F000000401B30B03F000000801AEAC7BF00000000F438B13F000000E04D97AFBF00000060D9B2A5BF000000406E56C23F00000060E013CC3F000000002E179CBF000000C0F0B0AF3F000000C089F0A8BF00000000CFC9933F0000000084D6C53F000000E0DF93B8BF000000008744ACBF000000800648C83F00000000823996BF000000A00F3BBA3F000000602812A13F00000000F05D98BF000000009F7393BF00000000E0343EBF000000E05DD4B1BF0000000078E1603F000000605425B43F000000804321B6BF000000008F8EA5BF0000008071C9B23F0000004087B9C5BF00000000DB7FB93F00000080A72D9F3F00000040F459943F000000000BB4B63F0000000098107DBF00000040FBF1C0BF000000E03AD5BBBF0000004090A4BF3F00000000F8D4D0BF000000A04A08C73F000000C08990CA3F000000C0DBCAAE3F0000008038EDC13F00000020C0E5BD3F000000404E5EBE3F00000000ACDE74BF00000000C8E07A3F000000E0C51DCBBF00000080BCF776BF000000205B68BB3F000000C0E359B23F00000000645E9F3F00000000103953BF, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (37, 4, 0x000000008C60B1BF0000000047B4B23F0000008011B4AB3F000000E06425A6BF00000000C0E2533F00000040E7F4A6BF000000E0C5F9A5BF000000E0B7ABB8BF000000C046F0B83F00000060AC6ABDBF00000060BE49CF3F000000A0FED5A7BF00000000DBC0C9BF000000806096C4BF00000000EDB8893F00000040173DC93F000000C03386C8BF000000C09619B3BF00000020D0D5A5BF00000000E39DA4BF00000040BCED943F000000C0FD5892BF000000804628A93F000000C093E5A53F00000080227EA2BF00000000BA41D9BF000000204CF9BEBF00000020A35FB2BF00000080804C503F00000000665B95BF000000004419A8BF000000400500B63F00000040286CBABF0000008021EFA4BF000000C0F924A43F000000607C3FBB3F00000000CB969BBF000000006253B3BF000000E0EA00CC3F00000080E1B699BF000000C0823CC1BF00000000608470BF00000040AB70A93F00000000E5BDD13F00000080DB3ACC3F000000603CC3B03F000000E029B7983F000000008F94ABBF000000609B0BC03F0000006026D4BEBF000000204E89943F000000C0F8B2C03F000000802D08BC3F000000C0619DB33F00000000FAC69E3F00000020D010B5BF00000080B727B33F000000E0E302B23F000000E07AACBDBF000000A09F77A4BF0000000062F4993F00000040FFAEC5BF0000008026B77B3F00000000FD52A8BF000000A04008D33F00000080E0CFAA3F000000809115C0BF00000080FF7DC2BF000000005895C03F000000408BC1C0BF00000000EF8EB5BF000000C0735694BF000000E02D4CCABF000000002A26BFBF000000A0277BD3BF0000008099CCA93F000000A0C0C6D33F000000C04182BE3F00000080B1F7C9BF000000208A86AD3F000000E00EA793BF00000000D6C498BF000000C099B3C43F00000040C657CC3F0000000020D598BF000000007678A3BF00000080041DB6BF0000008011C8A7BF00000040449FC83F00000040EE33B1BF0000008060AAB5BF000000802B35C63F000000A063FEA3BF000000804E2AB73F00000060C5129F3F00000080DC8DB0BF00000000A4ECA4BF000000C055FDB03F000000806BE6BABF000000007D818C3F00000040F992B63F000000803AF9B0BF00000000C0426C3F00000080DA44BE3F000000001D58C2BF000000E05D9CB63F000000806FE099BF000000E0B85EB23F00000020269BB73F0000000073A8923F000000C09310C2BF0000000039D6BABF00000080007DC03F000000A0949ACBBF000000E0A8DAC93F00000000CB33CA3F0000002030B1A33F00000060DC95BC3F000000C0481FC03F00000040F528C43F000000002B9F80BF0000000069BF953F00000060FF96C8BF00000000A89F91BF000000A0E0FABD3F000000806A749C3F00000000D941BB3F0000000000F14F3F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (38, 4, 0x00000000CC0FB5BF000000A07A49B53F000000E082AEA23F000000A06B10ADBF00000000088A5B3F0000000093DC85BF000000E061EEA9BF000000C05B6CBABF00000040DED7C03F000000A0F310C1BF000000C00FC8CF3F000000005486B3BF000000A0EB7BCCBF000000A0C006C5BF000000C00842A3BF000000807478C63F00000080A581CABF000000A0F60DB4BF000000C049CD9ABF0000004061F9A0BF00000080D977B33F000000C0B9D8A03F000000C0F3E9A33F000000C0A1E2A83F0000000002E8BABF00000000FD60D8BF000000E0EE7BB3BF000000804F9BB5BF000000C02C3E99BF000000007B8092BF000000009EEAAABF000000407B7BB83F000000404E39C7BF00000080810199BF00000000D850973F00000040F77AC03F000000009CC192BF00000000106C6DBF000000801542C63F00000060D85488BF000000208275C1BF0000000040BB433F000000603D12A33F00000040F3CFD03F00000000908AC83F000000409D5CA73F000000C0FF516CBF000000809697B3BF000000E050B7B63F000000E0E87BC3BF00000000B00CA73F000000807F90C33F000000805281B73F00000040A141B43F000000009E0671BF00000040ACF6B3BF000000003814A83F00000080138EB73F000000203BA0B8BF00000000B04D6F3F00000040798AB33F00000060A577C3BF000000C0F0FD9FBF00000000B49489BF00000040EFE9D03F000000405FA6A13F000000203828C0BF000000207D62C7BF000000A0712DBE3F000000409C21C2BF000000004A5DB6BF000000401847A63F000000006124C5BF00000000178BC0BF000000004E4DD3BF000000802428A63F000000C04738D63F000000808FE6BD3F000000809146C9BF00000000468CAC3F000000201845B3BF0000000004C78EBF000000A075EBC43F0000008017C4C53F000000003463543F00000000BF1C81BF0000000090A0BABF000000007D31923F000000C061A3C93F00000040FFE7A4BF00000060A082B3BF00000000A8CDCD3F000000009F0F89BF000000804133B83F00000000BB9B903F000000A0F0FEB1BF0000008053FB9FBF00000060F088A83F00000080CDBDBABF000000001CDE71BF00000040E1D6B13F00000000E4AF9FBF0000000083EE97BF00000020F6CAC03F000000603CDBC2BF000000400985C13F000000002A4F92BF000000802B99B13F000000E0AE9FBB3F000000008CEB873F000000E00BB7C0BF000000C0786BB7BF000000E05773C03F00000040984CCDBF00000060D035C73F000000800BBEC43F000000C06765BB3F00000060B183BB3F000000003CB6BF3F00000040E994BD3F000000003EB9843F00000000644073BF00000000956ACFBF00000080E08E8CBF000000C03D3DBD3F00000000C35C8FBF000000C01985BA3F00000000C5097ABF, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (39, 4, 0x000000A0E63CB5BF000000C049CAAD3F000000800FFAA93F000000400C41A8BF00000000767F963F00000080B98BA9BF000000A09A1DACBF0000000087AFBABF000000007D3DBF3F00000080D4E0B9BF000000A08A56D13F000000602527B0BF000000609706CBBF000000002038C8BF00000000EA4E7DBF000000C0BAF7C93F0000008061D7CABF00000040190BB5BF000000C0800B95BF00000040E651A4BF00000040DEFDA53F00000000BF2A88BF00000060EE9EA93F000000403468A43F0000000096AFB0BF000000C000A8D8BF000000A0E81AC0BF000000802EEBB4BF0000000053F056BF000000805142A6BF000000207578B0BF00000040E054BB3F000000804CFDC0BF000000A04179AFBF0000000074C8A63F000000002380BF3F0000000048AD6EBF00000080BAD7A3BF00000000119DC93F00000000E05269BF000000C0416EC0BF000000004858653F000000C0C54EAA3F000000A0A97FD13F00000000314CCC3F000000E01105B53F000000808C0E7F3F00000000FCBAB6BF000000C0F258B83F000000C03BADBBBF00000060CEEF973F000000E07195C23F000000C03493B73F00000020C243B63F00000000715A963F000000209DF3B4BF000000806094B03F00000040A801B13F000000C03961C0BF00000080396CA4BF000000C07861A53F00000080D3FFC3BF00000080BD9A7D3F000000408B0CA1BF000000201A25D33F000000E02382A73F00000060EEA4BDBF000000400F75C6BF000000207723C13F00000060BB78C1BF000000C0AAF6B8BF000000000F168B3F00000020AAE5C8BF000000E08688BEBF000000A0FB7AD4BF00000080A65CAB3F000000205B6ED43F0000002098ADB83F000000206D8DCABF000000409071B53F000000C00D9A96BF00000060497FABBF000000A00EBAC53F000000E09DA1CC3F000000002FC980BF000000001C386ABF000000408CFAB3BF00000000386AAABF000000605B79C73F000000C072B8A8BF0000002033EEB0BF000000800B51C73F00000000F2B3A2BF00000000B4A3BA3F00000060E13DAD3F00000060FADCB0BF000000809F3EA1BF000000A0DDE5B03F000000C04C40BEBF00000000246386BF000000C0FFCEAB3F00000080C8DFA3BF000000008085663F0000008046BBBD3F000000E0FCC0BCBF0000006077AFB43F00000080030A94BF000000A02DD3A83F00000060C22AB03F00000000800D8B3F00000040D999BCBF00000040D0C2BEBF000000C02CADBD3F00000040050CD0BF0000008028F0C83F00000040D1E3C83F00000080538EAF3F00000060DF94BA3F000000006018BD3F000000407AD9C53F00000000C0E286BF00000080E23DA23F000000A0CDD7C7BF000000208B94813F000000A06847BD3F000000000EFF833F00000040E826BC3F00000000E1E483BF, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (40, 4, 0x000000E0D830B4BF000000808C81AF3F000000C02629983F00000040BD157BBF0000000039EF82BF00000000951D87BF00000040AE86A6BF00000060476BB4BF000000A0141EC13F00000040F79BBBBF000000403B3AD03F000000808F8FA2BF000000401F7DCABF00000000ABFBBEBF00000080574696BF000000E0F21FC73F000000C02A05CBBF000000807387B5BF000000001E188EBF00000000F06393BF000000001EE2B13F00000000E6ED75BF000000001F23A43F000000C04DDAA53F000000A08CFBBBBF000000A047A2D8BF0000006094FCB5BF00000040FB31B2BF000000203391843F000000001E6B9ABF000000C0FF7EADBF00000020AF84C13F000000E003D7C3BF0000004069B2A4BF00000040E176AE3F000000C0B8FEC13F00000000721C96BF000000009AC1A1BF000000C01CE4CC3F0000000038E259BF000000205944C3BF000000006509A33F0000008080EA953F0000004021F8D23F00000040CED7C63F0000006006C0A63F0000008066F4553F000000003F8CB4BF000000E0B714C13F0000004043FDC1BF00000080C823773F00000040814FC43F000000003BF4BC3F000000C040B1B83F0000000076608FBF000000A0222EBBBF0000000038E2B43F000000C004C2AE3F000000603E94C2BF00000080F9C3A5BF00000000B2429B3F000000C027B9C5BF00000060E7D3A23F000000C01833A5BF000000E03E80D23F000000807FCAA23F000000000550BEBF000000C0C811C6BF000000801AEEBF3F00000080A016BDBF000000A07C8DB3BF000000004525913F000000403DC4C8BF00000080E58CC1BF000000209393D5BF00000080A037AC3F000000E0A7CED43F000000A0F270BA3F000000C06FB4C7BF00000020E49EB83F000000A0700AA1BF000000C05E5FA2BF00000000CB29BE3F000000801EBACB3F000000C08EE9A4BF000000001A91933F0000000047D3B4BF0000000040807FBF00000080ADEAC93F000000C0ADACA6BF000000C04DCEB7BF00000000DDD2C83F00000080633E8FBF000000200F7EBD3F000000A0DC52AE3F000000407F2DABBF00000040E1BEAEBF00000080385B9F3F000000A089D5C0BF00000000F002663F000000C0E005A33F000000A05981A8BF00000000BE298B3F000000A0D46AC33F000000002330C3BF00000080CE30BC3F000000807CD6A5BF000000001468AB3F000000407946B13F00000000560A9E3F00000000BA00C2BF0000006006C5B8BF00000000663AB93F000000007D13D1BF00000040AC83CA3F00000000A455C63F000000202DF8B93F000000207A38BE3F0000000080FBC03F00000080F985BA3F00000000A28097BF00000000745BAA3F0000008072B4CBBF00000060CC9F84BF00000040772CC13F000000004C38843F0000004015E7B93F00000000B05948BF, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (41, 5, 0x000000A0C206BFBF000000C018C4A33F00000080714573BF000000200B3EA1BF00000000F8D3B1BF000000C0FEC69EBF000000E04516A1BF000000000F9AC5BF000000C08377B63F000000C05BE9B6BF00000000A320D13F00000020A34BBCBF00000040C301CBBF0000004029CEBCBF00000020819ABBBF000000006EDDC93F000000C03649C9BF00000000E5CFB9BF000000C0F5EFA3BF000000801533923F000000003BA6B43F000000E036299BBF00000040FEC39DBF00000080C28E963F000000202AAEB1BF000000A0385FD2BF000000C04FDDB7BF000000200236A9BF00000040241A80BF000000007B22A3BF00000000278185BF000000007050B33F0000004060DDC6BF000000209FC2A1BF000000401AB0A03F000000400F10C13F000000C0DF95A1BF000000004660A9BF000000007D85C33F000000607552AEBF000000C0CEF4C3BF000000003F7093BF000000800877B83F00000060A7F0CC3F000000C09295C63F000000C0C7C1B83F00000080359C94BF00000040C1E5C1BF000000204BCCB83F000000E09503C7BF0000006034048A3F000000605A9ABC3F00000040D5C0AB3F000000A0D696B93F00000080D1B390BF000000006978C1BF00000000FCFBAB3F000000C0CC66BD3F000000403568B8BF0000008001CD90BF000000001BC7B93F000000E09216C0BF00000080E3618FBF00000080397BB9BF000000A0D7A0D03F000000E01D94A93F00000060BFC2BBBF000000A068DEBEBF000000005A27C83F000000C02C1BBDBF000000C00461BBBF00000000CCBC95BF00000040A1E4BDBF000000804B3BC6BF000000C080FBD2BF0000000019B5983F000000C0816BD73F00000060B661C13F0000008016ACC6BF000000A00DC3AD3F0000008049F788BF0000008033389C3F00000060FE6DC53F000000E0D1F4BB3F00000080205B963F0000008081B099BF000000806DF0C0BF00000000854FA9BF00000040F481CC3F000000A01C71B4BF000000C02A8B853F0000000067A1C63F00000040A6B09FBF000000C00AF4A03F000000C0960DA33F0000000098A78EBF000000007E0EA6BF00000020BF9AB53F000000E047EAC0BF0000000038E675BF0000002034EAAE3F000000A002EDA4BF00000000AE99A13F00000040EBB6BB3F000000409C3CB4BF000000C0335EBF3F00000000ECD06C3F00000080ED82B13F000000006222A83F000000804075A4BF000000C09D5CB6BF000000007C52A3BF00000060F009C03F00000000BAA4C9BF00000000DF0BCF3F000000E0D26EBE3F00000080992DB03F000000A0856BC23F000000A0460DC23F0000008040BEC73F000000802B679EBF000000005CE379BF00000000F978CDBF000000004E85A9BF00000040E2A8B73F000000004074683F000000405BB9B83F00000080FF15A33F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (42, 5, 0x000000409D9BC1BF00000000076B9B3F00000060A52B82BF00000020021CAABF000000A0F5A6B5BF0000000007948ABF0000006053D1A0BF00000080830AC6BF00000040A04EB53F000000C0D04AB8BF000000807F3AD03F000000A0D37FBFBF00000040287DCDBF000000404522B5BF00000040A451C0BF000000C02CF0C93F00000040C3C4CABF000000002E9CBDBF000000001512A8BF000000803AFC9ABF000000E06371B23F00000000E2DC67BF00000000705482BF000000C08871A73F00000000C0A9AFBF000000A0AA93D4BF000000C03521B3BF000000403CD2A0BF000000C03E497F3F00000000E3AEB0BF000000009C7086BF00000040663BAB3F00000040BEAEC8BF0000008037EB91BF00000080748B9D3F0000006053CFBE3F000000004902893F000000E0C929B9BF000000E0C8DABF3F000000C02392B0BF000000C086FEC1BF000000002DD795BF00000000F12CB43F000000206D5ACB3F00000000952FC43F00000040EDBDBB3F00000060C4F690BF00000020AE9FC4BF000000604E69B23F000000A0F3F8C7BF000000404172893F00000040F29EB53F000000404DDB933F000000C053AAAA3F000000C0B043A8BF000000C00490C0BF00000000B2CCA53F00000000DCC1BC3F000000C099B5B7BF00000000683B86BF000000600554B53F0000008094EBC0BF00000020D2FB8DBF00000040AD41BABF00000080720CD13F000000402D3AB03F000000006B4FBDBF00000020BAF9BEBF00000080F615C53F00000020B72AC0BF000000C0293FBCBF000000E0A1E1A6BF00000060FBB9B5BF000000808ED5C2BF000000C0B03FD3BF00000000B6449C3F000000C004C5D93F000000401374B93F000000C00904C7BF000000800BA2A83F000000408B8D8DBF00000080AFC7A63F000000003068C43F000000A0F9BBBF3F00000060F3269CBF000000808D8FABBF000000E0391FC2BF000000003BA196BF00000020FFF4CE3F000000005266A9BF00000080344E9BBF00000080AECAC53F00000060B5AFA8BF0000008089D8983F000000C0C7F2AC3F000000400200AB3F00000080052EB1BF000000E03009B83F0000000026B8B1BF000000005D08813F000000404A48BD3F000000A0CE53A5BF000000002F009B3F000000602F69C13F00000040667ABABF000000400F55BE3F000000407616A8BF00000080709C9E3F000000808FCCB93F00000080EE6EA6BF00000040480EB0BF00000000A984A8BF000000404A3EBE3F000000E0EA8FCCBF000000E0A7ECCB3F000000A07815C43F00000000F42BB23F000000C047D4C63F00000020C72ABA3F00000060CA7CC73F00000080265F90BF000000008F99973F000000C09A45CDBF000000C0BA86B1BF00000000AB18B83F00000000EF6C87BF0000004059A7B93F00000020DBB9A23F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (43, 5, 0x000000C0B93AB9BF000000809223A43F00000080BA9D9D3F00000040FE54B0BF00000020D9E1B2BF00000000AF5E89BF000000E09D67A4BF00000080DDC5C5BF0000004097D5BC3F000000C0A825BBBF00000080CD55D03F00000080D8EBB9BF00000020E79ACABF000000C03A89B7BF00000040AF9CB9BF000000402BD8C93F00000000F911C8BF000000403EC1BFBF000000E00F24A8BF000000003C8F8EBF000000407C3EAC3F000000C09ADE81BF00000000B776773F00000000C0F941BF000000409A35A1BF000000600CDED5BF0000004069CDB9BF000000403E94B5BF00000080006D72BF00000000FFE099BF00000000D62D85BF000000E089FFA43F000000A0238BC7BF000000A0548BA4BF000000003665943F000000C0E68CBB3F000000006A818DBF00000080EA8CB6BF00000040F42DC33F000000A01CA8B2BF00000020C673C5BF000000802858A0BF00000060BCB4B93F00000020EADFC73F000000206CB8C43F0000008030FFB33F0000004099E9893F00000020EBC3C2BF000000C02293B03F000000C05402C0BF00000040BB8A933F000000E003C4B83F00000020F53BA43F00000020871EB33F00000000986B90BF00000020720CBEBF00000000C009A43F00000040DF2CBC3F000000C063F1B3BF000000403D0E90BF000000605E11BE3F00000040D80DBBBF000000E058F9A1BF00000060D550B9BF00000080245ED13F000000C09C24B13F000000605881BBBF000000406EF7C1BF000000400A5AC33F000000C0A932C0BF00000080CADABCBF00000080C2B5A7BF00000000CC64C3BF000000400812C1BF00000000706FD3BF0000000032E08E3F000000C0B410D83F00000060D8F8B43F000000E051D0C4BF000000A0FA96A53F000000400B3D8CBF00000000B4ABA53F000000804B76C43F00000040B0F7C13F00000000CF2774BF00000000949071BF000000E08079BBBF00000080C72CA5BF000000003F5FCC3F00000040D4F3B2BF00000040409E91BF000000608FF4C13F00000060226FB3BF000000C07D42A23F00000060BE11A13F00000080E0B9923F000000007BCFA4BF000000C03608B43F00000080C842BEBF00000000B94B8A3F000000802201B03F000000C0D829A3BF0000000072DA833F00000040F065BD3F000000009968B7BF000000807F97AF3F00000080A5E09DBF000000E086A2A63F000000201948B13F0000000073019ABF000000C0BFB7B2BF0000004053DBB4BF000000A06488C23F000000E0C7D5C4BF0000000015EACA3F000000A09B06C43F000000C0AD1BA63F000000209D65C23F000000A083D1C13F000000800702C93F00000080DF26A2BF00000000C263943F000000204A91CFBF000000C0078CA2BF000000405C18B43F00000080FE2B9B3F000000009E41B83F0000004024DA9D3F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (44, 5, 0x000000A0D986C0BF000000C0B745B03F000000E0429889BF00000040F80C89BF000000006314B7BF000000005EA890BF000000C02C2AB2BF00000080FA93C6BF000000404948B43F000000E05957B8BF000000A0E6EBCE3F00000080BDBEB8BF000000C04CB5CEBF0000004007E7B4BF00000080CFC5B7BF00000060A315CA3F00000000F535CDBF00000040DF42B9BF000000E04F319EBF000000405E3DA9BF0000006028D1A93F000000E07DAB8CBF000000A00B15A03F00000000A410913F000000A08758B3BF000000006A72D7BF00000000DE3CB3BF000000C056EAB4BF00000040707B983F00000080BFB2A5BF00000000D05B97BF000000806630A43F00000060648EC4BF000000801D9298BF0000008088A7913F0000006006CEBA3F000000006E088FBF00000000B634B4BF0000004007A3C33F000000A08279AFBF00000020DCF1C0BF00000080AA98A7BF000000E03769B33F000000A06208CD3F00000040C002C93F000000004645B93F00000000AE5E4D3F000000A0E221C1BF000000C085DEB53F00000060B21BC6BF000000802AF5673F000000A02BE0B23F00000080DC2E993F00000080E560A93F0000000088257FBF000000607948B9BF00000000B475A63F00000080A30DB63F00000000A123C0BF000000008BC08BBF000000603830B53F000000E04B23C1BF000000E054AF97BF000000E0EA7AB4BF000000408215D33F00000000E9ACB03F000000E09A3CB8BF00000080AB2BBABF000000C0406DC53F000000204806C1BF0000000069B8B8BF00000060E875A2BF000000005399B8BF00000000A0A4C3BF00000000FBA9D3BF00000000001D6D3F00000080DB0FD93F000000A0D712B83F000000C008EBC2BF000000200ABEA53F000000405A688D3F00000000227488BF00000040B74CC73F00000080A540BF3F0000000085D291BF0000004002FAB2BF000000601113C1BF00000000ECDC7FBF000000E00E81CE3F00000060D203B5BF000000C0F495A1BF00000060FBCFC33F000000C0263AAFBF00000080F15EA33F000000400B16AE3F0000004039C7AF3F000000A03079B8BF000000A0C81DB53F000000408938B7BF0000000081BE8EBF000000C03763C03F000000404AD5A8BF00000000F617A03F000000004D22BB3F000000607692B4BF0000008055C2B53F000000007EAFA3BF0000008015B7A03F00000080A657B83F00000080E7C8AFBF00000020BBE3B8BF00000080E7EDADBF000000E0BA0FC33F00000080E783C9BF000000800AA8CC3F000000A04DE3C33F000000406168A23F00000080E16EC43F000000E00909B73F000000407A5AC23F000000806A0DA3BF00000000417F913F00000080A2A6CDBF000000C0990BAFBF0000008047D0B43F00000000557F85BF000000C025CCB93F000000000EBD973F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (45, 5, 0x000000805C2FBDBF000000003FB6A83F000000001FB57BBF000000A01AF6A4BF00000000A4E0B7BF00000080F8B39ABF000000C02F6898BF000000A0A611C8BF000000802D79B83F000000C039CEB4BF0000000082F5CE3F00000000CF90B8BF000000C07CEFCEBF0000008063BEB9BF00000040FF97C0BF000000005500C83F00000020E280C7BF00000060365AC0BF000000E0FFAAA2BF00000000F8689CBF0000000033B6B23F00000080C005943F00000000137870BF000000C0F028A73F00000000305DAABF00000060081CD4BF000000C039C1B1BF00000040CD2FA9BF000000C0A9D788BF0000000035C8ACBF000000003B089DBF000000006D07B33F000000C0C7B0C8BF000000C031EAA6BF00000000AAE3A03F00000080B328C23F00000000DE0A78BF000000806A37AFBF000000400181C13F000000E05D5AA4BF000000206D4EC2BF000000009BDA9BBF0000006056BEB43F00000060E409CF3F00000000292CC53F000000C0EFE2B73F000000E075EF91BF00000020930FC3BF000000C05AABA83F000000C0C936C5BF000000403B6A993F00000060A4E1BB3F000000C0C399A93F00000040C642AF3F00000080E77FA7BF000000809E7CC2BF00000000DE24A43F000000E0762BAC3F000000208D15B9BF00000040CE4494BF000000207EF7B83F000000A0D4B8C2BF000000608E8BA0BF0000008075EDB5BF000000208F49D03F000000802CB1A63F0000006013DCB5BF000000201E41BFBF00000080088EC43F00000020D7CBC3BF00000040F2E7C0BF000000A0C8DDA4BF000000A0D464BBBF00000020BBE4C1BF000000C09698D3BF00000000620B8A3F000000C07F72D93F000000C0B3A3BF3F000000808E18C8BF000000407E13AF3F000000200BF497BF00000000A522A33F00000020F875C53F0000002058F7BD3F00000000FB6975BF000000008055643F000000A07B7FC3BF00000000901A50BF0000006092E3CA3F000000E027E5B2BF000000007282A5BF000000C06055C63F000000C006B89DBF0000000080E8A83F000000205791B33F0000000052EC9A3F000000C05966A4BF000000608146B83F000000606F3DBCBF0000000018407BBF0000008075C1BB3F00000020BB3FA2BF00000000FEEDA53F000000403BD0BE3F00000060CD40B9BF000000A0FCD9BA3F000000003E6492BF00000060C3A8A03F000000805CBAB33F000000805839A5BF000000805973B6BF000000202528B2BF000000C083EBC13F000000C0D8ACC9BF000000400CBDCC3F00000060BAC0C33F000000A0BF9AA83F00000080847EC53F000000806AD2BC3F000000C0CE33C63F00000080E6C993BF000000008A6B82BF00000060E4A6CBBF000000802AEBAEBF000000E0B2F9B53F00000000D805783F000000C03F65BE3F000000E0A84DA93F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (46, 5, 0x00000040B994BBBF000000C047B7A03F000000805BDC8EBF00000020BA21B7BF000000205755B8BF0000000006F582BF000000804BECA5BF00000080EAD4C3BF000000C04A0DBD3F00000020E662BCBF000000E0A44ACE3F000000A0BF2BBCBF000000C0354ACBBF000000007094B7BF000000E06407BEBF000000C00E2BC93F000000009C94C9BF000000C07F18BDBF000000400DCCADBF000000006A9A843F00000000A11EB03F0000008035B287BF00000000BD0EA0BF00000040AF4AA53F000000C09D4EA2BF00000040987FD3BF000000C06DB7B5BF0000000043C4B0BF0000004095DD8CBF000000803A2EACBF00000000302F69BF0000000083D3A73F00000000C2ADC7BF000000C03AFAA6BF000000002EF1763F000000406DCAB93F000000C09C5EA9BF000000205348B0BF00000040D74FC43F00000000BB14B0BF000000E0102CC8BF00000000F8A16E3F000000C09AC5B83F0000004079D1CB3F000000405CA2C43F0000008026EDB63F000000E09A8184BF00000040447CC4BF000000207CEDB63F00000000A896C4BF000000403DEB833F0000008071F9BC3F000000405A68B53F00000060F982A93F0000000064EC72BF0000004017CBBFBF00000000D5BBA03F00000080F7C4BF3F000000C0261FBABF00000040312591BF0000006056DFBD3F00000020119BB5BF000000000D8093BF00000040DE10C0BF00000020F95CD23F000000802958B03F00000060EA33C0BF000000807B55BCBF000000C0294BC73F0000006049FFBCBF000000604955B9BF000000809F0A8ABF000000C030BCBDBF00000040F63AC5BF000000407E4AD2BF00000000F46E8B3F000000A0950ED83F00000020A04DBE3F0000000015E4C3BF00000080117FA73F000000A07D54A3BF000000A07670A63F000000A01615C43F000000600BF8BD3F0000006001FB98BF00000000E25392BF00000060246CB5BF00000000D18097BF000000E0B283C93F000000605265B0BF0000000044AA4DBF00000060C9DEC23F000000C09B2093BF00000000F2AA9A3F000000E02822943F0000008034AF93BF000000803C42A5BF000000200B32B43F000000E0AE09C0BF00000040CF60A13F00000040FE93A53F000000404D5B9EBF00000000A8DAA73F0000004090FBBC3F000000802F1EB3BF000000A0A629B73F0000000070CE523F0000008052CCA33F000000406089AD3F00000000E01B61BF00000000ADA0B5BF00000000085AB1BF000000E02356C03F000000408A69CBBF000000A0A0D5CA3F000000E0C301BD3F00000000B5CCAB3F000000405BF5C03F0000004038F5C13F000000805A23C73F000000404C7DA2BF00000000AC4571BF0000004053FCCFBF000000C0CAE99CBF000000604C4DBF3F0000000040EB4DBF000000406403C13F00000040FCFF9C3F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (47, 5, 0x000000C0D7E4BFBF0000000002A6AC3F000000A0691A8C3F00000000FB3B723F000000002CAFB9BF000000408B99A9BF000000C0356EB2BF00000060733BC7BF000000609CBFB33F000000C08E9BB8BF00000040CC8BCF3F000000E0B962B4BF00000040E858CABF00000000A993BABF000000009B77B7BF0000004096E2CA3F000000E0DDFDC5BF000000407BA7C1BF000000A00277ABBF000000002D30A0BF00000000E4558A3F000000E04C1A98BF000000007AB3783F00000080C5589A3F00000040F49BB3BF000000C019A3D6BF00000060835BB6BF000000C045F9B0BF0000002016397FBF000000809F22B0BF000000802B279FBF000000002AF4AC3F000000002E5BC3BF000000E03A43A5BF00000040C35AAA3F00000040763DBF3F000000002DD785BF00000000BCE7A1BF00000000B617C53F0000006005ADAEBF00000060A811C5BF000000009A149FBF00000080E5B9B13F000000A04242D03F00000000C4CAC73F000000E0DE1ABE3F000000E058AC833F000000E0A491C0BF0000000029B9B23F000000A029B0C9BF000000008A1EA33F000000605413BA3F000000808BD8963F000000C084A9AF3F00000080C4DA96BF000000C004AFBCBF00000000707FA83F000000C0E5E4B13F000000C090D6BABF000000C0FF5E9ABF000000A0F314BC3F000000C01DA8C3BF000000C0E74BA1BF00000060F938B1BF000000C0F757D33F000000206EE7AF3F00000040AC69BABF0000000080FFB3BF000000205470C33F000000C0310AC3BF000000E0BB85B5BF000000E04FBCB1BF00000080A22CBABF00000080B29CC4BF0000008083D0D4BF0000008041C8A03F000000400F7DDB3F000000002492BF3F000000006B5BC5BF00000000CDCBB13F000000E02DCB7BBF000000C0A2829D3F000000C0E377C43F00000060851EBC3F000000C044CDA0BF000000C041ADA0BF00000080FC96BDBF0000000080A462BF000000C0073ACD3F0000004015DDB2BF000000009C4B59BF000000404EC1C23F000000C0906FA8BF00000080B9F1AC3F000000C0045DB23F00000080D409A13F00000080CC23A6BF000000601185AF3F000000E002F8B4BF000000C065689A3F000000E0EC8DBA3F00000060244CA3BF000000C0EB46B03F000000806A94B73F00000040E279BBBF000000207A29BD3F0000008001D69ABF00000040FDA3A33F000000A06E05B63F0000000030BE85BF00000060EFD5B5BF000000C0E683B8BF000000001A40C23F00000060D181C9BF00000080EC38CE3F0000008079CEC53F000000A0A07EA23F00000000A48FC63F00000080598CBC3F00000000373DC53F000000408EC2A1BF00000000D7DF923F000000806747C8BF000000A0974BABBF000000E0EDE6B53F00000000C4CA86BF000000C0761ABC3F000000E0E9EEA73F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (48, 5, 0x0000004042D7BDBF0000004003C0A03F000000A0C9C08C3F00000000523DB0BF000000C0AF35B5BF00000000A02C46BF000000406FB6A2BF000000C05E46C4BF00000080D0B0B43F00000080C49AB9BF000000202A7ECD3F00000040B509BCBF00000020DF68CCBF00000080F708BCBF000000606834BABF000000C098DCC93F0000006059FFC5BF000000A0453CBFBF0000004089E9AABF0000000052CB8F3F00000000273BA93F000000205FA885BF000000000DB394BF000000006EE3893F0000008055CAA3BF00000000D451D4BF00000000130BB6BF000000A0CC45B1BF000000C07CAB9FBF000000807C88A0BF000000001058613F00000060615BA73F00000080E543C5BF00000040CC03A4BF000000004A3B903F0000006046F4BD3F000000C03CC7A2BF000000400B95AFBF000000205AC9C43F000000C03EFEAFBF000000A0CA04C8BF0000000038C582BF000000005A46BD3F000000203B32CA3F000000800A55C43F000000603622B73F000000001283923F000000608775C4BF000000C07F64B93F000000E0DD12C4BF00000060AEBB973F000000C0ACF7BC3F0000004031CCA13F00000080E43FB43F00000000800F65BF000000A01B3FBDBF00000000468EAE3F000000E040EFBC3F00000040F149B3BF00000000FCFB733F000000C0C141C03F000000409925B5BF00000080419184BF000000008CECB6BF000000E0657ED03F000000407F62A73F00000060421EBABF000000A0B44AC1BF000000A08142C63F00000000B1B6BFBF000000007516C1BF000000008A5099BF00000060A4C9C0BF000000404C44C2BF000000402EC5D3BF000000000030913F000000803FA0D93F000000A091B6BB3F000000806F17C3BF000000C06F0DAB3F000000E0A3F293BF000000C0E257963F000000801622C63F00000040C1AFC13F00000000C4227BBF00000080E8FB9ABF00000040BE39B9BF000000808B95A4BF000000C0EAC8CD3F0000004091AAA8BF00000000263D68BF000000807F95C23F00000040DEF394BF000000807407A43F000000C00D5BA43F0000000008598F3F000000C0CB40A4BF00000000DA3AB63F00000040564CBEBF00000000B29A8E3F000000C0917AB13F000000C09D87A9BF00000080BE29A83F000000C09B8EBE3F000000A0A7E7B7BF000000E0FE89BD3F0000000025B891BF00000080D7E6B13F000000608A22B23F000000006C25703F0000004046A5B2BF00000080E1B0A4BF000000A027D3C03F00000040D8D2C5BF000000C06F72CB3F000000E04458C03F0000002071A0AC3F00000000CD0EBD3F000000A0E1D7C43F00000000E52AC93F00000080547FA0BF0000000056B78C3F000000403D0DD0BF000000A0D08DA9BF00000040AD29B53F000000004C01923F000000C08745BD3F000000403918AC3F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (49, 5, 0x000000203D37BEBF00000080432CA03F0000000074A2503F00000020137CAEBF000000A08E23B2BF0000000008E88CBF00000040D942A3BF000000C02A9AC6BF000000C00429BA3F00000040F29FB9BF00000080A8E5CF3F000000E03FBEBEBF00000060F416CCBF000000609610B9BF000000405932BCBF000000207B0FC93F000000C0B960C9BF000000806C4CB5BF000000003A86A5BF00000080D6D893BF000000607472B03F000000201C5E8BBF000000400A9892BF00000080488B973F000000C09646AFBF00000040D1F6D4BF000000C04446BABF000000204946ADBF0000000039376CBF000000002A6CACBF0000008008C79EBF000000A0B1CDB03F000000E042B7C6BF00000080588BA6BF000000807F83903F00000040CD85BF3F0000008000B696BF000000009A8CB0BF000000E03F2EC03F000000A08F06B0BF000000A07E70C2BF00000000CC1C96BF00000000E0B0B63F000000003659CB3F000000A00D62C73F000000A0DA21B23F00000040FAEC79BF0000006074AFC2BF000000E052CDB23F0000006070FFC5BF00000080D7DB913F000000A06307B63F00000000E2CD9D3F000000E037FBB63F0000000088BF91BF000000C0432DBCBF000000001B17A43F0000008061D2BD3F000000003786B7BF000000C04F2383BF000000C025B2BC3F000000600CBDC1BF000000008FE0A4BF000000608EA2B0BF000000A056E0D03F00000060AE8CB43F000000C074DDBBBF000000409842C1BF00000040F53DC73F000000C01858BDBF000000004706B9BF000000C0962EA7BF000000A0F7A8BBBF000000807661C3BF0000000058C2D2BF00000000A907A63F000000A09519D93F000000E05214BA3F0000008041D6C7BF00000080667CAC3F00000040963DA2BF00000000EDC79C3F000000002DB3C83F000000E042DDBE3F00000040A3FC923F000000808B09A4BF000000E0F92FBDBF00000000C4917DBF000000C0A014CB3F00000020B569B2BF00000040BE8E81BF00000020B377C43F00000000214AA5BF000000C075A3A33F000000005E86AD3F000000C0090BA53F00000000892BAEBF000000A05366B73F000000A02551BEBF000000002D85883F000000A0DF6EBB3F000000C0F7F5A2BF000000006E06993F000000A0B7C6BE3F000000C06C52B5BF000000805306C23F00000000909450BF000000C0D45FA33F00000060BA91B53F00000000DC2AB0BF00000020BD96AFBF00000000A7C1A1BF00000000192DC13F000000602B84CBBF000000E06A95CD3F00000000978FC03F00000040CB2DA93F000000808DF2C43F000000407155BB3F000000800E08C63F00000000E0A57FBF00000000288676BF00000080E756CEBF000000A0572BA5BF000000405F46B63F00000000422A7B3F0000000066FFB33F0000000016069B3F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (50, 5, 0x000000E0C945C2BF00000080A85BA03F00000000E9A374BF000000A0B2ADADBF000000E09DFCB1BF000000C0CAC09ABF0000000074A0503F000000602AF2C6BF00000040028CBC3F000000E01F6DB9BF000000A01DC5CF3F00000040A01CBABF000000E01290C8BF000000E013D2B7BF000000A0CCD3BBBF000000405B16C73F000000A0C43DC8BF000000C09528BEBF0000006079A7B2BF000000008E92873F0000000000CFB33F000000E0CFC55DBF00000040357E98BF00000080E821923F000000C073FBABBF00000020EBACD2BF000000C07A99B7BF00000000B9EDB0BF000000C0B9027EBF00000000584371BF00000000865770BF000000400CD4AC3F000000004712C9BF000000C0CEB4AFBF00000000598B9B3F000000802551BE3F000000C058BEA7BF00000040EDC4A0BF000000602ED9C33F000000801501B1BF00000060D84CC7BF000000000885783F000000C00F53BF3F000000E0CBA2CE3F000000C070DBC53F000000002CD8B93F000000C0BC8598BF000000A02467C4BF000000E08D14B43F00000040B48FC4BF00000020C98F983F000000C0B4E9B93F000000C020F4AD3F000000C0CD8BB83F0000000088B06BBF00000000006BC0BF00000000CE4FA93F000000009BDCB93F000000602800B2BF00000000DB49703F0000004040F7BF3F00000040EB7EBDBF00000020D33A9CBF0000000032D4BCBF00000080FA04D13F000000E024DBA43F000000C0EC76BCBF000000403E0CBDBF000000000172C63F00000080EA3BC0BF0000006051DFBEBF0000004038B794BF00000000DE10BFBF0000000069FEC3BF000000403C46D3BF000000004D44983F00000040BF46D93F000000804B5FBC3F0000004012B4C5BF000000601C35AB3F00000040D98A8BBF000000A050E3A73F00000060FA5CC73F00000000BF52C13F00000000806D1E3F00000000462A83BF000000E05249B9BF000000809664A7BF00000080E41BCD3F0000008053D3B0BF00000000105E533F000000A0191BC63F00000040E2D191BF00000000F204903F0000002079D2A63F00000000383074BF00000080202199BF000000803FC5B23F0000000085AAC2BF000000409CAE943F000000400F92AE3F0000008025B8A9BF00000000A3169F3F000000C0CB6EBC3F00000060BC33B9BF00000040EE40BC3F00000000E8E4743F000000A0A60AB03F000000A08630B13F000000005A9896BF00000060B879B1BF00000000DAF5ACBF000000401CD1BE3F000000808792C8BF000000803590CD3F000000E0393FC13F00000040AEE7AA3F000000801800C23F000000A0914EC13F000000E0F6A5C73F000000805F7BA0BF000000802852A33F000000E09BEDCFBF00000040971BA6BF00000040453CBA3F00000000BCA37E3F000000402F97BA3F00000060F16FA83F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (51, 6, 0x000000402596B8BF000000E08CA9B53F000000C01B6AB33F000000803A89BABF000000C0D281BDBF00000040062697BF0000008057E3B4BF000000C03EB2BEBF00000080918BBF3F000000A0CE5FBFBF0000006009F4CE3F000000E03A8BC0BF000000C03EC0CDBF0000008025A9B1BF00000060E007C2BF00000080A92ECE3F000000207203C5BF00000040B244C3BF000000C05D5986BF0000000049CFA03F000000207F93AF3F000000C03AADA7BF00000000562B943F000000802CB09B3F00000020A481B8BF000000E04CC1D6BF000000A094DCB3BF00000000877191BF000000607728AFBF0000000094B093BF000000004700B5BF000000C0237CC13F000000806180C9BF000000005C6A93BF00000080F47A9A3F00000060FB90B93F0000000093F89FBF000000A00D4DBABF000000005D1FC63F00000080A9F7723F000000C02C33D0BF0000000000D9A53F0000008088E5A63F0000006060CFCE3F00000040C8EFC33F00000000D28A8A3F00000020213FA43F000000C0A1CEBCBF000000A07E34B73F000000200714C9BF000000409034533F000000400C1AC73F000000805B6AB53F00000000463C8B3F000000C00E18A3BF000000204A0EBEBF0000000040D46A3F000000E0613DC43F000000C0D4C5BEBF00000000A4EEA2BF000000C04C86B03F00000080AA2FBFBF000000A00DE3AABF00000040A559C5BF00000020DC6ECA3F00000040E783C43F0000004067F9BFBF00000060A73CC7BF000000C0C509C33F00000040DAA3AFBF000000A05086A5BF00000060E125A13F000000801690C7BF00000000238EC7BF000000207332D0BF00000000E89D8F3F000000606492D33F000000C07DB2BA3F00000040F9CDC4BF00000000EA89A83F000000E0D61EB2BF000000C01EB1B23F000000803A34B23F00000080512DC03F00000000402F54BF000000000763923F000000E049BEB5BF00000000FFCFA3BF00000080D8A1CA3F000000E05ABBC0BF00000040BD20A8BF00000020BEDAC43F000000C0EA359EBF0000000000324E3F000000C0F5CB93BF0000000072B980BF00000080E716B1BF00000000F484AE3F000000000DCFC1BF0000000092837ABF00000000C3898D3F000000207414ABBF00000040D073A0BF000000805AD2B73F000000A0E7E4C4BF00000000D9C5A33F00000000EDC995BF000000A0E159933F00000040E10EA33F00000000028797BF000000400CD1AEBF00000080C16AB6BF000000C0E542B63F0000000077B5CDBF000000C08871C93F00000040DECDC63F000000E0A424A93F00000040447DC23F00000040384AC53F00000040505BBA3F000000000046803F00000000FF7A97BF000000C01D6DC1BF00000060D0A8B3BF000000C0E96AC23F000000002D55AB3F00000000DF76B33F0000000007DC8FBF, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (52, 6, 0x000000808DE8BBBF000000E09D70B33F000000408528A43F000000C06E8EA5BF000000C03879B3BF000000C0C77DBABF000000807FC1A3BF000000C06F87C2BF00000000C454B83F00000020180BB5BF00000080D612D13F000000208845C2BF000000C0ED1FC9BF0000000051CEC3BF000000E0AD28B0BF000000403D88C93F000000A0657DC5BF000000406469B6BF000000A0015FAEBF0000000005E3883F00000080EC2EBA3F00000000385C9FBF0000008063E4B23F00000000234086BF000000800B72B0BF000000C087DFD6BF00000060D299BFBF000000E03764AEBF00000040A2B38DBF0000000058BBAEBF00000040CF2EA2BF000000807429903F000000002FC5C8BF000000C04922B5BF00000000A0FF833F00000000D738AE3F000000805F10A5BF000000408D47B0BF000000E03A4BC43F000000C09C9E87BF00000000632FC6BF00000000774D9FBF0000004060BBB23F000000A022BDCB3F000000606639C13F000000004161B53F000000609473A63F000000C07922C2BF000000A03238BC3F000000E0528CC4BF000000002B0DA23F000000408D5EBB3F000000006125B93F000000C02952A73F00000000C6E4823F0000002056979EBF000000007585AC3F0000002005D4C03F0000004012DCC5BF0000008098DE8CBF000000C0C965C03F000000A0CAAAA3BF00000060A6F3BBBF000000A05CFEB1BF00000020C21AD13F00000080F97CBE3F00000020DD03BDBF00000000A812C2BF000000A0973CC33F00000020CBADB8BF000000C0474CB6BF0000000028B571BF000000A03E02BFBF000000005FDBC5BF000000007975D2BF00000000AE62863F00000060E9C6D53F00000020E68BA13F00000040E3BBC7BF00000080EF79843F000000C0C034B0BF000000C05701913F000000E0E2D9B83F00000080097FBC3F0000006018E3A5BF00000080564BB03F000000403792BFBF00000000427A8CBF000000A012CDC73F000000C0D702C3BF00000080A8AC7A3F00000040FE16C93F000000002E6D953F00000040FFA5A23F000000805EA59A3F00000000106B523F000000606228B0BF000000E061D1AA3F000000C0BB45C0BF000000008AF086BF00000080BFCDBC3F000000004F66A4BF000000005F46A0BF000000C0FF69AF3F0000008009DBBFBF00000000D124BE3F000000001064533F000000000B0480BF00000080656D953F000000805AE0B6BF000000A0468EB1BF000000A077E1B8BF000000606097B03F000000E02CC2C7BF000000008B48C53F000000400557C33F000000402186A73F000000C08E84BF3F000000E0EEFEB63F00000000A963BF3F000000003028513F00000000367D823F000000403BDCC4BF000000004204A9BF00000080BEBEBB3F00000000191D9E3F00000080223FA23F0000000087FA83BF, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (53, 6, 0x00000000A621B5BF0000004023C2A73F000000C0DFDDAB3F000000008F2DB8BF00000060B860B2BF000000407613A8BF00000000F683A7BF000000200A48C4BF000000008553BA3F000000C0DEA9BDBF000000005F11CF3F00000080B14CB7BF00000000C83FC8BF000000204400B4BF00000000CCFCB2BF00000040B24AC73F000000803CCBC8BF00000000E607B2BF00000020D303A5BF000000C06CEFA1BF00000020ACB7B93F000000E01A1395BF000000007E46883F0000000000BF573F000000C0135EAFBF000000C0D18AD4BF0000008053D0C0BF00000000452BABBF0000000080E2983F0000000030E59EBF0000008015A1A8BF0000000023769E3F000000C0C2DCC9BF00000080D75FABBF00000000992183BF000000E08C36AB3F00000060AAB3AABF000000E024B4B8BF000000A0810DC23F00000000C730673F000000E0BAF8C5BF00000000895A98BF00000080E324A23F000000E0AC6CCA3F0000002052A2BF3F00000040695EAE3F000000C08E679B3F000000C0401DC5BF000000E0363FB43F000000C0F376C7BF00000040881D923F00000000E65AC03F000000C08758B13F00000080C0F2993F00000000E4A986BF000000209F92B1BF00000000D2039A3F000000C0D9F6C13F000000C0B172C4BF000000005C5D693F0000008075C1B43F0000008041DCAFBF000000200893B4BF0000008067F4BEBF000000809982D13F0000008092BCC23F00000080BF42C2BF00000040EDD8BDBF00000080750CC33F0000000075C1B2BF000000E06ED3B0BF00000000702781BF000000002CA9BCBF00000020AC81C8BF00000040A372CEBF000000009E4B8E3F000000607CF2D73F000000E05A55AB3F00000000133DC9BF000000800865943F000000401C1ABFBF00000040B56E92BF000000608328C53F000000E0D27FC13F0000000070F08EBF0000000078ECA53F000000E06402B0BF000000001869843F000000E01C96C93F000000800C04C3BF000000006B10963F0000004044F0CC3F00000080A2B595BF00000040B3D5A63F00000000C21084BF000000809B8A983F000000E04748B6BF000000E03DA4B23F00000020DBCFBEBF0000004007BDA0BF00000060EEE2BC3F000000003ACE9CBF00000000DC8082BF000000C07A44BB3F000000A0D6FCC1BF000000E00792BB3F000000806655993F00000080DC2F8ABF00000020A474B73F000000C04FB7BEBF00000060DDCBB3BF00000040DACBBDBF000000601636BF3F00000060C4A4CABF000000203C50C33F0000000008E8C53F000000201117853F000000009AFBC03F00000060AA20BD3F000000206737BD3F00000000750F803F000000401024ACBF000000804B64CDBF0000004026B0903F000000E09FE5C23F0000000070FB4DBF00000000AAEE813F000000E09C3BA7BF, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (54, 6, 0x00000080E41DBABF000000E0547BB23F00000000E6D7B03F00000040B2F9A5BF000000A01031B4BF000000E0E87EB7BF000000C01260AFBF000000408017C4BF00000040BFEBB03F000000C0B17BB3BF000000E0288ED13F00000000F0CABFBF00000020A5E7C9BF000000403282C6BF000000C0464FB6BF000000000E6ECB3F0000004065EAC3BF00000060332DB7BF000000A007FBAFBF00000000D0F4873F00000040109FB73F00000080A4699FBF000000203556B33F000000007AA772BF00000080CB71A3BF0000004041D5D7BF00000040FCD6BCBF00000060415EB2BF000000604C9C91BF00000000FFCCAABF00000080B4A8A7BF00000000FCBB923F0000004038FAC7BF000000007FE6B5BF000000801C52963F00000060224AB03F000000001CEE90BF000000406D47ABBF000000A03D0DC53F000000207B7798BF000000E031BAC6BF000000002CAF7DBF0000000029C0B43F000000008A99C93F000000400682C23F000000406596B33F00000020EDA3B03F000000C06B2BC3BF00000060FE21BD3F000000408F7AC1BF00000080A3ABA33F00000080E2F0B93F0000008073DAC03F000000000F6C9E3F00000000BDAE883F0000000002A9A5BF00000000A87CA83F000000605C78C43F00000040D843C6BF00000000DE397DBF000000E013FFBD3F000000E05DF8ADBF00000000AD70BCBF00000000BF1CB2BF000000E02516CE3F000000C0F588BC3F000000C08C81BCBF00000000E017C4BF000000C03891C33F000000406C26B6BF00000000A19CB3BF00000000D316803F000000C03946C1BF000000C0946DC3BF000000E06B0BD3BF000000005425733F000000205586D53F00000000A1BDA13F0000004099FCC9BF0000000058DF82BF000000401E37AFBF000000C05B75983F0000004044A5B73F000000E062EFB63F00000040A8F7A2BF000000803D009F3F000000C009F2BDBF00000000D83296BF00000040B7F0C53F00000020C4CABFBF000000402664853F000000E01777C53F00000000D6BE7C3F00000000DDACA13F000000602C52883F000000007771903F00000060E973B1BF000000A0C570B03F0000006073F8BFBF0000000038E67CBF00000020D638B43F000000C0F9E6A2BF00000000796992BF0000000088AFA73F000000E084A3C1BF000000C0923DB73F000000808AF893BF00000000FB367FBF000000801DC3933F00000080509DB7BF000000C0E199B0BF000000C0D544B2BF000000C0470FB63F00000060773CC7BF0000004038B6C73F00000080B4B4C53F000000008B90A73F00000080AB60BC3F00000000B564B93F000000401464BB3F00000000103E7DBF00000000421599BF000000A026B4C6BF00000080E2A2ADBF00000020A4D4BD3F00000000D072513F00000080C4CAAC3F0000008070CC94BF, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (55, 6, 0x00000000931FB7BF000000A00DE2B23F000000E05F9DAD3F00000080CFE29ABF00000000E756ADBF00000000D27486BF00000000BA3D783F0000002047C9C3BF000000002487B93F000000C0F610B7BF00000020D39CD13F000000C07786BABF000000C05BA6C9BF000000401706C1BF000000C08A6EAFBF000000C0A7FEC93F0000000048D9C6BF000000405190C0BF00000020A6A5A8BF000000005F348C3F000000C09374BB3F0000004033669BBF00000040D75A9B3F0000000019D2893F000000405AD6B3BF000000A07565D5BF00000000C080C0BF000000C0C3F3ADBF00000080D52E943F000000003E72ABBF0000000049F5A2BF000000C0AF2FA33F00000000353FC8BF000000801E02A1BF00000080DB7FA03F000000A0EA12AE3F000000804A76A3BF000000006781B1BF000000E033D2C93F00000060C8D092BF00000020BD5AC8BF00000000FE359A3F000000809043BB3F000000806A30CF3F00000060D18EC13F00000000B3C6A93F000000E04DFC7E3F00000020E08DC2BF000000A05125BF3F00000040CF17C6BF00000080F672B13F000000C0D4ACC03F00000000B803BF3F000000209094AE3F000000006B2B843F00000080A646B4BF00000000063A903F000000408E69C33F000000207C88C7BF00000020FBC7A03F000000C0629EBB3F000000A0FF22BBBF000000E09917B9BF00000080A1ECBCBF00000000D3A9CB3F000000C01E1CBF3F00000000DB60C0BF000000C0B4D4C6BF0000008014C8C23F000000E04D01B6BF000000E0501EB0BF000000C03C67953F00000000FAC9C1BF00000080FC95C6BF0000000063CAD0BF000000001CDFAA3F00000020C7D2D93F000000803FD1B13F00000060EAB8C8BF00000060E4F9A83F000000407C8EA2BF00000000188F6EBF0000000062F4BE3F0000008031C8C53F0000008043B981BF00000000C5258D3F00000060AF09B8BF00000000CFE2923F000000A0FBC3C23F000000C052B2BCBF000000E00A50923F000000803F31CB3F000000402E2C93BF0000008053F8A53F00000000F4DF55BF00000000C024633F00000040864BB3BF000000A02CF0B33F000000409D13C1BF000000007A5F92BF000000805B6CA03F00000000E3C77DBF00000000A8EB8F3F000000A0088CB13F00000060B1A0BBBF000000E0B49CBB3F00000000F090793F00000000FF7F903F000000009F04AB3F000000405D00B5BF000000E0D5A0AFBF00000040A5BBB2BF000000400329AF3F000000E02C78D0BF0000008095E4C43F00000040E1A9BC3F000000003AC8903F000000C03EFABE3F00000080F857BB3F0000004001B0C33F00000040B505A13F00000000C2D991BF000000804773CDBF00000000E49E783F000000801A1BC23F000000000028DD3E000000004F5CA53F00000000C6C196BF, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (56, 6, 0x000000C0AB18B5BF000000C0E396A83F00000060DB50A53F0000008044F2B6BF000000801696B3BF0000000009EEABBF0000000068FBA8BF000000400006C3BF00000000010FB83F000000604A40BFBF000000E05592CF3F00000000A410BCBF000000409AD8CBBF000000809544B8BF000000C0AA74ADBF000000C0215ACB3F0000008097C5C6BF000000E006C2B9BF000000002986ACBF0000000010C08BBF00000060A219B43F000000002074A6BF0000000073EE993F000000807596A03F000000C01AA6B7BF00000080618FD3BF00000060A6FFC0BF000000A0ADDAA9BF00000020CB36A4BF00000040FA44B0BF000000804C39B2BF000000401397A63F00000000D30EC8BF00000080D16BA7BF00000000B5DB803F000000008D54A93F00000040A987B1BF00000060896EB6BF0000008020FEC73F000000C0BC4A863F000000C0C5A2C9BF00000000AC5C86BF000000202ED7B63F000000C0BAA6CA3F000000405D41C63F000000608D849F3F00000000DBBE733F000000E0F11BC4BF000000A0B9B5BA3F00000080BB11CCBF00000000E35BA23F000000E04520C03F000000001637AE3F000000E0CC97AB3F000000008F9A8B3F000000A0E05DAEBF00000000724A973F00000000F73FC63F00000020674FC5BF000000400160963F000000E04101B43F0000008061B8B8BF0000004098D6BABF000000E06817C0BF00000060120AD23F000000208EE6C33F00000040C40EC5BF0000008010D6C2BF000000404A90C33F000000C0E5A9B6BF000000A08690B4BF000000A04139A53F000000005B4EBCBF00000000AC09CABF000000E06BFED0BF0000000060BB973F000000004B7ED73F000000E06871B13F00000040EC1EC9BF000000409EF6A43F00000080510AB6BF00000000B420ACBF000000C00E8DC03F00000040517EC53F000000008861693F00000080A5BF9D3F00000060A0A1AABF00000000CC497C3F00000080325DC93F0000008006F9BDBF000000E099339E3F000000C0680ED13F000000809E7591BF000000801A2BB03F000000007E74753F000000C00C29A13F0000000023BAB4BF000000C02108A43F000000807685C1BF00000080B4ECA0BF000000405669B53F000000806178A7BF0000000062A68ABF0000002071CAB73F00000040B099BFBF000000604530BA3F00000000EC797C3F00000000A851853F000000801746B03F00000040244DBBBF000000404C90B1BF000000000392B9BF00000020A1AFB83F00000060B377D0BF0000002092ACC13F0000000072AEC13F000000C083799F3F000000A05C3EB73F000000C00DE4BD3F000000C0A529BC3F00000000EC54963F00000080BCFCA8BF000000A052A3CDBF00000040914BA23F00000080E416C43F00000000D3A288BF0000000093E09F3F000000401B1498BF, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (57, 6, 0x00000000C219B1BF0000008011C39E3F000000E0BAEB9F3F00000020A11FB9BF000000002F14B3BF000000E0359EABBF00000060AD8BA2BF00000020EBB2C4BF00000000A8A9B73F00000000504AC0BF000000A00F9FD03F000000C07822BFBF00000060AE54CABF00000080FA94B5BF00000060D0CCACBF0000008031E2C93F000000E02121C9BF000000A0E296B7BF0000002067B0AABF00000000F89878BF000000409FEBAF3F000000206875A0BF000000C021E7953F000000008F38843F00000040E9DAB7BF000000407E17D3BF000000206B25C2BF000000604205A9BF00000040956995BF0000008017FDB0BF00000020FE5FB0BF000000008424973F000000802F9AC8BF0000000079A8A3BF000000800C4E933F000000006B28973F000000207631AEBF00000000C4FAB7BF000000003EE1C53F00000000821A983F000000C0884EC9BF00000000884A7A3F0000004051CDAF3F000000E0C37ECB3F000000003735C33F00000040273CAB3F000000E06B9883BF000000E03787C4BF0000008019D1BC3F00000040B768CBBF00000020D23D9C3F000000407E38B93F000000400B73A33F00000000CD65973F00000000E19D84BF000000000240ABBF0000000044C4873F000000001751C73F00000060E30AC8BF000000A0754EA43F00000080047CB73F00000020C4B7B7BF000000009B19B9BF000000C000A0BDBF000000205723D13F000000403F87C53F000000A063AAC4BF000000608F3DC3BF000000C014E2C23F00000020167DB6BF00000040676FB3BF000000004CA8933F00000080C933B8BF000000E0ADAACABF000000804879CFBF000000000E36823F000000006621D83F00000000EAD7AF3F00000080E41CC8BF000000806E569B3F000000000614B5BF00000000DF569BBF000000E0E5DEC33F000000E06CD9C33F000000005C8E573F0000000087E1A13F00000000816DAFBF0000000000A6613F000000E01A0ACB3F000000804E42C0BF000000609E00903F000000608454D13F00000000FCE3A6BF000000009164B03F000000001ED64ABF000000003076993F00000000F235B6BF000000C0FEAEA83F00000000F17FBFBF00000040CC11A5BF000000C07453B93F00000060B80FA1BF00000000384B6F3F000000204D46BC3F000000E0847EBEBF000000E082B9BE3F00000000A4346A3F000000009B8C883F000000405899B33F000000008000BABF000000A09AF7A5BF000000C0ED7FB7BF00000040ED84B53F0000008058A9D0BF000000A00470C33F00000060E61DC23F000000607D04A33F0000000045E3B83F0000002045F3B93F00000040EBCFB43F00000000BA3F963F000000803454A1BF000000C0CDFACEBF00000040A8EF923F000000207FCDC13F0000000058C15D3F00000000B974AA3F000000C0B638A0BF, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (58, 6, 0x00000000FC91BBBF00000000EA0DB53F000000A0AA06A63F00000060050DB0BF000000407F75B3BF000000C0224AA1BF000000C07170AFBF000000808BEAC0BF000000403CB3B13F00000040438EB2BF0000008032A7D13F00000060CD7BB6BF00000000604DC8BF00000020BE1BC5BF000000204F33B3BF00000000DCF5CC3F0000004075A7C4BF00000080B748C0BF000000204AA5A1BF00000080A5A09A3F0000004028DAC03F00000040C587A7BF000000C07698993F000000402D6FA13F000000E010FBB7BF000000A0C12BD6BF0000000011C8C1BF00000040E6C9A3BF00000060919597BF000000C0D024B0BF000000400E12A2BF000000809D3A903F000000800E38C9BF000000C0CDB0A6BF000000001D9E8F3F000000C0560EB13F00000000E8316D3F00000080D5AFBFBF000000602F5FC53F00000000143C77BF00000060E526C8BF00000040583FB23F0000000090B5A33F000000A0FD83CB3F000000600BE6C23F00000040C8519F3F000000C04428B43F000000403619C4BF00000060078EC13F000000A07C53C0BF0000000095A9A73F0000004057D7C03F000000A0C805C13F00000000629B993F00000000D49371BF000000806641B1BF0000000022B9A53F00000040364FC03F000000C0CB55C4BF000000A03400A4BF00000080F2F8AA3F0000000097E39FBF000000A006A9B0BF00000060489CC4BF000000407000C63F00000040B5CFBB3F000000C097DEBCBF000000409D54CABF000000802F31C33F000000A074AFB4BF00000060299EB2BF00000000174E923F000000C0F6B9C5BF000000C05442C7BF000000602F1AD3BF000000008481A33F000000A0D1B4D43F00000060208AB33F0000004074CECEBF00000020E7B7AE3F00000040FB5CA4BF00000000EAB3973F000000C0DE59B23F000000207CD7C13F00000000402A143F000000405923AB3F000000C02658B8BF0000000046858DBF000000609740CA3F00000000B4DEBCBF0000000037C087BF000000C0004ACB3F00000080291B823F000000C0797FA43F000000C0C985A33F00000000F1E7863F000000C0EC12A3BF0000004026FBB53F00000080E19AB1BF00000080147FA33F0000000009F4A93F000000602F76A9BF000000800A3D9ABF000000401FE2AE3F00000060B929C2BF000000A02275BF3F0000008067F098BF000000401D2EA53F00000000C0A43EBF0000008031C7ADBF000000200E88BABF00000080B52DACBF000000C049DBB73F00000080CC26CEBF0000000069B8C63F00000080B56DC53F000000E07A31953F00000080155EBB3F00000000245FC03F00000040DE1BC33F00000000A2F887BF00000000C0AD76BF000000600A88C9BF0000004041D6A4BF0000004033D7C03F00000000D44692BF00000080811CA93F0000000078325D3F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (59, 6, 0x000000E0E8A1B2BF0000004017AAA53F000000009E8BA43F000000401F7FB2BF00000020A9F9B1BF000000C07B20A4BF00000080E22BAABF00000020D9A4C0BF000000801214B43F000000603EFFC2BF00000020CB0CD23F000000005385BFBF000000803D7ECABF00000000FB75B5BF000000001F58B3BF00000080E68FC93F0000000041EAC8BF000000C0CC33B2BF000000E04E02AEBF00000000E25D94BF000000E0D046B63F000000E0855CA4BF0000008018B3863F00000000EF178C3F000000802073B7BF0000008001FBD3BF00000060EE7EBDBF000000C065E4A5BF000000807A60603F000000C08F2AB0BF00000020A1B1A0BF000000C0225CA13F000000C07504C7BF00000080AAC593BF00000000F3EE80BF000000003812533F00000000EACE9FBF00000000A392B1BF00000080789CC63F0000000027D1693F000000C03F2AC6BF000000001C8F91BF000000E06276B03F000000E03C87CB3F000000C020AEC13F00000020084DAA3F0000008078BC903F000000A0E30EC5BF000000008E32BE3F000000C0920ECABF000000600A558E3F00000020F699BE3F000000808870B43F00000080761DA43F00000000408D2CBF000000A00B1AA9BF00000000D4A2A23F000000C0E4A6C53F000000A05B40C5BF000000400349A63F000000C0113DB43F000000A0F7BFB1BF00000000DC38B4BF0000006068B5B9BF000000E0A838D13F00000080317EBD3F000000002FE2C3BF0000002085D9C1BF00000080C1BBC33F000000A0E515B5BF00000080D972B1BF0000008078BA8C3F000000803EFFB9BF00000020C736CABF000000A0B06CD1BF00000000445D963F0000000097C4D63F000000E04DADB13F000000C09A21C8BF0000008030B0A73F00000080272FB3BF000000E083DEA3BF000000208784C23F000000E00A27C33F000000C0DBCD9EBF00000000F09362BF00000020E1C0ABBF0000000070AD853F000000606066C93F000000400D3BBFBF000000801832983F000000E08E71CF3F000000C0187998BF00000000C6689D3F000000408CB052BF0000000083CF9B3F000000409A09BABF000000803311AC3F000000A08ED6B8BF00000000261180BF00000080ECCFB63F000000A031E4ABBF0000000080B621BF00000040895BB63F000000204A65C1BF000000201851BF3F00000080B4CA91BF0000000016F9763F000000C0777AB53F000000C01668B3BF00000020B36DB3BF00000040B123B9BF000000E0BE97B73F000000001475CEBF000000409F50C23F00000000AC4FC23F0000006081A1AA3F000000C0AD8ABC3F00000080EC9FBE3F00000040CEA4BE3F0000008006C1923F0000000040178ABF000000A071D4CABF000000008C7F4B3F000000C0CFE8C03F00000080311C9BBF00000000555D9B3F00000000F3E6A3BF, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (60, 6, 0x000000C0603FA7BF0000008030C5B63F000000409D3DA73F000000008A6BB3BF000000408B46B4BF0000000055D39BBF000000404C9EBDBF000000E0598EC3BF00000080924BC33F00000000DE87BBBF0000000016E1D03F000000C0E03CB2BF000000C0D512CABF00000000D38C8BBF000000409FE7B2BF000000401A34CD3F000000A00F2EC9BF000000C067CCBFBF000000005BCE6EBF00000000107C87BF00000000AA55AB3F00000000690965BF00000060CC76A93F00000000078AB23F00000060FAF9BABF000000608382D5BF00000000C476C1BF0000000008A3B0BF00000000C69368BF000000003EB6AABF000000C070CCB8BF00000000FB9B943F00000040C446C8BF00000000CA4B8ABF000000005039B93F00000000EE79B53F000000801AE2A6BF000000A0150DC3BF000000A05520C73F00000000B52C8EBF000000404B77C9BF000000003A39843F00000000A2EBBB3F000000804AE0CC3F000000401973C63F000000A04B16A83F0000004064E592BF000000A074A3C7BF000000E089C4BB3F000000C02E30C4BF000000E0C691B23F000000C07FE9BF3F000000800067A33F000000207D85B13F000000800381953F000000800F70BCBF000000005020AA3F000000804957CA3F000000008F55C5BF00000000CF81B1BF000000C0747CAA3F00000000CFEFB3BF000000A08051A5BF000000A073B0C0BF000000005111D23F000000003C73C63F0000000036F4BDBF000000405989C4BF000000C038D7BF3F00000040E8D6B6BF000000E00E54B1BF000000000C94843F000000001BA4C2BF000000001A55C6BF000000E096CDCDBF0000000052B08DBF000000C0636ED73F00000000DDF9B43F000000C00799C8BF00000000FCACB73F000000003C2281BF00000000D3BFA0BF00000040CEA1BE3F000000E05B66C33F00000000F20F77BF00000000EC8585BF000000203932AFBF000000008046673F000000E0B6B9CD3F000000C0F779BABF000000A04618AA3F000000002D8EC83F00000040958AB1BF00000000260C983F000000C01E85A03F00000000B4BE913F000000C0F161C0BF000000C0983AAE3F000000A0AA7CC4BF000000406F74B2BF000000008E18713F00000020133BA03F00000000670C9BBF00000060C5FABD3F00000080AF73CBBF00000000E726AE3F000000804BC09E3F000000408116AEBF00000000F9F4B33F000000007E84B0BF0000000047C39BBF00000080362ABDBF00000080697EB93F00000040F8CCD1BF00000060C2B3C83F000000E05C1ABE3F000000605503AA3F00000080C3EFC33F00000040765FAA3F00000040CADEBD3F00000000C8336CBF000000C030D2A8BF00000040AD6ECDBF0000000011D6903F000000E0B6AAC23F0000000002A685BF000000005F1EAD3F000000403E56A5BF, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (61, 7, 0x00000040B0FEC3BF000000C0965DC33F00000020F27A9C3F000000E0D0BFACBF000000201678C5BF00000000A2A3B3BF00000080386CB4BF000000602FC0CBBF000000C041D4B03F000000E033BFB3BF00000000E1B7D33F000000C0A5B3C1BF000000A0EC87CDBF000000A02080BBBF000000E097F8B0BF000000C0A90FC73F000000E0BA8EC1BF00000060DDF0C5BF000000800D1C9FBF00000080A24BA9BF000000C001C6973F0000000043EE8C3F00000080D891A23F000000800747AB3F00000060755AB1BF00000080024DD8BF00000080EC05B2BF00000080DF8AB7BF00000000080DA53F00000000A43073BF000000E0B1189CBF000000409F1DBB3F00000080AD94C5BF00000080ECA9B6BF00000040909AB03F00000080107BBA3F0000000078B9753F000000C0937CA23F00000080B790C73F0000000034F2A1BF000000A03480C7BF00000000801820BF000000E0E5ABB63F00000000B22ED53F00000080D01EC03F000000804BD3B63F00000000D551953F0000008073D2A9BF000000808D66A43F000000406F19CDBF00000040E3A2C03F00000040964AC03F000000A05183BF3F00000000E8B25FBF000000608BB8B23F00000080BA47C3BF0000000000EE463F00000080C9FFBF3F000000A033A1C6BF000000A03805A53F000000E02B30BE3F0000008065EEB1BF00000080D33DA8BF000000A0744AC1BF000000009F2ED53F000000806667BC3F000000E047F4C1BF00000040F02EA0BF000000809770C23F00000020E3F8AFBF000000C09281B9BF000000C0EAD998BF000000803AF5C4BF000000608E52C0BF00000020222FD8BF00000040E7AAB03F000000008312DC3F0000000052B8BE3F000000C07946C9BF00000040C0A79F3F000000801DCB923F0000000037A9953F000000009B64B43F000000003693B23F000000C09CB7B1BF00000000273096BF00000080EB0AB9BF00000000745A713F000000207586BD3F00000040EC0CABBF00000000A418ACBF000000C0E1FFCA3F000000C03607A4BF000000609AA6B13F000000A0EAC89F3F000000C08AD9B03F000000000352AFBF000000E0A0C6ADBF000000800EE5C0BF000000009488793F00000000D1DE943F000000803451AABF00000000444C8FBF000000801053C03F000000408B81C6BF00000000D877B43F0000000012837DBF000000C00AD1973F000000802740A1BF000000803C7DA23F00000000779594BF000000808778B3BF000000804FD7B83F000000C0692ACEBF000000E02EF8CA3F000000807E8EC63F000000202918A43F00000040F08DC53F000000C0BB36B73F00000000B05A58BF00000000CE159E3F00000000750491BF000000404EBEC2BF00000080A208C0BF000000603056B93F000000005816AFBF00000000AE1AAF3F000000E006EDBB3F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (62, 7, 0x00000000C78BC3BF0000006020CDB23F000000407459B63F000000A0676B90BF00000080A34BC4BF000000608F05B2BF000000C073DDB0BF000000002BF8C2BF00000080C222B03F0000002040A1B0BF00000080EBB1D03F000000E0A6D4B6BF00000040C11BD0BF00000020945BB0BF000000C033B19ABF0000004069F0C63F00000060E262C1BF00000020C1F4BEBF000000006F98B8BF000000A0E597B8BF000000C0E882933F00000040BD45863F000000000D03A93F00000040CF9FAB3F00000080186DBBBF000000C0262DDABF00000040C265B3BF000000A005EEB7BF00000080391587BF000000808D7FA5BF00000040A90A95BF000000E001EEB53F000000802006BABF00000020D25EB3BF0000008043029F3F000000202231B03F0000000000013A3F0000000068CDB1BF00000080AB52CC3F000000005069523F000000607CD6C8BF0000000020DA533F000000602333B23F000000E0C051D23F00000040DE22CB3F000000007EE8B63F000000A0E880A33F00000000F20F9DBF000000E0B8FEB33F00000000F1C7D0BF000000403145BA3F00000000B486BA3F00000040939ABB3F00000000407B86BF000000C0C786B93F000000A04A70C0BF000000000A67923F000000C0FED1C23F0000002007A0CABF00000000C7AB8B3F000000C02782AF3F000000C0F3E4C2BF00000020492F873F00000080B5B4B6BF00000080B118D33F00000000D937C33F0000002045EFB8BF00000000B4E77C3F000000804A88C53F00000000BCBEBBBF000000C0AB15B9BF00000020A0D1B2BF000000C06D11C4BF000000A0A97AC3BF000000C09F93D8BF00000080C94CAE3F000000809294DC3F000000E02599C43F0000004048E9C8BF000000805FE9A43F000000408861873F0000008064FA903F0000002014F3BD3F000000A01DCCBC3F00000020E06DBABF000000A05265B1BF00000060E111B1BF0000000010F189BF000000801F42C23F00000000183E593F000000C003D6AEBF000000C06C9ACF3F00000000273378BF0000000030D2A23F000000A06759B83F0000000020B3603F000000002F93AEBF00000020EF22A7BF000000E0456BB7BF000000806A0F943F00000080B373A23F000000C0EBF8B2BF00000020D010B13F000000604B63B73F000000A0277AC9BF000000801149A83F000000403859A5BF00000000A6CD7B3F000000002BB28D3F00000000700D8B3F0000008095CCAABF000000C02B6BB1BF000000C09B9FC03F00000020CD52CFBF000000808D3DC23F000000005FD5C93F0000004007908F3F000000A09E43C93F000000C02B0DB73F0000004080A4A53F00000000D43D8C3F00000000C6AC813F000000A0F856C2BF00000040DBD8A9BF000000803BF3BE3F0000000048B29EBF00000080435FBA3F00000000619DC03F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (63, 7, 0x00000000A248C1BF00000040434CC23F000000C00DBFAC3F000000C034A072BF000000207B49BABF000000400FFBA6BF0000006025AFC0BF000000C0FF31C3BF000000C09619AF3F000000408776ACBF000000009DD8CE3F00000000DF01B4BF0000000097FECCBF000000A005C7B4BF00000040047EA7BF00000080C369C63F00000000B39CCABF000000E09FE9BFBF000000609C45B1BF000000401714B8BF00000000046A883F000000804DFFA13F00000080FC71AD3F0000000096D7873F000000005539AABF000000206756D9BF000000C0BD91ABBF000000407597B5BF00000080284AB33F000000807770ABBF000000009A6D8FBF0000000023F9933F0000002039C2C3BF000000401C33AEBF00000040795BA93F000000600E6EB83F000000806676A13F00000000742A9ABF000000C0C9D0CA3F00000080AF6E88BF000000A06963C1BF0000000096378B3F00000080FD09A13F00000000431AD33F00000000FB7FC73F000000800E45BC3F000000807B2582BF00000000736FA8BF00000040239DB53F000000E0DAF7CCBF000000606AB8B53F000000203D16C03F0000004041B8BA3F00000000F61579BF000000C06E94AC3F000000003AD6C2BF0000000024979E3F00000040495FBB3F000000607FB8C7BF0000008091E2883F000000C073C4AC3F0000000007DAC0BF0000000049C27FBF000000209707A7BF000000400C63D33F000000C0FC5DB83F0000008000C7B7BF000000606D07A9BF000000E04DA3C03F000000802B00B2BF00000040D064ABBF00000020CBA6A8BF000000C0163BBEBF00000040A07CBDBF000000A092AAD6BF00000080AC76A93F000000A08954DD3F000000C0BCE7B83F00000080207ACBBF00000040EEC6AE3F000000409C4E8E3F00000000837987BF00000040396CBF3F000000A0343BBA3F000000C0E88CBEBF000000403AD6A1BF000000E066EBBABF000000005414923F0000006050CDC03F00000000B4E29BBF00000020E753B3BF00000020134AC73F000000C0F1CDA3BF000000C02CF3B63F000000A08B6CB53F00000000FB3F953F000000C02A3CB1BF000000006527A3BF000000C02947BABF00000080609F99BF00000080E345B53F000000E015E8AABF0000000015A59A3F000000801292B93F000000E07812C4BF00000040401FAD3F00000000E0D384BF000000001A2D74BF0000000049009C3F000000002AD39C3F00000060A6D9A8BF00000040959FB3BF000000200472C33F00000020131FCFBF000000A08DAECA3F000000A0EF04CB3F00000000F8BA5A3F0000006057F9C83F0000006019EEB63F000000008001AD3F00000000C8A9803F00000000822FA13F000000203225C1BF00000060EDE9B7BF000000802CE3B03F00000000A08482BF00000000AE60BA3F000000C0140BB73F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (64, 7, 0x000000800D02C3BF000000C0FFC5C23F000000A0024EB23F000000405F1CA3BF00000080C122C5BF000000C0C3CAA4BF000000C013ABBEBF00000040079CC2BF00000000E5F3B43F000000605F2EB9BF00000060C95FD03F00000080B2EEB4BF0000000015B2CFBF00000040F5F4A8BF00000040FE8FB4BF00000080F3ECC63F0000008005A9C3BF00000060BBC2C0BF00000020216FB5BF00000000A23FB8BF00000080FD80893F000000007F9AA83F000000600FDCA13F000000800425A53F000000A09F26B0BF000000A06491D8BF000000200B98B1BF000000C01AB0B1BF00000000B8FCA03F0000004047A7B6BF000000C0E02EA2BF000000404813B23F00000000750BBFBF0000004019B5B0BF0000000044C2973F00000080F2EAAA3F000000006CA97F3F0000000077F29DBF0000006089FBC83F00000000B98387BF000000A0F1BAC3BF00000000FA55813F000000403EACA93F000000400440D43F000000C07315C83F000000009F54C03F00000000FA208A3F00000000FD61A5BF000000C0F48EB03F000000C0BD03D0BF00000040B23EB63F00000080C6A3C13F000000A0766DB53F00000000963D90BF00000080A860B23F000000E0E099C3BF00000000D0D87C3F000000C01303C03F0000000050F3C3BF000000400747A73F000000E0FB5DB33F0000004051E3C3BF000000C0B9A288BF000000202A79B4BF00000060D007D43F000000A0EF27BF3F000000A09450B9BF00000040E71799BF0000006037B2C23F000000406D0DB8BF000000E0E20AB7BF0000000038EDB2BF0000008099F7C1BF00000040006BC0BF00000080F896D5BF00000000FEB5A73F000000801610DD3F00000080C86FC43F0000000069FCC7BF00000040C1BDB33F00000080F09D8A3F000000C0EFB3943F000000E0BF4ABE3F0000006081ABB93F000000E07095C0BF00000080B3CAB1BF00000000F4B3B6BF00000000EA17863F00000000F079C23F00000000D3FB8BBF000000A07EB1B1BF0000004068A4CA3F000000C01F459BBF000000C02EA3AE3F00000020065AB33F00000000C03A28BF00000020EE44B3BF00000080BFC1A8BF00000040C471B5BF000000000A44803F00000020DDE4AB3F000000A0FF3DB2BF0000000060A39A3F000000803B4FB93F000000C027CFC3BF00000040AA0BB13F00000080AA94A0BF000000A0BE719B3F000000006ED28A3F0000008050BBA63F000000604E2AADBF000000000BABB1BF000000C02265C23F000000A07B80CCBF00000040D85CC93F000000C0B105C93F000000A02BE58E3F000000C03236CA3F00000080451EC03F00000060FFC4B13F00000000360E9D3F000000009FE1983F000000803113BFBF000000A07C88BBBF000000E02B52BC3F00000080AE54A2BF00000080CC8AC03F000000A0F0B4BB3F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (65, 7, 0x0000004051C1BDBF000000800483B03F000000808E96AE3F000000408937B1BF00000000F931C4BF00000000160D97BF00000040B861B5BF000000A06390C2BF00000040F300B93F00000020D526ADBF000000E035DDD03F0000004034498CBF000000A073EAC8BF000000A0BF84B5BF0000000088DA83BF0000002002C6C43F000000006428C9BF000000C08297CBBF000000408D22993F000000009DAAA2BF000000803BF37E3F000000C072539C3F000000A0E454973F000000002614B23F00000040AA15C5BF00000060634ED4BF000000A03FF6B7BF000000404198B5BF000000C05077ACBF00000000EF82A2BF0000000097B661BF000000409E7CB53F00000000F2ECC5BF00000080BE5296BF000000A07FDFBB3F000000404018B63F0000000017DC8DBF000000007AD777BF000000403DC6CC3F0000000010AD903F000000802C67CDBF00000080804BA33F00000080FE07B43F000000400C9ED43F000000C0D536C53F000000C05D6BA43F000000001BF79CBF00000000D4BAABBF00000060EE4EB73F000000C03D39C9BF00000080CF02C13F00000060434CC93F00000040225BC33F00000000CADB713F00000000CDCF903F000000A06249B2BF0000000090647DBF000000A02873C43F000000A05801CABF000000C0FFFC9C3F000000E07DB0B63F000000C08DEEBEBF000000800C08793F00000080A05FC3BF00000020D746CC3F000000E0561ABD3F00000040907BBDBF00000080EA88C0BF00000000A694C13F000000802A47B1BF000000C0D3D6C7BF000000809DDA8D3F00000080907FC6BF000000000947C9BF000000205564D3BF00000080A283A23F00000060881BD83F000000603665BC3F00000080D727CCBF00000080FCA6AA3F00000040BDA3893F000000604857A2BF000000009427873F000000C09F3DB73F00000080E189A8BF000000001DB2823F000000A07A07ACBF000000007B04983F000000001089CB3F000000809D45A0BF000000001F299EBF00000080BE1ECC3F0000004066E298BF0000000058FB953F000000205156B33F0000000095B6A03F00000000780E633F00000020D3939D3F00000000C049C7BF000000006C4D92BF00000000A79E9CBF00000080E501ABBF0000000011C09E3F000000E0503CBB3F000000C06727CDBF000000C08163C13F000000807A1A953F00000020D630A2BF00000040D730A9BF000000006A8DA23F00000080F0DBB5BF00000080B207AEBF000000C09A21C23F000000C0BDAED1BF000000C05D51CF3F000000C0103CC53F00000040C220B83F000000C04B77C33F00000080EA85AF3F00000000A99B963F000000006A678CBF000000C0064AADBF0000002012D0C2BF00000040EC15B7BF000000C06E45C03F0000000073D7A2BF00000080F7D1C03F00000040CC60B93F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (66, 7, 0x00000080E339C4BF00000080E05ABB3F00000080684BB23F000000C0B83DA3BF00000020D1B7C1BF000000C079BBAEBF000000C04C63BCBF000000A02022C4BF000000C00017AB3F000000C01BE6B3BF000000403651D03F000000603592B4BF000000604332CEBF000000C0B587B8BF000000C02B45B1BF000000C06CC9C63F00000000F36ACABF00000060F06DC0BF00000080CAED9BBF00000020D161B8BF000000C0DE04A13F0000000061C8A23F000000206403A43F00000000B16EA23F000000A0B2A5BBBF00000080C3B0D7BF00000080C512B1BF000000C0CF26B2BF000000C06CD7A13F000000005BD4A1BF00000040EE3393BF000000808C05AD3F000000606B17C1BF00000040A2E2A9BF00000080DA6EA43F00000060F400BA3F00000000979785BF00000000CC63A9BF000000C09C4BC83F00000080F08C98BF000000004F58C4BF00000000B08A5C3F000000803F47B53F000000C0E99FD43F000000A07055C93F00000040E029B93F00000000B31D8F3F00000080A008AEBF000000009139BD3F000000C036C0CBBF000000205BAAB33F000000400B94BC3F00000040507EB93F000000008326A0BF00000040E1EAB03F00000020C355C1BF000000007BB5A03F00000020D57CC73F00000020C521C7BF00000060D600A83F000000E01FF8B23F00000020F607C6BF000000C088BE8A3F00000040EBA2B1BF000000A07244D23F000000E0F071B33F000000A08CCAB7BF000000204BE6ACBF000000202677C23F00000000F43BB8BF000000C0FEF7B9BF0000000038409ABF000000C013CFC0BF000000E0DFB0C2BF00000060BCFDD8BF00000000B49F9B3F000000803473DB3F000000A09D68C13F000000C09809C4BF000000C051FAB53F00000020C056A43F000000C004DB9B3F000000600A3EC53F000000004762BC3F000000000348BEBF00000040A01CADBF00000040D72FC2BF00000000E24A84BF0000008067B8C63F00000080ECC790BF00000060DE7CB2BF000000A0C9FAC83F00000000275992BF00000040E470AA3F00000040A365B33F00000000FA1385BF00000060214FB8BF0000004069B590BF0000006069EBBCBF0000000046319BBF00000080D720AF3F000000006AA0B2BF000000001D64A53F00000000A6E6B93F000000808E8EC5BF0000008097B6A63F00000000D6A18EBF000000C06CA5993F000000009A808E3F00000000AE388CBF00000040FE2BB5BF000000803C73ABBF00000060DF1AC13F000000404CD1CFBF000000808500C63F00000040092BC93F000000A01703B13F000000C01BCFC93F000000E05DAFC23F00000000D8CF963F0000000080DF7ABF00000000E07A50BF000000000D4EC2BF000000C0DFB7AEBF000000C01BE7BC3F000000C0EE08A2BF000000C0FB97C53F000000209614B83F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (67, 7, 0x000000C0B361B2BF00000040FCA0BE3F000000C06C24A93F00000040B0928ABF000000E04814B7BF000000C029F7A6BF00000060361DB5BF00000080D9C9C2BF000000E05501B33F000000E03754B2BF00000080941FD03F00000040A0F5BCBF00000000B21FCCBF0000000024C9903F000000A098DEB0BF000000E03CDFC63F000000002912CABF000000C0D726BCBF00000000B2B8B6BF000000C089D1ACBF000000C0A5F4B23F00000080BD67953F00000080C01B9B3F000000C0A2F8A23F00000040C1D4B4BF000000802164D5BF00000060D6E4B3BF000000E039DEA3BF00000080592CB03F0000000068A7793F000000005A4AADBF0000000068B39B3F00000000B492C5BF00000020A26DAEBF000000C06D8EB03F000000002207B43F00000000DDC889BF000000608BFEB6BF00000080F23FCA3F000000805F418EBF00000080AF3AC4BF0000008004E7A63F000000A0D654BB3F000000E0752AD03F00000080A5ABC53F000000806F51C03F0000000002EA513F00000040A486B7BF00000060F9E3B83F000000E01D65CCBF00000000E416B73F000000007FE8C03F000000A01439B73F000000A036C7B13F0000008077B99B3F00000080CFCEC5BF000000003719AB3F000000609C47C03F000000C075A0C1BF00000000CC30943F000000200E22B93F000000401AF1BABF000000A06CE1A53F000000805D8DB4BF000000000A5DD33F00000080D534B33F000000407FB5BCBF00000040D0C1A6BF000000C02C26C23F000000E02F5EB2BF000000406991B6BF0000002049D3B1BF000000802A3FC2BF0000002062ABC0BF000000804B7DD6BF000000C0AF08B13F000000004BA5DD3F000000E06138B73F000000C0CCF2C5BF000000201C2EB23F000000C037A09F3F0000000018457BBF000000806DF3BF3F00000020C577C03F000000E008E8B9BF000000C06E0AA8BF00000000C1F2BBBF00000000A0787A3F00000060793ECC3F000000407AE3A8BF00000040BAF4A6BF000000C0584FCA3F000000404CBE9ABF000000C05084AE3F000000E06A3BB23F000000004FD9A63F0000006002CEB8BF00000040CB1192BF00000020792BC1BF000000006D8B993F0000008002C0A23F00000060049DACBF000000004FC290BF00000040CC35C13F0000004071A0C4BF00000040BDF4A93F000000001C5B97BF00000000BCF091BF00000000BBC4903F000000001F91953F00000020C031B8BF000000E06726B7BF000000806B30BD3F000000007240CBBF00000040ED64C63F00000080D3B1C63F00000080107DB33F000000A0148DC43F00000080682CBE3F00000000BC76B73F00000000B1D2A23F00000000B09BAC3F0000004022D6C8BF000000C07E87B6BF00000080750CBC3F00000000900252BF000000C0CDD3B43F00000000A3D2B93F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (68, 7, 0x00000040A236BEBF0000000097A9A13F00000080D246B93F00000020A28D9CBF000000806347BCBF000000C0C78EADBF000000A0C15AB5BF00000080D074C2BF000000801A1AA73F000000C03874C1BF00000020ADB0CD3F00000080F1BAB5BF000000C0659ACABF000000A01FBDA1BF000000803B3A8BBF000000205C76C53F000000E07532C0BF000000C06809B8BF000000804F4BB5BF000000C01CA8B2BF000000409938A93F0000000016FA9C3F000000A07F7BA63F00000080281E903F000000C0DFADB2BF00000000D299D8BF000000C03D94B9BF0000000040C2ACBF00000020244D973F00000000D4B579BF00000000D0CFA0BF000000C0C924AE3F0000004010D0BCBF00000080B9149EBF000000800C96983F000000802CCBA63F00000080CA09A03F00000080381FB1BF0000004012F1C53F0000006001139DBF00000080ABCAC7BF00000000963B86BF000000007DA3B53F000000C0BC7BD03F00000040F77BC53F00000000BE63B73F000000802DE4A33F00000040FAB4B3BF000000C0F46DB73F000000A0C679CCBF00000000FD39AF3F000000204031AE3F00000020CDEEB53F000000005C3E79BF00000060EB35B53F00000080C229BDBF00000000FDBFA23F00000020482FC13F00000060607DC1BF000000C091B5A83F000000E0DEC1AD3F000000003E20BDBF000000C0B6647EBF00000060EEB7B7BF000000803FE0D43F0000000023C0B73F00000080D5B2C0BF000000607813A1BF00000060F8A4BD3F0000004053F9B3BF00000080BC26B3BF00000020F8C6A8BF000000C0DF8AC5BF000000C0F742C0BF000000804D54D6BF00000080915FA43F000000C0B808DC3F00000080CA23B63F000000402E82C8BF000000C0F28FAE3F00000080AF9D7DBF00000000F18E9C3F00000040D4C6C33F000000007195C23F000000008C93B4BF00000040B63BAEBF000000E0043EB0BF00000000EC5F803F000000601160C83F00000080F2FCAFBF0000002089339FBF000000405B39CB3F00000080B0729DBF000000009A88A93F00000060ECB19A3F000000806FE49F3F000000E0D84EB6BF000000C0125D92BF000000E0BFE6B5BF000000004F55803F00000080829EB63F000000201F96A9BF00000040C2D8A73F00000060EB40C03F00000040D886C9BF00000080CCDDAC3F000000C0EEF5A5BF0000000065BD8D3F000000206DF6BB3F000000004636923F00000080F93CB1BF0000004060F2BABF000000C067E2B73F000000A05082CCBF000000E0D750BC3F000000C060DAC93F00000000DA019D3F000000C02FAEC43F000000804F73B53F00000080A140B63F00000000AEFE893F00000080BB01AE3F000000006438C6BF000000C0D54699BF0000008042CAC03F00000080284590BF00000080D5A0A83F000000405EB3B03F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (69, 7, 0x000000C0EFBEC0BF000000A04DD1AD3F00000080BD1A9A3F000000A0B74A8ABF00000080FE53C1BF00000060B36BB2BF000000404636B2BF000000005FAFC7BF0000008062FDAE3F00000000E799BBBF000000001078D03F000000800A67BDBF00000080B0F7CCBF000000801053BCBF000000202ADDA8BF000000609DFCC93F0000004035DFC2BF000000A07BC5C2BF00000040FA9EA9BF000000C03485AFBF000000408F539C3F0000006031A582BF0000004036D09F3F00000040DF6DAB3F00000000692BA8BF0000004020B7D8BF000000C038F3ACBF00000080E992BDBF000000606828903F000000008A6495BF00000060396EABBF000000C0879DB13F000000802576C6BF000000E0C8D1BBBF000000C06803A63F000000C0CB42B43F0000000052C99D3F000000802156963F000000C01A3ACB3F00000000F3167EBF00000040FE76C9BF000000002C638FBF000000605C69B43F000000002B9DD33F0000008068C6C13F000000805501BA3F000000C0284D713F000000808B5CAFBF000000C0F7CFB53F000000C020A9CCBF00000060A74AB73F000000802375BC3F00000060872DC23F00000000480D98BF000000C0692CB03F000000603A75B5BF000000007200973F000000E0E9D3BF3F000000C05342C7BF000000006A66A63F0000004077CBBC3F00000020F427B5BF000000E0A1A29CBF000000A03742B9BF000000C021A5D63F0000008017DBB13F00000040768ABFBF00000000CA898CBF000000C0C1A4BE3F0000002040E8B1BF000000E0B38AB8BF00000060BDDCADBF000000C07427C1BF000000809786C2BF0000004037D6D6BF000000807929A93F000000C052E0DC3F000000C04CB8B83F00000040CCF0CABF000000806F06B33F0000000080849EBF0000008041CE97BF000000C0F7E0C33F000000200BEBBB3F000000C0AFC592BF00000000B5FF89BF00000060326CADBF000000008A6281BF000000A0085CC13F00000060B50FB1BF00000040760C74BF0000004079D5CA3F000000805F83ACBF000000407C3FA93F000000E031FAA03F000000407FDEA13F00000000B7A4B3BF0000000030DD65BF000000000C78BABF0000008042CF91BF00000080B8D2B13F00000060F880A3BF00000080C06CAE3F0000004039ECB33F000000E0177EC9BF0000008095F5A23F000000006D319EBF000000002A979A3F00000080F0A3B23F00000000D686973F000000002C63B0BF000000E0BB8BBFBF00000080DEE3B83F000000400C4CCFBF000000A01D84C73F000000C0C17DC63F00000060D6AC93BF000000009284C23F000000200186B63F00000080AF0EA93F00000080541C9A3F00000000A4C6813F00000040081DC7BF000000604EAAB3BF00000060AB5EC23F00000000DA3BA0BF000000405D1EB43F00000060800DB13F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (70, 7, 0x00000040EE0DB9BF000000C07B4FAF3F00000040531ABE3F000000603EDDA3BF000000406ED3C2BF0000000080879CBF000000003AEBBBBF0000006031BEC1BF0000000062328D3F000000407CE3C0BF000000408707CC3F000000E07DC8B2BF00000000DFE1C9BF00000080886DADBF00000000827B90BF0000006019E8C63F00000080E5C2C3BF00000060810AB9BF000000C01C16B7BF000000809E5DAFBF0000000056B39D3F00000060CB4EA53F000000C085BFA83F00000000C2DB78BF0000000040D0B3BF00000080E0C2D8BF00000000A06FB8BF000000A06458B3BF000000601C967E3F00000000D4EF95BF00000040289BA7BF000000005949A63F000000C05217BBBF0000008034F099BF00000040EDA0A03F00000080784DA33F000000C08D8CA03F000000A0B2A5B0BF000000008519C43F0000004055EF9ABF00000040BE3DC8BF00000000EC908F3F000000C034F2B53F00000040FC1DD03F0000000041C4C73F00000000E129B73F000000A01838A83F00000040201AB1BF000000E07F07BD3F00000000B8D9CABF000000C0FB49B33F000000E00C37B33F000000C034FDB83F000000806E1D94BF0000004050E8B73F000000C0A261BDBF000000003569AA3F000000A0AB77C33F00000080D4B1C1BF00000000A6D8A73F00000020C3BEB23F000000A02528BABF00000000B6CB893F00000000002CB0BF000000205379D33F00000040F6CDB43F000000A09EEFBDBF000000800849A7BF000000203245BF3F000000802335AFBF0000004029B4B1BF000000C05630B0BF000000E03C80C8BF000000C074FDBFBF000000C07B4FD6BF000000808071A33F00000080EC44DD3F00000060EB5BBB3F00000040FA17CABF000000605A7AA43F00000020402586BF000000C0690F9C3F000000805C37C33F000000E07CA3C23F00000060112EB8BF000000007A88B1BF00000020054CB3BF00000000BB44933F00000000FF82C63F00000060A96DB0BF00000060A4A393BF00000000CFADCB3F000000802AC987BF000000C02F75A03F00000000F3669F3F000000001A2D7A3F00000060CC49B7BF000000007F8088BF000000408005B5BF00000000CE2F843F00000040E55DB13F00000060917AB2BF000000C0A4BDA43F0000008092DEC23F0000004036F9C8BF000000000C9EA73F000000C073F1AABF00000080500E8A3F0000008006BFB33F000000003567913F000000E0506CAEBF000000002445BBBF000000C054C0BA3F000000C0C937CABF000000207308B93F00000040CFC0CB3F000000C007B8963F00000040AD85C33F000000000758B83F000000C0A652B73F0000000080DB873F00000000FF78A73F000000004220C6BF00000040CDCAA1BF00000040051AC03F00000080470F95BF00000080F4F7AB3F000000809BCCB23F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (71, 8, 0x00000000E29CC0BF000000800F19AD3F000000806A05B33F00000040601BA4BF000000401EB0BABF000000A0475BAFBF0000006040D0A0BF00000000B1CBB3BF000000C040CEB53F000000C054DDB3BF00000080B9B7D43F000000C0DD08BBBF000000A03209CCBF00000080DC9AB0BF00000000BAE293BF000000402D22C93F000000602AB5CCBF00000040C6E3B5BF00000000AA5D7EBF00000000D0956E3F000000403156BF3F0000004034AEA0BF0000000042CE80BF00000080AFBCA63F00000080D6DAAEBF000000208561D8BF000000C07839B1BF00000080E5C0B5BF000000E00B6EA53F000000C060E0B3BF000000E02B7FB5BF00000000903D53BF000000C038DBCABF000000E0902DB1BF0000008050CD9ABF000000803DD88B3F000000408D14A1BF000000C0755FB4BF0000000004DEC73F000000C02BBCA63F000000E041F3CBBF000000001F86993F00000000335882BF000000A03CABD03F00000040E727C03F000000203CB1AE3F000000C05E4F9A3F000000C0EEC9B8BF000000C04020AC3F0000006029D1C4BF000000001F53AC3F00000000F3DAC13F00000080936CBB3F00000000182E863F000000C09C63A3BF00000040FDE7B8BF0000000028CB87BF000000E07AAEBC3F000000C07F0FC8BF000000C0C2B3943F0000000008EBB73F000000603C3AADBF00000000866C61BF00000060D0D6BFBF000000C0B8FED03F00000060D468B03F000000C07CFDBDBF000000804609BCBF00000040C480B33F000000C0A822AABF000000206BC8B3BF00000040832B993F000000405D9DC6BF00000040AA4BCABF00000020B4D6D2BF000000C0BB66B53F000000C00C1CD93F00000060A412A73F000000C0C73CC7BF000000005F97983F00000040E99FB0BF000000A07A82B0BF00000060EC65C23F0000000039C4C53F00000040904C9A3F00000000A599A53F000000C06D3BB0BF00000080101CA43F0000002052E7C33F000000C08694B9BF00000020A76597BF00000080D60DCB3F00000020B3A1A3BF00000000833F9C3F000000E0017765BF00000000C3018B3F0000000089FAA6BF000000C0D0D4A93F000000009081B1BF00000040C290A2BF000000809158A33F000000403D90A5BF00000000F0F992BF000000A02D20B63F000000602E96C6BF0000008029A5AB3F00000000F0B28A3F000000005057343F00000080DCBA9E3F000000801533A3BF00000040F1C6B3BF00000000AD06BDBF000000606654B23F000000E0181CCFBF000000C089B3C63F000000002FB8CB3F00000060E6DFB43F00000020C13FBC3F00000080CBE7AD3F000000C08B0DA03F000000001C166A3F00000000906F543F00000040F481CBBF00000000D8809B3F000000E05697C23F000000806C819B3F000000806960B63F000000006F2088BF, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (72, 8, 0x000000A07B6AC1BF000000E060DFB33F000000C0E1EBB13F000000403A71B6BF00000040B6EAB8BF000000806B2CB1BF00000080DFF0A3BF000000A0FFDEC0BF00000080003AB53F000000403D18BFBF00000020E865D03F00000040E083B4BF00000040700BCFBF000000600536BBBF000000000FA9A1BF0000000011AFC43F000000406B45C1BF0000008065F9B7BF00000080EDE2B2BF00000000000960BF00000040A9EEBC3F000000404B6183BF000000009542AB3F000000C0799BA53F000000E006D5B4BF000000C04409D8BF000000605553BBBF000000808EE7B2BF000000C08194B2BF00000000B4AD9ABF000000202005ACBF000000C00863A63F00000040AFC5CBBF000000E0455DBABF000000006ECA72BF000000805FF6B63F00000040BA6FA1BF0000000075809CBF000000C07B72C53F00000000C60886BF000000C098F0C8BF00000080BDA5A23F00000080FF73A33F00000040A6BACF3F000000009FE5C13F000000602E78B83F000000C06E7DAA3F00000080E2C6BDBF000000408921BE3F000000A07165C7BF00000000E758BC3F00000040D90BB73F000000E088CABD3F00000000332489BF000000E035D5B33F000000C075C1C0BF00000000FB42A63F0000000008E0BD3F00000080AD01C1BF00000040041B85BF000000808953B43F00000040821BB2BF000000E09453AABF00000040F507C0BF000000E03B48D13F000000008C48B73F0000008019FABABF000000805191BCBF000000401BCAC13F00000040017AA5BF000000808DFEA6BF000000C0CF16AD3F000000209DC8C6BF0000006018EDC2BF00000080CD6BD2BF0000008021BAAD3F00000000BF96DA3F000000A0A778B33F0000002029DAC8BF00000040371D963F000000C0C676B6BF000000009037763F000000407981BE3F000000E02690BC3F000000000B3B8FBF0000000044DCA53F000000C024BEB9BF00000080CA63AB3F000000A03B54C33F00000020FAE9B6BF00000040D52EA5BF00000060A098CC3F000000000FFD753F00000000933FAF3F00000060B15E9B3F00000000B3BC9CBF000000807B7DB9BF0000004013E1A93F000000E07BE1BEBF00000000F0AC443F000000800872B93F000000C0B8509DBF00000080E77A9EBF00000040AB56B83F000000804F65C5BF000000E0512EB33F000000402ED8A5BF000000009C839B3F00000000E892933F000000C0BF0BB0BF00000080D27FB9BF0000004035DFB0BF00000060BCBFB13F00000060DA56CFBF000000404B2AC23F000000E02239C23F000000205B927ABF00000080C3C6BE3F0000004096E2B83F00000080B6E3AD3F000000006DA7863F00000000A84F68BF000000606F26D1BF000000005A0C93BF000000C092CBC93F00000000EF22813F000000C0DD8DBB3F000000009B4F873F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (73, 8, 0x000000C0463DC1BF000000006DFFB53F0000008049BDBB3F00000060ABAEA5BF000000804A35BDBF00000040FD6CB0BF000000E0EFDDA8BF00000000AAC9BBBF000000609219B63F00000000E014BCBF000000204E56D23F000000C00385B1BF000000409EB4CDBF00000060096FBABF000000203636A0BF00000060BF4BC73F00000080E659C4BF000000A0F73BC1BF000000402612B7BF00000000280E703F00000040CE72BA3F00000000D1545F3F000000C01520B03F00000000D420863F000000004AFBA1BF000000403DE6D9BF00000020D41AB7BF0000004053A9B1BF00000000082F833F0000008077FCA9BF000000402759B0BF00000080DF9D933F000000E0BB21CFBF000000C022D2BCBF00000000B3A286BF000000C033AFAF3F00000000244589BF00000020EF97B0BF00000080E8BAC63F000000005C298EBF00000000FF54CABF000000003C89983F000000006A5B9B3F000000A07217CE3F00000040211CB63F00000080CBE6BC3F0000008038B8B33F00000080D361B6BF000000201774B93F00000020FF17C3BF000000E03E63B83F0000008028AAB83F00000000E33AC53F00000000416892BF0000004043F2AB3F00000080A79FC3BF00000000E217943F00000000A7FBBD3F00000080CD6CC0BF00000000BC36793F000000A01160B63F000000E0E220B0BF00000020F5D68ABF000000E06D21C1BF000000603CB8D23F000000807C0AB13F000000405467B1BF0000006075CEC0BF000000C0EF19C33F0000000066DC87BF000000C0EF5CAEBF0000008083929C3F000000206D39C7BF000000400AD1BFBF000000E0C383D2BF000000C0AE26B03F00000080A4FBD83F000000E0C941A23F000000004C37C7BF00000060FF389F3F000000A09A34AEBF00000000E82555BF000000C027F3A93F000000409796BF3F000000201813AABF00000020EB8BB73F00000000AA24C0BF000000807708A23F000000C0EC7AC53F000000C0800CB8BF000000A07508A1BF00000020E7D8C63F000000006A6679BF0000004053ADA63F00000020913A983F0000006002B1AFBF000000004FAEB6BF000000409BACAA3F000000E083CDBEBF00000000C26B843F000000A09E09AC3F000000C020BD88BF00000000DC96A5BF000000E0E932B33F0000000048C1BFBF000000009CF7923F0000000010F2AEBF0000000098CC52BF000000409D91A0BF000000800945A0BF0000008022A7B9BF0000008044A8B9BF00000080C9A6A93F00000040B767CBBF000000006D8AC53F0000008060A9C53F00000040AACDA03F000000E0CBE4C03F000000C09386B93F000000408BFAB23F000000007AF8963F00000080C7D8A03F000000405293CEBF000000C0BA37ABBF000000E065D7CA3F00000000AC557C3F00000080E3CABA3F000000C00482A33F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (74, 8, 0x000000A0B5CDC1BF000000209EACC13F000000401563B23F000000007F7DA6BF0000000064E0BBBF000000E08D1BB1BF000000C07448B2BF000000C0582DC5BF000000A0EFCBB73F000000207C44BFBF000000C0BD5BD23F000000600AF9B0BF00000040D5E5CBBF000000C0ADB6C6BF00000080DC0CA7BF0000008098BBCB3F00000080B328C6BF000000209A63C6BF000000800285B3BF00000000B439823F000000400AF0B23F00000080CC8F70BF000000606524B73F000000007C1E773F000000A01627B0BF000000405E4EDABF00000020DCFEB0BF00000000330EB5BF00000060EB548E3F000000807C87A7BF000000C0AA8DB3BF000000E02A4EA23F00000080BBFBCBBF000000400479B9BF0000000008E1933F00000040111DBB3F00000000F8E457BF00000000BEFC9CBF000000C0D1CFC83F000000800C3E93BF000000E08A84C9BF00000000AD4A913F00000080B7D0A13F0000008006BCD13F000000001EA6C23F000000406B37B13F000000004246B33F000000409B47C1BF000000605145BC3F00000040CB19C1BF000000C08E7EB63F00000000AFC7B63F000000006479BE3F0000008042BA91BF00000020A528B43F000000408D6CBEBF000000007E48A03F000000E0CF16B23F0000004097CAB9BF000000A0509FA1BF00000080C894C13F0000000070CAB2BF000000202F61B0BF000000207480C1BF000000E03116D03F00000060A2CA903F00000040E4DBAABF00000080DCF3C2BF00000040C815C33F00000080717D93BF000000204303B5BF00000000980A943F00000040A778C5BF0000002085B6B8BF000000A08F03D6BF000000001812743F000000209556D63F000000C0C411B43F000000A095E6C7BF000000404DD0A23F00000000FCECA2BF00000000540C8A3F000000404263B53F000000000715B33F000000203501A4BF000000A0FB40B23F000000600D50C5BF000000008FF0AF3F00000020AA46C53F000000809E38BABF000000601EFD98BF000000E0311DC33F0000000054B665BF0000008054C2AA3F000000E07199973F00000000BC139CBF0000000079E6B9BF000000E0E5B9B13F00000000129BC6BF0000000006CA74BF00000020845CB83F000000A0B983903F00000000B1458EBF00000020B66FB63F000000A01F0DC1BF00000080D943A23F00000000B287A1BF00000080FE538C3F0000000064DE99BF000000006AC4ABBF000000E042AEBFBF000000805611AEBF000000807E67B13F00000040B9AEC5BF00000040710BC73F000000A04718C63F000000604539B03F000000C01945B93F000000C0B774C23F0000000035719B3F0000000016C595BF00000000F0A8653F000000807FF0CEBF000000C0DC76B1BF000000A01650C43F00000000DEA2883F0000004008EFBE3F000000C06D16AA3F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (75, 8, 0x000000007E32BEBF000000003C46953F00000040C1D8A83F000000009D03B5BF000000407432B6BF000000C06E98BABF000000A05D32A0BF000000C05325BFBF000000C0A9DEB23F00000040A623BEBF000000806556D03F000000C0F2E2B6BF00000060D368CBBF000000C02450B7BF0000000051738EBF0000002080DAC63F0000004064E7C4BF00000000CFD2B7BF000000A09E49BDBF00000000F9B391BF00000040F1B2B53F00000060AB61A1BF00000000BAD39B3F000000404F2EA63F000000001719ADBF000000A0D753D7BF000000E0E343B7BF00000080528AB3BF00000060A3898EBF00000000EAC5A1BF000000605488B2BF000000002C43B23F00000060425DC9BF00000080BAC9C0BF00000000F4E37DBF000000004BADA53F00000000E03D41BF000000C0B34DA4BF00000080CBC0C53F00000080D7C5783F000000804D13CBBF0000000096AA883F0000000054ACB03F000000A041E5CF3F000000805CADC13F00000020D05FB63F000000C0BCE7B13F00000080EDBABABF00000040C7D8B93F000000A05CD5C9BF000000A0E064B23F000000C0CCC5AF3F000000E0AC18C03F00000000B41B61BF000000802BF4AC3F0000008096D6BFBF000000008745A43F000000A03D93B43F00000000ABE2C2BF000000E06683933F00000080C918BC3F0000008079F6ADBF000000008446AFBF00000060492CBBBF0000004080F9D23F000000C06485B73F00000080AD28BBBF000000405BA8B6BF00000020DDACC23F000000E0A1559EBF0000008083D8ABBF00000080462E893F000000005C89C4BF000000602BDCC2BF000000A03B4DD2BF000000808551AB3F00000080100DDB3F000000407E1AB03F00000040CCEEC8BF000000A05C07A63F000000805BFCB8BF0000000040FC92BF00000020CA50C23F00000040349ABD3F00000040009894BF00000040C573AE3F000000C03FBDB2BF000000807C19B03F00000000F07DC33F000000A0F68DB7BF000000409E5291BF000000005910C93F000000007E528B3F000000C07050A33F00000000BECBA13F0000000033448D3F00000020E74BB8BF0000008083B0AB3F000000A04FB7C1BF00000000D0E3723F00000060467EC03F000000C0DFD889BF00000000B2C68D3F00000040D2E2B43F000000400A48C0BF00000060B1A4B13F000000009F8C98BF0000008076658A3F000000801087A53F0000000059D69CBF000000C06BCCB3BF000000C04626BCBF00000040BC8BA53F00000020A02DCABF000000C0F170BE3F000000E0E184C43F00000000BB72893F000000401725BB3F0000008094F8B43F00000040A379B13F000000808D059B3F00000000B58F973F00000080DC03CEBF000000E0A9CC86BF00000040F496C83F0000000008809D3F0000004002B6B53F00000000CC7F943F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (76, 8, 0x000000E0D9D3BCBF000000E089CDAE3F00000080D1BCAE3F000000608A3DB2BF0000008014D0B0BF0000008031A1AFBF000000C082DE93BF00000080D31EBBBF000000E0146EB73F000000406B25BFBF00000080E483D13F000000C0B7AAB4BF0000002001B2CBBF000000E0A9CDB7BF000000809D9A9ABF00000080B08AC53F00000020EA7AC4BF000000C039DABBBF000000C07561B6BF00000000E01E45BF00000000A564C03F00000000747E3C3F000000C0A3C4963F00000080003E9B3F000000E02DD9B0BF0000000089A6D6BF00000080AD3AB3BF00000040A256B3BF00000000D17680BF00000080BF41A8BF00000000CE8DAEBF000000603122A83F000000406396CBBF00000080D1E5BBBF00000000888C533F00000060E2F0B13F00000000A878A2BF00000000BAF8A5BF000000405290C63F0000000008254CBF000000E0C7ABC9BF000000004ABB963F000000805FCDAA3F000000C0F950D03F000000C05A55C13F00000020F670BC3F000000601BADA03F00000040628BBEBF00000000BE18BB3F00000000403EC6BF0000004048F4BC3F000000A01CABB63F000000800AE0C13F000000803109933F000000405B46B03F000000203F3EC1BF000000002FABA33F00000060934AB63F000000801E81C1BF00000000F285623F000000006C28B93F000000207AC7ACBF00000040E97680BF000000A0E057BCBF000000A06AF9D23F00000060F937AE3F00000020C4A1B9BF000000C01FA4BABF00000040DD98C13F000000E041339EBF000000E07A4BB3BF00000040D62AA03F000000E0BF43C6BF00000060579FC0BF000000C06E7CD2BF00000000B5F4B03F000000C08A5FDA3F00000000571AAC3F000000E03FEEC6BF00000020573CA53F00000020935FB1BF00000000D87996BF000000803884C13F00000040504DC13F00000040DB9F95BF000000C089CEA03F000000E03146B6BF000000804C88A23F000000002411C53F00000080C3A2B5BF00000080A037ADBF000000806EEAC63F000000C02B7390BF00000000D9AF9E3F000000A0AC619B3F00000040AE0CA1BF00000080E897BABF000000C075D7AF3F000000C0AD45C0BF0000000089B09CBF00000060965AB43F000000C007AD66BF000000003C2196BF0000004062B3C03F000000A0108DBFBF000000000AFFAB3F00000000C636A3BF0000004025B0973F000000400B33A43F00000000324797BF000000209E6EBBBF000000C06583BDBF0000006059E3A03F000000C000AACABF00000000B707C33F000000409671C03F00000060DD48A03F000000205FC0B83F000000C04234BB3F00000040AA89B53F00000000D543A03F00000000C265A63F000000000257D1BF000000803EB986BF000000A08940CA3F000000C05244A53F000000C055B6BD3F00000000BFE68E3F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (77, 8, 0x00000060750CB8BF00000080D539A93F00000020A407AC3F000000007422B0BF0000006089A6B9BF00000000CA73ADBF00000040BBF79DBF00000000217FB8BF000000E0F434B63F000000000C2AC0BF0000008028A3D13F0000000042FAB0BF000000C047C4C9BF000000E0AED0B8BF000000005BD481BF00000040671EC43F0000000062FEC1BF00000080E457BBBF0000000061E9B0BF000000001CD5893F000000E0F2BFB73F000000E0278597BF000000603099A13F000000001C96603F000000C0C708AEBF000000C0C7FDD8BF000000C03F1BB6BF0000006047B9AABF000000E0C325863F00000000FCEF9CBF000000203369B4BF000000606BE1AE3F000000C009FBCABF000000A0D46BBABF0000000068DE5B3F000000C049ADAB3F00000080CEF89BBF000000405DC6A3BF00000000E133C63F000000C0A318903F00000080633BC8BF000000003C0D77BF0000008094059D3F00000040E990D03F000000603A16BD3F000000603607B23F00000080C38DB43F000000A08124C0BF000000408BC0B73F0000004086B3C3BF0000008013E3B23F000000E060ADB53F000000E0012CC13F000000000B41903F0000008002949E3F000000A0DF69B9BF0000000066B9A83F00000000DBDBB43F0000004092FAC0BF0000000014DF7D3F00000080ECB7B73F00000000A45C9FBF000000A0B88BA1BF0000004070EBBCBF000000407776D53F0000000083A6A73F000000C0F5DEB9BF000000406884BFBF000000200E47C13F000000C0999799BF00000040E7E0B3BF0000008052FF963F00000000E66AC6BF00000000F5ADC1BF000000605B65D3BF00000000B559AF3F00000000E413DA3F000000809E44AE3F000000C0F064C9BF00000060F8A6A23F000000C0A418BCBF00000000DFC69EBF0000004028A3BF3F000000403AA5BF3F000000003242A5BF00000040F8C1B33F000000E0BB23B9BF00000080B196A23F0000004042F9C93F00000060A0D5B9BF000000C0BACBABBF000000A07F3EC63F000000405F86953F000000807A89AC3F000000C03BF5A33F00000000D8FA8BBF000000005EA4B5BF000000208293A33F00000060444BC3BF000000001A5BA0BF000000A05D6EB53F00000040B793A4BF000000008CED94BF000000C0CA60C13F000000204C04C4BF000000403169B53F00000000EFFF98BF0000000064467B3F000000800286A63F000000009C1293BF0000002041D4BBBF000000C02A8DC1BF000000804002A43F000000E0CEACCBBF000000802595BE3F000000C0C9F5C33F000000004C02B53F000000C0F9C2BB3F000000A00C56BA3F00000020BE69B13F00000000D420693F00000000AF6AA23F000000202645CCBF000000809CFC84BF000000C0B446C63F00000000FC67A43F000000C0E94CB63F0000000063F2933F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (78, 8, 0x0000004094D2C2BF000000201478C13F00000060CA2AB43F000000E0895896BF00000060E41FB5BF00000000C7829FBF000000003868873F00000000BBB9B9BF000000807274C13F000000C039FBB7BF000000C0757AD23F00000020F5C1B5BF00000020BE34D0BF00000040B037B7BF00000000FED692BF000000E0AB3FC43F000000603502C1BF00000080A171C1BF000000C06C09B1BF00000000FF22A33F000000C0C23BBF3F000000A0486C853F000000000EDE713F000000000DA5893F000000C03D19B4BF000000009AF5D7BF000000203986B9BF000000C0C89EB1BF0000000011FB6C3F000000007A2CB2BF00000000D387B0BF000000007CA3603F000000C0777FCBBF0000000027F0C1BF0000000023B09E3F000000E0D702B53F00000080FFC299BF000000A0156AB0BF000000C058D3C73F000000E0B33F90BF000000A08063C9BF0000000019D59E3F000000C0442DA53F00000040F5B8D13F000000803804B23F000000401696B53F000000402F33A63F000000807247C1BF000000401E45B73F00000080EC24C2BF000000C02814B93F000000A0B921BA3F00000000865FC53F00000000B2B6A33F000000404C83A73F00000080F181C2BF00000000AA6C9B3F000000C0C03BBA3F000000406B22C6BF000000C0C17480BF000000809330BB3F000000C0F11CA8BF00000000B0A5303F0000008069B5BABF000000607942D23F000000807893B03F00000040189CB5BF000000A074CBC1BF0000004097C8C03F0000004099C8A8BF000000A00178ACBF000000605E6CA73F000000C0A2D6C3BF0000006092F7C1BF0000008049A2D1BF00000080ADBAB53F000000001E52DC3F00000040B0ECB03F000000407AC2C9BF000000E0D3C69F3F000000804260B4BF000000806E779ABF000000602732B63F00000060BC26C13F000000407AF0A1BF000000207A59B33F000000E0BA78B9BF00000000C73BA13F000000E0336FC93F00000040D504B1BF000000805F77ABBF000000A0CE77C43F000000002447903F000000000818A13F00000040E499AB3F000000A07D08B0BF00000080399DB5BF00000040DB44963F000000C0B006BEBF00000080337A95BF00000080604E953F000000E008D89BBF000000000A00A3BF000000A0497FBE3F000000200BD9C3BF000000E0C96DB23F000000004E8F78BF00000040CB4B95BF00000000F5D18ABF00000000BED08BBF00000060E186B6BF00000000B1DDB5BF000000C01378AE3F000000E0B192D0BF000000E00038C63F0000004076B7BD3F00000000D28A973F000000C004A4C03F00000040CC7BB33F000000009647B53F00000000BB3A9D3F000000003B7BA63F00000000C058CBBF00000040D1DFAABF00000060522DC83F0000000083A6933F00000080FE8BC23F00000000009B1D3F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (79, 8, 0x0000000022E0C0BF0000000094FCA33F00000040EFDEB53F0000004098C7B0BF000000E0331DB8BF000000002230B1BF00000000CB6D88BF000000000AF2BDBF00000040422DAE3F00000040ED17C0BF000000A01800D23F000000C07638B7BF000000A0A266CCBF000000600A74B8BF000000001B758FBF000000C04117C53F000000806194C1BF0000004081C4B4BF0000004088CCB6BF0000000011F492BF000000009CF5B53F000000004262833F00000020372AA63F00000000F868A43F000000C091FAADBF00000060051AD6BF000000A099F3B2BF000000604205B1BF0000008057D589BF00000080B56CA1BF000000C03FEDB0BF000000003385AD3F0000000082C0C9BF00000040F711BABF000000000D1F803F000000601709B03F00000000F48BA1BF000000C0BFCBA2BF00000080F746C63F00000000FC3079BF0000004070ABC6BF00000000200C7FBF00000000A0CCA43F0000000096BFD03F000000C07346B93F000000801AAAB83F0000004063C7A83F000000004961BDBF00000000E04FBC3F000000805E37C9BF000000005FF7B53F00000040ED0BB33F0000008081CABD3F000000007EFB7EBF00000000A71AA43F000000C0E01DC4BF00000000FC6CA23F000000004AB1B83F000000A04B2DBFBF00000040C1B0953F0000006003A8B33F00000000732DAEBF00000000DEDBA8BF000000C0582BBFBF00000080EAA7D43F00000060671EB53F000000A0D958BDBF00000060B07FBFBF00000080E4FAC03F000000409B4098BF00000040EC45B1BF00000020CC0FA43F000000E0EC81C7BF00000040050DC0BF000000809093D2BF00000000EFB4AB3F0000004076C3D93F00000000BC63A63F000000C04E83C9BF00000000B4A7933F00000060DE0FBABF00000000539F833F000000C04492BE3F00000040D055C23F00000080E5019FBF000000C07252AB3F000000006291B6BF0000000064E49F3F0000000020EBC23F000000008622BBBF000000005524ABBF00000060ECC4C93F0000008029C68A3F000000C05F33AE3F00000080D8B2973F000000C0CFB6A7BF000000C017F2BABF000000A0D069A63F000000E0E66CC0BF00000000F7D192BF000000C05B70B93F000000804D9078BF00000000D04B6B3F000000A06EE6C03F000000607FC8C3BF0000000004B3B73F000000C05695A5BF0000004079E7993F000000402FB4AD3F00000000D99EA3BF00000060F4B0B8BF0000008019B1BBBF000000C04A86A73F000000605B5FCCBF0000000049DFC03F00000040BE23C33F000000E0028CAA3F000000407425BD3F000000200CAABA3F00000060BB6FB13F00000000D562993F00000000663AB03F00000060FB1AD0BF000000803F78693F000000A00AF7C93F000000009C4963BF000000803E81B33F000000004427873F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (80, 8, 0x000000604DF2BABF00000040447FAA3F000000005869AD3F000000002BA7B5BF000000009367BBBF000000A02460B0BF000000C0A8B8A0BF000000C0136BB9BF000000A09BACB03F00000000AEB3C1BF000000203151D03F000000808B43B3BF000000403CFDCEBF000000201F6AB4BF00000040F1EB95BF000000609CB9C63F0000004026FEC0BF00000000542CBCBF00000000D06FBCBF0000008028FE93BF00000000EDD2B73F0000008098D197BF000000002CBF9B3F0000000072799D3F000000007A1AB0BF000000001549D7BF000000E04BB7B6BF000000606C74ADBF0000004030B999BF000000003339A8BF00000000CF7CB2BF000000E096C9AC3F00000060701CC8BF000000802B05BABF00000000B0197DBF000000C030219F3F00000080F89398BF000000400846A7BF00000060237DC93F00000000F3FC763F000000C02478CABF0000000030DA9C3F000000C05E52AC3F00000020B37DD03F0000008039B7BD3F000000A04B38B33F000000209F8CB33F00000040589EBCBF000000605614BE3F000000A090A0C7BF000000203137B33F00000000424FBB3F000000C0879DBF3F00000000729E863F000000409A51AA3F000000A083BDBBBF00000000A6C1AF3F000000A0EDD8BA3F000000E0B82EC2BF000000A068529B3F000000C0C9CEBB3F00000000169DB2BF000000E0C125A5BF0000008090BBBBBF00000000C472D33F00000060DD4FB23F0000004071B6BABF000000E058BFBBBF0000004088B3C23F000000C0D4519EBF000000A00523B0BF00000000A42F7A3F000000002F3BC7BF000000009F27C2BF000000E0CE0BD2BF000000801D75AF3F000000006B22D93F00000040D85CB53F000000C004ABC7BF00000040EB79B03F0000000085A8B8BF00000000CCAD82BF000000209B98C13F0000004061F0BF3F000000600221A8BF000000407EE2AA3F00000020460BB4BF00000080B343AF3F000000C05A0DC63F000000C0663AB7BF00000060156A9BBF000000A0BC30CB3F000000C050A9A03F00000080E5B8A73F000000803D98A83F0000000078927ABF000000601343BABF00000000F1A19C3F000000003D2EC0BF000000009311943F000000406FA0B93F000000C010E9AABF000000003AB4823F000000400F87B83F000000206AA1C1BF000000407657B13F000000008A78A8BF00000040DAF5A13F00000000CDFC9C3F00000000EC6B85BF00000000468FB8BF00000040E2D6BEBF000000C0300AA33F000000003691CABF000000609859C03F00000000A9EBC33F000000C0EA919C3F000000004582B73F00000080E15FBF3F000000E02A6AB33F000000805C10953F000000004E51983F00000040049FCDBF000000403A6B91BF0000004070F8C93F00000080CBA0A03F0000008092F3B83F0000000089639E3F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (81, 9, 0x00000040C4A7BDBF000000004DE4BA3F000000400FCF963F00000040B8DFA3BF000000000786BBBF000000007B1CB3BF00000000E96AA4BF000000602BA5C0BF0000004080A6C13F00000020896ABABF000000603395D33F00000040E1B6B2BF00000000654FC8BF000000202483B9BF00000000E335ABBF00000080923AC83F000000C089FAC5BF000000C00ADDBABF00000000A05EAFBF0000000072B385BF000000A07F46B23F000000E07CE5B6BF000000A01A60AE3F000000809DD6B63F000000000E7378BF00000080CABDD5BF000000206928B1BF0000004028B3C0BF000000802372B63F000000005846B2BF000000000888A6BF000000004240813F00000040B1C4C8BF00000000D14FB7BF00000000CBD482BF00000080B8C5833F00000000FB6D8ABF0000008048D3A7BF000000E080F3CC3F00000080C8B0B9BF00000000840CD0BF00000000304A50BF000000808270993F000000405706D03F00000080884DCC3F000000C0E538A43F00000000403874BF00000000D37CBFBF000000607B0DC13F00000000469EC2BF00000080B357B13F000000E05E07BB3F000000C09479B53F00000000C8CD5A3F000000000ED77DBF000000C01A03C2BF000000000F0CA83F000000809D4DC43F000000001FE2C1BF000000C01F5881BF000000804201BB3F000000E0B903B3BF00000080435B77BF000000800CD1AEBF0000000045C5D43F0000004065FCAF3F000000203ECCBDBF000000807ADFC3BF0000008006A6C33F000000809D8EBCBF000000C0F2CD913F00000040BECFB43F00000000E2A3C7BF000000201A59C3BF000000C0A9B3D1BF000000000992923F000000002590D83F000000A0CEF1AF3F000000800FB3C6BF000000C0A4F99E3F00000000BE60BFBF000000002480883F000000E0E7FBC13F00000000679AC03F000000001CC353BF000000C08FBFACBF000000806149C0BF00000000A62EACBF000000605C98C83F000000402EAFB2BF00000040CA6094BF000000003738CE3F0000000048EE96BF000000007440713F00000000888D5F3F00000000384A56BF000000A0B9C9B8BF000000C0F1039C3F00000020C5CCC1BF0000008088A298BF00000000E2FA86BF000000A0287F97BF00000080A8A5A2BF00000040A079BC3F000000C07964C8BF000000801EB9A43F00000000C5FB8DBF000000E0BD3CBB3F000000C07B3EA53F000000007451A5BF0000006088EDAFBF0000006074C7BFBF000000407709BD3F000000C01886C9BF000000207CE8CA3F000000E0938DC23F000000403DAEC13F00000000C0D4B73F00000040AB3CBA3F000000C07515A83F00000000192A8B3F00000080E234A2BF000000607524CFBF000000806FC9B13F000000406E25C13F000000A0AB63B2BF00000080B29AB23F000000005283753F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (82, 9, 0x000000007B63BABF000000603AA0B73F000000600282963F0000008068BB9FBF000000403DA4C1BF00000020B86BBBBF00000000AC72B6BF0000004091C4C6BF00000080602DC03F00000000A192B1BF0000006023F8D43F00000000EF20A5BF000000806CC9C2BF00000080EBBFC0BF000000E0FD75A0BF0000000014B5C83F00000080FB6CC9BF000000E0A9B2C1BF000000C0894EB4BF00000080D7A49CBF00000020163DA13F000000E00254AFBF000000E0E610AD3F000000C000FDAC3F000000805A2B9CBF000000804F76D7BF00000040097DB6BF000000C0219FC1BF000000C0BC19BF3F0000000058D491BF0000008010CC97BF0000000070FF893F00000080102AC8BF000000C0E85EBEBF000000C039B9AE3F00000000E04645BF000000009A3B723F000000C067BAB3BF000000409303D03F000000E0BF18BFBF000000608FE8CCBF00000000F130903F00000020F9B8B03F000000007849CB3F000000A06D33C93F000000601DE0A93F000000A0EA77A83F000000006891C2BF00000000848DC23F00000060DF4FC0BF00000020C87BB03F000000C00FA8B83F00000000C5FFBE3F00000000A9DB833F00000000442571BF000000E0985AC8BF0000000054428C3F000000802A41C63F000000802B00C7BF00000000D8CD45BF00000000FB0EB53F00000080BA38A5BF000000C01335A5BF0000004061BAB4BF000000C0336FD53F000000C0AA53BD3F00000000342BC0BF00000000DFAEC3BF0000002003CFC63F000000003C5FB2BF000000808273903F000000C0493EAF3F000000C06F2DC9BF00000080AED3C4BF00000000FC74D1BF00000000609D613F00000060C6EAD93F00000000639DA93F000000C07953CBBF000000001E718CBF00000020A798B8BF000000006F2F9E3F000000C05995B93F000000A05DAAB43F000000602325A2BF00000080DD6BAFBF00000080D66FBDBF000000009222A0BF000000A09457CA3F000000E05AAAB1BF00000040E0DE8DBF00000020A7C9CD3F00000080AEC785BF00000080098FAC3F000000801B297BBF000000001E5E9D3F000000805F1AB5BF00000000FEE49F3F00000080004DC2BF0000000012C570BF0000000099EC9A3F00000040A614A43F000000001EEB9D3F00000040BF9ABC3F000000E0FA7EC0BF00000000143C9F3F00000000004A3E3F000000A0D195B93F00000000EC7D8D3F00000000FEF399BF000000004035A3BF000000C0D3AFC0BF000000E0F491BF3F00000000747DC6BF000000C08729D03F000000C05028C13F000000E0C58DBC3F000000000F01C13F000000405987B63F00000000F39AA13F00000000903650BF00000020F621B0BF00000080AA93CDBF000000C0BA7DAA3F0000006060ACBC3F000000E03889B1BF00000080AE95B53F000000607B80A03F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (83, 9, 0x00000080C333B3BF00000040537DA83F00000000AA68883F000000C03C93B0BF000000C02D18B3BF0000000069ABB5BF000000801943AEBF000000A00F4AC3BF00000040309EBF3F00000040EAF8B7BF00000040DD8AD23F0000008033ADACBF00000060C9F3C4BF000000607913BEBF000000802858A1BF00000000C151C53F000000C0B247C4BF000000E04CDCBEBF00000000F3E5B7BF0000000040B6A13F000000E03FEBB63F000000C0FA20A8BF000000607D87B23F00000000DCCAA63F00000000340C7CBF000000C0E22AD5BF000000C0B007BBBF00000020B356B2BF000000A08227B53F0000000040B550BF000000E04119A4BF000000005EEF7CBF000000205EDBC6BF00000080E731B3BF000000E0279DB03F00000080F8279F3F000000804B5F95BF00000020089CB4BF000000005FD7CF3F000000006BB5B5BF000000403BD6D0BF00000000EB51A13F00000080CA92A43F000000C0A497CA3F000000608868C83F000000E0DB6BAC3F00000040E8C28D3F00000060B580C5BF000000407914C13F000000407805C0BF00000000FEDDAE3F0000004015A7C13F000000405F30B73F00000000A9A1813F00000000D6487ABF000000A02798BFBF00000000252CA83F00000060606FC73F00000000711FC1BF000000E05A4C9ABF0000008056EDBA3F00000060CCA4B2BF000000A057109FBF000000C01A40BBBF00000080BCABD23F000000606904B43F000000E027D7C1BF0000000095DEC9BF00000040192AC43F00000060136CB3BF000000605FE49EBF000000607F10B43F000000A08FF2CABF00000080A7E4C3BF00000020DC34D0BF00000000884580BF000000C06A52DA3F000000C0135EAF3F00000000A90EC9BF000000C06CA8A43F00000000D8E2BEBF000000C040C3A73F000000A07619C13F00000080F1E0BE3F000000004B1164BF00000080683796BF000000404427BEBF000000807DE4AABF00000020B165CB3F0000006025D5B7BF000000205E51A1BF0000002087A8CA3F00000000EE30673F000000807D9FB23F000000C0343875BF000000001AF498BF000000C08CA9A9BF000000E0B9D8A73F000000C04BD7C4BF0000000045548CBF000000008D8E8C3F000000C00861A03F0000000078809A3F000000C029FEBF3F000000400DF7C0BF000000A09AFCB03F00000000EA008A3F000000C05A5CB83F000000A0B294B23F00000000E2EB8CBF000000004E10AABF00000080DEA1C0BF00000080FE7BB33F00000080A6E3CABF000000007E3ECC3F00000020E39EC03F000000C0B8CCC43F000000C02075B53F000000C09DC6BE3F000000009A0FB53F00000000CC92863F00000000FA9083BF0000002070F9D0BF000000A079D6A83F00000060AF44BD3F00000000147266BF000000C0B19FB93F00000000AB218C3F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (84, 9, 0x000000806319B6BF000000400FD0BB3F000000001C079B3F00000080017092BF000000C0F636BABF00000000D70AB6BF00000060DB8EB2BF000000006117C9BF00000040F378BD3F000000E02C98B8BF00000000124BD53F000000401230A2BF000000A06C26C5BF0000000095FBC3BF00000040771BB1BF000000009BBAC63F000000E0A339C4BF000000E04902BEBF00000040CF2AB3BF000000000C6672BF0000004032BAAF3F000000204220A7BF000000C02A0AB23F00000000868B923F00000000756787BF000000E0DE0AD5BF00000000FA9CB6BF00000000B83AC0BF00000080F9B0BA3F00000000ACF2793F0000000042CB81BF000000E0113AAA3F000000A0B2DEC5BF000000C0CEBCB9BF00000080876FAB3F000000E0BE299EBF00000000937298BF000000000C706C3F000000C07532D13F000000006F41BCBF00000000FF06CBBF000000000CC9993F00000080B2D5B23F00000040061BCE3F0000006087D7C83F000000E06F50B23F000000A0D703A83F000000A002DDC2BF00000000F090BD3F00000060D51EC3BF0000004068D0B33F0000006021AFC03F000000E0ACDABD3F000000008095383F0000004009C2A83F00000040205EC4BF00000000FC00993F00000080B3A8C23F000000207EB7C5BF000000002DDD953F000000208C97C03F00000040C09CA9BF00000080C17BB0BF000000808FA2B7BF000000609D97D33F000000C071C6AF3F000000A00442BDBF000000605FA5C4BF0000000089E9CA3F000000A0C946B9BF00000040193D86BF000000A0408AB23F000000E018C8C6BF00000040128DC4BF000000402124D1BF00000000F01168BF000000807660D93F000000E0E483BD3F000000609258C6BF00000060EDADAB3F00000060F64BB7BF0000000068986E3F000000E069BCB93F00000080FA71AD3F00000020FC0997BF000000C0B2EFAEBF000000C09D58B7BF000000002D1AB2BF000000803DC2C53F00000040E66CAEBF00000000230C6BBF000000408FD6CE3F00000000CBCA773F000000008649863F00000040D9F679BF000000404DE9A5BF00000020C754B1BF000000401A53803F000000C0402CC6BF00000000548587BF000000007ABDA8BF0000008021237DBF0000000005849B3F0000008099F5B83F000000400AFCC2BF000000A032D0B23F000000807A3E9DBF00000020AAA1B83F0000000010B96F3F0000000084B893BF0000000086A8ACBF000000000092B6BF000000000A8FBC3F000000A0E6C9C8BF000000801182CD3F000000603C2FBA3F000000C03A91C23F0000004049F2BB3F00000020C13CBF3F00000020E5DBB03F000000003E42803F00000000B784A4BF0000000065FBCFBF00000020007B83BF000000C0CACEBA3F000000008342B9BF00000080678DB53F000000609F9FA63F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (85, 9, 0x000000C0A166B5BF000000408290BC3F0000006022E8A23F000000604059A7BF00000000AB05BBBF000000401765B1BF00000020B227B4BF000000205508C4BF0000004017A8C23F000000C04945B9BF0000000048DCD23F000000803032ADBF00000040BD4CC8BF0000006065DDC3BF000000A04F4DB1BF000000000F98C83F0000004074D7C6BF000000808AC8BEBF000000C01189AFBF000000C03AE1A23F000000C0DE5BB73F000000608064B2BF000000A0E974AB3F00000000F6D4A53F00000000148B69BF000000803338D7BF000000C011A6B5BF000000409120BFBF000000807D11BA3F000000009CBD9FBF0000000086C0A2BF0000000054E66E3F00000000E1EEC4BF000000C0F045B8BF00000000B5D88C3F00000000F2C26FBF000000008A729ABF000000809EE5A5BF000000E0E2D3CE3F000000C0920AB9BF000000407C35CFBF0000000000811F3F00000080E870A83F00000080C5AFCA3F000000200679C83F000000E0711EB33F000000008448A93F00000080E3D7C3BF00000080E64FC03F000000A05F5FC5BF000000005E1AAE3F000000805A82C03F00000000F03BBA3F000000009C7E7D3F00000080F8849D3F000000E067B5C3BF0000000089A8A23F000000405224C43F000000407B84C4BF00000080AB3B833F00000060C312BD3F00000040C5F4AFBF0000000039B4AFBF00000020A499B0BF00000060ED77D43F000000A0D1FFB13F000000000A7FBEBF00000000C8F7C6BF00000020FD1BC73F000000407404B9BF0000002044DD91BF000000C0CE86B03F000000608A8DC4BF00000080D149C1BF000000A0D376D1BF000000003CF97BBF000000004498DA3F000000008843B43F000000C0845CC7BF000000601279A73F00000060386AC2BF00000000A56E803F000000A0084FBA3F000000007DFAB33F000000A024DB9DBF00000040AEB2ABBF00000060DB4DC0BF0000004021D7B3BF000000600C30C63F000000C08264B6BF0000004011569E3F000000805D5DCC3F00000080DED08C3F000000C08A45A53F000000E0B44197BF00000000955BA0BF000000603BC2B8BF000000C0AFFEA53F00000040D45CC1BF000000007494A3BF0000000085DD973F00000000F271643F000000006FB4983F000000C07F03BA3F000000404B76C6BF000000A0850EB03F00000000607478BF0000000008AAB53F00000060D42FB33F00000000EF0498BF0000008040C8B2BF00000020B495BFBF000000C084BABE3F00000060492AC9BF00000020A7F9CA3F00000000575FC03F00000060274FC33F000000808669B83F000000C0840BC23F000000A0967EB43F0000000090AD7F3F000000001161A5BF000000C0FA7CCFBF00000040109D9E3F000000C09B90BD3F000000E02189B1BF0000008039DFAD3F00000080A3BC923F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (86, 9, 0x000000001BA9B3BF00000000DB7CA33F00000080CCFFAF3F000000A08603AABF00000040BDF4BABF00000060AED9BFBF00000040983587BF000000C00899C2BF000000A08DA9C23F00000080DD39B8BF00000040C32CD43F000000004041AEBF000000A00CFEC5BF000000E0125BC0BF00000000909C9DBF000000808216C63F0000008044D2C1BF00000000E2F8B8BF00000080D625B7BF0000000070C97D3F00000080660CB23F000000C034B2AEBF00000000D787A53F00000000EC9BA83F000000808ADBA5BF0000008004CBD5BF000000004C6CBABF00000060E8F7C1BF000000E0B70CB53F00000000D2399CBF00000000535870BF00000020BB41A93F00000040501EC7BF000000006B62BEBF0000000000CA3BBF000000401F1997BF000000C07A6EA0BF00000080C57AA4BF00000040C9C3CC3F000000C098FEB5BF00000020CA79D0BF00000000B5A39CBF000000005699823F000000E041D4C73F00000040E21CCA3F000000000E82AB3F0000002017A7B03F000000A05C4CC3BF000000C00960BC3F00000000ECABC7BF00000080A020953F000000E07997B23F00000040B805B83F00000000C0825DBF00000000401856BF000000A0CF2EC2BF00000000CC1D913F000000800520C23F000000A0C2EEC7BF00000080855E763F00000040E923AA3F00000000608DB8BF000000800D8DB2BF000000C028B3ABBF00000080F9E8D33F00000040DAF3B03F000000205391C0BF000000601253BEBF00000040D080C83F00000000755EBFBF000000008DBB6CBF000000404813B63F000000407CCCC4BF000000E09BD3C3BF000000000185D3BF00000000FF4894BF000000C0312BDC3F000000401AF6933F0000006031C5C8BF00000060282FA43F000000C09DE1C3BF00000080C2469E3F000000A00C5BBB3F000000E0D2C2B83F00000040D9F881BF000000C00A36A0BF000000204F54B8BF000000008EFBA6BF000000803448C83F000000A0278EC0BF000000C0A5C8853F000000C09714CD3F00000000798091BF000000A08DBAB13F000000E09B7887BF00000000142960BF00000080BA73ABBF000000A0A97B953F00000040FA7CB8BF0000000037C28BBF000000401D46AE3F000000809464933F00000000D0F0963F00000000E7F4B63F00000080C68FC5BF000000A0FF69B53F00000000D443613F00000080F9DEB23F000000604825B33F000000404730B0BF00000020C9F8A5BF000000E07498C0BF00000000ADF9C03F000000C0960EC9BF000000006E21C93F00000040E6E3C23F000000409AC7AB3F00000060EC1CBD3F0000002092EAB53F000000808D1AA73F000000005B7195BF00000080B198A6BF000000801688CFBF000000C07914B13F000000C0F27AC23F000000C0C0F4AFBF00000040F627B03F000000004C6189BF, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (87, 9, 0x000000604D62B7BF00000040CF5BBE3F000000008D0AB03F0000006001DF93BF0000000051E3BDBF000000407BD7B6BF000000C01A9DA8BF000000E01E1DC5BF000000E05DE0C13F000000E00002B6BF00000000408BD43F000000C0DA06A0BF000000E0B7D8C8BF000000A0353DC2BF000000004DC2A9BF000000C02864C73F0000002005B6C5BF000000200056BBBF000000C064D7B4BF00000000D874683F000000E0D5C7B13F00000040583C9CBF000000805792AD3F000000009BC8963F00000000823EA23F00000080BF22D6BF0000000087B9B1BF0000004016CCB8BF0000008002FEB43F00000000AC3C98BF0000004027E2A6BF00000000E091693F000000602BD4C6BF000000C0A2A5C0BF00000080C347A63F00000000DED97D3F000000807A98A1BF00000080D7B8A3BF00000000AB6FCF3F000000C0B958B9BF000000E0AB39CBBF000000007E7789BF00000000AA49AE3F000000203256CC3F000000C0A078C83F000000C0092BB43F000000A0FEE4AA3F000000A0243EC5BF00000080A2C8C03F0000002031A7C3BF000000C0C676B03F00000040B9B8C03F000000C05588BD3F00000000A02F85BF0000008096089A3F000000C011D0C5BF00000000A0305C3F000000807A8EC13F00000040D161BFBF000000C0DEDF8A3F000000A0828EC13F000000405E19B7BF00000040FB07B2BF0000002080FDB3BF00000000B3AAD43F000000403484B03F000000A0DB74BCBF00000040653FC6BF00000000665CC63F00000040AE4FB8BF000000003344AFBF000000C0C7109D3F000000602B55C6BF000000A03B95C1BF000000E07C49D2BF000000006C0A77BF00000000506ADA3F00000040EF21AC3F000000C0A8C6C9BF000000600174A73F00000020D09CBCBF000000808423983F000000201675BF3F000000000E34C13F0000008047698ABF0000000046488FBF000000606BBAC0BF00000080450DA9BF000000004038C73F000000006695B9BF00000080A06375BF000000C0725FCB3F000000000CB1533F000000001F2DAE3F0000000067B465BF000000005CF7A5BF000000A003E3B0BF000000400BF3A53F00000000236AC5BF00000000790A93BF00000080E0519D3F000000408A43953F00000000DE389B3F00000040B9F4B83F00000040FE58C2BF00000040C8CFA43F000000007FF194BF00000060913BB83F000000C08753A63F00000040138FB3BF000000C0DD56ADBF000000209362BBBF00000080676EBC3F000000C0C2EDC5BF00000040389CCE3F000000205EB1BD3F000000E0F85EBA3F000000C0717BBE3F000000200174C03F00000060730EB53F000000C03243A43F000000007F3A9EBF000000A0AE45CFBF000000A04028913F000000E0BE65BA3F000000403FC7A7BF000000403A8BB73F000000C0A74E9A3F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (88, 9, 0x000000C0CF2DB9BF00000040149DC23F00000000D0FEA43F00000060E417ADBF000000808DF1B5BF00000020F100B9BF00000020C78DB0BF00000060DFCAC8BF000000409078BB3F00000000F893B6BF00000000609BD63F000000605DAAB2BF000000401FF0C5BF000000A0A152C6BF000000209159ADBF00000000FB4CC73F000000A02F8FC6BF000000002495B7BF00000040BB77B3BF00000000F02378BF000000806201B23F000000406D33B4BF00000040A81DAF3F000000C005B7A23F00000000A08E803F00000000DF2AD5BF0000002076B6BABF000000E0D700BABF000000208412B73F0000000024498DBF000000003AAD693F000000403BA1A23F00000020870AC6BF00000040430DBEBF00000080C0BD9D3F00000080DF3E84BF00000000B57F84BF00000040618FA8BF000000A07E48CE3F000000C05094C2BF000000A0C236CABF0000000054E1843F0000008010C4B23F000000803DEBCC3F000000C0A13ECA3F00000040FA06AA3F00000040B182AA3F00000060B0D4C0BF000000803550C03F0000006097CCC2BF00000020A152AD3F000000806734BD3F00000000FD4DBE3F00000000813989BF00000040E96CA83F000000406F99C4BF0000000030AD883F000000203A23C93F000000009DCFC1BF00000080D2AF99BF00000060C430B93F000000A0773DAABF00000040B76FAABF00000000E93BB8BF00000080FCE9D23F000000C03728BA3F00000000649BBFBF000000A0E797C4BF00000080C429CC3F000000809A31ADBF00000000BE8F5B3F000000800E69AF3F000000402574C8BF00000000BA84C3BF000000E08038D1BF0000000080D2963F000000409468DA3F000000C0D2ADB73F000000004E9FC7BF000000808F8B9B3F000000601C01C0BF00000080CF63A43F000000600619BB3F000000409984AF3F00000000B57999BF00000000F4BBB4BF000000E095BCBCBF000000C0F9B3B0BF00000000698AC43F000000203556B3BF000000C0F25095BF0000008040ABCA3F00000000B47D7FBF0000000066F07D3F00000000331396BF000000C07410A5BF0000008064AFB2BF000000606119A93F000000200374C5BF00000000E2D1703F00000000E33A88BF000000E09EE486BF0000000000C0563F000000A0C917C03F000000C02D2EC4BF0000000053A6A43F00000000905D6F3F000000407486B83F00000000C87C943F00000000EBD595BF0000006068A0A2BF00000080CC37B6BF0000004081ECB93F0000000043ADCABF000000800BA4CB3F000000205C2EBF3F000000002FE8B83F000000604451C03F00000060E833C03F000000E09131B63F0000000025B1A33F000000804F6CAFBF000000C0491BCDBF00000000D1366CBF0000008002BABD3F000000E0E3ECA8BF0000004048C5B03F00000000C3CF933F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (89, 9, 0x000000401883A5BF000000202D2ABB3F000000C0EC58963F000000409532B2BF00000000E570B8BF000000809304B4BF0000002036D9B0BF000000200EBFC7BF00000000BEC9C03F00000060E53EB9BF00000080DF04D73F00000080996EAFBF0000008069B6C8BF000000A00EF0C3BF000000A01335A9BF000000809B1CC93F000000C0EED2C7BF000000C04137B7BF000000C020A2B3BF0000000050706BBF0000000019E1AB3F00000020EC6DB1BF000000201BD7AB3F000000C04A8DA93F00000000B8805F3F000000E0695DD5BF000000200C07BEBF000000A0F9E7BBBF000000207797BF3F00000080845CA5BF000000E0D242A2BF00000080532AA23F000000209171C4BF00000040EDD9BFBF000000C0C590A43F00000000E6DA9EBF000000000A5385BF000000603CA3AEBF000000800103CD3F0000004017C6BBBF000000606438C9BF00000000D0B8903F000000401ADEA83F000000406957CB3F000000C08750C93F000000C0A80CAC3F000000002E21AA3F000000803666C1BF000000E05D60BE3F000000E085ABC6BF000000E0D015A73F0000000072C0B63F000000001960BD3F00000000082F61BF0000008016B8903F0000008082A4C5BF00000000A860813F000000807F92C73F000000408F41C5BF00000020D58494BF000000002903B83F000000C0F36BA7BF000000C0765DADBF00000060317FB2BF0000004084CCD33F000000000171B63F000000C08A3FC2BF000000801175C3BF000000E0564EC63F000000E0B2F2B1BF000000607305933F00000000F5ADAD3F00000040BA15C8BF000000001847C2BF0000008087C2D0BF00000000A574933F00000020E2CEDB3F000000A022A5B33F00000080AD5EC7BF0000008006849D3F000000E04BBCC0BF00000000C18B9C3F000000E01438B93F00000040EF97A43F00000000118D9ABF0000008053FEB1BF000000A0C526BBBF00000080DAC1A4BF000000C07FEFC33F000000A0E5AFB8BF00000080C067743F0000004003C8CC3F00000080213395BF00000080BB6CB03F00000000F3C08EBF0000000012CF81BF00000060D4E5B2BF000000404BD0A03F000000E07EA5C1BF0000000016B07B3F0000000090D069BF000000C07A2C883F000000003937963F000000204B55BD3F00000080D6E4C2BF000000C0C259B13F0000000000C14E3F00000000C808B43F000000805F85A73F000000003DBF9ABF000000600A6FA6BF0000006070B3BBBF00000000A840BE3F00000000F489CCBF0000000068F1C83F000000C05BC0C13F0000008070D6BC3F00000000154CBB3F000000802C97B93F000000C00004AC3F00000000E01F8C3F0000008056E9ADBF000000607748CEBF000000408798963F00000040BF28C03F000000C0FC8CB4BF0000000093F8AE3F00000000C27586BF, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (90, 9, 0x00000040A593AFBF000000601E54C13F00000080FB5E7C3F000000603969B1BF00000020A7E8C0BF00000020BF37B2BF0000008079C7A5BF000000E02B7EC4BF000000403682C23F000000E08FEDBABF000000E00B78D43F000000402F07A8BF000000A013EDC5BF000000605BF9C0BF00000000F125A6BF000000806C32C53F00000000F3DFC2BF00000040AA51BBBF00000000BFE1B5BF00000000A0E64FBF000000404721B03F00000020824CA6BF000000C0E300A63F00000040915BA93F00000000FA1277BF000000E00472D5BF000000E0C177B2BF0000002030CFB9BF000000801C6FB43F00000080F396B3BF00000080CB499FBF00000000D822833F000000E04614C9BF000000001549C1BF000000008F3D9C3F000000008070453F00000000FA4990BF0000000014A095BF000000C01216C83F000000E0C0EEB2BF00000000C65EC9BF0000000068EC6D3F000000005041973F00000000DE86CD3F000000208E5DC83F00000020A88DB53F000000C043D1A83F00000000DE11C7BF000000A0F53CC13F000000E03B27C3BF00000020736DB23F000000002988B43F0000008004ADBB3F00000000403E7CBF00000000C00D68BF000000C0B928C3BF0000000002059A3F000000C00F7EC23F00000040C0EFC0BF00000000BDBE8A3F0000004009E7BC3F000000C062F0AFBF0000004050DDB2BF000000806EE4B0BF000000C0C135D53F000000E0A24DAB3F000000009D1ABEBF000000C0E884C1BF00000000A001C43F000000E0C9D2B3BF0000004028E5ABBF000000804A4C8E3F000000C077F4C3BF000000201198C1BF00000080CBDBD1BF000000006F97923F000000209B26DB3F00000040A575AF3F000000009DADCBBF000000E031A1A33F00000040F838C0BF000000408579A43F0000006042D8BC3F000000A0BD0ABA3F000000407B81A0BF000000407C33A7BF000000C0DE9DBABF0000000067FC91BF000000801B4AC93F0000004039F2BABF00000040D0AF8CBF000000807F5ECB3F0000000092E79BBF000000C00C68B33F000000405FFE73BF0000000010B590BF00000000F711B6BF000000609566AF3F000000E03E63BEBF000000005DEA90BF00000060018CAC3F0000000038275DBF00000000686C65BF00000000EEF9BD3F000000006669C8BF000000E00AEBB83F00000000A80B89BF00000040C90EB63F00000060EE31B23F00000080899FAABF00000020DD0DA7BF00000080C888BBBF0000004055CFBD3F000000A0F789C8BF000000A0A9EBCF3F000000E009CAC23F000000205CBABB3F000000E08B56C03F000000C0BEFDBE3F00000040D444AB3F000000C07687AB3F00000000198398BF00000020F86CCFBF00000080969C913F00000080540FC13F000000E0B0C9B1BF000000C02EB5B33F0000000057057E3F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (91, 10, 0x000000A0F54FB6BF0000000008F3AD3F000000A0ECA783BF00000080925791BF000000402279B9BF00000000329382BF000000002492B7BF000000203CE0B1BF00000040EAB2C33F000000E010D1C4BF000000006D37CB3F000000A0153FB6BF00000020E68CCBBF00000080C8BCB4BF00000000C2107BBF0000000098C0C23F00000060A474CABF000000409C9DB0BF00000040E94A853F00000000DD7C9E3F000000608289C13F00000000CCB96DBF000000A0E3FEA0BF000000808698B23F000000401803ADBF000000006426DABF00000000A342C6BF00000040EA17B2BF000000A0F819A13F00000040FCE5B7BF00000060E7AEBABF0000008000A296BF000000A09065C3BF0000006055E9B9BF000000801B1CA03F00000060931FBC3F000000007647A4BF00000000E71AB9BF000000C08A22C13F000000E070D89DBF00000040C803C4BF00000000496AAB3F00000040562EA93F00000000B791CB3F000000E0B314C63F000000206DABC03F00000080601B91BF000000409ED2BFBF000000E0F615C23F00000020CFA2C5BF00000060FABB833F00000020119FC43F000000A07371B33F000000600812BA3F000000001EF7753F00000040870AC0BF00000080A7A3B53F000000607B49B23F00000000F9E1C9BF00000000CBC9703F00000020E2B5B33F000000E0A14BBFBF00000020C109A53F0000000068468B3F000000C071F9CD3F000000C02FD9B03F000000E03292B7BF00000000BBEBC9BF000000C0AFC2BA3F000000C0BF17CBBF000000203C34AABF00000000525A843F000000407394C1BF000000C0D419CABF00000080D9C5D2BF00000080D6F6A63F000000808C4DD83F000000A09292C33F0000000026D5C1BF000000401036B53F00000080392AADBF000000C0F626A4BF000000000F94C33F000000C0769AC23F00000040CB9C943F000000C09C36A9BF00000060D72BC1BF0000000069BD973F000000204F33CB3F000000E08012B2BF00000040E1647C3F000000802727CA3F00000000689F643F000000403EC2B93F00000040D45FB13F00000000F6A4A33F000000C0A9DFBDBF000000C0EEEB9B3F00000020CE56B6BF00000000680E943F000000A0E54CAE3F000000C03CB8AFBF00000000E07E79BF000000C01990BA3F00000000F117C3BF000000E0FD27C03F000000008595A3BF00000040779492BF000000003E82723F00000080CA04A9BF0000008019D4C5BF000000000CDEA2BF00000000A0BDBF3F000000C0B648D1BF000000E09F03CC3F000000C005FDC53F00000080DD7BB43F000000E02C11C63F00000080C1E2B83F00000080AAE7BB3F00000000B42C8CBF000000805783ACBF000000E0DBAFCBBF0000008019ACACBF000000E0A3A7AA3F0000008094989B3F0000000026B5B33F00000080AE9E9EBF, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (92, 10, 0x000000C0A7C4BCBF000000C03AB2B53F000000A08D6A74BF0000008001E2A6BF000000001195B6BF000000009416613F000000803E6BB7BF00000080DA64B3BF000000807042C23F000000001D49C3BF000000A0BE15CC3F000000A0DE4EA4BF00000040B503CABF00000000E9A1B9BF00000000A68581BF00000020A3E6C13F000000600B76CABF000000409E4CB6BF000000601D5D9A3F000000805C65993F000000E04514C33F000000008AF885BF00000000C22861BF000000004CC1AE3F00000020B1F2B8BF0000004060EDD7BF000000E0D7A0C5BF00000040DDCFB5BF000000603C629D3F00000000B527BCBF00000040072AB1BF000000C06504A3BF000000804557C5BF00000020160CB3BF00000000E0ED4CBF00000060EC76B23F00000000490F8FBF0000002072D8B0BF00000040D6A0C13F00000000784F84BF00000040618DC3BF000000008045A03F000000807935993F000000A0F23DCC3F000000807EC6C03F000000A01625C13F00000000F89D0FBF000000006E53BFBF00000020877DBE3F0000004029CBC3BF00000000847D59BF000000000E4EC23F000000C0BD24AF3F000000606D44AD3F000000002EB689BF000000A0737ABDBF00000040A4FDB73F000000205E8CA73F000000A070A8C8BF000000E059A2923F00000020C836AC3F00000000BAC0BDBF000000A0DB57933F00000000DE59883F000000C04E4BCD3F00000020BE42AB3F000000C0DCB4B2BF000000A03624C9BF000000C0AD40BD3F0000004025ECC4BF00000080A5F9ADBF000000203407A13F000000400E60C0BF00000060130CC8BF000000602AD9D1BF00000000D087503F000000A08E26D83F0000004036C6C03F00000020BCBEC0BF00000080EF24B73F000000E0D378B9BF000000201771A2BF000000802311C13F00000020813CBE3F000000008AE96FBF000000009F3896BF000000804070C2BF000000003A2DA53F000000402F56CB3F000000A0A623B5BF00000080D7BA853F000000C0000BCA3F000000C08A05903F000000C0202CC03F000000402A74A73F0000008015089E3F000000C0D856BDBF00000020E843AA3F0000006091A0AEBF0000000028D4833F00000040D3A1B03F000000804D0DA4BF000000005071793F000000E0C819BD3F000000C0C533C4BF000000A0BF89BE3F0000000066488BBF00000080989889BF000000009223793F00000000A67481BF0000004062EFC4BF000000A004FFB0BF000000406D3CBA3F000000E03F87D0BF000000009E41C93F000000C0F70ECA3F000000C052BFAC3F000000205417C23F000000C0A9EABC3F000000400A7FB73F000000002BB89BBF000000407D6DA7BF000000C05870CDBF000000A0B368A2BF000000400944B13F00000000E80C5FBF000000407884B23F00000080B0DA96BF, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (93, 10, 0x00000080A9A0BEBF00000040371BB13F000000203A28AD3F00000080250FB5BF000000403EA3B5BF00000080D9179EBF000000204AFFB8BF000000800207B2BF000000C0A06EC23F000000004958C5BF000000E0DA04D23F00000080C3F9A9BF000000207AAFCABF000000A0F338B4BF00000000A0EA8CBF000000A0D861C13F0000008077E4CBBF000000C00114A7BF00000000BC624A3F0000008001749D3F00000020A7DDC03F000000E090FE7ABF00000000F34F743F0000004020C5A33F00000040C606B5BF000000C02999D9BF000000E0C87ACABF000000C09D72B2BF0000008022D5953F000000C01D83BABF00000080C3C2A6BF000000003F0896BF000000605848C2BF0000000068FAA7BF000000007687A0BF0000006085BCAB3F00000000681C5E3F000000004689B2BF00000020CBF7BE3F000000E030178F3F000000607023C3BF0000000063619D3F0000000080836E3F000000804FEDCA3F00000000598CC53F0000008047E6BF3F000000E02E808A3F00000040AAD7BEBF0000008029C7BC3F00000080F501C7BF0000008076129B3F000000603386C23F00000060BFE1AE3F0000000023EBB03F0000000040025E3F000000C03E16B5BF000000007644B73F000000E01A79B23F000000803DACC6BF000000E028DA993F00000000C5F3B23F0000004083FDBFBF0000002038D6943F000000002A9F953F00000020F2C2C93F000000600A07B93F000000E0BA80B6BF000000E06559C8BF00000040D019BB3F00000060F5E3C6BF000000800641B6BF0000000096317B3F000000C0F6E0C3BF000000A0D25AC5BF00000020761BD4BF0000000080AB2CBF000000C0E8D7D73F000000A0A45FC13F00000040EA66C4BF00000020121FAD3F0000000028FABFBF000000A04F3FA3BF00000040068BC03F00000040E5ABC03F00000000129383BF000000C0D53DA9BF00000020A275C4BF000000008C36953F00000000AB0BCB3F00000000CC91B5BF00000040831A943F000000E097B1CF3F00000000DDA88B3F00000000B199BF3F0000004044D6A13F0000000032CAA03F000000007731BDBF0000000002C28C3F00000080F7CFA7BF0000000090D75ABF00000080D182A83F00000020F9A89EBF0000008029ADA0BF000000C0ACF0BC3F0000004029DBC6BF000000409475C43F000000002EBD93BF00000000D6EC79BF00000000DBEE953F0000000074969FBF000000A0545CBCBF000000804883B1BF000000402026BD3F000000C0BD7ECBBF000000001682C43F00000000999DCB3F00000040C983B13F0000000062C5C23F00000080520BBC3F00000040D3F1BA3F00000080D2ADA9BF00000000B490A7BF000000E0AB4CCABF00000080A9D29ABF000000002865973F000000006C3D8F3F00000000B61DA53F00000000C3E78EBF, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (94, 10, 0x0000000051EEB7BF000000809782B13F000000402C07A13F00000080299EA4BF00000020A8AEB8BF000000000A7C80BF000000A0C97FBFBF0000000038A0B4BF000000C076C1BD3F00000060F16AC3BF00000040235ACF3F000000209B80A6BF000000C0FFB1C7BF000000C0CAFEBBBF000000804CEA99BF00000000E73FC33F000000C05452CABF0000004005E8A6BF000000E052E68F3F0000008010EEA13F000000009ED9C13F0000004029918ABF000000001AE989BF000000C047C6AB3F000000409AF6B2BF00000000C270D9BF000000A05F53C7BF000000409D9CAFBF0000000027CDA13F00000000CDC4BABF000000C0552EB8BF0000008019A2AABF000000A05E19C4BF00000060C6B3B6BF00000000F89C7A3F0000006013A5B33F000000002213A8BF000000208A0BB5BF00000020950BBD3F00000040608E95BF00000000510FC4BF0000004032C5B23F0000008089199D3F0000000052D7CB3F000000A0D1B9C43F000000C0D70AC03F00000020AB57933F00000040CCE3C0BF000000C0DDD1C13F000000209EDBC6BF000000E0B7AE9B3F000000C0F743C13F000000E01EA0B23F000000C03D84B43F00000000C0093C3F000000001827BABF000000004C7EAF3F00000000E789B53F00000080E880C6BF000000E03DFFA43F000000607BE3A73F000000E08427BCBF0000004091C7953F00000000D8AF55BF0000006028E9C73F000000804F94B33F000000C0C103B8BF000000001C96CBBF00000080C14FBB3F000000E06D63C6BF000000606A4CACBF000000A0F1BA9F3F00000080E504C1BF00000000BA6CCABF000000604BDDD3BF00000000ABB2A03F000000C0F93DD93F000000A0BF1BC33F00000080141DC4BF00000000DFF1A63F000000604A83B6BF000000C07EBBA5BF000000407082C03F00000040E806C23F00000080FDBE9F3F0000008025D3A4BF0000004058A7C0BF0000008022CDA73F0000006071B6CA3F000000609953B9BF00000080C7C5823F000000402911CD3F00000000322D9A3F000000A0767BC03F00000080354B9A3F000000C06EE4AF3F0000000075BFBFBF000000C0D69AA93F00000040C467B3BF00000000031E833F000000402B3CB13F000000C0193F98BF000000003410793F000000206C1EBE3F000000E0EBA5C2BF000000C0B2A2C43F00000000792B8FBF00000000B8D277BF00000000980A9B3F00000000228499BF000000604D67C3BF00000000C960AFBF0000008023F7BB3F000000A09F69CFBF000000E080DEC93F000000C040EACB3F0000006099A5B83F000000A09A79C23F000000802AB9BB3F00000060B7D0B33F000000005C8270BF000000405717B1BF000000C0FF2ECBBF00000080B0ACA2BF000000C064C0A23F000000003EB5713F0000000094E3A53F00000080DCD19CBF, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (95, 10, 0x000000A05F80B4BF000000C0C0E5A53F000000C0818C7EBF000000804FE6A4BF000000801136B7BF000000009DAA8F3F00000020C94FB1BF000000407C5CABBF000000004977BA3F000000C0C37AC4BF000000A0E138CC3F000000C09D54B0BF00000080CAE7CABF00000040CE22ABBF000000201585A3BF000000C00A62C33F00000080763AC4BF000000200626ABBF000000803E1092BF000000806E02AA3F000000400FC9C23F000000800DA14C3F00000000C8078BBF000000403EE9A53F000000A044CCB2BF000000403043D8BF0000004090B9C6BF000000601181ADBF000000606B2C9E3F000000C070F7BABF000000A01428B0BF000000C0BB72A1BF000000A097E5C0BF00000000242573BF00000000D09C543F000000806131AB3F00000000BFB09BBF000000E02C92B2BF000000C039A7C63F000000E07708A73F00000040AB7CC8BF000000005402A73F00000000583F963F00000000402FCE3F000000C06F15C13F0000000020ACBD3F000000C0E865933F000000007F09BEBF00000080FC7ABD3F000000E09889C5BF000000A06BD8983F000000E068F7C13F000000A0F4F8B53F000000E002DDB23F00000000029E92BF0000008045EABABF000000406781B33F00000000736FB53F000000404F55C3BF00000020B4EE9B3F000000A079A1AD3F0000004084FFB6BF000000E01F709C3F0000000080D25CBF000000603B46CB3F00000000A44CA13F00000020781ABCBF000000209982C4BF000000805CB8B53F000000A0CACDC6BF000000A0D647A0BF000000207C62973F000000808232C3BF00000000C3A3CABF000000E03D8AD0BF00000000D24BA53F000000808442D93F000000A0F120C43F00000040E004C1BF000000402B65AD3F0000002068DEB3BF00000040D40FA6BF000000209D58C33F000000C0E03EC33F0000000004A988BF0000008095C393BF000000E01352BCBF000000007AC3A73F0000004064E1CC3F0000008066D6BCBF000000401E7EA23F000000808F85CD3F00000080449B833F00000040CFB9BE3F00000020765979BF0000000090777A3F000000E0DDFDB8BF000000E05754A53F000000C0E5878FBF00000080D08E913F000000C0E8C4A83F000000601365B0BF00000000F1D1983F000000203A67BB3F000000404F08C8BF000000E0E5DFC13F00000000CEED9ABF00000000D72383BF0000004007FDA63F00000000B8066B3F000000A0C8A8C2BF000000406AEFB2BF000000800457BB3F000000805FEECCBF00000060FF0EC43F000000C0A29ECB3F0000006072ADB13F000000E00C34BE3F000000805F40C13F00000000DDB3BC3F0000000018FC7EBF00000000A27A9BBF000000A0F7B0CDBF00000000B0A91DBF000000409742B33F000000001BC4873F00000000B522A93F00000080ACE5A6BF, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (96, 10, 0x000000404C2AB8BF000000004D78AF3F00000060C337B73F000000407E09A6BF000000E00549B3BF000000008EA0723F00000000FEC3BDBF000000C077B0ADBF000000E0353AB93F000000C0936AC4BF000000209E90CC3F000000A0C9DAA5BF00000000DA27CBBF000000C0C2F4A0BF00000000392B93BF00000080D9C2C43F000000C05C70C8BF000000C0A3B99BBF000000A0196E953F0000000072A4973F00000080E7ABBB3F00000040E1BF7C3F000000C06B3C943F00000000F4D2843F000000C06E30BCBF000000209D34D6BF000000807CF2C2BF00000040840CB2BF0000004018AA813F000000005670B5BF00000080CB1EB1BF0000000088E961BF00000000806CBEBF00000040B9C1913F0000000082E690BF000000609246B73F00000080A26399BF000000003BCCA0BF000000E03050C43F000000607BE6A63F000000402F89C9BF00000000F6C5953F00000000B02851BF000000C003CFCC3F000000C020FCC23F000000C0BFA7BD3F000000E0B9FC763F0000004014B1B9BF00000080C1A7BB3F000000C037EACBBF000000C07163AD3F000000000B1CC03F00000080118EAE3F00000000362DA53F000000806317933F000000409DEABEBF00000080699DB63F000000C0AED8AA3F00000080E367C6BF000000608ABDA53F00000000F079B73F000000C08662BCBF00000040B1A0A03F00000080C9E3A13F000000402FCBC83F000000C06FA5B33F0000004052B6BABF000000407644C2BF000000405E17B53F000000803455C1BF00000060F02FA3BF000000E0A2A1AD3F000000C09BF0C0BF000000605DECC8BF0000000094E0D3BF000000008F80973F000000604A30DB3F000000203EE7C03F00000040F157BEBF00000080DD55A53F00000080B6B3B1BF000000A0A47EAFBF000000806B57C53F000000C0ACF1C13F00000000B2FAA1BF000000002CFB9EBF000000E0E56DBCBF00000000FFB3AE3F000000E0AE87C63F000000607CA8BABF000000C011A6863F000000E07C0ACC3F0000000050B7513F000000A04D72BF3F000000C0C7D392BF000000C0A062A93F000000403E83B8BF000000801CA5A73F00000040243BA7BF00000000967782BF00000080E2EAB43F000000E005CBAEBF00000000B0A0973F000000A06020BF3F000000C0D948CABF00000000C2F1BF3F0000000053AC8EBF000000C013D499BF00000080142BB03F00000000C5FF933F00000040A3B0C4BF00000080804CB0BF000000C019B2BF3F00000000E3CCCFBF00000060D7FEC03F00000040386DCD3F000000A03B86A13F000000806747BB3F000000201965C23F000000C0E801B83F000000001DED81BF000000007B1CA5BF000000A0F5B3CABF000000C09BEB84BF000000C0652AAC3F000000802E74903F00000080DE4DA93F00000000E82067BF, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (97, 10, 0x00000060243BBFBF000000E0CE22B53F000000A05BB2883F00000000FC66B2BF000000C0910AB4BF0000000008A89DBF00000020F6E3B4BF00000080C652BEBF00000040F3E5BF3F00000080F19CC6BF000000205899D03F0000000033CEB2BF000000C00D09CBBF000000209091BFBF000000800176A5BF0000008033E4C33F000000008FD2CABF0000000076F6B9BF0000002011BC7E3F00000000E5D48D3F0000000092B5C43F000000C022DD6ABF00000000806E0E3F00000000618AA83F00000000D83AB9BF00000020640CD9BF00000000E06BC3BF000000202D92B6BF00000000170A793F0000008017BBA5BF00000040D90DA8BF000000804A8A9DBF00000080EDEEC5BF0000004090DFADBF0000000070174ABF00000020C367B73F0000000004B271BF000000E02AACB2BF000000A057AEC33F000000C07F329FBF00000080728BC8BF000000802B16AE3F000000202A55A83F00000060AEEAC93F00000080A467C33F000000400021B93F00000040EBB9953F000000002474C6BF0000006055C4C23F000000A08F2AC3BF000000209AD7823F00000080A163C03F00000040D4E1B03F00000040F5F9AE3F0000000002E988BF000000200D1CBBBF00000080F476B63F00000040BC92AE3F000000E02D5DC8BF00000000DCFD57BF000000204C6CB33F00000060E4ABC0BF000000C0E031913F00000080DC0E99BF00000020B0DBCC3F000000400C6BAA3F000000208E2DB9BF000000000DAEC8BF000000A0FD9BC13F000000C036DFC7BF000000001E52B5BF000000E0B904A63F000000405F82C2BF00000080E688C7BF000000C0AAEAD5BF00000000B9369F3F0000000005A4D93F00000020A163C23F00000040EF9FBFBF000000C09F1FB63F000000E0D842AFBF00000000E59983BF000000803A82C43F000000806FA4C53F00000000C85551BF000000008E7786BF000000A021EABFBF00000080BD0DA53F000000204C36CE3F000000C0D76EB5BF00000040153DA0BF00000060396CCC3F000000806D368B3F000000000D35C43F000000E04011A83F000000806739A13F000000E06B1BB8BF0000004062E1A53F00000020A029B4BF000000804256AD3F00000000C8F3A73F00000060D0CF98BF00000000703A763F000000800FE4BB3F000000C0BF71C0BF000000A01E4BBA3F000000C070C7A5BF00000000894881BF000000001A9876BF0000000072C39BBF00000060EA10C0BF000000801EDBADBF00000080487AB63F0000004043D0CDBF000000202FE3C93F0000004005BBC83F000000404E92BB3F000000C0CEE3C33F000000201548C33F000000206655B23F0000000048EB90BF000000002225A8BF000000E0821FD0BF00000040BBCB9BBF000000E06160B63F00000000C0FA463F00000080E392BD3F000000809E2688BF, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (98, 10, 0x0000000068B4B9BF000000008CC0B13F000000A0499E9A3F000000C0A913ADBF000000E04BCDB5BF000000000D4283BF000000204B15B6BF0000004075C9AFBF000000200999C13F000000C08F93C6BF000000007F9CCF3F000000605E8FAEBF00000000FE96C9BF000000A0BA5BB9BF000000C07A37A1BF000000602685C23F0000000005F2C7BF000000E04767AABF0000008004E2693F00000080CA9BA23F000000008A99C13F0000008061628DBF00000000FF4198BF00000080DB22A93F000000400916AEBF000000C024E4D8BF00000060EECAC4BF00000020E632AABF000000005A9D9D3F000000407617BEBF000000607E9AB0BF00000000EA3FA0BF000000C0EF47C2BF00000060A465AEBF0000000020BB71BF000000806DA3B53F000000C091E6A6BF000000008417B1BF000000806283BE3F000000005F1C91BF00000080E8C8C3BF00000080C256A03F000000808715943F00000020AA25CD3F000000C01CC9C33F000000C0984ABD3F000000404549593F00000000CF59C0BF000000A058B5C03F000000C00EABC9BF000000E0C81F8E3F000000404323C03F00000060B76DB23F0000006058E7B33F000000C077CB973F000000E06CA8B9BF00000080A194B43F000000C0F862B03F000000A0E92FC5BF00000060C8C09E3F0000002046D9AD3F00000080AD9EC0BF0000000084FD4FBF000000007C79733F000000E0702BC83F00000080CC8BAE3F00000080FF11B7BF000000405726C9BF00000020BF8FBF3F000000A0E9A3C6BF000000C04A36A8BF000000802C7EA23F00000000D0C2BDBF000000E07CD3C8BF000000C0D2ACD2BF0000000037D0A13F0000000059CAD83F00000000A077C53F0000008021EEC0BF0000004039E9AB3F000000C088B9B4BF00000080A68291BF000000C04F74C13F000000800A0FBF3F0000000088A25D3F000000404825AABF000000A0D2CCC1BF0000000084D3AB3F000000C0173DC73F000000003CCAB8BF0000008048FE773F000000E0BCDCC93F00000080E30F8B3F00000000AA21BE3F0000000049F6923F000000C0DC6EA13F0000006078F3BBBF00000080AE65AD3F000000C0A4E9B0BF000000803431923F00000040583FB73F000000805D6AA7BF0000000016B1863F00000000E2B2BD3F0000004097B8C3BF000000001399C23F0000000021BA99BF00000000EAB984BF000000007095A83F000000003EBA84BF000000408DEAC2BF000000804DB1AABF000000C0D7C0B83F0000004017D4CFBF000000408F98C83F000000C016B5CA3F000000A007CCB43F00000080642EC23F00000040FFD0BB3F000000205406B73F000000004030333F000000404C90B0BF00000040B63ECABF00000040ED22A5BF0000008082679B3F00000000F372973F00000080ACB2A13F000000A0BE2DA2BF, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (99, 10, 0x0000006069A9BCBF000000A0F07BAB3F000000409EE386BF000000C037F6B3BF00000060C881B3BF0000000052288ABF000000A04E22B1BF000000C07644B8BF00000000E965C53F00000020CCC2C5BF000000C05AC6CC3F000000804278B4BF000000608CCDCBBF000000E0CA28BDBF000000A063D7ABBF000000E01AAEC33F00000000F157C9BF000000204BEFB7BF000000E06D81933F00000000ED558DBF000000003920C33F00000000CA9A7EBF000000007BFDA0BF0000004022E5AF3F00000000A36EB3BF000000800503D7BF000000C0BCFEC2BF000000C02B4BB4BF000000005B8D8E3F000000805483B3BF000000C05F55AFBF000000007A0690BF000000002B5DC7BF000000006E93B7BF00000000BDAF863F00000000BB9FBC3F00000000A85C7EBF0000000043B0B1BF000000A03757C13F0000002006A1A0BF000000603EF7C2BF000000001C3DA93F00000060D6E0B23F00000000D458CA3F000000E0D660C43F000000E0B1BBBB3F000000A0DD8C96BF00000060BAB3C6BF00000040E643C13F000000C0DB22C3BF00000020C5D16BBF000000408403C23F00000060B0DCB03F00000080D22CB53F00000000998C92BF0000006075AABCBF000000802470B53F000000C0C5B6AE3F000000A02FDBC8BF0000000000C86DBF000000E0E279B43F000000A0F0CCBABF000000009C8D553F000000007FA791BF000000C0AF30CD3F0000006041C1A73F00000000E48DB7BF00000040BB6FCBBF0000002080E5C23F00000040D428CBBF00000040882EB6BF0000004011F7963F00000040166EBEBF00000080E3D9C6BF000000007AEBD3BF00000000CF2E9C3F0000004066CCD73F000000E034C5C53F000000803787C1BF000000206BC3BA3F00000040E66FB7BF000000003D7296BF000000606016C43F00000000225AC03F0000000024808B3F0000000038C285BF000000801681BDBF00000000CC8E8B3F000000E08AC2CC3F000000C05008ADBF00000060A2AE89BF000000A0E60DCA3F00000040A26D9D3F000000805FEFC03F00000020B475AC3F0000000085FA913F000000A040E3BBBF00000000B251A43F000000E0D169C1BF000000001618833F0000008023BE963F000000A0421597BF00000000B2E48C3F000000006371BD3F0000004024D9C2BF0000000021C3C03F00000080E65992BF00000000BC319EBF00000080020090BF00000000C07392BF000000C0C6ACC2BF00000080F7DDA6BF000000C04AE3BC3F000000208365CFBF000000E03EF4C93F00000080B112C73F0000000007C4C03F00000040BEA2C43F00000060CDA3C33F00000000364DB73F00000000D89677BF00000040E5FCACBF000000A095FACDBF0000000098EAA1BF000000006F7EAF3F0000000060CD75BF00000000BA49BC3F00000000505973BF, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (100, 10, 0x000000A01502B3BF000000C010D3A63F000000601FA27A3F0000002034A6A7BF0000002085BFB2BF000000008EAF7EBF00000020E8C1BABF00000020CAC6B4BF000000E0E5F6C23F000000606436C5BF00000040BC48CF3F000000A0C372AFBF00000040A03DCCBF00000020C614B5BF000000608EFCACBF000000E0632BC33F000000C0E4C1C7BF000000200BB7A5BF00000080EEA0913F00000080C8AB983F00000080182FC23F000000801E538FBF00000080FFB586BF0000008026F1A33F00000060DD30B2BF000000002E68D7BF000000605FB1C7BF00000020A6CBB3BF0000004060A8963F000000C074D4B9BF00000060E9ACB3BF00000080D85995BF00000000DF92C3BF000000C00960B2BF0000000024CA6FBF000000A03BEEB23F000000005733A8BF000000007B58B8BF00000060179DBF3F000000A08BBF863F0000000053EAC1BF0000008080E5A53F00000000301D6EBF00000040CE2ACA3F000000808665C53F00000080CE83C03F0000002063F0713F000000A0172FC3BF00000060FA19C03F000000A0856DC8BF00000020A1B7833F00000080FDC2C03F0000008059D8B53F000000402DEFB43F00000000B0EC52BF0000004057AFBFBF00000080A447B63F00000000ACC8AD3F00000000BF11C6BF000000C0FBED863F000000408385B03F00000060E519B9BF0000002096C69C3F00000000E4B8673F00000000BB0ACC3F000000804263B33F00000080B916BCBF00000080802BC5BF000000406BDCC03F000000E0FB9CC5BF00000040CFD7ABBF000000804AE4843F00000080423AC1BF00000080827ACBBF00000040F4C4D2BF00000080C23BA73F000000C06D2CD93F00000060C62CC53F000000809415C4BF00000040F16EA93F000000E0AEFBB5BF0000000058986DBF000000603792C33F000000409E27BF3F000000001237603F0000008044E9AEBF000000A001AEC0BF0000000080403DBF000000E0FB65CA3F00000060484ABBBF000000A079AD99BF000000403777C83F0000008072C682BF000000408277C13F000000C06A9EA43F0000000086FBA13F00000020AAA3BDBF00000080DDD9A83F00000080FD64B4BF0000000031B1953F000000C0B714AB3F000000801310A5BF00000000746289BF00000060C065BD3F000000403CCCBDBF00000000127FC23F000000000C7E96BF000000802E8BA1BF000000001F7C883F0000000030939EBF000000C022B4C6BF000000801986A2BF00000040ECAABD3F00000080F125CFBF000000009838CC3F000000201248C83F00000000B5D5B63F000000006EF3C43F000000408936C23F000000E0107BBC3F00000000707595BF000000802287A8BF000000A055CCCBBF000000E0C4F2AFBF000000407BD7AC3F00000000A7899B3F00000000108BB03F000000C0CB9BA5BF, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (101, 11, 0x000000C08229BEBF000000A0BCB3B43F00000060E2D6833F000000E067D7B5BF0000000083B7B5BF00000000E455ADBF000000804B1AA4BF00000040BCD2C2BF000000401419C33F000000A048F9BBBF00000080569DCD3F000000E0F257B3BF000000808503C6BF000000C06A56C4BF000000602BE3AFBF000000403396C53F000000004E5EC4BF000000E01871BDBF0000000003EF613F0000000058E76EBF000000A018A3BD3F000000000AB3A7BF00000000E95391BF000000806464A23F00000000644FB3BF00000080F465D5BF000000A02F54C2BF000000A05A63B6BF00000040AA60A23F0000000088C9A5BF00000020A161A9BF000000607C88B63F00000040D51CC9BF00000040A4CFBBBF00000000C082263F000000C06823BA3F0000008081159EBF000000201C8EB1BF00000040610BC13F000000E0DECAA9BF000000E02202C1BF00000000909898BF000000C06E09B63F000000E0CAA0CE3F00000080B90FC83F000000C0BE6AA43F00000080B14CB33F00000000830DBFBF0000006002B1B33F000000C04C4FBDBF00000020074A8D3F00000000887EBC3F0000008014FABB3F0000000075C0B93F000000803C79983F0000000000DBC1BF000000005720B03F00000040B624B83F00000080C281C3BF00000000BFE4A23F000000C007BAB33F0000008029FDB1BF00000000228CAFBF000000200883B3BF000000200A02D23F000000C0E112B03F000000A04828BBBF000000401C79C3BF000000204520C73F000000C016B2C1BF00000000F562B1BF000000008CE58FBF00000080A3C9C5BF000000406C51C8BF000000E08E29D1BF0000000048B6A53F00000060005FD43F000000009511C53F000000400B2DC7BF000000C08AADBD3F000000C0ABD0A2BF0000000024C090BF0000008049D4BF3F000000609308C43F0000000064D6603F000000C0ADF4AF3F00000040B8CCAFBF00000000D86D8C3F000000207E4EC83F000000C09B65B2BF000000A0AB27803F000000208954CB3F00000040DD8192BF000000001B85A43F000000E05673973F000000000F8DA4BF000000005CE2A1BF000000609C4FB43F00000020BB59BEBF000000007644913F000000407CBFAE3F000000604825B6BF00000000B0C6643F00000040144AB63F0000006012FABFBF00000060E7FBBA3F00000000802A303F000000C09027B03F0000000060229FBF000000408ABFB3BF0000008086E5BABF00000080D2D2A2BF00000000D428C13F000000C00DA3CABF000000804ECACC3F0000008045B1C53F000000C0A601AE3F000000E0EC0DC43F000000C057A3C13F000000405F1FC03F00000040ADA0AC3F0000004009F3A5BF00000080DFF1C7BF00000000DD267B3F00000060770EBC3F000000402EBFA7BF000000C019D4B33F000000C096669B3F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (102, 11, 0x00000060A838C0BF00000000B0AAB13F00000080188683BF0000006014BCB8BF000000E073CEB2BF00000080FE2AA2BF00000060DBCFB2BF000000A09882BEBF000000C07B3DC93F000000C0DF97C1BF00000000B2FACB3F000000C021D1B3BF00000080F7D0C4BF0000000022B8BDBF00000000783FB4BF000000A0E171C63F00000000398BC4BF000000C01311B9BF000000406F4A823F000000807AAF95BF000000A0330EC03F0000008045B0A5BF000000601D27A5BF00000000691CA63F00000060C378B7BF000000C052E4D4BF00000060F4FFC1BF000000E0535FB6BF000000204D95943F00000080C70FB3BF00000020C790A0BF000000407255A73F000000E0913AC9BF00000040C2AAB6BF0000000083B587BF00000020D39BBA3F0000008028EE97BF000000C0082CA7BF000000400B61C23F000000A0347099BF00000000A8EBC2BF000000003749A4BF000000404C64A33F000000C074B6CD3F00000040FEE9C43F000000E04CB49C3F000000805D45A13F000000E06405C1BF000000609E2AB43F000000407D9DBEBF000000E056E6823F0000008077A3BE3F000000007EEBB73F00000000F647B73F000000C0CDBEA33F000000800369B8BF0000000000E7A63F000000E0E2CABF3F000000C0ECF4C1BF00000080CF80943F00000000449FAE3F0000006010FAB3BF0000000004B3B0BF000000C01FEDB3BF00000060A382D13F000000E088A9B23F000000805DDEBBBF000000601E12C6BF00000040B431C83F000000A02428B9BF0000004069F0B1BF000000001E47773F000000207FEBC1BF000000C08D75C9BF000000607185D1BF000000803D02A73F00000020D9B5D53F000000802539C03F000000C027D5C6BF00000060F660BD3F00000060B5CFA9BF000000C0214DA9BF000000603626C13F00000000A17DC23F000000802A0CA23F000000806587A33F00000080C1C793BF00000080D2F5A53F00000080C0EBC73F000000A06DDFB4BF0000000026AB803F000000C09482C53F00000000C808ABBF00000000AD9DB03F000000A0EFA88DBF00000000C72892BF00000040E3CBA6BF00000040E48BBB3F0000002080E5B8BF00000080E891953F00000020C8BFB63F000000401DCDA0BF000000009C887D3F00000040C403B73F000000809A89C0BF00000020D3B4BC3F00000080F7959E3F0000008091CC973F00000000EA6A85BF00000000586BA9BF0000006068B6BFBF0000000029B199BF000000C067DFC33F00000000E79FCEBF000000C02475D03F000000409B93C43F00000080AC29A73F000000A035DAC13F000000E0D4DEBE3F00000020A560B73F00000060119BB13F0000004097E4A7BF00000000EC78CCBF0000006051B5883F00000080E520B93F000000C0C5BBA5BF0000000050E4AA3F000000006151713F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (103, 11, 0x000000A04CE7C0BF000000007593B93F000000C04A197E3F00000060769ABBBF00000040C4EBB5BF00000000620D70BF000000406657ADBF000000C08D3BC0BF000000A0220CC83F000000E08DABB4BF00000080567ACB3F000000800845B2BF00000040AF1FCABF000000608C59C2BF0000008050CAAABF000000004736C93F000000A0E373C7BF0000008046E2C1BF0000008059E5903F00000000D08E87BF0000008026B5C03F00000060957CA2BF0000000032AA90BF0000004017FFB03F00000060AC65B8BF000000206C02D4BF000000A019EAC0BF000000001C11B6BF000000806452A03F00000000F481B6BF000000A011FDB4BF000000C0B37EA03F000000C09E75CBBF00000000D285BBBF00000000745C9EBF00000000F305B83F0000000056DF74BF000000409EEEB6BF000000008BDBBE3F000000E08E3B8ABF00000040A67DC2BF00000000800270BF000000C0C586AA3F000000E0071ECB3F00000080502AC63F000000E0A9C6AA3F00000040E69AAE3F0000000013BBC1BF000000001919B33F000000602FBDB9BF000000405622863F000000007420BE3F0000006093A9B63F00000000F38DB53F00000000B58D8BBF00000060904EC4BF000000008402993F000000605789B93F000000405808C1BF000000E04027A03F000000803F7AAF3F000000C0EF4EB3BF00000000E9E5A5BF00000020A512B7BF000000C065DDD13F000000606084B23F000000E0A40CB8BF00000040D096C7BF00000060DAFEC43F000000E0D361B3BF000000C0CB11B9BF0000000050323C3F000000000CE3C5BF00000060A6E3C3BF000000408EAAD2BF000000004E35A93F00000020310BD43F00000000BD29BA3F000000E0D995C9BF000000E0FFC7B93F000000804980ADBF00000000203E76BF000000209259B63F000000C0CFB6C43F0000000075DA74BF00000060CA23B33F000000C0F47AB6BF00000000C46C963F000000C0DCA6C73F000000605D56B2BF00000020FF26853F000000802235C93F000000C0A17F91BF000000A0A0EEB53F00000080965A953F000000803939953F000000E0F8E6B0BF00000040EC86B63F0000008097FCBABF000000808E2091BF0000008051A4B63F00000060C1E399BF00000000ECD7873F000000401C32BC3F000000E03D41BBBF0000000012BDB83F00000000C32C883F000000A06AD3A33F000000809E01ABBF000000007E2DADBF000000C05189B6BF000000809E1EA1BF0000002053D3C03F00000080BF6BCABF000000A056DCCB3F000000603C07C63F00000080EFA3AB3F000000C09AB9C03F000000802C30C13F00000000E02EC03F000000007EB5943F00000000DB9895BF000000003423C9BF000000A0E17D963F00000080FBD4C03F000000005121A0BF000000C06823B93F0000002018CFA73F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (104, 11, 0x0000008071C9C1BF0000004051A6B13F000000408ECD9B3F00000040F7E1B7BF000000C07FFEB3BF000000A049FAB1BF000000C016BBA9BF00000020BA6FC2BF000000002711C63F00000020914ABEBF00000000F071CC3F000000403F8DB6BF000000C091CCC2BF00000040F050C1BF000000608D97B0BF00000040A083C83F000000804AA9C7BF0000006059AEBEBF00000000B8E695BF00000000B02669BF000000007634BC3F0000000057C0ABBF0000000026DF81BF00000000CC2AA13F000000A0F68FB1BF000000C09FFBD4BF000000A00131C0BF00000080789CB7BF000000A0FA649F3F000000009A25ACBF000000E06A05AABF000000C0F50DAD3F000000C0D100CBBF00000000D76ABEBF00000000208C473F0000004070F8B73F00000000904975BF000000E031B9B2BF000000E0DFD9BD3F00000060D84EABBF00000080F165C8BF00000000E040443F000000C02792B03F000000804909CB3F000000C099F5C63F0000004058E7A83F000000E0B2A5A23F00000040766AC1BF000000807706BC3F000000A0FD06BEBF00000080720A543F000000E0169BB83F000000003BEBB53F000000A0624CB53F000000003302983F000000E01E02C2BF000000807703B03F000000006DA5C03F0000002085B7C2BF000000404F4C973F00000060B7E1AD3F00000080C868B5BF00000080D3A38EBF000000207F25B0BF000000800D17D03F000000400C0EB53F000000002FA9B6BF00000060D1C3C2BF000000C0211EC53F000000E0972BB7BF000000E0FFEEA4BF00000000E22D65BF0000000033BFC4BF000000400903C9BF000000009335D1BF000000009CC9913F000000C06C08D53F000000A024F6BD3F000000805531C6BF000000C098D6B83F000000001CDAA7BF0000000050DF413F000000C057BFBE3F000000004285C53F000000000427773F000000E04025B13F00000040271FA8BF0000000044E4753F000000203480C83F00000060BFC7B3BF000000C051F9843F0000004089A9CA3F000000002758A8BF000000401DCEA43F00000000CCCD5B3F000000002F8C9BBF00000080EE81AABF000000A0C343B63F000000A0BE76BDBF0000000098427DBF0000008043BCAF3F00000040B9B9A8BF000000007053643F00000020109EB43F000000A03A57C2BF000000400190B13F000000002D36803F000000400F34AF3F0000008057D0A1BF000000000A2AAFBF000000C0542BA7BF00000080E331A0BF00000040667CBC3F00000000A8B4C9BF000000A0711DD03F000000403154C93F000000E0ACE7A83F000000208FA6C43F00000040DAA2BD3F000000E029A2B43F000000000B09AC3F000000002514A3BF000000208417C6BF000000408885973F00000040682CBF3F00000000582693BF000000C0942FB43F00000040448A943F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (105, 11, 0x000000402E91BCBF000000C0437ABF3F000000E00B5E903F000000003B3CB4BF000000C0F5C3B6BF000000E0E0CDB1BF000000E0381CA4BF000000C0E6E3C0BF00000040EBCDC43F000000E08273B4BF000000006EF7C83F000000C0B9B7B9BF000000602777C1BF00000060ACD9C2BF00000040B78AAABF00000080CC54C83F0000002000E9C7BF000000400D0EBFBF000000A08FEA90BF00000080547495BF00000040DE15BB3F000000C0361BAFBF00000000676E7C3F0000004002EAAE3F000000A071D7BCBF00000060BC1AD4BF000000A0FD0FBBBF00000000C0DDBDBF00000020A240993F000000807008A8BF0000008044D79CBF0000008027D39E3F000000C0E47ACABF000000C031F3B8BF00000000DB4D8EBF0000004087ECB33F00000000C8B653BF000000C08215B4BF000000C0F534C13F000000A08511A9BF000000C0004DC6BF00000000118893BF000000803F6DB23F00000080AC18CD3F00000060744BC53F00000060E09FA43F00000040D9AEAB3F00000040344ABFBF000000E0D929BE3F00000020F943BDBF00000000F77E72BF00000060BB94B93F000000409F44953F000000401B80B53F00000000E4B1A33F000000A02809BCBF00000080D07FB23F00000060F169BD3F000000604AF9C2BF000000E07B27953F000000803665AF3F00000020716AA7BF000000009B10A7BF000000804129B5BF000000C00789D23F00000020AB58B63F000000801891B6BF000000607F93C5BF000000601478C13F000000E037C8BEBF000000A01FDDB4BF00000000A848853F00000020B8DDC0BF00000080AA56C3BF000000007AE3D3BF00000000B8798A3F00000020DC4AD43F00000020637DBE3F000000A081C7C8BF000000409A59B33F000000801280AFBF00000000764E723F00000080AC5BC43F000000C0F002C33F00000000BF0B823F000000C0D803B13F000000E087D0B6BF00000000A0B289BF000000E06F12CB3F00000080E7D4B6BF000000405974673F00000040BA8DCA3F0000004044C199BF000000C0471AA13F000000404D9791BF0000000084F88CBF00000020864FB7BF000000602AE1B83F000000804DACBCBF0000000020875FBF000000804C95BE3F000000E06F3094BF00000000583183BF00000000799BB73F000000606775C3BF000000C0A046AF3F00000000D00B8F3F000000403970A83F000000C01546A1BF00000080C414A8BF000000802958BCBF00000000E776A7BF000000A07967C03F000000601989C9BF00000040EF1CCF3F000000004D3CC63F00000000B2B39C3F000000407A32BE3F000000807A81C13F00000060908AB43F00000000C952963F00000000B2669DBF0000004091C7C3BF000000A0D79E883F00000080A52EBE3F000000003EE89FBF00000040CBECB03F00000080B26B8C3F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (106, 11, 0x0000000010AAB5BF00000000A3BAB03F00000040D97CA73F000000007132A5BF00000040B281AABF00000040D24B95BF00000080A5BD81BF000000E0A4FBB8BF000000403221C93F00000040AF88B9BF00000040F0D7CD3F000000804D73B3BF000000404D69C7BF00000040962FB9BF000000C078FFA4BF000000A02F2CC53F00000020D619C8BF000000C0F28EBBBF0000006082268B3F00000000F4DC743F000000803EAAC43F000000E0030E98BF000000C0D609963F00000040717FA13F00000040DC48BBBF00000060A6A4D7BF000000405064BDBF000000001794B6BF000000C043CBB33F00000000AC3EADBF000000E0C3B3ADBF00000000872AA83F0000006077A6D0BF000000C0CB2FB5BF00000000D694A7BF000000001AFCB13F000000003C188FBF00000040A1CDAFBF00000080F27AC33F000000406FCE85BF00000080C7EFC9BF00000000D60291BF00000080D7109B3F000000A0E860CB3F00000080AE75BE3F00000020C851B13F000000807A95973F000000C0B37FB8BF000000C0D271A33F00000040E9B9BCBF000000006086953F000000205E63C23F000000C01682B83F000000C00AC7B03F00000000ED3988BF000000E09194B8BF00000000E27E943F000000403337BE3F00000000ED40C6BF00000080EDD5A13F0000000072DBB23F000000808271ABBF00000020478D903F00000080E8B3B2BF00000060FF15D03F000000404048A83F000000E0F145B4BF000000E0189AC1BF0000002026F8C03F000000007D30BCBF000000C0E567AABF000000009518873F00000020171EC1BF00000080790BC8BF000000808CEBD0BF00000000C1519C3F000000004D21D43F0000004097E5B33F00000080C1B6C2BF000000009CF0B73F000000A0435DB2BF000000600F7AACBF000000E09F6BBC3F000000C07F09C23F000000809266833F000000408BA2B73F000000A08F5CB3BF000000003E3AA53F000000806C13C93F000000E07659B4BF00000000DDCFA33F00000040191FCD3F0000004074B7ADBF00000080631A9E3F000000C08C9B9BBF000000004B0A88BF000000003BA9B3BF000000C09B4DBC3F0000000027E6B9BF00000000341A7EBF000000204388AA3F000000C0A29F9EBF0000000090E071BF000000003658B93F00000020B7E5C5BF000000E0DEE6B23F00000000A00E7A3F0000000076A47F3F000000004C8C963F000000003AD9A4BF000000E0B3FFBDBF00000080A8A7B6BF000000008290BD3F000000C0D3CDCBBF000000602416CB3F00000020C828C73F00000000F081A13F000000408FF8BE3F00000080AECFB83F00000080E25BB93F0000008029C99F3F000000001F86A4BF000000C0332ECFBF00000040D93D993F000000C0E449C23F000000C0B5D8A8BF000000005D1DAF3F00000000BAD57A3F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (107, 11, 0x000000406847BFBF0000008012DDB23F00000020553987BF00000040D70BBDBF00000000FAAEADBF00000040F71AA4BF000000C096C7A7BF000000009B4DC0BF000000E069B4C73F000000C0D2CBC1BF000000C0BDA7C93F0000000086D6B6BF000000007086C7BF000000A0FDA9B2BF00000060B83EAFBF000000804BD2C63F00000080CD9BC7BF000000001F9DBEBF000000406319AFBF000000008EE594BF00000040D6A1C03F00000000200DA7BF00000080406F9DBF000000C04597B03F000000006B8EB6BF00000000F9EFD4BF000000E0DCB8C1BF00000020615AB8BF000000209E9B993F000000006CC0A7BF00000000B8E5AABF0000000072F7963F00000060EA4BC8BF00000040EE2FB9BF00000000CF6291BF000000A0A038B43F000000808F779BBF000000A09E26B7BF000000403A63C43F000000E0C6729ABF00000080E954C8BF0000000080056C3F0000000037B1B13F000000C036ABCD3F000000409096C73F000000A0F7C9B03F00000080EF88A03F000000403007BCBF000000E0F8C0C23F000000E09E7EC6BF000000C0AB2B983F000000C094DCBD3F00000080C4B9B73F00000020A893B93F000000C00382A43F000000201241B8BF00000000CF88A83F000000E0A12AC43F000000E0D608C4BF0000008012C4A63F000000E0DCD1B03F000000C055CAB5BF0000008009599FBF000000403E4DB6BF00000000D78AD13F000000C054AABE3F000000002A25BEBF000000A02126C0BF000000E09826C83F000000C04717BCBF00000020D415B2BF0000000028186DBF000000C09534C4BF00000040E688C8BF000000A069EECFBF000000803248A23F000000C0A7BDD73F0000008088B5C13F000000801434C4BF0000004046A8B53F000000C02023AABF00000000195A8BBF000000202EEAC23F00000060EC35C43F000000005085873F0000000026689B3F000000C09D47A4BF00000000AD87953F00000000BA3BCE3F00000020EF11B3BF000000E0ECEF51BF00000060AEAACC3F00000040DE089DBF000000402D4BAA3F00000080CE8D5ABF000000007E31803F000000801A82B2BF000000A0AE19AA3F000000E08F78BEBF00000000DEDA7C3F000000600F0EB53F000000C0E8588CBF00000000B0787BBF000000C032B2B53F00000080C5CCBCBF000000A09F09B93F00000000608A703F000000402FBDAC3F0000000098F074BF000000800B8DA4BF00000000E229B4BF00000080D0E1A9BF00000040D458BE3F000000C0B861C8BF00000020AEFCCA3F0000000051A5C43F000000A09BFF9A3F0000000092EEBE3F00000040F27FBA3F000000A033E5B53F00000000B4E6AF3F00000080140FA2BF00000080C59FCDBF000000604F728BBF00000060590BC33F00000000BC68793F000000C05EA1B23F00000000A1B1763F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (108, 11, 0x000000E06219C0BF00000080958DB03F00000020D04784BF00000080028EB9BF00000000713FB7BF00000000B177A0BF0000004079A7A7BF00000000177ABEBF00000040E63EC73F00000060AC04C3BF000000A081D9CC3F000000C0AEC5B6BF000000207B6FC9BF000000601F09ABBF0000006064A7A6BF000000C09E6DC63F000000C016BDC1BF000000E07344C1BF0000000030BAA2BF00000000C42E79BF000000E0690FC23F00000000783DA5BF000000C0E4AEA6BF00000020E203B03F000000E0EC47BCBF000000802C4ED5BF00000080106AC4BF00000060960EB3BF000000C0AE55973F00000000CEA9AFBF00000020DD0AAEBF00000000AA478C3F000000C0D952CBBF000000C01858B9BF000000009CE68CBF00000080D940B73F00000000C3C79DBF000000601427B4BF0000000011B4C33F000000000C2597BF000000C09AC7C8BF000000008638843F00000000AF9EAA3F000000401678CE3F000000E0ED54C03F000000003B5EB03F00000000E437A53F000000400C72C0BF000000007A5FB83F000000A04F30C2BF000000007B9CAA3F000000C0A97AC03F00000020FEDBB43F000000008BE9B93F0000008041DB9E3F00000080E121B6BF00000000E405A93F000000E0A818C53F000000A028B1C5BF000000C00191A73F000000C031BDB33F000000600D20A6BF00000000E42E8DBF000000E0FF94BABF000000803346D13F0000008091B8B73F000000A0A63ABCBF0000008080B5C1BF00000060C10DC43F0000000018EFBABF000000400FF3B1BF0000000092A66B3F000000609AE7C4BF000000001967CBBF000000A0889DD0BF000000001337AD3F00000020A4DBD73F000000004024C13F000000E089B7C4BF00000020A7B3BA3F000000809CDEA3BF000000E0AAA7ABBF000000C077B3C23F000000A0B251C13F000000806C95A33F000000401971A83F00000020A03CA8BF000000009C53B03F00000000065ACF3F00000040BE07B5BF000000609B5E9C3F000000C0C015CD3F00000080A0BC9FBF000000C000A7A63F000000004D6064BF00000080BA89A33F00000080CF13B4BF000000C07321AE3F0000004096BBB9BF0000000098CE7D3F000000C0CDB3B33F000000E045AD88BF000000002C9F86BF000000408B73B63F00000060CC0FC0BF000000A00666BC3F000000006A3F873F000000E05B60A33F000000804D529CBF000000006FA79FBF000000A09284BABF00000040ED5BB1BF00000080BFBDBD3F000000C0BAB6CABF000000C0A219CB3F000000C09FF8C33F00000080F0F7933F000000408B84BC3F000000E020FCB93F00000000D831B43F000000008CEAAD3F000000408FE3A5BF000000602A32CFBF000000C0A0856EBF000000E03B03C33F0000000098FE6BBF000000C06115B43F0000008048FA913F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (109, 11, 0x00000000276ABABF000000E03B2FB53F0000004068689BBF00000080228BB6BF00000060A94AB2BF00000060BFC8A7BF000000E0F3D8A6BF000000209E54C0BF000000C0B02FC83F00000080A304C1BF000000C066E5CB3F00000080ED23B2BF00000020DD7CC6BF00000000B665B4BF00000000C25AB0BF000000C0EC18C63F0000008064A7C9BF0000004024B5BBBF000000E06A9F8FBF000000009097773F000000C00671C53F000000E0E09499BF0000008022D490BF000000C04C55AD3F000000C05AD2B4BF000000C083F0D5BF000000200542C0BF000000E05FB3B5BF000000403880A33F00000080886AA3BF000000E0CACBA0BF00000000B9AA943F000000E008B0CCBF00000060D4E8B9BF00000000842E91BF00000080EFD8B03F000000E02879A7BF000000A05ED6B1BF0000006014BDC43F0000008009CE44BF0000008044B6C9BF000000009C7577BF00000040A432AC3F000000E0CCBACC3F000000E08639C23F000000803418B13F00000000F955A13F0000008010D5C2BF00000060ED4AB73F000000E0E640C0BF000000206143A13F00000040C43CC03F000000804929B83F000000005A90B73F0000000048358A3F000000806939BABF00000000F10BA13F000000E01E36BF3F00000080EA55C4BF000000C08CA0993F000000C04191B13F000000A0E2E9A3BF000000C08FCC9DBF000000405C45B6BF000000607884D03F000000E0FC0FB33F00000060D8A2BBBF00000060F238C2BF00000040CC74C43F000000E0D6F6BCBF000000C0A9B1B9BF00000080AC76813F000000207E8AC0BF0000000076DACABF000000800066D0BF0000000057F7933F000000805E79D73F000000E0B04CBC3F000000A0A890C4BF00000000FF54B73F000000607790A9BF000000409337B1BF000000E0DC74C33F00000000EA5DC63F00000020F6CFA23F00000080416DAF3F00000040F1499FBF00000080CE8EA13F000000004F57CB3F000000E0045FB6BF00000040461B76BF000000808995CD3F00000080F36F9CBF000000802E3CB03F000000C061FF79BF00000000F600863F00000080E2B4B0BF000000E02C3FB93F00000020B1A2BEBF000000009EE191BF000000403F3FB43F0000000034C66BBF00000000E8A691BF000000E0077CB53F000000E0C878C0BF000000E0B44DBC3F00000040C027A23F00000060710CA33F00000000A89E863F000000009CD3A2BF000000C0DBE4BDBF00000000B635B2BF000000809763BC3F000000E0A1F0C9BF000000E0C996CD3F00000020B18EC43F000000003A8BA43F00000060FF94C03F000000207A3DBF3F000000E0C014B43F000000207BFDB13F000000C00798ABBF0000000072A1D0BF000000006F6D583F00000060D143C23F0000000036F075BF00000080782CB23F00000000529767BF, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (110, 11, 0x000000803305C2BF00000020B175BB3F000000A0E33C983F00000040BAD7B4BF00000000914CB4BF000000800329ABBF000000009AA689BF000000607E13B5BF00000000311FC53F000000A0E03AB5BF00000080006CCF3F000000E02F80B7BF000000C0F085C7BF000000203529B0BF00000020442FA9BF000000006F8FC93F00000000AF3ACBBF000000404047BCBF000000807E50A3BF0000008050EFA03F00000000C79BC33F000000C057358CBF00000000A1E486BF00000080F6EDB33F00000080EAC8B3BF00000040A9D2D4BF00000080C458BDBF00000080083DB1BF0000004069069F3F000000408031B0BF00000040A83C9CBF00000000CA7F743F0000004062B3CEBF000000408499B4BF00000080568BA2BF000000C01E79AC3F00000040254996BF000000A0FE92BABF000000202874C13F000000C00AEC85BF000000C0F415CCBF0000000088367B3F000000A01AE0AB3F000000E0B3A0CF3F00000060E84CC03F000000605D689B3F0000000066C39E3F000000406125BCBF00000020E8A5B13F000000C0A28AC7BF00000000F8B7923F000000E0BACAB83F00000000286EB23F000000009FFEB33F00000000C8C6523F000000809B4FBFBF00000000D8BA713F000000002175C13F0000004088ECC0BF00000080D6E7713F000000C060CFA03F0000008036419BBF00000000D61A7C3F000000203524C2BF000000C05B7BD13F000000008958B53F000000006BDABCBF000000C04F1AC3BF0000004069FEB73F000000C0A0EFB5BF0000008011B3ADBF000000A02083B23F0000000057E5C1BF000000C0609CC6BF000000005863D2BF00000000C664A73F00000000DDF7D83F000000E08A1BB03F00000080CB1BC4BF000000802869B03F0000006050B5B9BF000000C0D22AA4BF00000060DEEDB43F00000040A372C23F000000C057AD9D3F000000005B99B63F000000E039C9B6BF0000000095CAA43F000000606847CE3F0000004003BFBDBF00000000F404613F000000C0ACB9CB3F000000407BCA90BF000000006C3B973F000000C0229E99BF000000000088FBBE00000000FC62AABF00000020E5D0A93F000000602E3FB8BF00000000E5318DBF00000000EC379D3F000000E0389293BF00000080B482ACBF000000800A10B53F00000000BE67C3BF0000008021BBB13F000000009FD0AA3F000000008108723F00000000C1B58FBF0000000024648FBF000000E04D25B9BF000000800672B5BF000000C0D247B93F00000000A8EACCBF00000000255DC93F000000C079E9C43F00000080473DA13F000000C0B8B9BF3F000000004D1AB13F00000000DB3FB83F00000000A05C81BF000000001AC787BF00000000AA1AC5BF00000020154F993F00000080671DC53F00000000E79E8A3F000000003A18B23F00000080152B84BF, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (111, 12, 0x000000801E60BCBF000000A0A513B83F000000C0E28DA83F00000040363FA6BF00000000008793BF00000040A402B9BF0000008083418FBF00000080E387C4BF000000A077B4B73F000000006712ABBF000000407100D13F00000000D610AFBF000000404BC0C8BF000000003E69C9BF000000401774A6BF000000C0872BCD3F00000020BC00CABF00000080D101BFBF00000000BFC5A7BF0000000082ED853F0000006039A7BE3F000000E082A2713F000000E07100A73F00000080EC1AA53F00000000A298BBBF000000E071DED5BF000000C0260AB8BF00000040AF6FA9BF00000000056B763F000000007CCA8C3F00000080CF85A7BF000000004132933F000000002642CCBF000000808ECDB3BF0000008051A69A3F0000006098ABA43F000000000907873F0000004030EAB2BF000000407052C83F000000C0EDD57F3F000000C04A3CCDBF00000040BCEFB43F000000A0F47AA83F0000000073B7D03F00000040376DC93F00000060E90F9C3F000000406FB1B03F0000008057AABABF0000004062D8BF3F000000607DAAC6BF000000003E8D753F00000040148DC03F00000080EC32B43F00000000A120993F0000008020E493BF00000000E399BABF0000000024AC843F000000600423B93F000000C0B389C0BF0000000008BE783F000000009358B53F000000806D11B9BF000000404A6995BF00000080B88AB9BF000000A05AA2C53F000000E04C1F973F000000A0CEFEC0BF000000606B4CC4BF000000807590B43F000000809E8EBCBF0000000041BBAABF000000A0BEC8A03F00000040FDAAC7BF00000080DFC3C5BF00000020AA55D8BF0000000089F39C3F000000806F81D63F000000A00103B53F00000040EB2BC8BF000000009B87AF3F0000004069A3B0BF00000020761DB73F00000000DCF8C23F000000E0949AC13F00000060A0D7A53F00000000FCABA33F000000A0596DBFBF00000000483D6B3F000000A06A0DCB3F00000020FB67B9BF000000E0E555ADBF000000204688CF3F000000406EB894BF0000002010D3B23F00000000E5C794BF000000C0BD59A23F00000080443996BF000000E0DF00B03F00000020DA0DAABF000000A0E8ECB23F00000060E1AEB33F000000406C1A94BF00000000967CA43F00000080C812B83F00000080C2F6C2BF00000080BE9AB63F00000000FBBD80BF0000004099E4BA3F000000C0DD1EA23F00000000B0A47ABF000000E027D0B8BF00000000C494AFBF000000A09B51AB3F000000E0EF7CCABF00000040B001CF3F000000C0917FCC3F0000000098FA31BF0000008022B3B53F000000C0894FBB3F000000C0B671B13F000000001D1BA6BF00000000FC69953F000000A01D58C5BF000000003097A6BF000000A00F00BA3F00000000F8F86C3F000000409D30C03F00000000AE4A813F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (112, 12, 0x00000000BBF7BDBF00000000C4ACB23F000000E06AD9AB3F000000E0D7C7A1BF000000403637A3BF000000807AEFB3BF000000C089AD98BF00000040CEE5C4BF000000604581B33F00000000C097B0BF000000C0C6E0D13F000000C02532ABBF0000006069A1C6BF00000040599ACABF000000405B86ADBF000000001140CA3F000000C0BE8AC8BF00000060C6EBC0BF000000A08645A5BF0000008001CA973F00000000D12EC03F00000080E161933F00000000F34A793F000000001C339F3F000000C0D945BDBF000000602AD0D4BF00000080B3AFB7BF00000080B1B7A6BF000000801251883F0000000085C995BF00000020E689A7BF000000002F669F3F00000080387FCEBF000000400D3CB4BF000000C0EDF9A23F000000807924AF3F00000080CA0D913F000000400374AFBF00000040081EC63F000000E0F0D6923F0000000077D0CBBF00000080C8CDB73F000000805B9DA63F000000A011A2D03F00000040CDBCC73F000000C0F195A13F00000040AB0CA53F000000404776B9BF000000401433C23F000000808C8EC9BF00000080BBA56BBF00000060FBADC03F000000C06485B93F000000C0F28DA33F000000409349A1BF0000004053D2BBBF000000008C65843F000000C01B59B93F000000C07F42C2BF000000409E838F3F000000C046ACB23F00000020639CC0BF00000080396E91BF000000800F62B5BF00000020F9B4C43F00000060EB6FA53F000000E0B275BEBF000000809A0FC7BF000000A0DAE3B13F000000804EB9BEBF000000C0FB37B2BF000000802861A23F000000403EEEC4BF000000604F72C3BF0000006036EED7BF00000080B462A43F000000004929D73F00000020BE7FB43F00000080FF33CABF00000020E398B03F00000040E156B1BF000000A0FBCFB83F000000208624C33F000000C0B92DBE3F000000A0A9ADA83F00000000EE0AA13F000000803BE1BEBF000000008C3682BF000000405ABDCC3F000000409A45B7BF0000006029D7A8BF00000000B850CD3F000000809DDE97BF000000C073E6B53F00000000219F563F00000000C436903F000000000E4393BF000000404C9FAA3F000000007C0FA4BF000000A0E5AFB13F000000403475A73F00000040221481BF000000407179A93F00000080BAC0B83F000000C068F4C0BF0000000075A2B93F00000000DFB694BF000000A0D71BB73F000000005738A03F00000000651495BF000000601E7FB7BF00000080C880AABF0000004035BEA23F000000C0D8E6CDBF00000020343ED13F000000C084CCC93F00000000A5FF64BF000000A09C44B93F00000040EB6CBD3F00000040AD21B13F00000080A6C2A6BF00000000FD199D3F000000A0C7F1C2BF00000080B5E7B0BF00000080991ABC3F0000000090855A3F000000C0D383BE3F00000000208D94BF, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (113, 12, 0x000000604704B8BF00000080C6C3B43F0000006003E6B83F00000000F02057BF000000C09B48B1BF0000008094289ABF00000000847A7FBF00000000AFB2C1BF000000209666B23F000000A0972CB3BF000000C0BDAFCF3F000000E0311FA0BF00000020053EC8BF00000080D343C2BF000000403829A0BF000000E00492C73F00000040CB49C9BF00000060CDEFC3BF000000E006A8A1BF00000000B6038A3F000000A06652C13F000000808EE3883F0000000006B18EBF0000000066FE993F00000060F259BABF000000A0EE86D4BF00000040DD09BABF000000C04EF5A9BF000000E03DC09F3F0000000001399ABF000000C0B132AABF00000000CD7A9D3F000000C076B2CBBF000000C0DD2CABBF00000000E13196BF000000005439543F00000000D63C94BF00000040102AB4BF000000A0F834C63F00000080450C8EBF000000E03418CFBF0000008006DCB83F00000000EBD9A63F00000080D75ACE3F00000000D8C8C53F0000000092DE603F000000E0A7E39F3F0000000017C7A3BF0000008086A4B63F000000E03741C9BF0000006047D76ABF0000008046A8C73F00000040F1DEB43F000000C09357B13F00000000B781A0BF000000606B08BEBF00000000B0448FBF000000005314B73F00000000DFF8BFBF000000402B3EB13F00000040BCF5B33F000000406A9EC0BF000000C03EDC833F00000000445AB9BF000000004C24C13F00000000C3A8A03F000000005125BABF000000001014C9BF00000040B8A7AD3F00000060313CC0BF000000A007BAB3BF00000000187CA43F000000005E8DC7BF000000403A97C7BF00000000B449D3BF000000001CB4B03F000000002345D63F00000040044EB73F000000C0424DC8BF000000201877B63F000000C0883DABBF0000002088F0A63F000000E051D8C03F00000080C5B0C13F000000803D10B03F0000008077A8AA3F000000407DE6BDBF000000001E79843F00000000074DC83F000000A0E2BEB2BF00000000A64C9EBF00000040C4E6D13F00000040A28D96BF000000005B8BA83F00000060DAC5983F000000805459A43F00000000A87D6BBF000000C0B147AD3F00000020005FB0BF000000201E5CB23F000000C0BD31A23F00000080E9F2ABBF00000000E036903F000000403F41B13F000000C03FC0B6BF000000809E97BD3F0000008020AE97BF000000A02AF6C03F00000000C60F7F3F00000000B6ED90BF000000C07AD2BFBF000000807135A7BF000000407634B53F00000040624FCBBF00000000EA54CE3F00000080ECB5C83F000000804CC681BF000000001296B53F000000208273BF3F0000004039F1B63F000000C01D44A2BF00000000007C4FBF000000408A4FC7BF000000A0CA9BA4BF000000802F33C03F00000080F8F09BBF000000408D86B33F00000000EBE78C3F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (114, 12, 0x000000807CF2B9BF000000405064A63F00000080E162B33F00000040F2F799BF000000003A75A7BF000000405565A7BF0000000030CC79BF00000000418EC1BF00000000D861B73F00000040D46EBFBF000000809AC0CE3F00000080B0A8B4BF00000040FCB4CABF000000A0FB34C1BF00000000302FA1BF000000A06802CA3F000000E0C4DDC5BF000000807152C0BF000000E09A4DB2BF000000800D8699BF00000000EBD5BB3F000000A082AA703F000000C08ADA9CBF00000040A745A13F00000060F227B4BF00000040D195D4BF00000000ADC5B6BF000000803624B3BF000000E0E29278BF000000002B34A4BF000000E0E87DB1BF000000001AD18B3F00000040FEA7C7BF000000203ADBB0BF00000000793190BF00000000BCEBAE3F000000406393AABF000000001C4AAEBF000000A0E8B9C63F000000C0812D9C3F00000040CE00CABF000000003FD3AB3F00000000CEFD823F000000E0A02CD03F000000203D9DC53F00000080CAEFA83F000000404A66A23F00000040D500B5BF000000A0B650BD3F000000E07F6FCBBF00000000B0A8723F000000007771C43F000000A05469B13F000000C00F16B73F0000008006DA95BF000000C0A25CBCBF000000006051593F00000040C431BD3F000000A0965CC0BF000000A0A045AE3F000000C056B9B43F000000A02D58C1BF00000080BD55A3BF000000806ABEB4BF000000802F69CB3F000000408F0AAE3F000000E0A2E9C1BF000000C0DCDAC3BF00000020EDEDB33F000000800B34C1BF000000E024A8B9BF0000008071A2813F000000808EF0C6BF00000000D2AFC5BF00000040D117D5BF0000000048CCB23F00000080750DD83F000000A0EFA7B43F000000C0A583C6BF000000A0B211A93F000000209D71B0BF000000808182A93F000000C0D4BEC43F000000C05BD5C63F000000A01187A83F000000009767A63F000000E06B81B0BF0000000090FA61BF000000C0AC7DC43F000000A02731B7BF000000809126A0BF00000040F9D3CF3F000000A02F96A2BF00000020FA80B43F0000004093676ABF00000080A1BC903F00000080757991BF0000006062B2A73F000000E08C2AA3BF000000802F43A13F000000E0B98AB53F000000E00DB4A5BF00000080BD32A73F00000000334DB23F000000008AE0BDBF000000006084BF3F0000000005EEA3BF000000E030ECBD3F00000040FF5AAD3F000000007AA596BF00000040D65ABBBF00000080A901B1BF0000000004A4B83F000000C0D21BCDBF000000C00DA5CA3F000000C02091CD3F00000000EE025C3F0000006005E5B53F000000A00CF1BE3F000000C047E4B73F0000000061E991BF000000004DB29F3F00000060E46ECCBF00000060D0F884BF00000040B282BD3F000000C0281CA13F000000005762AC3F00000000E01B4E3F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (115, 12, 0x00000000AEC4C0BF00000080B9DEA23F00000020DBE2A33F000000009434663F00000080D33C92BF000000209BD4B6BF0000000078F18FBF000000E0D41EC3BF00000040D4F0BA3F000000C0004EA5BF000000000483CD3F0000008010C4ACBF000000A0FB85C3BF000000208CEACABF000000804B5B9BBF0000006096E9C63F000000E007ABC7BF000000A042E7BBBF00000000AEEBACBF000000001C4780BF000000C0853FC03F000000C02FDAA13F000000E0DB50A33F0000000020D3493F000000204312C1BF000000C04DE7D6BF000000A07AB4BEBF000000004531B2BF00000080946676BF000000008CBD963F000000A09E1CABBF00000000716FAB3F00000040F58ECDBF000000C015EEC1BF00000080B271A43F00000080A795B43F0000000098D17D3F000000C0BFB4AABF00000040D170C53F000000E06D908ABF00000040D81FC9BF0000000079C1B73F00000000982BB23F00000000E8ABCE3F000000809CDAC53F000000404A68AD3F000000E0725FA23F00000000CA6CB8BF000000C00680BE3F00000040CD84C4BF00000000B69F6ABF000000405308C23F000000C08096B23F000000E08294B33F000000807C8698BF000000E03660AFBF0000000092D8933F000000408734B43F000000C091B7C2BF00000000C6F864BF000000002F20AC3F000000A080AFB7BF000000E01B7D9FBF000000A0B7B4B2BF000000007C89C13F000000801C68AE3F000000C05884B6BF000000402731C8BF000000807D58AC3F00000040810CC3BF000000E002EDB8BF00000060403EA03F000000802153C6BF000000C0C9C8C5BF00000020AF50D9BF00000000DEF79A3F000000C0E356D63F000000A0EF97B23F000000805BF9C8BF00000060C900AC3F000000204E44A8BF000000E057B1AC3F000000E085A3C33F00000040E726C03F00000020CFA6A43F000000605AF3B33F000000003CF8B9BF00000000CCF5753F00000040CDC4CC3F000000603FD1B3BF000000A080CEB2BF000000802C6ECD3F00000000C92B8E3F000000E0DDDBB83F00000000605B9B3F000000C06225AA3F00000000A0E25B3F000000000666A33F000000407518B8BF000000C094DFA83F00000040FE29BF3F0000006080E5933F00000000EDF9A43F000000A0943AB93F000000004A9EBDBF000000A0237CBE3F00000000EB8889BF000000C0CD91B43F0000000082D59A3F000000005C899EBF00000000A7CDB7BF000000000A2AA9BF0000002075FEAF3F000000C03CE8C7BF00000060D3D1CC3F000000807EE8CA3F000000806DFE98BF00000000FFA2BB3F00000080BB64B93F000000206EC6B03F000000C01C2BB1BF00000000AC4DA53F0000004056B3C6BF00000080B705B1BF00000040D4EABA3F0000000013F9A63F000000C0799FBB3F00000000A232723F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (116, 12, 0x000000801653C0BF00000000A04AA03F00000000CAC3B43F00000020A0D59DBF000000003F3DA7BF000000A07D50ACBF00000080567387BF00000000EAF6C0BF000000E0B5A8BB3F000000602908C0BF000000600691CD3F000000A09D0AB6BF000000A0F8D3C6BF00000040451AC0BF000000C08BFEA9BF000000C094A4C93F000000404F8CC7BF00000000236BC1BF000000401EDCB1BF00000000088A81BF000000C0F87AC03F000000609F6677BF00000020CCC3A4BF00000080D9F7923F00000040693BB3BF00000060B104D5BF000000C0BD6EB9BF000000C005E7AABF00000000FE0A84BF00000000A50BA0BF00000060921FAABF00000080D3089F3F000000A0E739C9BF00000020DAD5B2BF00000000A2F093BF000000E05B67B03F00000000BDAA9DBF000000806FBFADBF0000008042DFC53F000000C0B2697A3F000000A0FB9DCBBF00000000BB87AB3F00000080D2829B3F00000000E7DECE3F00000080F84FC73F000000C027D8A23F000000809AF69D3F000000004316B3BF0000008095A8BE3F00000040F8E3C8BF00000060371493BF0000002072E0C53F000000C0F4E3B43F00000000AFB4BA3F000000008ADD99BF00000040F1A3B6BF0000000020798A3F000000000EDFBC3F00000020F06CBABF000000E02C18A73F000000003A5DB93F000000002F0AC1BF000000603BF4A1BF00000060615DB4BF00000040619CC83F00000040BD58A63F00000040E602C1BF000000803AF3C6BF000000805756B63F000000403E7FBDBF00000080649BBABF000000802C63833F000000C02886C8BF00000080613DC6BF000000806070D4BF000000808CAEAF3F000000C0EF0AD83F000000A0B61CB33F000000C0DAC2C7BF00000040DB9BB03F00000080C522B2BF000000C08302B03F000000007309C43F000000E06AF6C53F00000080DF1AAF3F00000040FB64AC3F00000000122FB2BF00000000AA5F82BF000000E073C9C53F000000809953B2BF000000809B90A5BF000000C04B54CD3F000000C0BADE97BF000000E0C44DB13F00000040AA2E603F000000000DE5963F00000000D40C743F000000603E74AD3F000000803E9FADBF00000040A3E9A43F0000008032DAB43F000000C0DF9798BF00000000FC0C9E3F000000A0EA09B23F000000C0A8B3B8BF000000805B63C23F000000003E5EA0BF000000E06C6AC23F000000803B9DA33F00000000134790BF000000C07455B9BF000000008807A7BF000000C0542BB53F0000008082C7CBBF000000605BF8C93F0000008091BDCB3F00000080CDC572BF00000060FB0EB73F00000040DE37BF3F000000209076BB3F00000000FE3E91BF00000080B6D6A53F00000020B2A1CBBF000000C0864C9CBF000000403361BA3F00000080017EA63F000000001C1CB03F00000000982B853F, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (117, 12, 0x000000A0869EC0BF000000A0CC44AB3F00000040E717B03F00000040DCA28BBF00000020D71CB0BF00000060A703A8BF00000000133C823F000000C06C6FBFBF000000206B1DB83F00000060E0AEB6BF000000E0D3B5CE3F000000804B40B4BF000000406922C8BF00000080788DC0BF000000E04F3BA5BF000000C08C82C93F000000000B53C9BF000000C0EF7CBFBF000000E00896ADBF000000007BEF94BF000000A0A738BF3F00000080B7DC84BF000000801DB69BBF000000C070DEA23F000000605880B6BF000000A017CAD5BF0000008007C3B5BF00000040F705B0BF000000A0B8BD903F00000000AA659BBF000000801F99A2BF00000080CC26A53F000000C00B38CBBF000000A00DE3B3BF00000000E28C85BF00000040F967A83F000000008A428FBF000000C0ECE5ACBF000000E01DB9C53F0000000084A435BF00000000E862C9BF0000000039A3AD3F000000802BCC9B3F00000060706ED03F000000A0B021C63F0000000063B59C3F00000000CFB79D3F0000000033AAAFBF000000402509BD3F000000404C27CABF00000000B2318CBF00000080944BC33F000000C05C0CB23F00000000CB49B53F0000008044BBA4BF000000006D34B8BF0000000020C4633F000000C06A3DBB3F000000006626C1BF000000A04852A73F000000807967B43F000000A01B78C1BF000000C082CEA5BF000000803282B9BF00000000D2C8C73F00000040369EA93F000000A0772FC0BF00000000C442C6BF00000040A5C0B33F000000A00D8EBFBF000000008E89B3BF00000000BCE0853F000000C03168C6BF000000C0491BC5BF000000402332D5BF00000080F9B9B13F000000206E68D73F000000002DA3B33F000000C0F157C7BF000000C02AE1AB3F000000402AB4AFBF000000C0CAD4AD3F000000602FCCC23F00000080D67EC43F000000A0BE47AD3F000000406255A23F00000000680BB3BF0000000038BD8A3F00000040D311C53F000000A05EC8B2BF0000008096F3A6BF00000080F817CF3F00000080EB209FBF000000809220B03F000000003487523F000000C01BB2A03F0000000026BE87BF000000800E3DA93F00000000C41EAABF000000C08BEFAA3F000000A06C88B23F00000000D364A0BF000000006BE49F3F0000002036D5B13F000000809683BCBF000000409599C03F000000C0B7A6A1BF00000000A484C03F00000000CC5FA33F000000802DF6A0BF000000C09B75BABF00000080A552A4BF00000000644BB63F0000004084A1CCBF00000040046ECC3F000000C0A494CB3F0000004056E986BF000000809902B93F000000C08234BA3F00000080A5EFB33F00000000D22A97BF0000000034F09E3F000000808D73CABF00000080D4D097BF000000E0195BBD3F000000006A9B703F00000000CC3AAD3F00000000782E6EBF, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (118, 12, 0x000000C0C566BBBF000000002C21AE3F000000C0E5F7BB3F00000080DA8DA3BF00000000DD6AADBF000000407B59A0BF00000040E2829CBF00000000C81AC1BF00000020182FB43F000000A0A74BB8BF00000080588FCF3F00000020448DAABF000000006736C9BF000000C002BBBFBF000000E0DB2EB1BF000000006ACDC83F000000804A87C5BF00000060AEBABEBF000000206837A4BF00000000A55186BF000000201746C03F000000A0D2989A3F00000080E6769CBF000000805EED953F000000C0D602BABF00000020A89FD4BF000000A0A639B8BF00000080269AA5BF000000009CF9923F00000000298099BF00000080EDC2ABBF00000000AA0E843F00000040A2CCC9BF000000809507A3BF00000000F8CD94BF00000080D3C98A3F00000080C9BEA8BF000000A0DC3DB1BF00000080F0E5C33F000000801C49963F000000407A63CEBF00000040D5A4B33F00000000EABA8A3F000000406DA4CE3F00000040EE12C63F000000000CB1973F000000E0C352A83F00000000BA65B3BF000000E068C4B53F000000E0F70CCBBF0000000018DE8DBF00000060AAFFC63F00000020F662AF3F000000A044C1B03F000000C082619BBF00000060B4A5B7BF0000000010C884BF00000000756AB63F000000605EE6BCBF00000080624AB03F000000C01261B73F0000008056D8BFBF0000000066CE92BF000000408A5CB7BF000000E008D9C23F00000060FEACA33F000000C03F2BC1BF0000004026D7C6BF000000E02F15B53F000000009BCAC0BF000000E04F92B4BF000000C0E7D3A43F00000060B325C6BF00000000BF79C7BF00000080D382D4BF00000040D6AEB13F0000000053C9D73F000000801617B93F000000E01D96C5BF000000207C4AAE3F00000060ED14B0BF000000C0581BB33F0000006078ABC33F00000080ABF2C23F000000E0F25BA73F000000C05096A33F000000407015B2BF00000000FCA7923F000000603DDAC63F000000E0D8A7B5BF00000020E6BDA4BF000000C0DA48D03F000000C0E5E594BF000000005DE6B23F000000A03C9980BF00000040DD8FAC3F00000000363880BF000000E0142CAD3F000000C0B86F9EBF000000C09F62B33F000000C0DF69B23F00000000FA7A9EBF000000001833AB3F0000006086B2B73F00000060152AB9BF000000004FEAC23F0000008099BF9DBF00000000B862BD3F0000000015B6A73F0000000080C22E3F00000020961EBCBF00000080488AA8BF000000C01236B43F000000806531CBBF000000E05B46CD3F000000A03C60CC3F000000C05A75873F00000080EED4B03F000000600579C03F000000A0058BB13F00000000C4359ABF00000000EECE813F000000007AD7C7BF00000060B769A5BF0000000011FBB83F000000009EBE97BF00000040F2D8B03F00000000D6057ABF, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (119, 12, 0x000000A0AB54BABF000000809BAAB13F000000000508B73F000000806BAE99BF000000005741B2BF000000E03C63A4BF00000080E0038EBF0000000085DEBEBF00000020F192BA3F0000002085C3BABF00000080F672D03F000000008538B3BF000000401C49CDBF00000020B66FC0BF00000080D9E0ACBF000000E0A9E6CA3F0000004010BCC5BF000000A000ECC1BF000000C01C8EAEBF000000006A7B89BF000000C07F31C03F000000E0AF7871BF000000806FF392BF00000000502A9F3F000000007C8BB7BF00000080321CD5BF0000000036E5B3BF00000000BDEBB2BF00000040341795BF00000000537BAFBF00000040838CAABF0000000083808C3F000000807D0AC9BF000000C06ADDACBF00000000B70686BF000000402CD8AA3F00000080BD48A7BF000000805B98ADBF000000C059D7C83F000000E01D47853F0000008041CACBBF00000080BC29A83F000000009709953F000000207E35D03F000000000AE3C63F00000080D416A83F000000C0CD46953F000000402096B5BF000000803265BE3F00000020332BCDBF0000008029C06B3F0000008055A4C63F00000060AD5AAF3F000000E0884CB43F0000000085209EBF000000A064A0BABF000000000067283F000000A03C2FBE3F0000008075D1C2BF000000407715AD3F00000080CE99B43F000000A06978C3BF00000040DC8AB0BF000000A0F9D8B7BF000000A07CB2CA3F00000040F976AD3F0000008066A1C2BF000000A0BAB5C5BF00000080A21EB53F00000060E94AC1BF000000806594B7BF0000000079089F3F000000C0235AC7BF00000040DD6DC7BF000000A04F2AD4BF00000080DB90AB3F000000601D4FD73F000000601FE1B23F00000020D1C3C8BF000000200CE2AA3F000000401032ADBF000000808644A93F000000602C6DC23F000000809822C63F00000060B894B13F000000805070A43F000000E0532CB6BF00000000B679853F000000A0B009C63F000000201443BCBF0000006021B097BF000000C01F59D13F000000A02026A1BF00000000A808B53F0000004078F28ABF00000080BAC4973F00000000FCD491BF00000060E6B8A83F000000801862B0BF000000809FA19E3F000000E0AD7BB53F000000E04D228DBF000000007F609A3F000000803EE6AA3F0000008009F9BBBF000000406321BC3F00000080F1C5A0BF000000608A2BBE3F000000406F5DA33F00000000BD49B0BF000000A0690DBDBF000000807238AFBF00000040579FBC3F000000C08693CCBF000000006DCCCD3F000000808B7ECB3F00000080DA037F3F000000E0216CB33F00000000329AC03F000000E029FBB03F0000000000515B3F00000000B0E252BF0000004062C3CCBF00000060229083BF00000040A72ABE3F00000000C4856F3F000000802F19B03F00000000F08B8BBF, NULL);
|
||||
INSERT INTO `student_encodings` (`id`, `student_id`, `encoding`, `created_at`) VALUES (120, 12, 0x000000C064B8BCBF000000C0D23DB73F00000080B670B73F000000E08DA78ABF000000C0E509B1BF0000004077A0A9BF00000000B88B683F000000A02E4ABBBF00000040F95CB43F00000080E0FDAFBF000000C0651BD23F000000402886AFBF0000008005FAC9BF000000601064C0BF00000080296EA4BF0000008015DFC83F000000A0E491C3BF000000001C18C0BF000000200418B4BF00000080B837913F00000000988EC03F000000C06559713F00000080C8349FBF000000C0EA9CA33F00000040F61BB8BF000000C0800CD5BF000000A0FBBFB6BF00000040EAD3ADBF00000060BDDD863F00000080F590ADBF00000040D9F4A8BF00000040E131A63F000000004D33CABF000000C015B7B3BF00000000A30C88BF000000408918A13F000000006F29A8BF000000C09627AFBF000000C009C8C53F000000C04C6996BF000000603178CDBF00000000819AA73F000000802339A13F000000808A2DD03F000000C05C86C53F00000000DB20953F00000080F8D09D3F000000000951ACBF00000040B03AAE3F0000004090FCCDBF000000003EFC4FBF000000E0C578C43F00000060A58AB33F00000040EEB2B63F000000808D6B95BF000000A001A1BCBF00000000001460BF000000C0ED62BC3F00000000DA11C1BF00000060C184963F00000040193BB33F000000C0F1B7C0BF000000202D9599BF000000804020BCBF000000C0BF9ECA3F000000006A8AAD3F000000C09F09C2BF000000405627C3BF000000404837B43F000000A00699BDBF000000405D2AB0BF000000802ECCA23F00000080C9DCC5BF00000000DF80C6BF0000000068FED4BF000000803518B63F000000202E76D73F000000600FA0B63F000000A05C19C9BF00000060BB85A73F00000060A3F8B2BF00000040CA85AA3F00000080B3E6BE3F000000200AC4BE3F000000807CB3A13F000000804A1E9F3F00000000B23EBABF00000000AD37973F000000E0CB06C63F000000A0B35DB5BF00000000C9A884BF00000080A8BDCF3F00000080C42597BF000000402183AF3F000000804B5829BF0000008097AC9E3F0000000023AF83BF000000A09B8FA33F000000A00FFDAFBF000000C00208B53F000000401184A83F00000000F5349BBF0000000086D58B3F000000403AB8BA3F000000404DDCB5BF00000080293CBB3F000000002F0990BF000000604020BB3F0000008081C99C3F000000002F5A9CBF000000E07793BCBF00000080F667B4BF00000000293EB53F000000001D7ECABF000000C04FAECB3F000000A003D0C73F00000000E9CE66BF000000802A83B13F000000E0FE62BF3F00000080712EB43F00000080B71F9DBF00000000A0A64DBF00000000280DCCBF000000005A4068BF000000C07954C33F00000080FC579FBF000000803908A93F00000000189885BF, NULL);
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
INSERT INTO `students` (`id`, `name`, `email`, `avatar`) VALUES (1, 'PHAN QUOC BAO', 'ryder.ph@apactech.io', 'avatars/Us2SJQTDjqeORdlVMTUJG4E5exMi5VUhfQgGZfs3.jpg');
|
||||
INSERT INTO `students` (`id`, `name`, `email`, `avatar`) VALUES (2, 'PHAM VAN HUYNH', 'jon.ph@apactech.io', '');
|
||||
INSERT INTO `students` (`id`, `name`, `email`, `avatar`) VALUES (3, 'VO MINH TRUONG', 'vincent.vo@apactech.io', 'avatars/UXk5UKfCmIrHMgF0sik7t0Gf0bOQ62lmwk2SVabb.jpg');
|
||||
INSERT INTO `students` (`id`, `name`, `email`, `avatar`) VALUES (4, 'NGUYEN VO TINH', 'alex.ng@apactech.io', '');
|
||||
INSERT INTO `students` (`id`, `name`, `email`, `avatar`) VALUES (5, 'DANG TRUNG KIEN', 'kevin.dang@apactech.io', 'avatars/4kpcWpQhRYiWcB5B3N957ONN9w6jppcCZKzoIFxK.jpg');
|
||||
INSERT INTO `students` (`id`, `name`, `email`, `avatar`) VALUES (6, 'HUYNH THI HONG GAM', 'rose.h@apactech.io', 'avatars/ZDMxwwo5qkBqO5R1XjGPf0Vp2Q5YwsYhosOhmhDH.jpg');
|
||||
INSERT INTO `students` (`id`, `name`, `email`, `avatar`) VALUES (7, 'NGUYEN TRUNG THAT', 'andrew.ng@apactech.io', 'avatars/MOo8dR7QsaUPbuVF92ALJf3P4mJKEmp9OD9jGi2M.jpg');
|
||||
INSERT INTO `students` (`id`, `name`, `email`, `avatar`) VALUES (8, 'LE TAN LUAN', 'joseph.le@apactech.io', 'avatars/A1yEjVOqzeodoc2vL1E52PkZXwMomudWKxQTOZ35.png');
|
||||
INSERT INTO `students` (`id`, `name`, `email`, `avatar`) VALUES (9, 'VO VAN MINH', 'michael.vo@apactech.io', '');
|
||||
INSERT INTO `students` (`id`, `name`, `email`, `avatar`) VALUES (10, 'TON GIA KHANH', 'kai.t@apactech.io', '');
|
||||
INSERT INTO `students` (`id`, `name`, `email`, `avatar`) VALUES (11, 'PHAM NHUT KHANG', 'zelda.pham@apactech.io', 'avatars/vfGHX5JSFsafcEWKj7aHMZyGopJLvTRgS5YfspQB.jpg');
|
||||
INSERT INTO `students` (`id`, `name`, `email`, `avatar`) VALUES (12, 'NGUYEN HOANG VI', 'hoangvi.ng@apactech.io', 'avatars/xRt5FG92nL4mSpwNoHgM7iSfcCUNzs14oNoFGivw.jpg');
|
||||
|
|
@ -0,0 +1,266 @@
|
|||
from api import users
|
||||
from database import SessionLocal
|
||||
import os
|
||||
import requests
|
||||
import tempfile
|
||||
import face_recognition
|
||||
from sqlalchemy.exc import IntegrityError
|
||||
from sqlalchemy import text
|
||||
from database import SessionLocal
|
||||
import json
|
||||
|
||||
|
||||
URL_BASE_RESOURCE = "http://172.16.6.38:8000/image/storage/"
|
||||
|
||||
def register_face_handler(name: str, email: str, avatar: str | None, image_url: str):
|
||||
print(f"[DEBUG] Bắt đầu register_face_handler với email: {email}, image_url: {image_url}")
|
||||
|
||||
db = SessionLocal()
|
||||
|
||||
try:
|
||||
# 1. Tải ảnh từ URL
|
||||
try:
|
||||
res = requests.get(image_url)
|
||||
res.raise_for_status()
|
||||
except Exception as e:
|
||||
print(f"[ERROR] Không tải được ảnh từ URL {image_url}: {e}")
|
||||
return {"status": False, "message": "Không tải được ảnh từ URL."}
|
||||
|
||||
# 2. Lưu ảnh vào file tạm
|
||||
with tempfile.NamedTemporaryFile(delete=False, suffix=".jpg") as tmp:
|
||||
tmp.write(res.content)
|
||||
tmp_path = tmp.name
|
||||
|
||||
print(f"[DEBUG] Ảnh đã lưu tạm ở: {tmp_path}")
|
||||
|
||||
# 3. Encode khuôn mặt
|
||||
image = face_recognition.load_image_file(tmp_path)
|
||||
encodings = face_recognition.face_encodings(image)
|
||||
|
||||
if not encodings:
|
||||
print("[ERROR] Không phát hiện khuôn mặt trong ảnh.")
|
||||
return {"status": False, "message": "Không phát hiện khuôn mặt."}
|
||||
|
||||
encoding_bytes = encodings[0].tobytes()
|
||||
print("[DEBUG] Đã encode khuôn mặt.")
|
||||
|
||||
# 4. Check email tồn tại
|
||||
print(f"[DEBUG] Kiểm tra email tồn tại: {email}")
|
||||
existing = db.execute(
|
||||
text("SELECT id FROM students WHERE email = :email"),
|
||||
{"email": email}
|
||||
).fetchone()
|
||||
|
||||
if existing:
|
||||
student_id = existing[0]
|
||||
print(f"[DEBUG] Email đã tồn tại, student_id = {student_id}. Thêm encoding mới…")
|
||||
|
||||
db.execute(
|
||||
text("""
|
||||
INSERT INTO student_encodings (student_id, encoding)
|
||||
VALUES (:student_id, :encoding)
|
||||
"""),
|
||||
{"student_id": student_id, "encoding": encoding_bytes}
|
||||
)
|
||||
db.commit()
|
||||
|
||||
return {"status": True, "message": "Đã thêm encoding mới."}
|
||||
|
||||
# 5. Email chưa tồn tại → tạo student mới
|
||||
print(f"[DEBUG] Email chưa tồn tại, tạo student mới: {name}, {email}")
|
||||
|
||||
db.execute(
|
||||
text("""
|
||||
INSERT INTO students (name, email, avatar)
|
||||
VALUES (:name, :email, :avatar)
|
||||
"""),
|
||||
{
|
||||
"name": name,
|
||||
"email": email,
|
||||
"avatar": avatar,
|
||||
}
|
||||
)
|
||||
db.commit()
|
||||
|
||||
student_id = db.execute(text("SELECT LAST_INSERT_ID()")).fetchone()[0]
|
||||
print(f"[DEBUG] Student mới ID = {student_id}")
|
||||
|
||||
# 6. Lưu encoding
|
||||
db.execute(
|
||||
text("""
|
||||
INSERT INTO student_encodings (student_id, encoding)
|
||||
VALUES (:student_id, :encoding)
|
||||
"""),
|
||||
{"student_id": student_id, "encoding": encoding_bytes}
|
||||
)
|
||||
db.commit()
|
||||
|
||||
return {"status": True, "message": "Đăng ký thành công."}
|
||||
|
||||
except IntegrityError as e:
|
||||
db.rollback()
|
||||
print(f"[ERROR] IntegrityError (email có thể đã tồn tại): {e}")
|
||||
return {"status": False, "message": "Email đã tồn tại."}
|
||||
|
||||
except Exception as e:
|
||||
print(f"[ERROR] Lỗi không xác định: {e}")
|
||||
return {"status": False, "message": "Lỗi server."}
|
||||
|
||||
finally:
|
||||
db.close()
|
||||
|
||||
def extract_images(history_list):
|
||||
images = []
|
||||
|
||||
for day_item in history_list:
|
||||
values = day_item.get("values", [])
|
||||
for v in values:
|
||||
img = v.get("image")
|
||||
if img:
|
||||
images.append(img)
|
||||
|
||||
return images
|
||||
|
||||
def sync_data_user():
|
||||
response = users({"month": 11, "year": 2025})
|
||||
|
||||
if not response.get("status"):
|
||||
return
|
||||
|
||||
raw_data = response.get("data")
|
||||
|
||||
if isinstance(raw_data, str):
|
||||
try:
|
||||
data = json.loads(raw_data)
|
||||
except:
|
||||
print(raw_data)
|
||||
return
|
||||
else:
|
||||
data = raw_data
|
||||
|
||||
db = SessionLocal()
|
||||
|
||||
for item in data:
|
||||
histories = item.get("history", [])
|
||||
user = item.get("user")
|
||||
|
||||
if len(histories) <= 0:
|
||||
continue
|
||||
|
||||
# 👉 Lấy số lượng encoding hiện có trong DB
|
||||
try:
|
||||
count = db.execute(
|
||||
text("""
|
||||
SELECT COUNT(*)
|
||||
FROM student_encodings se
|
||||
JOIN students s ON s.id = se.student_id
|
||||
WHERE s.email = :email
|
||||
"""),
|
||||
{"email": user.get("email")}
|
||||
).fetchone()[0]
|
||||
except Exception as e:
|
||||
print("[ERROR] Khi lấy count:", e)
|
||||
continue
|
||||
|
||||
# 👉 Nếu đủ 5 bản ghi → SKIP người này
|
||||
limit = 10
|
||||
if count >= limit:
|
||||
print(f"==> Bỏ qua {user.get('email')} vì đã đủ {limit} encoding ({count}/{limit})")
|
||||
continue
|
||||
|
||||
# 👉 Nếu chưa đủ thì mới xử lý ảnh
|
||||
histories_list = extract_images(histories)
|
||||
|
||||
for image in histories_list:
|
||||
# Kiểm tra lại lần nữa trước khi thêm (tránh dư khi có nhiềsu ảnh)
|
||||
if count >= limit:
|
||||
print(f"==> Đã đạt {limit} encoding, dừng cho {user.get('email')}")
|
||||
break
|
||||
|
||||
avatar = URL_BASE_RESOURCE + user.get("avatar", "")
|
||||
image_url = URL_BASE_RESOURCE + image
|
||||
|
||||
print(user.get("name"), image_url)
|
||||
|
||||
result = register_face_handler(
|
||||
name=user.get("name"),
|
||||
email=user.get("email"),
|
||||
avatar=avatar,
|
||||
image_url=image_url
|
||||
)
|
||||
|
||||
print("Result:", result)
|
||||
|
||||
# Tăng biến đếm sau mỗi lần thêm
|
||||
if result.get("status"):
|
||||
count += 1
|
||||
|
||||
db.close()
|
||||
return response
|
||||
|
||||
def test_valid_data():
|
||||
response = users({"month": 10, "year": 2025})
|
||||
|
||||
if not response.get("status"):
|
||||
print("API trả status=False")
|
||||
return
|
||||
|
||||
raw_data = response.get("data")
|
||||
|
||||
if isinstance(raw_data, str):
|
||||
try:
|
||||
data = json.loads(raw_data)
|
||||
except Exception as e:
|
||||
print("[ERROR] Không parse được data:", e)
|
||||
return
|
||||
else:
|
||||
data = raw_data
|
||||
|
||||
for item in data:
|
||||
histories = item.get("history", [])
|
||||
user = item.get("user")
|
||||
|
||||
if len(histories) <= 0 or not user:
|
||||
continue
|
||||
|
||||
histories_list = extract_images(histories)
|
||||
|
||||
for image in histories_list:
|
||||
# Tải ảnh từ server trước khi gửi
|
||||
image_url = URL_BASE_RESOURCE + image
|
||||
try:
|
||||
res = requests.get(image_url)
|
||||
res.raise_for_status()
|
||||
except Exception as e:
|
||||
print(f"[ERROR] Không tải được ảnh {image_url}: {e}")
|
||||
continue
|
||||
|
||||
# Lưu tạm để upload
|
||||
with tempfile.NamedTemporaryFile(delete=False, suffix=".jpg") as tmp:
|
||||
tmp.write(res.content)
|
||||
tmp_path = tmp.name
|
||||
|
||||
# Gửi lên API
|
||||
with open(tmp_path, "rb") as f:
|
||||
r = requests.post(
|
||||
"http://localhost:8000/checkin",
|
||||
files={"file": f},
|
||||
data={"camera_id": "cam1"}
|
||||
)
|
||||
print(r.status_code, r.json(), user.get("name"))
|
||||
|
||||
# Xóa file tạm
|
||||
os.remove(tmp_path)
|
||||
|
||||
return response
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
sync_data_user()
|
||||
|
||||
# test_valid_data()
|
||||
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 219 KiB After Width: | Height: | Size: 128 KiB |
|
Before Width: | Height: | Size: 222 KiB After Width: | Height: | Size: 112 KiB |
|
|
@ -0,0 +1,7 @@
|
|||
path
|
||||
__pycache__
|
||||
images
|
||||
uploads
|
||||
log.log
|
||||
venv
|
||||
.env
|
||||
|
|
@ -0,0 +1,134 @@
|
|||
# TrackingToolWeb — CLAUDE.md
|
||||
|
||||
## Tổng quan dự án
|
||||
|
||||
Hệ thống điểm danh khuôn mặt (Face Check-in) tích hợp với Management System tại `ms.prology.net`. Camera nhận diện khuôn mặt → FastAPI backend so khớp → ghi log → đồng bộ sang hệ thống quản lý.
|
||||
|
||||
---
|
||||
|
||||
## Kiến trúc
|
||||
|
||||
```
|
||||
Frontend (React/Vite) → Backend (FastAPI/Python) → MySQL
|
||||
↓
|
||||
External MS API (ms.prology.net)
|
||||
```
|
||||
|
||||
**Backend**: `main.py` (FastAPI) + `api.py` (external calls) + `sync.py` (data sync)
|
||||
**Frontend**: `client/src/` — React 19, TypeScript, TailwindCSS, Zustand
|
||||
**Database**: MySQL — database `face_checkin`
|
||||
**Deployment**: Backend phục vụ luôn frontend build (`static/`) qua route `/`
|
||||
|
||||
---
|
||||
|
||||
## Commands
|
||||
|
||||
### Backend
|
||||
```bash
|
||||
# Development
|
||||
uvicorn main:app --reload
|
||||
|
||||
# Production
|
||||
nohup uvicorn main:app --host 172.16.6.38 --port 8080 > log.log 2>&1 &
|
||||
```
|
||||
|
||||
### Frontend
|
||||
```bash
|
||||
cd client
|
||||
npm run dev # dev server (Vite HMR)
|
||||
npm run build # build to client/dist/
|
||||
npm run lint # ESLint
|
||||
```
|
||||
|
||||
### Deploy frontend
|
||||
Sau khi build, copy `client/dist/` vào `static/`. Đảm bảo asset paths trong `index.html` dùng prefix `/camera/static/assets/`.
|
||||
|
||||
---
|
||||
|
||||
## Cấu hình
|
||||
|
||||
### Backend (hardcoded — cần đưa vào .env)
|
||||
| Biến | Giá trị hiện tại | File |
|
||||
|------|-----------------|------|
|
||||
| DB URL | `mysql+pymysql://root:123@localhost/face_checkin` | `database.py` |
|
||||
| MS API base | `https://ms.prology.net/api/v1` | `api.py` |
|
||||
| JWT token | hardcoded string | `api.py` |
|
||||
| Face threshold | `0.42` | `main.py:217` |
|
||||
| Ratio threshold | `0.85` | `main.py:286` |
|
||||
| Recent check window | 0.5 phút | `main.py` |
|
||||
|
||||
### Frontend (.env trong `client/`)
|
||||
```
|
||||
VITE_API_BASE_URL=/camera # production (proxy qua nginx)
|
||||
VITE_API_BASE_MS=https://ms.prology.net
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## API Endpoints
|
||||
|
||||
| Method | Path | Mô tả |
|
||||
|--------|------|-------|
|
||||
| GET | `/` | Phục vụ `static/index.html` |
|
||||
| POST | `/register` | Đăng ký khuôn mặt (name, email, file ảnh) |
|
||||
| POST | `/register-simple` | Đăng ký/cập nhật user không cần ảnh |
|
||||
| POST | `/checkin` | Nhận diện & điểm danh (file ảnh, camera_id) |
|
||||
| GET | `/logs` | 20 log điểm danh gần nhất |
|
||||
| GET | `/users` | Danh sách users + 5 checkpoint gần nhất |
|
||||
|
||||
---
|
||||
|
||||
## Database Schema
|
||||
|
||||
```sql
|
||||
students (id, name, email UNIQUE, avatar)
|
||||
student_encodings (id, student_id FK, encoding BLOB[1024 bytes = 128 float64], created_at)
|
||||
checkin_logs (id, student_id FK, time, camera_id, status[check in/check out])
|
||||
```
|
||||
|
||||
**Encoding format**: `np.float64` array 128 chiều → `.tobytes()` → BLOB 1024 bytes
|
||||
**Giải mã**: `np.frombuffer(blob, dtype=np.float64)` — validate `enc.size == 128`
|
||||
|
||||
---
|
||||
|
||||
## Logic nhận diện khuôn mặt (`/checkin`)
|
||||
|
||||
1. Nhận ảnh JPEG → lưu tạm `uploads/checkin.jpg`
|
||||
2. `face_recognition.face_encodings()` → encoding 128-dim
|
||||
3. Load **tất cả** encodings từ DB → so khớp `face_recognition.face_distance()`
|
||||
4. Chọn student có `min_dist` nhỏ nhất
|
||||
5. Kiểm tra: `best_distance ≤ 0.42` **AND** `ratio = best/second_best ≤ 0.85`
|
||||
6. Kiểm tra recent check (tránh điểm danh 2 lần trong 30 giây)
|
||||
7. Ghi `checkin_logs` → `BackgroundTask`: gửi ảnh + tạo history trên MS API
|
||||
|
||||
**Bottleneck chính**: Bước 3 — load toàn bộ encodings, giải mã numpy, so khớp tuần tự trong request.
|
||||
|
||||
---
|
||||
|
||||
## External API (ms.prology.net)
|
||||
|
||||
- `POST /api/v1/admin/tracking/scan-create` — tạo history check-in
|
||||
- `POST /api/v1/admin/tracking/send-image` — upload ảnh check-in
|
||||
- `GET /api/v1/admin/timekeeping` — lấy dữ liệu chấm công (dùng trong `sync.py`)
|
||||
|
||||
Token JWT được hardcode trong `api.py` — cần chuyển sang env variable.
|
||||
|
||||
---
|
||||
|
||||
## Frontend State Management
|
||||
|
||||
**Zustand stores:**
|
||||
- `use-app-store.ts` — `isAutoChecking`, `isCountDown`, `refreshLog`, video/canvas refs
|
||||
- `use-user-store.ts` — `currentUser` (user được chọn cho checkpoint)
|
||||
|
||||
**Auto check-in**: interval 3000ms, gọi `/checkin` liên tục khi `isAutoChecking = true`
|
||||
|
||||
---
|
||||
|
||||
## Các lưu ý quan trọng
|
||||
|
||||
- `UPLOAD_DIR = ./uploads/` — lưu ảnh tạm check-in, bị ghi đè mỗi lần (`checkin.jpg`)
|
||||
- `images/{YYYY_MM_DD}/` — lưu ảnh vĩnh viễn theo ngày (tạo trong `sync.py`)
|
||||
- DB session trong `/checkin` dùng `Depends(get_db)`, các endpoint khác tạo `SessionLocal()` trực tiếp — cần thống nhất
|
||||
- Tối đa 10 encodings/user (giới hạn trong `sync.py`)
|
||||
- CORS `allow_origins=["*"]` — chấp nhận vì deploy nội bộ
|
||||
|
|
@ -0,0 +1,104 @@
|
|||
# Hướng dẫn sử dụng hệ thống Face Check-in
|
||||
|
||||
## Yêu cầu
|
||||
|
||||
- Camera được kết nối và cấp quyền truy cập trên trình duyệt
|
||||
- Email của nhân viên phải tồn tại trong hệ thống ERP Server
|
||||
- Backend đang chạy và kết nối được database
|
||||
|
||||
---
|
||||
|
||||
## 1. Tạo User mới
|
||||
|
||||
User trong hệ thống local dùng để nhận diện khuôn mặt. **Email phải khớp với email trên ERP Server.**
|
||||
|
||||
### Các bước:
|
||||
|
||||
1. Đứng trước camera, đảm bảo khuôn mặt hiển thị rõ trong khung hình
|
||||
2. Tab **Features** → nhấn nút **Tạo User Checking** (màu xanh lá)
|
||||
3. Hệ thống chụp ảnh khuôn mặt từ camera
|
||||
4. Form hiện ra → nhập:
|
||||
- **Tên**: tên hiển thị của nhân viên
|
||||
- **Email** _(bắt buộc)_: phải trùng với email trên ERP Server
|
||||
- **Avatar URL** _(tuỳ chọn)_: đường dẫn ảnh đại diện
|
||||
5. Nhấn **Tạo mới** → hệ thống lưu khuôn mặt và thông tin user
|
||||
|
||||
> Nếu email đã tồn tại, hệ thống sẽ cập nhật thông tin thay vì tạo mới.
|
||||
|
||||
---
|
||||
|
||||
## 2. Tạo Checkpoint (thêm ảnh nhận diện cho user)
|
||||
|
||||
Checkpoint là ảnh khuôn mặt bổ sung, giúp hệ thống nhận diện chính xác hơn ở nhiều góc độ/ánh sáng khác nhau.
|
||||
|
||||
### Các bước:
|
||||
|
||||
1. Tab **User** → chọn user cần thêm checkpoint (card sẽ highlight màu xanh)
|
||||
2. Đứng trước camera ở góc độ/ánh sáng khác với lần đăng ký ban đầu
|
||||
3. Tab **Features** → nhấn **Tạo Check Point**
|
||||
4. Hệ thống chụp ảnh và lưu thêm encoding vào database
|
||||
|
||||
> Mỗi user có tối đa **10 checkpoint**. Nên tạo ít nhất 3–5 checkpoint ở các góc độ khác nhau để tăng độ chính xác.
|
||||
|
||||
---
|
||||
|
||||
## 3. Điểm danh (Check-in / Check-out)
|
||||
|
||||
Hệ thống tự động xác định check-in hoặc check-out dựa trên lần điểm danh trước đó.
|
||||
|
||||
### Điểm danh thủ công
|
||||
|
||||
1. Đứng trước camera
|
||||
2. Tab **Features** → nhấn **Điểm Danh Ngay** (hoặc nhấn **Space**)
|
||||
3. Hệ thống nhận diện khuôn mặt và ghi log
|
||||
|
||||
### Điểm danh tự động
|
||||
|
||||
1. Tab **Features** → nhấn **Tự Động Điểm Danh**
|
||||
2. Camera quét liên tục mỗi **3 giây**
|
||||
3. Nhấn **Dừng Tự Động** để tắt
|
||||
|
||||
### Kết quả trả về
|
||||
|
||||
| Trường hợp | Thông báo |
|
||||
| ------------------------------ | ----------------------------------------------------------------- |
|
||||
| Thành công | "check in successful for ..." hoặc "check out successful for ..." |
|
||||
| Không nhận ra khuôn mặt | "No face detected" _(bỏ qua, không hiện toast)_ |
|
||||
| Không khớp với ai | "No match found" |
|
||||
| Vừa điểm danh (< 30 giây) | "... already checked in recently" |
|
||||
| Email không có trên ERP Server | "[ERP Server] User not found" |
|
||||
|
||||
---
|
||||
|
||||
## 4. Xem danh sách User
|
||||
|
||||
- Chuyển sang tab **User** để xem toàn bộ danh sách nhân viên đã đăng ký
|
||||
- Nhấn vào một user để **chọn** (dùng cho tạo checkpoint)
|
||||
- Nhấn lại user đang chọn để **bỏ chọn**
|
||||
|
||||
---
|
||||
|
||||
## 5. Xóa User
|
||||
|
||||
> ⚠️ Xóa user sẽ xóa toàn bộ lịch sử điểm danh và dữ liệu khuôn mặt của user đó.
|
||||
|
||||
1. Tab **User** → tìm user cần xóa
|
||||
2. Nhấn icon **thùng rác** (đỏ) ở góc phải card
|
||||
3. Xác nhận trong hộp thoại hiện ra
|
||||
4. User và toàn bộ dữ liệu liên quan bị xóa khỏi hệ thống local
|
||||
|
||||
---
|
||||
|
||||
## 6. Xem lịch sử điểm danh
|
||||
|
||||
- Chuyển sang tab **Log** để xem 20 lần điểm danh gần nhất
|
||||
- Danh sách tự động cập nhật sau mỗi lần điểm danh thành công
|
||||
|
||||
---
|
||||
|
||||
## Lưu ý
|
||||
|
||||
- **Email là định danh duy nhất** — email trong hệ thống local phải khớp hoàn toàn với email trên ERP Server
|
||||
- **Ánh sáng ảnh hưởng đến nhận diện** — nên đăng ký khuôn mặt trong điều kiện ánh sáng tương tự môi trường sử dụng
|
||||
- **Khoảng cách** — đứng cách camera khoảng 50–80cm để đạt kết quả tốt nhất
|
||||
- Log điểm danh chỉ được ghi khi ERP Server xác nhận thành công
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
Run client: npm run dev or npm run build && npm run preview
|
||||
|
||||
==> Build client xong => coppy file asset và index vào folder static của server => thêm prefix static vào link của assets trong file index VD: /camera/static/assets
|
||||
|
||||
Run server uvicorn main:app --reload
|
||||
|
||||
nohup uvicorn main:app --host 172.16.6.38 --port 8081 > log.log 2>&1 &
|
||||
|
||||
pm2 start
|
||||
|
||||
ps aux | grep uvicorn
|
||||
|
||||
truncate -s 0 log.log
|
||||
|
|
@ -0,0 +1,47 @@
|
|||
|
||||
import os
|
||||
import base64
|
||||
import datetime
|
||||
import requests
|
||||
from dotenv import load_dotenv
|
||||
|
||||
load_dotenv()
|
||||
|
||||
HOST = os.getenv("MS_HOST", "http://10.20.2.26:3002")
|
||||
AUTH_TOKEN = os.getenv("MS_AUTH_TOKEN", "")
|
||||
|
||||
|
||||
|
||||
def sync_checkin(email: str, timestamp_ms: int, image_data: bytes, student_name: str, status: str):
|
||||
today = datetime.datetime.now().strftime("%Y_%m_%d")
|
||||
folder_path = f"./images/{today}"
|
||||
os.makedirs(folder_path, exist_ok=True)
|
||||
|
||||
safe_student = "".join(c for c in student_name if c.isalnum() or c in ("-", "_"))
|
||||
safe_status = "".join(c for c in status if c.isalnum() or c in ("-", "_"))
|
||||
ts_str = datetime.datetime.now().strftime("%Y_%m_%d_%H_%M_%S")
|
||||
file_path = os.path.join(folder_path, f"{safe_student}_{safe_status}_at_{ts_str}.png")
|
||||
with open(file_path, "wb") as f:
|
||||
f.write(image_data)
|
||||
|
||||
image_b64 = "data:image/jpeg;base64," + base64.b64encode(image_data).decode("utf-8")
|
||||
payload = {
|
||||
"email": email,
|
||||
"time": timestamp_ms,
|
||||
"image": image_b64,
|
||||
|
||||
}
|
||||
headers = {"Authorization": f"Bearer {AUTH_TOKEN}"}
|
||||
print("[sync_checkin] payload:", {k: v for k, v in payload.items() if k != "image"})
|
||||
try:
|
||||
response = requests.post(HOST + "/api/log-time/check-in-out", json=payload, headers=headers)
|
||||
response.raise_for_status()
|
||||
res = response.json()
|
||||
print("[sync_checkin] response:", res)
|
||||
return res
|
||||
except Exception as e:
|
||||
print("[sync_checkin] failed:", e)
|
||||
return {}
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,45 @@
|
|||
import cv2
|
||||
import requests
|
||||
# source path/to/venv/bin/activate
|
||||
API_URL = "http://localhost:8000/checkin" # Đổi lại nếu backend chạy ở địa chỉ khác
|
||||
CAMERA_ID = "cam_pc_01"
|
||||
|
||||
def capture_and_checkin():
|
||||
cap = cv2.VideoCapture(0) # Dùng camera mặc định (webcam)
|
||||
|
||||
if not cap.isOpened():
|
||||
print("Không mở được camera.")
|
||||
return
|
||||
|
||||
print("Đang mở camera. Nhấn phím 'c' để check-in, 'q' để thoát.")
|
||||
while True:
|
||||
ret, frame = cap.read()
|
||||
if not ret:
|
||||
print("Không đọc được frame.")
|
||||
break
|
||||
|
||||
cv2.imshow("Camera", frame)
|
||||
|
||||
key = cv2.waitKey(1)
|
||||
if key == ord("q"):
|
||||
break
|
||||
elif key == ord("c"):
|
||||
# Ghi tạm ảnh ra file
|
||||
filename = "frame.jpg"
|
||||
cv2.imwrite(filename, frame)
|
||||
|
||||
# Gửi ảnh lên server
|
||||
with open(filename, "rb") as f:
|
||||
response = requests.post(
|
||||
API_URL,
|
||||
files={"file": ("frame.jpg", f, "image/jpeg")},
|
||||
data={"camera_id": CAMERA_ID}
|
||||
)
|
||||
|
||||
print("📡 Server:", response.json())
|
||||
|
||||
cap.release()
|
||||
cv2.destroyAllWindows()
|
||||
|
||||
if __name__ == "__main__":
|
||||
capture_and_checkin()
|
||||
|
|
@ -0,0 +1,25 @@
|
|||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
lerna-debug.log*
|
||||
|
||||
node_modules
|
||||
dist
|
||||
dist-ssr
|
||||
*.local
|
||||
|
||||
# Editor directories and files
|
||||
.vscode/*
|
||||
!.vscode/extensions.json
|
||||
.idea
|
||||
.DS_Store
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
*.sw?
|
||||
*.env
|
||||
|
|
@ -0,0 +1,75 @@
|
|||
# React + TypeScript + Vite
|
||||
|
||||
This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
|
||||
|
||||
Currently, two official plugins are available:
|
||||
|
||||
- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) (or [oxc](https://oxc.rs) when used in [rolldown-vite](https://vite.dev/guide/rolldown)) for Fast Refresh
|
||||
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
|
||||
|
||||
## React Compiler
|
||||
|
||||
The React Compiler is enabled on this template. See [this documentation](https://react.dev/learn/react-compiler) for more information.
|
||||
|
||||
Note: This will impact Vite dev & build performances.
|
||||
|
||||
## Expanding the ESLint configuration
|
||||
|
||||
If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:
|
||||
|
||||
```js
|
||||
export default defineConfig([
|
||||
globalIgnores(['dist']),
|
||||
{
|
||||
files: ['**/*.{ts,tsx}'],
|
||||
extends: [
|
||||
// Other configs...
|
||||
|
||||
// Remove tseslint.configs.recommended and replace with this
|
||||
tseslint.configs.recommendedTypeChecked,
|
||||
// Alternatively, use this for stricter rules
|
||||
tseslint.configs.strictTypeChecked,
|
||||
// Optionally, add this for stylistic rules
|
||||
tseslint.configs.stylisticTypeChecked,
|
||||
|
||||
// Other configs...
|
||||
],
|
||||
languageOptions: {
|
||||
parserOptions: {
|
||||
project: ['./tsconfig.node.json', './tsconfig.app.json'],
|
||||
tsconfigRootDir: import.meta.dirname,
|
||||
},
|
||||
// other options...
|
||||
},
|
||||
},
|
||||
])
|
||||
```
|
||||
|
||||
You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:
|
||||
|
||||
```js
|
||||
// eslint.config.js
|
||||
import reactX from 'eslint-plugin-react-x'
|
||||
import reactDom from 'eslint-plugin-react-dom'
|
||||
|
||||
export default defineConfig([
|
||||
globalIgnores(['dist']),
|
||||
{
|
||||
files: ['**/*.{ts,tsx}'],
|
||||
extends: [
|
||||
// Other configs...
|
||||
// Enable lint rules for React
|
||||
reactX.configs['recommended-typescript'],
|
||||
// Enable lint rules for React DOM
|
||||
reactDom.configs.recommended,
|
||||
],
|
||||
languageOptions: {
|
||||
parserOptions: {
|
||||
project: ['./tsconfig.node.json', './tsconfig.app.json'],
|
||||
tsconfigRootDir: import.meta.dirname,
|
||||
},
|
||||
// other options...
|
||||
},
|
||||
},
|
||||
])
|
||||
```
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
{
|
||||
"$schema": "https://ui.shadcn.com/schema.json",
|
||||
"style": "new-york",
|
||||
"rsc": false,
|
||||
"tsx": true,
|
||||
"tailwind": {
|
||||
"config": "",
|
||||
"css": "src/index.css",
|
||||
"baseColor": "neutral",
|
||||
"cssVariables": true,
|
||||
"prefix": ""
|
||||
},
|
||||
"iconLibrary": "lucide",
|
||||
"aliases": {
|
||||
"components": "@/components",
|
||||
"utils": "@/lib/utils",
|
||||
"ui": "@/components/ui",
|
||||
"lib": "@/lib",
|
||||
"hooks": "@/hooks"
|
||||
},
|
||||
"registries": {}
|
||||
}
|
||||
|
|
@ -0,0 +1,26 @@
|
|||
import js from "@eslint/js";
|
||||
import globals from "globals";
|
||||
import reactHooks from "eslint-plugin-react-hooks";
|
||||
import reactRefresh from "eslint-plugin-react-refresh";
|
||||
import tseslint from "typescript-eslint";
|
||||
import { defineConfig, globalIgnores } from "eslint/config";
|
||||
|
||||
export default defineConfig([
|
||||
globalIgnores(["dist"]),
|
||||
{
|
||||
files: ["**/*.{ts,tsx}"],
|
||||
extends: [
|
||||
js.configs.recommended,
|
||||
tseslint.configs.recommended,
|
||||
reactHooks.configs.flat.recommended,
|
||||
reactRefresh.configs.vite,
|
||||
],
|
||||
languageOptions: {
|
||||
ecmaVersion: 2020,
|
||||
globals: globals.browser,
|
||||
},
|
||||
rules: {
|
||||
"eslint-disable @typescript-eslint/no-explicit-any": "off",
|
||||
},
|
||||
},
|
||||
]);
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>client</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="root"></div>
|
||||
<script type="module" src="/src/main.tsx"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -0,0 +1,55 @@
|
|||
{
|
||||
"name": "client",
|
||||
"private": true,
|
||||
"version": "0.0.0",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
"build": "tsc -b && vite build",
|
||||
"lint": "eslint .",
|
||||
"preview": "vite preview"
|
||||
},
|
||||
"dependencies": {
|
||||
"@hookform/resolvers": "^5.2.2",
|
||||
"@radix-ui/react-avatar": "^1.1.11",
|
||||
"@radix-ui/react-dialog": "^1.1.15",
|
||||
"@radix-ui/react-dropdown-menu": "^2.1.16",
|
||||
"@radix-ui/react-label": "^2.1.8",
|
||||
"@radix-ui/react-scroll-area": "^1.2.10",
|
||||
"@radix-ui/react-slot": "^1.2.4",
|
||||
"@radix-ui/react-tabs": "^1.1.13",
|
||||
"@tailwindcss/vite": "^4.1.17",
|
||||
"axios": "^1.13.2",
|
||||
"class-variance-authority": "^0.7.1",
|
||||
"clsx": "^2.1.1",
|
||||
"face-api.js": "^0.22.2",
|
||||
"framer-motion": "^12.23.25",
|
||||
"lucide-react": "^0.556.0",
|
||||
"moment": "^2.30.1",
|
||||
"next-themes": "^0.4.6",
|
||||
"react": "^19.2.0",
|
||||
"react-dom": "^19.2.0",
|
||||
"react-hook-form": "^7.68.0",
|
||||
"sonner": "^2.0.7",
|
||||
"tailwind-merge": "^3.4.0",
|
||||
"tailwindcss": "^4.1.17",
|
||||
"zod": "^4.1.13",
|
||||
"zustand": "^5.0.9"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@eslint/js": "^9.39.1",
|
||||
"@types/node": "^24.10.2",
|
||||
"@types/react": "^19.2.5",
|
||||
"@types/react-dom": "^19.2.3",
|
||||
"@vitejs/plugin-react": "^5.1.1",
|
||||
"babel-plugin-react-compiler": "^1.0.0",
|
||||
"eslint": "^9.39.1",
|
||||
"eslint-plugin-react-hooks": "^7.0.1",
|
||||
"eslint-plugin-react-refresh": "^0.4.24",
|
||||
"globals": "^16.5.0",
|
||||
"tw-animate-css": "^1.4.0",
|
||||
"typescript": "~5.9.3",
|
||||
"typescript-eslint": "^8.46.4",
|
||||
"vite": "^7.2.4"
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1 @@
|
|||
[{"weights":[{"name":"conv0/filters","shape":[3,3,3,16],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.009007044399485869,"min":-1.2069439495311063}},{"name":"conv0/bias","shape":[16],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.005263455241334205,"min":-0.9211046672334858}},{"name":"conv1/depthwise_filter","shape":[3,3,16,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.004001977630690033,"min":-0.5042491814669441}},{"name":"conv1/pointwise_filter","shape":[1,1,16,32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.013836609615999109,"min":-1.411334180831909}},{"name":"conv1/bias","shape":[32],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0015159862590771096,"min":-0.30926119685173037}},{"name":"conv2/depthwise_filter","shape":[3,3,32,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.002666276225856706,"min":-0.317286870876948}},{"name":"conv2/pointwise_filter","shape":[1,1,32,64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.015265831292844286,"min":-1.6792414422128714}},{"name":"conv2/bias","shape":[64],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0020280554598453,"min":-0.37113414915168985}},{"name":"conv3/depthwise_filter","shape":[3,3,64,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.006100742489683862,"min":-0.8907084034938438}},{"name":"conv3/pointwise_filter","shape":[1,1,64,128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.016276211832083907,"min":-2.0508026908425725}},{"name":"conv3/bias","shape":[128],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.003394414279975143,"min":-0.7637432129944072}},{"name":"conv4/depthwise_filter","shape":[3,3,128,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.006716050119961009,"min":-0.8059260143953211}},{"name":"conv4/pointwise_filter","shape":[1,1,128,256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.021875603993733724,"min":-2.8875797271728514}},{"name":"conv4/bias","shape":[256],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.0041141652009066415,"min":-0.8187188749804216}},{"name":"conv5/depthwise_filter","shape":[3,3,256,1],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.008423839597141042,"min":-0.9013508368940915}},{"name":"conv5/pointwise_filter","shape":[1,1,256,512],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.030007277283014035,"min":-3.8709387695088107}},{"name":"conv5/bias","shape":[512],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.008402082966823203,"min":-1.4871686851277068}},{"name":"conv8/filters","shape":[1,1,512,25],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.028336129469030042,"min":-4.675461362389957}},{"name":"conv8/bias","shape":[25],"dtype":"float32","quantization":{"dtype":"uint8","scale":0.002268134028303857,"min":-0.41053225912299807}}],"paths":["tiny_face_detector_model-shard1"]}]
|
||||
|
|
@ -0,0 +1 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
|
||||
|
After Width: | Height: | Size: 1.5 KiB |
|
|
@ -0,0 +1,7 @@
|
|||
import ax from "axios";
|
||||
|
||||
const axios = ax.create({
|
||||
baseURL: import.meta.env.VITE_API_BASE_URL || "/",
|
||||
});
|
||||
|
||||
export default axios;
|
||||
|
|
@ -0,0 +1,75 @@
|
|||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||
import axios from "./axios";
|
||||
|
||||
class CheckingApi {
|
||||
async logs() {
|
||||
return await axios({
|
||||
method: "GET",
|
||||
url: "logs",
|
||||
});
|
||||
}
|
||||
async users() {
|
||||
return await axios({
|
||||
method: "GET",
|
||||
url: "users",
|
||||
});
|
||||
}
|
||||
|
||||
async register({ file, user }: { user: IUser; file: any }) {
|
||||
const formData = new FormData();
|
||||
formData.append("file", file, "frame.jpg");
|
||||
|
||||
for (const [key, value] of Object.entries(user)) {
|
||||
formData.append(key, value);
|
||||
}
|
||||
|
||||
return await axios({
|
||||
headers: {
|
||||
"Content-Type": "multipart/form-data",
|
||||
},
|
||||
method: "POST",
|
||||
url: "/register",
|
||||
data: formData,
|
||||
});
|
||||
}
|
||||
|
||||
async registerSimple({ user }: { user: IUser }) {
|
||||
const formData = new FormData();
|
||||
|
||||
for (const [key, value] of Object.entries(user)) {
|
||||
formData.append(key, value);
|
||||
}
|
||||
|
||||
return await axios({
|
||||
headers: {
|
||||
"Content-Type": "multipart/form-data",
|
||||
},
|
||||
method: "POST",
|
||||
url: "/register-simple",
|
||||
data: formData,
|
||||
});
|
||||
}
|
||||
|
||||
async deleteUser(id: string | number) {
|
||||
return await axios({
|
||||
method: "DELETE",
|
||||
url: `/users/${id}`,
|
||||
});
|
||||
}
|
||||
|
||||
async checkin({ file }: { file: any }) {
|
||||
const formData = new FormData();
|
||||
formData.append("file", file, "frame.jpg");
|
||||
|
||||
return await axios({
|
||||
headers: {
|
||||
"Content-Type": "multipart/form-data",
|
||||
},
|
||||
method: "POST",
|
||||
url: "/checkin",
|
||||
data: formData,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
export const checkingApi = new CheckingApi();
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||
|
||||
import axios from "axios";
|
||||
|
||||
class MsApi {
|
||||
async timekeepings() {
|
||||
return await axios({
|
||||
headers: {
|
||||
Authorization:
|
||||
"Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL21zLnByb2xvZ3kubmV0L2FwaS92MS9hZG1pbi9sb2dpbiIsImlhdCI6MTc1Njg2MDQ1OSwiZXhwIjoxNzg4Mzk2NDU5LCJuYmYiOjE3NTY4NjA0NTksImp0aSI6IkRrb0NLbHBKV1pkNnZCN0QiLCJzdWIiOiIxNSIsInBydiI6ImQyZmYyOTMzOWE4YTNlODJjMzU4MmE1YThlNzM5ZGYxNzg5YmIxMmYifQ.DoHqHeAGGxpvzlNQ9dAZjZf2Yl573XCgNBT8ZiSx5N4",
|
||||
},
|
||||
baseURL: import.meta.env.VITE_API_BASE_MS + "/api/v1/admin",
|
||||
method: "GET",
|
||||
url: "timekeeping",
|
||||
params: {
|
||||
month: new Date().getMonth(),
|
||||
year: new Date().getFullYear(),
|
||||
},
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
export const msApi = new MsApi();
|
||||