Find this useful? Enter your email to receive occasional updates for securing PHP code.
Signing you up...
Thank you for signing up!
PHP Decode
<?php eval("?>".base64_decode("PD9waHANCg0KbmFtZXNwYWNlIEFwcFxIdHRwXENvbnRyb2xsZXJzXEFkbWl..
Decoded Output download
?>b"<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\File;
use App\Models\Sale;
use App\Models\Translation\WebinarAssignmentTranslation;
use App\Models\Webinar;
use App\Models\WebinarAssignment;
use App\Models\WebinarAssignmentAttachment;
use App\Models\WebinarAssignmentHistory;
use App\Models\WebinarChapterItem;
use App\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
class AssignmentController extends Controller
{
public function index(Request $request)
{
$this->authorize('admin_webinar_assignments_lists');
$query = WebinarAssignment::query();
$courseAssignmentsCount = deepClone($query)->count();
$pendingReviewCount = deepClone($query)->whereHas('assignmentHistory', function ($query) {
$query->where('status', WebinarAssignmentHistory::$pending);
})->count();
$passedCount = deepClone($query)->whereHas('assignmentHistory', function ($query) {
$query->where('status', WebinarAssignmentHistory::$passed);
})->count();
$failedCount = deepClone($query)->whereHas('assignmentHistory', function ($query) {
$query->where('status', WebinarAssignmentHistory::$notPassed);
})->count();
$query = $this->handleAssignmentsFilters($request, $query);
$assignments = $query->with([
'webinar',
'instructorAssignmentHistories' => function ($query) {
$query->orderBy('created_at', 'desc');
$query->with([
'messages' => function ($query) {
$query->orderBy('created_at', 'desc');
}
]);
},
])
->orderBy('created_at', 'desc')
->paginate(10);
$data = [
'pageTitle' => trans('update.assignments'),
'assignments' => $assignments,
'courseAssignmentsCount' => $courseAssignmentsCount,
'pendingReviewCount' => $pendingReviewCount,
'passedCount' => $passedCount,
'failedCount' => $failedCount,
];
$webinar_ids = $request->get('webinar_ids');
if (!empty($webinar_ids)) {
$data['webinars'] = Webinar::select('id')->whereIn('id', $webinar_ids)->get();
}
return view('admin.webinars.assignments.lists', $data);
}
private function handleAssignmentsFilters(Request $request, $query)
{
$from = $request->get('from', null);
$to = $request->get('to', null);
$webinar_ids = $request->get('webinar_ids');
$student_ids = $request->get('student_ids');
$status = $request->get('status', null);
$query = fromAndToDateFilter($from, $to, $query, 'created_at');
if (!empty($webinar_ids)) {
$query->whereIn('webinar_id', $webinar_ids);
}
if (!empty($student_ids)) {
$query->whereIn('student_id', $student_ids);
}
if (!empty($status)) {
$query->where('status', $status);
}
return $query;
}
public function students(Request $request, $id)
{
$this->authorize('admin_webinar_assignments_students');
$assignment = WebinarAssignment::findOrFail($id);
$webinar = $assignment->webinar;
$query = $assignment->instructorAssignmentHistories()
->with([
'student'
]);
$pendingReviewCount = deepClone($query)->where('status', WebinarAssignmentHistory::$pending)->count();
$passedCount = deepClone($query)->where('status', WebinarAssignmentHistory::$passed)->count();
$failedCount = deepClone($query)->where('status', WebinarAssignmentHistory::$notPassed)->count();
$query = $this->handleAssignmentsFilters($request, $query);
$histories = $query->orderBy('created_at', 'desc')
->paginate(10);
foreach ($histories as &$history) {
$history->usedAttemptsCount = 0;
$sale = Sale::where('buyer_id', $history->student_id)
->where('webinar_id', $assignment->webinar_id)
->whereNull('refund_at')
->first();
if (!empty($sale)) {
$history->purchase_date = $sale->created_at;
}
if (!empty($history) and count($history->messages)) {
try {
$history->last_submission = $history->messages->first()->created_at;
$history->first_submission = $history->messages->last()->created_at;
$history->usedAttemptsCount = $history->messages->count();
} catch (\Exception $exception) {
}
}
}
$data = [
'pageTitle' => trans('update.students_assignments'),
'assignment' => $assignment,
'histories' => $histories,
'webinar' => $webinar,
'pendingReviewCount' => $pendingReviewCount,
'passedCount' => $passedCount,
'failedCount' => $failedCount,
];
$student_ids = $request->get('student_ids');
if (!empty($student_ids)) {
$data['students'] = User::select('id', 'full_name')->whereIn('id', $student_ids)->get();
}
return view('admin.webinars.assignments.students', $data);
}
public function conversations($assignmentId, $historyId)
{
$this->authorize('admin_webinar_assignments_conversations');
$assignment = WebinarAssignment::findOrFail($assignmentId);
$history = WebinarAssignmentHistory::where('assignment_id', $assignmentId)
->where('id', $historyId)
->with([
'messages' => function ($query) {
$query->with([
'sender'
]);
}
])
->first();
if (!empty($history)) {
$data = [
'pageTitle' => trans('update.assignment_conversations'),
'assignment' => $assignment,
'conversations' => $history->messages,
];
return view('admin.webinars.assignments.conversation', $data);
}
abort(404);
}
public function store(Request $request)
{
$this->authorize('admin_webinars_edit');
$data = $request->get('ajax')['new'];
$validator = Validator::make($data, [
'webinar_id' => 'required',
'chapter_id' => 'required',
'title' => 'required|max:255',
'description' => 'required',
'grade' => 'required|integer',
'pass_grade' => 'required|integer',
]);
if ($validator->fails()) {
return response([
'code' => 422,
'errors' => $validator->errors(),
], 422);
}
if (!empty($data['sequence_content']) and $data['sequence_content'] == 'on') {
$data['check_previous_parts'] = (!empty($data['check_previous_parts']) and $data['check_previous_parts'] == 'on');
$data['access_after_day'] = !empty($data['access_after_day']) ? $data['access_after_day'] : null;
} else {
$data['check_previous_parts'] = false;
$data['access_after_day'] = null;
}
$webinar = Webinar::where('id', $data['webinar_id'])->first();
if (!empty($webinar)) {
$assignment = WebinarAssignment::create([
'creator_id' => $webinar->creator_id,
'webinar_id' => $data['webinar_id'],
'chapter_id' => $data['chapter_id'],
'grade' => $data['grade'] ?? null,
'pass_grade' => $data['pass_grade'] ?? null,
'deadline' => $data['deadline'] ?? null,
'attempts' => $data['attempts'] ?? null,
'check_previous_parts' => $data['check_previous_parts'],
'access_after_day' => $data['access_after_day'],
'status' => (!empty($data['status']) and $data['status'] == 'on') ? File::$Active : File::$Inactive,
'created_at' => time(),
]);
if ($assignment) {
WebinarAssignmentTranslation::updateOrCreate([
'webinar_assignment_id' => $assignment->id,
'locale' => mb_strtolower($data['locale']),
], [
'title' => $data['title'],
'description' => $data['description'],
]);
$this->handleAttachments($data['attachments'], $webinar->creator_id, $assignment->id);
if (!empty($assignment->chapter_id)) {
WebinarChapterItem::makeItem($webinar->creator_id, $assignment->chapter_id, $assignment->id, WebinarChapterItem::$chapterAssignment);
}
}
return response()->json([
'code' => 200,
], 200);
}
return response()->json([], 422);
}
public function edit(Request $request, $id)
{
$this->authorize('admin_webinars_edit');
$assignment = WebinarAssignment::where('id', $id)->first();
if (!empty($assignment)) {
$locale = $request->get('locale', app()->getLocale());
if (empty($locale)) {
$locale = app()->getLocale();
}
storeContentLocale($locale, $assignment->getTable(), $assignment->id);
$assignment->title = $assignment->getTitleAttribute();
$assignment->description = $assignment->getDescriptionAttribute();
$assignment->attachments = $assignment->attachments->toArray();
$assignment->locale = mb_strtoupper($locale);
}
return response()->json([
'assignment' => $assignment
]);
}
public function update(Request $request, $id)
{
$this->authorize('admin_webinars_edit');
$data = $request->get('ajax')[$id];
$validator = Validator::make($data, [
'webinar_id' => 'required',
'chapter_id' => 'required',
'title' => 'required|max:255',
'description' => 'required',
'grade' => 'required|integer',
'pass_grade' => 'required|integer',
]);
if ($validator->fails()) {
return response([
'code' => 422,
'errors' => $validator->errors(),
], 422);
}
if (!empty($data['sequence_content']) and $data['sequence_content'] == 'on') {
$data['check_previous_parts'] = (!empty($data['check_previous_parts']) and $data['check_previous_parts'] == 'on');
$data['access_after_day'] = !empty($data['access_after_day']) ? $data['access_after_day'] : null;
} else {
$data['check_previous_parts'] = false;
$data['access_after_day'] = null;
}
$assignment = WebinarAssignment::where('id', $id)
->first();
if (!empty($assignment)) {
$changeChapter = ($data['chapter_id'] != $assignment->chapter_id);
$oldChapterId = $assignment->chapter_id;
$assignment->update([
'chapter_id' => $data['chapter_id'],
'grade' => $data['grade'] ?? null,
'pass_grade' => $data['pass_grade'] ?? null,
'deadline' => $data['deadline'] ?? null,
'attempts' => $data['attempts'] ?? null,
'check_previous_parts' => $data['check_previous_parts'],
'access_after_day' => $data['access_after_day'],
'status' => (!empty($data['status']) and $data['status'] == 'on') ? File::$Active : File::$Inactive,
]);
if ($changeChapter) {
WebinarChapterItem::changeChapter($assignment->creator_id, $oldChapterId, $assignment->chapter_id, $assignment->id, WebinarChapterItem::$chapterAssignment);
}
WebinarAssignmentTranslation::updateOrCreate([
'webinar_assignment_id' => $assignment->id,
'locale' => mb_strtolower($data['locale']),
], [
'title' => $data['title'],
'description' => $data['description'],
]);
$this->handleAttachments($data['attachments'], $assignment->creator_id, $assignment->id);
removeContentLocale();
return response()->json([
'code' => 200,
], 200);
}
removeContentLocale();
return response()->json([], 422);
}
public function destroy($id)
{
$this->authorize('admin_webinars_edit');
$assignment = WebinarAssignment::where('id', $id)->first();
if (!empty($assignment)) {
WebinarChapterItem::where('user_id', $assignment->creator_id)
->where('item_id', $assignment->id)
->where('type', WebinarChapterItem::$chapterAssignment)
->delete();
$assignment->delete();
}
return response()->json([
'code' => 200
], 200);
}
private function handleAttachments($attachments, $creatorId, $assignmentId)
{
WebinarAssignmentAttachment::where('creator_id', $creatorId)
->where('assignment_id', $assignmentId)
->delete();
if (!empty($attachments) and count($attachments)) {
foreach ($attachments as $attachment) {
if (!empty($attachment['title']) and !empty($attachment['attach'])) {
WebinarAssignmentAttachment::create([
'creator_id' => $creatorId,
'assignment_id' => $assignmentId,
'title' => $attachment['title'],
'attach' => $attachment['attach'],
]);
}
}
}
}
}
"
Did this file decode correctly?
Original Code
<?php eval("?>".base64_decode("PD9waHANCg0KbmFtZXNwYWNlIEFwcFxIdHRwXENvbnRyb2xsZXJzXEFkbWluOw0KDQp1c2UgQXBwXEh0dHBcQ29udHJvbGxlcnNcQ29udHJvbGxlcjsNCnVzZSBBcHBcTW9kZWxzXEZpbGU7DQp1c2UgQXBwXE1vZGVsc1xTYWxlOw0KdXNlIEFwcFxNb2RlbHNcVHJhbnNsYXRpb25cV2ViaW5hckFzc2lnbm1lbnRUcmFuc2xhdGlvbjsNCnVzZSBBcHBcTW9kZWxzXFdlYmluYXI7DQp1c2UgQXBwXE1vZGVsc1xXZWJpbmFyQXNzaWdubWVudDsNCnVzZSBBcHBcTW9kZWxzXFdlYmluYXJBc3NpZ25tZW50QXR0YWNobWVudDsNCnVzZSBBcHBcTW9kZWxzXFdlYmluYXJBc3NpZ25tZW50SGlzdG9yeTsNCnVzZSBBcHBcTW9kZWxzXFdlYmluYXJDaGFwdGVySXRlbTsNCnVzZSBBcHBcVXNlcjsNCnVzZSBJbGx1bWluYXRlXEh0dHBcUmVxdWVzdDsNCnVzZSBJbGx1bWluYXRlXFN1cHBvcnRcRmFjYWRlc1xWYWxpZGF0b3I7DQoNCmNsYXNzIEFzc2lnbm1lbnRDb250cm9sbGVyIGV4dGVuZHMgQ29udHJvbGxlcg0Kew0KICAgIHB1YmxpYyBmdW5jdGlvbiBpbmRleChSZXF1ZXN0ICRyZXF1ZXN0KQ0KICAgIHsNCiAgICAgICAgJHRoaXMtPmF1dGhvcml6ZSgnYWRtaW5fd2ViaW5hcl9hc3NpZ25tZW50c19saXN0cycpOw0KDQogICAgICAgICRxdWVyeSA9IFdlYmluYXJBc3NpZ25tZW50OjpxdWVyeSgpOw0KDQogICAgICAgICRjb3Vyc2VBc3NpZ25tZW50c0NvdW50ID0gZGVlcENsb25lKCRxdWVyeSktPmNvdW50KCk7DQoNCiAgICAgICAgJHBlbmRpbmdSZXZpZXdDb3VudCA9IGRlZXBDbG9uZSgkcXVlcnkpLT53aGVyZUhhcygnYXNzaWdubWVudEhpc3RvcnknLCBmdW5jdGlvbiAoJHF1ZXJ5KSB7DQogICAgICAgICAgICAkcXVlcnktPndoZXJlKCdzdGF0dXMnLCBXZWJpbmFyQXNzaWdubWVudEhpc3Rvcnk6OiRwZW5kaW5nKTsNCiAgICAgICAgfSktPmNvdW50KCk7DQoNCiAgICAgICAgJHBhc3NlZENvdW50ID0gZGVlcENsb25lKCRxdWVyeSktPndoZXJlSGFzKCdhc3NpZ25tZW50SGlzdG9yeScsIGZ1bmN0aW9uICgkcXVlcnkpIHsNCiAgICAgICAgICAgICRxdWVyeS0+d2hlcmUoJ3N0YXR1cycsIFdlYmluYXJBc3NpZ25tZW50SGlzdG9yeTo6JHBhc3NlZCk7DQogICAgICAgIH0pLT5jb3VudCgpOw0KDQogICAgICAgICRmYWlsZWRDb3VudCA9IGRlZXBDbG9uZSgkcXVlcnkpLT53aGVyZUhhcygnYXNzaWdubWVudEhpc3RvcnknLCBmdW5jdGlvbiAoJHF1ZXJ5KSB7DQogICAgICAgICAgICAkcXVlcnktPndoZXJlKCdzdGF0dXMnLCBXZWJpbmFyQXNzaWdubWVudEhpc3Rvcnk6OiRub3RQYXNzZWQpOw0KICAgICAgICB9KS0+Y291bnQoKTsNCg0KICAgICAgICAkcXVlcnkgPSAkdGhpcy0+aGFuZGxlQXNzaWdubWVudHNGaWx0ZXJzKCRyZXF1ZXN0LCAkcXVlcnkpOw0KDQogICAgICAgICRhc3NpZ25tZW50cyA9ICRxdWVyeS0+d2l0aChbDQogICAgICAgICAgICAnd2ViaW5hcicsDQogICAgICAgICAgICAnaW5zdHJ1Y3RvckFzc2lnbm1lbnRIaXN0b3JpZXMnID0+IGZ1bmN0aW9uICgkcXVlcnkpIHsNCiAgICAgICAgICAgICAgICAkcXVlcnktPm9yZGVyQnkoJ2NyZWF0ZWRfYXQnLCAnZGVzYycpOw0KICAgICAgICAgICAgICAgICRxdWVyeS0+d2l0aChbDQogICAgICAgICAgICAgICAgICAgICdtZXNzYWdlcycgPT4gZnVuY3Rpb24gKCRxdWVyeSkgew0KICAgICAgICAgICAgICAgICAgICAgICAgJHF1ZXJ5LT5vcmRlckJ5KCdjcmVhdGVkX2F0JywgJ2Rlc2MnKTsNCiAgICAgICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIF0pOw0KICAgICAgICAgICAgfSwNCiAgICAgICAgXSkNCiAgICAgICAgICAgIC0+b3JkZXJCeSgnY3JlYXRlZF9hdCcsICdkZXNjJykNCiAgICAgICAgICAgIC0+cGFnaW5hdGUoMTApOw0KDQogICAgICAgICRkYXRhID0gWw0KICAgICAgICAgICAgJ3BhZ2VUaXRsZScgPT4gdHJhbnMoJ3VwZGF0ZS5hc3NpZ25tZW50cycpLA0KICAgICAgICAgICAgJ2Fzc2lnbm1lbnRzJyA9PiAkYXNzaWdubWVudHMsDQogICAgICAgICAgICAnY291cnNlQXNzaWdubWVudHNDb3VudCcgPT4gJGNvdXJzZUFzc2lnbm1lbnRzQ291bnQsDQogICAgICAgICAgICAncGVuZGluZ1Jldmlld0NvdW50JyA9PiAkcGVuZGluZ1Jldmlld0NvdW50LA0KICAgICAgICAgICAgJ3Bhc3NlZENvdW50JyA9PiAkcGFzc2VkQ291bnQsDQogICAgICAgICAgICAnZmFpbGVkQ291bnQnID0+ICRmYWlsZWRDb3VudCwNCiAgICAgICAgXTsNCg0KICAgICAgICAkd2ViaW5hcl9pZHMgPSAkcmVxdWVzdC0+Z2V0KCd3ZWJpbmFyX2lkcycpOw0KICAgICAgICBpZiAoIWVtcHR5KCR3ZWJpbmFyX2lkcykpIHsNCiAgICAgICAgICAgICRkYXRhWyd3ZWJpbmFycyddID0gV2ViaW5hcjo6c2VsZWN0KCdpZCcpLT53aGVyZUluKCdpZCcsICR3ZWJpbmFyX2lkcyktPmdldCgpOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIHZpZXcoJ2FkbWluLndlYmluYXJzLmFzc2lnbm1lbnRzLmxpc3RzJywgJGRhdGEpOw0KICAgIH0NCg0KICAgIHByaXZhdGUgZnVuY3Rpb24gaGFuZGxlQXNzaWdubWVudHNGaWx0ZXJzKFJlcXVlc3QgJHJlcXVlc3QsICRxdWVyeSkNCiAgICB7DQogICAgICAgICRmcm9tID0gJHJlcXVlc3QtPmdldCgnZnJvbScsIG51bGwpOw0KICAgICAgICAkdG8gPSAkcmVxdWVzdC0+Z2V0KCd0bycsIG51bGwpOw0KICAgICAgICAkd2ViaW5hcl9pZHMgPSAkcmVxdWVzdC0+Z2V0KCd3ZWJpbmFyX2lkcycpOw0KICAgICAgICAkc3R1ZGVudF9pZHMgPSAkcmVxdWVzdC0+Z2V0KCdzdHVkZW50X2lkcycpOw0KICAgICAgICAkc3RhdHVzID0gJHJlcXVlc3QtPmdldCgnc3RhdHVzJywgbnVsbCk7DQoNCiAgICAgICAgJHF1ZXJ5ID0gZnJvbUFuZFRvRGF0ZUZpbHRlcigkZnJvbSwgJHRvLCAkcXVlcnksICdjcmVhdGVkX2F0Jyk7DQoNCiAgICAgICAgaWYgKCFlbXB0eSgkd2ViaW5hcl9pZHMpKSB7DQogICAgICAgICAgICAkcXVlcnktPndoZXJlSW4oJ3dlYmluYXJfaWQnLCAkd2ViaW5hcl9pZHMpOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKCFlbXB0eSgkc3R1ZGVudF9pZHMpKSB7DQogICAgICAgICAgICAkcXVlcnktPndoZXJlSW4oJ3N0dWRlbnRfaWQnLCAkc3R1ZGVudF9pZHMpOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKCFlbXB0eSgkc3RhdHVzKSkgew0KICAgICAgICAgICAgJHF1ZXJ5LT53aGVyZSgnc3RhdHVzJywgJHN0YXR1cyk7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gJHF1ZXJ5Ow0KICAgIH0NCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBzdHVkZW50cyhSZXF1ZXN0ICRyZXF1ZXN0LCAkaWQpDQogICAgew0KICAgICAgICAkdGhpcy0+YXV0aG9yaXplKCdhZG1pbl93ZWJpbmFyX2Fzc2lnbm1lbnRzX3N0dWRlbnRzJyk7DQoNCiAgICAgICAgJGFzc2lnbm1lbnQgPSBXZWJpbmFyQXNzaWdubWVudDo6ZmluZE9yRmFpbCgkaWQpOw0KDQogICAgICAgICR3ZWJpbmFyID0gJGFzc2lnbm1lbnQtPndlYmluYXI7DQoNCiAgICAgICAgJHF1ZXJ5ID0gJGFzc2lnbm1lbnQtPmluc3RydWN0b3JBc3NpZ25tZW50SGlzdG9yaWVzKCkNCiAgICAgICAgICAgIC0+d2l0aChbDQogICAgICAgICAgICAgICAgJ3N0dWRlbnQnDQogICAgICAgICAgICBdKTsNCg0KICAgICAgICAkcGVuZGluZ1Jldmlld0NvdW50ID0gZGVlcENsb25lKCRxdWVyeSktPndoZXJlKCdzdGF0dXMnLCBXZWJpbmFyQXNzaWdubWVudEhpc3Rvcnk6OiRwZW5kaW5nKS0+Y291bnQoKTsNCiAgICAgICAgJHBhc3NlZENvdW50ID0gZGVlcENsb25lKCRxdWVyeSktPndoZXJlKCdzdGF0dXMnLCBXZWJpbmFyQXNzaWdubWVudEhpc3Rvcnk6OiRwYXNzZWQpLT5jb3VudCgpOw0KICAgICAgICAkZmFpbGVkQ291bnQgPSBkZWVwQ2xvbmUoJHF1ZXJ5KS0+d2hlcmUoJ3N0YXR1cycsIFdlYmluYXJBc3NpZ25tZW50SGlzdG9yeTo6JG5vdFBhc3NlZCktPmNvdW50KCk7DQoNCiAgICAgICAgJHF1ZXJ5ID0gJHRoaXMtPmhhbmRsZUFzc2lnbm1lbnRzRmlsdGVycygkcmVxdWVzdCwgJHF1ZXJ5KTsNCg0KICAgICAgICAkaGlzdG9yaWVzID0gJHF1ZXJ5LT5vcmRlckJ5KCdjcmVhdGVkX2F0JywgJ2Rlc2MnKQ0KICAgICAgICAgICAgLT5wYWdpbmF0ZSgxMCk7DQoNCiAgICAgICAgZm9yZWFjaCAoJGhpc3RvcmllcyBhcyAmJGhpc3RvcnkpIHsNCiAgICAgICAgICAgICRoaXN0b3J5LT51c2VkQXR0ZW1wdHNDb3VudCA9IDA7DQoNCiAgICAgICAgICAgICRzYWxlID0gU2FsZTo6d2hlcmUoJ2J1eWVyX2lkJywgJGhpc3RvcnktPnN0dWRlbnRfaWQpDQogICAgICAgICAgICAgICAgLT53aGVyZSgnd2ViaW5hcl9pZCcsICRhc3NpZ25tZW50LT53ZWJpbmFyX2lkKQ0KICAgICAgICAgICAgICAgIC0+d2hlcmVOdWxsKCdyZWZ1bmRfYXQnKQ0KICAgICAgICAgICAgICAgIC0+Zmlyc3QoKTsNCg0KICAgICAgICAgICAgaWYgKCFlbXB0eSgkc2FsZSkpIHsNCiAgICAgICAgICAgICAgICAkaGlzdG9yeS0+cHVyY2hhc2VfZGF0ZSA9ICRzYWxlLT5jcmVhdGVkX2F0Ow0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBpZiAoIWVtcHR5KCRoaXN0b3J5KSBhbmQgY291bnQoJGhpc3RvcnktPm1lc3NhZ2VzKSkgew0KICAgICAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgICAgICAgICRoaXN0b3J5LT5sYXN0X3N1Ym1pc3Npb24gPSAkaGlzdG9yeS0+bWVzc2FnZXMtPmZpcnN0KCktPmNyZWF0ZWRfYXQ7DQogICAgICAgICAgICAgICAgICAgICRoaXN0b3J5LT5maXJzdF9zdWJtaXNzaW9uID0gJGhpc3RvcnktPm1lc3NhZ2VzLT5sYXN0KCktPmNyZWF0ZWRfYXQ7DQogICAgICAgICAgICAgICAgICAgICRoaXN0b3J5LT51c2VkQXR0ZW1wdHNDb3VudCA9ICRoaXN0b3J5LT5tZXNzYWdlcy0+Y291bnQoKTsNCiAgICAgICAgICAgICAgICB9IGNhdGNoIChcRXhjZXB0aW9uICRleGNlcHRpb24pIHsNCg0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KDQogICAgICAgICRkYXRhID0gWw0KICAgICAgICAgICAgJ3BhZ2VUaXRsZScgPT4gdHJhbnMoJ3VwZGF0ZS5zdHVkZW50c19hc3NpZ25tZW50cycpLA0KICAgICAgICAgICAgJ2Fzc2lnbm1lbnQnID0+ICRhc3NpZ25tZW50LA0KICAgICAgICAgICAgJ2hpc3RvcmllcycgPT4gJGhpc3RvcmllcywNCiAgICAgICAgICAgICd3ZWJpbmFyJyA9PiAkd2ViaW5hciwNCiAgICAgICAgICAgICdwZW5kaW5nUmV2aWV3Q291bnQnID0+ICRwZW5kaW5nUmV2aWV3Q291bnQsDQogICAgICAgICAgICAncGFzc2VkQ291bnQnID0+ICRwYXNzZWRDb3VudCwNCiAgICAgICAgICAgICdmYWlsZWRDb3VudCcgPT4gJGZhaWxlZENvdW50LA0KICAgICAgICBdOw0KDQogICAgICAgICRzdHVkZW50X2lkcyA9ICRyZXF1ZXN0LT5nZXQoJ3N0dWRlbnRfaWRzJyk7DQogICAgICAgIGlmICghZW1wdHkoJHN0dWRlbnRfaWRzKSkgew0KICAgICAgICAgICAgJGRhdGFbJ3N0dWRlbnRzJ10gPSBVc2VyOjpzZWxlY3QoJ2lkJywgJ2Z1bGxfbmFtZScpLT53aGVyZUluKCdpZCcsICRzdHVkZW50X2lkcyktPmdldCgpOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIHZpZXcoJ2FkbWluLndlYmluYXJzLmFzc2lnbm1lbnRzLnN0dWRlbnRzJywgJGRhdGEpOw0KICAgIH0NCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBjb252ZXJzYXRpb25zKCRhc3NpZ25tZW50SWQsICRoaXN0b3J5SWQpDQogICAgew0KICAgICAgICAkdGhpcy0+YXV0aG9yaXplKCdhZG1pbl93ZWJpbmFyX2Fzc2lnbm1lbnRzX2NvbnZlcnNhdGlvbnMnKTsNCg0KICAgICAgICAkYXNzaWdubWVudCA9IFdlYmluYXJBc3NpZ25tZW50OjpmaW5kT3JGYWlsKCRhc3NpZ25tZW50SWQpOw0KDQogICAgICAgICRoaXN0b3J5ID0gV2ViaW5hckFzc2lnbm1lbnRIaXN0b3J5Ojp3aGVyZSgnYXNzaWdubWVudF9pZCcsICRhc3NpZ25tZW50SWQpDQogICAgICAgICAgICAtPndoZXJlKCdpZCcsICRoaXN0b3J5SWQpDQogICAgICAgICAgICAtPndpdGgoWw0KICAgICAgICAgICAgICAgICdtZXNzYWdlcycgPT4gZnVuY3Rpb24gKCRxdWVyeSkgew0KICAgICAgICAgICAgICAgICAgICAkcXVlcnktPndpdGgoWw0KICAgICAgICAgICAgICAgICAgICAgICAgJ3NlbmRlcicNCiAgICAgICAgICAgICAgICAgICAgXSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgXSkNCiAgICAgICAgICAgIC0+Zmlyc3QoKTsNCg0KICAgICAgICBpZiAoIWVtcHR5KCRoaXN0b3J5KSkgew0KICAgICAgICAgICAgJGRhdGEgPSBbDQogICAgICAgICAgICAgICAgJ3BhZ2VUaXRsZScgPT4gdHJhbnMoJ3VwZGF0ZS5hc3NpZ25tZW50X2NvbnZlcnNhdGlvbnMnKSwNCiAgICAgICAgICAgICAgICAnYXNzaWdubWVudCcgPT4gJGFzc2lnbm1lbnQsDQogICAgICAgICAgICAgICAgJ2NvbnZlcnNhdGlvbnMnID0+ICRoaXN0b3J5LT5tZXNzYWdlcywNCiAgICAgICAgICAgIF07DQoNCiAgICAgICAgICAgIHJldHVybiB2aWV3KCdhZG1pbi53ZWJpbmFycy5hc3NpZ25tZW50cy5jb252ZXJzYXRpb24nLCAkZGF0YSk7DQogICAgICAgIH0NCg0KICAgICAgICBhYm9ydCg0MDQpOw0KICAgIH0NCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBzdG9yZShSZXF1ZXN0ICRyZXF1ZXN0KQ0KICAgIHsNCiAgICAgICAgJHRoaXMtPmF1dGhvcml6ZSgnYWRtaW5fd2ViaW5hcnNfZWRpdCcpOw0KDQogICAgICAgICRkYXRhID0gJHJlcXVlc3QtPmdldCgnYWpheCcpWyduZXcnXTsNCg0KICAgICAgICAkdmFsaWRhdG9yID0gVmFsaWRhdG9yOjptYWtlKCRkYXRhLCBbDQogICAgICAgICAgICAnd2ViaW5hcl9pZCcgPT4gJ3JlcXVpcmVkJywNCiAgICAgICAgICAgICdjaGFwdGVyX2lkJyA9PiAncmVxdWlyZWQnLA0KICAgICAgICAgICAgJ3RpdGxlJyA9PiAncmVxdWlyZWR8bWF4OjI1NScsDQogICAgICAgICAgICAnZGVzY3JpcHRpb24nID0+ICdyZXF1aXJlZCcsDQogICAgICAgICAgICAnZ3JhZGUnID0+ICdyZXF1aXJlZHxpbnRlZ2VyJywNCiAgICAgICAgICAgICdwYXNzX2dyYWRlJyA9PiAncmVxdWlyZWR8aW50ZWdlcicsDQogICAgICAgIF0pOw0KDQogICAgICAgIGlmICgkdmFsaWRhdG9yLT5mYWlscygpKSB7DQogICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UoWw0KICAgICAgICAgICAgICAgICdjb2RlJyA9PiA0MjIsDQogICAgICAgICAgICAgICAgJ2Vycm9ycycgPT4gJHZhbGlkYXRvci0+ZXJyb3JzKCksDQogICAgICAgICAgICBdLCA0MjIpOw0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKCFlbXB0eSgkZGF0YVsnc2VxdWVuY2VfY29udGVudCddKSBhbmQgJGRhdGFbJ3NlcXVlbmNlX2NvbnRlbnQnXSA9PSAnb24nKSB7DQogICAgICAgICAgICAkZGF0YVsnY2hlY2tfcHJldmlvdXNfcGFydHMnXSA9ICghZW1wdHkoJGRhdGFbJ2NoZWNrX3ByZXZpb3VzX3BhcnRzJ10pIGFuZCAkZGF0YVsnY2hlY2tfcHJldmlvdXNfcGFydHMnXSA9PSAnb24nKTsNCiAgICAgICAgICAgICRkYXRhWydhY2Nlc3NfYWZ0ZXJfZGF5J10gPSAhZW1wdHkoJGRhdGFbJ2FjY2Vzc19hZnRlcl9kYXknXSkgPyAkZGF0YVsnYWNjZXNzX2FmdGVyX2RheSddIDogbnVsbDsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICRkYXRhWydjaGVja19wcmV2aW91c19wYXJ0cyddID0gZmFsc2U7DQogICAgICAgICAgICAkZGF0YVsnYWNjZXNzX2FmdGVyX2RheSddID0gbnVsbDsNCiAgICAgICAgfQ0KDQogICAgICAgICR3ZWJpbmFyID0gV2ViaW5hcjo6d2hlcmUoJ2lkJywgJGRhdGFbJ3dlYmluYXJfaWQnXSktPmZpcnN0KCk7DQoNCiAgICAgICAgaWYgKCFlbXB0eSgkd2ViaW5hcikpIHsNCiAgICAgICAgICAgICRhc3NpZ25tZW50ID0gV2ViaW5hckFzc2lnbm1lbnQ6OmNyZWF0ZShbDQogICAgICAgICAgICAgICAgJ2NyZWF0b3JfaWQnID0+ICR3ZWJpbmFyLT5jcmVhdG9yX2lkLA0KICAgICAgICAgICAgICAgICd3ZWJpbmFyX2lkJyA9PiAkZGF0YVsnd2ViaW5hcl9pZCddLA0KICAgICAgICAgICAgICAgICdjaGFwdGVyX2lkJyA9PiAkZGF0YVsnY2hhcHRlcl9pZCddLA0KICAgICAgICAgICAgICAgICdncmFkZScgPT4gJGRhdGFbJ2dyYWRlJ10gPz8gbnVsbCwNCiAgICAgICAgICAgICAgICAncGFzc19ncmFkZScgPT4gJGRhdGFbJ3Bhc3NfZ3JhZGUnXSA/PyBudWxsLA0KICAgICAgICAgICAgICAgICdkZWFkbGluZScgPT4gJGRhdGFbJ2RlYWRsaW5lJ10gPz8gbnVsbCwNCiAgICAgICAgICAgICAgICAnYXR0ZW1wdHMnID0+ICRkYXRhWydhdHRlbXB0cyddID8/IG51bGwsDQogICAgICAgICAgICAgICAgJ2NoZWNrX3ByZXZpb3VzX3BhcnRzJyA9PiAkZGF0YVsnY2hlY2tfcHJldmlvdXNfcGFydHMnXSwNCiAgICAgICAgICAgICAgICAnYWNjZXNzX2FmdGVyX2RheScgPT4gJGRhdGFbJ2FjY2Vzc19hZnRlcl9kYXknXSwNCiAgICAgICAgICAgICAgICAnc3RhdHVzJyA9PiAoIWVtcHR5KCRkYXRhWydzdGF0dXMnXSkgYW5kICRkYXRhWydzdGF0dXMnXSA9PSAnb24nKSA/IEZpbGU6OiRBY3RpdmUgOiBGaWxlOjokSW5hY3RpdmUsDQogICAgICAgICAgICAgICAgJ2NyZWF0ZWRfYXQnID0+IHRpbWUoKSwNCiAgICAgICAgICAgIF0pOw0KDQogICAgICAgICAgICBpZiAoJGFzc2lnbm1lbnQpIHsNCiAgICAgICAgICAgICAgICBXZWJpbmFyQXNzaWdubWVudFRyYW5zbGF0aW9uOjp1cGRhdGVPckNyZWF0ZShbDQogICAgICAgICAgICAgICAgICAgICd3ZWJpbmFyX2Fzc2lnbm1lbnRfaWQnID0+ICRhc3NpZ25tZW50LT5pZCwNCiAgICAgICAgICAgICAgICAgICAgJ2xvY2FsZScgPT4gbWJfc3RydG9sb3dlcigkZGF0YVsnbG9jYWxlJ10pLA0KICAgICAgICAgICAgICAgIF0sIFsNCiAgICAgICAgICAgICAgICAgICAgJ3RpdGxlJyA9PiAkZGF0YVsndGl0bGUnXSwNCiAgICAgICAgICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJyA9PiAkZGF0YVsnZGVzY3JpcHRpb24nXSwNCiAgICAgICAgICAgICAgICBdKTsNCg0KDQogICAgICAgICAgICAgICAgJHRoaXMtPmhhbmRsZUF0dGFjaG1lbnRzKCRkYXRhWydhdHRhY2htZW50cyddLCAkd2ViaW5hci0+Y3JlYXRvcl9pZCwgJGFzc2lnbm1lbnQtPmlkKTsNCg0KICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJGFzc2lnbm1lbnQtPmNoYXB0ZXJfaWQpKSB7DQogICAgICAgICAgICAgICAgICAgIFdlYmluYXJDaGFwdGVySXRlbTo6bWFrZUl0ZW0oJHdlYmluYXItPmNyZWF0b3JfaWQsICRhc3NpZ25tZW50LT5jaGFwdGVyX2lkLCAkYXNzaWdubWVudC0+aWQsIFdlYmluYXJDaGFwdGVySXRlbTo6JGNoYXB0ZXJBc3NpZ25tZW50KTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIHJldHVybiByZXNwb25zZSgpLT5qc29uKFsNCiAgICAgICAgICAgICAgICAnY29kZScgPT4gMjAwLA0KICAgICAgICAgICAgXSwgMjAwKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHJldHVybiByZXNwb25zZSgpLT5qc29uKFtdLCA0MjIpOw0KICAgIH0NCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBlZGl0KFJlcXVlc3QgJHJlcXVlc3QsICRpZCkNCiAgICB7DQogICAgICAgICR0aGlzLT5hdXRob3JpemUoJ2FkbWluX3dlYmluYXJzX2VkaXQnKTsNCg0KICAgICAgICAkYXNzaWdubWVudCA9IFdlYmluYXJBc3NpZ25tZW50Ojp3aGVyZSgnaWQnLCAkaWQpLT5maXJzdCgpOw0KDQogICAgICAgIGlmICghZW1wdHkoJGFzc2lnbm1lbnQpKSB7DQogICAgICAgICAgICAkbG9jYWxlID0gJHJlcXVlc3QtPmdldCgnbG9jYWxlJywgYXBwKCktPmdldExvY2FsZSgpKTsNCiAgICAgICAgICAgIGlmIChlbXB0eSgkbG9jYWxlKSkgew0KICAgICAgICAgICAgICAgICRsb2NhbGUgPSBhcHAoKS0+Z2V0TG9jYWxlKCk7DQogICAgICAgICAgICB9DQogICAgICAgICAgICBzdG9yZUNvbnRlbnRMb2NhbGUoJGxvY2FsZSwgJGFzc2lnbm1lbnQtPmdldFRhYmxlKCksICRhc3NpZ25tZW50LT5pZCk7DQoNCiAgICAgICAgICAgICRhc3NpZ25tZW50LT50aXRsZSA9ICRhc3NpZ25tZW50LT5nZXRUaXRsZUF0dHJpYnV0ZSgpOw0KICAgICAgICAgICAgJGFzc2lnbm1lbnQtPmRlc2NyaXB0aW9uID0gJGFzc2lnbm1lbnQtPmdldERlc2NyaXB0aW9uQXR0cmlidXRlKCk7DQogICAgICAgICAgICAkYXNzaWdubWVudC0+YXR0YWNobWVudHMgPSAkYXNzaWdubWVudC0+YXR0YWNobWVudHMtPnRvQXJyYXkoKTsNCiAgICAgICAgICAgICRhc3NpZ25tZW50LT5sb2NhbGUgPSBtYl9zdHJ0b3VwcGVyKCRsb2NhbGUpOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIHJlc3BvbnNlKCktPmpzb24oWw0KICAgICAgICAgICAgJ2Fzc2lnbm1lbnQnID0+ICRhc3NpZ25tZW50DQogICAgICAgIF0pOw0KICAgIH0NCg0KICAgIHB1YmxpYyBmdW5jdGlvbiB1cGRhdGUoUmVxdWVzdCAkcmVxdWVzdCwgJGlkKQ0KICAgIHsNCiAgICAgICAgJHRoaXMtPmF1dGhvcml6ZSgnYWRtaW5fd2ViaW5hcnNfZWRpdCcpOw0KDQogICAgICAgICRkYXRhID0gJHJlcXVlc3QtPmdldCgnYWpheCcpWyRpZF07DQoNCiAgICAgICAgJHZhbGlkYXRvciA9IFZhbGlkYXRvcjo6bWFrZSgkZGF0YSwgWw0KICAgICAgICAgICAgJ3dlYmluYXJfaWQnID0+ICdyZXF1aXJlZCcsDQogICAgICAgICAgICAnY2hhcHRlcl9pZCcgPT4gJ3JlcXVpcmVkJywNCiAgICAgICAgICAgICd0aXRsZScgPT4gJ3JlcXVpcmVkfG1heDoyNTUnLA0KICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJyA9PiAncmVxdWlyZWQnLA0KICAgICAgICAgICAgJ2dyYWRlJyA9PiAncmVxdWlyZWR8aW50ZWdlcicsDQogICAgICAgICAgICAncGFzc19ncmFkZScgPT4gJ3JlcXVpcmVkfGludGVnZXInLA0KICAgICAgICBdKTsNCg0KICAgICAgICBpZiAoJHZhbGlkYXRvci0+ZmFpbHMoKSkgew0KICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlKFsNCiAgICAgICAgICAgICAgICAnY29kZScgPT4gNDIyLA0KICAgICAgICAgICAgICAgICdlcnJvcnMnID0+ICR2YWxpZGF0b3ItPmVycm9ycygpLA0KICAgICAgICAgICAgXSwgNDIyKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICghZW1wdHkoJGRhdGFbJ3NlcXVlbmNlX2NvbnRlbnQnXSkgYW5kICRkYXRhWydzZXF1ZW5jZV9jb250ZW50J10gPT0gJ29uJykgew0KICAgICAgICAgICAgJGRhdGFbJ2NoZWNrX3ByZXZpb3VzX3BhcnRzJ10gPSAoIWVtcHR5KCRkYXRhWydjaGVja19wcmV2aW91c19wYXJ0cyddKSBhbmQgJGRhdGFbJ2NoZWNrX3ByZXZpb3VzX3BhcnRzJ10gPT0gJ29uJyk7DQogICAgICAgICAgICAkZGF0YVsnYWNjZXNzX2FmdGVyX2RheSddID0gIWVtcHR5KCRkYXRhWydhY2Nlc3NfYWZ0ZXJfZGF5J10pID8gJGRhdGFbJ2FjY2Vzc19hZnRlcl9kYXknXSA6IG51bGw7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkZGF0YVsnY2hlY2tfcHJldmlvdXNfcGFydHMnXSA9IGZhbHNlOw0KICAgICAgICAgICAgJGRhdGFbJ2FjY2Vzc19hZnRlcl9kYXknXSA9IG51bGw7DQogICAgICAgIH0NCg0KICAgICAgICAkYXNzaWdubWVudCA9IFdlYmluYXJBc3NpZ25tZW50Ojp3aGVyZSgnaWQnLCAkaWQpDQogICAgICAgICAgICAtPmZpcnN0KCk7DQoNCiAgICAgICAgaWYgKCFlbXB0eSgkYXNzaWdubWVudCkpIHsNCiAgICAgICAgICAgICRjaGFuZ2VDaGFwdGVyID0gKCRkYXRhWydjaGFwdGVyX2lkJ10gIT0gJGFzc2lnbm1lbnQtPmNoYXB0ZXJfaWQpOw0KICAgICAgICAgICAgJG9sZENoYXB0ZXJJZCA9ICRhc3NpZ25tZW50LT5jaGFwdGVyX2lkOw0KDQogICAgICAgICAgICAkYXNzaWdubWVudC0+dXBkYXRlKFsNCiAgICAgICAgICAgICAgICAnY2hhcHRlcl9pZCcgPT4gJGRhdGFbJ2NoYXB0ZXJfaWQnXSwNCiAgICAgICAgICAgICAgICAnZ3JhZGUnID0+ICRkYXRhWydncmFkZSddID8/IG51bGwsDQogICAgICAgICAgICAgICAgJ3Bhc3NfZ3JhZGUnID0+ICRkYXRhWydwYXNzX2dyYWRlJ10gPz8gbnVsbCwNCiAgICAgICAgICAgICAgICAnZGVhZGxpbmUnID0+ICRkYXRhWydkZWFkbGluZSddID8/IG51bGwsDQogICAgICAgICAgICAgICAgJ2F0dGVtcHRzJyA9PiAkZGF0YVsnYXR0ZW1wdHMnXSA/PyBudWxsLA0KICAgICAgICAgICAgICAgICdjaGVja19wcmV2aW91c19wYXJ0cycgPT4gJGRhdGFbJ2NoZWNrX3ByZXZpb3VzX3BhcnRzJ10sDQogICAgICAgICAgICAgICAgJ2FjY2Vzc19hZnRlcl9kYXknID0+ICRkYXRhWydhY2Nlc3NfYWZ0ZXJfZGF5J10sDQogICAgICAgICAgICAgICAgJ3N0YXR1cycgPT4gKCFlbXB0eSgkZGF0YVsnc3RhdHVzJ10pIGFuZCAkZGF0YVsnc3RhdHVzJ10gPT0gJ29uJykgPyBGaWxlOjokQWN0aXZlIDogRmlsZTo6JEluYWN0aXZlLA0KICAgICAgICAgICAgXSk7DQoNCiAgICAgICAgICAgIGlmICgkY2hhbmdlQ2hhcHRlcikgew0KICAgICAgICAgICAgICAgIFdlYmluYXJDaGFwdGVySXRlbTo6Y2hhbmdlQ2hhcHRlcigkYXNzaWdubWVudC0+Y3JlYXRvcl9pZCwgJG9sZENoYXB0ZXJJZCwgJGFzc2lnbm1lbnQtPmNoYXB0ZXJfaWQsICRhc3NpZ25tZW50LT5pZCwgV2ViaW5hckNoYXB0ZXJJdGVtOjokY2hhcHRlckFzc2lnbm1lbnQpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBXZWJpbmFyQXNzaWdubWVudFRyYW5zbGF0aW9uOjp1cGRhdGVPckNyZWF0ZShbDQogICAgICAgICAgICAgICAgJ3dlYmluYXJfYXNzaWdubWVudF9pZCcgPT4gJGFzc2lnbm1lbnQtPmlkLA0KICAgICAgICAgICAgICAgICdsb2NhbGUnID0+IG1iX3N0cnRvbG93ZXIoJGRhdGFbJ2xvY2FsZSddKSwNCiAgICAgICAgICAgIF0sIFsNCiAgICAgICAgICAgICAgICAndGl0bGUnID0+ICRkYXRhWyd0aXRsZSddLA0KICAgICAgICAgICAgICAgICdkZXNjcmlwdGlvbicgPT4gJGRhdGFbJ2Rlc2NyaXB0aW9uJ10sDQogICAgICAgICAgICBdKTsNCg0KICAgICAgICAgICAgJHRoaXMtPmhhbmRsZUF0dGFjaG1lbnRzKCRkYXRhWydhdHRhY2htZW50cyddLCAkYXNzaWdubWVudC0+Y3JlYXRvcl9pZCwgJGFzc2lnbm1lbnQtPmlkKTsNCg0KICAgICAgICAgICAgcmVtb3ZlQ29udGVudExvY2FsZSgpOw0KDQogICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UoKS0+anNvbihbDQogICAgICAgICAgICAgICAgJ2NvZGUnID0+IDIwMCwNCiAgICAgICAgICAgIF0sIDIwMCk7DQogICAgICAgIH0NCg0KICAgICAgICByZW1vdmVDb250ZW50TG9jYWxlKCk7DQoNCiAgICAgICAgcmV0dXJuIHJlc3BvbnNlKCktPmpzb24oW10sIDQyMik7DQogICAgfQ0KDQogICAgcHVibGljIGZ1bmN0aW9uIGRlc3Ryb3koJGlkKQ0KICAgIHsNCiAgICAgICAgJHRoaXMtPmF1dGhvcml6ZSgnYWRtaW5fd2ViaW5hcnNfZWRpdCcpOw0KDQogICAgICAgICRhc3NpZ25tZW50ID0gV2ViaW5hckFzc2lnbm1lbnQ6OndoZXJlKCdpZCcsICRpZCktPmZpcnN0KCk7DQoNCiAgICAgICAgaWYgKCFlbXB0eSgkYXNzaWdubWVudCkpIHsNCiAgICAgICAgICAgIFdlYmluYXJDaGFwdGVySXRlbTo6d2hlcmUoJ3VzZXJfaWQnLCAkYXNzaWdubWVudC0+Y3JlYXRvcl9pZCkNCiAgICAgICAgICAgICAgICAtPndoZXJlKCdpdGVtX2lkJywgJGFzc2lnbm1lbnQtPmlkKQ0KICAgICAgICAgICAgICAgIC0+d2hlcmUoJ3R5cGUnLCBXZWJpbmFyQ2hhcHRlckl0ZW06OiRjaGFwdGVyQXNzaWdubWVudCkNCiAgICAgICAgICAgICAgICAtPmRlbGV0ZSgpOw0KDQogICAgICAgICAgICAkYXNzaWdubWVudC0+ZGVsZXRlKCk7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gcmVzcG9uc2UoKS0+anNvbihbDQogICAgICAgICAgICAnY29kZScgPT4gMjAwDQogICAgICAgIF0sIDIwMCk7DQogICAgfQ0KDQogICAgcHJpdmF0ZSBmdW5jdGlvbiBoYW5kbGVBdHRhY2htZW50cygkYXR0YWNobWVudHMsICRjcmVhdG9ySWQsICRhc3NpZ25tZW50SWQpDQogICAgew0KICAgICAgICBXZWJpbmFyQXNzaWdubWVudEF0dGFjaG1lbnQ6OndoZXJlKCdjcmVhdG9yX2lkJywgJGNyZWF0b3JJZCkNCiAgICAgICAgICAgIC0+d2hlcmUoJ2Fzc2lnbm1lbnRfaWQnLCAkYXNzaWdubWVudElkKQ0KICAgICAgICAgICAgLT5kZWxldGUoKTsNCg0KICAgICAgICBpZiAoIWVtcHR5KCRhdHRhY2htZW50cykgYW5kIGNvdW50KCRhdHRhY2htZW50cykpIHsNCiAgICAgICAgICAgIGZvcmVhY2ggKCRhdHRhY2htZW50cyBhcyAkYXR0YWNobWVudCkgew0KICAgICAgICAgICAgICAgIGlmICghZW1wdHkoJGF0dGFjaG1lbnRbJ3RpdGxlJ10pIGFuZCAhZW1wdHkoJGF0dGFjaG1lbnRbJ2F0dGFjaCddKSkgew0KICAgICAgICAgICAgICAgICAgICBXZWJpbmFyQXNzaWdubWVudEF0dGFjaG1lbnQ6OmNyZWF0ZShbDQogICAgICAgICAgICAgICAgICAgICAgICAnY3JlYXRvcl9pZCcgPT4gJGNyZWF0b3JJZCwNCiAgICAgICAgICAgICAgICAgICAgICAgICdhc3NpZ25tZW50X2lkJyA9PiAkYXNzaWdubWVudElkLA0KICAgICAgICAgICAgICAgICAgICAgICAgJ3RpdGxlJyA9PiAkYXR0YWNobWVudFsndGl0bGUnXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICdhdHRhY2gnID0+ICRhdHRhY2htZW50WydhdHRhY2gnXSwNCiAgICAgICAgICAgICAgICAgICAgXSk7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KfQ0K")); ?>
Function Calls
base64_decode | 1 |
Stats
MD5 | 29d47a2ddb15bb3a5aee4d0f2a2fd12d |
Eval Count | 1 |
Decode Time | 61 ms |