{"id":1380,"date":"2025-08-10T08:52:38","date_gmt":"2025-08-10T08:52:38","guid":{"rendered":"https:\/\/safebrowsing.cmc.iq\/?page_id=1380"},"modified":"2025-08-25T08:03:32","modified_gmt":"2025-08-25T08:03:32","slug":"two-factor-fortress","status":"publish","type":"page","link":"https:\/\/safebrowsing.cmc.iq\/index.php\/two-factor-fortress\/","title":{"rendered":"Two-Factor Fortress"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1380\" class=\"elementor elementor-1380\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-23317f1 ekit-sticky--top e-flex e-con-boxed e-con e-child\" data-id=\"23317f1\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;,&quot;ekit_sticky&quot;:&quot;top&quot;,&quot;ekit_sticky_offset&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:0,&quot;sizes&quot;:[]},&quot;ekit_sticky_offset_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;ekit_sticky_offset_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;ekit_sticky_on_desktop&quot;:&quot;desktop&quot;,&quot;ekit_sticky_on_tablet&quot;:&quot;tablet&quot;,&quot;ekit_sticky_on_mobile&quot;:&quot;mobile&quot;,&quot;ekit_sticky_effect_offset&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:0,&quot;sizes&quot;:[]},&quot;ekit_sticky_effect_offset_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;ekit_sticky_effect_offset_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-3520d12 elementor-widget__width-initial elementor-widget elementor-widget-image\" data-id=\"3520d12\" data-element_type=\"widget\" data-settings=\"{&quot;ekit_we_effect_on&quot;:&quot;none&quot;}\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<a href=\"https:\/\/safebrowsing.cmc.iq\/\">\n\t\t\t\t\t\t\t<img decoding=\"async\" src=\"https:\/\/safebrowsing.cmc.iq\/wp-content\/uploads\/2025\/04\/logo-aman0net.png\" title=\"\" alt=\"\" loading=\"lazy\" \/>\t\t\t\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1bc1881 elementor-widget elementor-widget-ekit-nav-menu\" data-id=\"1bc1881\" data-element_type=\"widget\" data-settings=\"{&quot;ekit_we_effect_on&quot;:&quot;none&quot;}\" data-widget_type=\"ekit-nav-menu.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<nav class=\"ekit-wid-con ekit_menu_responsive_tablet\" \n\t\t\tdata-hamburger-icon=\"\" \n\t\t\tdata-hamburger-icon-type=\"icon\" \n\t\t\tdata-responsive-breakpoint=\"1024\">\n\t\t\t            <button class=\"elementskit-menu-hamburger elementskit-menu-toggler\"  type=\"button\" aria-label=\"hamburger-icon\">\n                                    <span class=\"elementskit-menu-hamburger-icon\"><\/span><span class=\"elementskit-menu-hamburger-icon\"><\/span><span class=\"elementskit-menu-hamburger-icon\"><\/span>\n                            <\/button>\n            <div id=\"ekit-megamenu-%d8%a7%d9%84%d9%82%d8%a7%d8%a6%d9%85%d8%a9-%d8%a7%d9%84%d8%b1%d8%a6%d9%8a%d8%b3%d9%8a%d8%a9\" class=\"elementskit-menu-container elementskit-menu-offcanvas-elements elementskit-navbar-nav-default ekit-nav-menu-one-page-yes ekit-nav-dropdown-hover\"><ul id=\"menu-%d8%a7%d9%84%d9%82%d8%a7%d8%a6%d9%85%d8%a9-%d8%a7%d9%84%d8%b1%d8%a6%d9%8a%d8%b3%d9%8a%d8%a9\" class=\"elementskit-navbar-nav elementskit-menu-po-right submenu-click-on-icon\"><li id=\"menu-item-665\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-home menu-item-665 nav-item elementskit-mobile-builder-content\" data-vertical-menu=750px><a href=\"https:\/\/safebrowsing.cmc.iq\/\" class=\"ekit-menu-nav-link\">\u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629<\/a><\/li>\n<li id=\"menu-item-1252\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-1252 nav-item elementskit-mobile-builder-content\" data-vertical-menu=750px><a href=\"https:\/\/safebrowsing.cmc.iq\/index.php\/games\/\" class=\"ekit-menu-nav-link\">\u0623\u0644\u0639\u0627\u0628 \u062a\u0639\u0644\u064a\u0645\u064a\u0629<\/a><\/li>\n<li id=\"menu-item-1615\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-1615 nav-item elementskit-mobile-builder-content\" data-vertical-menu=750px><a href=\"https:\/\/safebrowsing.cmc.iq\/index.php\/faq\/\" class=\"ekit-menu-nav-link\">\u0627\u0633\u0626\u0644\u0629 \u0634\u0627\u0626\u0639\u0629<\/a><\/li>\n<li id=\"menu-item-1595\" class=\"menu-item menu-item-type-post_type menu-item-object-page menu-item-1595 nav-item elementskit-mobile-builder-content\" data-vertical-menu=750px><a href=\"https:\/\/safebrowsing.cmc.iq\/index.php\/story\/\" class=\"ekit-menu-nav-link\">\u0627\u0644\u0642\u0635\u0635 \u0627\u0644\u062a\u0648\u0639\u0648\u064a\u0629<\/a><\/li>\n<\/ul><div class=\"elementskit-nav-identity-panel\"><button class=\"elementskit-menu-close elementskit-menu-toggler\" type=\"button\">X<\/button><\/div><\/div>\t\t\t\n\t\t\t<div class=\"elementskit-menu-overlay elementskit-menu-offcanvas-elements elementskit-menu-toggler ekit-nav-menu--overlay\"><\/div>        <\/nav>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-e327299 e-con-full elementor-hidden-tablet elementor-hidden-mobile e-flex e-con e-child\" data-id=\"e327299\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-8d1a00e elementor-widget__width-auto elementor-hidden-tablet elementor-hidden-mobile elementor-align-center elementor-widget elementor-widget-elementskit-button\" data-id=\"8d1a00e\" data-element_type=\"widget\" data-settings=\"{&quot;ekit_we_effect_on&quot;:&quot;none&quot;}\" data-widget_type=\"elementskit-button.default\">\n\t\t\t\t\t<div class=\"ekit-wid-con\" >\t\t<div class=\"ekit-btn-wraper\">\n\t\t\t\t\t\t\t<a href=\"https:\/\/safebrowsing.cmc.iq\/wp-admin\/post.php?post=1567&#038;action=elementor\" class=\"elementskit-btn  whitespace--normal\" id=\"\">\n\t\t\t\t\t\u0634\u0627\u0647\u062f \u0627\u0644\u0642\u0635\u0635 \t\t\t\t<\/a>\n\t\t\t\t\t<\/div>\n        <\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-83b0d0e e-flex e-con-boxed e-con e-parent\" data-id=\"83b0d0e\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-464c80c elementor-widget elementor-widget-html\" data-id=\"464c80c\" data-element_type=\"widget\" data-settings=\"{&quot;ekit_we_effect_on&quot;:&quot;none&quot;}\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!DOCTYPE html>\r\n<html lang=\"ar\" dir=\"rtl\">\r\n<head>\r\n<meta charset=\"utf-8\">\r\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\r\n<title>\ud83d\udee1\ufe0f Two-Factor Fortress \u2014 \u062a\u0631\u062a\u064a\u0628 + \u062a\u0635\u064a\u0651\u062f \u062d\u064a + \u0645\u0631\u0627\u062c\u0639\u0629<\/title>\r\n<style>\r\n:root{\r\n  --bg:#0a1226; --bg2:#0c1834; --panel:#0f2043; --card:#0f1f3f;\r\n  --text:#eaf4ff; --muted:#b7cdfa; --ok:#10b981; --warn:#f59e0b; --danger:#ef4444;\r\n  --acc:#22d3ee; --acc2:#38bdf8; --stroke:#17345a;\r\n}\r\n*{box-sizing:border-box}\r\nhtml,body{height:100%;margin:0;background:linear-gradient(180deg,var(--bg),var(--bg2));color:var(--text);font-family:system-ui,-apple-system,\"Segoe UI\",Roboto,Arial}\r\n.wrap{min-height:100%;display:grid;grid-template-rows:auto 1fr auto}\r\nheader{position:sticky;top:0;z-index:5;background:rgba(10,24,56,.75);backdrop-filter:blur(8px);border-bottom:1px solid var(--stroke)}\r\n.bar{max-width:1200px;margin:auto;display:flex;gap:10px;align-items:center;justify-content:space-between;padding:10px 14px;flex-wrap:wrap}\r\n.title{display:flex;gap:10px;align-items:center;font-weight:800}\r\n.chip{font-size:12px;border:1px solid var(--stroke);background:rgba(2,6,23,.55);padding:4px 10px;border-radius:999px}\r\n.input, select{padding:10px 12px;border-radius:12px;border:1px solid var(--stroke);background:#0f1e47;color:var(--text)}\r\n.btn{border:0;border-radius:12px;padding:10px 14px;background:#16306d;color:var(--text);cursor:pointer;transition:transform .12s ease,filter .2s}\r\n.btn:hover{filter:brightness(1.08)} .btn:active{transform:scale(.98)}\r\n.btn.primary{background:linear-gradient(90deg,var(--acc),var(--acc2))}\r\nmain{max-width:1200px;margin:18px auto;padding:10px}\r\n.card{background:linear-gradient(180deg,rgba(31,41,55,.28),rgba(17,24,39,.28));border:1px solid var(--stroke);border-radius:18px;box-shadow:0 10px 30px rgba(0,0,0,.25);overflow:hidden}\r\n.head{display:flex;gap:12px;align-items:center;justify-content:space-between;padding:14px 16px;border-bottom:1px solid var(--stroke)}\r\n.stats{display:flex;gap:10px;flex-wrap:wrap}\r\n.stat{display:flex;gap:6px;align-items:center;font-size:13px;background:#0d1a3a;border:1px solid var(--stroke);padding:6px 10px;border-radius:10px}\r\n.body{padding:18px}\r\n.meta{font-size:13px;color:var(--muted);margin-bottom:12px}\r\n.hidden{display:none}\r\nfooter{opacity:.8;text-align:center;padding:10px;border-top:1px solid var(--stroke)}\r\n\r\n\/* question *\/\r\n.qbox{display:grid;gap:12px}\r\n.cardlike{padding:14px;border:1px solid var(--stroke);border-radius:14px;background:#0f1e47}\r\n.actions{display:flex;gap:10px;flex-wrap:wrap}\r\n.choice{padding:10px 12px;border-radius:10px;background:#0d1a3a;border:1px solid var(--stroke);cursor:pointer}\r\n.choice.correct{border-color:var(--ok);background:rgba(16,185,129,.1)}\r\n.choice.wrong{border-color:var(--danger);background:rgba(239,68,68,.1)}\r\n.explain{padding:8px;border-right:4px solid var(--acc);border-radius:10px;background:rgba(2,6,23,.5);margin-top:4px}\r\n.kbd{font-family:ui-monospace,monospace;background:#0b2037;border:1px solid var(--stroke);padding:2px 6px;border-radius:6px}\r\n\r\n\/* ORDER (drag & drop) *\/\r\n.orderWrap{display:grid;gap:10px}\r\n.orderList{list-style:none;margin:0;padding:0;display:grid;gap:8px}\r\n.orderItem{display:flex;gap:10px;align-items:center;padding:10px 12px;border-radius:10px;border:1px solid var(--stroke);background:#0d1a3a;cursor:grab}\r\n.orderItem:active{cursor:grabbing}\r\n.handle{width:18px;height:18px;border-radius:4px;background:linear-gradient(90deg,#38bdf855,#22d3ee55)}\r\n.rankHint{font-size:12px;color:#cde7ff;margin-inline-start:auto}\r\n.orderDrop{outline:2px dashed #38bdf8;outline-offset:2px}\r\n\r\n\/* PHISH live mock *\/\r\n.browser{border:1px solid var(--stroke);border-radius:14px;overflow:hidden;background:#0b1c3e}\r\n.addr{display:flex;align-items:center;gap:8px;padding:8px;border-bottom:1px solid var(--stroke);background:#0e254d}\r\n.padlock{width:10px;height:10px;border-radius:50%}\r\n.padlock.ok{background:#10b981}\r\n.padlock.bad{background:#ef4444}\r\n.addrbar{flex:1;padding:6px 8px;border-radius:8px;background:#0b2037;border:1px solid var(--stroke);font-family:ui-monospace,monospace;color:#eaf4ff}\r\n.page{padding:14px}\r\n.logo{font-weight:800;margin-bottom:8px}\r\n.input{padding:10px 12px;border-radius:10px;border:1px solid var(--stroke);background:#0f1e47;color:#eaf4ff}\r\n.page .row{display:flex;gap:8px;flex-wrap:wrap;align-items:center}\r\n.hlBad{box-shadow:0 0 0 9999px rgba(239,68,68,.08) inset, 0 0 10px rgba(239,68,68,.5)}\r\n.hlGood{box-shadow:0 0 0 9999px rgba(16,185,129,.08) inset, 0 0 10px rgba(16,185,129,.5)}\r\n\r\n\/* end + review + medals *\/\r\n.end{text-align:center;padding:22px}\r\n.big{font-size:22px;font-weight:800;margin-bottom:8px}\r\n.score{font-size:18px;margin:6px 0}\r\ncanvas{max-width:100%;border:1px solid var(--stroke);border-radius:12px;margin-top:12px}\r\n.medal{display:inline-flex;align-items:center;gap:6px;padding:6px 10px;border-radius:999px;border:1px solid var(--stroke);background:#0b1c3e}\r\n.medal.gold{background:linear-gradient(90deg,#fde68a33,#f59e0b33)}\r\n.medal.silver{background:linear-gradient(90deg,#e5e7eb33,#9ca3af33)}\r\n.medal.bronze{background:linear-gradient(90deg,#fcd34d22,#b4530922)}\r\n.table{width:100%;border-collapse:collapse;margin-top:10px}\r\n.table th,.table td{border-bottom:1px solid var(--stroke);padding:8px;text-align:right;vertical-align:top}\r\n.tag{font-size:11px;border:1px solid var(--stroke);background:#0b1c3e;padding:2px 6px;border-radius:6px}\r\n.good{color:#10b981} .bad{color:#ef4444}\r\n<\/style>\r\n<\/head>\r\n<body>\r\n<div class=\"wrap\">\r\n<header>\r\n  <div class=\"bar\">\r\n    <div class=\"title\">\ud83d\udee1\ufe0f Two-Factor Fortress <span class=\"chip\" id=\"modeChip\">\u0648\u0636\u0639: \u0627\u062e\u062a\u0628\u0627\u0631<\/span><\/div>\r\n    <div class=\"row\" style=\"display:flex;gap:10px;align-items:center;flex-wrap:wrap\">\r\n      <input id=\"playerName\" class=\"input\" placeholder=\"\u0627\u0633\u0645 \u0627\u0644\u0644\u0627\u0639\u0628\" \/>\r\n      <select id=\"difficulty\">\r\n        <option value=\"\u0633\u0647\u0644\" selected>\u0633\u0647\u0644 (20s)<\/option>\r\n        <option value=\"\u0645\u062a\u0648\u0633\u0637\">\u0645\u062a\u0648\u0633\u0637 (12s)<\/option>\r\n        <option value=\"\u0635\u0639\u0628\">\u0635\u0639\u0628 (8s)<\/option>\r\n      <\/select>\r\n      <select id=\"qCount\">\r\n        <option>5<\/option><option selected>10<\/option><option>15<\/option>\r\n      <\/select>\r\n      <label class=\"chip\" style=\"display:flex;align-items:center;gap:6px;cursor:pointer\">\r\n        <input id=\"training\" type=\"checkbox\" checked> \u0648\u0636\u0639 \u062a\u062f\u0631\u064a\u0628 (\u064a\u064f\u0638\u0647\u0631 \u0627\u0644\u0645\u0624\u0634\u0631\u0627\u062a\/\u0627\u0644\u0623\u0633\u0628\u0627\u0628)\r\n      <\/label>\r\n      <button class=\"btn primary\" id=\"btnStart\">\u0627\u0628\u062f\u0623<\/button>\r\n    <\/div>\r\n  <\/div>\r\n<\/header>\r\n\r\n<main>\r\n  <section class=\"card\" id=\"gameCard\">\r\n    <div class=\"head\">\r\n      <div class=\"stats\">\r\n        <div class=\"stat\">\u0627\u0644\u0633\u0624\u0627\u0644: <b id=\"qIdx\">0<\/b>\/<span id=\"qTotal\">0<\/span><\/div>\r\n        <div class=\"stat\">\u0627\u0644\u0646\u0642\u0627\u0637: <b id=\"score\">0<\/b><\/div>\r\n        <div class=\"stat\">\u0633\u0644\u0633\u0644\u0629 \u0635\u062d\u064a\u062d\u0629 \ud83d\udd25: <b id=\"streak\">0<\/b><\/div>\r\n        <div class=\"stat\">\u0642\u0644\u0648\u0628 \u2764: <b id=\"lives\">3<\/b><\/div>\r\n        <div class=\"stat\">\u0627\u0644\u0648\u0642\u062a \u23f3: <b id=\"timer\">20<\/b><span> s<\/span><\/div>\r\n      <\/div>\r\n      <div><span class=\"chip\" id=\"diffChip\">\u0627\u0644\u0635\u0639\u0648\u0628\u0629: \u2014<\/span><\/div>\r\n    <\/div>\r\n\r\n    <div class=\"body\">\r\n      <div class=\"meta\">\u0623\u0646\u0648\u0627\u0639 \u0627\u0644\u0623\u0633\u0626\u0644\u0629: \u0627\u062e\u062a\u064a\u0627\u0631 \u0645\u0628\u0627\u0634\u0631\u060c \u062a\u0631\u062a\u064a\u0628 \u0628\u0627\u0644\u0633\u062d\u0628\u060c \u0648\u062a\u0635\u0651\u064a\u0640\u062f \u062d\u064a\u0651 \u0628\u0635\u0641\u062d\u0629 \u062f\u062e\u0648\u0644 \u0645\u0632\u064a\u0641\u0629.<\/div>\r\n      <div class=\"qbox\">\r\n        <div class=\"cardlike\" id=\"qView\"><\/div>\r\n        <div class=\"actions\" id=\"actions\"><\/div>\r\n        <div class=\"explain hidden\" id=\"explain\"><\/div>\r\n      <\/div>\r\n    <\/div>\r\n  <\/section>\r\n\r\n  <section id=\"endCard\" class=\"card hidden\">\r\n    <div class=\"end\">\r\n      <div class=\"big\">\u0627\u0646\u062a\u0647\u0649 \u0627\u0644\u0627\u062e\u062a\u0628\u0627\u0631 \u2705<\/div>\r\n      <div class=\"score\">\u0627\u0644\u0644\u0627\u0639\u0628: <b id=\"playerOut\">\u0644\u0627\u0639\u0628<\/b><\/div>\r\n      <div class=\"score\">\u0627\u0644\u0646\u062a\u064a\u062c\u0629: <b id=\"finalScore\">0<\/b><\/div>\r\n      <div class=\"score\">\u0627\u0644\u062f\u0642\u0629: <b id=\"accuracyOut\">0%<\/b> \u2014 \u0623\u0641\u0636\u0644 \u0633\u0644\u0633\u0644\u0629: <b id=\"bestStreakOut\">0<\/b><\/div>\r\n      <div class=\"score\">\u0627\u0644\u0634\u0627\u0631\u0629: <span id=\"medalOut\" class=\"medal\"><span>\u2014<\/span><\/span><\/div>\r\n      <div class=\"row\" style=\"display:flex;gap:10px;justify-content:center;flex-wrap:wrap;margin-top:8px\">\r\n        <button class=\"btn primary\" id=\"btnDownload\">\u062a\u062d\u0645\u064a\u0644 \u0634\u0647\u0627\u062f\u0629 PNG<\/button>\r\n        <button class=\"btn\" id=\"btnAgain\">\u0627\u0644\u0644\u0639\u0628 \u0645\u062c\u062f\u062f\u064b\u0627<\/button>\r\n      <\/div>\r\n      <canvas id=\"cert\" width=\"1000\" height=\"600\"><\/canvas>\r\n    <\/div>\r\n\r\n    <!-- Review -->\r\n    <div class=\"body\">\r\n      <div class=\"big\">\u0644\u0648\u062d\u0629 \u0627\u0644\u0645\u0631\u0627\u062c\u0639\u0629 \ud83d\udcdd<\/div>\r\n      <div class=\"meta\">\u0645\u0644\u062e\u0651\u0635 \u0644\u0643\u0644 \u0633\u0624\u0627\u0644: \u0627\u0644\u0646\u0648\u0639\u060c \u0625\u062c\u0627\u0628\u062a\u0643\u060c \u0627\u0644\u0635\u062d\u064a\u062d\u060c \u0648\u0627\u0644\u0633\u0628\u0628.<\/div>\r\n      <div style=\"overflow:auto\">\r\n        <table class=\"table\">\r\n          <thead>\r\n            <tr><th>#<\/th><th>\u0627\u0644\u0646\u0648\u0639<\/th><th>\u0627\u0644\u0645\u0639\u0637\u064a\u0627\u062a<\/th><th>\u0625\u062c\u0627\u0628\u062a\u0643<\/th><th>\u0627\u0644\u0635\u062d\u064a\u062d<\/th><th>\u0627\u0644\u0633\u0628\u0628<\/th><\/tr>\r\n          <\/thead>\r\n          <tbody id=\"reviewBody\"><\/tbody>\r\n        <\/table>\r\n      <\/div>\r\n    <\/div>\r\n  <\/section>\r\n<\/main>\r\n\r\n<footer>\u062a\u0630\u0643\u064a\u0631: \u0644\u0627 \u062a\u0634\u0627\u0631\u0643 \u0643\u0644\u0645\u0629 \u0627\u0644\u0645\u0631\u0648\u0631 \u0623\u0648 \u0631\u0645\u0632 OTP \u0623\u0628\u062f\u064b\u0627\u060c \u0648\u0627\u0631\u0641\u0636 \u0625\u0634\u0639\u0627\u0631\u0627\u062a \u0627\u0644\u062f\u0641\u0639 \u0627\u0644\u0645\u0631\u064a\u0628\u0629.<\/footer>\r\n<\/div>\r\n\r\n<script>\r\n\/* ===== Helpers & state ===== *\/\r\nfunction $(id){ return document.getElementById(id); }\r\nfunction el(tag, cls, html){ const n=document.createElement(tag); if(cls) n.className=cls; if(html!=null) n.innerHTML=html; return n; }\r\nfunction shuffle(a){ for(let i=a.length-1;i>0;i--){ const j=Math.floor(Math.random()*(i+1)); [a[i],a[j]]=[a[j],a[i]]; } return a; }\r\nconst TIME_MAP = { '\u0633\u0647\u0644':20, '\u0645\u062a\u0648\u0633\u0637':12, '\u0635\u0639\u0628':8 };\r\n\r\nlet pool=[], i=0, Q=10, score=0, streak=0, bestStreak=0, lives=3, timer=20, baseTimer=20, tick=null, player='\u0644\u0627\u0639\u0628', level='\u0633\u0647\u0644', training=true;\r\nlet logs=[]; \/\/ {idx,type, prompt\/data, user, correct, why, timeLeft, extra}\r\n\r\nconst qIdx=$('qIdx'), qTotal=$('qTotal'), scoreEl=$('score'), streakEl=$('streak'), livesEl=$('lives'), timerEl=$('timer'), diffChip=$('diffChip');\r\nconst qView=$('qView'), actions=$('actions'), explain=$('explain');\r\nconst endCard=$('endCard'), gameCard=$('gameCard'), finalScore=$('finalScore'), playerOut=$('playerOut'), cert=$('cert');\r\nconst accuracyOut=$('accuracyOut'), bestStreakOut=$('bestStreakOut'), medalOut=$('medalOut'), reviewBody=$('reviewBody');\r\n\r\n\/* ===== Question factories ===== *\/\r\n\/\/ choose-best-method\r\nconst METHODS = [\r\n  {label:'\ud83d\udd11 \u0645\u0641\u0627\u062a\u064a\u062d \u0627\u0644\u0623\u0645\u0627\u0646 \/ Passkeys (\u0642\u064a\u0627\u0633 \u062d\u064a\u0648\u064a)', rank:1, why:'\u0645\u0642\u0627\u0648\u0645\u0629 \u0644\u0644\u062a\u0635\u064a\u0651\u062f \u0648\u0645\u0642\u064a\u0651\u062f\u0629 \u0628\u0627\u0644\u0645\u0648\u0642\u0639\/\u0627\u0644\u062c\u0647\u0627\u0632.'},\r\n  {label:'\u23f1\ufe0f TOTP \u0645\u0646 \u062a\u0637\u0628\u064a\u0642 \u0645\u064f\u0635\u0627\u062f\u0642', rank:2, why:'\u063a\u064a\u0631 \u0645\u0631\u062a\u0628\u0637 \u0628\u0627\u0644\u0634\u0628\u0643\u0629\u060c \u0623\u0642\u0648\u0649 \u0645\u0646 SMS.'},\r\n  {label:'\u2709\ufe0f \u0631\u0645\u0632 \u0639\u0628\u0631 SMS', rank:3, why:'\u0642\u0627\u0628\u0644 \u0644\u0644\u0627\u062e\u062a\u0637\u0627\u0641 \u0639\u0628\u0631 SIM swap.'},\r\n  {label:'\ud83d\udce7 \u0631\u0645\u0632 \u0639\u0628\u0631 \u0627\u0644\u0628\u0631\u064a\u062f', rank:4, why:'\u0627\u0644\u0623\u0636\u0639\u0641 \u063a\u0627\u0644\u0628\u064b\u0627 (\u0627\u0644\u0628\u0631\u064a\u062f \u0642\u062f \u064a\u064f\u062e\u062a\u0631\u0642).'}\r\n];\r\nfunction qChoose(){ \/\/ \u0627\u062e\u062a\u064a\u0627\u0631 \u0645\u0628\u0627\u0634\u0631 \u0644\u0644\u0623\u0641\u0636\u0644\r\n  const opts=shuffle(METHODS.slice());\r\n  return { type:'choose',\r\n    text:'\u0627\u062e\u062a\u0631 <b>\u0623\u0641\u0636\u0644 \u0637\u0631\u064a\u0642\u0629<\/b> \u0644\u0644\u0645\u0635\u0627\u062f\u0642\u0629 \u0627\u0644\u062b\u0646\u0627\u0626\u064a\u0629 \u0644\u0647\u0630\u0627 \u0627\u0644\u062d\u0633\u0627\u0628 \u0627\u0644\u062d\u0633\u0627\u0633:',\r\n    options:opts.map(o=>o.label),\r\n    ok:opts.findIndex(o=>o.rank===1),\r\n    why:'Passkeys \u0627\u0644\u0623\u0641\u0636\u0644 \u0644\u0645\u0642\u0627\u0648\u0645\u0629 \u0627\u0644\u062a\u0635\u064a\u0651\u062f \u0648\u0631\u0628\u0637 \u0627\u0644\u062c\u0644\u0633\u0629 \u0628\u0627\u0644\u0623\u0635\u0644.'\r\n  };\r\n}\r\n\r\n\/\/ \u062a\u0631\u062a\u064a\u0628 \u0628\u0627\u0644\u0633\u062d\u0628\r\nfunction qOrder(){\r\n  const items=shuffle(METHODS.slice());\r\n  return { type:'order',\r\n    text:'\u0631\u062a\u0651\u0628 \u0627\u0644\u0637\u0631\u0642 \u0645\u0646 <b>\u0627\u0644\u0623\u0642\u0648\u0649 \u2192 \u0627\u0644\u0623\u0636\u0639\u0641<\/b> \u0628\u0627\u0644\u0633\u062d\u0628 \u0648\u0627\u0644\u0625\u0641\u0644\u0627\u062a:',\r\n    items, \/\/ \u0643\u0644 \u0639\u0646\u0635\u0631 \u064a\u062d\u0648\u064a label, rank, why\r\n    why:'\u0627\u0644\u062a\u0631\u062a\u064a\u0628 \u0627\u0644\u0635\u062d\u064a\u062d: 1) Passkeys  2) TOTP  3) SMS  4) Email.'\r\n  };\r\n}\r\n\r\n\/\/ \u0623\u0633\u0626\u0644\u0629 \u0633\u0644\u0648\u0643\u064a\u0629 2FA\r\nfunction qPush(){ return {type:'choose',\r\n  text:'\u062a\u062a\u0639\u0631\u0636 \u0644\u0625\u0631\u0647\u0627\u0642 \u0625\u0634\u0639\u0627\u0631\u0627\u062a \u062f\u0641\u0639 \u0644\u0645 \u062a\u062d\u0627\u0648\u0644 \u062a\u0633\u062c\u064a\u0644 \u0627\u0644\u062f\u062e\u0648\u0644. \u0645\u0627\u0630\u0627 \u062a\u0641\u0639\u0644\u061f',\r\n  options:['\u2705 \u0623\u0648\u0627\u0641\u0642 \u0644\u0625\u064a\u0642\u0627\u0641 \u0627\u0644\u0625\u0634\u0639\u0627\u0631\u0627\u062a','\ud83d\udeab \u0623\u0631\u0641\u0636 \u0648\u0623\u0628\u0644\u0651\u063a \u0648\u0623\u063a\u064a\u0651\u0631 \u0643\u0644\u0645\u0629 \u0627\u0644\u0645\u0631\u0648\u0631','\ud83e\udd37 \u0623\u062a\u062c\u0627\u0647\u0644 \u062d\u062a\u0649 \u062a\u062a\u0648\u0642\u0641'],\r\n  ok:1,\r\n  why:'\u0627\u0631\u0641\u0636 \u0648\u0628\u0644\u0651\u063a \u0641\u0648\u0631\u064b\u0627. \u0644\u0627 \u062a\u0648\u0627\u0641\u0642 \u0639\u0644\u0649 \u062f\u062e\u0648\u0644 \u0644\u0645 \u062a\u0642\u0645\u0647 (push fatigue).'\r\n};}\r\nfunction qBackup(){ return {type:'choose',\r\n  text:'\u062d\u0635\u0644\u062a \u0639\u0644\u0649 <b>\u0631\u0645\u0648\u0632 \u0627\u062d\u062a\u064a\u0627\u0637\u064a\u0629<\/b>. \u0623\u064a\u0646 \u062a\u062d\u0641\u0638\u0647\u0627\u061f',\r\n  options:['\u062f\u0627\u062e\u0644 \u0628\u0631\u064a\u062f\u0643 \u0627\u0644\u0625\u0644\u0643\u062a\u0631\u0648\u0646\u064a','\u062a\u0637\u0628\u064e\u0639 \u0648\u062a\u064f\u062e\u0632\u0646 \u0628\u0623\u0645\u0627\u0646\/\u0645\u062f\u064a\u0631 \u0623\u0633\u0631\u0627\u0631','\u062a\u0631\u0633\u0644 \u0644\u0635\u062f\u064a\u0642 \u0645\u0648\u062b\u0648\u0642'],\r\n  ok:1, why:'\u062e\u0632\u0646\u0647\u0627 \u0628\u0645\u0643\u0627\u0646 \u0622\u0645\u0646 \u063a\u064a\u0631 \u0627\u0644\u0628\u0631\u064a\u062f\u060c \u0648\u0644\u0627 \u062a\u0634\u0627\u0631\u0643\u0647\u0627.'};}\r\nfunction qOtp(){ return {type:'choose',\r\n  text:'\u062f\u0639\u0645 \u0641\u0646\u064a \u064a\u0637\u0644\u0628 \u0645\u0646\u0643 <span class=\"kbd\">OTP<\/span>. \u0643\u064a\u0641 \u062a\u062a\u0635\u0631\u0641\u061f',\r\n  options:['\u0623\u0634\u0627\u0631\u0643 \u0627\u0644\u0631\u0645\u0632 \u0625\u0646 \u0643\u0627\u0646 \u0627\u0644\u0645\u0648\u0638\u0641 \u062d\u0642\u064a\u0642\u064a\u064b\u0627','\u0644\u0627 \u0623\u0634\u0627\u0631\u0643 \u0627\u0644\u0640OTP \u0623\u0628\u062f\u064b\u0627 \u0648\u0623\u0633\u062a\u062e\u062f\u0645 \u0627\u0644\u0642\u0646\u0648\u0627\u062a \u0627\u0644\u0631\u0633\u0645\u064a\u0629','\u0623\u0634\u0627\u0631\u0643 \u0645\u0631\u0629 \u0648\u0627\u062d\u062f\u0629 \u0641\u0642\u0637'],\r\n  ok:1, why:'OTP \u0633\u0631\u064a \u0648\u0644\u0627 \u064a\u0637\u0644\u0628\u0647 \u0627\u0644\u062f\u0639\u0645 \u0627\u0644\u0634\u0631\u0639\u064a.'};}\r\nfunction qWhere(){ return {type:'choose',\r\n  text:'\u0635\u0641\u062d\u0629 \u062a\u0637\u0644\u0628 <b>TOTP<\/b>. \u0645\u0627 \u0627\u0644\u062a\u062d\u0642\u0642 \u0627\u0644\u0623\u0647\u0645 \u0642\u0628\u0644 \u0625\u062f\u062e\u0627\u0644 \u0627\u0644\u0631\u0645\u0632\u061f',\r\n  options:['\u0627\u0644\u0634\u0643\u0644 \u064a\u0634\u0628\u0647 \u0627\u0644\u0645\u0648\u0642\u0639 \u0627\u0644\u0623\u0635\u0644\u064a','\u0627\u0644\u0646\u0637\u0627\u0642 \u0623\u0635\u0644\u064a \u0648HTTPS \u0645\u0639 \u0642\u0641\u0644 \u0635\u062d\u064a\u062d','\u0625\u062f\u062e\u0627\u0644 \u0627\u0644\u0631\u0645\u0632 \u0628\u0633\u0631\u0639\u0629 \u0642\u0628\u0644 \u0627\u0646\u062a\u0647\u0627\u0621\u0647'],\r\n  ok:1, why:'\u062a\u0623\u0643\u062f \u0645\u0646 \u0627\u0644\u0646\u0637\u0627\u0642 \u0648HTTPS\u061b \u0627\u0644\u0634\u0643\u0644 \u0648\u062d\u062f\u0647 \u062e\u0627\u062f\u0639.'};}\r\n\r\n\/\/ \u062a\u0635\u064a\u0651\u062f \u062d\u064a\u0651\r\nconst PHISH_POOL = [\r\n  {safe:false, scheme:'http', domain:'example-login.net', path:'\/signin', site:'Example Cloud',\r\n   why:'http \u063a\u064a\u0631 \u0645\u0634\u0641\u0631 + \u0646\u0637\u0627\u0642 \u0639\u0627\u0645 \u063a\u064a\u0631 \u0631\u0633\u0645\u064a.' , hl:['scheme','domain']},\r\n  {safe:false, scheme:'https', domain:'accounts.example.com.evil.co', path:'\/login', site:'Example Accounts',\r\n   why:'\u0641\u062e \u0646\u0637\u0627\u0642 \u0641\u0631\u0639\u064a: \u0627\u0644\u0646\u0637\u0627\u0642 \u0627\u0644\u062d\u0642\u064a\u0642\u064a \u0647\u0648 evil.co.', hl:['domain']},\r\n  {safe:false, scheme:'https', domain:'xn--pple-43d.com', path:'\/login', site:'Apple ID',\r\n   why:'punycode \u064a\u062d\u0627\u0643\u064a apple.com.', hl:['domain']},\r\n  {safe:true,  scheme:'https', domain:'accounts.example.com', path:'\/login', site:'Example Accounts',\r\n   why:'\u0646\u0637\u0627\u0642 \u0623\u0635\u0644\u064a \u0648HTTPS \u0635\u062d\u064a\u062d.', hl:[]}\r\n];\r\nfunction qPhish(){\r\n  const v = PHISH_POOL[Math.floor(Math.random()*PHISH_POOL.length)];\r\n  return { type:'phish', data:v,\r\n    text:'\u0627\u0641\u062d\u0635 \u0635\u0641\u062d\u0629 \u0627\u0644\u062f\u062e\u0648\u0644 \u0627\u0644\u062a\u0627\u0644\u064a\u0629 \u0648\u062d\u062f\u062f \u0625\u0646 \u0643\u0627\u0646\u062a <b>\u0622\u0645\u0646\u0629<\/b> \u0623\u0645 <b>\u062a\u0635\u064a\u0651\u062f<\/b>.'\r\n  };\r\n}\r\n\r\n\/* ===== Build pool (mix types) ===== *\/\r\nfunction buildPool(n){\r\n  const makers=[qChoose,qOrder,qPush,qBackup,qOtp,qWhere,qPhish];\r\n  const arr=[];\r\n  while(arr.length<n){ arr.push( makers[arr.length%makers.length]() ); }\r\n  return shuffle(arr);\r\n}\r\n\r\n\/* ===== Flow ===== *\/\r\n$('btnStart').onclick=start;\r\n$('btnAgain').onclick=start;\r\n$('btnDownload').onclick=()=>{ const url=cert.toDataURL('image\/png'); const a=document.createElement('a'); a.href=url; a.download='two_factor_fortress_certificate.png'; a.click(); };\r\n\r\nfunction start(){\r\n  player = $('playerName').value.trim() || '\u0644\u0627\u0639\u0628';\r\n  level = $('difficulty').value;\r\n  Q = parseInt($('qCount').value,10);\r\n  training = $('training').checked;\r\n  baseTimer = TIME_MAP[level] || 12;\r\n  i=0; score=0; streak=0; bestStreak=0; lives=3; logs=[];\r\n  pool = buildPool(Q);\r\n  qTotal.textContent = Q; diffChip.textContent = '\u0627\u0644\u0635\u0639\u0648\u0628\u0629: ' + level;\r\n  gameCard.classList.remove('hidden'); endCard.classList.add('hidden');\r\n  render();\r\n}\r\n\r\n\/* ===== Render by type ===== *\/\r\nfunction render(){\r\n  clearInterval(tick);\r\n  if(lives<=0 || i>=Q){ return end(); }\r\n  const q=pool[i];\r\n  timer = baseTimer; timerEl.textContent=timer;\r\n  qView.innerHTML=''; actions.innerHTML=''; explain.classList.add('hidden'); explain.textContent='';\r\n\r\n  if(q.type==='choose'){ renderChoose(q); }\r\n  else if(q.type==='order'){ renderOrder(q); }\r\n  else if(q.type==='phish'){ renderPhish(q); }\r\n\r\n  qIdx.textContent=i+1; scoreEl.textContent=score; streakEl.textContent=streak; livesEl.textContent=lives;\r\n  tick=setInterval(()=>{ timer--; timerEl.textContent=timer; if(timer<=0){ clearInterval(tick); timeUp(q); } },1000);\r\n}\r\n\r\n\/* ===== TYPE: choose ===== *\/\r\nfunction renderChoose(q){\r\n  qView.innerHTML = q.text;\r\n  q.options.forEach((label,idx)=>{\r\n    const b=el('button','choice',label);\r\n    b.onclick=()=>choose(idx,q);\r\n    actions.appendChild(b);\r\n  });\r\n}\r\nfunction choose(idx,q){\r\n  clearInterval(tick);\r\n  const btns=[...actions.children];\r\n  btns.forEach((n,ii)=>{ if(ii===q.ok) n.classList.add('correct'); else if(ii===idx) n.classList.add('wrong'); n.disabled=true; });\r\n  const correct=(idx===q.ok);\r\n  handleResult(q, correct, {user: idx});\r\n}\r\n\r\n\/* ===== TYPE: order (drag & drop) ===== *\/\r\nfunction renderOrder(q){\r\n  const wrap=el('div','orderWrap','');\r\n  const p=el('div',null,q.text); qView.appendChild(p);\r\n  const ul=el('ul','orderList',''); qView.appendChild(ul);\r\n  q.items.forEach((it,idx)=> ul.appendChild(makeOrderItem(it, idx)));\r\n  const row=el('div','actions','');\r\n  const checkBtn=el('button','btn','\u062a\u062d\u0642\u0642 \u0627\u0644\u062a\u0631\u062a\u064a\u0628'); checkBtn.disabled=false;\r\n  row.appendChild(checkBtn); qView.appendChild(row);\r\n\r\n  \/\/ DnD handlers\r\n  let dragSrc=null;\r\n  ul.addEventListener('dragstart',e=>{\r\n    const li=e.target.closest('.orderItem'); if(!li) return;\r\n    dragSrc=li; e.dataTransfer.effectAllowed='move';\r\n    li.classList.add('orderDrop');\r\n  });\r\n  ul.addEventListener('dragover',e=>{ e.preventDefault(); });\r\n  ul.addEventListener('drop',e=>{\r\n    e.preventDefault();\r\n    const li=e.target.closest('.orderItem'); if(!li || !dragSrc || li===dragSrc) { dragSrc?.classList.remove('orderDrop'); return; }\r\n    const nodes=[...ul.children];\r\n    const srcIdx=nodes.indexOf(dragSrc), dstIdx=nodes.indexOf(li);\r\n    if(srcIdx<dstIdx) ul.insertBefore(dragSrc, li.nextSibling);\r\n    else ul.insertBefore(dragSrc, li);\r\n    dragSrc.classList.remove('orderDrop');\r\n    dragSrc=null;\r\n  });\r\n  ul.addEventListener('dragend',()=> dragSrc&&dragSrc.classList.remove('orderDrop'));\r\n\r\n  checkBtn.onclick=()=>{\r\n    clearInterval(tick);\r\n    const order=[...ul.children].map(li=>parseInt(li.dataset.rank,10));\r\n    const correctOrder=[1,2,3,4];\r\n    const correct = JSON.stringify(order)===JSON.stringify(correctOrder);\r\n    \/\/ \u062a\u0644\u0648\u064a\u0646\r\n    [...ul.children].forEach((li,idx)=>{\r\n      const expected=correctOrder[idx], got=parseInt(li.dataset.rank,10);\r\n      li.style.borderColor = (expected===got)?'#10b981':'#ef4444';\r\n      li.style.background = (expected===got)?'rgba(16,185,129,.1)':'rgba(239,68,68,.08)';\r\n    });\r\n    \/\/ \u0634\u0631\u062d\r\n    const expectedLabels = METHODS.sort((a,b)=>a.rank-b.rank).map(x=>x.label).join(' \u2192 ');\r\n    explain.textContent = (correct?'\u2714 \u0635\u062d\u064a\u062d. ':'\u2716 \u063a\u064a\u0631 \u0635\u062d\u064a\u062d. ') + '\u0627\u0644\u062a\u0631\u062a\u064a\u0628 \u0627\u0644\u0645\u062a\u0648\u0642\u0639: ' + expectedLabels;\r\n    if(training) explain.classList.remove('hidden');\r\n\r\n    handleResult(q, correct, {userOrder:order, expectedOrder:correctOrder});\r\n  };\r\n}\r\nfunction makeOrderItem(it, idx){\r\n  const li=el('li','orderItem','');\r\n  li.draggable=true; li.dataset.rank=it.rank;\r\n  const h=el('div','handle',''); const txt=el('div',null, it.label); const r=el('div','rankHint','\u0627\u0633\u062d\u0628');\r\n  li.append(h,txt,r); return li;\r\n}\r\n\r\n\/* ===== TYPE: phish (live) ===== *\/\r\nfunction renderPhish(q){\r\n  const d=q.data;\r\n  const browser=el('div','browser','');\r\n  const addr=el('div','addr','');\r\n  const lock=el('div','padlock '+(d.scheme==='https'?'ok':'bad'),'');\r\n  const addrbar=el('div','addrbar', `${d.scheme}:\/\/${d.domain}${d.path}`);\r\n  addr.append(lock, addrbar);\r\n  const page=el('div','page','');\r\n  const logo=el('div','logo', d.site);\r\n  const row1=el('div','row',''); row1.appendChild(el('input','input',{value:'',type:'text'})); row1.firstChild.placeholder='Email\/Username';\r\n  const row2=el('div','row',''); row2.appendChild(el('input','input',{value:'',type:'password'})); row2.firstChild.placeholder='Password';\r\n  const row3=el('div','row',''); const fakeBtn=el('button','btn','Sign in'); fakeBtn.disabled=true; row3.appendChild(fakeBtn);\r\n  page.append(logo,row1,row2,row3);\r\n  browser.append(addr,page);\r\n  qView.appendChild(browser);\r\n\r\n  const bSafe=el('button','choice','\u2705 \u0622\u0645\u0646');\r\n  const bPhish=el('button','choice','\ud83d\udea9 \u062a\u0635\u064a\u0651\u062f'); actions.append(bSafe,bPhish);\r\n\r\n  const showInd=el('button','btn','\u0623\u0638\u0647\u0631 \u0627\u0644\u0645\u0624\u0634\u0631\u0627\u062a'); actions.appendChild(showInd);\r\n\r\n  function highlight(){\r\n    \/\/ reset\r\n    addrbar.classList.remove('hlBad','hlGood');\r\n    lock.classList.remove('hlBad','hlGood');\r\n    if(d.safe){ addrbar.classList.add('hlGood'); if(d.scheme==='https') lock.classList.add('hlGood'); }\r\n    else{\r\n      (d.hl||[]).forEach(k=>{\r\n        if(k==='scheme') lock.classList.add('hlBad');\r\n        if(k==='domain') addrbar.classList.add('hlBad');\r\n      });\r\n    }\r\n  }\r\n  if(training) setTimeout(highlight, 200);\r\n  showInd.onclick=highlight;\r\n\r\n  bSafe.onclick=()=>judgePhish(true);\r\n  bPhish.onclick=()=>judgePhish(false);\r\n\r\n  function judgePhish(markSafe){\r\n    clearInterval(tick);\r\n    const correct=(markSafe===d.safe);\r\n    \/\/ \u0632\u0631\u0651\u064a\u0646\r\n    if(d.safe){ bSafe.classList.add('correct'); bPhish.classList.add('wrong'); }\r\n    else{ bPhish.classList.add('correct'); bSafe.classList.add('wrong'); }\r\n    bSafe.disabled=bPhish.disabled=true;\r\n    explain.textContent = (correct?'\u2714 \u0635\u062d\u064a\u062d. ':'\u2716 \u063a\u064a\u0631 \u0635\u062d\u064a\u062d. ') + d.why;\r\n    if(training) explain.classList.remove('hidden');\r\n    handleResult(q, correct, {user: markSafe?'\u0622\u0645\u0646':'\u062a\u0635\u064a\u0651\u062f', domain:`${d.scheme}:\/\/${d.domain}${d.path}`});\r\n  }\r\n}\r\n\r\n\/* ===== time up (generic) ===== *\/\r\nfunction timeUp(q){\r\n  \/\/ \u0641\u064a \u0627\u062e\u062a\u064a\u0627\u0631\/\u062a\u0635\u064a\u0651\u062f: \u0646\u064f\u0628\u0631\u0632 \u0627\u0644\u0635\u062d\u064a\u062d\r\n  if(q.type==='choose'){\r\n    const btns=[...actions.children];\r\n    if(btns[q.ok]) btns[q.ok].classList.add('correct');\r\n    btns.forEach(b=>b.disabled=true);\r\n  }\r\n  if(q.type==='phish'){\r\n    const btns=[...actions.children].filter(x=>x.classList.contains('choice'));\r\n    const pick = q.data.safe ? 0 : 1;\r\n    if(btns[pick]) btns[pick].classList.add('correct');\r\n    btns.forEach(b=>b.disabled=true);\r\n  }\r\n  \/\/ \u0641\u064a \u0627\u0644\u062a\u0631\u062a\u064a\u0628: \u0641\u0642\u0637 \u0646\u0639\u0631\u0636 \u0627\u0644\u0645\u062a\u0648\u0642\u0639\r\n  if(q.type==='order'){\r\n    const expectedLabels = METHODS.sort((a,b)=>a.rank-b.rank).map(x=>x.label).join(' \u2192 ');\r\n    explain.textContent = '\u23f3 \u0627\u0646\u062a\u0647\u0649 \u0627\u0644\u0648\u0642\u062a! \u0627\u0644\u062a\u0631\u062a\u064a\u0628 \u0627\u0644\u0645\u062a\u0648\u0642\u0639: ' + expectedLabels;\r\n    if(training) explain.classList.remove('hidden');\r\n  }\r\n  handleResult(q, false, {user:'\u2014'}, true);\r\n}\r\n\r\n\/* ===== generic result handling ===== *\/\r\nfunction handleResult(q, correct, extra={}, fromTimeUp=false){\r\n  if(correct){\r\n    streak++; bestStreak=Math.max(bestStreak,streak);\r\n    score += (q.type==='order'? 130 : 110) + Math.max(0, timer*2) + (streak>1?(streak-1)*8:0);\r\n  }else{\r\n    streak=0; lives--; livesEl.textContent=lives;\r\n  }\r\n  scoreEl.textContent=score; streakEl.textContent=streak;\r\n  logs.push({\r\n    idx:i+1,\r\n    type:q.type,\r\n    prompt: q.text,\r\n    data: q.data || q.items || null,\r\n    user: extra.user ?? (q.type==='choose'? extra.user : (q.type==='order'? extra.userOrder : '')),\r\n    correct,\r\n    why: q.why || (q.data && (q.data.why||'')) || '',\r\n    timeLeft: fromTimeUp?0:timer,\r\n    extra\r\n  });\r\n  setTimeout(()=>{ if(lives<=0 || i>=Q-1) end(); else { i++; render(); } }, 1100);\r\n}\r\n\r\n\/* ===== End + Review + Certificate ===== *\/\r\nfunction end(){\r\n  clearInterval(tick);\r\n  gameCard.classList.add('hidden'); endCard.classList.remove('hidden');\r\n  const correctCount = logs.filter(l=>l.correct).length;\r\n  const acc = Math.round((correctCount \/ (logs.length||1))*100);\r\n  accuracyOut.textContent = acc + '%';\r\n  bestStreakOut.textContent = bestStreak;\r\n  playerOut.textContent = player||'\u0644\u0627\u0639\u0628';\r\n  finalScore.textContent = score;\r\n  const medal = pickMedal(acc, bestStreak);\r\n  renderMedal(medal);\r\n  drawCert(player||'\u0644\u0627\u0639\u0628', score, level, acc, bestStreak, medal);\r\n  renderReview();\r\n}\r\nfunction pickMedal(acc, streak){\r\n  if(acc>=90 && streak>=5) return 'gold';\r\n  if(acc>=75 && streak>=3) return 'silver';\r\n  return 'bronze';\r\n}\r\nfunction renderMedal(m){\r\n  const el = medalOut;\r\n  el.className = 'medal ' + m;\r\n  el.innerHTML = m==='gold' ? '\ud83c\udfc5 \u0630\u0647\u0628\u064a\u0629'\r\n               : m==='silver' ? '\ud83e\udd48 \u0641\u0636\u064a\u0629'\r\n               : '\ud83e\udd49 \u0628\u0631\u0648\u0646\u0632\u064a\u0629';\r\n}\r\n\r\nfunction renderReview(){\r\n  reviewBody.innerHTML='';\r\n  logs.forEach(row=>{\r\n    const tr=document.createElement('tr');\r\n    let kind = row.type==='choose'?'\u0627\u062e\u062a\u064a\u0627\u0631': row.type==='order'?'\u062a\u0631\u062a\u064a\u0628':'\u062a\u0635\u064a\u0651\u062f \u062d\u064a\u0651';\r\n    let dataCell='\u2014', userCell='\u2014', correctCell=row.correct?'\u2705':'\u274c';\r\n    if(row.type==='choose'){\r\n      const opts=(pool[row.idx-1].options||[]);\r\n      const your = (row.user>=0 && opts[row.user]) ? opts[row.user] : '\u2014';\r\n      const okI = (pool[row.idx-1].ok||0), ok = opts[okI]||'\u2014';\r\n      dataCell = '\u062e\u064a\u0627\u0631\u0627\u062a \u0645\u062a\u0639\u062f\u062f\u0629';\r\n      userCell = your; correctCell += ' \/ ' + ok;\r\n    }else if(row.type==='order'){\r\n      const labels=(row.data||[]).map(x=>x.label);\r\n      const expected = METHODS.slice().sort((a,b)=>a.rank-b.rank).map(x=>x.label);\r\n      const show = arr=>arr.map(x=>x.replace(\/ .*\/,'')).join(' \u2192 ');\r\n      dataCell = labels.join(' | ');\r\n      userCell = (row.extra.userOrder||[]).map(n=>['\u2014','Passkey','TOTP','SMS','Email'][n]||'\u2014').join(' \u2192 ');\r\n      correctCell = expected.join(' \u2192 ');\r\n    }else if(row.type==='phish'){\r\n      const d=row.data; dataCell = `${d.scheme}:\/\/${d.domain}${d.path}`;\r\n      userCell = row.extra.user || '\u2014';\r\n      correctCell = d.safe?'\u0622\u0645\u0646':'\u062a\u0635\u064a\u0651\u062f';\r\n    }\r\n    tr.innerHTML = `<td>${row.idx}<\/td><td><span class=\"tag\">${kind}<\/span><\/td><td>${escapeHTML(dataCell)}<\/td><td>${escapeHTML(userCell)}<\/td><td>${escapeHTML(correctCell)}<\/td><td>${escapeHTML(row.why||'\u2014')}<\/td>`;\r\n    reviewBody.appendChild(tr);\r\n  });\r\n}\r\n\r\n\/* ===== Certificate ===== *\/\r\nfunction drawCert(name, score, level, acc, bestStreak, medal){\r\n  const c=cert, ctx=c.getContext('2d'), w=c.width, h=c.height;\r\n  ctx.clearRect(0,0,w,h);\r\n  const g=ctx.createLinearGradient(0,0,w,h); g.addColorStop(0,'#0b1229'); g.addColorStop(1,'#0e1a36');\r\n  ctx.fillStyle=g; ctx.fillRect(0,0,w,h);\r\n  \/\/ grid\r\n  ctx.strokeStyle='rgba(56,189,248,.25)'; ctx.lineWidth=1;\r\n  for(let x=60;x<w;x+=40){ ctx.beginPath(); ctx.moveTo(x,40); ctx.lineTo(x,h-40); ctx.stroke(); }\r\n  for(let y=60;y<h;y+=40){ ctx.beginPath(); ctx.moveTo(40,y); ctx.lineTo(w-40,y); ctx.stroke(); }\r\n  \/\/ frame by medal\r\n  ctx.strokeStyle= medal==='gold' ? '#f59e0b' : medal==='silver' ? '#94a3b8' : '#b45309';\r\n  ctx.lineWidth=10; ctx.strokeRect(20,20,w-40,h-40);\r\n\r\n  ctx.fillStyle='#eaf4ff'; ctx.textAlign='center';\r\n  ctx.font='bold 40px Segoe UI, Arial'; ctx.fillText('\u0634\u0647\u0627\u062f\u0629 \u0625\u0646\u062c\u0627\u0632 \u2013 Two-Factor Fortress', w\/2, 110);\r\n  ctx.font='22px Segoe UI, Arial'; ctx.fillStyle='#b7cdfa'; ctx.fillText('\u0645\u064f\u0646\u062d\u062a \u0625\u0644\u0649', w\/2, 155);\r\n  ctx.font='bold 54px Segoe UI, Arial'; ctx.fillStyle='#eaf4ff'; ctx.fillText(name, w\/2, 205);\r\n\r\n  ctx.font='24px Segoe UI, Arial'; ctx.fillStyle='#b7cdfa'; ctx.fillText('\u0627\u0644\u0645\u062d\u0635\u0644\u0629', w\/2, 255);\r\n  ctx.font='bold 64px Segoe UI, Arial'; ctx.fillStyle='#eaf4ff'; ctx.fillText(`${score} \u0646\u0642\u0637\u0629`, w\/2, 310);\r\n\r\n  const chips=[`\u0627\u0644\u0635\u0639\u0648\u0628\u0629: ${level}`, `\u0627\u0644\u062f\u0642\u0629: ${acc}%`, `\u0623\u0641\u0636\u0644 \u0633\u0644\u0633\u0644\u0629: ${bestStreak}`, `\u0627\u0644\u062a\u0627\u0631\u064a\u062e: ${new Date().toLocaleDateString('ar-IQ')}`];\r\n  ctx.textAlign='left'; ctx.font='20px Segoe UI, Arial'; ctx.fillStyle='#cde7ff';\r\n  const cx=120, cy=350;\r\n  chips.forEach((t,i)=> chip(ctx, cx, cy+i*46, t));\r\n\r\n  ctx.textAlign='center'; ctx.font='bold 26px Segoe UI, Arial';\r\n  ctx.fillStyle= medal==='gold' ? '#fbbf24' : medal==='silver' ? '#cbd5e1' : '#f59e0b';\r\n  ctx.fillText(medal==='gold'?'\ud83c\udfc5 \u0634\u0627\u0631\u0629 \u0630\u0647\u0628\u064a\u0629': medal==='silver'?'\ud83e\udd48 \u0634\u0627\u0631\u0629 \u0641\u0636\u064a\u0629':'\ud83e\udd49 \u0634\u0627\u0631\u0629 \u0628\u0631\u0648\u0646\u0632\u064a\u0629', w\/2, h-80);\r\n\r\n  function chip(ctx,x,y,text){\r\n    const padX=16; ctx.font='20px Segoe UI, Arial';\r\n    const mw=ctx.measureText(text).width; const W=mw+padX*2, H=36, r=16;\r\n    ctx.fillStyle='rgba(11,32,55,.9)'; ctx.strokeStyle='#17345a'; ctx.lineWidth=2;\r\n    roundRect(ctx,x,y,W,H,r,true,true);\r\n    ctx.fillStyle='#cde7ff'; ctx.fillText(text, x+padX, y+24);\r\n  }\r\n  function roundRect(ctx,x,y,w,h,r,fill,stroke){\r\n    ctx.beginPath();\r\n    ctx.moveTo(x+r,y); ctx.arcTo(x+w,y,x+w,y+h,r);\r\n    ctx.arcTo(x+w,y+h,x,y+h,r); ctx.arcTo(x,y+h,x,y,r);\r\n    ctx.arcTo(x,y,x+w,y,r); ctx.closePath();\r\n    if(fill) ctx.fill(); if(stroke) ctx.stroke();\r\n  }\r\n}\r\n\r\n\/* ===== utils ===== *\/\r\nfunction escapeHTML(s){ return String(s).replace(\/[&<>]\/g, ch=>({ '&':'&amp;','<':'&lt;','>':'&gt;'}[ch])); }\r\n<\/script>\r\n<\/body>\r\n<\/html>\r\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>\u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629 \u0623\u0644\u0639\u0627\u0628 \u062a\u0639\u0644\u064a\u0645\u064a\u0629 \u0627\u0633\u0626\u0644\u0629 \u0634\u0627\u0626\u0639\u0629 \u0627\u0644\u0642\u0635\u0635 \u0627\u0644\u062a\u0648\u0639\u0648\u064a\u0629 X \u0634\u0627\u0647\u062f \u0627\u0644\u0642\u0635\u0635 \ud83d\udee1\ufe0f Two-Factor Fortress \u2014 \u062a\u0631\u062a\u064a\u0628 + \u062a\u0635\u064a\u0651\u062f \u062d\u064a + \u0645\u0631\u0627\u062c\u0639\u0629 \ud83d\udee1\ufe0f Two-Factor Fortress \u0648\u0636\u0639: \u0627\u062e\u062a\u0628\u0627\u0631 \u0633\u0647\u0644 (20s)\u0645\u062a\u0648\u0633\u0637 (12s)\u0635\u0639\u0628 (8s) 51015 \u0648\u0636\u0639 \u062a\u062f\u0631\u064a\u0628 (\u064a\u064f\u0638\u0647\u0631 \u0627\u0644\u0645\u0624\u0634\u0631\u0627\u062a\/\u0627\u0644\u0623\u0633\u0628\u0627\u0628) \u0627\u0628\u062f\u0623 \u0627\u0644\u0633\u0624\u0627\u0644: 0\/0 \u0627\u0644\u0646\u0642\u0627\u0637: 0 \u0633\u0644\u0633\u0644\u0629 \u0635\u062d\u064a\u062d\u0629 \ud83d\udd25: 0 \u0642\u0644\u0648\u0628 \u2764: 3 \u0627\u0644\u0648\u0642\u062a \u23f3: 20 s \u0627\u0644\u0635\u0639\u0648\u0628\u0629: \u2014 \u0623\u0646\u0648\u0627\u0639 \u0627\u0644\u0623\u0633\u0626\u0644\u0629: \u0627\u062e\u062a\u064a\u0627\u0631 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_canvas","meta":{"footnotes":""},"class_list":["post-1380","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/safebrowsing.cmc.iq\/index.php\/wp-json\/wp\/v2\/pages\/1380","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/safebrowsing.cmc.iq\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/safebrowsing.cmc.iq\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/safebrowsing.cmc.iq\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/safebrowsing.cmc.iq\/index.php\/wp-json\/wp\/v2\/comments?post=1380"}],"version-history":[{"count":10,"href":"https:\/\/safebrowsing.cmc.iq\/index.php\/wp-json\/wp\/v2\/pages\/1380\/revisions"}],"predecessor-version":[{"id":1707,"href":"https:\/\/safebrowsing.cmc.iq\/index.php\/wp-json\/wp\/v2\/pages\/1380\/revisions\/1707"}],"wp:attachment":[{"href":"https:\/\/safebrowsing.cmc.iq\/index.php\/wp-json\/wp\/v2\/media?parent=1380"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}