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

Variables

None

Stats

MD5 29d47a2ddb15bb3a5aee4d0f2a2fd12d
Eval Count 1
Decode Time 61 ms