{"id":600,"date":"2026-01-10T01:45:11","date_gmt":"2026-01-10T01:45:11","guid":{"rendered":"https:\/\/i-cte.org\/robot\/?p=600"},"modified":"2026-01-28T05:08:47","modified_gmt":"2026-01-28T05:08:47","slug":"ielts-listening-test-4","status":"publish","type":"post","link":"https:\/\/i-cte.org\/robot\/ielts-listening-test-4\/","title":{"rendered":"IELTs &#8211; Listening &#8211; Test 4"},"content":{"rendered":"\n<div id=\"icte-listening-test4\">\n\n  <!-- \u2705 TOP GREEN MENU -->\n  <nav class=\"icte-menu\" aria-label=\"ICTE Listening menu\">\n        <a href=\"https:\/\/i-cte.org\/robot\/ielts-listening-overview\/\">Overview<\/a>\n    <a href=\"https:\/\/i-cte.org\/robot\/topics\/ielts\/test-1\/\">Test 1<\/a>\n    <a href=\"https:\/\/i-cte.org\/robot\/ielts-listening-test-2\/\">Test 2<\/a>\n    <a href=\"https:\/\/i-cte.org\/robot\/ielts-listening-test-3\/\">Test 3<\/a>\n    <a href=\"https:\/\/i-cte.org\/robot\/ielts-listening-test-4\/\">Test 4<\/a>\n    <a href=\"https:\/\/i-cte.org\/robot\/ielts-reading-overview\/\">Reading<\/a>\n    <a href=\"https:\/\/i-cte.org\/robot\/ielts-speaking-overview\/\">Speaking<\/a>\n    <a href=\"https:\/\/i-cte.org\/robot\/ielts-writing-overview\/\">Writing<\/a>\n  <\/nav>\n\n  <!-- \u2705 GLOBAL CONTROLS -->\n  <section class=\"icte-ielts icte-ielts--top\" aria-label=\"Global controls\">\n    <header class=\"icte-ielts__intro\">\n      <h2 class=\"icte-ielts__title\">IELTS Listening \u2013 Test 4 (Sections 1\u20134)<\/h2>\n      <p class=\"icte-ielts__sub\">\n        Practice all 4 sections on one page. Use <strong>Check Answers<\/strong> in each section for feedback.\n      <\/p>\n    <\/header>\n\n    <section class=\"icte-ielts__panel\" aria-label=\"Voice controls\">\n      <div class=\"icte-ielts__panelHead\">\n        <h3 class=\"icte-ielts__h3\">Voices (used for all sections)<\/h3>\n        <div class=\"icte-ielts__headRight\">\n          <button class=\"icte-btn icte-btn--danger\" type=\"button\" data-action=\"stop-audio\">\u23f9 Stop Audio<\/button>\n          <span class=\"icte-loader\" data-el=\"synthesis-loader\" aria-hidden=\"true\"><\/span>\n        <\/div>\n      <\/div>\n\n      <div class=\"icte-ielts__row\" style=\"align-items:flex-start;\">\n        <div class=\"icte-ielts__control\" style=\"flex:1; min-width:240px;\">\n          <label><strong>Voice A<\/strong> (Speaker 1 \/ Narrator)<\/label>\n          <select data-el=\"voice-a\" aria-label=\"Select Voice A\">\n            <option value=\"\">Loading voices&#8230;<\/option>\n          <\/select>\n        <\/div>\n\n        <div class=\"icte-ielts__control\" style=\"flex:1; min-width:240px;\">\n          <label><strong>Voice B<\/strong> (Speaker 2)<\/label>\n          <select data-el=\"voice-b\" aria-label=\"Select Voice B\">\n            <option value=\"\">Loading voices&#8230;<\/option>\n          <\/select>\n        <\/div>\n\n        <div class=\"icte-ielts__score\" data-el=\"overallScoreBox\" aria-live=\"polite\"><\/div>\n      <\/div>\n\n      <div class=\"icte-ielts__btnRow\">\n        <button class=\"icte-btn icte-btn--ghost\" type=\"button\" data-action=\"scroll-sec1\">Go to Section 1<\/button>\n        <button class=\"icte-btn icte-btn--ghost\" type=\"button\" data-action=\"scroll-sec2\">Go to Section 2<\/button>\n        <button class=\"icte-btn icte-btn--ghost\" type=\"button\" data-action=\"scroll-sec3\">Go to Section 3<\/button>\n        <button class=\"icte-btn icte-btn--ghost\" type=\"button\" data-action=\"scroll-sec4\">Go to Section 4<\/button>\n      <\/div>\n    <\/section>\n  <\/section>\n\n  <!-- =========================\n       SECTION 1 (1\u201310)\n  ========================== -->\n  <section class=\"icte-ielts\" id=\"sec1\" data-section=\"s1\" aria-label=\"Section 1\">\n    <header class=\"icte-ielts__intro\">\n      <h2 class=\"icte-ielts__title\">Section 1 (Questions 1\u201310): Cycle tour leader \u2013 Applicant enquiry<\/h2>\n      <p class=\"icte-ielts__sub\">\n        Complete the notes below. Write <strong>ONE WORD AND\/OR A NUMBER<\/strong> for each answer.\n      <\/p>\n    <\/header>\n\n    <section class=\"icte-ielts__panel\" aria-label=\"Transcript S1\">\n      <div class=\"icte-ielts__panelHead\">\n        <h3 class=\"icte-ielts__h3\">Transcript (Section 1)<\/h3>\n        <div class=\"icte-ielts__headRight\">\n          <button class=\"icte-btn icte-btn--dark\" type=\"button\" data-action=\"toggle-transcript\">Show Transcript<\/button>\n        <\/div>\n      <\/div>\n      <div class=\"icte-ielts__reading\" data-el=\"transcript-area\" style=\"display:none;\"><\/div>\n\n      <div class=\"icte-ielts__btnRow icte-ielts__btnRow--tight\">\n        <button class=\"icte-btn icte-btn--info\" type=\"button\" data-action=\"play-audio\">\ud83d\udd0a Listen (Section 1)<\/button>\n        <a class=\"icte-link\" href=\"#q-s1\">Jump to questions \u2193<\/a>\n      <\/div>\n    <\/section>\n\n    <section class=\"icte-ielts__panel\" aria-label=\"Support S1\">\n      <div class=\"icte-ielts__panelHead\">\n        <h3 class=\"icte-ielts__h3\">Support<\/h3>\n        <div class=\"icte-ielts__headRight\">\n          <button class=\"icte-btn icte-btn--ghost\" type=\"button\" data-action=\"clear-support\">Clear<\/button>\n        <\/div>\n      <\/div>\n      <div class=\"icte-ielts__helper\" data-el=\"helper-area\" aria-live=\"polite\">\n        Click <strong>Summary<\/strong>, <strong>Main ideas<\/strong>, or <strong>Keywords<\/strong>.\n      <\/div>\n    <\/section>\n\n    <section class=\"icte-ielts__panel\" aria-label=\"Controls S1\">\n      <div class=\"icte-ielts__btnGrid\">\n        <button class=\"icte-btn icte-btn--primary\" type=\"button\" data-action=\"check\">Check Answers<\/button>\n        <button class=\"icte-btn icte-btn--dark\" type=\"button\" data-action=\"show\">\ud83d\udc40 Show Answers<\/button>\n        <button class=\"icte-btn icte-btn--dark\" type=\"button\" data-action=\"summary\">\ud83e\udde0 Summary<\/button>\n        <button class=\"icte-btn icte-btn--dark\" type=\"button\" data-action=\"main-ideas\">\ud83d\udccc Main ideas<\/button>\n        <button class=\"icte-btn icte-btn--dark\" type=\"button\" data-action=\"keywords\">\ud83d\udcda Keywords<\/button>\n        <button class=\"icte-btn icte-btn--ghost\" type=\"button\" data-action=\"reset\">Reset<\/button>\n      <\/div>\n      <div class=\"icte-ielts__row\" style=\"padding-top:0;\">\n        <div class=\"icte-ielts__score\" data-el=\"scoreBox\" aria-live=\"polite\"><\/div>\n      <\/div>\n    <\/section>\n\n    <section class=\"icte-ielts__panel\" id=\"q-s1\" aria-label=\"Questions 1-10\">\n      <div class=\"icte-ielts__panelHead\">\n        <h3 class=\"icte-ielts__h3\">Questions 1\u201310<\/h3>\n      <\/div>\n\n      <div class=\"icte-ielts__qArea\">\n        <div class=\"icte-q\">\n          <div class=\"icte-q__label\">Cycle tour leader: Applicant enquiry<\/div>\n          <div class=\"icte-note\">\n            <div><strong>Example<\/strong> Name: Margaret <strong>Smith<\/strong><\/div>\n            <div style=\"margin-top:.55rem;\"><strong>About the applicant:<\/strong><\/div>\n\n            <div>\u2022 wants a <span class=\"blank\">1 <input type=\"text\" data-q=\"1\" data-type=\"text\" placeholder=\"ONE WORD\" \/><\/span> job<\/div>\n            <div>\u2022 will soon start work as a <span class=\"blank\">2 <input type=\"text\" data-q=\"2\" data-type=\"text\" placeholder=\"ONE WORD\" \/><\/span><\/div>\n            <div>\u2022 has led cycle trips in <span class=\"blank\">3 <input type=\"text\" data-q=\"3\" data-type=\"text\" placeholder=\"ONE WORD\" \/><\/span><\/div>\n            <div>\u2022 is currently doing voluntary work with members of a <span class=\"blank\">4 <input type=\"text\" data-q=\"4\" data-type=\"text\" placeholder=\"ONE WORD\" \/><\/span> club<\/div>\n            <div>\u2022 available for five months from the 1st of <span class=\"blank\">5 <input type=\"text\" data-q=\"5\" data-type=\"text\" placeholder=\"ONE WORD\" \/><\/span><\/div>\n            <div>\u2022 can\u2019t eat <span class=\"blank\">6 <input type=\"text\" data-q=\"6\" data-type=\"text\" placeholder=\"ONE WORD\" \/><\/span><\/div>\n\n            <div style=\"margin-top:.55rem;\"><strong>Contact details:<\/strong><\/div>\n            <div>\u2022 address: 27 <span class=\"blank\">7 <input type=\"text\" data-q=\"7\" data-type=\"text\" placeholder=\"ONE WORD\" \/><\/span> Place, Dumfries<\/div>\n            <div>\u2022 postcode: <span class=\"blank\">8 <input type=\"text\" data-q=\"8\" data-type=\"text\" placeholder=\"LETTERS\/NUMBERS\" \/><\/span><\/div>\n\n            <div style=\"margin-top:.55rem;\"><strong>Interview:<\/strong><\/div>\n            <div>\u2022 interview at 2.30 pm on <span class=\"blank\">9 <input type=\"text\" data-q=\"9\" data-type=\"text\" placeholder=\"ONE WORD\" \/><\/span><\/div>\n            <div>\u2022 will plan a short <span class=\"blank\">10 <input type=\"text\" data-q=\"10\" data-type=\"text\" placeholder=\"ONE WORD\" \/><\/span> about being a tour guide<\/div>\n          <\/div>\n\n          <div class=\"icte-q__fb\" data-fb=\"1\"><\/div>\n          <div class=\"icte-q__fb\" data-fb=\"2\"><\/div>\n          <div class=\"icte-q__fb\" data-fb=\"3\"><\/div>\n          <div class=\"icte-q__fb\" data-fb=\"4\"><\/div>\n          <div class=\"icte-q__fb\" data-fb=\"5\"><\/div>\n          <div class=\"icte-q__fb\" data-fb=\"6\"><\/div>\n          <div class=\"icte-q__fb\" data-fb=\"7\"><\/div>\n          <div class=\"icte-q__fb\" data-fb=\"8\"><\/div>\n          <div class=\"icte-q__fb\" data-fb=\"9\"><\/div>\n          <div class=\"icte-q__fb\" data-fb=\"10\"><\/div>\n        <\/div>\n      <\/div>\n    <\/section>\n  <\/section>\n\n  <!-- =========================\n       SECTION 2 (11\u201320)\n  ========================== -->\n  <section class=\"icte-ielts\" id=\"sec2\" data-section=\"s2\" aria-label=\"Section 2\">\n    <header class=\"icte-ielts__intro\">\n      <h2 class=\"icte-ielts__title\">Section 2 (Questions 11\u201320): Visiting the Sheepmarket area<\/h2>\n      <p class=\"icte-ielts__sub\">\n        Questions 11\u201314: choose <strong>A, B or C<\/strong>. Questions 15\u201320: label the map (choose <strong>A\u2013I<\/strong>).\n      <\/p>\n    <\/header>\n\n    <section class=\"icte-ielts__panel\" aria-label=\"Transcript S2\">\n      <div class=\"icte-ielts__panelHead\">\n        <h3 class=\"icte-ielts__h3\">Transcript (Section 2)<\/h3>\n        <div class=\"icte-ielts__headRight\">\n          <button class=\"icte-btn icte-btn--dark\" type=\"button\" data-action=\"toggle-transcript\">Show Transcript<\/button>\n        <\/div>\n      <\/div>\n      <div class=\"icte-ielts__reading\" data-el=\"transcript-area\" style=\"display:none;\"><\/div>\n      <div class=\"icte-ielts__btnRow icte-ielts__btnRow--tight\">\n        <button class=\"icte-btn icte-btn--info\" type=\"button\" data-action=\"play-audio\">\ud83d\udd0a Listen (Section 2)<\/button>\n        <a class=\"icte-link\" href=\"#q-s2\">Jump to questions \u2193<\/a>\n      <\/div>\n    <\/section>\n\n    <section class=\"icte-ielts__panel\" aria-label=\"Support S2\">\n      <div class=\"icte-ielts__panelHead\">\n        <h3 class=\"icte-ielts__h3\">Support<\/h3>\n        <div class=\"icte-ielts__headRight\">\n          <button class=\"icte-btn icte-btn--ghost\" type=\"button\" data-action=\"clear-support\">Clear<\/button>\n        <\/div>\n      <\/div>\n      <div class=\"icte-ielts__helper\" data-el=\"helper-area\" aria-live=\"polite\">\n        Click <strong>Summary<\/strong>, <strong>Main ideas<\/strong>, or <strong>Keywords<\/strong>.\n      <\/div>\n    <\/section>\n\n    <section class=\"icte-ielts__panel\" aria-label=\"Controls S2\">\n      <div class=\"icte-ielts__btnGrid\">\n        <button class=\"icte-btn icte-btn--primary\" type=\"button\" data-action=\"check\">Check Answers<\/button>\n        <button class=\"icte-btn icte-btn--dark\" type=\"button\" data-action=\"show\">\ud83d\udc40 Show Answers<\/button>\n        <button class=\"icte-btn icte-btn--dark\" type=\"button\" data-action=\"summary\">\ud83e\udde0 Summary<\/button>\n        <button class=\"icte-btn icte-btn--dark\" type=\"button\" data-action=\"main-ideas\">\ud83d\udccc Main ideas<\/button>\n        <button class=\"icte-btn icte-btn--dark\" type=\"button\" data-action=\"keywords\">\ud83d\udcda Keywords<\/button>\n        <button class=\"icte-btn icte-btn--ghost\" type=\"button\" data-action=\"reset\">Reset<\/button>\n      <\/div>\n      <div class=\"icte-ielts__row\" style=\"padding-top:0;\">\n        <div class=\"icte-ielts__score\" data-el=\"scoreBox\" aria-live=\"polite\"><\/div>\n      <\/div>\n    <\/section>\n\n    <section class=\"icte-ielts__panel\" id=\"q-s2\" aria-label=\"Questions 11-20\">\n      <div class=\"icte-ielts__panelHead\">\n        <h3 class=\"icte-ielts__h3\">Questions 11\u201320<\/h3>\n      <\/div>\n\n      <div class=\"icte-ielts__qArea\">\n\n        <div class=\"icte-q\">\n          <div class=\"icte-q__label\">Questions 11\u201314 (Choose A, B or C)<\/div>\n\n          <div class=\"icte-mcq\">\n            <div class=\"icte-mcq__q\"><strong>11.<\/strong> Which is the most rapidly-growing group of residents in the Sheepmarket area?<\/div>\n            <label class=\"icte-opt\"><input type=\"radio\" name=\"q11\" data-q=\"11\" data-type=\"radio\" value=\"A\"> A. young professional people<\/label>\n            <label class=\"icte-opt\"><input type=\"radio\" name=\"q11\" data-q=\"11\" data-type=\"radio\" value=\"B\"> B. students from the university<\/label>\n            <label class=\"icte-opt\"><input type=\"radio\" name=\"q11\" data-q=\"11\" data-type=\"radio\" value=\"C\"> C. employees in the local market<\/label>\n            <div class=\"icte-q__fb\" data-fb=\"11\"><\/div>\n          <\/div>\n\n          <div class=\"icte-mcq\">\n            <div class=\"icte-mcq__q\"><strong>12.<\/strong> The speaker recommends the side streets in the Sheepmarket for their<\/div>\n            <label class=\"icte-opt\"><input type=\"radio\" name=\"q12\" data-q=\"12\" data-type=\"radio\" value=\"A\"> A. international restaurants<\/label>\n            <label class=\"icte-opt\"><input type=\"radio\" name=\"q12\" data-q=\"12\" data-type=\"radio\" value=\"B\"> B. historical buildings<\/label>\n            <label class=\"icte-opt\"><input type=\"radio\" name=\"q12\" data-q=\"12\" data-type=\"radio\" value=\"C\"> C. arts and crafts<\/label>\n            <div class=\"icte-q__fb\" data-fb=\"12\"><\/div>\n          <\/div>\n\n          <div class=\"icte-mcq\">\n            <div class=\"icte-mcq__q\"><strong>13.<\/strong> Clothes designed by entrants for the Young Fashion competition must<\/div>\n            <label class=\"icte-opt\"><input type=\"radio\" name=\"q13\" data-q=\"13\" data-type=\"radio\" value=\"A\"> A. be modelled by the designers themselves<\/label>\n            <label class=\"icte-opt\"><input type=\"radio\" name=\"q13\" data-q=\"13\" data-type=\"radio\" value=\"B\"> B. be inspired by aspects of contemporary culture<\/label>\n            <label class=\"icte-opt\"><input type=\"radio\" name=\"q13\" data-q=\"13\" data-type=\"radio\" value=\"C\"> C. be made from locally produced materials<\/label>\n            <div class=\"icte-q__fb\" data-fb=\"13\"><\/div>\n          <\/div>\n\n          <div class=\"icte-mcq\">\n            <div class=\"icte-mcq__q\"><strong>14.<\/strong> Car parking is free in some car parks if you<\/div>\n            <label class=\"icte-opt\"><input type=\"radio\" name=\"q14\" data-q=\"14\" data-type=\"radio\" value=\"A\"> A. stay for less than an hour<\/label>\n            <label class=\"icte-opt\"><input type=\"radio\" name=\"q14\" data-q=\"14\" data-type=\"radio\" value=\"B\"> B. buy something in the shops<\/label>\n            <label class=\"icte-opt\"><input type=\"radio\" name=\"q14\" data-q=\"14\" data-type=\"radio\" value=\"C\"> C. park in the evenings or at weekends<\/label>\n            <div class=\"icte-q__fb\" data-fb=\"14\"><\/div>\n          <\/div>\n        <\/div>\n\n        <div class=\"icte-q\">\n          <div class=\"icte-q__label\">Questions 15\u201320 (Map labels: choose A\u2013I)<\/div>\n          <div class=\"icte-note\">Select the letter for each place (A\u2013I).<\/div>\n\n          <div class=\"icte-grid2\">\n            <div class=\"icte-day\">\n              <div><strong>15.<\/strong> The Reynolds House<\/div>\n              <select data-q=\"15\" data-type=\"select\">\n                <option value=\"\">Select A\u2013I<\/option>\n                <option>A<\/option><option>B<\/option><option>C<\/option><option>D<\/option><option>E<\/option><option>F<\/option><option>G<\/option><option>H<\/option><option>I<\/option>\n              <\/select>\n              <div class=\"icte-q__fb\" data-fb=\"15\"><\/div>\n            <\/div>\n\n            <div class=\"icte-day\">\n              <div><strong>16.<\/strong> The Thumb<\/div>\n              <select data-q=\"16\" data-type=\"select\">\n                <option value=\"\">Select A\u2013I<\/option>\n                <option>A<\/option><option>B<\/option><option>C<\/option><option>D<\/option><option>E<\/option><option>F<\/option><option>G<\/option><option>H<\/option><option>I<\/option>\n              <\/select>\n              <div class=\"icte-q__fb\" data-fb=\"16\"><\/div>\n            <\/div>\n\n            <div class=\"icte-day\">\n              <div><strong>17.<\/strong> The Museum<\/div>\n              <select data-q=\"17\" data-type=\"select\">\n                <option value=\"\">Select A\u2013I<\/option>\n                <option>A<\/option><option>B<\/option><option>C<\/option><option>D<\/option><option>E<\/option><option>F<\/option><option>G<\/option><option>H<\/option><option>I<\/option>\n              <\/select>\n              <div class=\"icte-q__fb\" data-fb=\"17\"><\/div>\n            <\/div>\n\n            <div class=\"icte-day\">\n              <div><strong>18.<\/strong> The Contemporary Art Gallery<\/div>\n              <select data-q=\"18\" data-type=\"select\">\n                <option value=\"\">Select A\u2013I<\/option>\n                <option>A<\/option><option>B<\/option><option>C<\/option><option>D<\/option><option>E<\/option><option>F<\/option><option>G<\/option><option>H<\/option><option>I<\/option>\n              <\/select>\n              <div class=\"icte-q__fb\" data-fb=\"18\"><\/div>\n            <\/div>\n\n            <div class=\"icte-day\">\n              <div><strong>19.<\/strong> The Warner Gallery<\/div>\n              <select data-q=\"19\" data-type=\"select\">\n                <option value=\"\">Select A\u2013I<\/option>\n                <option>A<\/option><option>B<\/option><option>C<\/option><option>D<\/option><option>E<\/option><option>F<\/option><option>G<\/option><option>H<\/option><option>I<\/option>\n              <\/select>\n              <div class=\"icte-q__fb\" data-fb=\"19\"><\/div>\n            <\/div>\n\n            <div class=\"icte-day\">\n              <div><strong>20.<\/strong> Nucleus<\/div>\n              <select data-q=\"20\" data-type=\"select\">\n                <option value=\"\">Select A\u2013I<\/option>\n                <option>A<\/option><option>B<\/option><option>C<\/option><option>D<\/option><option>E<\/option><option>F<\/option><option>G<\/option><option>H<\/option><option>I<\/option>\n              <\/select>\n              <div class=\"icte-q__fb\" data-fb=\"20\"><\/div>\n            <\/div>\n          <\/div>\n        <\/div>\n\n      <\/div>\n    <\/section>\n  <\/section>\n\n  <!-- =========================\n       SECTION 3 (21\u201330)\n  ========================== -->\n  <section class=\"icte-ielts\" id=\"sec3\" data-section=\"s3\" aria-label=\"Section 3\">\n    <header class=\"icte-ielts__intro\">\n      <h2 class=\"icte-ielts__title\">Section 3 (Questions 21\u201330): Presentation on film adaptations<\/h2>\n      <p class=\"icte-ielts__sub\">\n        Questions 21\u201324: ONE WORD ONLY. Questions 25\u201330: choose from the box (A\u2013G).\n      <\/p>\n    <\/header>\n\n    <section class=\"icte-ielts__panel\" aria-label=\"Transcript S3\">\n      <div class=\"icte-ielts__panelHead\">\n        <h3 class=\"icte-ielts__h3\">Transcript (Section 3)<\/h3>\n        <div class=\"icte-ielts__headRight\">\n          <button class=\"icte-btn icte-btn--dark\" type=\"button\" data-action=\"toggle-transcript\">Show Transcript<\/button>\n        <\/div>\n      <\/div>\n      <div class=\"icte-ielts__reading\" data-el=\"transcript-area\" style=\"display:none;\"><\/div>\n      <div class=\"icte-ielts__btnRow icte-ielts__btnRow--tight\">\n        <button class=\"icte-btn icte-btn--info\" type=\"button\" data-action=\"play-audio\">\ud83d\udd0a Listen (Section 3)<\/button>\n        <a class=\"icte-link\" href=\"#q-s3\">Jump to questions \u2193<\/a>\n      <\/div>\n    <\/section>\n\n    <section class=\"icte-ielts__panel\" aria-label=\"Support S3\">\n      <div class=\"icte-ielts__panelHead\">\n        <h3 class=\"icte-ielts__h3\">Support<\/h3>\n        <div class=\"icte-ielts__headRight\">\n          <button class=\"icte-btn icte-btn--ghost\" type=\"button\" data-action=\"clear-support\">Clear<\/button>\n        <\/div>\n      <\/div>\n      <div class=\"icte-ielts__helper\" data-el=\"helper-area\" aria-live=\"polite\">\n        Click <strong>Summary<\/strong>, <strong>Main ideas<\/strong>, or <strong>Keywords<\/strong>.\n      <\/div>\n    <\/section>\n\n    <section class=\"icte-ielts__panel\" aria-label=\"Controls S3\">\n      <div class=\"icte-ielts__btnGrid\">\n        <button class=\"icte-btn icte-btn--primary\" type=\"button\" data-action=\"check\">Check Answers<\/button>\n        <button class=\"icte-btn icte-btn--dark\" type=\"button\" data-action=\"show\">\ud83d\udc40 Show Answers<\/button>\n        <button class=\"icte-btn icte-btn--dark\" type=\"button\" data-action=\"summary\">\ud83e\udde0 Summary<\/button>\n        <button class=\"icte-btn icte-btn--dark\" type=\"button\" data-action=\"main-ideas\">\ud83d\udccc Main ideas<\/button>\n        <button class=\"icte-btn icte-btn--dark\" type=\"button\" data-action=\"keywords\">\ud83d\udcda Keywords<\/button>\n        <button class=\"icte-btn icte-btn--ghost\" type=\"button\" data-action=\"reset\">Reset<\/button>\n      <\/div>\n      <div class=\"icte-ielts__row\" style=\"padding-top:0;\">\n        <div class=\"icte-ielts__score\" data-el=\"scoreBox\" aria-live=\"polite\"><\/div>\n      <\/div>\n    <\/section>\n\n    <section class=\"icte-ielts__panel\" id=\"q-s3\" aria-label=\"Questions 21-30\">\n      <div class=\"icte-ielts__panelHead\">\n        <h3 class=\"icte-ielts__h3\">Questions 21\u201330<\/h3>\n      <\/div>\n\n      <div class=\"icte-ielts__qArea\">\n        <div class=\"icte-q\">\n          <div class=\"icte-q__label\">Questions 21\u201324 (ONE WORD ONLY)<\/div>\n          <div class=\"icte-note\">\n            <div>Introduce Giannetti\u2019s book containing a <span class=\"blank\">21 <input type=\"text\" data-q=\"21\" data-type=\"word\" placeholder=\"ONE WORD\" \/><\/span> of adaptations<\/div>\n            <div>Ask class to suggest the <span class=\"blank\">22 <input type=\"text\" data-q=\"22\" data-type=\"word\" placeholder=\"ONE WORD\" \/><\/span> adaptations<\/div>\n            <div>Present Rachel Malchow\u2019s ideas: prepare some <span class=\"blank\">23 <input type=\"text\" data-q=\"23\" data-type=\"word\" placeholder=\"ONE WORD\" \/><\/span><\/div>\n            <div>Discuss relationship between adaptations and <span class=\"blank\">24 <input type=\"text\" data-q=\"24\" data-type=\"word\" placeholder=\"ONE WORD\" \/><\/span> at the time of making the film<\/div>\n          <\/div>\n          <div class=\"icte-q__fb\" data-fb=\"21\"><\/div>\n          <div class=\"icte-q__fb\" data-fb=\"22\"><\/div>\n          <div class=\"icte-q__fb\" data-fb=\"23\"><\/div>\n          <div class=\"icte-q__fb\" data-fb=\"24\"><\/div>\n        <\/div>\n\n        <div class=\"icte-q\">\n          <div class=\"icte-q__label\">Questions 25\u201330<\/div>\n          <div class=\"icte-note\">Choose <strong>SIX<\/strong> answers from the box (A\u2013G).<\/div>\n\n          <div class=\"icte-box\">\n            <div class=\"icte-box__title\">Comments<\/div>\n            <div class=\"icte-box__grid\">\n              <div><strong>A<\/strong>. clearly shows the historical period<\/div>\n              <div><strong>B<\/strong>. contains only parts of the play<\/div>\n              <div><strong>C<\/strong>. is too similar to another kind of film<\/div>\n              <div><strong>D<\/strong>. turned out to be unpopular with audiences<\/div>\n              <div><strong>E<\/strong>. presents the play in a different period from the original<\/div>\n              <div><strong>F<\/strong>. sets the original in a different country<\/div>\n              <div><strong>G<\/strong>. incorporates a variety of art forms<\/div>\n            <\/div>\n          <\/div>\n\n          <div class=\"icte-grid2\">\n            <div class=\"icte-day\">\n              <div><strong>25.<\/strong> Ran<\/div>\n              <select data-q=\"25\" data-type=\"select\">\n                <option value=\"\">Select A\u2013G<\/option><option>A<\/option><option>B<\/option><option>C<\/option><option>D<\/option><option>E<\/option><option>F<\/option><option>G<\/option>\n              <\/select>\n              <div class=\"icte-q__fb\" data-fb=\"25\"><\/div>\n            <\/div>\n\n            <div class=\"icte-day\">\n              <div><strong>26.<\/strong> Much Ado About Nothing<\/div>\n              <select data-q=\"26\" data-type=\"select\">\n                <option value=\"\">Select A\u2013G<\/option><option>A<\/option><option>B<\/option><option>C<\/option><option>D<\/option><option>E<\/option><option>F<\/option><option>G<\/option>\n              <\/select>\n              <div class=\"icte-q__fb\" data-fb=\"26\"><\/div>\n            <\/div>\n\n            <div class=\"icte-day\">\n              <div><strong>27.<\/strong> Romeo &amp; Juliet<\/div>\n              <select data-q=\"27\" data-type=\"select\">\n                <option value=\"\">Select A\u2013G<\/option><option>A<\/option><option>B<\/option><option>C<\/option><option>D<\/option><option>E<\/option><option>F<\/option><option>G<\/option>\n              <\/select>\n              <div class=\"icte-q__fb\" data-fb=\"27\"><\/div>\n            <\/div>\n\n            <div class=\"icte-day\">\n              <div><strong>28.<\/strong> Hamlet<\/div>\n              <select data-q=\"28\" data-type=\"select\">\n                <option value=\"\">Select A\u2013G<\/option><option>A<\/option><option>B<\/option><option>C<\/option><option>D<\/option><option>E<\/option><option>F<\/option><option>G<\/option>\n              <\/select>\n              <div class=\"icte-q__fb\" data-fb=\"28\"><\/div>\n            <\/div>\n\n            <div class=\"icte-day\">\n              <div><strong>29.<\/strong> Prospero\u2019s Books<\/div>\n              <select data-q=\"29\" data-type=\"select\">\n                <option value=\"\">Select A\u2013G<\/option><option>A<\/option><option>B<\/option><option>C<\/option><option>D<\/option><option>E<\/option><option>F<\/option><option>G<\/option>\n              <\/select>\n              <div class=\"icte-q__fb\" data-fb=\"29\"><\/div>\n            <\/div>\n\n            <div class=\"icte-day\">\n              <div><strong>30.<\/strong> Looking for Richard<\/div>\n              <select data-q=\"30\" data-type=\"select\">\n                <option value=\"\">Select A\u2013G<\/option><option>A<\/option><option>B<\/option><option>C<\/option><option>D<\/option><option>E<\/option><option>F<\/option><option>G<\/option>\n              <\/select>\n              <div class=\"icte-q__fb\" data-fb=\"30\"><\/div>\n            <\/div>\n          <\/div>\n        <\/div>\n\n      <\/div>\n    <\/section>\n  <\/section>\n\n  <!-- =========================\n       SECTION 4 (31\u201340)\n  ========================== -->\n  <section class=\"icte-ielts\" id=\"sec4\" data-section=\"s4\" aria-label=\"Section 4\">\n    <header class=\"icte-ielts__intro\">\n      <h2 class=\"icte-ielts__title\">Section 4 (Questions 31\u201340): Noise in Cities<\/h2>\n      <p class=\"icte-ielts__sub\">\n        Complete the notes below. Write <strong>ONE WORD ONLY<\/strong> for each answer.\n      <\/p>\n    <\/header>\n\n    <section class=\"icte-ielts__panel\" aria-label=\"Transcript S4\">\n      <div class=\"icte-ielts__panelHead\">\n        <h3 class=\"icte-ielts__h3\">Transcript (Section 4)<\/h3>\n        <div class=\"icte-ielts__headRight\">\n          <button class=\"icte-btn icte-btn--dark\" type=\"button\" data-action=\"toggle-transcript\">Show Transcript<\/button>\n        <\/div>\n      <\/div>\n      <div class=\"icte-ielts__reading\" data-el=\"transcript-area\" style=\"display:none;\"><\/div>\n      <div class=\"icte-ielts__btnRow icte-ielts__btnRow--tight\">\n        <button class=\"icte-btn icte-btn--info\" type=\"button\" data-action=\"play-audio\">\ud83d\udd0a Listen (Section 4)<\/button>\n        <a class=\"icte-link\" href=\"#q-s4\">Jump to questions \u2193<\/a>\n      <\/div>\n    <\/section>\n\n    <section class=\"icte-ielts__panel\" aria-label=\"Support S4\">\n      <div class=\"icte-ielts__panelHead\">\n        <h3 class=\"icte-ielts__h3\">Support<\/h3>\n        <div class=\"icte-ielts__headRight\">\n          <button class=\"icte-btn icte-btn--ghost\" type=\"button\" data-action=\"clear-support\">Clear<\/button>\n        <\/div>\n      <\/div>\n      <div class=\"icte-ielts__helper\" data-el=\"helper-area\" aria-live=\"polite\">\n        Click <strong>Summary<\/strong>, <strong>Main ideas<\/strong>, or <strong>Keywords<\/strong>.\n      <\/div>\n    <\/section>\n\n    <section class=\"icte-ielts__panel\" aria-label=\"Controls S4\">\n      <div class=\"icte-ielts__btnGrid\">\n        <button class=\"icte-btn icte-btn--primary\" type=\"button\" data-action=\"check\">Check Answers<\/button>\n        <button class=\"icte-btn icte-btn--dark\" type=\"button\" data-action=\"show\">\ud83d\udc40 Show Answers<\/button>\n        <button class=\"icte-btn icte-btn--dark\" type=\"button\" data-action=\"summary\">\ud83e\udde0 Summary<\/button>\n        <button class=\"icte-btn icte-btn--dark\" type=\"button\" data-action=\"main-ideas\">\ud83d\udccc Main ideas<\/button>\n        <button class=\"icte-btn icte-btn--dark\" type=\"button\" data-action=\"keywords\">\ud83d\udcda Keywords<\/button>\n        <button class=\"icte-btn icte-btn--ghost\" type=\"button\" data-action=\"reset\">Reset<\/button>\n      <\/div>\n      <div class=\"icte-ielts__row\" style=\"padding-top:0;\">\n        <div class=\"icte-ielts__score\" data-el=\"scoreBox\" aria-live=\"polite\"><\/div>\n      <\/div>\n    <\/section>\n\n    <section class=\"icte-ielts__panel\" id=\"q-s4\" aria-label=\"Questions 31-40\">\n      <div class=\"icte-ielts__panelHead\">\n        <h3 class=\"icte-ielts__h3\">Questions 31\u201340<\/h3>\n      <\/div>\n\n      <div class=\"icte-ielts__qArea\">\n        <div class=\"icte-q\">\n          <div class=\"icte-q__label\">Noise in Cities<\/div>\n          <div class=\"icte-note\">\n            <div><strong>Noise \u2018maps\u2019<\/strong><\/div>\n            <div>\u2022 do not show other sources of noise, e.g. when windows are open or neighbours are in their <span class=\"blank\">31 <input type=\"text\" data-q=\"31\" data-type=\"word\" placeholder=\"ONE WORD\" \/><\/span><\/div>\n\n            <div style=\"margin-top:.55rem;\"><strong>Problems caused by noise<\/strong><\/div>\n            <div>\u2022 noise is a <span class=\"blank\">32 <input type=\"text\" data-q=\"32\" data-type=\"word\" placeholder=\"ONE WORD\" \/><\/span> issue that must be dealt with<\/div>\n            <div>\u2022 effect on the <span class=\"blank\">33 <input type=\"text\" data-q=\"33\" data-type=\"word\" placeholder=\"ONE WORD\" \/><\/span> of schoolchildren<\/div>\n\n            <div style=\"margin-top:.55rem;\"><strong>Different types of noise<\/strong><\/div>\n            <div>\u2022 pleasant example: the sound of a <span class=\"blank\">34 <input type=\"text\" data-q=\"34\" data-type=\"word\" placeholder=\"ONE WORD\" \/><\/span> in a town<\/div>\n            <div>\u2022 researchers may use methods from <span class=\"blank\">35 <input type=\"text\" data-q=\"35\" data-type=\"word\" placeholder=\"ONE WORD\" \/><\/span> sciences (e.g., questionnaires)<\/div>\n\n            <div style=\"margin-top:.55rem;\"><strong>What people want<\/strong><\/div>\n            <div>\u2022 urban environments which are <span class=\"blank\">36 <input type=\"text\" data-q=\"36\" data-type=\"word\" placeholder=\"ONE WORD\" \/><\/span>, but also allow people to relax<\/div>\n\n            <div style=\"margin-top:.55rem;\"><strong>Architects and town planners<\/strong><\/div>\n            <div>\u2022 do not get much <span class=\"blank\">37 <input type=\"text\" data-q=\"37\" data-type=\"word\" placeholder=\"ONE WORD\" \/><\/span> in acoustics<\/div>\n\n            <div style=\"margin-top:.55rem;\"><strong>Understanding sound as an art form<\/strong><\/div>\n            <div>\u2022 how sound relates to <span class=\"blank\">38 <input type=\"text\" data-q=\"38\" data-type=\"word\" placeholder=\"ONE WORD\" \/><\/span><\/div>\n            <div>\u2022 whether physics can help us understand the <span class=\"blank\">39 <input type=\"text\" data-q=\"39\" data-type=\"word\" placeholder=\"ONE WORD\" \/><\/span> of sound<\/div>\n\n            <div style=\"margin-top:.55rem;\"><strong>Virtual reality programs<\/strong><\/div>\n            <div>\u2022 current disadvantage: they are <span class=\"blank\">40 <input type=\"text\" data-q=\"40\" data-type=\"word\" placeholder=\"ONE WORD\" \/><\/span><\/div>\n          <\/div>\n\n          <div class=\"icte-q__fb\" data-fb=\"31\"><\/div>\n          <div class=\"icte-q__fb\" data-fb=\"32\"><\/div>\n          <div class=\"icte-q__fb\" data-fb=\"33\"><\/div>\n          <div class=\"icte-q__fb\" data-fb=\"34\"><\/div>\n          <div class=\"icte-q__fb\" data-fb=\"35\"><\/div>\n          <div class=\"icte-q__fb\" data-fb=\"36\"><\/div>\n          <div class=\"icte-q__fb\" data-fb=\"37\"><\/div>\n          <div class=\"icte-q__fb\" data-fb=\"38\"><\/div>\n          <div class=\"icte-q__fb\" data-fb=\"39\"><\/div>\n          <div class=\"icte-q__fb\" data-fb=\"40\"><\/div>\n        <\/div>\n      <\/div>\n    <\/section>\n  <\/section>\n\n  <!-- \u2705 STYLES (scoped) -->\n  <style>\n    #icte-listening-test4, #icte-listening-test4 *{ box-sizing:border-box; }\n    #icte-listening-test4{ width:100%; max-width:100%; margin:0; }\n\n    #icte-listening-test4 .icte-menu{\n      width:100%; max-width:100%;\n      display:flex; flex-wrap:wrap; gap:.5rem; justify-content:center; align-items:center;\n      padding:.75rem .9rem; margin:0 0 1rem 0;\n      background:#16a34a; border-radius:14px; box-shadow:0 2px 8px rgba(0,0,0,.10);\n    }\n    #icte-listening-test4 .icte-menu a{\n      display:inline-block; text-decoration:none; font-weight:900; font-size:.95rem; color:#fff;\n      padding:.55rem .85rem; border-radius:999px; border:1px solid rgba(255,255,255,.35);\n      background:rgba(255,255,255,.12);\n    }\n    #icte-listening-test4 .icte-menu a.is-current{ background:#fff; color:#16a34a; border-color:#fff; }\n    @media (max-width:600px){\n      #icte-listening-test4 .icte-menu{ justify-content:flex-start; }\n      #icte-listening-test4 .icte-menu a{ width:100%; text-align:center; }\n    }\n\n    #icte-listening-test4 .icte-ielts{ width:100%; margin:1rem 0; }\n    #icte-listening-test4 .icte-ielts__intro{\n      padding:.9rem 1rem; border:1px solid rgba(0,0,0,.10); border-radius:14px;\n      background:rgba(255,255,255,.7); margin-bottom:1rem;\n    }\n    #icte-listening-test4 .icte-ielts__title{ margin:0 0 .35rem; font-size:1.2rem; font-weight:900; }\n    #icte-listening-test4 .icte-ielts__sub{ margin:0; opacity:.85; }\n\n    #icte-listening-test4 .icte-ielts__panel{\n      border:1px solid rgba(0,0,0,.10); border-radius:14px; background:rgba(255,255,255,.85);\n      overflow:hidden; margin-bottom:1rem;\n    }\n    #icte-listening-test4 .icte-ielts__panelHead{\n      display:flex; align-items:center; justify-content:space-between; gap:.75rem;\n      padding:.85rem 1rem; border-bottom:1px solid rgba(0,0,0,.08); background:rgba(0,0,0,.03);\n    }\n    #icte-listening-test4 .icte-ielts__h3{ margin:0; font-size:1.03rem; font-weight:900; }\n    #icte-listening-test4 .icte-ielts__headRight{ display:flex; gap:.55rem; align-items:center; }\n\n    #icte-listening-test4 .icte-ielts__reading{\n      padding:.95rem 1rem 1.05rem; line-height:1.75; max-height:420px; overflow:auto;\n      white-space:pre-wrap;\n    }\n\n    #icte-listening-test4 .icte-ielts__row{\n      display:flex; justify-content:space-between; gap:.75rem;\n      padding:.85rem 1rem .25rem;\n    }\n    #icte-listening-test4 .icte-ielts__control label{ display:block; margin-bottom:.35rem; }\n    #icte-listening-test4 select{\n      width:100%; max-width:520px; padding:.6rem .7rem; border-radius:12px;\n      border:1px solid rgba(0,0,0,.18); background:#fff; font:inherit;\n    }\n    #icte-listening-test4 .icte-ielts__score{\n      font-weight:900; font-size:.95rem; opacity:.9; white-space:nowrap;\n      margin-top:.25rem;\n    }\n\n    #icte-listening-test4 .icte-ielts__btnRow{\n      padding:.75rem 1rem 1rem; display:flex; gap:.6rem; flex-wrap:wrap; align-items:center;\n    }\n    #icte-listening-test4 .icte-ielts__btnRow--tight{ padding-top:0; }\n    #icte-listening-test4 .icte-ielts__btnGrid{\n      padding:.75rem 1rem 1rem;\n      display:grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap:.6rem;\n    }\n\n    #icte-listening-test4 .icte-link{\n      font-weight:900; text-decoration:none; border:1px solid rgba(0,0,0,.14);\n      border-radius:12px; padding:.55rem .75rem; color:inherit; background:rgba(255,255,255,.6);\n    }\n\n    #icte-listening-test4 .icte-ielts__qArea{ padding:.9rem 1rem 1rem; }\n    #icte-listening-test4 .icte-q{\n      padding:.75rem .8rem; border:1px solid rgba(0,0,0,.10); border-radius:12px;\n      background:rgba(255,255,255,.75); margin:0 0 .75rem;\n    }\n    #icte-listening-test4 .icte-q__label{ font-weight:900; display:block; margin-bottom:.4rem; }\n    #icte-listening-test4 .icte-note{ line-height:1.7; opacity:.95; }\n\n    #icte-listening-test4 .blank{\n      display:inline-flex; align-items:center; gap:.4rem;\n      padding:.15rem .35rem; border-radius:10px; border:1px dashed rgba(0,0,0,.25);\n      background:rgba(255,255,255,.6); margin:0 .25rem;\n    }\n    #icte-listening-test4 input[type=\"text\"]{\n      width:170px; max-width:100%;\n      padding:.55rem .65rem; border-radius:12px;\n      border:1px solid rgba(0,0,0,.18); font:inherit;\n    }\n    #icte-listening-test4 .icte-q__fb{ margin-top:.35rem; font-size:.95rem; font-weight:800; }\n\n    #icte-listening-test4 .icte-btn{\n      appearance:none; border:1px solid transparent; border-radius:12px;\n      padding:.65rem .85rem; font-weight:900; cursor:pointer; font:inherit;\n    }\n    #icte-listening-test4 .icte-btn--primary{ background:#16a34a; color:#fff; }\n    #icte-listening-test4 .icte-btn--info{ background:#0ea5e9; color:#fff; }\n    #icte-listening-test4 .icte-btn--danger{ background:#dc2626; color:#fff; }\n    #icte-listening-test4 .icte-btn--dark{ background:#334155; color:#fff; }\n    #icte-listening-test4 .icte-btn--ghost{ background:transparent; border-color:rgba(0,0,0,.20); color:inherit; }\n\n    #icte-listening-test4 .icte-loader{\n      width:18px; height:18px; border-radius:999px;\n      border:3px solid rgba(0,0,0,.15); border-top-color:#0ea5e9;\n      display:none; animation: icteSpin 1s linear infinite;\n    }\n    @keyframes icteSpin{ to{ transform: rotate(360deg); } }\n\n    #icte-listening-test4 .icte-ielts__helper{\n      padding:.95rem 1rem 1.05rem; line-height:1.7; overflow-wrap:anywhere; word-break:break-word;\n    }\n    #icte-listening-test4 .icte-ielts__helper ul{ margin:.4rem 0 0 1.1rem; }\n    #icte-listening-test4 .icte-ielts__helper li{ margin:.35rem 0; }\n    #icte-listening-test4 .icte-ielts__helper .tag{\n      display:inline-block; padding:.15rem .5rem; border-radius:999px;\n      border:1px solid rgba(0,0,0,.12); background:rgba(255,255,255,.7);\n      font-weight:900; font-size:.85rem; margin-right:.4rem;\n    }\n\n    #icte-listening-test4 .icte-mcq{\n      margin:.75rem 0 1rem; padding:.7rem .75rem;\n      border:1px solid rgba(0,0,0,.10); border-radius:12px; background:rgba(255,255,255,.65);\n    }\n    #icte-listening-test4 .icte-mcq__q{ font-weight:900; margin-bottom:.45rem; }\n    #icte-listening-test4 .icte-opt{ display:block; margin:.35rem 0; font-weight:700; }\n    #icte-listening-test4 .icte-opt input{ margin-right:.5rem; }\n\n    #icte-listening-test4 .icte-box{\n      border:1px solid rgba(0,0,0,.10); border-radius:12px; background:rgba(255,255,255,.75);\n      padding:.75rem; margin:.65rem 0 1rem;\n    }\n    #icte-listening-test4 .icte-box__title{ font-weight:900; margin-bottom:.5rem; }\n    #icte-listening-test4 .icte-box__grid{ display:grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap:.45rem .9rem; }\n    @media (max-width: 700px){ #icte-listening-test4 .icte-box__grid{ grid-template-columns:1fr; } }\n\n    #icte-listening-test4 .icte-grid2{ display:grid; grid-template-columns: repeat(2, minmax(0,1fr)); gap:.75rem; }\n    #icte-listening-test4 .icte-day{\n      border:1px solid rgba(0,0,0,.10); border-radius:12px; background:rgba(255,255,255,.65);\n      padding:.7rem;\n    }\n    #icte-listening-test4 .icte-day select{ max-width:100%; }\n\n    @media (max-width: 900px){\n      #icte-listening-test4 .icte-ielts__btnGrid{ grid-template-columns: repeat(2, minmax(0, 1fr)); }\n      #icte-listening-test4 .icte-grid2{ grid-template-columns: 1fr; }\n    }\n    @media (max-width: 600px){\n      #icte-listening-test4 .icte-ielts__row{ flex-direction:column; align-items:stretch; }\n      #icte-listening-test4 .icte-ielts__btnGrid{ grid-template-columns: 1fr; }\n      #icte-listening-test4 input[type=\"text\"]{ width:100%; }\n    }\n  <\/style>\n\n  <!-- \u2705 SCRIPT -->\n  <script>\n    (function(){\n      const root = document.getElementById(\"icte-listening-test4\");\n      if (!root) return;\n\n      const $ = (sel, base=root) => base.querySelector(sel);\n      const $$ = (sel, base=root) => Array.from(base.querySelectorAll(sel));\n\n      function showLoader(show){\n        const el = $('[data-el=\"synthesis-loader\"]');\n        if (el) el.style.display = show ? \"inline-block\" : \"none\";\n      }\n\n      const speechOk = (\"speechSynthesis\" in window);\n      let voicesAll = [];\n      let voiceA = null;\n      let voiceB = null;\n      let playRunId = 0;\n\n      function stopSpeaking(){\n        if (!speechOk) return;\n        playRunId++;\n        window.speechSynthesis.cancel();\n        showLoader(false);\n      }\n\n      function sayWithVoice(text, voice, opts){\n        const myRun = playRunId;\n        const options = opts || {};\n        return new Promise((resolve) => {\n          if (!speechOk) return resolve();\n\n          const u = new SpeechSynthesisUtterance(String(text || \"\"));\n          u.lang  = options.lang  || (voice && voice.lang) || \"en-US\";\n          u.rate  = (typeof options.rate === \"number\") ? options.rate : 1.0;\n          u.pitch = (typeof options.pitch === \"number\") ? options.pitch : 1.0;\n          if (voice) u.voice = voice;\n\n          let done = false;\n          const finish = () => {\n            if (done) return;\n            done = true;\n            clearInterval(timer);\n            u.onend = null;\n            u.onerror = null;\n            resolve();\n          };\n\n          u.onend = finish;\n          u.onerror = finish;\n\n          const timer = setInterval(() => {\n            if (done) return;\n            if (playRunId !== myRun) return finish();\n            const speaking = window.speechSynthesis.speaking;\n            const pending  = window.speechSynthesis.pending;\n            if (!speaking && !pending) finish();\n          }, 120);\n\n          window.speechSynthesis.speak(u);\n        });\n      }\n\n      function populateVoices(){\n        if (!speechOk) return;\n\n        voicesAll = window.speechSynthesis.getVoices() || [];\n        const en = voicesAll.filter(v => (v.lang || \"\").toLowerCase().startsWith(\"en\"));\n        const usable = en.length ? en : voicesAll;\n\n        const selA = $('[data-el=\"voice-a\"]');\n        const selB = $('[data-el=\"voice-b\"]');\n        if (!selA || !selB) return;\n\n        selA.innerHTML = \"\";\n        selB.innerHTML = \"\";\n\n        usable.forEach((v, idx) => {\n          const o1 = document.createElement(\"option\");\n          o1.value = String(idx);\n          o1.textContent = `${v.name} (${v.lang})`;\n          selA.appendChild(o1);\n\n          const o2 = document.createElement(\"option\");\n          o2.value = String(idx);\n          o2.textContent = `${v.name} (${v.lang})`;\n          selB.appendChild(o2);\n        });\n\n        voiceA = usable[0] || null;\n        voiceB = usable.find(v => v.name !== (voiceA && voiceA.name)) || usable[0] || null;\n\n        if (voiceA){\n          const idx = usable.findIndex(v => v.name === voiceA.name && v.lang === voiceA.lang);\n          if (idx >= 0) selA.value = String(idx);\n        }\n        if (voiceB){\n          const idx = usable.findIndex(v => v.name === voiceB.name && v.lang === voiceB.lang);\n          if (idx >= 0) selB.value = String(idx);\n        }\n\n        selA.onchange = () => { voiceA = usable[Number(selA.value)] || usable[0] || null; };\n        selB.onchange = () => { voiceB = usable[Number(selB.value)] || usable[0] || null; };\n      }\n\n      function loadVoices(){\n        if (!speechOk) return;\n        const got = window.speechSynthesis.getVoices();\n        if (got && got.length) populateVoices();\n        else window.speechSynthesis.onvoiceschanged = populateVoices;\n      }\n\n      function cleanForSpeech(t){\n        return String(t || \"\")\n          .replace(\/\\(Q\\d+\\)\/gi, \"\")   \/\/ remove (Q1) markers\n          .replace(\/\\s+\/g, \" \")\n          .trim();\n      }\n\n      function norm(x){\n        return String(x || \"\")\n          .trim()\n          .toLowerCase()\n          .replace(\/[.,!?;:()\"']\/g, \"\")\n          .replace(\/\\s+\/g, \" \");\n      }\n      function tokenCount(x){\n        const t = String(x || \"\").trim();\n        if (!t) return 0;\n        return t.split(\/\\s+\/).length;\n      }\n\n      function setFB(sectionEl, q, msg, color){\n        const fb = sectionEl.querySelector(`[data-fb=\"${q}\"]`);\n        if (!fb) return;\n        fb.textContent = msg || \"\";\n        fb.style.color = color || \"#0f172a\";\n      }\n      function setSectionScore(sectionEl, msg){\n        const box = $('[data-el=\"scoreBox\"]', sectionEl);\n        if (box) box.textContent = msg || \"\";\n        updateOverallScore();\n      }\n\n      function setHelper(sectionEl, builder){\n        const area = $('[data-el=\"helper-area\"]', sectionEl);\n        if (!area) return;\n        area.innerHTML = \"\";\n        builder(area);\n        area.scrollIntoView({ behavior:\"smooth\", block:\"start\" });\n      }\n      function clearSupport(sectionEl){\n        const area = $('[data-el=\"helper-area\"]', sectionEl);\n        if (area) area.innerHTML = 'Click <strong>Summary<\/strong>, <strong>Main ideas<\/strong>, or <strong>Keywords<\/strong>.';\n      }\n\n      function getUserAnswer(sectionEl, q){\n        const txt = sectionEl.querySelector(`input[data-q=\"${q}\"][data-type=\"text\"], input[data-q=\"${q}\"][data-type=\"word\"]`);\n        if (txt) return { value: String(txt.value || \"\"), kind: txt.getAttribute(\"data-type\") };\n\n        const sel = sectionEl.querySelector(`select[data-q=\"${q}\"]`);\n        if (sel) return { value: String(sel.value || \"\"), kind: \"select\" };\n\n        const checked = sectionEl.querySelector(`input[type=\"radio\"][data-q=\"${q}\"]:checked`);\n        if (checked) return { value: String(checked.value || \"\"), kind: \"radio\" };\n        const anyRadio = sectionEl.querySelector(`input[type=\"radio\"][data-q=\"${q}\"]`);\n        if (anyRadio) return { value: \"\", kind: \"radio\" };\n\n        return { value: \"\", kind: \"unknown\" };\n      }\n\n      function clearInputs(sectionEl){\n        $$('input[type=\"text\"][data-q]', sectionEl).forEach(i => i.value = \"\");\n        $$('input[type=\"radio\"][data-q]', sectionEl).forEach(r => r.checked = false);\n        $$('select[data-q]', sectionEl).forEach(s => s.value = \"\");\n      }\n\n      function toggleTranscript(sectionEl){\n        const area = $('[data-el=\"transcript-area\"]', sectionEl);\n        const btn = sectionEl.querySelector('button[data-action=\"toggle-transcript\"]');\n        if (!area || !btn) return;\n\n        const hidden = area.style.display === \"none\";\n        area.style.display = hidden ? \"block\" : \"none\";\n        btn.textContent = hidden ? \"Hide Transcript\" : \"Show Transcript\";\n        if (hidden) area.scrollIntoView({ behavior:\"smooth\", block:\"start\" });\n      }\n\n      \/* ===== Data (Test 4 page uses Test 8 transcript\/answers) ===== *\/\n      const sections = {\n        s1: {\n          title: \"Section 1\",\n          rule: \"oneWordOrNumber\",\n          qList: Array.from({length:10}, (_,i)=>i+1),\n          summary: \"A woman calls a cycling holidays company about leading cycle tours. She explains her background, availability, dietary allergy, address details, interview time, and a short talk she must prepare.\",\n          mainIdeas: [\n            { tag:\"Form\", text:\"Read the form headings first (job, work, experience, dates, address, interview).\" },\n            { tag:\"ONE WORD\", text:\"Keep answers short (one word or a number). Don\u2019t add extra words.\" },\n            { tag:\"Dates\", text:\"Listen carefully for months and days (e.g., May, Tuesday).\" },\n            { tag:\"Spelling\", text:\"Names\/addresses and postcodes must be accurate.\" },\n            { tag:\"Distractors\", text:\"Ignore extra story details\u2014only fill what fits the gap.\" }\n          ],\n          keywords: [\n            { term:\"temporary\", def:\"not permanent; for a short time\" },\n            { term:\"training\", def:\"the period of learning skills for a job\" },\n            { term:\"volunteer\", def:\"work without pay to help others\" },\n            { term:\"allergic\", def:\"having a negative reaction to some food\/substance\" },\n            { term:\"postcode\", def:\"postal code used in an address\" },\n            { term:\"interview\", def:\"a meeting to assess a candidate for a job\" }\n          ],\n          transcript: [\n            { speaker:\"A\", text:\"Hello, Pembroke Cycling Holidays, Bob speaking.\" },\n            { speaker:\"B\", text:\"Oh hello. I've seen your advert for people to lead cycle trips. Are you the right person to speak to?\" },\n            { speaker:\"A\", text:\"Yes, I am. Could I have your name, please?\" },\n            { speaker:\"B\", text:\"It's Margaret Smith.\" },\n            { speaker:\"A\", text:\"Are you looking for a permanent job, Margaret?\" },\n            { speaker:\"B\", text:\"No, temporary. I've got a permanent job starting in a few months' time, and I want to do something else until then.\" },\n            { speaker:\"A\", text:\"What work do you do?\" },\n            { speaker:\"B\", text:\"This will probably sound crazy - I used to be a lawyer, and then I made a complete career change and I'm going to be a doctor. I've just finished my training.\" },\n            { speaker:\"A\", text:\"Right. And have you had any experience of leading cycle trips?\" },\n            { speaker:\"B\", text:\"Yes, I've led several bike tours in Africa. The trip to India that I had arranged to lead next month has now been cancelled, so when I saw you were advertising for tour leaders, I decided to apply.\" },\n            { speaker:\"A\", text:\"OK. Now we normally have two or three leaders on a trip, depending on the size of the group. We've got a tour coming up soon in Spain, a cycling holiday for families. Would that suit you?\" },\n            { speaker:\"B\", text:\"It certainly would. I enjoy working with children, and I probably need some more experience before I go on a really challenging trip.\" },\n            { speaker:\"A\", text:\"That tour includes several teenagers: have you worked with that age group before?\" },\n            { speaker:\"B\", text:\"Yes, I'm a volunteer worker in a youth club, where I help people to improve their cycling skills. Before that I helped out in a cycling club where I taught beginners.\" },\n            { speaker:\"A\", text:\"Well that's great. The trip is for a fortnight, but there might be the possibility of leading other tours after that.\" },\n            { speaker:\"B\", text:\"That'd be fine. I'll be free for five months. My job is due to start on October the 2nd, and I'm available from May the 1st until late September.\" },\n            { speaker:\"A\", text:\"Now is there anything I need to know about the food you eat?\" },\n            { speaker:\"B\", text:\"Yes, I'm allergic to cheese. Would that be a problem?\" },\n            { speaker:\"A\", text:\"No, as long as we have enough notice, we can deal with that.\" },\n            { speaker:\"B\", text:\"It sounds really interesting - would you like me to fill in an application form?\" },\n            { speaker:\"A\", text:\"Yes, please. Where should I post it to?\" },\n            { speaker:\"B\", text:\"Could you send it to 27 Arbuthnot Place. Dumfries.\" },\n            { speaker:\"A\", text:\"And what's the postcode, please?\" },\n            { speaker:\"B\", text:\"DG7 4PH. P Papa.\" },\n            { speaker:\"A\", text:\"If you could return the application form by Friday this week, we can interview you on Tuesday next week. Say half past two.\" },\n            { speaker:\"B\", text:\"Yes, it's fine. Should I bring anything to the interview?\" },\n            { speaker:\"A\", text:\"We'll need to see any certificates you've got that are relevant, in cycling, first aid, or whatever.\" },\n            { speaker:\"A\", text:\"And could you prepare a ten-minute talk about your experience of being a tour guide? Just some notes.\" },\n            { speaker:\"B\", text:\"Right. I'll start thinking about that straightaway!\" }\n          ],\n          answers: {\n            1:[\"temporary\"],\n            2:[\"doctor\"],\n            3:[\"africa\"],\n            4:[\"youth\"],\n            5:[\"may\"],\n            6:[\"cheese\"],\n            7:[\"arbuthnot\"],\n            8:[\"dg7 4ph\",\"dg74ph\"],\n            9:[\"tuesday\"],\n            10:[\"talk\",\"presentation\"]\n          }\n        },\n\n        s2: {\n          title: \"Section 2\",\n          rule: \"mixed\",\n          qList: Array.from({length:10}, (_,i)=>i+11),\n          summary: \"A podcast introduces the Sheepmarket area, its community, shopping and design culture, parking rules, and key attractions for art and history shown on a map.\",\n          mainIdeas: [\n            { tag:\"MCQ\", text:\"For 11\u201314, listen for exact groups, places, and conditions (free parking condition!).\" },\n            { tag:\"Map\", text:\"For 15\u201320, follow directions carefully: street names, sides of roads, and landmarks.\" },\n            { tag:\"Signals\", text:\"Words like \u2018finally\u2019, \u2018next\u2019, \u2018on the east side\u2019 signal answers.\" },\n            { tag:\"Avoid traps\", text:\"You may hear several options\u2014choose the one stated as correct.\" }\n          ],\n          keywords: [\n            { term:\"redeveloped\", def:\"built again \/ improved for a new purpose\" },\n            { term:\"vibrant\", def:\"full of energy and activity\" },\n            { term:\"ceramics\", def:\"objects made of clay and baked (pottery)\" },\n            { term:\"gala evening\", def:\"a special formal celebration event\" },\n            { term:\"underground car park\", def:\"parking below street level\" },\n            { term:\"receipt\", def:\"a paper showing you paid for something\" }\n          ],\n          transcript: [\n            { speaker:\"A\", text:\"Welcome to this podcast about the Sheepmarket, one of the oldest parts of the city.\" },\n            { speaker:\"A\", text:\"Now it's been redeveloped into a buzzing, vibrant area and home to one of the city's fastest-growing communities.\" },\n            { speaker:\"A\", text:\"Graduates embarking on careers in fashion and design are buying up the new apartments recently built here.\" },\n            { speaker:\"A\", text:\"The narrow old side streets are great for finding original pictures, jewellery and ceramics, as well as local produce like fruit and vegetables.\" },\n            { speaker:\"A\", text:\"The Young Fashion competition is open to local young people passionate about fashion.\" },\n            { speaker:\"A\", text:\"This year they've been asked to design an outfit based on ideas from music and technology in their everyday life.\" },\n            { speaker:\"A\", text:\"The winning entries will be modelled at a special gala evening.\" },\n            { speaker:\"A\", text:\"If you want to spend the day, it's better to park in one of the four underground car parks.\" },\n            { speaker:\"A\", text:\"If you can present a receipt from one of the local stores, you'll not be charged at all.\" },\n            { speaker:\"A\", text:\"Most visitors start from Crawley Road at the bottom of the map.\" },\n            { speaker:\"A\", text:\"The Reynolds House is on the north side of Crawley Road, next to the footpath that leads to the public gardens.\" },\n            { speaker:\"A\", text:\"The Thumb is on Hill Road, across the road from the Bank.\" },\n            { speaker:\"A\", text:\"The Museum is on the east side, on City Road, facing the junction with Hill Road.\" },\n            { speaker:\"A\", text:\"The Contemporary Art Gallery is on a little road that leads off Station Square. It's open every day except Mondays.\" },\n            { speaker:\"A\", text:\"The Warner Gallery is on City Road near the junction with Crawley Road, on the same side as the public gardens.\" },\n            { speaker:\"A\", text:\"For purchasing high quality artwork, go to Nucleus. If you get to City Road you've gone too far.\" }\n          ],\n          answers: {\n            11:[\"a\"],\n            12:[\"c\"],\n            13:[\"b\"],\n            14:[\"b\"],\n            15:[\"h\"],\n            16:[\"c\"],\n            17:[\"f\"],\n            18:[\"g\"],\n            19:[\"i\"],\n            20:[\"b\"]\n          }\n        },\n\n        s3: {\n          title: \"Section 3\",\n          rule: \"mixed\",\n          qList: Array.from({length:10}, (_,i)=>i+21),\n          summary: \"Two students discuss a presentation on Shakespeare film adaptations, including a classification approach, discussion ideas, and examples of different film styles.\",\n          mainIdeas: [\n            { tag:\"ONE WORD\", text:\"For 21\u201324, answers are single words taken from the discussion.\" },\n            { tag:\"Examples\", text:\"For 25\u201330, match each film to the correct comment letter.\" },\n            { tag:\"Paraphrase\", text:\"Listen for restated ideas (e.g., \u2018loose adaptation\u2019 = different country\/period).\" },\n            { tag:\"Focus\", text:\"Don\u2019t choose based on your opinion\u2014use what they say.\" }\n          ],\n          keywords: [\n            { term:\"adaptation\", def:\"a film version of a book or play\" },\n            { term:\"faithful\", def:\"very close to the original\" },\n            { term:\"classification\", def:\"a system for grouping types\" },\n            { term:\"slides\", def:\"presentation pages shown on a screen\" },\n            { term:\"loose adaptation\", def:\"keeps the main idea but changes many details\" },\n            { term:\"documentary\", def:\"a factual film\" }\n          ],\n          transcript: [\n            { speaker:\"A\", text:\"Joe, you know I'm giving a presentation in our film studies class next week?\" },\n            { speaker:\"B\", text:\"Yes.\" },\n            { speaker:\"A\", text:\"Could we discuss it? I could do with getting someone else's opinion.\" },\n            { speaker:\"B\", text:\"Of course. What are you going to talk about?\" },\n            { speaker:\"A\", text:\"It\u2019s about film adaptations of Shakespeare's plays.\" },\n            { speaker:\"A\", text:\"I thought I'd start with Giannetti, and his classification of film adaptations based on how faithful they are to the originals.\" },\n            { speaker:\"A\", text:\"Next I'd ask the class to come up with the worst examples of Shakespeare adaptations they've seen, and to say why.\" },\n            { speaker:\"A\", text:\"I was thinking of showing film clips to illustrate Rachel Malchow's ideas.\" },\n            { speaker:\"B\", text:\"Will you have enough time?\" },\n            { speaker:\"A\", text:\"Hmm. I'd better do some slides instead.\" },\n            { speaker:\"A\", text:\"Next I want to talk about how plays may be chosen for adaptation because they're concerned with issues of the time when the film is made.\" },\n            { speaker:\"A\", text:\"Do you know the Japanese film Ran? It was based on King Lear.\" },\n            { speaker:\"A\", text:\"It moved the story to 16th century Japan instead of Britain.\" },\n            { speaker:\"B\", text:\"I hope you'll talk about the 1993 film of Much Ado About Nothing.\" },\n            { speaker:\"A\", text:\"Yes. Filming it in Italy makes you see what life was like at the time.\" },\n            { speaker:\"A\", text:\"Next, Romeo and Juliet, the 1996 film, moves the action into the present day.\" },\n            { speaker:\"A\", text:\"Then the 1996 film of Hamlet includes every line, but it's more like an action hero movie.\" },\n            { speaker:\"A\", text:\"Prospero's Books was really innovative, stylistically.\" },\n            { speaker:\"A\", text:\"I also want to mention Looking for Richard.\" },\n            { speaker:\"B\", text:\"It was a blend of a documentary with a few scenes from Richard the Third, wasn't it?\" },\n            { speaker:\"A\", text:\"That's right.\" }\n          ],\n          answers: {\n            21:[\"classification\"],\n            22:[\"worst\"],\n            23:[\"slides\"],\n            24:[\"issues\"],\n            25:[\"f\"],\n            26:[\"a\"],\n            27:[\"e\"],\n            28:[\"c\"],\n            29:[\"g\"],\n            30:[\"b\"]\n          }\n        },\n\n        s4: {\n          title: \"Section 4\",\n          rule: \"oneWordOnly\",\n          qList: Array.from({length:10}, (_,i)=>i+31),\n          summary: \"A lecture explains acoustics in cities, why noise maps are limited, why noise is political, health and learning impacts, and how future design may use realistic soundscapes in virtual reality.\",\n          mainIdeas: [\n            { tag:\"ONE WORD\", text:\"Keep each answer to a single word only.\" },\n            { tag:\"Examples\", text:\"Notice concrete examples (e.g., fountain) used to signal answers.\" },\n            { tag:\"Cause\u2192Effect\", text:\"Follow the lecture structure: limits \u2192 politics \u2192 problems \u2192 research \u2192 design.\" },\n            { tag:\"Key terms\", text:\"Words like \u2018culture\u2019, \u2018training\u2019, \u2018silent\u2019 are clear answer signals.\" }\n          ],\n          keywords: [\n            { term:\"acoustics\", def:\"the science of sound\" },\n            { term:\"decibels\", def:\"units for measuring sound level\" },\n            { term:\"noise map\", def:\"a map showing sound levels in an area\" },\n            { term:\"political\", def:\"related to public rules and government decisions\" },\n            { term:\"aesthetic\", def:\"related to beauty\/artistic quality\" },\n            { term:\"virtual reality\", def:\"computer-generated experience that feels real\" }\n          ],\n          transcript: [\n            { speaker:\"A\", text:\"This lecture will be about the science of acoustics, the study of sound, in relation to urban environments such as cities.\" },\n            { speaker:\"A\", text:\"Noise maps ignore issues such as the noise someone might hear from open windows or gardens of their neighbours.\" },\n            { speaker:\"A\", text:\"Noise is a political matter. We need rules and regulations.\" },\n            { speaker:\"A\", text:\"Noise can lead to stress. If schoolchildren don't have a quiet place to study, their work will suffer.\" },\n            { speaker:\"A\", text:\"Some pleasant sounds score highly in decibels, like the sound made by a fountain in a town square.\" },\n            { speaker:\"A\", text:\"Many researchers are using social science techniques to study emotional responses.\" },\n            { speaker:\"A\", text:\"A city needs to be lively, but not too intrusive, so people can relax.\" },\n            { speaker:\"A\", text:\"Architects and town planners receive very little training in this area.\" },\n            { speaker:\"A\", text:\"We need to understand factors such as how sound relates to culture and the nature of sound.\" },\n            { speaker:\"A\", text:\"Virtual reality programs could include realistic sounds. Currently, these programs are silent.\" }\n          ],\n          answers: {\n            31:[\"gardens\",\"garden\"],\n            32:[\"political\"],\n            33:[\"work\",\"study\"],\n            34:[\"fountain\"],\n            35:[\"social\"],\n            36:[\"lively\"],\n            37:[\"training\"],\n            38:[\"culture\"],\n            39:[\"nature\"],\n            40:[\"silent\"]\n          }\n        }\n      };\n\n      function buildTranscriptText(sec){\n        return sec.transcript.map(l => {\n          const who = (l.speaker === \"B\") ? \"Speaker B: \" : \"Speaker A: \";\n          return who + cleanForSpeech(l.text);\n        }).join(\"\\n\");\n      }\n\n      function renderTranscripts(){\n        Object.keys(sections).forEach(key => {\n          const secEl = root.querySelector(`[data-section=\"${key}\"]`);\n          if (!secEl) return;\n          const area = $('[data-el=\"transcript-area\"]', secEl);\n          if (area) area.textContent = buildTranscriptText(sections[key]);\n        });\n      }\n\n      async function playAudio(sectionKey){\n        if (!speechOk) return;\n        stopSpeaking();\n        const myRun = playRunId;\n        showLoader(true);\n\n        const sec = sections[sectionKey];\n        if (!sec) { showLoader(false); return; }\n\n        await sayWithVoice(\"Now listen.\", voiceA || null, { lang:\"en-US\" });\n        if (playRunId !== myRun) { showLoader(false); return; }\n\n        for (const l of sec.transcript){\n          if (playRunId !== myRun) { showLoader(false); return; }\n          const v = (l.speaker === \"B\") ? (voiceB || null) : (voiceA || null);\n          const text = cleanForSpeech(l.text);\n          if (!text) continue;\n          await sayWithVoice(text, v, { lang:\"en-US\", rate:1.0, pitch:1.0 });\n        }\n\n        showLoader(false);\n      }\n\n      async function showSummary(sectionKey){\n        const secEl = root.querySelector(`[data-section=\"${sectionKey}\"]`);\n        const sec = sections[sectionKey];\n        if (!secEl || !sec) return;\n\n        setHelper(secEl, (area) => {\n          const p = document.createElement(\"p\");\n          const tag = document.createElement(\"span\");\n          tag.className = \"tag\";\n          tag.textContent = \"Summary\";\n          p.appendChild(tag);\n          p.append(\" \" + sec.summary);\n          area.appendChild(p);\n        });\n\n        if (speechOk){\n          stopSpeaking();\n          showLoader(true);\n          await sayWithVoice(\"Summary. \" + sec.summary, voiceA || null, { lang:\"en-US\" });\n          showLoader(false);\n        }\n      }\n\n      async function showMainIdeas(sectionKey){\n        const secEl = root.querySelector(`[data-section=\"${sectionKey}\"]`);\n        const sec = sections[sectionKey];\n        if (!secEl || !sec) return;\n\n        setHelper(secEl, (area) => {\n          const p = document.createElement(\"p\");\n          const tag = document.createElement(\"span\");\n          tag.className = \"tag\";\n          tag.textContent = \"Main ideas\";\n          p.appendChild(tag);\n          p.append(\" Tips:\");\n          area.appendChild(p);\n\n          const ul = document.createElement(\"ul\");\n          sec.mainIdeas.forEach(i => {\n            const li = document.createElement(\"li\");\n            const t = document.createElement(\"span\");\n            t.className = \"tag\";\n            t.textContent = i.tag;\n            li.appendChild(t);\n            li.append(i.text);\n            ul.appendChild(li);\n          });\n          area.appendChild(ul);\n        });\n\n        if (speechOk){\n          stopSpeaking();\n          showLoader(true);\n          const speakText = \"Main ideas. \" + sec.mainIdeas.map(i => `${i.tag}. ${i.text}`).join(\" \");\n          await sayWithVoice(speakText, voiceA || null, { lang:\"en-US\" });\n          showLoader(false);\n        }\n      }\n\n      async function showKeywords(sectionKey){\n        const secEl = root.querySelector(`[data-section=\"${sectionKey}\"]`);\n        const sec = sections[sectionKey];\n        if (!secEl || !sec) return;\n        const items = Array.isArray(sec.keywords) ? sec.keywords : [];\n\n        setHelper(secEl, (area) => {\n          const p = document.createElement(\"p\");\n          const tag = document.createElement(\"span\");\n          tag.className = \"tag\";\n          tag.textContent = \"Keywords\";\n          p.appendChild(tag);\n          p.append(\" Key vocabulary for this section:\");\n          area.appendChild(p);\n\n          const ul = document.createElement(\"ul\");\n          items.forEach(k => {\n            const li = document.createElement(\"li\");\n            li.innerHTML = `<strong>${k.term}<\/strong>: ${k.def}`;\n            ul.appendChild(li);\n          });\n          area.appendChild(ul);\n        });\n\n        if (speechOk && items.length){\n          stopSpeaking();\n          showLoader(true);\n          const speakText = \"Keywords. \" + items.map(k => `${k.term}. ${k.def}`).join(\" \");\n          await sayWithVoice(speakText, voiceA || null, { lang:\"en-US\" });\n          showLoader(false);\n        }\n      }\n\n      function checkSection(sectionKey){\n        const secEl = root.querySelector(`[data-section=\"${sectionKey}\"]`);\n        const sec = sections[sectionKey];\n        if (!secEl || !sec) return;\n\n        let correct = 0;\n        const total = sec.qList.length;\n\n        sec.qList.forEach(q => setFB(secEl, q, \"\", \"\"));\n\n        sec.qList.forEach(q => {\n          const got = getUserAnswer(secEl, q);\n          const raw = String(got.value || \"\").trim();\n\n          if (!raw){\n            setFB(secEl, q, \"Please answer this question.\", \"#8a5a00\");\n            return;\n          }\n\n          if (got.kind === \"text\" || got.kind === \"word\"){\n            const tc = tokenCount(raw);\n            if (sec.rule === \"oneWordOnly\" && tc !== 1){\n              setFB(secEl, q, \"\u26a0\ufe0f ONE WORD ONLY.\", \"#8a5a00\");\n              return;\n            }\n            if (sec.rule === \"oneWordOrNumber\" && tc > 2){\n              setFB(secEl, q, \"\u26a0\ufe0f ONE WORD and\/or A NUMBER only.\", \"#8a5a00\");\n              return;\n            }\n          }\n\n          const user = norm(raw);\n\n          const ok = (sec.answers[q] || []).some(a => norm(a) === user);\n\n          if (ok){\n            correct++;\n            setFB(secEl, q, `\u2705 Correct (${String(sec.answers[q][0]).toUpperCase()})`, \"#065f46\");\n          } else {\n            setFB(secEl, q, `\u274c Not correct. Correct answer: ${String(sec.answers[q][0]).toUpperCase()}`, \"#991b1b\");\n          }\n        });\n\n        secEl.dataset.correct = String(correct);\n        secEl.dataset.total = String(total);\n        setSectionScore(secEl, `Score: ${correct}\/${total}`);\n\n        if (speechOk){\n          showLoader(true);\n          sayWithVoice(`Your score for ${sec.title} is ${correct} out of ${total}.`, voiceA || null, { lang:\"en-US\" })\n            .then(() => showLoader(false));\n        }\n      }\n\n      function showAnswers(sectionKey){\n        const secEl = root.querySelector(`[data-section=\"${sectionKey}\"]`);\n        const sec = sections[sectionKey];\n        if (!secEl || !sec) return;\n\n        sec.qList.forEach(q => {\n          setFB(secEl, q, `Correct answer: ${String(sec.answers[q][0]).toUpperCase()}`, \"#0f172a\");\n        });\n\n        setSectionScore(secEl, \"Correct answers are shown.\");\n      }\n\n      function resetSection(sectionKey){\n        const secEl = root.querySelector(`[data-section=\"${sectionKey}\"]`);\n        const sec = sections[sectionKey];\n        if (!secEl || !sec) return;\n\n        clearInputs(secEl);\n        sec.qList.forEach(q => setFB(secEl, q, \"\", \"\"));\n        secEl.dataset.correct = \"0\";\n        secEl.dataset.total = String(sec.qList.length);\n        setSectionScore(secEl, \"\");\n        clearSupport(secEl);\n        stopSpeaking();\n      }\n\n      function updateOverallScore(){\n        let totalC = 0, totalT = 0;\n        [\"s1\",\"s2\",\"s3\",\"s4\"].forEach(k => {\n          const el = root.querySelector(`[data-section=\"${k}\"]`);\n          if (!el) return;\n          const c = Number(el.dataset.correct || 0);\n          const t = Number(el.dataset.total || 0);\n          if (t > 0){ totalC += c; totalT += t; }\n        });\n        const box = $('[data-el=\"overallScoreBox\"]');\n        if (box){\n          box.textContent = totalT ? `Overall: ${totalC}\/${totalT}` : \"\";\n        }\n      }\n\n      function markCurrentMenu(){\n        const here = (location.href || \"\").replace(\/\\\/$\/, \"\");\n        root.querySelectorAll(\".icte-menu a\").forEach(a => {\n          const href = (a.href || \"\").replace(\/\\\/$\/, \"\");\n          if (href && (here === href || here.startsWith(href + \"\/\"))) a.classList.add(\"is-current\");\n        });\n      }\n\n      function wire(){\n        root.addEventListener(\"click\", (e) => {\n          const btn = e.target.closest(\"button[data-action]\");\n          if (!btn) return;\n\n          const action = btn.getAttribute(\"data-action\");\n          const secEl = btn.closest(\"[data-section]\");\n          const sectionKey = secEl ? secEl.getAttribute(\"data-section\") : null;\n\n          if (action === \"stop-audio\") return stopSpeaking();\n          if (action === \"scroll-sec1\") return document.getElementById(\"sec1\")?.scrollIntoView({behavior:\"smooth\"});\n          if (action === \"scroll-sec2\") return document.getElementById(\"sec2\")?.scrollIntoView({behavior:\"smooth\"});\n          if (action === \"scroll-sec3\") return document.getElementById(\"sec3\")?.scrollIntoView({behavior:\"smooth\"});\n          if (action === \"scroll-sec4\") return document.getElementById(\"sec4\")?.scrollIntoView({behavior:\"smooth\"});\n\n          if (!sectionKey) return;\n\n          if (action === \"toggle-transcript\") return toggleTranscript(secEl);\n          if (action === \"play-audio\") return playAudio(sectionKey);\n          if (action === \"check\") return checkSection(sectionKey);\n          if (action === \"show\") return showAnswers(sectionKey);\n          if (action === \"summary\") return showSummary(sectionKey);\n          if (action === \"main-ideas\") return showMainIdeas(sectionKey);\n          if (action === \"keywords\") return showKeywords(sectionKey);\n          if (action === \"reset\") return resetSection(sectionKey);\n          if (action === \"clear-support\") return clearSupport(secEl);\n        });\n      }\n\n      function init(){\n        loadVoices();\n        renderTranscripts();\n        wire();\n        markCurrentMenu();\n\n        [\"s1\",\"s2\",\"s3\",\"s4\"].forEach(k => {\n          const el = root.querySelector(`[data-section=\"${k}\"]`);\n          if (!el) return;\n          el.dataset.correct = \"0\";\n          el.dataset.total = String(sections[k].qList.length);\n          clearSupport(el);\n        });\n        updateOverallScore();\n      }\n\n      if (document.readyState === \"loading\") document.addEventListener(\"DOMContentLoaded\", init);\n      else init();\n    })();\n  <\/script>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Overview Test 1 Test 2 Test 3 Test 4 Reading Speaking Writing IELTS Listening \u2013 Test 4 (Sections 1\u20134) Practice<\/p>\n","protected":false},"author":1,"featured_media":584,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"colormag_page_layout":"default_layout","footnotes":""},"categories":[25,28,33],"tags":[],"class_list":["post-600","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ielts","category-listening","category-test-4"],"_links":{"self":[{"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/posts\/600","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/comments?post=600"}],"version-history":[{"count":2,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/posts\/600\/revisions"}],"predecessor-version":[{"id":704,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/posts\/600\/revisions\/704"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/media\/584"}],"wp:attachment":[{"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/media?parent=600"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/categories?post=600"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/i-cte.org\/robot\/wp-json\/wp\/v2\/tags?post=600"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}