{"id":944,"date":"2026-05-19T23:06:09","date_gmt":"2026-05-19T23:06:09","guid":{"rendered":"https:\/\/allenglish4u.com\/?page_id=944"},"modified":"2026-07-05T02:44:42","modified_gmt":"2026-07-05T02:44:42","slug":"toefl-primary","status":"publish","type":"page","link":"https:\/\/allenglish4u.com\/vi\/toefl-primary\/","title":{"rendered":"TOEFL Primary"},"content":{"rendered":"\n<style>\n@import url('https:\/\/fonts.googleapis.com\/css2?family=Baloo+2:wght@500%3B600%3B700%3B800&family=Plus+Jakarta+Sans:ital,wght@0,400%3B0,500%3B0,600%3B0,700%3B0,800%3B1,500%3B1,600%3B1,700&display=swap');\n\/* escape WP wrapper *\/\n.entry-content,.wp-block-post-content,.is-layout-constrained{max-width:none !important;width:auto !important;margin-left:0 !important;margin-right:0 !important;padding-left:0 !important;padding-right:0 !important;}\n.wp-block-post-title{display:none !important;}\nbody.page-id-131 .wp-block-template-part,body.page-id-944 .wp-block-template-part{display:none !important;}\n\n\/* ============================================================\n   All English 4U &#8212; Cambridge hub\n   Design tokens\n   ============================================================ *\/\n:root {\n  \/* paper + ink *\/\n  --paper:      #FAF6EE;\n  --paper-2:    #F3ECDF;\n  --card:       #FFFFFF;\n  --ink:        #14213D;\n  --ink-2:      #3A4868;\n  --ink-soft:   #6B7796;\n  --line:       #E7DECE;\n  --line-2:     #DED3BF;\n\n  \/* brand *\/\n  --navy:       #14213D;\n  --navy-deep:  #0C1730;\n  --blue:       #0161FF;   \/* logo brand blue *\/\n  --blue-deep:  #0A4ED0;\n  --blue-soft:  #E2ECFF;\n  --red:        #0161FF;   \/* accent now blue *\/\n  --red-deep:   #0A4ED0;\n\n  \/* CEFR level spectrum *\/\n  --starters:   #18A777;   \/* Pre-A1 mint  *\/\n  --movers:     #0CA7B8;   \/* A1 teal      *\/\n  --flyers:     #7A5BE3;   \/* A2 violet    *\/\n  --ket:        #E68A1E;   \/* A2 Key amber *\/\n  --pet:        #0161FF;   \/* B1 brand blue*\/\n\n  --starters-soft: #E3F4ED;\n  --movers-soft:   #D9F3F6;\n  --flyers-soft:   #ECE6FB;\n  --ket-soft:      #FBEFDC;\n  --pet-soft:      #E2ECFF;\n\n  \/* status *\/\n  --live:       #18A777;\n  --progress:   #E68A1E;\n  --soon:       #98A0B4;\n\n  \/* type *\/\n  --display: \"Baloo 2\", \"Plus Jakarta Sans\", system-ui, sans-serif;\n  --body:    \"Plus Jakarta Sans\", system-ui, -apple-system, sans-serif;\n\n  \/* shape *\/\n  --r-sm: 10px;\n  --r:    16px;\n  --r-lg: 24px;\n  --r-xl: 32px;\n\n  --shadow-sm: 0 1px 2px rgba(20,33,61,.06), 0 2px 6px rgba(20,33,61,.05);\n  --shadow:    0 4px 14px rgba(20,33,61,.08), 0 12px 32px rgba(20,33,61,.07);\n  --shadow-lg: 0 12px 28px rgba(20,33,61,.12), 0 28px 64px rgba(20,33,61,.12);\n\n  --maxw: 1200px;\n}\n\n* { box-sizing: border-box; }\nhtml { scroll-behavior: smooth; }\nbody {\n  margin: 0;\n  font-family: var(--body) !important;\n  background: var(--paper);\n  color: var(--ink);\n  font-size: 17px;\n  line-height: 1.55;\n  -webkit-font-smoothing: antialiased;\n  text-rendering: optimizeLegibility;\n  overflow-x: hidden;\n}\nimg { max-width: 100%; display: block; }\na { color: inherit; text-decoration: none; }\nbutton { font-family: inherit !important; cursor: pointer; }\nh1, h2, h3, h4 { font-family: var(--display) !important; font-weight: 700; line-height: 1.04; margin: 0; letter-spacing: -0.02em; }\n\n.wrap { width: 100%; max-width: var(--maxw); margin: 0 auto; padding: 0 28px; }\n\n\/* paper texture *\/\nbody::before {\n  content: \"\";\n  position: fixed; inset: 0; z-index: -2;\n  background:\n    radial-gradient(1100px 600px at 82% -8%, rgba(1,97,255,.08), transparent 60%),\n    radial-gradient(900px 520px at -6% 4%, rgba(1,97,255,.05), transparent 58%);\n  pointer-events: none;\n}\nbody::after {\n  content: \"\";\n  position: fixed; inset: 0; z-index: -1; opacity: .5;\n  background-image: radial-gradient(rgba(20,33,61,.045) 1px, transparent 1px);\n  background-size: 22px 22px;\n  pointer-events: none;\n}\n\n\/* ============================================================\n   Header\n   ============================================================ *\/\n.site-header {\n  position: sticky; top: 0; z-index: 60;\n  background: color-mix(in srgb, var(--paper) 82%, transparent);\n  backdrop-filter: saturate(140%) blur(14px);\n  border-bottom: 1px solid transparent;\n  transition: border-color .25s, box-shadow .25s, background .25s;\n}\n.site-header.scrolled {\n  border-bottom-color: var(--line);\n  box-shadow: 0 6px 20px rgba(20,33,61,.05);\n}\n.header-inner {\n  display: flex; align-items: center; gap: 28px;\n  height: 70px;\n}\n.brand { display: flex; align-items: center; gap: 11px; white-space: nowrap; font-family: var(--display) !important; font-weight: 800; font-size: 19px; letter-spacing: -.02em; }\n.brand .mark {\n  width: 42px; height: 42px; border-radius: 50%; flex: 0 0 auto;\n  object-fit: cover; box-shadow: var(--shadow-sm);\n  background: var(--blue);\n}\n.brand .mark-fallback {\n  color: #fff; display: grid; place-items: center;\n  font-size: 15px; font-weight: 800; letter-spacing: -.04em;\n  box-shadow: var(--shadow-sm);\n  position: relative; overflow: hidden;\n}\n.brand .mark::after {\n  content: \"\"; position: absolute; inset: 0;\n  background: linear-gradient(135deg, transparent 55%, rgba(255,255,255,.22));\n}\n.brand b { color: var(--red); }\n.main-nav { display: flex; gap: 4px; margin-left: auto; }\n.main-nav a {\n  padding: 8px 13px; border-radius: 999px; font-weight: 600; font-size: 15px;\n  color: var(--ink-2); transition: background .18s, color .18s;\n}\n.main-nav a:hover { background: var(--paper-2); color: var(--ink); }\n.main-nav a.active { color: var(--navy); background: #fff; box-shadow: var(--shadow-sm); }\n.btn-cta {\n  display: inline-flex; align-items: center; gap: 8px;\n  background: var(--red); color: #fff; font-weight: 700; font-size: 15px;\n  padding: 10px 18px; border-radius: 999px; border: 0;\n  box-shadow: 0 6px 16px rgba(1,97,255,.32);\n  transition: transform .16s, box-shadow .16s, background .16s;\n}\n.btn-cta:hover { transform: translateY(-2px); box-shadow: 0 10px 24px rgba(1,97,255,.42); background: var(--red-deep); }\n.btn-cta svg { width: 16px; height: 16px; }\n.nav-toggle { display: none; }\n\n\/* ============================================================\n   Hero\n   ============================================================ *\/\n.hero { position: relative; padding: 74px 0 40px; }\n.hero-grid {\n  display: grid; grid-template-columns: 1.05fr .95fr; gap: 56px; align-items: center;\n}\n.eyebrow {\n  display: inline-flex; align-items: center; gap: 9px; white-space: nowrap;\n  font-size: 13.5px; font-weight: 700; letter-spacing: .02em;\n  color: var(--ink-2); background: #fff; border: 1px solid var(--line);\n  padding: 7px 14px 7px 11px; border-radius: 999px; box-shadow: var(--shadow-sm);\n}\n.eyebrow .dot { width: 8px; height: 8px; border-radius: 50%; background: var(--red); box-shadow: 0 0 0 4px rgba(1,97,255,.16); }\n.hero h1 {\n  font-size: clamp(40px, 6vw, 74px); margin: 22px 0 0; letter-spacing: -.03em;\n}\n.hero h1 em { font-style: normal; color: var(--red); position: relative; white-space: nowrap; }\n.hero h1 em::after {\n  content: \"\"; position: absolute; left: 2%; right: 2%; bottom: .06em; height: .14em;\n  background: var(--ket); border-radius: 999px; opacity: .55; z-index: -1;\n  transform: scaleX(0); transform-origin: left; animation: underline 1s .5s cubic-bezier(.2,.8,.2,1) forwards;\n}\n@keyframes underline { to { transform: scaleX(1); } }\n.hero .lead { font-size: 19px; color: var(--ink-2); margin: 22px 0 0; max-width: 33ch; }\n.hero .lead b { color: var(--ink); font-weight: 700; }\n.hero-actions { display: flex; flex-wrap: wrap; gap: 14px; margin-top: 30px; }\n.btn-lg {\n  display: inline-flex; align-items: center; gap: 10px; font-weight: 700; font-size: 16.5px;\n  padding: 14px 24px; border-radius: 14px; border: 0; transition: transform .16s, box-shadow .16s, background .16s;\n}\n.btn-primary { background: var(--blue); color: #fff; box-shadow: 0 8px 22px rgba(1,97,255,.34); }\n.btn-primary:hover { transform: translateY(-3px); box-shadow: 0 14px 30px rgba(1,97,255,.42); background: var(--blue-deep); }\n.btn-ghost { background: #fff; color: var(--navy); border: 1px solid var(--line-2); box-shadow: var(--shadow-sm); }\n.btn-ghost:hover { transform: translateY(-3px); box-shadow: var(--shadow); }\n.btn-lg svg { width: 19px; height: 19px; }\n\n\/* stat chips *\/\n.stats { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 34px; }\n.stat {\n  background: #fff; border: 1px solid var(--line); border-radius: var(--r);\n  padding: 13px 18px; box-shadow: var(--shadow-sm); min-width: 116px;\n}\n.stat .n { font-family: var(--display) !important; font-weight: 800; font-size: 26px; letter-spacing: -.03em; line-height: 1; }\n.stat .l { font-size: 13px; color: var(--ink-soft); font-weight: 600; margin-top: 5px; }\n.stat:nth-child(1) .n { color: var(--movers); }\n.stat:nth-child(2) .n { color: var(--flyers); }\n.stat:nth-child(3) .n { color: var(--ket); }\n.stat:nth-child(4) .n { color: var(--live); }\n\n\/* hero visual: book stack card *\/\n.hero-visual { position: relative; }\n.bookcard {\n  background: linear-gradient(165deg, var(--navy), var(--navy-deep));\n  border-radius: var(--r-xl); padding: 30px; color: #fff; position: relative; overflow: hidden;\n  box-shadow: var(--shadow-lg);\n}\n.bookcard::before {\n  content: \"\"; position: absolute; inset: 0; opacity: .5;\n  background:\n    radial-gradient(420px 220px at 110% -10%, rgba(46,124,214,.55), transparent 60%),\n    radial-gradient(360px 220px at -10% 120%, rgba(1,97,255,.4), transparent 60%);\n}\n.bookcard-head { position: relative; display: flex; align-items: center; justify-content: space-between; }\n.bookcard-head .badge-live {\n  display: inline-flex; align-items: center; gap: 7px; font-size: 12.5px; font-weight: 700; white-space: nowrap;\n  background: rgba(24,167,119,.18); color: #7CF0C0; border: 1px solid rgba(24,167,119,.45);\n  padding: 5px 11px; border-radius: 999px;\n}\n.bookcard-head .pulse { width: 8px; height: 8px; border-radius: 50%; background: #36E29C; box-shadow: 0 0 0 0 rgba(54,226,156,.7); animation: pulse 1.8s infinite; }\n@keyframes pulse { 0%{box-shadow:0 0 0 0 rgba(54,226,156,.6)} 70%{box-shadow:0 0 0 9px rgba(54,226,156,0)} 100%{box-shadow:0 0 0 0 rgba(54,226,156,0)} }\n.bookcard h3 { position: relative; font-size: 25px; margin: 18px 0 6px; letter-spacing: -.02em; }\n.bookcard .sub { position: relative; color: rgba(255,255,255,.7); font-size: 14.5px; }\n.testgrid { position: relative; display: grid; grid-template-columns: 1fr 1fr; gap: 9px; margin-top: 20px; }\n.testgrid a {\n  display: flex; align-items: center; justify-content: space-between; gap: 8px; white-space: nowrap;\n  background: rgba(255,255,255,.07); border: 1px solid rgba(255,255,255,.12);\n  border-radius: 12px; padding: 11px 13px; font-size: 13.5px; font-weight: 600;\n  transition: background .16s, transform .16s, border-color .16s;\n}\n.testgrid a:hover { background: rgba(255,255,255,.16); border-color: rgba(255,255,255,.3); transform: translateY(-2px); }\n.testgrid a span.kind { font-size: 11px; color: rgba(255,255,255,.55); font-weight: 700; letter-spacing: .04em; }\n.testgrid a .arr { opacity: .6; }\n.bookcard-foot {\n  position: relative; margin-top: 18px; display: flex; align-items: center; gap: 8px;\n  font-size: 13px; color: rgba(255,255,255,.62);\n}\n.float-pill {\n  position: absolute; z-index: 3; white-space: nowrap;\n  font-family: var(--display) !important; font-weight: 800; font-size: 13px;\n  padding: 8px 14px; border-radius: 999px; color: #fff; box-shadow: var(--shadow);\n  border: 2px solid rgba(255,255,255,.8);\n}\n.float-pill.p1 { top: -16px; left: -18px; background: var(--starters); transform: rotate(-7deg); }\n.float-pill.p2 { bottom: 26px; right: -22px; background: var(--ket); transform: rotate(6deg); }\n\n\/* ============================================================\n   Section primitives\n   ============================================================ *\/\n.section { padding: 64px 0; position: relative; scroll-margin-top: 130px; }\n.section-head { max-width: 760px; margin-bottom: 36px; }\n.kicker {\n  display: inline-flex; align-items: center; gap: 9px; font-weight: 700; font-size: 13.5px;\n  letter-spacing: .04em; text-transform: uppercase; color: var(--ink-soft);\n}\n.kicker .tick { width: 26px; height: 3px; border-radius: 3px; background: currentColor; }\n.section h2 { font-size: clamp(30px, 4.2vw, 46px); margin: 14px 0 0; }\n.section h2 em { font-style: normal; }\n.section .desc { color: var(--ink-2); font-size: 17.5px; margin: 16px 0 0; max-width: 70ch; }\n\n\/* legend *\/\n.legend { display: flex; flex-wrap: wrap; gap: 18px; margin-top: 22px; font-size: 13.5px; color: var(--ink-2); font-weight: 600; }\n.legend span { display: inline-flex; align-items: center; gap: 8px; }\n.legend i { width: 10px; height: 10px; border-radius: 50%; display: inline-block; }\n.legend .l-live { background: var(--live); }\n.legend .l-prog { background: var(--progress); }\n.legend .l-soon { background: var(--soon); }\n\n\/* ============================================================\n   Staircase (learning path)\n   ============================================================ *\/\n.path { background: var(--paper-2); border-top: 1px solid var(--line); border-bottom: 1px solid var(--line); }\n.stairs {\n  display: grid; grid-template-columns: repeat(5, 1fr); gap: 16px; align-items: end;\n  margin-top: 40px;\n}\n.step {\n  position: relative; background: var(--card); border: 1px solid var(--line);\n  border-radius: var(--r-lg); padding: 20px 18px 22px; box-shadow: var(--shadow-sm);\n  cursor: pointer; transition: transform .2s cubic-bezier(.2,.8,.2,1), box-shadow .2s, border-color .2s;\n  border-top: 4px solid var(--lc, var(--movers));\n}\n.step:nth-child(1) { margin-bottom: 0; }\n.step:nth-child(2) { margin-bottom: 26px; }\n.step:nth-child(3) { margin-bottom: 52px; }\n.step:nth-child(4) { margin-bottom: 78px; }\n.step:nth-child(5) { margin-bottom: 104px; }\n.step:hover { transform: translateY(-6px); box-shadow: var(--shadow); border-color: var(--lc); }\n.step .lvl {\n  display: inline-flex; align-items: center; white-space: nowrap; font-family: var(--display) !important; font-weight: 800;\n  font-size: 13px; letter-spacing: -.01em; color: #fff; background: var(--lc);\n  padding: 4px 11px; border-radius: 999px;\n}\n.step h4 { font-size: 19px; margin: 14px 0 2px; }\n.step .who { font-size: 13.5px; color: var(--ink-soft); }\n.step .st {\n  display: inline-flex; align-items: center; gap: 7px; margin-top: 14px; white-space: nowrap;\n  font-size: 12.5px; font-weight: 700;\n}\n.step .st .d { width: 8px; height: 8px; border-radius: 50%; }\n.st.live   { color: var(--live);   } .st.live .d   { background: var(--live); box-shadow: 0 0 0 0 rgba(24,167,119,.6); animation: pulse 1.8s infinite; }\n.st.prog   { color: var(--progress);} .st.prog .d  { background: var(--progress); }\n.st.soon   { color: var(--soon);   } .st.soon .d   { background: var(--soon); }\n.step .num {\n  position: absolute; top: 16px; right: 18px; font-family: var(--display) !important; font-weight: 800;\n  font-size: 30px; color: var(--paper-2); -webkit-text-stroke: 1.4px var(--line-2);\n}\n.stairs-base { height: 0; }\n.path-note { margin-top: 30px; font-size: 14px; color: var(--ink-soft); display: flex; align-items: center; gap: 9px; }\n\n\/* ============================================================\n   Filter tabs\n   ============================================================ *\/\n.filterbar {\n  position: sticky; top: 70px; z-index: 50; padding: 14px 0;\n  background: color-mix(in srgb, var(--paper) 86%, transparent);\n  backdrop-filter: saturate(140%) blur(12px);\n  border-bottom: 1px solid var(--line);\n}\n.filters { display: flex; gap: 8px; flex-wrap: wrap; align-items: center; }\n.filters .fb {\n  border: 1px solid var(--line-2); background: #fff; color: var(--ink-2); white-space: nowrap;\n  font-weight: 700; font-size: 14.5px; padding: 9px 17px; border-radius: 999px;\n  transition: all .16s; box-shadow: var(--shadow-sm); display: inline-flex; align-items: center; gap: 8px;\n}\n.filters .fb .c { width: 9px; height: 9px; border-radius: 50%; }\n.filters .fb:hover { transform: translateY(-2px); }\n.filters .fb.active { color: #fff; border-color: transparent; }\n.filters .fb[data-f=\"all\"].active   { background: var(--navy); }\n.filters .fb[data-f=\"yle\"].active    { background: var(--flyers); }\n.filters .fb[data-f=\"ket\"].active    { background: var(--ket); }\n.filters .fb[data-f=\"pet\"].active    { background: var(--pet); }\n.filters .count { margin-left: auto; font-size: 13.5px; color: var(--ink-soft); font-weight: 600; }\n\n\/* ============================================================\n   Catalog cards\n   ============================================================ *\/\n.cat-section { padding: 60px 0; scroll-margin-top: 150px; }\n.cat-section.hide { display: none; }\n\n.band {\n  display: inline-flex; align-items: center; gap: 10px; padding: 6px 14px 6px 8px;\n  border-radius: 999px; font-weight: 700; font-size: 13px; letter-spacing: .03em; text-transform: uppercase;\n}\n.band .bb { width: 26px; height: 26px; border-radius: 50%; display: grid; place-items: center; color:#fff; font-family: var(--display) !important; font-size: 12px; }\n\n\/* YLE: three big level cards *\/\n.yle-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 22px; margin-top: 30px; }\n.level-card {\n  background: var(--card); border: 1px solid var(--line); border-radius: var(--r-lg);\n  padding: 26px; box-shadow: var(--shadow-sm); position: relative; overflow: hidden;\n  transition: transform .2s, box-shadow .2s;\n  border-top: 5px solid var(--lc);\n}\n.level-card:hover { transform: translateY(-5px); box-shadow: var(--shadow); }\n.level-card .lc-top { display: flex; align-items: center; justify-content: space-between; }\n.level-card .lvl-badge {\n  font-family: var(--display) !important; font-weight: 800; font-size: 13px; color: #fff; white-space: nowrap;\n  background: var(--lc); padding: 5px 12px; border-radius: 999px;\n}\n.level-card h3 { font-size: 26px; margin: 16px 0 4px; }\n.level-card .meta { font-size: 14px; color: var(--ink-soft); }\n.level-card .count {\n  display: flex; align-items: baseline; gap: 7px; margin: 18px 0 6px;\n  font-family: var(--display) !important;\n}\n.level-card .count b { font-size: 30px; color: var(--lc); letter-spacing: -.03em; }\n.level-card .count span { font-size: 14px; color: var(--ink-2); font-weight: 600; }\n.chips { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 16px; }\n.chip {\n  width: 40px; height: 40px; border-radius: 11px; display: grid; place-items: center;\n  font-family: var(--display) !important; font-weight: 800; font-size: 15px;\n  background: var(--lc-soft); color: var(--lc); border: 1px solid color-mix(in srgb, var(--lc) 22%, transparent);\n  transition: transform .14s, background .14s, color .14s;\n}\n.chip:hover { transform: translateY(-3px) scale(1.04); background: var(--lc); color: #fff; }\n.status-tag {\n  display: inline-flex; align-items: center; gap: 7px; margin-top: 20px; white-space: nowrap;\n  font-size: 12.5px; font-weight: 700; padding: 6px 12px; border-radius: 999px;\n}\n.status-tag .d { width: 8px; height: 8px; border-radius: 50%; }\n.status-tag.live { background: var(--starters-soft); color: var(--live); } .status-tag.live .d { background: var(--live); }\n.status-tag.prog { background: var(--ket-soft); color: var(--progress); }    .status-tag.prog .d { background: var(--progress); }\n.status-tag.soon { background: var(--paper-2); color: var(--ink-soft); }      .status-tag.soon .d { background: var(--soon); }\n\n\/* ============================================================\n   Series cards (KET \/ PET full-width boxes, in order)\n   ============================================================ *\/\n.series-list { display: grid; gap: 18px; margin-top: 28px; }\n.series-card {\n  display: grid; grid-template-columns: 1fr 1.05fr; gap: 38px;\n  background: var(--card); border: 1px solid var(--line); border-top: 5px solid var(--lc);\n  border-radius: var(--r-lg); box-shadow: var(--shadow-sm);\n  padding: 30px 32px;\n  transition: transform .2s, box-shadow .2s;\n}\n.series-card:hover { transform: translateY(-3px); box-shadow: var(--shadow); }\n.series-card.is-live { border-color: color-mix(in srgb, var(--live) 32%, var(--line)); }\n.sc-info { min-width: 0; }\n.sc-info .status-tag { margin-top: 0; }\n.sc-info h3 { font-size: 25px; margin: 13px 0 7px; letter-spacing: -.02em; }\n.sc-info p { color: var(--ink-2); font-size: 14.5px; max-width: 46ch; }\n.sc-stats { display: flex; gap: 26px; margin: 18px 0 20px; flex-wrap: wrap; }\n.sc-stats .ks b { font-family: var(--display) !important; font-weight: 800; font-size: 23px; white-space: nowrap; color: var(--lc); display: block; line-height: 1.1; letter-spacing: -.02em; }\n.sc-stats .ks span { font-size: 12px; color: var(--ink-soft); font-weight: 600; margin-top: 5px; display: block; }\n.sc-start { padding: 12px 20px; font-size: 15px; }\n.sc-right { display: grid; align-content: center; min-width: 0; }\n\n.sc-tests { display: grid; gap: 9px; }\n.test-row {\n  display: grid; grid-template-columns: 26px 1fr 1fr; gap: 10px; align-items: center;\n}\n.test-row .tn {\n  font-family: var(--display) !important; font-weight: 800; font-size: 14px; color: var(--ink-soft); opacity: .5; text-align: center;\n}\n.test-link {\n  display: flex; align-items: center; gap: 9px; white-space: nowrap;\n  background: var(--paper-2); border: 1px solid var(--line-2);\n  border-radius: 11px; padding: 10px 13px; font-size: 13.5px; font-weight: 700; color: var(--ink);\n  transition: background .16s, transform .16s, border-color .16s, color .16s;\n}\n.test-link .tl-ico { width: 18px; height: 18px; flex: 0 0 auto; color: var(--lc); }\n.test-link .tl-label { flex: 1; overflow: hidden; text-overflow: ellipsis; }\n.test-link .arr { width: 16px; height: 16px; flex: 0 0 auto; opacity: .45; }\n.test-link:hover { background: var(--blue); border-color: var(--blue); color: #fff; transform: translateX(3px); }\n.test-link:hover .tl-ico, .test-link:hover .arr { color: #fff; opacity: 1; }\n\/* locked (coming soon) papers *\/\n.test-link.locked {\n  background: transparent; border-style: dashed; border-color: var(--line-2);\n  color: var(--ink-soft); cursor: default;\n}\n.test-link.locked .tl-ico { color: var(--soon); opacity: .7; }\n.test-link.locked .lock { width: 14px; height: 14px; flex: 0 0 auto; opacity: .5; }\n.test-link.locked:hover { background: transparent; border-color: var(--line-2); color: var(--ink-soft); transform: none; }\n.test-link.locked:hover .tl-ico { color: var(--soon); }\n\n\/* resource books: chips instead of test rows *\/\n.sc-items { display: flex; flex-wrap: wrap; gap: 9px; align-content: center; }\n.sc-item {\n  display: inline-flex; align-items: center; white-space: nowrap;\n  background: var(--lc-soft); color: var(--lc);\n  border: 1px solid color-mix(in srgb, var(--lc) 22%, transparent);\n  border-radius: 999px; padding: 9px 15px; font-size: 13px; font-weight: 700;\n}\n\n\/* generic level badge (used in YLE boxes) *\/\n.lvl-badge {\n  font-family: var(--display) !important; font-weight: 800; font-size: 12px; color: #fff; white-space: nowrap;\n  background: var(--lc); padding: 4px 11px; border-radius: 999px; align-self: flex-start;\n}\n\n\/* YLE boxes (Starters \/ Movers \/ Flyers) *\/\n.yle-card .sc-info { display: flex; flex-direction: column; justify-content: center; align-items: flex-start; }\n.yle-title { display: flex; align-items: center; gap: 15px; margin-top: 13px; }\n.yle-mascot {\n  width: 52px; height: 52px; border-radius: 16px; flex: 0 0 auto; display: grid; place-items: center;\n  background: var(--lc-soft); color: var(--lc); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--lc) 16%, transparent);\n}\n.yle-mascot svg { width: 30px; height: 30px; }\n.yle-head { display: flex; flex-direction: column; gap: 5px; align-items: flex-start; }\n.yle-head h3 { font-size: 25px; margin: 0; letter-spacing: -.02em; }\n.yle-card .sc-info p { margin-top: 14px; }\n.yle-papers { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 16px; }\n.yle-papers span {\n  display: inline-flex; align-items: center; gap: 6px; white-space: nowrap;\n  font-size: 12.5px; font-weight: 700; color: var(--ink-2);\n  background: var(--paper-2); border: 1px solid var(--line); border-radius: 999px; padding: 6px 12px;\n}\n.yle-papers svg { width: 15px; height: 15px; flex: 0 0 auto; color: var(--lc); }\n.yle-books-label { font-size: 12.5px; font-weight: 700; color: var(--ink-soft); margin-bottom: 12px; letter-spacing: .01em; }\n.yle-books { display: flex; flex-wrap: wrap; gap: 10px; align-content: center; }\n.yle-card .chip { width: 46px; height: 46px; border-radius: 13px; font-size: 16px; }\n\n\/* generic book grid (coming soon) *\/\n.book-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(248px, 1fr)); gap: 16px; margin-top: 26px; }\n.book {\n  background: var(--card); border: 1px solid var(--line); border-radius: var(--r);\n  padding: 20px; box-shadow: var(--shadow-sm); position: relative;\n  transition: transform .18s, box-shadow .18s, border-color .18s;\n  display: flex; flex-direction: column; min-height: 168px;\n}\n.book:hover { transform: translateY(-4px); box-shadow: var(--shadow); }\n.book.is-live { border-color: color-mix(in srgb, var(--live) 40%, transparent); }\n.book .spine { width: 34px; height: 34px; border-radius: 9px; display: grid; place-items: center; color: #fff; font-family: var(--display) !important; font-weight: 800; font-size: 13px; }\n.book h4 { font-size: 17px; margin: 14px 0 5px; }\n.book .bmeta { font-size: 13.5px; color: var(--ink-soft); line-height: 1.45; flex: 1; }\n.book .tags { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 12px; }\n.book .tags span { font-size: 11.5px; font-weight: 600; white-space: nowrap; color: var(--ink-2); background: var(--paper-2); padding: 4px 9px; border-radius: 999px; }\n.book .bfoot { margin-top: 14px; }\n\n\/* ============================================================\n   Final CTA\n   ============================================================ *\/\n.cta {\n  margin: 30px 0 0; position: relative; overflow: hidden;\n  background: linear-gradient(160deg, var(--red), var(--red-deep));\n  border-radius: var(--r-xl); padding: 56px 48px; color: #fff; text-align: center;\n  box-shadow: var(--shadow-lg);\n}\n.cta::before { content:\"\"; position:absolute; inset:0; opacity:.4; background: radial-gradient(600px 300px at 80% -20%, rgba(255,255,255,.3), transparent 60%); }\n.cta h2 { position: relative; font-size: clamp(28px, 4vw, 44px); }\n.cta p { position: relative; color: rgba(255,255,255,.9); font-size: 18px; margin: 16px auto 0; max-width: 54ch; }\n.cta-actions { position: relative; display: flex; gap: 14px; justify-content: center; flex-wrap: wrap; margin-top: 30px; }\n.cta .btn-white { background: #fff; color: var(--red-deep); font-weight: 800; padding: 14px 26px; border-radius: 13px; box-shadow: var(--shadow); transition: transform .16s; }\n.cta .btn-white:hover { transform: translateY(-3px); }\n.cta .btn-outline { background: rgba(255,255,255,.12); color: #fff; border: 1px solid rgba(255,255,255,.5); font-weight: 700; padding: 14px 26px; border-radius: 13px; transition: background .16s; }\n.cta .btn-outline:hover { background: rgba(255,255,255,.22); }\n\n\/* ============================================================\n   Footer\n   ============================================================ *\/\n.site-footer { margin-top: 72px; background: var(--navy); color: rgba(255,255,255,.7); padding: 56px 0 30px; }\n.footer-grid { display: grid; grid-template-columns: 1.6fr 1fr 1fr 1.3fr; gap: 40px; }\n.footer-brand .brand { color: #fff; }\n.footer-brand p { font-size: 14.5px; margin-top: 16px; max-width: 40ch; color: rgba(255,255,255,.6); }\n.footer-social { display: flex; gap: 10px; margin-top: 18px; }\n.footer-social a { width: 38px; height: 38px; border-radius: 10px; background: rgba(255,255,255,.08); display: grid; place-items: center; transition: background .16s; }\n.footer-social a:hover { background: var(--red); }\n.footer-social svg { width: 18px; height: 18px; fill: #fff; }\n.footer-col h5 { color: #fff; font-family: var(--display) !important; font-size: 14px; letter-spacing: .04em; text-transform: uppercase; margin: 0 0 16px; }\n.footer-col a { display: block; font-size: 14.5px; padding: 6px 0; color: rgba(255,255,255,.66); transition: color .16s; }\n.footer-col a:hover { color: #fff; }\n.news input { width: 100%; background: rgba(255,255,255,.08); border: 1px solid rgba(255,255,255,.16); color: #fff; padding: 12px 14px; border-radius: 11px; font-family: inherit !important; font-size: 14px; }\n.news input::placeholder { color: rgba(255,255,255,.4); }\n.news button { margin-top: 10px; width: 100%; background: var(--red); color: #fff; border: 0; padding: 12px; border-radius: 11px; font-weight: 700; transition: background .16s; }\n.news button:hover { background: var(--red-deep); }\n.footer-bottom { margin-top: 44px; padding-top: 22px; border-top: 1px solid rgba(255,255,255,.12); display: flex; justify-content: space-between; flex-wrap: wrap; gap: 12px; font-size: 13.5px; color: rgba(255,255,255,.5); }\n.footer-bottom a { color: rgba(255,255,255,.66); }\n\n\/* ============================================================\n   Reveal animation\n   ============================================================ *\/\n\/* Resting state is fully visible (capture- and no-JS-safe).\n   The entrance is a play-once animation, only when .in is added. *\/\n.reveal { opacity: 1; transform: none; }\n@media (prefers-reduced-motion: no-preference) {\n  .reveal.in { animation: rise .72s cubic-bezier(.2,.8,.2,1) both; }\n}\n@keyframes rise { from { opacity: 0; transform: translateY(22px); } to { opacity: 1; transform: none; } }\n@media (prefers-reduced-motion: reduce) {\n  * { animation: none !important; scroll-behavior: auto; }\n}\n\n\/* ============================================================\n   Responsive\n   ============================================================ *\/\n@media (max-width: 1000px) {\n  .hero-grid { grid-template-columns: 1fr; gap: 40px; }\n  .hero-visual { max-width: 520px; }\n  .series-card { grid-template-columns: 1fr; gap: 22px; }\n  .footer-grid { grid-template-columns: 1fr 1fr; gap: 32px; }\n}\n@media (max-width: 860px) {\n  .main-nav, .header-inner .btn-cta { display: none; }\n  .nav-toggle { display: grid; margin-left: auto; }\n  .stairs { grid-template-columns: 1fr 1fr; gap: 14px; }\n  .step { margin-bottom: 0 !important; }\n  .yle-grid { grid-template-columns: 1fr; }\n  .stats .stat { flex: 1; min-width: 0; }\n}\n@media (max-width: 560px) {\n  .wrap { padding: 0 18px; }\n  .hero { padding: 44px 0 20px; }\n  .stairs { grid-template-columns: 1fr; }\n  .test-row { grid-template-columns: 1fr; gap: 8px; }\n  .test-row .tn { display: none; }\n  .footer-grid { grid-template-columns: 1fr; }\n  .cta { padding: 40px 24px; }\n}\n\n\/* hamburger *\/\n.nav-toggle {\n  width: 44px; height: 44px; border-radius: 12px; border: 1px solid var(--line-2);\n  background: #fff; place-items: center; gap: 4px; box-shadow: var(--shadow-sm);\n}\n.nav-toggle span { width: 20px; height: 2px; background: var(--ink); border-radius: 2px; display: block; }\n.mobile-nav { display: none; }\n.mobile-nav.open { display: block; padding: 8px 0 18px; border-top: 1px solid var(--line); }\n.mobile-nav a { display: block; padding: 11px 4px; font-weight: 600; color: var(--ink-2); border-bottom: 1px solid var(--line); }\n\n\/* ============================================================\n   TOEFL Primary additions\n   ============================================================ *\/\n:root {\n  --step1:      #06B6C4;  --step1-soft: #D6F5F8;   \/* bright teal   *\/\n  --step2:      #7C5CFC;  --step2-soft: #ECE6FF;   \/* vivid violet  *\/\n  --speak:      #FF9D2E;  --speak-soft: #FFEFD6;   \/* sunny amber   *\/\n  --video:      #FF4D4D;  --video-soft: #FFE2E2;   \/* coral red     *\/\n}\n\n\/* the test rows for TOEFL are Reading + Listening (instead of L + R\/W) *\/\n\n\/* ---- book layout: each test = 5 parts (Word list \/ Grammar \/ Reading \/ Listening \/ Dictation) ---- *\/\n.sc-book { display: grid; gap: 4px; align-content: center; }\n.test-block { padding: 13px 0; border-top: 1px solid var(--line); }\n.test-block:first-child { border-top: 0; padding-top: 0; }\n.tb-n {\n  font-family: var(--display) !important; font-weight: 800; font-size: 12.5px;\n  letter-spacing: .04em; text-transform: uppercase; color: var(--ink-soft);\n}\n.tb-parts { display: flex; flex-wrap: wrap; gap: 8px; margin-top: 10px; }\n.part-link {\n  display: inline-flex; align-items: center; gap: 7px; white-space: nowrap;\n  background: var(--paper-2); border: 1px solid var(--line-2);\n  border-radius: 10px; padding: 8px 12px; font-size: 13px; font-weight: 700; color: var(--ink);\n  text-decoration: none; transition: background .16s, transform .16s, border-color .16s, color .16s;\n}\n.part-link .tl-ico { width: 16px; height: 16px; flex: 0 0 auto; color: var(--lc); }\n.part-link .lock { width: 13px; height: 13px; flex: 0 0 auto; opacity: .5; }\n.part-link:not(.locked):hover { background: var(--lc); border-color: var(--lc); color: #fff; transform: translateY(-2px); }\n.part-link:not(.locked):hover .tl-ico { color: #fff; }\n.part-link.locked { background: transparent; border-style: dashed; color: var(--ink-soft); }\n.part-link.locked .tl-ico { color: var(--soon); opacity: .75; }\n\n\/* ---- Video lessons ---- *\/\n.video-grid {\n  display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\n  gap: 20px; margin-top: 28px;\n}\n.video-card {\n  background: var(--card); border: 1px solid var(--line); border-radius: var(--r-lg);\n  overflow: hidden; box-shadow: var(--shadow-sm); text-decoration: none; color: inherit;\n  display: flex; flex-direction: column;\n  transition: transform .2s, box-shadow .2s;\n}\n.video-card:hover { transform: translateY(-5px); box-shadow: var(--shadow); }\n.video-thumb { position: relative; aspect-ratio: 16 \/ 9; background: var(--paper-2); overflow: hidden; }\n.video-thumb img { width: 100%; height: 100%; object-fit: cover; transition: transform .35s; }\n.video-card:hover .video-thumb img { transform: scale(1.06); }\n.video-thumb::after { content: \"\"; position: absolute; inset: 0; background: linear-gradient(180deg, transparent 55%, rgba(20,33,61,.42)); }\n.video-play {\n  position: absolute; left: 50%; top: 50%; transform: translate(-50%,-50%);\n  width: 58px; height: 58px; border-radius: 50%; z-index: 2;\n  background: rgba(224,71,60,.95); display: grid; place-items: center;\n  box-shadow: 0 8px 22px rgba(224,71,60,.5); transition: transform .2s, background .2s;\n}\n.video-card:hover .video-play { transform: translate(-50%,-50%) scale(1.1); }\n.video-play svg { width: 24px; height: 24px; fill: #fff; margin-left: 3px; }\n.video-num {\n  position: absolute; top: 11px; left: 11px; z-index: 2;\n  font-family: var(--display) !important; font-weight: 800; font-size: 12.5px; color: #fff;\n  background: rgba(20,33,61,.7); padding: 4px 10px; border-radius: 999px; backdrop-filter: blur(4px);\n}\n.video-meta { padding: 16px 18px 18px; display: flex; flex-direction: column; gap: 8px; flex: 1; }\n.video-meta h4 { font-size: 16px; line-height: 1.32; letter-spacing: -.01em; }\n.video-tags { display: flex; flex-wrap: wrap; gap: 7px; margin-top: auto; padding-top: 4px; }\n.video-tags span {\n  font-size: 11.5px; font-weight: 700; white-space: nowrap; color: var(--video);\n  background: var(--video-soft); padding: 4px 10px; border-radius: 999px;\n}\n.video-cta {\n  display: flex; align-items: center; justify-content: space-between; gap: 16px; flex-wrap: wrap;\n  margin-top: 26px; padding: 22px 26px; border-radius: var(--r-lg);\n  background: linear-gradient(150deg, #1f1410, var(--navy-deep));\n  color: #fff; box-shadow: var(--shadow);\n}\n.video-cta .vc-l { display: flex; align-items: center; gap: 14px; }\n.video-cta .vc-ico { width: 46px; height: 46px; border-radius: 12px; background: var(--video); display: grid; place-items: center; flex: 0 0 auto; }\n.video-cta .vc-ico svg { width: 24px; height: 24px; fill: #fff; }\n.video-cta b { font-size: 17px; font-family: var(--display) !important; display: block; }\n.video-cta span { font-size: 13.5px; color: rgba(255,255,255,.66); }\n.video-cta a.vc-btn {\n  display: inline-flex; align-items: center; gap: 9px; white-space: nowrap;\n  background: var(--video); color: #fff; font-weight: 700; font-size: 15px;\n  padding: 12px 20px; border-radius: 12px; box-shadow: 0 6px 18px rgba(224,71,60,.4);\n  transition: transform .16s; text-decoration: none;\n}\n.video-cta a.vc-btn:hover { transform: translateY(-2px); }\n.video-cta a.vc-btn svg { width: 16px; height: 16px; }\n\n\/* ---- \"+N more lessons\" card ---- *\/\n.video-more { border-style: dashed; border-color: var(--line-2); background: var(--paper-2); }\n.video-more .vm-inner {\n  display: block; padding: 26px 24px; min-height: 200px;\n}\n.video-more .vm-ico {\n  width: 46px; height: 46px; border-radius: 12px; background: var(--video);\n  display: grid; place-items: center; margin-bottom: 14px;\n}\n.video-more .vm-ico svg { width: 22px; height: 22px; fill: #fff; margin-left: 2px; }\n.video-more b { display: block; font-family: var(--display) !important; font-size: 21px; line-height: 1.15; letter-spacing: -.01em; margin-bottom: 7px; }\n.video-more .vm-inner > span { display: block; font-size: 13.5px; line-height: 1.4; color: var(--ink-soft); }\n.video-more .vm-btn {\n  display: inline-flex; align-items: center; gap: 7px; margin-top: 14px;\n  color: var(--video); font-weight: 700; font-size: 14px;\n}\n.video-more .vm-btn svg { width: 15px; height: 15px; }\n.video-more:hover { border-color: var(--video); }\n\n\/* ---- hero video preview ---- *\/\n.hero-video {\n  position: relative; display: block; margin-top: 20px; border-radius: var(--r);\n  overflow: hidden; aspect-ratio: 16 \/ 9; box-shadow: 0 10px 26px rgba(0,0,0,.3);\n}\n.hero-video img { width: 100%; height: 100%; object-fit: cover; transition: transform .4s; }\n.hero-video:hover img { transform: scale(1.05); }\n.hero-video::after { content: \"\"; position: absolute; inset: 0; background: linear-gradient(180deg, transparent 50%, rgba(12,23,48,.4)); }\n.hero-play {\n  position: absolute; left: 50%; top: 50%; transform: translate(-50%,-50%); z-index: 2;\n  width: 62px; height: 62px; border-radius: 50%; background: rgba(224,71,60,.95);\n  display: grid; place-items: center; box-shadow: 0 8px 24px rgba(224,71,60,.55);\n  transition: transform .2s;\n}\n.hero-video:hover .hero-play { transform: translate(-50%,-50%) scale(1.1); }\n.hero-play svg { width: 26px; height: 26px; fill: #fff; margin-left: 3px; }\n\n\/* ============================================================\n   &#9733; LIVELY THEME (kid-friendly) &#8212; overrides on top of the base\n   ============================================================ *\/\nbody { background: #FFF9F0; }\nbody::before {\n  background:\n    radial-gradient(720px 520px at 88% -6%, rgba(124,92,252,.16), transparent 60%),\n    radial-gradient(640px 520px at -6% 6%, rgba(6,182,196,.15), transparent 60%),\n    radial-gradient(620px 460px at 50% 110%, rgba(255,157,46,.13), transparent 60%) !important;\n  opacity: 1 !important;\n}\n\n\/* rounded, friendly headings *\/\nh1, h2, h3, h4 { letter-spacing: -.01em; }\n.hero h1 { line-height: 1.02; letter-spacing: -.02em; }\n\n\/* keep section content above decorative shapes *\/\n.hero .wrap, .section .wrap, .cat-section .wrap, .filterbar .wrap { position: relative; z-index: 1; }\n.hero, .section, .cat-section { position: relative; }\n\n\/* floating decorative shapes *\/\n.blob { position: absolute; z-index: 0; pointer-events: none; opacity: .9; }\n.blob.ring { border-radius: 50%; border: 7px solid currentColor; background: transparent; }\n.blob.dot  { border-radius: 50%; background: currentColor; }\n.blob.sq   { border-radius: 12px; background: currentColor; }\n.blob.star { color: transparent; }\n@keyframes floatA { 0%,100% { transform: translateY(0) rotate(0); } 50% { transform: translateY(-22px) rotate(8deg); } }\n@keyframes floatB { 0%,100% { transform: translateY(0) rotate(0); } 50% { transform: translateY(16px) rotate(-10deg); } }\n@keyframes spinSlow { to { transform: rotate(360deg); } }\n.blob.fa { animation: floatA 7s ease-in-out infinite; }\n.blob.fb { animation: floatB 9s ease-in-out infinite; }\n.blob.spin { animation: spinSlow 22s linear infinite; }\n\n\/* hero gets a soft colorful glow behind the visual *\/\n.hero-visual::before {\n  content: \"\"; position: absolute; inset: -12% -8% -8% -4%; z-index: 0; pointer-events: none;\n  background: radial-gradient(closest-side, rgba(124,92,252,.22), transparent 72%),\n              radial-gradient(closest-side, rgba(6,182,196,.18), transparent 70%);\n  background-position: 70% 30%, 20% 80%; background-repeat: no-repeat;\n  background-size: 75% 75%, 65% 65%; filter: blur(6px);\n}\n.hero-visual > * { position: relative; z-index: 1; }\n.float-pill { animation: floatA 6s ease-in-out infinite; }\n.float-pill.p2 { animation: floatB 7.5s ease-in-out infinite; }\n\n\/* eyebrow + filter pills: chunkier and colorful *\/\n.eyebrow { border-radius: 999px; font-weight: 700; }\n.btn-lg, .btn-cta, .btn-white, .btn-outline, .vc-btn, .sc-start { border-radius: 999px !important; }\n.btn-primary { background: var(--blue); box-shadow: 0 10px 0 -2px #0a3fa0, 0 14px 26px rgba(1,97,255,.34) !important; }\n.btn-primary:hover { transform: translateY(-3px) scale(1.02); }\n.btn-cta { box-shadow: 0 7px 0 -2px #0a3fa0, 0 10px 20px rgba(1,97,255,.3) !important; }\n.btn-cta:hover { transform: translateY(-2px) scale(1.03); }\n\n\/* filter bar *\/\n.filterbar { border-bottom: 0; }\n.filters .fb { border-radius: 999px; border-width: 2px; font-weight: 700; }\n.filters .fb:hover { transform: translateY(-2px) scale(1.03); }\n.filters .fb.active { transform: translateY(-1px) scale(1.03); box-shadow: 0 8px 18px color-mix(in srgb, currentColor 0%, transparent); }\n\n\/* section tints *\/\n#step1 { background: linear-gradient(180deg, transparent, var(--step1-soft) 40%, transparent); }\n#step2 { background: linear-gradient(180deg, transparent, var(--step2-soft) 40%, transparent); }\n#speaking { background: linear-gradient(180deg, transparent, var(--speak-soft) 40%, transparent); }\n#videos { background: linear-gradient(180deg, transparent, var(--video-soft) 40%, transparent); }\n\n\/* section kicker band: rounder + bouncy mascot bubble *\/\n.band { border-radius: 999px; font-weight: 800; white-space: nowrap; box-shadow: 0 6px 16px color-mix(in srgb, var(--ink) 8%, transparent); }\n.band .bb { border-radius: 50%; }\n\n\/* cards: rounder, colored bouncy shadow *\/\n.series-card {\n  border-radius: 28px; border-width: 2px; border-top-width: 6px;\n  box-shadow: 0 12px 30px color-mix(in srgb, var(--lc) 15%, transparent), 0 4px 10px rgba(20,33,61,.05);\n}\n.series-card:hover {\n  transform: translateY(-7px) rotate(-.5deg);\n  box-shadow: 0 24px 48px color-mix(in srgb, var(--lc) 26%, transparent), 0 8px 16px rgba(20,33,61,.06);\n}\n.series-card.is-live { border-color: color-mix(in srgb, var(--live) 45%, var(--line)); }\n\n\/* status tag: chunkier *\/\n.status-tag { border-radius: 999px; font-weight: 800; }\n.status-tag.prog { box-shadow: 0 0 0 3px color-mix(in srgb, var(--progress) 14%, transparent); }\n\n\/* part-links + test-links: rounder, bouncy *\/\n.part-link, .test-link { border-radius: 999px; border-width: 2px; }\n.part-link:not(.locked):hover, .test-link:not(.locked):hover { transform: translateY(-3px) scale(1.04); }\n.sc-stats .ks b { font-size: 26px; }\n\n\/* staircase: playful colored steps *\/\n.step { border-radius: 22px; border-width: 2px; border-top-width: 6px; }\n.step:hover { transform: translateY(-8px) rotate(-1deg) scale(1.02); box-shadow: 0 18px 34px color-mix(in srgb, var(--lc) 26%, transparent); }\n.step .lvl { border-radius: 999px; font-weight: 800; }\n.step .num { -webkit-text-stroke: 2px color-mix(in srgb, var(--lc) 32%, transparent); color: transparent; }\n.path { background: linear-gradient(180deg, #FFF4E2, #FDEEF6); border: 0; }\n\n\/* video cards rounder + colored shadow *\/\n.video-card { border-radius: 22px; border-width: 2px; box-shadow: 0 12px 26px rgba(255,77,77,.12); }\n.video-card:hover { transform: translateY(-7px) rotate(.5deg); box-shadow: 0 22px 42px rgba(255,77,77,.2); }\n.video-cta { border-radius: 26px; }\n.video-play, .hero-play { background: var(--video); }\n.video-play, .hero-play { box-shadow: 0 8px 22px rgba(255,77,77,.55); }\n\n\/* bouncier reveal entrance *\/\n@media (prefers-reduced-motion: no-preference) {\n  .reveal.in { animation: riseBounce .7s cubic-bezier(.34,1.56,.64,1) both; }\n}\n@keyframes riseBounce { from { opacity: 0; transform: translateY(26px) scale(.97); } to { opacity: 1; transform: none; } }\n\n\/* CTA: rounder, sunny *\/\n.cta { border-radius: 34px; background: linear-gradient(150deg, #FF6A3D, var(--video)); }\n\n\/* wiggle the mascot icons in section bands on hover *\/\n.band:hover .bb { animation: wiggle .5s ease; }\n@keyframes wiggle { 0%,100%{transform:rotate(0)} 25%{transform:rotate(-12deg)} 75%{transform:rotate(12deg)} }\n\n@media (prefers-reduced-motion: reduce) {\n  .blob, .float-pill { animation: none !important; }\n}\n\n\/* ---- cute animated hero mascots (replace stat chips) ---- *\/\n.mascots { display: flex; gap: 26px; margin-top: 32px; flex-wrap: wrap; }\n.mascot { display: flex; flex-direction: column; align-items: center; gap: 9px; cursor: default; transition: transform .2s cubic-bezier(.34,1.56,.64,1); }\n.mascot:hover { transform: scale(1.12) translateY(-2px); }\n.m-art { width: 74px; height: 74px; }\n.m-art svg { width: 100%; height: 100%; overflow: visible; display: block; }\n.mascot span { font-family: var(--display) !important; font-weight: 800; font-size: 14px; color: var(--ink-2); }\n@media (prefers-reduced-motion: no-preference) {\n  .mascot:nth-child(1) .m-art { animation: floatA 4s ease-in-out infinite; }\n  .mascot:nth-child(2) .m-art { animation: floatB 4.6s ease-in-out infinite; }\n  .mascot:nth-child(3) .m-art { animation: floatA 5s ease-in-out .3s infinite; }\n  .mascot:nth-child(4) .m-art { animation: floatB 4.3s ease-in-out .2s infinite; }\n  .mascot:hover .m-art { animation-play-state: paused; }\n  .m-art .eye { transform-box: fill-box; transform-origin: center; animation: blink 4.2s infinite; }\n  .mascot:nth-child(2) .m-art .eye { animation-duration: 5.1s; }\n  .mascot:nth-child(3) .m-art .eye { animation-duration: 3.7s; }\n  .mascot:nth-child(4) .m-art .eye { animation-duration: 4.7s; }\n}\n@keyframes blink { 0%, 91%, 100% { transform: scaleY(1); } 95.5% { transform: scaleY(.12); } }\n@media (max-width: 560px) { .mascots { gap: 16px; } .m-art { width: 60px; height: 60px; } }\n\n\/* ---- cute character illustrations per section ---- *\/\n.section-char { position: absolute; z-index: 0; pointer-events: none; user-select: none; filter: drop-shadow(0 8px 14px rgba(20,33,61,.1)); }\n.sc-side { width: 134px; height: 134px; top: 40px; right: 40px; }\n.sc-path { width: 152px; height: 152px; top: 30px; right: 56px; }\n.sc-cta  { width: 96px; height: 96px; right: 24px; bottom: 16px; z-index: 2; }\n@media (max-width: 1040px) { .sc-side, .sc-path { width: 104px; height: 104px; top: 22px; right: 18px; } }\n@media (max-width: 680px) { .section-char.sc-side, .section-char.sc-path { display: none; } .sc-cta { width: 76px; height: 76px; } }\n\n\n<\/style>\n\n\n<!-- ============ HEADER ============ -->\n<header class=\"site-header\">\n  <div class=\"wrap header-inner\">\n    <a class=\"brand\" href=\"https:\/\/allenglish4u.com\/\" aria-label=\"All English 4U home\">\n      <img decoding=\"async\" class=\"mark\" src=\"https:\/\/allenglish4u.com\/wp-content\/uploads\/2026\/04\/Transparent-background-MacBook-Pro-cua-Hang.png\" alt=\"All English 4U logo\" \/>\n      <span>All English <b>4U<\/b><\/span>\n    <\/a>\n    <nav class=\"main-nav\">\n      <a href=\"https:\/\/allenglish4u.com\/grammar\/\">Grammar<\/a>\n      <a href=\"https:\/\/allenglish4u.com\/ielts\/\">IELTS<\/a>\n      <a href=\"https:\/\/allenglish4u.com\/toefl\/\" class=\"active\">TOEFL<\/a>\n      <a href=\"https:\/\/allenglish4u.com\/cambridge\/\">Cambridge<\/a>\n      <a href=\"https:\/\/allenglish4u.com\/celpip\/\">CELPIP<\/a>\n      <a href=\"https:\/\/allenglish4u.com\/dictation\/\">Dictation<\/a>\n      <a href=\"https:\/\/allenglish4u.com\/contact\/\">Contact<\/a>\n    <\/nav>\n    <a class=\"btn-cta\" href=\"https:\/\/www.youtube.com\/playlist?list=PLmmEx97WdP1TPMPqLCipSCX6HgRlMYF5p\" target=\"_blank\" rel=\"noopener\">\n      Watch lessons\n      <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.6\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M13 6l6 6-6 6\"\/><\/svg>\n    <\/a>\n    <button class=\"nav-toggle\" aria-label=\"Menu\"><span><\/span><span><\/span><span><\/span><\/button>\n  <\/div>\n  <div class=\"wrap\"><nav class=\"mobile-nav\">\n    <a href=\"https:\/\/allenglish4u.com\/grammar\/\">Grammar<\/a>\n    <a href=\"https:\/\/allenglish4u.com\/ielts\/\">IELTS<\/a>\n    <a href=\"https:\/\/allenglish4u.com\/toefl\/\">TOEFL<\/a>\n    <a href=\"https:\/\/allenglish4u.com\/cambridge\/\">Cambridge<\/a>\n    <a href=\"https:\/\/allenglish4u.com\/celpip\/\">CELPIP<\/a>\n    <a href=\"https:\/\/allenglish4u.com\/dictation\/\">Dictation<\/a>\n    <a href=\"https:\/\/allenglish4u.com\/contact\/\">Contact<\/a>\n  <\/nav><\/div>\n<\/header>\n\n<!-- ============ HERO ============ -->\n<section class=\"hero\">\n  <span class=\"blob ring fa\" style=\"top:14%;left:5%;width:52px;height:52px;color:var(--step1);opacity:.55\"><\/span>\n  <span class=\"blob dot fb\" style=\"top:66%;left:3%;width:20px;height:20px;color:var(--speak);opacity:.6\"><\/span>\n  <span class=\"blob sq spin\" style=\"top:20%;right:3%;width:26px;height:26px;color:var(--step2);opacity:.4\"><\/span>\n  <span class=\"blob dot fa\" style=\"bottom:8%;right:8%;width:14px;height:14px;color:var(--video);opacity:.6\"><\/span>\n  <div class=\"wrap hero-grid\">\n    <div class=\"hero-copy\">\n      <span class=\"eyebrow reveal\"><i class=\"dot\"><\/i> TOEFL Primary &#183; For Young Learners<\/span>\n      <h1 class=\"reveal\">Your first step into <em>TOEFL<\/em><\/h1>\n      <p class=\"lead reveal\">A friendly TOEFL Primary pathway &#8212; <b>Step 1<\/b> and <b>Step 2<\/b> Reading &amp; Listening, plus free <b>video lessons<\/b>. Built for children, easy to follow.<\/p>\n      <div class=\"hero-actions reveal\">\n        <a class=\"btn-lg btn-primary\" href=\"https:\/\/www.youtube.com\/playlist?list=PLmmEx97WdP1TPMPqLCipSCX6HgRlMYF5p\" target=\"_blank\" rel=\"noopener\">\n          Watch the free lessons\n          <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M13 6l6 6-6 6\"\/><\/svg>\n        <\/a>\n        <a class=\"btn-lg btn-ghost\" href=\"#path\">See the learning path<\/a>\n      <\/div>\n      <div class=\"mascots reveal\">\n        <div class=\"mascot\">\n          <div class=\"m-art\"><svg viewBox=\"0 0 80 80\" fill=\"none\">\n            <ellipse cx=\"40\" cy=\"73\" rx=\"16\" ry=\"3.5\" fill=\"rgba(0,0,0,.08)\"\/>\n            <path d=\"M40 15c-14 0-22 10-22 25 0 14 9 23 22 23s22-9 22-23c0-15-8-25-22-25z\" fill=\"var(--step1)\"\/>\n            <ellipse cx=\"40\" cy=\"47\" rx=\"12\" ry=\"14\" fill=\"#fff\" opacity=\".22\"\/>\n            <circle cx=\"32\" cy=\"39\" r=\"7.5\" fill=\"#fff\"\/><circle cx=\"48\" cy=\"39\" r=\"7.5\" fill=\"#fff\"\/>\n            <g class=\"eye\"><circle cx=\"32\" cy=\"40\" r=\"3.5\" fill=\"#15233f\"\/><\/g>\n            <g class=\"eye\"><circle cx=\"48\" cy=\"40\" r=\"3.5\" fill=\"#15233f\"\/><\/g>\n            <path d=\"M40 45l-3.2 4.2h6.4z\" fill=\"#FF9D2E\"\/>\n            <circle cx=\"25\" cy=\"47\" r=\"3\" fill=\"#FF7DA0\" opacity=\".6\"\/><circle cx=\"55\" cy=\"47\" r=\"3\" fill=\"#FF7DA0\" opacity=\".6\"\/>\n            <path d=\"M18 37a22 22 0 0 1 44 0\" stroke=\"#15233f\" stroke-width=\"4\" stroke-linecap=\"round\"\/>\n            <rect x=\"12\" y=\"35\" width=\"10\" height=\"16\" rx=\"5\" fill=\"#15233f\"\/><rect x=\"58\" y=\"35\" width=\"10\" height=\"16\" rx=\"5\" fill=\"#15233f\"\/>\n          <\/svg><\/div>\n          <span>Listen<\/span>\n        <\/div>\n        <div class=\"mascot\">\n          <div class=\"m-art\"><svg viewBox=\"0 0 80 80\" fill=\"none\">\n            <ellipse cx=\"40\" cy=\"73\" rx=\"16\" ry=\"3.5\" fill=\"rgba(0,0,0,.08)\"\/>\n            <rect x=\"20\" y=\"16\" width=\"40\" height=\"48\" rx=\"9\" fill=\"var(--step2)\"\/>\n            <rect x=\"51\" y=\"16\" width=\"9\" height=\"48\" rx=\"4.5\" fill=\"#fff\" opacity=\".5\"\/>\n            <path d=\"M30 16v15l4.5-3.4L39 31V16z\" fill=\"#FF9D2E\"\/>\n            <circle cx=\"33\" cy=\"42\" r=\"6\" fill=\"#fff\"\/><circle cx=\"47\" cy=\"42\" r=\"6\" fill=\"#fff\"\/>\n            <g class=\"eye\"><circle cx=\"33\" cy=\"43\" r=\"3\" fill=\"#15233f\"\/><\/g>\n            <g class=\"eye\"><circle cx=\"47\" cy=\"43\" r=\"3\" fill=\"#15233f\"\/><\/g>\n            <path d=\"M35 52q5 4 10 0\" stroke=\"#15233f\" stroke-width=\"2.6\" stroke-linecap=\"round\"\/>\n            <circle cx=\"27\" cy=\"49\" r=\"2.6\" fill=\"#FF7DA0\" opacity=\".6\"\/><circle cx=\"53\" cy=\"49\" r=\"2.6\" fill=\"#FF7DA0\" opacity=\".6\"\/>\n          <\/svg><\/div>\n          <span>Read<\/span>\n        <\/div>\n                <div class=\"mascot\">\n          <div class=\"m-art\"><svg viewBox=\"0 0 80 80\" fill=\"none\">\n            <ellipse cx=\"40\" cy=\"73\" rx=\"16\" ry=\"3.5\" fill=\"rgba(0,0,0,.08)\"\/>\n            <path d=\"M30 22l-6-9M50 22l6-9\" stroke=\"#15233f\" stroke-width=\"3\" stroke-linecap=\"round\"\/>\n            <circle cx=\"24\" cy=\"12\" r=\"2.6\" fill=\"#15233f\"\/><circle cx=\"56\" cy=\"12\" r=\"2.6\" fill=\"#15233f\"\/>\n            <rect x=\"13\" y=\"22\" width=\"54\" height=\"40\" rx=\"11\" fill=\"var(--video)\"\/>\n            <rect x=\"19\" y=\"28\" width=\"42\" height=\"28\" rx=\"7\" fill=\"#fff\" opacity=\".25\"\/>\n            <path d=\"M36 33l13 7-13 7z\" fill=\"#fff\"\/>\n            <circle cx=\"24\" cy=\"66\" r=\"3\" fill=\"#15233f\"\/><circle cx=\"56\" cy=\"66\" r=\"3\" fill=\"#15233f\"\/>\n          <\/svg><\/div>\n          <span>Watch<\/span>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"hero-visual reveal\">\n      <span class=\"float-pill p1\" style=\"background:var(--step1)\">Step 1 &amp; 2<\/span>\n      <span class=\"float-pill p2\" style=\"background:var(--video)\">New videos weekly<\/span>\n      <div class=\"bookcard\">\n        <div class=\"bookcard-head\">\n          <span class=\"badge-live\"><i class=\"pulse\"><\/i> Live now<\/span>\n          <span style=\"font-size:13px;color:rgba(255,255,255,.55);font-weight:600\">Video lessons<\/span>\n        <\/div>\n        <h3>TOEFL Primary on YouTube<\/h3>\n        <div class=\"sub\">Free video lessons &#8212; Listening &amp; Reading walkthroughs, growing every week.<\/div>\n        <a class=\"hero-video\" href=\"https:\/\/www.youtube.com\/watch?v=ibOJ56dGbnM&#038;list=PLmmEx97WdP1TPMPqLCipSCX6HgRlMYF5p\" target=\"_blank\" rel=\"noopener\">\n          <img decoding=\"async\" src=\"https:\/\/i.ytimg.com\/vi\/ibOJ56dGbnM\/hqdefault.jpg\" alt=\"TOEFL Primary lesson preview\" \/>\n          <span class=\"hero-play\"><svg viewBox=\"0 0 24 24\" fill=\"currentColor\"><path d=\"M8 5v14l11-7z\"\/><\/svg><\/span>\n        <\/a>\n        <div class=\"bookcard-foot\">\n          <svg width=\"15\" height=\"15\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 11l3 3L22 4\"\/><path d=\"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11\"\/><\/svg>\n          New tests &amp; videos added regularly\n        <\/div>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<!-- ============ LEARNING PATH (STAIRCASE) ============ -->\n<section class=\"section path\" id=\"path\">\n  <span class=\"blob ring fb\" style=\"top:16%;right:6%;width:46px;height:46px;color:var(--step2);opacity:.45\"><\/span>\n  <span class=\"blob dot fa\" style=\"bottom:14%;left:4%;width:18px;height:18px;color:var(--video);opacity:.5\"><\/span>\n  <img decoding=\"async\" class=\"section-char sc-path\" src=\"data:image\/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNDAgMTQwIiBmaWxsPSJub25lIj4KPGVsbGlwc2UgY3g9IjcwIiBjeT0iMTI5IiByeD0iMzAiIHJ5PSI1LjUiIGZpbGw9InJnYmEoMCwwLDAsLjA4KSI+PC9lbGxpcHNlPgo8cGF0aCBkPSJNNzAgMjJsMTMgMjcgMjkgMy0yMSAyMCA2IDI5LTI3LTE1LTI3IDE1IDYtMjktMjEtMjAgMjktM3oiIGZpbGw9IiNGRkMyM0MiPjwvcGF0aD4KPGNpcmNsZSBjeD0iNjAiIGN5PSI2NCIgcj0iOS41IiBmaWxsPSIjZmZmIj48L2NpcmNsZT48Y2lyY2xlIGN4PSI4MCIgY3k9IjY0IiByPSI5LjUiIGZpbGw9IiNmZmYiPjwvY2lyY2xlPgo8Y2lyY2xlIGN4PSI2MSIgY3k9IjY2IiByPSI0LjQiIGZpbGw9IiMxNTIzM2YiPjwvY2lyY2xlPjxjaXJjbGUgY3g9IjgxIiBjeT0iNjYiIHI9IjQuNCIgZmlsbD0iIzE1MjMzZiI+PC9jaXJjbGU+CjxjaXJjbGUgY3g9IjYyLjUiIGN5PSI2My41IiByPSIxLjUiIGZpbGw9IiNmZmYiPjwvY2lyY2xlPjxjaXJjbGUgY3g9IjgyLjUiIGN5PSI2My41IiByPSIxLjUiIGZpbGw9IiNmZmYiPjwvY2lyY2xlPgo8Y2lyY2xlIGN4PSI0OCIgY3k9Ijc0IiByPSI1IiBmaWxsPSIjRkY3REEwIiBvcGFjaXR5PSIuNiI+PC9jaXJjbGU+PGNpcmNsZSBjeD0iOTIiIGN5PSI3NCIgcj0iNSIgZmlsbD0iI0ZGN0RBMCIgb3BhY2l0eT0iLjYiPjwvY2lyY2xlPgo8cGF0aCBkPSJNNjIgNzggcTggOCAxNiAwIiBzdHJva2U9IiMxNTIzM2YiIHN0cm9rZS13aWR0aD0iMy40IiBmaWxsPSJub25lIiBzdHJva2UtbGluZWNhcD0icm91bmQiPjwvcGF0aD4KPHBhdGggZD0iTTEwMCA3MHYzNCIgc3Ryb2tlPSIjMTUyMzNmIiBzdHJva2Utd2lkdGg9IjMuNSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIj48L3BhdGg+PHBhdGggZD0iTTEwMCA3MmgyMGwtNSA2IDUgNmgtMjB6IiBmaWxsPSIjMDZCNkM0Ij48L3BhdGg+Cjwvc3ZnPg==\" alt=\"\" \/>\n  <div class=\"wrap\">\n    <div class=\"section-head reveal\">\n      <span class=\"kicker\"><i class=\"tick\"><\/i> The TOEFL Primary ladder<\/span>\n      <h2>Grow from <em>Step 1<\/em> to <em>Step 2<\/em>, one stage at a time<\/h2>\n      <p class=\"desc\">TOEFL Primary builds English step by step. Start with Step 1 Reading &amp; Listening, move up to Step 2 &#8212; and learn along the way with free videos.<\/p>\n      <div class=\"legend\">\n        <span><i class=\"l-live\"><\/i> Live now<\/span>\n        <span><i class=\"l-prog\"><\/i> In progress<\/span>\n        <span><i class=\"l-soon\"><\/i> Coming soon<\/span>\n      <\/div>\n    <\/div>\n    <div class=\"stairs\" id=\"stairs\"><\/div>\n    <div class=\"path-note reveal\">\n      <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"10\"\/><path d=\"M12 16v-4M12 8h.01\"\/><\/svg>\n      Tap any step to jump to that section below.\n    <\/div>\n  <\/div>\n<\/section>\n\n<!-- ============ FILTER BAR ============ -->\n<div class=\"filterbar\">\n  <div class=\"wrap filters\">\n    <button class=\"fb active\" data-f=\"all\">All<\/button>\n    <button class=\"fb\" data-f=\"step1\"><span class=\"c\" style=\"background:var(--step1)\"><\/span> Step 1<\/button>\n    <button class=\"fb\" data-f=\"step2\"><span class=\"c\" style=\"background:var(--step2)\"><\/span> Step 2<\/button>\n    <button class=\"fb\" data-f=\"videos\"><span class=\"c\" style=\"background:var(--video)\"><\/span> Videos<\/button>\n    <span class=\"count\">6 series &#183; 18 lessons<\/span>\n  <\/div>\n<\/div>\n\n<!-- ============ STEP 1 ============ -->\n<section class=\"cat-section\" id=\"step1\">\n  <span class=\"blob ring fa\" style=\"top:10%;right:5%;width:48px;height:48px;color:var(--step1);opacity:.4\"><\/span>\n  <span class=\"blob sq fb\" style=\"bottom:12%;left:3%;width:24px;height:24px;color:var(--step1);opacity:.3\"><\/span>\n  <img decoding=\"async\" class=\"section-char sc-side\" src=\"data:image\/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNDAgMTQwIiBmaWxsPSJub25lIj4KPGVsbGlwc2UgY3g9IjcwIiBjeT0iMTI5IiByeD0iMzQiIHJ5PSI2IiBmaWxsPSJyZ2JhKDAsMCwwLC4wOCkiPjwvZWxsaXBzZT4KPGVsbGlwc2UgY3g9IjU2IiBjeT0iMTIxIiByeD0iOSIgcnk9IjYuNSIgZmlsbD0iIzBhOGY5YiI+PC9lbGxpcHNlPjxlbGxpcHNlIGN4PSI4NCIgY3k9IjEyMSIgcng9IjkiIHJ5PSI2LjUiIGZpbGw9IiMwYThmOWIiPjwvZWxsaXBzZT4KPHBhdGggZD0iTTQ0IDQ0bDEwIDEwLTE2IDJ6IiBmaWxsPSIjMDZCNkM0Ij48L3BhdGg+PHBhdGggZD0iTTk2IDQ0bC0xMCAxMCAxNiAyeiIgZmlsbD0iIzA2QjZDNCI+PC9wYXRoPgo8Y2lyY2xlIGN4PSI3MCIgY3k9Ijc0IiByPSI0MyIgZmlsbD0iIzA2QjZDNCI+PC9jaXJjbGU+CjxlbGxpcHNlIGN4PSI3MCIgY3k9Ijg0IiByeD0iMjUiIHJ5PSIyNyIgZmlsbD0iI2ZmZiIgb3BhY2l0eT0iLjIiPjwvZWxsaXBzZT4KPHBhdGggZD0iTTMwIDc4YTE0IDE0IDAgMCAxIDE2IDYiIHN0cm9rZT0iIzBhOGY5YiIgc3Ryb2tlLXdpZHRoPSI4IiBzdHJva2UtbGluZWNhcD0icm91bmQiPjwvcGF0aD48cGF0aCBkPSJNMTEwIDc4YTE0IDE0IDAgMCAwLTE2IDYiIHN0cm9rZT0iIzBhOGY5YiIgc3Ryb2tlLXdpZHRoPSI4IiBzdHJva2UtbGluZWNhcD0icm91bmQiPjwvcGF0aD4KPGNpcmNsZSBjeD0iNTgiIGN5PSI2NyIgcj0iMTEuNSIgZmlsbD0iI2ZmZiI+PC9jaXJjbGU+PGNpcmNsZSBjeD0iODIiIGN5PSI2NyIgcj0iMTEuNSIgZmlsbD0iI2ZmZiI+PC9jaXJjbGU+CjxjaXJjbGUgY3g9IjU5IiBjeT0iNjkiIHI9IjUuMiIgZmlsbD0iIzE1MjMzZiI+PC9jaXJjbGU+PGNpcmNsZSBjeD0iODMiIGN5PSI2OSIgcj0iNS4yIiBmaWxsPSIjMTUyMzNmIj48L2NpcmNsZT4KPGNpcmNsZSBjeD0iNjEiIGN5PSI2Ni41IiByPSIxLjgiIGZpbGw9IiNmZmYiPjwvY2lyY2xlPjxjaXJjbGUgY3g9Ijg1IiBjeT0iNjYuNSIgcj0iMS44IiBmaWxsPSIjZmZmIj48L2NpcmNsZT4KPGNpcmNsZSBjeD0iNDYiIGN5PSI4MCIgcj0iNS41IiBmaWxsPSIjRkY3REEwIiBvcGFjaXR5PSIuNiI+PC9jaXJjbGU+PGNpcmNsZSBjeD0iOTQiIGN5PSI4MCIgcj0iNS41IiBmaWxsPSIjRkY3REEwIiBvcGFjaXR5PSIuNiI+PC9jaXJjbGU+CjxwYXRoIGQ9Ik02MCA4NiBxMTAgOSAyMCAwIiBzdHJva2U9IiMxNTIzM2YiIHN0cm9rZS13aWR0aD0iMy42IiBmaWxsPSJub25lIiBzdHJva2UtbGluZWNhcD0icm91bmQiPjwvcGF0aD4KPGc+PHBhdGggZD0iTTcwIDk1Yy05LTYtMjItNy0zMS00djE3YzktMyAyMi0yIDMxIDR6IiBmaWxsPSIjZmZmIiBzdHJva2U9IiMwYThmOWIiIHN0cm9rZS13aWR0aD0iMi42Ij48L3BhdGg+PHBhdGggZD0iTTcwIDk1YzktNiAyMi03IDMxLTR2MTdjLTktMy0yMi0yLTMxIDR6IiBmaWxsPSIjZWFmY2ZmIiBzdHJva2U9IiMwYThmOWIiIHN0cm9rZS13aWR0aD0iMi42Ij48L3BhdGg+PHBhdGggZD0iTTcwIDk1djE3IiBzdHJva2U9IiMwYThmOWIiIHN0cm9rZS13aWR0aD0iMi42Ij48L3BhdGg+PC9nPgo8L3N2Zz4=\" alt=\"\" \/>\n  <div class=\"wrap\">\n    <div class=\"section-head reveal\">\n      <span class=\"band\" style=\"background:var(--step1-soft);color:var(--step1)\"><span class=\"bb\" style=\"background:var(--step1)\">1<\/span> TOEFL Primary &#8212; Step 1<\/span>\n      <h2 style=\"margin-top:18px\">First steps in <em style=\"color:var(--step1)\">Reading &amp; Listening<\/em><\/h2>\n      <p class=\"desc\">Step 1 is designed for beginners. Each test moves through four parts &#8212; <b>Word list<\/b>, <b>Grammar<\/b>, <b>Reading<\/b> and <b>Listening<\/b> &#8212; building vocabulary and confidence in the TOEFL Primary format.<\/p>\n    <\/div>\n    <div class=\"series-list\" id=\"step1-list\"><\/div>\n  <\/div>\n<\/section>\n\n<!-- ============ STEP 2 ============ -->\n<section class=\"cat-section\" id=\"step2\">\n  <span class=\"blob dot fb\" style=\"top:12%;left:5%;width:22px;height:22px;color:var(--step2);opacity:.4\"><\/span>\n  <span class=\"blob ring fa\" style=\"bottom:10%;right:4%;width:44px;height:44px;color:var(--step2);opacity:.35\"><\/span>\n  <img decoding=\"async\" class=\"section-char sc-side\" src=\"data:image\/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNDAgMTQwIiBmaWxsPSJub25lIj4KPGVsbGlwc2UgY3g9IjcwIiBjeT0iMTI5IiByeD0iMzQiIHJ5PSI2IiBmaWxsPSJyZ2JhKDAsMCwwLC4wOCkiPjwvZWxsaXBzZT4KPGVsbGlwc2UgY3g9IjU2IiBjeT0iMTIxIiByeD0iOSIgcnk9IjYuNSIgZmlsbD0iIzVhM2ZlMCI+PC9lbGxpcHNlPjxlbGxpcHNlIGN4PSI4NCIgY3k9IjEyMSIgcng9IjkiIHJ5PSI2LjUiIGZpbGw9IiM1YTNmZTAiPjwvZWxsaXBzZT4KPGNpcmNsZSBjeD0iNzAiIGN5PSI3MiIgcj0iNDMiIGZpbGw9IiM3QzVDRkMiPjwvY2lyY2xlPgo8ZWxsaXBzZSBjeD0iNzAiIGN5PSI4MiIgcng9IjI1IiByeT0iMjciIGZpbGw9IiNmZmYiIG9wYWNpdHk9Ii4yIj48L2VsbGlwc2U+CjxjaXJjbGUgY3g9IjU4IiBjeT0iNjUiIHI9IjExLjUiIGZpbGw9IiNmZmYiPjwvY2lyY2xlPjxjaXJjbGUgY3g9IjgyIiBjeT0iNjUiIHI9IjExLjUiIGZpbGw9IiNmZmYiPjwvY2lyY2xlPgo8Y2lyY2xlIGN4PSI1OSIgY3k9IjY3IiByPSI1IiBmaWxsPSIjMTUyMzNmIj48L2NpcmNsZT48Y2lyY2xlIGN4PSI4MyIgY3k9IjY3IiByPSI1IiBmaWxsPSIjMTUyMzNmIj48L2NpcmNsZT4KPGNpcmNsZSBjeD0iNjEiIGN5PSI2NC41IiByPSIxLjciIGZpbGw9IiNmZmYiPjwvY2lyY2xlPjxjaXJjbGUgY3g9Ijg1IiBjeT0iNjQuNSIgcj0iMS43IiBmaWxsPSIjZmZmIj48L2NpcmNsZT4KPGcgc3Ryb2tlPSIjMTUyMzNmIiBzdHJva2Utd2lkdGg9IjIuNiIgZmlsbD0ibm9uZSI+PGNpcmNsZSBjeD0iNTgiIGN5PSI2NSIgcj0iMTMiPjwvY2lyY2xlPjxjaXJjbGUgY3g9IjgyIiBjeT0iNjUiIHI9IjEzIj48L2NpcmNsZT48cGF0aCBkPSJNNzEgNjVoLTIiPjwvcGF0aD48cGF0aCBkPSJNNDUgNjJsLTctM005NSA2Mmw3LTMiPjwvcGF0aD48L2c+CjxjaXJjbGUgY3g9IjQ1IiBjeT0iODAiIHI9IjUuNSIgZmlsbD0iI0ZGN0RBMCIgb3BhY2l0eT0iLjYiPjwvY2lyY2xlPjxjaXJjbGUgY3g9Ijk1IiBjeT0iODAiIHI9IjUuNSIgZmlsbD0iI0ZGN0RBMCIgb3BhY2l0eT0iLjYiPjwvY2lyY2xlPgo8cGF0aCBkPSJNNjAgODggcTEwIDkgMjAgMCIgc3Ryb2tlPSIjMTUyMzNmIiBzdHJva2Utd2lkdGg9IjMuNiIgZmlsbD0ibm9uZSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIj48L3BhdGg+CjxyZWN0IHg9IjQ4IiB5PSI5OSIgd2lkdGg9IjQ0IiBoZWlnaHQ9IjkiIHJ4PSIzIiBmaWxsPSIjRkY5RDJFIj48L3JlY3Q+PHJlY3QgeD0iNTMiIHk9IjkwIiB3aWR0aD0iMzQiIGhlaWdodD0iOSIgcng9IjMiIGZpbGw9IiNGRkQ1NEEiPjwvcmVjdD4KPC9zdmc+\" alt=\"\" \/>\n  <div class=\"wrap\">\n    <div class=\"section-head reveal\">\n      <span class=\"band\" style=\"background:var(--step2-soft);color:var(--step2)\"><span class=\"bb\" style=\"background:var(--step2)\">2<\/span> TOEFL Primary &#8212; Step 2<\/span>\n      <h2 style=\"margin-top:18px\">Going further with <em style=\"color:var(--step2)\">Reading &amp; Listening<\/em><\/h2>\n      <p class=\"desc\">Step 2 is for stronger learners. The same four parts &#8212; Word list, Grammar, Reading and Listening &#8212; step up to longer passages and more academic listening, while staying age-appropriate and engaging.<\/p>\n    <\/div>\n    <div class=\"series-list\" id=\"step2-list\"><\/div>\n  <\/div>\n<\/section>\n\n\n<!-- ============ VIDEOS ============ -->\n<section class=\"cat-section\" id=\"videos\">\n  <span class=\"blob dot fa\" style=\"top:14%;left:5%;width:20px;height:20px;color:var(--video);opacity:.5\"><\/span>\n  <span class=\"blob sq spin\" style=\"bottom:12%;right:5%;width:24px;height:24px;color:var(--video);opacity:.35\"><\/span>\n  <img decoding=\"async\" class=\"section-char sc-side\" src=\"data:image\/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNDAgMTQwIiBmaWxsPSJub25lIj4KPGVsbGlwc2UgY3g9IjcwIiBjeT0iMTI5IiByeD0iMzQiIHJ5PSI2IiBmaWxsPSJyZ2JhKDAsMCwwLC4wOCkiPjwvZWxsaXBzZT4KPGVsbGlwc2UgY3g9IjU2IiBjeT0iMTIxIiByeD0iOSIgcnk9IjYuNSIgZmlsbD0iI2UyMzQzNCI+PC9lbGxpcHNlPjxlbGxpcHNlIGN4PSI4NCIgY3k9IjEyMSIgcng9IjkiIHJ5PSI2LjUiIGZpbGw9IiNlMjM0MzQiPjwvZWxsaXBzZT4KPHJlY3QgeD0iNjAiIHk9IjM0IiB3aWR0aD0iMyIgaGVpZ2h0PSIxMCIgcng9IjEuNSIgZmlsbD0iIzE1MjMzZiI+PC9yZWN0PjxyZWN0IHg9Ijc3IiB5PSIzNCIgd2lkdGg9IjMiIGhlaWdodD0iMTAiIHJ4PSIxLjUiIGZpbGw9IiMxNTIzM2YiPjwvcmVjdD48Y2lyY2xlIGN4PSI2MS41IiBjeT0iMzIiIHI9IjIuNCIgZmlsbD0iIzE1MjMzZiI+PC9jaXJjbGU+PGNpcmNsZSBjeD0iNzguNSIgY3k9IjMyIiByPSIyLjQiIGZpbGw9IiMxNTIzM2YiPjwvY2lyY2xlPgo8Y2lyY2xlIGN4PSI3MCIgY3k9Ijc0IiByPSI0MyIgZmlsbD0iI0ZGNEQ0RCI+PC9jaXJjbGU+CjxlbGxpcHNlIGN4PSI3MCIgY3k9Ijg0IiByeD0iMjUiIHJ5PSIyNyIgZmlsbD0iI2ZmZiIgb3BhY2l0eT0iLjIiPjwvZWxsaXBzZT4KCjxjaXJjbGUgY3g9IjU4IiBjeT0iNjciIHI9IjExLjUiIGZpbGw9IiNmZmYiPjwvY2lyY2xlPjxjaXJjbGUgY3g9IjgyIiBjeT0iNjciIHI9IjExLjUiIGZpbGw9IiNmZmYiPjwvY2lyY2xlPgo8Y2lyY2xlIGN4PSI1OSIgY3k9IjY5IiByPSI1LjIiIGZpbGw9IiMxNTIzM2YiPjwvY2lyY2xlPjxjaXJjbGUgY3g9IjgzIiBjeT0iNjkiIHI9IjUuMiIgZmlsbD0iIzE1MjMzZiI+PC9jaXJjbGU+CjxjaXJjbGUgY3g9IjYxIiBjeT0iNjYuNSIgcj0iMS44IiBmaWxsPSIjZmZmIj48L2NpcmNsZT48Y2lyY2xlIGN4PSI4NSIgY3k9IjY2LjUiIHI9IjEuOCIgZmlsbD0iI2ZmZiI+PC9jaXJjbGU+CjxjaXJjbGUgY3g9IjQ2IiBjeT0iODAiIHI9IjUuNSIgZmlsbD0iI0ZGN0RBMCIgb3BhY2l0eT0iLjYiPjwvY2lyY2xlPjxjaXJjbGUgY3g9Ijk0IiBjeT0iODAiIHI9IjUuNSIgZmlsbD0iI0ZGN0RBMCIgb3BhY2l0eT0iLjYiPjwvY2lyY2xlPgo8cGF0aCBkPSJNNjAgODYgcTEwIDkgMjAgMCIgc3Ryb2tlPSIjMTUyMzNmIiBzdHJva2Utd2lkdGg9IjMuNiIgZmlsbD0ibm9uZSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIj48L3BhdGg+CjxnPjxyZWN0IHg9IjQwIiB5PSI5NiIgd2lkdGg9IjQ2IiBoZWlnaHQ9IjI0IiByeD0iMyIgZmlsbD0iIzE1MjMzZiI+PC9yZWN0PjxwYXRoIGQ9Ik00MCA5Nmw0Ni01djV6IiBmaWxsPSIjMTUyMzNmIj48L3BhdGg+PHBhdGggZD0iTTQ0IDkxbDggNCA4LTUgOCA0IDgtNSIgc3Ryb2tlPSIjZmZmIiBzdHJva2Utd2lkdGg9IjIiIGZpbGw9Im5vbmUiPjwvcGF0aD48cmVjdCB4PSI0NiIgeT0iMTAzIiB3aWR0aD0iMzQiIGhlaWdodD0iMTIiIHJ4PSIyIiBmaWxsPSIjZmZmIiBvcGFjaXR5PSIuMjUiPjwvcmVjdD48L2c+Cjwvc3ZnPg==\" alt=\"\" \/>\n  <div class=\"wrap\">\n    <div class=\"section-head reveal\">\n      <span class=\"band\" style=\"background:var(--video-soft);color:var(--video)\"><span class=\"bb\" style=\"background:var(--video)\">&#9654;<\/span> Free Video Lessons<\/span>\n      <h2 style=\"margin-top:18px\">Learn with <em style=\"color:var(--video)\">video<\/em><\/h2>\n      <p class=\"desc\">Watch TOEFL Primary walkthroughs on YouTube &#8212; listening practice, reading strategies and exam tips. New lessons are added regularly.<\/p>\n    <\/div>\n    <div class=\"video-cta reveal\">\n      <div class=\"vc-l\">\n        <span class=\"vc-ico\"><svg viewBox=\"0 0 24 24\"><path d=\"M23 7.5a3 3 0 0 0-2.1-2.1C19 5 12 5 12 5s-7 0-8.9.4A3 3 0 0 0 1 7.5 31 31 0 0 0 .6 12 31 31 0 0 0 1 16.5a3 3 0 0 0 2.1 2.1C5 19 12 19 12 19s7 0 8.9-.4a3 3 0 0 0 2.1-2.1A31 31 0 0 0 23.4 12 31 31 0 0 0 23 7.5zM9.8 15.3V8.7l5.7 3.3z\"\/><\/svg><\/span>\n        <div>\n          <b>TOEFL Primary playlist<\/b>\n          <span>18 free lessons on the All English 4U YouTube channel<\/span>\n        <\/div>\n      <\/div>\n      <a class=\"vc-btn\" href=\"https:\/\/www.youtube.com\/playlist?list=PLmmEx97WdP1TPMPqLCipSCX6HgRlMYF5p\" target=\"_blank\" rel=\"noopener\">\n        Open full playlist\n        <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M5 12h14M13 6l6 6-6 6\"\/><\/svg>\n      <\/a>\n    <\/div>\n    <div class=\"video-grid\" id=\"video-grid\"><\/div>\n  <\/div>\n<\/section>\n\n<!-- ============ FINAL CTA ============ -->\n<section class=\"section\" style=\"padding-top:20px\">\n  <div class=\"wrap\">\n    <div class=\"cta reveal\">\n      <img decoding=\"async\" class=\"section-char sc-cta\" src=\"data:image\/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNDAgMTQwIiBmaWxsPSJub25lIj4KPGVsbGlwc2UgY3g9IjcwIiBjeT0iMTI5IiByeD0iMjgiIHJ5PSI1LjUiIGZpbGw9InJnYmEoMCwwLDAsLjEyKSI+PC9lbGxpcHNlPgo8cmVjdCB4PSI1OCIgeT0iMTA4IiB3aWR0aD0iMjQiIGhlaWdodD0iOSIgcng9IjMiIGZpbGw9IiNFMEEyMUUiPjwvcmVjdD48cmVjdCB4PSI1MiIgeT0iMTE2IiB3aWR0aD0iMzYiIGhlaWdodD0iOSIgcng9IjQiIGZpbGw9IiNGMEI3MkUiPjwvcmVjdD4KPHJlY3QgeD0iNjYiIHk9IjkyIiB3aWR0aD0iOCIgaGVpZ2h0PSIxOCIgZmlsbD0iI0UwQTIxRSI+PC9yZWN0Pgo8cGF0aCBkPSJNNDQgNDBoNTJ2MjBhMjYgMjYgMCAwIDEtNTIgMHoiIGZpbGw9IiNGRkQ1NEEiPjwvcGF0aD4KPHBhdGggZD0iTTQ0IDQ0SDMyYTEwIDEwIDAgMCAwIDEyIDE0ek05NiA0NGgxMmExMCAxMCAwIDAgMS0xMiAxNHoiIHN0cm9rZT0iI0YwQjcyRSIgc3Ryb2tlLXdpZHRoPSI1IiBmaWxsPSJub25lIj48L3BhdGg+CjxjaXJjbGUgY3g9IjYyIiBjeT0iNTQiIHI9IjcuNSIgZmlsbD0iI2ZmZiI+PC9jaXJjbGU+PGNpcmNsZSBjeD0iNzgiIGN5PSI1NCIgcj0iNy41IiBmaWxsPSIjZmZmIj48L2NpcmNsZT4KPGNpcmNsZSBjeD0iNjMiIGN5PSI1NS41IiByPSIzLjUiIGZpbGw9IiMxNTIzM2YiPjwvY2lyY2xlPjxjaXJjbGUgY3g9Ijc5IiBjeT0iNTUuNSIgcj0iMy41IiBmaWxsPSIjMTUyMzNmIj48L2NpcmNsZT4KPHBhdGggZD0iTTYyIDY0IHE4IDcgMTYgMCIgc3Ryb2tlPSIjMTUyMzNmIiBzdHJva2Utd2lkdGg9IjMiIGZpbGw9Im5vbmUiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCI+PC9wYXRoPgo8Y2lyY2xlIGN4PSI1MiIgY3k9IjYwIiByPSI0IiBmaWxsPSIjRkY3REEwIiBvcGFjaXR5PSIuNiI+PC9jaXJjbGU+PGNpcmNsZSBjeD0iODgiIGN5PSI2MCIgcj0iNCIgZmlsbD0iI0ZGN0RBMCIgb3BhY2l0eT0iLjYiPjwvY2lyY2xlPgo8L3N2Zz4=\" alt=\"\" \/>\n      <h2>Start learning TOEFL Primary today<\/h2>\n      <p>Free video lessons are live now, with Step 1 and Step 2 practice on the way. No sign-up required.<\/p>\n      <div class=\"cta-actions\">\n        <a class=\"btn-white\" href=\"https:\/\/www.youtube.com\/playlist?list=PLmmEx97WdP1TPMPqLCipSCX6HgRlMYF5p\" target=\"_blank\" rel=\"noopener\">Watch the video lessons<\/a>\n        <a class=\"btn-outline\" href=\"#path\">View full learning path<\/a>\n      <\/div>\n    <\/div>\n  <\/div>\n<\/section>\n\n<!-- ============ FOOTER ============ -->\n<footer class=\"site-footer\">\n  <div class=\"wrap footer-grid\">\n    <div class=\"footer-brand\">\n      <span class=\"brand\"><img decoding=\"async\" class=\"mark\" src=\"https:\/\/allenglish4u.com\/wp-content\/uploads\/2026\/04\/Transparent-background-MacBook-Pro-cua-Hang.png\" alt=\"All English 4U logo\" \/><span>All English <b style=\"color:var(--blue)\">4U<\/b><\/span><\/span>\n      <p>Free English learning platform &#8212; Grammar, TOEFL, IELTS, Cambridge &amp; Dictation. Interactive exercises, video lessons, and real exam practice.<\/p>\n      <div class=\"footer-social\">\n        <a href=\"https:\/\/www.youtube.com\/@AllEnglish4U?sub_confirmation=1\" aria-label=\"YouTube\" target=\"_blank\" rel=\"noopener\"><svg viewBox=\"0 0 24 24\"><path d=\"M23 7.5a3 3 0 0 0-2.1-2.1C19 5 12 5 12 5s-7 0-8.9.4A3 3 0 0 0 1 7.5 31 31 0 0 0 .6 12 31 31 0 0 0 1 16.5a3 3 0 0 0 2.1 2.1C5 19 12 19 12 19s7 0 8.9-.4a3 3 0 0 0 2.1-2.1A31 31 0 0 0 23.4 12 31 31 0 0 0 23 7.5zM9.8 15.3V8.7l5.7 3.3z\"\/><\/svg><\/a>\n        <a href=\"https:\/\/www.facebook.com\/AllEnglish4U\" aria-label=\"Facebook\" target=\"_blank\" rel=\"noopener\"><svg viewBox=\"0 0 24 24\"><path d=\"M22 12a10 10 0 1 0-11.6 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.2c-1.2 0-1.6.8-1.6 1.6V12h2.7l-.4 2.9h-2.3v7A10 10 0 0 0 22 12z\"\/><\/svg><\/a>\n      <\/div>\n    <\/div>\n    <div class=\"footer-col\">\n      <h5>Courses<\/h5>\n      <a href=\"https:\/\/allenglish4u.com\/grammar\/\">Grammar<\/a>\n      <a href=\"https:\/\/allenglish4u.com\/toefl\/\">TOEFL<\/a>\n      <a href=\"https:\/\/allenglish4u.com\/ielts\/\">IELTS<\/a>\n      <a href=\"https:\/\/allenglish4u.com\/cambridge\/\">Cambridge<\/a>\n      <a href=\"https:\/\/allenglish4u.com\/celpip\/\">CELPIP<\/a>\n      <a href=\"https:\/\/allenglish4u.com\/dictation\/\">Dictation<\/a>\n    <\/div>\n    <div class=\"footer-col\">\n      <h5>Resources<\/h5>\n      \n      <a href=\"https:\/\/allenglish4u.com\/contact\/\">Contact<\/a>\n      <a href=\"https:\/\/allenglish4u.com\/privacy-policy\/\">Privacy Policy<\/a>\n      <a href=\"https:\/\/allenglish4u.com\/\">Home<\/a>\n    <\/div>\n    <div class=\"footer-col news\">\n      <h5>Stay updated<\/h5>\n      <p style=\"font-size:14px;color:rgba(255,255,255,.6);margin:0 0 14px\">Get free English tips &amp; new lessons straight to your inbox.<\/p>\n      <input type=\"email\" placeholder=\"you@email.com\" aria-label=\"Email\" \/>\n      <button type=\"button\">Join &#8594;<\/button>\n    <\/div>\n  <\/div>\n  <div class=\"wrap footer-bottom\">\n    <span>&#169; 2026 All English 4U &#183; TOEFL Primary Resources &#183; all materials for non-commercial educational use.<\/span>\n    <span><a href=\"https:\/\/allenglish4u.com\/privacy-policy\/\">Privacy<\/a> &#183; <a href=\"https:\/\/allenglish4u.com\/contact\/\">Contact<\/a><\/span>\n  <\/div>\n<\/footer>\n\n<script>eval(atob('Ci8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICBBbGwgRW5nbGlzaCA0VSBcdTIwMTQgVE9FRkwgUHJpbWFyeSBodWIgIFx1MDBCNyAgZGF0YSArIHJlbmRlcgogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgIFx1MjUwQ1x1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUwMFx1MjUxMAogICBcdTI1MDIgIENcdTAwQzFDSCBUSFx1MDBDQU0gTlx1MUVEOEkgRFVORyAoclx1MUVBNXQgXHUwMTExXHUwMUExbiBnaVx1MUVBM24pICAgICAgICAgICAgICAgICAgICAgICAgIFx1MjUwMgogICBcdTI1MDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcdTI1MDIKICAgXHUyNTAyICBcdTIwMjIgVGhcdTAwRUFtIDEgcXV5XHUxRUMzbiBzXHUwMEUxY2ggIFx1MjE5MiB0aFx1MDBFQW0gMSBvYmplY3Qgdlx1MDBFMG8gU1RFUDFfU0VSSUVTIC8gICBcdTI1MDIKICAgXHUyNTAyICAgIFNURVAyX1NFUklFUyAvIFNQRUFLSU5HX1NFUklFUyBiXHUwMEVBbiBkXHUwMUIwXHUxRURCaS4gICAgICAgICAgICAgICAgXHUyNTAyCiAgIFx1MjUwMiAgXHUyMDIyIFRoXHUwMEVBbSAxIHZpZGVvICAgICAgIFx1MjE5MiB0aFx1MDBFQW0gMSBvYmplY3Qge2lkLCB0aXRsZSwgdGFnc30gICAgXHUyNTAyCiAgIFx1MjUwMiAgICB2XHUwMEUwbyBtXHUxRUEzbmcgVklERU9TLiAoaWQgPSBtXHUwMEUzIHZpZGVvIFlvdVR1YmUsIHZkIGliT0o1NmRHYm5NKVx1MjUwMgogICBcdTI1MDIgIFx1MjAyMiBHXHUxRUFGbiBsaW5rIGJcdTAwRTBpIFx1MDExMVx1MDBFMyBjXHUwMEYzICBcdTIxOTIgXHUwMTExaVx1MUVDMW4gVVJMIHZcdTAwRTBvIHRoYW0gc1x1MUVEMSBsaW5rcyBjXHUxRUU3YSBSTCgpXHUyNTAyCiAgIFx1MjUwMiAgICB2XHUwMEVEIGRcdTFFRTU6IFJMKDQsIHsgcjE6IEJBU0UrIi8uLi4iLCBsMTogQkFTRSsiLy4uLiIgfSkgICAgICAgXHUyNTAyCiAgIFx1MjUwMiAgICByID0gUmVhZGluZywgbCA9IExpc3RlbmluZywgc1x1MUVEMSA9IHNcdTFFRDEgdGhcdTFFRTkgdFx1MUVGMSB0ZXN0LiAgICAgICAgXHUyNTAyCiAgIFx1MjUwMiAgXHUyMDIyIFRyXHUxRUExbmcgdGhcdTAwRTFpOiAibGl2ZSIgKFx1MDExMWFuZyBjaFx1MUVBMXkpIFx1MDBCNyAicHJvZyIgKFx1MDExMWFuZyBsXHUwMEUwbSkgXHUwMEI3ICAgICBcdTI1MDIKICAgXHUyNTAyICAgICJzb29uIiAoc1x1MUVBRnAgY1x1MDBGMykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFx1MjUwMgogICBcdTI1MTRcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MDBcdTI1MTgKKi8KY29uc3QgQkFTRSA9ICJodHRwczovL2FsbGVuZ2xpc2g0dS5jb20iOwpjb25zdCBQTEFZTElTVCA9ICJodHRwczovL3d3dy55b3V0dWJlLmNvbS9wbGF5bGlzdD9saXN0PVBMbW1FeDk3V2RQMVRQTVBxTENpcFNDWDZIZ1JsTVlGNXAiOwpjb25zdCB5dFRodW1iID0gaWQgPT4gYGh0dHBzOi8vaS55dGltZy5jb20vdmkvJHtpZH0vaHFkZWZhdWx0LmpwZ2A7CmNvbnN0IHl0V2F0Y2ggPSBpZCA9PiBgaHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g\/dj0ke2lkfSZsaXN0PVBMbW1FeDk3V2RQMVRQTVBxTENpcFNDWDZIZ1JsTVlGNXBgOwoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgIElDT05TCiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwpjb25zdCBhcnJvd1N2ZyA9ICc8c3ZnIGNsYXNzPSJhcnIiIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMi40IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik01IDEyaDE0TTEzIDZsNiA2LTYgNiIvPjwvc3ZnPic7CmNvbnN0IGxvY2tTdmcgID0gJzxzdmcgY2xhc3M9ImxvY2siIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMi4yIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxyZWN0IHg9IjUiIHk9IjExIiB3aWR0aD0iMTQiIGhlaWdodD0iMTAiIHJ4PSIyIi8+PHBhdGggZD0iTTggMTFWN2E0IDQgMCAwIDEgOCAwdjQiLz48L3N2Zz4nOwpjb25zdCBpY29IZWFkcGhvbmVzID0gJzxzdmcgY2xhc3M9InRsLWljbyIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik0zIDE0di0yYTkgOSAwIDAgMSAxOCAwdjIiLz48cmVjdCB4PSIzIiB5PSIxMyIgd2lkdGg9IjQuMiIgaGVpZ2h0PSI3IiByeD0iMS42Ii8+PHJlY3QgeD0iMTYuOCIgeT0iMTMiIHdpZHRoPSI0LjIiIGhlaWdodD0iNyIgcng9IjEuNiIvPjwvc3ZnPic7CmNvbnN0IGljb0Jvb2sgPSAnPHN2ZyBjbGFzcz0idGwtaWNvIiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBhdGggZD0iTTMgNS41QTIuNSAyLjUgMCAwIDEgNS41IDNIMTF2MTZINS41QTIuNSAyLjUgMCAwIDAgMyAyMS41eiIvPjxwYXRoIGQ9Ik0yMSA1LjVBMi41IDIuNSAwIDAgMCAxOC41IDNIMTN2MTZoNS41YTIuNSAyLjUgMCAwIDEgMi41IDIuNXoiLz48L3N2Zz4nOwpjb25zdCBpY29Xb3JkID0gJzxzdmcgY2xhc3M9InRsLWljbyIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxjaXJjbGUgY3g9IjQuNSIgY3k9IjYiIHI9IjEiLz48Y2lyY2xlIGN4PSI0LjUiIGN5PSIxMiIgcj0iMSIvPjxjaXJjbGUgY3g9IjQuNSIgY3k9IjE4IiByPSIxIi8+PHBhdGggZD0iTTkgNmgxMU05IDEyaDExTTkgMThoNyIvPjwvc3ZnPic7CmNvbnN0IGljb0dyYW1tYXIgPSAnPHN2ZyBjbGFzcz0idGwtaWNvIiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBhdGggZD0iTTMgMTggOCA2bDUgMTIiLz48cGF0aCBkPSJNNC41IDE0aDciLz48cGF0aCBkPSJNMTUgMTQuNWwyLjUgMi41TDIzIDExLjUiLz48L3N2Zz4nOwpjb25zdCBpY29EaWN0YXRpb24gPSAnPHN2ZyBjbGFzcz0idGwtaWNvIiB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjIiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBhdGggZD0iTTMgOXY2TTYgN3YxMCIvPjxwYXRoIGQ9Ik0xMiAyMGg5Ii8+PHBhdGggZD0iTTE2LjUgNC41YTIuMSAyLjEgMCAwIDEgMyAzTDEwIDE3bC00IDEgMS00eiIvPjwvc3ZnPic7CmNvbnN0IGljb1NwZWFrID0gJzxzdmcgY2xhc3M9InRsLWljbyIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik0yMSAxMS41YTguNCA4LjQgMCAwIDEtMTIuNCA3LjRMMyAyMC41bDEuNi01LjRBOC40IDguNCAwIDEgMSAyMSAxMS41eiIvPjxwYXRoIGQ9Ik04LjUgMTJoLjAxTTEyIDEyaC4wMU0xNS41IDEyaC4wMSIvPjwvc3ZnPic7CmNvbnN0IHBsYXlTdmcgPSAnPHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9ImN1cnJlbnRDb2xvciI+PHBhdGggZD0iTTggNXYxNGwxMS03eiIvPjwvc3ZnPic7Ci8vIHBsYXlmdWwgbGV2ZWwgbWFzY290cwpjb25zdCBpY29TZWVkID0gJzxzdmcgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIxLjkiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBhdGggZD0iTTEyIDIyVjEyIi8+PHBhdGggZD0iTTEyIDEyQzEyIDggOSA1IDQgNWMwIDQgMyA3IDggN3oiLz48cGF0aCBkPSJNMTIgMTNjMC0zLjUgMi42LTYgNy02IDAgMy42LTIuNyA2LTcgNnoiLz48L3N2Zz4nOwpjb25zdCBpY29UcmVlID0gJzxzdmcgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIxLjkiIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCI+PHBhdGggZD0iTTEyIDIydi01Ii8+PHBhdGggZD0iTTEyIDE3YTUgNSAwIDAgMCA1LTUgNSA1IDAgMCAwLTEtMyA0IDQgMCAwIDAtOCAwIDUgNSAwIDAgMC0xIDMgNSA1IDAgMCAwIDUgNXoiLz48L3N2Zz4nOwpjb25zdCBpY29NaWMgPSAnPHN2ZyB2aWV3Qm94PSIwIDAgMjQgMjQiIGZpbGw9Im5vbmUiIHN0cm9rZT0iY3VycmVudENvbG9yIiBzdHJva2Utd2lkdGg9IjEuOSIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtbGluZWpvaW49InJvdW5kIj48cmVjdCB4PSI5IiB5PSIyIiB3aWR0aD0iNiIgaGVpZ2h0PSIxMiIgcng9IjMiLz48cGF0aCBkPSJNNSAxMWE3IDcgMCAwIDAgMTQgME0xMiAxOHY0Ii8+PC9zdmc+JzsKY29uc3QgaWNvTmV4dCA9ICc8c3ZnIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSJjdXJyZW50Q29sb3IiIHN0cm9rZS13aWR0aD0iMS45IiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiPjxwYXRoIGQ9Ik0xMyA1bDcgNy03IDdNNSA1bDcgNy03IDciLz48L3N2Zz4nOwoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgIERBVEEKICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCmNvbnN0IFNUQVRVU19URVhUID0geyBsaXZlOiAiTGl2ZSBub3ciLCBwcm9nOiAiSW4gcHJvZ3Jlc3MiLCBzb29uOiAiQ29taW5nIHNvb24iIH07CgovKiBoZWxwZXI6IGJ1aWxkIGEgYm9vayBvZiBgY291bnRgIHRlc3RzLCBlYWNoIHdpdGggdGhlIDUgVE9FRkwgUHJpbWFyeSBwYXJ0czoKICAgV29yZCBsaXN0IFx1MDBCNyBHcmFtbWFyIFx1MDBCNyBSZWFkaW5nIFx1MDBCNyBMaXN0ZW5pbmcgXHUwMEI3IERpY3RhdGlvbi4gKi8KY29uc3QgUEFSVFMgPSBbCiAgWyJXb3JkIGxpc3QiLCBpY29Xb3JkLCAidyJdLAogIFsiR3JhbW1hciIsICAgaWNvR3JhbW1hciwgImciXSwKICBbIlJlYWRpbmciLCAgIGljb0Jvb2ssICJyIl0sCiAgWyJMaXN0ZW5pbmciLCBpY29IZWFkcGhvbmVzLCAibCJdLApdOwpjb25zdCBVTkxPQ0tfQUxMID0gZmFsc2U7CmNvbnN0IHNsdWdpZnkgPSBzID0+IHMudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bXmEtejAtOV0rL2csICItIikucmVwbGFjZSgvXi0rfC0rJC9nLCAiIik7CmNvbnN0IEJPT0sgPSAoY291bnQsIHNsdWcsIGxpbmtzID0ge30pID0+IEFycmF5LmZyb20oeyBsZW5ndGg6IGNvdW50IH0sIChfLCBpKSA9PiB7CiAgY29uc3QgbiA9IGkgKyAxOwogIHJldHVybiB7IG4sIHBhcnRzOiBQQVJUUy5tYXAoKFtsYWJlbCwgaWNvLCBrZXldKSA9PiB7CiAgICBsZXQgdXJsID0gbGlua3Nba2V5ICsgbl0gfHwgbnVsbDsKICAgIGlmICghdXJsICYmIFVOTE9DS19BTEwgJiYgc2x1ZykgdXJsID0gQkFTRSArICIvIiArIHNsdWcgKyAiLXRlc3QtIiArIG4gKyAiLSIgKyBzbHVnaWZ5KGxhYmVsKSArICIvIjsKICAgIHJldHVybiB7IGxhYmVsLCBpY28sIHVybCB9OwogIH0pIH07Cn0pOwoKY29uc3QgQk9PS19TVEFUUyA9IFsKICB7IG46ICIzIiwgbGFiZWw6ICJGdWxsIHRlc3RzIiB9LAogIHsgbjogIjQiLCBsYWJlbDogIlBhcnRzIGVhY2giIH0sCiAgeyBuOiAiMTIiLCBsYWJlbDogIkFjdGl2aXRpZXMiIH0sCl07CmNvbnN0IEJPT0tfU1RBVFM0ID0gWwogIHsgbjogIjQiLCBsYWJlbDogIkZ1bGwgdGVzdHMiIH0sCiAgeyBuOiAiNCIsIGxhYmVsOiAiUGFydHMgZWFjaCIgfSwKICB7IG46ICIxNiIsIGxhYmVsOiAiQWN0aXZpdGllcyIgfSwKXTsKCi8qIC0tLS0tLS0tLS0gVE9FRkwgUHJpbWFyeSBcdTAwQjcgU1RFUCAxIC0tLS0tLS0tLS0gKi8KY29uc3QgU1RFUDFfU0VSSUVTID0gWwogIHsgdGl0bGU6ICJTdGVwIDEgXHUyMDE0IEJvb2sgMSIsIHN0YXR1czogInByb2ciLCBzdGF0dXNMYWJlbDogIk1hdGVyaWFscyByZWFkeSBcdTAwQjcgb25saW5lIHRlc3RzIGNvbWluZyIsCiAgICBibHVyYjogIlRPRUZMIFByaW1hcnkgU3RlcCAxIEJvb2sgMSBcdTIwMTQgNCBmdWxsIHRlc3RzLiBFYWNoIHRlc3QgaGFzIFdvcmQgbGlzdCwgR3JhbW1hciwgUmVhZGluZyBhbmQgTGlzdGVuaW5nLCB3aXRoIGF1ZGlvIHNjcmlwdHMgYW5kIGFuc3dlciBrZXlzLiIsCiAgICBzdGF0czogQk9PS19TVEFUUzQsIGJvb2s6IEJPT0soNCwgInRvZWZsLXN0ZXAxLWJvb2sxIiwgeyB3MTogQkFTRSArICIvdG9lZmwtc3RlcC0xLWJvb2stMS13b3JkLWxpc3QvIiwgZzE6IEJBU0UgKyAiL3RvZWZsLXN0ZXAtMS1ib29rLTEtZ3JhbW1hci8iLCByMTogQkFTRSArICIvdG9lZmwtc3RlcC0xLWJvb2stMS1yZWFkaW5nLyIsIGwxOiBCQVNFICsgIi90b2VmbC1zdGVwLTEtYm9vay0xLWxpc3RlbmluZy8iLCAgbDI6IEJBU0UgKyAiL3RvZWZsLXN0ZXAtMS1ib29rLTEtdW5pdC0yLWxpc3RlbmluZy8iLCBsMzogQkFTRSArICIvdG9lZmwtc3RlcC0xLWJvb2stMS11bml0LTMtbGlzdGVuaW5nLyIsIGw0OiBCQVNFICsgIi90b2VmbC1zdGVwLTEtYm9vay0xLXVuaXQtNC1saXN0ZW5pbmcvIiwgdzI6IEJBU0UgKyAiL3RvZWZsLXN0ZXAtMS1ib29rLTEtdW5pdC0yLXdvcmQtbGlzdC8iLCBnMjogQkFTRSArICIvdG9lZmwtc3RlcC0xLWJvb2stMS11bml0LTItZ3JhbW1hci8iLCByMjogQkFTRSArICIvdG9lZmwtc3RlcC0xLWJvb2stMS11bml0LTItcmVhZGluZy8iLCB3MzogQkFTRSArICIvdG9lZmwtc3RlcC0xLWJvb2stMS11bml0LTMtd29yZC1saXN0LyIsIGczOiBCQVNFICsgIi90b2VmbC1zdGVwLTEtYm9vay0xLXVuaXQtMy1ncmFtbWFyLyIsIHIzOiBCQVNFICsgIi90b2VmbC1zdGVwLTEtYm9vay0xLXVuaXQtMy1yZWFkaW5nLyIsIHc0OiBCQVNFICsgIi90b2VmbC1zdGVwLTEtYm9vay0xLXVuaXQtNC13b3JkLWxpc3QvIiwgZzQ6IEJBU0UgKyAiL3RvZWZsLXN0ZXAtMS1ib29rLTEtdW5pdC00LWdyYW1tYXIvIiwgcjQ6IEJBU0UgKyAiL3RvZWZsLXN0ZXAtMS1ib29rLTEtdW5pdC00LXJlYWRpbmcvIix9KSB9LAogIHsgdGl0bGU6ICJTdGVwIDEgXHUyMDE0IEJvb2sgMiIsIHN0YXR1czogInByb2ciLCBzdGF0dXNMYWJlbDogIk1hdGVyaWFscyByZWFkeSBcdTAwQjcgb25saW5lIHRlc3RzIGNvbWluZyIsCiAgICBibHVyYjogIlRPRUZMIFByaW1hcnkgU3RlcCAxIEJvb2sgMiBcdTIwMTQgNCBmdWxsIHRlc3RzIHdpdGggdGhlIHNhbWUgZm91ciBwYXJ0cywgcGx1cyBhdWRpbyBzY3JpcHRzIGFuZCBhbnN3ZXIga2V5cy4iLAogICAgc3RhdHM6IEJPT0tfU1RBVFM0LCBib29rOiBCT09LKDQsICJ0b2VmbC1zdGVwMS1ib29rMiIsIHsgdzE6IEJBU0UgKyAiL3RvZWZsLXN0ZXAtMS1ib29rLTItd29yZC1saXN0LyIsIGcxOiBCQVNFICsgIi90b2VmbC1zdGVwLTEtYm9vay0yLWdyYW1tYXIvIiwgcjE6IEJBU0UgKyAiL3RvZWZsLXN0ZXAtMS1ib29rLTItcmVhZGluZy8iLCBsMTogQkFTRSArICIvdG9lZmwtc3RlcC0xLWJvb2stMi1saXN0ZW5pbmcvIiwgdzI6IEJBU0UgKyAiL3RvZWZsLXN0ZXAtMS1ib29rLTItdGVzdC0yLXdvcmQtbGlzdC8iLCBnMjogQkFTRSArICIvdG9lZmwtc3RlcC0xLWJvb2stMi10ZXN0LTItZ3JhbW1hci8iLCByMjogQkFTRSArICIvdG9lZmwtc3RlcC0xLWJvb2stMi10ZXN0LTItcmVhZGluZy8iLCBsMjogQkFTRSArICIvdG9lZmwtc3RlcC0xLWJvb2stMi11bml0LTItbGlzdGVuaW5nLyIsIHczOiBCQVNFICsgIi90b2VmbC1zdGVwLTEtYm9vay0yLXRlc3QtMy13b3JkLWxpc3QvIiwgZzM6IEJBU0UgKyAiL3RvZWZsLXN0ZXAtMS1ib29rLTItdGVzdC0zLWdyYW1tYXIvIiwgcjM6IEJBU0UgKyAiL3RvZWZsLXN0ZXAtMS1ib29rLTItdGVzdC0zLXJlYWRpbmcvIiwgbDM6IEJBU0UgKyAiL3RvZWZsLXN0ZXAtMS1ib29rLTItdW5pdC0zLWxpc3RlbmluZy8iLCB3NDogQkFTRSArICIvdG9lZmwtc3RlcC0xLWJvb2stMi10ZXN0LTQtd29yZC1saXN0LyIsIGc0OiBCQVNFICsgIi90b2VmbC1zdGVwLTEtYm9vay0yLXRlc3QtNC1ncmFtbWFyLyIsIHI0OiBCQVNFICsgIi90b2VmbC1zdGVwLTEtYm9vay0yLXRlc3QtNC1yZWFkaW5nLyIsIGw0OiBCQVNFICsgIi90b2VmbC1zdGVwLTEtYm9vay0yLXVuaXQtNC1saXN0ZW5pbmcvIiB9KSB9LAogIHsgdGl0bGU6ICJTdGVwIDEgXHUyMDE0IEJvb2sgMyIsIHN0YXR1czogInByb2ciLCBzdGF0dXNMYWJlbDogIk1hdGVyaWFscyByZWFkeSBcdTAwQjcgb25saW5lIHRlc3RzIGNvbWluZyIsCiAgICBibHVyYjogIlRPRUZMIFByaW1hcnkgU3RlcCAxIEJvb2sgMyBcdTIwMTQgNCBmdWxsIHRlc3RzIHdpdGggdGhlIHNhbWUgZm91ciBwYXJ0cywgcGx1cyBhdWRpbyBzY3JpcHRzIGFuZCBhbnN3ZXIga2V5cy4iLAogICAgc3RhdHM6IEJPT0tfU1RBVFM0LCBib29rOiBCT09LKDQsICJ0b2VmbC1zdGVwMS1ib29rMyIsIHsgbDE6IEJBU0UgKyAiL3RvZWZsLXN0ZXAtMS1ib29rLTMtbGlzdGVuaW5nLyIsIGwyOiBCQVNFICsgIi90b2VmbC1zdGVwLTEtYm9vay0zLXVuaXQtMi1saXN0ZW5pbmcvIiwgbDM6IEJBU0UgKyAiL3RvZWZsLXN0ZXAtMS1ib29rLTMtdW5pdC0zLWxpc3RlbmluZy8iLCBsNDogQkFTRSArICIvdG9lZmwtc3RlcC0xLWJvb2stMy11bml0LTQtbGlzdGVuaW5nLyIsIHcxOiBCQVNFICsgIi90b2VmbC1zdGVwLTEtYm9vay0zLXdvcmQtbGlzdC8iLCB3MjogQkFTRSArICIvdG9lZmwtc3RlcC0xLWJvb2stMy11bml0LTItd29yZC1saXN0LyIsIHczOiBCQVNFICsgIi90b2VmbC1zdGVwLTEtYm9vay0zLXVuaXQtMy13b3JkLWxpc3QvIiwgdzQ6IEJBU0UgKyAiL3RvZWZsLXN0ZXAtMS1ib29rLTMtdW5pdC00LXdvcmQtbGlzdC8iLCBnMTogQkFTRSArICIvdG9lZmwtc3RlcC0xLWJvb2stMy1ncmFtbWFyLyIsIGcyOiBCQVNFICsgIi90b2VmbC1zdGVwLTEtYm9vay0zLXVuaXQtMi1ncmFtbWFyLyIsIGczOiBCQVNFICsgIi90b2VmbC1zdGVwLTEtYm9vay0zLXVuaXQtMy1ncmFtbWFyLyIsIGc0OiBCQVNFICsgIi90b2VmbC1zdGVwLTEtYm9vay0zLXVuaXQtNC1ncmFtbWFyLyIsIHIxOiBCQVNFICsgIi90b2VmbC1zdGVwLTEtYm9vay0zLXJlYWRpbmcvIiwgcjI6IEJBU0UgKyAiL3RvZWZsLXN0ZXAtMS1ib29rLTMtdW5pdC0yLXJlYWRpbmcvIiwgcjM6IEJBU0UgKyAiL3RvZWZsLXN0ZXAtMS1ib29rLTMtdW5pdC0zLXJlYWRpbmcvIiwgcjQ6IEJBU0UgKyAiL3RvZWZsLXN0ZXAtMS1ib29rLTMtdW5pdC00LXJlYWRpbmcvIiB9KSB9LApdOwoKLyogLS0tLS0tLS0tLSBUT0VGTCBQcmltYXJ5IFx1MDBCNyBTVEVQIDIgLS0tLS0tLS0tLSAqLwpjb25zdCBTVEVQMl9TRVJJRVMgPSBbCiAge3RpdGxlOiAiU3RlcCAyIFx1MjAxNCBQcmFjdGljZSBUZXN0cyIsIHN0YXR1czogInByb2ciLCBzdGF0dXNMYWJlbDogIk1hdGVyaWFscyByZWFkeSBcdTAwQjcgb25saW5lIHRlc3RzIGNvbWluZyIsCiAgICBibHVyYjogIlRPRUZMIFByaW1hcnkgU3RlcCAyIFx1MjAxNCAzIGZ1bGwgdGVzdHMgZm9yIHN0cm9uZ2VyIGxlYXJuZXJzLiBFYWNoIHRlc3QgaGFzIFdvcmQgbGlzdCwgR3JhbW1hciwgUmVhZGluZyBhbmQgTGlzdGVuaW5nLCB3aXRoIGF1ZGlvIHNjcmlwdHMgYW5kIGFuc3dlciBrZXlzLiIsCiAgICBzdGF0czogQk9PS19TVEFUUywgYm9vazogQk9PSygzLCAidG9lZmwtc3RlcDIiLCB7IGwxOiBCQVNFICsgIi90b2VmbC1wcmltYXJ5LXN0ZXAtMi1wcmFjdGljZS10ZXN0LTEtbGlzdGVuaW5nLyIsIGwyOiBCQVNFICsgIi90b2VmbC1wcmltYXJ5LXN0ZXAtMi1wcmFjdGljZS10ZXN0LTItbGlzdGVuaW5nLyIgfSl9LApdOwoKCi8qIC0tLS0tLS0tLS0gVklERU8gTEVTU09OUyAtLS0tLS0tLS0tICovCmNvbnN0IFBMQVlMSVNUX0NPVU5UID0gMTg7CmNvbnN0IFZJREVPUyA9IFsKICB7IGlkOiAiaWJPSjU2ZEdibk0iLCB0aXRsZTogIlRPRUZMIFByaW1hcnkgXHUyMDE0IExpc3RlbmluZyBQcmFjdGljZSAoTGVzc29uIDEpIiwgdGFnczogWyJMaXN0ZW5pbmciLCAiTGVzc29uIDEiXSB9LApdOwoKLyogLS0tLS0tLS0tLSBsZWFybmluZyBsYWRkZXIgLS0tLS0tLS0tLSAqLwpjb25zdCBTVEFJUlMgPSBbCiAgeyBsdmw6ICJBMSIsICAgICBuYW1lOiAiU3RlcCAxIiwgICBjb2xvcjogInZhcigtLXN0ZXAxKSIsIHdobzogIlJlYWRpbmcgJiBMaXN0ZW5pbmciLCBzdGF0dXM6ICJsaXZlIiwgbGFiZWw6ICJMaXZlIG5vdyIsIHRhcmdldDogIiNzdGVwMSIgfSwKICB7IGx2bDogIkEyXHUyMDEzQjEiLCAgbmFtZTogIlN0ZXAgMiIsICAgY29sb3I6ICJ2YXIoLS1zdGVwMikiLCB3aG86ICJSZWFkaW5nICYgTGlzdGVuaW5nIiwgc3RhdHVzOiAicHJvZyIsIGxhYmVsOiAiSW4gcHJvZ3Jlc3MiLCB0YXJnZXQ6ICIjc3RlcDIiIH0sCiAgeyBsdmw6ICJXYXRjaCIsICBuYW1lOiAiVmlkZW9zIiwgICBjb2xvcjogInZhcigtLXZpZGVvKSIsIHdobzogIkZyZWUgbGVzc29ucyIsICAgICAgICAgc3RhdHVzOiAibGl2ZSIsIGxhYmVsOiAiTGl2ZSBub3ciLCAgICB0YXJnZXQ6ICIjdmlkZW9zIiB9LApdOwoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgIFJFTkRFUgogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KZnVuY3Rpb24gcmVuZGVyU3RhaXJzKCkgewogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzdGFpcnMiKS5pbm5lckhUTUwgPSBTVEFJUlMubWFwKChzLCBpKSA9PiBgCiAgICA8YSBjbGFzcz0ic3RlcCByZXZlYWwiIGhyZWY9IiR7cy50YXJnZXR9IiBzdHlsZT0iLS1sYzoke3MuY29sb3J9OyB0cmFuc2l0aW9uLWRlbGF5OiR7aSAqIDcwfW1zIj4KICAgICAgPHNwYW4gY2xhc3M9Im51bSI+MCR7aSArIDF9PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0ibHZsIj4ke3MubHZsfTwvc3Bhbj4KICAgICAgPGg0PiR7cy5uYW1lfTwvaDQ+CiAgICAgIDxkaXYgY2xhc3M9IndobyI+JHtzLndob308L2Rpdj4KICAgICAgPHNwYW4gY2xhc3M9InN0ICR7cy5zdGF0dXN9Ij48aSBjbGFzcz0iZCI+PC9pPiR7cy5sYWJlbH08L3NwYW4+CiAgICA8L2E+YCkuam9pbigiIik7Cn0KCmZ1bmN0aW9uIHBhcGVyKHApIHsKICBpZiAocC51cmwpIHJldHVybiBgPGEgY2xhc3M9InRlc3QtbGluayIgaHJlZj0iJHtwLnVybH0iIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIj4ke3AuaWNvfTxzcGFuIGNsYXNzPSJ0bC1sYWJlbCI+JHtwLmxhYmVsfTwvc3Bhbj4ke2Fycm93U3ZnfTwvYT5gOwogIHJldHVybiBgPHNwYW4gY2xhc3M9InRlc3QtbGluayBsb2NrZWQiPiR7cC5pY299PHNwYW4gY2xhc3M9InRsLWxhYmVsIj4ke3AubGFiZWx9PC9zcGFuPiR7bG9ja1N2Z308L3NwYW4+YDsKfQoKZnVuY3Rpb24gcGFydExpbmsocCkgewogIGlmIChwLnVybCkgcmV0dXJuIGA8YSBjbGFzcz0icGFydC1saW5rIiBocmVmPSIke3AudXJsfSIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9vcGVuZXIiPiR7cC5pY299PHNwYW4gY2xhc3M9InRsLWxhYmVsIj4ke3AubGFiZWx9PC9zcGFuPjwvYT5gOwogIHJldHVybiBgPHNwYW4gY2xhc3M9InBhcnQtbGluayBsb2NrZWQiPiR7cC5pY299PHNwYW4gY2xhc3M9InRsLWxhYmVsIj4ke3AubGFiZWx9PC9zcGFuPiR7bG9ja1N2Z308L3NwYW4+YDsKfQoKZnVuY3Rpb24gc2VyaWVzQ2FyZChzLCBhY2NlbnQsIHNvZnQpIHsKICBjb25zdCBzdGF0dXNMYWJlbCA9IHMuc3RhdHVzTGFiZWwgfHwgU1RBVFVTX1RFWFRbcy5zdGF0dXNdOwogIGNvbnN0IHN0YXRzSHRtbCA9IHMuc3RhdHMKICAgID8gYDxkaXYgY2xhc3M9InNjLXN0YXRzIj4ke3Muc3RhdHMubWFwKHggPT4gYDxkaXYgY2xhc3M9ImtzIj48Yj4ke3gubn08L2I+PHNwYW4+JHt4LmxhYmVsfTwvc3Bhbj48L2Rpdj5gKS5qb2luKCIiKX08L2Rpdj5gCiAgICA6ICIiOwogIGNvbnN0IHN0YXJ0SHRtbCA9IHMuc3RhcnQKICAgID8gYDxhIGNsYXNzPSJidG4tbGcgYnRuLXByaW1hcnkgc2Mtc3RhcnQiIGhyZWY9IiR7cy5zdGFydC51cmx9IiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciI+JHtzLnN0YXJ0LmxhYmVsfSAke2Fycm93U3ZnfTwvYT5gCiAgICA6ICIiOwogIGxldCByaWdodDsKICBpZiAocy5ib29rKSB7CiAgICByaWdodCA9IGA8ZGl2IGNsYXNzPSJzYy1ib29rIj4ke3MuYm9vay5tYXAodCA9PiBgCiAgICAgIDxkaXYgY2xhc3M9InRlc3QtYmxvY2siPgogICAgICAgIDxzcGFuIGNsYXNzPSJ0Yi1uIj5UZXN0ICR7dC5uLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgIjAiKX08L3NwYW4+CiAgICAgICAgPGRpdiBjbGFzcz0idGItcGFydHMiPiR7dC5wYXJ0cy5tYXAocGFydExpbmspLmpvaW4oIiIpfTwvZGl2PgogICAgICA8L2Rpdj5gKS5qb2luKCIiKX08L2Rpdj5gOwogIH0gZWxzZSBpZiAocy50ZXN0cykgewogICAgcmlnaHQgPSBgPGRpdiBjbGFzcz0ic2MtdGVzdHMiPiR7cy50ZXN0cy5tYXAodCA9PiBgCiAgICAgIDxkaXYgY2xhc3M9InRlc3Qtcm93IiBzdHlsZT0iZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjI2cHggJHt0LnBhcGVycy5tYXAoKCkgPT4gIjFmciIpLmpvaW4oIiAiKX0iPgogICAgICAgIDxzcGFuIGNsYXNzPSJ0biI+MCR7dC5ufTwvc3Bhbj4KICAgICAgICAke3QucGFwZXJzLm1hcChwYXBlcikuam9pbigiIil9CiAgICAgIDwvZGl2PmApLmpvaW4oIiIpfTwvZGl2PmA7CiAgfSBlbHNlIHsKICAgIHJpZ2h0ID0gYDxkaXYgY2xhc3M9InNjLWl0ZW1zIj4ke3MuaXRlbXMubWFwKGl0ID0+IGA8c3BhbiBjbGFzcz0ic2MtaXRlbSI+JHtpdH08L3NwYW4+YCkuam9pbigiIil9PC9kaXY+YDsKICB9CiAgcmV0dXJuIGAKICAgIDxhcnRpY2xlIGNsYXNzPSJzZXJpZXMtY2FyZCByZXZlYWwke3Muc3RhdHVzID09PSAibGl2ZSIgPyAiIGlzLWxpdmUiIDogIiJ9IiBzdHlsZT0iLS1sYzoke2FjY2VudH07IC0tbGMtc29mdDoke3NvZnR9Ij4KICAgICAgPGRpdiBjbGFzcz0ic2MtaW5mbyI+CiAgICAgICAgPHNwYW4gY2xhc3M9InN0YXR1cy10YWcgJHtzLnN0YXR1c30iPjxpIGNsYXNzPSJkIj48L2k+JHtzdGF0dXNMYWJlbH08L3NwYW4+CiAgICAgICAgPGgzPiR7cy50aXRsZX08L2gzPgogICAgICAgIDxwPiR7cy5ibHVyYn08L3A+CiAgICAgICAgJHtzdGF0c0h0bWx9CiAgICAgICAgJHtzdGFydEh0bWx9CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJzYy1yaWdodCI+JHtyaWdodH08L2Rpdj4KICAgIDwvYXJ0aWNsZT5gOwp9CgpmdW5jdGlvbiByZW5kZXJTZXJpZXMoaWQsIGxpc3QsIGFjY2VudCwgc29mdCkgewogIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKS5pbm5lckhUTUwgPSBsaXN0Lm1hcChzID0+IHNlcmllc0NhcmQocywgYWNjZW50LCBzb2Z0KSkuam9pbigiIik7Cn0KCmZ1bmN0aW9uIHJlbmRlclZpZGVvcygpIHsKICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ2aWRlby1ncmlkIik7CiAgbGV0IGh0bWwgPSBWSURFT1MubWFwKCh2LCBpKSA9PiBgCiAgICA8YSBjbGFzcz0idmlkZW8tY2FyZCByZXZlYWwiIGhyZWY9IiR7eXRXYXRjaCh2LmlkKX0iIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIj4KICAgICAgPGRpdiBjbGFzcz0idmlkZW8tdGh1bWIiPgogICAgICAgIDxzcGFuIGNsYXNzPSJ2aWRlby1udW0iPiR7KGkgKyAxKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICIwIil9PC9zcGFuPgogICAgICAgIDxpbWcgc3JjPSIke3l0VGh1bWIodi5pZCl9IiBhbHQ9IiR7di50aXRsZX0iIGxvYWRpbmc9ImxhenkiIC8+CiAgICAgICAgPHNwYW4gY2xhc3M9InZpZGVvLXBsYXkiPiR7cGxheVN2Z308L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJ2aWRlby1tZXRhIj4KICAgICAgICA8aDQ+JHt2LnRpdGxlfTwvaDQ+CiAgICAgICAgPGRpdiBjbGFzcz0idmlkZW8tdGFncyI+JHsodi50YWdzIHx8IFtdKS5tYXAodCA9PiBgPHNwYW4+JHt0fTwvc3Bhbj5gKS5qb2luKCIiKX08L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2E+YCkuam9pbigiIik7CiAgY29uc3QgbW9yZSA9IFBMQVlMSVNUX0NPVU5UIC0gVklERU9TLmxlbmd0aDsKICBpZiAobW9yZSA+IDApIHsKICAgIGh0bWwgKz0gYAogICAgPGEgY2xhc3M9InZpZGVvLWNhcmQgdmlkZW8tbW9yZSByZXZlYWwiIGhyZWY9IiR7UExBWUxJU1R9IiB0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciI+CiAgICAgIDxkaXYgY2xhc3M9InZtLWlubmVyIj4KICAgICAgICA8c3BhbiBjbGFzcz0idm0taWNvIj4ke3BsYXlTdmd9PC9zcGFuPgogICAgICAgIDxiPiske21vcmV9IG1vcmUgbGVzc29uczwvYj4KICAgICAgICA8c3Bhbj5XYXRjaCB0aGUgZnVsbCBUT0VGTCBQcmltYXJ5IHBsYXlsaXN0IG9uIFlvdVR1YmU8L3NwYW4+CiAgICAgICAgPHNwYW4gY2xhc3M9InZtLWJ0biI+T3BlbiBwbGF5bGlzdCAke2Fycm93U3ZnfTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICA8L2E+YDsKICB9CiAgZWwuaW5uZXJIVE1MID0gaHRtbDsKfQoKLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgIElOVEVSQUNUSU9OUwogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KZnVuY3Rpb24gaW5pdEZpbHRlcnMoKSB7CiAgY29uc3QgYnV0dG9ucyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIi5mYiIpOwogIGNvbnN0IHNlY3Rpb25zID0gewogICAgc3RlcDE6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzdGVwMSIpLAogICAgc3RlcDI6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzdGVwMiIpLAogICAgdmlkZW9zOiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidmlkZW9zIiksCiAgfTsKICBjb25zdCB2ID0gUExBWUxJU1RfQ09VTlQsIHZsYWJlbCA9IHYgKyAiIGxlc3NvbnMiOwogIGNvbnN0IGNvdW50cyA9IHsKICAgIGFsbDogU1RFUDFfU0VSSUVTLmxlbmd0aCArIFNURVAyX1NFUklFUy5sZW5ndGggKyAiIHNlcmllcyBcdTAwQjcgIiArIHZsYWJlbCwKICAgIHN0ZXAxOiBTVEVQMV9TRVJJRVMubGVuZ3RoICsgIiBzZXJpZXMiLAogICAgc3RlcDI6IFNURVAyX1NFUklFUy5sZW5ndGggKyAiIHNlcmllcyIsCiAgICB2aWRlb3M6IHZsYWJlbCwKICB9OwogIGNvbnN0IGNvdW50RWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIuZmlsdGVycyAuY291bnQiKTsKICBjb3VudEVsLnRleHRDb250ZW50ID0gY291bnRzLmFsbDsKICBidXR0b25zLmZvckVhY2goYnRuID0+IGJ0bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICgpID0+IHsKICAgIGNvbnN0IGYgPSBidG4uZGF0YXNldC5mOwogICAgYnV0dG9ucy5mb3JFYWNoKGIgPT4gYi5jbGFzc0xpc3QudG9nZ2xlKCJhY3RpdmUiLCBiID09PSBidG4pKTsKICAgIE9iamVjdC5lbnRyaWVzKHNlY3Rpb25zKS5mb3JFYWNoKChba2V5LCBzZWNdKSA9PiBzZWMuY2xhc3NMaXN0LnRvZ2dsZSgiaGlkZSIsICEoZiA9PT0gImFsbCIgfHwgZiA9PT0ga2V5KSkpOwogICAgY291bnRFbC50ZXh0Q29udGVudCA9IGNvdW50c1tmXTsKICAgIHJldmVhbE5vdygpOwogIH0pKTsKfQoKZnVuY3Rpb24gaW5pdEhlYWRlcigpIHsKICBjb25zdCBoZWFkZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCIuc2l0ZS1oZWFkZXIiKTsKICBjb25zdCBvblNjcm9sbCA9ICgpID0+IGhlYWRlci5jbGFzc0xpc3QudG9nZ2xlKCJzY3JvbGxlZCIsIHdpbmRvdy5zY3JvbGxZID4gMTIpOwogIG9uU2Nyb2xsKCk7CiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsIG9uU2Nyb2xsLCB7IHBhc3NpdmU6IHRydWUgfSk7CiAgY29uc3QgdG9nZ2xlID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLm5hdi10b2dnbGUiKTsKICBjb25zdCBtbmF2ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiLm1vYmlsZS1uYXYiKTsKICBpZiAodG9nZ2xlKSB0b2dnbGUuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCAoKSA9PiBtbmF2LmNsYXNzTGlzdC50b2dnbGUoIm9wZW4iKSk7CiAgaWYgKG1uYXYpIG1uYXYucXVlcnlTZWxlY3RvckFsbCgiYSIpLmZvckVhY2goYSA9PiBhLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwgKCkgPT4gbW5hdi5jbGFzc0xpc3QucmVtb3ZlKCJvcGVuIikpKTsKfQoKbGV0IHJldmVhbE9ic2VydmVyOwpmdW5jdGlvbiBpbml0UmV2ZWFsKCkgewogIHJldmVhbE9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKChlbnRyaWVzKSA9PiB7CiAgICBlbnRyaWVzLmZvckVhY2goZSA9PiB7IGlmIChlLmlzSW50ZXJzZWN0aW5nKSB7IGUudGFyZ2V0LmNsYXNzTGlzdC5hZGQoImluIik7IHJldmVhbE9ic2VydmVyLnVub2JzZXJ2ZShlLnRhcmdldCk7IH0gfSk7CiAgfSwgeyB0aHJlc2hvbGQ6IDAuMSwgcm9vdE1hcmdpbjogIjBweCAwcHggLTQwcHggMHB4IiB9KTsKICByZXZlYWxOb3coKTsKfQpmdW5jdGlvbiByZXZlYWxOb3coKSB7CiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgiLnJldmVhbDpub3QoLmluKSIpLmZvckVhY2goZWwgPT4gcmV2ZWFsT2JzZXJ2ZXIub2JzZXJ2ZShlbCkpOwp9CgovKiAtLS0tIGJvb3QgLS0tLSAqLwpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgKCkgPT4gewogIHJlbmRlclN0YWlycygpOwogIHJlbmRlclNlcmllcygic3RlcDEtbGlzdCIsIFNURVAxX1NFUklFUywgInZhcigtLXN0ZXAxKSIsICJ2YXIoLS1zdGVwMS1zb2Z0KSIpOwogIHJlbmRlclNlcmllcygic3RlcDItbGlzdCIsIFNURVAyX1NFUklFUywgInZhcigtLXN0ZXAyKSIsICJ2YXIoLS1zdGVwMi1zb2Z0KSIpOwogIHJlbmRlclZpZGVvcygpOwogIGluaXRGaWx0ZXJzKCk7CiAgaW5pdEhlYWRlcigpOwogIGluaXRSZXZlYWwoKTsKfSk7Cgo='));<\/script>\n\n\n\n","protected":false},"excerpt":{"rendered":"<p>All English 4U Grammar IELTS TOEFL Cambridge CELPIP Dictation Contact Watch lessons Grammar IELTS TOEFL Cambridge CELPIP Dictation Contact TOEFL Primary &#183; For Young Learners Your first step into TOEFL A friendly TOEFL Primary pathway &#8212; Step 1 and Step 2 Reading &amp; Listening, plus free video lessons. Built for children, easy to follow. Watch [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"page-with-title","meta":{"footnotes":""},"class_list":["post-944","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/pages\/944","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/comments?post=944"}],"version-history":[{"count":42,"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/pages\/944\/revisions"}],"predecessor-version":[{"id":5972,"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/pages\/944\/revisions\/5972"}],"wp:attachment":[{"href":"https:\/\/allenglish4u.com\/vi\/wp-json\/wp\/v2\/media?parent=944"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}