Convert it to a colourful journal club presentation for md anesthesia

Reading File
Reading File
Reading File
Running Command

python3 -c " import pdfplumber pdf_path = '/tmp/workspace/attachments/aff2d1ce-49f4-41aa-8959-70d8fb8dc4e5/DOC-20260725-WA0003..pdf' with pdfplumber.open(pdf_path) as pdf: print(f'Total pages: {len(pdf.pages)}') for i, page in enumerate(pdf.pages): text = page.extract_text() print(f'\\n=== PAGE {i+1} ===') print(text[:3000] if text else '[No text]') "

Running Command

mkdir -p /tmp/workspace/journal-club-peds-cpr && python3 << 'PYEOF' from pptx import Presentation from pptx.util import Inches, Pt, Emu from pptx.dml.color import RGBColor from pptx.enum.text import PP_ALIGN, MSO_ANCHOR from pptx.util import Inches, Pt from pptx.dml.color import RGBColor from pptx.enum.text import PP_ALIGN import copy from lxml import etree prs = Presentation() prs.slide_width = Inches(13.333) prs.slide_height = Inches(7.5) blank = prs.slide_layouts[6] # fully blank # ─── COLOUR PALETTE ──────────────────────────────────────────── DARK_NAVY = RGBColor(0x0D, 0x1B, 0x3E) # slide bg TEAL = RGBColor(0x00, 0xB8, 0xB0) # accent 1 CORAL = RGBColor(0xFF, 0x5C, 0x5C) # accent 2 / alert AMBER = RGBColor(0xFF, 0xBE, 0x00) # accent 3 LIME = RGBColor(0x5C, 0xD6, 0x5C) # accent 4 LIGHT_BLUE = RGBColor(0x6E, 0xC6, 0xFF) # accent 5 WHITE = RGBColor(0xFF, 0xFF, 0xFF) LIGHT_GRAY = RGBColor(0xEC, 0xF0, 0xF1) MID_GRAY = RGBColor(0x95, 0xA5, 0xA6) CARD_BG = RGBColor(0x14, 0x2A, 0x5E) # slightly lighter navy for cards # ─── HELPERS ─────────────────────────────────────────────────── def bg(slide, color=DARK_NAVY): bg_shape = slide.shapes.add_shape( 1, # MSO_SHAPE_TYPE.RECTANGLE=1 / use auto shape rectangle Inches(0), Inches(0), prs.slide_width, prs.slide_height ) bg_shape.fill.solid() bg_shape.fill.fore_color.rgb = color bg_shape.line.fill.background() return bg_shape def accent_bar(slide, color=TEAL, h=Inches(0.08)): bar = slide.shapes.add_shape(1, Inches(0), Inches(0), prs.slide_width, h) bar.fill.solid(); bar.fill.fore_color.rgb = color bar.line.fill.background() def bottom_bar(slide, color=TEAL, h=Inches(0.07)): bar = slide.shapes.add_shape(1, Inches(0), prs.slide_height - h, prs.slide_width, h) bar.fill.solid(); bar.fill.fore_color.rgb = color bar.line.fill.background() def add_rect(slide, x, y, w, h, fill_color, line_color=None, line_width=None): shape = slide.shapes.add_shape(1, x, y, w, h) shape.fill.solid(); shape.fill.fore_color.rgb = fill_color if line_color: shape.line.color.rgb = line_color if line_width: shape.line.width = line_width else: shape.line.fill.background() return shape def add_text(slide, text, x, y, w, h, font_name="Calibri", size=20, bold=False, italic=False, color=WHITE, align=PP_ALIGN.LEFT, wrap=True, anchor=MSO_ANCHOR.TOP): tb = slide.shapes.add_textbox(x, y, w, h) tf = tb.text_frame tf.word_wrap = wrap tf.vertical_anchor = anchor tf.margin_left = Pt(2); tf.margin_right = Pt(2) tf.margin_top = Pt(2); tf.margin_bottom = Pt(2) p = tf.paragraphs[0] p.alignment = align run = p.add_run() run.text = text run.font.name = font_name run.font.size = Pt(size) run.font.bold = bold run.font.italic = italic run.font.color.rgb = color return tb def add_bullet_box(slide, items, x, y, w, h, bullet="▶", bullet_color=TEAL, text_color=WHITE, font_size=17, title=None, title_color=AMBER, bg_color=CARD_BG, line_color=TEAL): # card bg add_rect(slide, x, y, w, h, bg_color, line_color, Pt(1.5)) cur_y = y + Inches(0.12) if title: tb = slide.shapes.add_textbox(x + Inches(0.15), cur_y, w - Inches(0.3), Inches(0.38)) tf = tb.text_frame; tf.word_wrap = True p = tf.paragraphs[0]; p.alignment = PP_ALIGN.LEFT r = p.add_run(); r.text = title r.font.name = "Calibri"; r.font.size = Pt(font_size+1) r.font.bold = True; r.font.color.rgb = title_color cur_y += Inches(0.38) item_h = (h - (cur_y - y) - Inches(0.1)) / max(len(items), 1) for item in items: tb2 = slide.shapes.add_textbox(x + Inches(0.15), cur_y, w - Inches(0.3), max(item_h, Inches(0.32))) tf2 = tb2.text_frame; tf2.word_wrap = True p2 = tf2.paragraphs[0]; p2.alignment = PP_ALIGN.LEFT r_b = p2.add_run(); r_b.text = bullet + " " r_b.font.name = "Calibri"; r_b.font.size = Pt(font_size-1) r_b.font.color.rgb = bullet_color r_t = p2.add_run(); r_t.text = item r_t.font.name = "Calibri"; r_t.font.size = Pt(font_size-1) r_t.font.color.rgb = text_color cur_y += item_h # ═══════════════════════════════════════════════════════════════ # SLIDE 1 — TITLE # ═══════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) bg(s) # Gradient-ish left panel add_rect(s, Inches(0), Inches(0), Inches(5.2), prs.slide_height, RGBColor(0x00,0x4E,0x7C)) # Decorative circles for (cx, cy, cr, col) in [ (Inches(0.6), Inches(1.2), Inches(1.4), TEAL), (Inches(4.2), Inches(6.5), Inches(1.0), CORAL), (Inches(1.5), Inches(6.8), Inches(0.7), AMBER), ]: c = s.shapes.add_shape(9, cx-cr/2, cy-cr/2, cr, cr) # oval c.fill.solid(); c.fill.fore_color.rgb = col c.fill.fore_color.theme_color = None # set transparency from lxml import etree as ET solidFill = c.fill._xPr.find('.//{http://schemas.openxmlformats.org/drawingml/2006/main}solidFill') if solidFill is not None: srgbClr = solidFill.find('{http://schemas.openxmlformats.org/drawingml/2006/main}srgbClr') if srgbClr is None: srgbClr = solidFill.find('{http://schemas.openxmlformats.org/drawingml/2006/main}sysClr') c.line.fill.background() # Journal Club badge badge = add_rect(s, Inches(5.5), Inches(0.55), Inches(3.4), Inches(0.52), TEAL) add_text(s, "JOURNAL CLUB PRESENTATION", Inches(5.55), Inches(0.58), Inches(3.3), Inches(0.46), size=13, bold=True, color=DARK_NAVY, align=PP_ALIGN.CENTER) # Main title add_text(s, "What's New in the 2026 Pediatric Cardiopulmonary Resuscitation Recommendations", Inches(5.3), Inches(1.25), Inches(7.6), Inches(2.6), size=28, bold=True, color=WHITE, align=PP_ALIGN.LEFT) # Journal citation add_text(s, "Anales de Pediatría 104 (2026) | López-Herce Cid J et al.", Inches(5.3), Inches(3.95), Inches(7.5), Inches(0.45), size=14, italic=True, color=LIGHT_BLUE, align=PP_ALIGN.LEFT) # Separator line bar = s.shapes.add_shape(1, Inches(5.3), Inches(4.5), Inches(7.5), Inches(0.04)) bar.fill.solid(); bar.fill.fore_color.rgb = AMBER; bar.line.fill.background() # Presenter info add_text(s, "Presented by: ___________________________", Inches(5.3), Inches(4.65), Inches(7.5), Inches(0.45), size=15, color=LIGHT_GRAY) add_text(s, "MD Anesthesia | Journal Club", Inches(5.3), Inches(5.15), Inches(7.5), Inches(0.4), size=15, color=AMBER) add_text(s, "Date: July 2026", Inches(5.3), Inches(5.6), Inches(7.5), Inches(0.4), size=14, color=MID_GRAY) # Left panel text add_text(s, "GERCPPYN\nSpanish Pediatric &\nNeonatal CPR Group", Inches(0.2), Inches(2.2), Inches(4.7), Inches(1.8), size=18, bold=True, color=WHITE, align=PP_ALIGN.CENTER) add_text(s, "Adapting 2025 ILCOR / ERC\nGuidelines for Spain", Inches(0.2), Inches(4.2), Inches(4.7), Inches(1.2), size=15, italic=True, color=LIGHT_BLUE, align=PP_ALIGN.CENTER) accent_bar(s, AMBER); bottom_bar(s, CORAL) # ═══════════════════════════════════════════════════════════════ # SLIDE 2 — PAPER AT A GLANCE # ═══════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) bg(s) accent_bar(s, TEAL); bottom_bar(s, TEAL) # Slide title bar add_rect(s, Inches(0), Inches(0.08), Inches(13.333), Inches(0.75), CARD_BG) add_text(s, "📋 PAPER AT A GLANCE", Inches(0.3), Inches(0.1), Inches(12), Inches(0.72), size=26, bold=True, color=TEAL, align=PP_ALIGN.LEFT) # 4 info cards cards = [ ("🎯 OBJECTIVE", ["Adapt 2025 ILCOR international CPR guidelines", "for clinical practice and training in Spain"]), ("🔬 METHODS", ["Critical analysis of 2025 ERC / ILCOR", "pediatric CPR guidelines", "Produced by Spanish GERCPPYN group"]), ("🏥 JOURNAL", ["Anales de Pediatría 104 (2026)", "DOI: 10.1016/j.anpedi.2026.504162", "Open access — CC BY-NC-ND 4.0"]), ("👥 AUTHORS", ["López-Herce Cid, del Castillo, Pons Morales,", "Manrique Martínez, Sebastián Barberán,", "Rodríguez Núñez, Escudero Lirio"]), ] colors = [TEAL, CORAL, AMBER, LIME] cw = Inches(3.0); ch = Inches(2.8); cy = Inches(1.05); gap = Inches(0.22) for i,(title,items) in enumerate(cards): cx = Inches(0.22) + i*(cw+gap) add_rect(s, cx, cy, cw, ch, CARD_BG, colors[i], Pt(2)) # top accent strip strip = s.shapes.add_shape(1, cx, cy, cw, Inches(0.12)) strip.fill.solid(); strip.fill.fore_color.rgb = colors[i]; strip.line.fill.background() add_text(s, title, cx+Inches(0.1), cy+Inches(0.15), cw-Inches(0.2), Inches(0.42), size=15, bold=True, color=colors[i]) for j,item in enumerate(items): add_text(s, "• "+item, cx+Inches(0.1), cy+Inches(0.62)+j*Inches(0.64), cw-Inches(0.2), Inches(0.62), size=13, color=LIGHT_GRAY) # Key question box add_rect(s, Inches(0.22), Inches(4.15), Inches(12.9), Inches(0.65), RGBColor(0x1A,0x35,0x6E), AMBER, Pt(1.5)) add_text(s, "❓ KEY QUESTION: What are the most important 2026 updates to pediatric BLS & ALS that anesthesiologists must know?", Inches(0.35), Inches(4.2), Inches(12.6), Inches(0.55), size=16, bold=True, color=AMBER, align=PP_ALIGN.LEFT) # ═══════════════════════════════════════════════════════════════ # SLIDE 3 — BLS UPDATES # ═══════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) bg(s) accent_bar(s, LIME); bottom_bar(s, LIME) add_rect(s, Inches(0), Inches(0.08), Inches(13.333), Inches(0.75), CARD_BG) add_text(s, "🫁 BASIC LIFE SUPPORT — KEY 2026 CHANGES", Inches(0.3), Inches(0.1), Inches(12), Inches(0.72), size=24, bold=True, color=LIME) # Left column left_items = [ ("📞 EMS Activation", ["Call 112 IMMEDIATELY on speakerphone", "Eliminates prior 5 rescue breaths before calling", "Unifies pediatric + adult BLS algorithms"]), ("👁 Simultaneous Assessment", ["Assess breathing AND all vital signs together", "(Previously sequential)", "Speeds up recognition of cardiac arrest"]), ] right_items = [ ("👐 Infant Chest Compressions", ["Two-thumb encircling technique — now for BOTH:", "→ CPR chest compressions", "→ Foreign body airway obstruction relief", "Replaces two-finger technique for FBAO in infants"]), ("🔄 Algorithm Simplification", ["Steps reduced to aid faster action & learning", "Unified with adult algorithm for lay rescuers", "Single-rescuer: CPR 1 min ONLY if no mobile phone"]), ] lw = Inches(6.0); rw = Inches(6.0) lx = Inches(0.22); rx = Inches(6.55) colors_l = [LIME, TEAL]; colors_r = [AMBER, CORAL] cy = Inches(1.0) for i, (title, items) in enumerate(left_items): h = Inches(1.0) + len(items)*Inches(0.36) add_rect(s, lx, cy, lw, h, CARD_BG, colors_l[i], Pt(1.5)) add_text(s, title, lx+Inches(0.12), cy+Inches(0.07), lw-Inches(0.25), Inches(0.4), size=15, bold=True, color=colors_l[i]) for j, item in enumerate(items): add_text(s, "▸ "+item, lx+Inches(0.12), cy+Inches(0.5)+j*Inches(0.36), lw-Inches(0.25), Inches(0.36), size=13, color=WHITE) cy += h + Inches(0.18) cy = Inches(1.0) for i, (title, items) in enumerate(right_items): h = Inches(1.0) + len(items)*Inches(0.36) add_rect(s, rx, cy, rw, h, CARD_BG, colors_r[i], Pt(1.5)) add_text(s, title, rx+Inches(0.12), cy+Inches(0.07), rw-Inches(0.25), Inches(0.4), size=15, bold=True, color=colors_r[i]) for j, item in enumerate(items): add_text(s, "▸ "+item, rx+Inches(0.12), cy+Inches(0.5)+j*Inches(0.36), rw-Inches(0.25), Inches(0.36), size=13, color=WHITE) cy += h + Inches(0.18) # ═══════════════════════════════════════════════════════════════ # SLIDE 4 — FBAO # ═══════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) bg(s) accent_bar(s, AMBER); bottom_bar(s, AMBER) add_rect(s, Inches(0), Inches(0.08), Inches(13.333), Inches(0.75), CARD_BG) add_text(s, "🫁 FOREIGN BODY AIRWAY OBSTRUCTION (FBAO) — 2026", Inches(0.3), Inches(0.1), Inches(12), Inches(0.72), size=23, bold=True, color=AMBER) # Flow boxes flow = [ ("INEFFECTIVE COUGH?", CORAL, "Assess severity — Is cough weak, silent, or absent?"), ("BACK BLOWS (×5)", TEAL, "Heel of hand — firm interscapular blows"), ("CHEST / ABDOMINAL THRUSTS (×5)", LIME, "Infants: chest thrusts (encircling grip)\nChildren: abdominal thrusts (Heimlich)"), ("KEY CHANGE — INFANTS", AMBER, "Chest thrusts now use SAME two-thumb encircling technique as CPR\n(previously: 2 fingers)"), ("EVIDENCE GAP", MID_GRAY, "Insufficient evidence to recommend suction devices as first-line for FBAO"), ] bw = Inches(12.4); bh = Inches(0.82) bx = Inches(0.46) by = Inches(1.0) for i, (label, col, text) in enumerate(flow): add_rect(s, bx, by, bw, bh, CARD_BG, col, Pt(2)) strip = s.shapes.add_shape(1, bx, by, Inches(0.22), bh) strip.fill.solid(); strip.fill.fore_color.rgb = col; strip.line.fill.background() add_text(s, label, bx+Inches(0.3), by+Inches(0.04), Inches(3.2), bh-Inches(0.08), size=14, bold=True, color=col) add_text(s, text, bx+Inches(3.6), by+Inches(0.04), Inches(8.5), bh-Inches(0.08), size=13, color=WHITE) if i < len(flow)-1: arr = s.shapes.add_shape(1, Inches(6.4), by+bh, Inches(0.5), Inches(0.12)) arr.fill.solid(); arr.fill.fore_color.rgb = col; arr.line.fill.background() by += bh + Inches(0.12) # ═══════════════════════════════════════════════════════════════ # SLIDE 5 — ALS OVERVIEW # ═══════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) bg(s) accent_bar(s, CORAL); bottom_bar(s, CORAL) add_rect(s, Inches(0), Inches(0.08), Inches(13.333), Inches(0.75), CARD_BG) add_text(s, "⚡ ADVANCED LIFE SUPPORT — KEY 2026 CHANGES", Inches(0.3), Inches(0.1), Inches(12), Inches(0.72), size=24, bold=True, color=CORAL) als_updates = [ ("🫀 Adrenaline Timing", CORAL, ["First dose ASAP — as before", "Subsequent doses: every 4 MIN (was 3-5 min)", "Reason: aligns with 2-min CPR cycle check intervals", "Facilitates training & synchronisation"]), ("💊 Defibrillation Pad Position", AMBER, ["< 25 kg OR < 8 years → ANTEROPOSTERIOR position", "> 25 kg / adolescents → anterolateral OR anteroposterior", "Anteroposterior may optimise current flow", "Same for SAED and manual defibrillation"]), ("📊 Haemodynamic Targets", TEAL, ["Use intra-arterial line diastolic BP as target", "Infants: aim ≥ 25 mmHg diastolic", "Children: aim ≥ 30 mmHg diastolic", "Associated with improved survival"]), ("🌬 Ventilation During CPR", LIME, ["No advanced airway: 15 compressions : 2 ventilations with 100% O₂", "Intubated / SGA: continuous compressions + async ventilation", "Rate: 25 bpm (infant), 20 (1-8yr), 15 (8-12yr), 10 (>12yr)", "Limit intubation attempts to max 2"]), ] cw = Inches(6.0); ch = Inches(2.55); gap = Inches(0.22) positions = [(Inches(0.22), Inches(1.0)), (Inches(6.55), Inches(1.0)), (Inches(0.22), Inches(3.8)), (Inches(6.55), Inches(3.8))] for i, (title, col, items) in enumerate(als_updates): cx, cy = positions[i] add_rect(s, cx, cy, cw, ch, CARD_BG, col, Pt(2)) strip = s.shapes.add_shape(1, cx, cy, cw, Inches(0.1)) strip.fill.solid(); strip.fill.fore_color.rgb = col; strip.line.fill.background() add_text(s, title, cx+Inches(0.12), cy+Inches(0.13), cw-Inches(0.25), Inches(0.4), size=15, bold=True, color=col) for j, item in enumerate(items): add_text(s, "▸ "+item, cx+Inches(0.12), cy+Inches(0.57)+j*Inches(0.48), cw-Inches(0.25), Inches(0.46), size=12.5, color=LIGHT_GRAY) # ═══════════════════════════════════════════════════════════════ # SLIDE 6 — BICARBONATE + SPECIAL SITUATIONS # ═══════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) bg(s) accent_bar(s, LIGHT_BLUE); bottom_bar(s, LIGHT_BLUE) add_rect(s, Inches(0), Inches(0.08), Inches(13.333), Inches(0.75), CARD_BG) add_text(s, "💊 MEDICATIONS & SPECIAL SITUATIONS", Inches(0.3), Inches(0.1), Inches(12), Inches(0.72), size=24, bold=True, color=LIGHT_BLUE) # Bicarb card add_rect(s, Inches(0.22), Inches(1.0), Inches(6.0), Inches(2.9), CARD_BG, TEAL, Pt(2)) add_text(s, "🧪 Sodium Bicarbonate", Inches(0.35), Inches(1.1), Inches(5.7), Inches(0.42), size=16, bold=True, color=TEAL) bicarb_items = [ "No strong evidence for routine use during CPR", "CONSIDER in:", " → Tricyclic antidepressant toxicity", " → Calcium channel blocker toxicity", " → Hyperkalemia", " → Prolonged CA (> 10 min)", "Dose: 1 mEq/kg IV/IO (dilute 1:1 with NS)" ] for j, item in enumerate(bicarb_items): add_text(s, item, Inches(0.35), Inches(1.6)+j*Inches(0.33), Inches(5.7), Inches(0.33), size=13, color=WHITE if not item.startswith(" →") else LIGHT_BLUE) # Special situations card add_rect(s, Inches(6.55), Inches(1.0), Inches(6.55), Inches(2.9), CARD_BG, AMBER, Pt(2)) add_text(s, "⚠ Special Arrest Situations", Inches(6.68), Inches(1.1), Inches(6.2), Inches(0.42), size=16, bold=True, color=AMBER) special = [ "Hyperkalemia CA:", " → Insulin 0.1 U/kg IV + 10% Glucose 5 mL/kg", " → Salbutamol — first-line choices", " → Calcium & bicarb: NOT first-line", "Hypothermia (< 30°C):", " → Only ONE dose of adrenaline until temp rises", "Cardiac arrest in mechanically ventilated child:", " → May continue ventilator (disable triggers/limits)" ] for j, item in enumerate(special): col = AMBER if not item.startswith(" →") else LIGHT_GRAY add_text(s, item, Inches(6.68), Inches(1.58)+j*Inches(0.33), Inches(6.2), Inches(0.33), size=13, color=col) # Recognition banner add_rect(s, Inches(0.22), Inches(4.1), Inches(12.88), Inches(0.68), RGBColor(0x1A,0x35,0x6E), CORAL, Pt(1.5)) add_text(s, "🔍 RECOGNITION OF ARREST: Check signs of life + pulse + ECG + monitored vitals every 2 min | Interruptions < 5 sec | Change compressor every 2 min", Inches(0.35), Inches(4.15), Inches(12.6), Inches(0.58), size=13.5, bold=True, color=CORAL) # ═══════════════════════════════════════════════════════════════ # SLIDE 7 — DRUG TABLE # ═══════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) bg(s) accent_bar(s, AMBER); bottom_bar(s, AMBER) add_rect(s, Inches(0), Inches(0.08), Inches(13.333), Inches(0.75), CARD_BG) add_text(s, "💉 DRUG DOSES — PEDIATRIC RESUSCITATION 2026", Inches(0.3), Inches(0.1), Inches(12), Inches(0.72), size=24, bold=True, color=AMBER) # Table header headers = ["Drug", "Dose", "Route", "Indication"] col_ws = [Inches(2.0), Inches(4.5), Inches(1.5), Inches(4.8)] col_xs = [Inches(0.22)] for w in col_ws[:-1]: col_xs.append(col_xs[-1] + w + Inches(0.04)) row_h = Inches(0.48) hy = Inches(1.0) for i,(hdr,cw_,cx_) in enumerate(zip(headers, col_ws, col_xs)): add_rect(s, cx_, hy, cw_, row_h, TEAL) add_text(s, hdr, cx_+Inches(0.06), hy+Inches(0.04), cw_-Inches(0.1), row_h-Inches(0.08), size=14, bold=True, color=DARK_NAVY, align=PP_ALIGN.CENTER) drugs = [ ("Adrenaline", "0.01 mg/kg (max 1 mg) — IV/IO\n0.1 mg/kg IT", "IV/IO/IT", "Cardiac arrest"), ("Adenosine", "1st: 0.2 mg/kg (max 6 mg)\n2nd: 0.4 mg/kg (max 12 mg)", "IV/IO", "SVT"), ("Amiodarone", "5 mg/kg (max 300 mg)\nBolus for CA; infusion for SVT/VT", "IV/IO", "Refractory VF / pVT"), ("Atropine", "0.02 mg/kg (max 1 mg)", "IV/IO", "Vagal bradycardia"), ("Bicarbonate", "1 mEq/kg (max 50 mEq) diluted 1:1 NS", "IV/IO", "Refractory CA, toxicity, hyperK"), ("Calcium", "0.2 mEq/kg — Gluconate 10%: 0.4 mL/kg\nSlow infusion", "IV/IO", "Hypocalcemia, CCB toxicity"), ("Glucose", "0.2-0.4 g/kg — 10% = 2-4 mL/kg", "IV/IO", "Hypoglycemia"), ("Lidocaine", "1 mg/kg (max 100 mg)", "IV/IO", "Refractory VF / pVT"), ("Magnesium", "50 mg/kg — undiluted bolus", "IV/IO", "Torsades de pointes"), ("Fluids", "10-20 mL/kg — normal saline", "IV/IO", "PEA / Hypovolemia"), ] row_colors = [CARD_BG, RGBColor(0x10,0x22,0x4E)] for ri, (drug, dose, route, indication) in enumerate(drugs): ry = hy + row_h + ri * row_h rc = row_colors[ri % 2] for j, (val, cw_, cx_) in enumerate(zip([drug, dose, route, indication], col_ws, col_xs)): add_rect(s, cx_, ry, cw_, row_h, rc) tc = AMBER if j == 0 else (TEAL if j==2 else WHITE) add_text(s, val, cx_+Inches(0.06), ry+Inches(0.02), cw_-Inches(0.1), row_h-Inches(0.04), size=11.5, bold=(j==0), color=tc, align=PP_ALIGN.LEFT if j!=2 else PP_ALIGN.CENTER) # ═══════════════════════════════════════════════════════════════ # SLIDE 8 — POST-RESUSCITATION CARE # ═══════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) bg(s) accent_bar(s, TEAL); bottom_bar(s, TEAL) add_rect(s, Inches(0), Inches(0.08), Inches(13.333), Inches(0.75), CARD_BG) add_text(s, "🏥 POST-RESUSCITATION CARE — 2026 TARGETS", Inches(0.3), Inches(0.1), Inches(12), Inches(0.72), size=24, bold=True, color=TEAL) post_cards = [ ("🫁 Oxygenation", TEAL, ["SpO₂ target: 94-98%", "Avoid hyperoxia", "PaCO₂: 35-45 mmHg"]), ("💉 Blood Pressure", CORAL, ["Target > 10th percentile for age", "Aim for median BP (GERCPPYN rec)", "Use intra-arterial monitoring"]), ("🧠 Neuroprognostication", AMBER, ["Multimodal monitoring:", "→ Glasgow Coma Scale + pupils", "→ Early EEG within 24-48 h", "→ Biomarkers: S100B, NSE, NfL, GFAP", "→ Brain MRI on day 4", "No definitive prognosis < 3-4 days"]), ("👨‍👩‍👧 Follow-up", LIME, ["Long-term multidisciplinary follow-up", "Hospital + primary care involvement", "Social work + health professionals", "Assess neurological & developmental outcomes"]), ] cw = Inches(3.0); ch = Inches(3.3); gap = Inches(0.22) cy = Inches(1.0) for i, (title, col, items) in enumerate(post_cards): cx = Inches(0.22) + i*(cw+gap) add_rect(s, cx, cy, cw, ch, CARD_BG, col, Pt(2)) strip = s.shapes.add_shape(1, cx, cy, cw, Inches(0.12)) strip.fill.solid(); strip.fill.fore_color.rgb = col; strip.line.fill.background() add_text(s, title, cx+Inches(0.1), cy+Inches(0.16), cw-Inches(0.2), Inches(0.42), size=15, bold=True, color=col) for j, item in enumerate(items): yj = cy + Inches(0.65) + j*Inches(0.38) add_text(s, item, cx+Inches(0.1), yj, cw-Inches(0.2), Inches(0.38), size=12.5, color=WHITE if not item.startswith("→") else LIGHT_BLUE) # Capnography note add_rect(s, Inches(0.22), Inches(4.55), Inches(12.88), Inches(0.6), RGBColor(0x1A,0x35,0x6E), LIGHT_BLUE, Pt(1.5)) add_text(s, "📈 Capnography: useful for assessing chest compression effectiveness and detecting return of spontaneous circulation (ROSC)", Inches(0.35), Inches(4.6), Inches(12.6), Inches(0.5), size=14, bold=True, color=LIGHT_BLUE) # ═══════════════════════════════════════════════════════════════ # SLIDE 9 — TRAINING & EDUCATION # ═══════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) bg(s) accent_bar(s, LIME); bottom_bar(s, LIME) add_rect(s, Inches(0), Inches(0.08), Inches(13.333), Inches(0.75), CARD_BG) add_text(s, "🎓 TRAINING & EDUCATION — 2026 RECOMMENDATIONS", Inches(0.3), Inches(0.1), Inches(12), Inches(0.72), size=23, bold=True, color=LIME) train_items = [ ("👶 Start Early", LIME, ["Begin CPR training at age 4-6 years", "Integrate into annual school curricula"]), ("🎮 Modern Modalities", TEAL, ["Gamified training", "Rapid cycle deliberate practice (RCDP)", "Augmented reality & feedback devices", "Remote training options"]), ("🤝 Team Skills", AMBER, ["Include communication & teamwork in ALL courses", "Leadership, task allocation, closed-loop comms", "Not just technical skills"]), ("🏥 In Situ Simulation", CORAL, ["Workplace-based simulation recommended", "Each centre plans ongoing in-situ training", "Adapt to local resources & case mix"]), ("🌍 Public Awareness", LIGHT_BLUE, ["Train general population", "Paediatricians' responsibility extends beyond HCPs", "Collaborate with schools & institutions"]), ("🤖 AI & Technology", MID_GRAY, ["AI support tools — emerging recommendation", "Cognitive aids during resuscitation", "Feedback devices for CPR quality"]), ] cw = Inches(4.0); ch = Inches(1.85); gap = Inches(0.22) positions2 = [ (Inches(0.22), Inches(1.0)), (Inches(4.44), Inches(1.0)), (Inches(8.88), Inches(1.0)), (Inches(0.22), Inches(3.1)), (Inches(4.44), Inches(3.1)), (Inches(8.88), Inches(3.1)), ] for i, (title, col, items) in enumerate(train_items): cx, cy = positions2[i] add_rect(s, cx, cy, cw, ch, CARD_BG, col, Pt(2)) strip2 = s.shapes.add_shape(1, cx, cy, cw, Inches(0.09)) strip2.fill.solid(); strip2.fill.fore_color.rgb = col; strip2.line.fill.background() add_text(s, title, cx+Inches(0.1), cy+Inches(0.12), cw-Inches(0.2), Inches(0.38), size=14, bold=True, color=col) for j, item in enumerate(items): add_text(s, "• "+item, cx+Inches(0.1), cy+Inches(0.55)+j*Inches(0.36), cw-Inches(0.2), Inches(0.36), size=12.5, color=LIGHT_GRAY) # ═══════════════════════════════════════════════════════════════ # SLIDE 10 — KEY TAKEAWAYS FOR ANESTHESIA # ═══════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) bg(s) accent_bar(s, CORAL); bottom_bar(s, AMBER) add_rect(s, Inches(0), Inches(0.08), Inches(13.333), Inches(0.75), CARD_BG) add_text(s, "🏥 KEY TAKEAWAYS — MD ANESTHESIA PERSPECTIVE", Inches(0.3), Inches(0.1), Inches(12), Inches(0.72), size=23, bold=True, color=CORAL) takeaways = [ (CORAL, "1", "Adrenaline every 4 min", "Synchronise doses with 2-min CPR cycle checks — easier to remember intraoperatively"), (AMBER, "2", "Defibrillation pads", "< 25 kg → anteroposterior position mandatory; confirm before shocking"), (TEAL, "3", "Haemodynamic targets", "Monitor diastolic BP via art-line: ≥25 mmHg (infant), ≥30 mmHg (child) during CPR"), (LIME, "4", "Ventilated patient", "Can continue mechanical ventilator during CPR; disable triggers & limits"), (LIGHT_BLUE, "5", "Intubation limit", "Max 2 attempts; experienced personnel only; minimise compression interruptions"), (CORAL, "6", "Hypothermic arrest", "< 30°C: only 1 dose of adrenaline until temperature rises"), (AMBER, "7", "Bicarbonate", "Not routine — reserve for tricyclic/CCB toxicity, hyperK, or prolonged arrest >10 min"), (TEAL, "8", "Post-ROSC goals", "SpO₂ 94-98%, PaCO₂ 35-45, BP >10th percentile; brain MRI day 4 for neuroprognostication"), ] rh = Inches(0.6); ry = Inches(1.0) for col, num, title, detail in takeaways: add_rect(s, Inches(0.22), ry, Inches(0.5), rh, col) add_text(s, num, Inches(0.22), ry, Inches(0.5), rh, size=18, bold=True, color=DARK_NAVY, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE) add_rect(s, Inches(0.75), ry, Inches(3.0), rh, CARD_BG, col, Pt(1)) add_text(s, title, Inches(0.82), ry+Inches(0.06), Inches(2.88), rh-Inches(0.1), size=13.5, bold=True, color=col, anchor=MSO_ANCHOR.MIDDLE) add_rect(s, Inches(3.8), ry, Inches(9.3), rh, RGBColor(0x0F,0x1F,0x45), col, Pt(0.5)) add_text(s, detail, Inches(3.9), ry+Inches(0.06), Inches(9.1), rh-Inches(0.1), size=13, color=LIGHT_GRAY, anchor=MSO_ANCHOR.MIDDLE) ry += rh + Inches(0.04) # ═══════════════════════════════════════════════════════════════ # SLIDE 11 — CRITICAL APPRAISAL # ═══════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) bg(s) accent_bar(s, AMBER); bottom_bar(s, TEAL) add_rect(s, Inches(0), Inches(0.08), Inches(13.333), Inches(0.75), CARD_BG) add_text(s, "🔬 CRITICAL APPRAISAL", Inches(0.3), Inches(0.1), Inches(12), Inches(0.72), size=26, bold=True, color=AMBER) cols_data = [ ("✅ STRENGTHS", LIME, [ "Based on 2025 ILCOR — highest quality international evidence", "Produced by multi-society Spanish expert group", "Open access — widely applicable", "Simplifies algorithm → improves real-world compliance", "Unified pediatric + adult BLS facilitates lay rescuer training", ]), ("⚠ LIMITATIONS", AMBER, [ "Narrative / expert adaptation — not a new systematic review", "Evidence base for some recommendations remains low quality", "Bicarbonate: still no clear evidence for or against", "Applicability limited to Spain's healthcare context", "Figures from paper not reproduced in this slide", ]), ("💡 DISCUSSION POINTS", CORAL, [ "Is every 4 min adrenaline truly better than 3-5 min?", "Anteroposterior pad position: practical during emergency?", "DBP target — how feasible without intra-arterial line?", "Should we audit our own unit's pediatric CPR compliance?", "Role of AI/simulation in our training programme?", ]), ] cw = Inches(3.9); ch = Inches(4.6); gap = Inches(0.22) for i, (title, col, items) in enumerate(cols_data): cx = Inches(0.22) + i*(cw+gap) cy = Inches(1.0) add_rect(s, cx, cy, cw, ch, CARD_BG, col, Pt(2)) strip3 = s.shapes.add_shape(1, cx, cy, cw, Inches(0.12)) strip3.fill.solid(); strip3.fill.fore_color.rgb = col; strip3.line.fill.background() add_text(s, title, cx+Inches(0.1), cy+Inches(0.16), cw-Inches(0.2), Inches(0.45), size=16, bold=True, color=col) for j, item in enumerate(items): add_text(s, "▸ "+item, cx+Inches(0.1), cy+Inches(0.68)+j*Inches(0.76), cw-Inches(0.2), Inches(0.72), size=13, color=LIGHT_GRAY) # ═══════════════════════════════════════════════════════════════ # SLIDE 12 — THANK YOU # ═══════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) bg(s) # Colourful strip panels panel_colors = [TEAL, CORAL, AMBER, LIME, LIGHT_BLUE] pw = prs.slide_width / len(panel_colors) for i, col in enumerate(panel_colors): p = s.shapes.add_shape(1, int(i*pw), Inches(0), int(pw), Inches(0.45)) p.fill.solid(); p.fill.fore_color.rgb = col; p.line.fill.background() for i, col in enumerate(panel_colors): p = s.shapes.add_shape(1, int(i*pw), prs.slide_height-Inches(0.45), int(pw), Inches(0.45)) p.fill.solid(); p.fill.fore_color.rgb = col; p.line.fill.background() add_text(s, "THANK YOU", Inches(1), Inches(1.2), Inches(11.333), Inches(1.8), size=72, bold=True, color=TEAL, align=PP_ALIGN.CENTER) add_text(s, "Questions & Discussion", Inches(1), Inches(3.1), Inches(11.333), Inches(0.9), size=32, bold=False, color=AMBER, align=PP_ALIGN.CENTER) # Citation block add_rect(s, Inches(1.5), Inches(4.1), Inches(10.333), Inches(1.25), CARD_BG, TEAL, Pt(1)) add_text(s, "Reference:", Inches(1.65), Inches(4.18), Inches(10.0), Inches(0.38), size=13, bold=True, color=TEAL) add_text(s, "López-Herce Cid J et al. What's new in the 2026 pediatric cardiopulmonary resuscitation recommendations.\nAnales de Pediatría. 2026;104:504162. DOI: 10.1016/j.anpedi.2026.504162", Inches(1.65), Inches(4.56), Inches(10.0), Inches(0.72), size=12.5, italic=True, color=LIGHT_GRAY) add_text(s, "MD Anesthesia — Journal Club | July 2026", Inches(1), Inches(5.6), Inches(11.333), Inches(0.45), size=15, color=MID_GRAY, align=PP_ALIGN.CENTER) # ─── SAVE ────────────────────────────────────────────────────── out = "/tmp/workspace/journal-club-peds-cpr/Peds_CPR_2026_Journal_Club.pptx" prs.save(out) print("Saved:", out) PYEOF

Running Command

mkdir -p /tmp/workspace/journal-club-peds-cpr && python3 << 'PYEOF' from pptx import Presentation from pptx.util import Inches, Pt from pptx.dml.color import RGBColor from pptx.enum.text import PP_ALIGN, MSO_ANCHOR prs = Presentation() prs.slide_width = Inches(13.333) prs.slide_height = Inches(7.5) blank = prs.slide_layouts[6] # ── PALETTE ──────────────────────────────────────────────────── DARK_NAVY = RGBColor(0x0D,0x1B,0x3E) TEAL = RGBColor(0x00,0xB8,0xB0) CORAL = RGBColor(0xFF,0x5C,0x5C) AMBER = RGBColor(0xFF,0xBE,0x00) LIME = RGBColor(0x5C,0xD6,0x5C) LIGHT_BLUE = RGBColor(0x6E,0xC6,0xFF) WHITE = RGBColor(0xFF,0xFF,0xFF) LIGHT_GRAY = RGBColor(0xEC,0xF0,0xF1) MID_GRAY = RGBColor(0x95,0xA5,0xA6) CARD_BG = RGBColor(0x14,0x2A,0x5E) # ── HELPERS ──────────────────────────────────────────────────── def bg(slide, color=DARK_NAVY): sh = slide.shapes.add_shape(1, Inches(0), Inches(0), prs.slide_width, prs.slide_height) sh.fill.solid(); sh.fill.fore_color.rgb = color sh.line.fill.background() def hbar(slide, color, y, h): sh = slide.shapes.add_shape(1, Inches(0), y, prs.slide_width, h) sh.fill.solid(); sh.fill.fore_color.rgb = color sh.line.fill.background() def rect(slide, x, y, w, h, fill, border=None, bw=Pt(2)): sh = slide.shapes.add_shape(1, x, y, w, h) sh.fill.solid(); sh.fill.fore_color.rgb = fill if border: sh.line.color.rgb = border; sh.line.width = bw else: sh.line.fill.background() return sh def txt(slide, text, x, y, w, h, size=16, bold=False, italic=False, color=WHITE, align=PP_ALIGN.LEFT, wrap=True, anchor=MSO_ANCHOR.TOP, font="Calibri"): tb = slide.shapes.add_textbox(x, y, w, h) tf = tb.text_frame; tf.word_wrap = wrap tf.vertical_anchor = anchor tf.margin_left = Pt(2); tf.margin_right = Pt(2) tf.margin_top = Pt(2); tf.margin_bottom = Pt(2) p = tf.paragraphs[0]; p.alignment = align r = p.add_run(); r.text = text r.font.name = font; r.font.size = Pt(size) r.font.bold = bold; r.font.italic = italic r.font.color.rgb = color def title_bar(slide, label, color): hbar(slide, CARD_BG, Inches(0.08), Inches(0.75)) txt(slide, label, Inches(0.3), Inches(0.1), Inches(12.5), Inches(0.72), size=23, bold=True, color=color) def card(slide, x, y, w, h, fill, border, title, title_color, items, item_color=LIGHT_GRAY, item_size=13, title_size=15): rect(slide, x, y, w, h, fill, border) strip = slide.shapes.add_shape(1, x, y, w, Inches(0.1)) strip.fill.solid(); strip.fill.fore_color.rgb = border strip.line.fill.background() txt(slide, title, x+Inches(0.1), y+Inches(0.13), w-Inches(0.2), Inches(0.42), size=title_size, bold=True, color=title_color) row_h = (h - Inches(0.6)) / max(len(items), 1) for j, item in enumerate(items): txt(slide, item, x+Inches(0.1), y+Inches(0.58)+j*row_h, w-Inches(0.2), max(row_h, Inches(0.3)), size=item_size, color=item_color) # ══════════════════════════════════════════════════════════════ # SLIDE 1 — TITLE # ══════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) bg(s) # Left panel rect(s, Inches(0), Inches(0), Inches(5.2), prs.slide_height, RGBColor(0x00,0x4E,0x7C)) # Decorative ovals for cx,cy,cr,col in [(Inches(0.8),Inches(1.4),Inches(1.6),TEAL), (Inches(3.8),Inches(6.2),Inches(1.2),CORAL), (Inches(1.2),Inches(6.5),Inches(0.8),AMBER)]: ov = s.shapes.add_shape(9, cx-cr/2, cy-cr/2, cr, cr) ov.fill.solid(); ov.fill.fore_color.rgb = col ov.line.fill.background() # Badge rect(s, Inches(5.5), Inches(0.52), Inches(3.6), Inches(0.52), TEAL) txt(s, "JOURNAL CLUB | MD ANESTHESIA", Inches(5.55), Inches(0.55), Inches(3.5), Inches(0.46), size=13, bold=True, color=DARK_NAVY, align=PP_ALIGN.CENTER) txt(s, "What's New in the 2026 Pediatric\nCardiopulmonary Resuscitation\nRecommendations", Inches(5.3), Inches(1.2), Inches(7.7), Inches(2.8), size=30, bold=True, color=WHITE, align=PP_ALIGN.LEFT) txt(s, "Anales de Pediatria 104 (2026) | Lopez-Herce Cid J et al.", Inches(5.3), Inches(4.1), Inches(7.6), Inches(0.45), size=14, italic=True, color=LIGHT_BLUE, align=PP_ALIGN.LEFT) # amber line hbar(s, AMBER, Inches(4.65), Inches(0.05)) txt(s, "Presented by: ___________________________", Inches(5.3), Inches(4.78), Inches(7.6), Inches(0.42), size=15, color=LIGHT_GRAY) txt(s, "MD Anesthesia | Journal Club", Inches(5.3), Inches(5.25), Inches(7.6), Inches(0.4), size=15, bold=True, color=AMBER) txt(s, "Date: July 2026", Inches(5.3), Inches(5.7), Inches(7.6), Inches(0.38), size=14, color=MID_GRAY) txt(s, "GERCPPYN\nSpanish Pediatric & Neonatal CPR Group", Inches(0.2), Inches(2.3), Inches(4.7), Inches(1.4), size=17, bold=True, color=WHITE, align=PP_ALIGN.CENTER) txt(s, "Adapting 2025 ILCOR / ERC Guidelines\nfor Spain", Inches(0.2), Inches(3.9), Inches(4.7), Inches(1.1), size=14, italic=True, color=LIGHT_BLUE, align=PP_ALIGN.CENTER) hbar(s, AMBER, Inches(0), Inches(0.08)) hbar(s, CORAL, prs.slide_height-Inches(0.08), Inches(0.08)) # ══════════════════════════════════════════════════════════════ # SLIDE 2 — PAPER AT A GLANCE # ══════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) bg(s) hbar(s, TEAL, Inches(0), Inches(0.08)); hbar(s, TEAL, prs.slide_height-Inches(0.08), Inches(0.08)) title_bar(s, "PAPER AT A GLANCE", TEAL) cards_data = [ ("OBJECTIVE", TEAL, ["Adapt 2025 ILCOR CPR guidelines", "for clinical practice in Spain"]), ("METHODS", CORAL, ["Critical analysis of 2025 ERC/ILCOR", "pediatric CPR guidelines", "By Spanish GERCPPYN group"]), ("JOURNAL", AMBER, ["Anales de Pediatria 104 (2026)", "Open access CC BY-NC-ND 4.0"]), ("AUTHORS", LIME, ["Lopez-Herce Cid, del Castillo,", "Pons Morales, Manrique Martinez,", "Rodriguez Nunez, Escudero Lirio"]), ] cw=Inches(3.0); ch=Inches(2.8); cy=Inches(1.0); gap=Inches(0.22) for i,(t,c,items) in enumerate(cards_data): cx = Inches(0.22)+i*(cw+gap) card(s, cx, cy, cw, ch, CARD_BG, c, t, c, items) rect(s, Inches(0.22), Inches(4.1), Inches(12.88), Inches(0.68), RGBColor(0x1A,0x35,0x6E), AMBER, Pt(1.5)) txt(s, "KEY QUESTION: What are the most important 2026 updates to pediatric BLS & ALS that anesthesiologists must know?", Inches(0.35), Inches(4.18), Inches(12.6), Inches(0.55), size=16, bold=True, color=AMBER) # ══════════════════════════════════════════════════════════════ # SLIDE 3 — BLS CHANGES # ══════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) bg(s) hbar(s, LIME, Inches(0), Inches(0.08)); hbar(s, LIME, prs.slide_height-Inches(0.08), Inches(0.08)) title_bar(s, "BASIC LIFE SUPPORT - KEY 2026 CHANGES", LIME) bls_left = [ ("EMS ACTIVATION", LIME, ["Call 112 IMMEDIATELY with speakerphone", "Eliminates 5 rescue breaths before calling", "Unifies paediatric + adult BLS algorithms", "1-min CPR before seeking help ONLY if no phone"]), ("SIMULTANEOUS ASSESSMENT", TEAL, ["Assess breathing AND all vital signs together", "Previously done sequentially", "Speeds up cardiac arrest recognition"]), ] bls_right = [ ("INFANT CHEST COMPRESSIONS", AMBER, ["Two-thumb encircling technique now used for:", "-> CPR chest compressions", "-> Foreign body airway obstruction (FBAO)", "Replaces 2-finger technique for FBAO in infants"]), ("ALGORITHM SIMPLIFICATION", CORAL, ["Fewer steps -> faster action in emergencies", "Unified with adult CPR facilitates lay training", "If >1 rescuer: one starts CPR, other calls 112"]), ] def two_col_cards(slide, left_data, right_data): lx=Inches(0.22); rx=Inches(6.78); cw=Inches(6.3) cy=Inches(1.0) for (title,col,items),(title2,col2,items2) in zip(left_data, right_data): h = Inches(0.55) + max(len(items),len(items2))*Inches(0.46) card(slide, lx, cy, cw, h, CARD_BG, col, title, col, items, item_size=13) card(slide, rx, cy, cw, h, CARD_BG, col2, title2, col2, items2, item_size=13) cy += h + Inches(0.18) two_col_cards(s, bls_left, bls_right) # ══════════════════════════════════════════════════════════════ # SLIDE 4 — FBAO # ══════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) bg(s) hbar(s, AMBER, Inches(0), Inches(0.08)); hbar(s, AMBER, prs.slide_height-Inches(0.08), Inches(0.08)) title_bar(s, "FOREIGN BODY AIRWAY OBSTRUCTION (FBAO) - 2026", AMBER) flow = [ ("INEFFECTIVE COUGH?", CORAL, "Assess severity — weak, silent, or absent cough?"), ("BACK BLOWS x5", TEAL, "Heel of hand — firm interscapular blows"), ("CHEST / ABDOMINAL THRUSTS x5", LIME, "Infants: chest thrusts (encircling grip) | Children: abdominal thrusts (Heimlich)"), ("KEY CHANGE FOR INFANTS", AMBER, "Chest thrusts now use the SAME two-thumb encircling technique as basic CPR (previously: 2 fingers)"), ("EVIDENCE GAP", MID_GRAY, "Insufficient evidence to recommend suction devices as first-line intervention for FBAO in children"), ] bw=Inches(12.4); bh=Inches(0.85); bx=Inches(0.46); by=Inches(1.02) for label, col, detail in flow: rect(s, bx, by, bw, bh, CARD_BG, col, Pt(2)) strip = s.shapes.add_shape(1, bx, by, Inches(0.22), bh) strip.fill.solid(); strip.fill.fore_color.rgb = col; strip.line.fill.background() txt(s, label, bx+Inches(0.3), by+Inches(0.08), Inches(3.5), bh-Inches(0.1), size=14, bold=True, color=col, anchor=MSO_ANCHOR.MIDDLE) txt(s, detail, bx+Inches(3.9), by+Inches(0.08), Inches(8.3), bh-Inches(0.1), size=13, color=WHITE, anchor=MSO_ANCHOR.MIDDLE) by += bh + Inches(0.1) # ══════════════════════════════════════════════════════════════ # SLIDE 5 — ALS CHANGES # ══════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) bg(s) hbar(s, CORAL, Inches(0), Inches(0.08)); hbar(s, CORAL, prs.slide_height-Inches(0.08), Inches(0.08)) title_bar(s, "ADVANCED LIFE SUPPORT - KEY 2026 CHANGES", CORAL) als_cards = [ ("ADRENALINE TIMING", CORAL, ["First dose: ASAP as before", "Subsequent doses: every 4 MIN (was 3-5 min)", "Aligns with 2-min CPR cycle check intervals", "Facilitates training & synchronisation"]), ("DEFIBRILLATION PAD POSITION", AMBER, ["< 25 kg OR < 8 years -> ANTEROPOSTERIOR position", "> 25 kg / adolescents -> anterolateral OR AP", "AP may optimise defibrillation current flow", "Applies to both SAED and manual defibrillation"]), ("HAEMODYNAMIC TARGETS", TEAL, ["Use intra-arterial diastolic BP as target", "Infants: aim >= 25 mmHg diastolic during CPR", "Children: aim >= 30 mmHg diastolic during CPR", "Targets associated with improved survival"]), ("VENTILATION DURING CPR", LIME, ["No adv. airway: 15:2 (compressions:ventilations)", "Intubated/SGA: continuous compressions + async", "Rate: 25 bpm infant, 20 (1-8yr), 15 (8-12yr), 10 (>12yr)", "Max 2 intubation attempts; expert personnel only"]), ] cw=Inches(6.0); ch=Inches(2.55); gap=Inches(0.22) pos = [(Inches(0.22),Inches(1.0)),(Inches(6.55),Inches(1.0)), (Inches(0.22),Inches(3.82)),(Inches(6.55),Inches(3.82))] for i,(title,col,items) in enumerate(als_cards): cx,cy = pos[i] card(s, cx, cy, cw, ch, CARD_BG, col, title, col, items, item_size=13) # ══════════════════════════════════════════════════════════════ # SLIDE 6 — MEDICATIONS & SPECIAL SITUATIONS # ══════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) bg(s) hbar(s, LIGHT_BLUE, Inches(0), Inches(0.08)); hbar(s, LIGHT_BLUE, prs.slide_height-Inches(0.08), Inches(0.08)) title_bar(s, "MEDICATIONS & SPECIAL SITUATIONS", LIGHT_BLUE) # Bicarb card(s, Inches(0.22), Inches(1.0), Inches(6.0), Inches(3.0), CARD_BG, TEAL, "SODIUM BICARBONATE", TEAL, ["No strong evidence for routine use during CPR", "CONSIDER in:", " -> Tricyclic antidepressant toxicity", " -> Calcium channel blocker toxicity", " -> Hyperkalemia", " -> Prolonged CA (> 10 min)", "Dose: 1 mEq/kg IV/IO (diluted 1:1 with NS)"], item_size=13) # Special situations card(s, Inches(6.55), Inches(1.0), Inches(6.55), Inches(3.0), CARD_BG, AMBER, "SPECIAL ARREST SITUATIONS", AMBER, ["Hyperkalemia CA:", " -> Insulin 0.1 U/kg + 10% Glucose 5 mL/kg + Salbutamol", " -> Calcium & bicarb: NOT first-line", "Hypothermia (< 30 deg C):", " -> Only ONE adrenaline dose until temp rises", "Mechanically ventilated child:", " -> May continue ventilator; disable triggers/limits"], item_size=13) # Recognition banner rect(s, Inches(0.22), Inches(4.2), Inches(12.88), Inches(0.68), RGBColor(0x1A,0x35,0x6E), CORAL, Pt(1.5)) txt(s, "ARREST RECOGNITION: Signs of life + pulse + ECG + monitored vitals every 2 min | Interruptions < 5 sec | Change compressor every 2 min", Inches(0.35), Inches(4.28), Inches(12.6), Inches(0.55), size=13.5, bold=True, color=CORAL) # ══════════════════════════════════════════════════════════════ # SLIDE 7 — DRUG TABLE # ══════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) bg(s) hbar(s, AMBER, Inches(0), Inches(0.08)); hbar(s, AMBER, prs.slide_height-Inches(0.08), Inches(0.08)) title_bar(s, "DRUG DOSES - PEDIATRIC RESUSCITATION 2026", AMBER) headers = ["Drug","Dose","Route","Indication"] col_ws = [Inches(1.9), Inches(4.2), Inches(1.5), Inches(5.3)] col_xs = [Inches(0.12)] for w in col_ws[:-1]: col_xs.append(col_xs[-1]+w+Inches(0.03)) rh = Inches(0.46); hy = Inches(1.0) for hdr,cw_,cx_ in zip(headers, col_ws, col_xs): rect(s, cx_, hy, cw_, rh, TEAL) txt(s, hdr, cx_+Inches(0.06), hy+Inches(0.05), cw_-Inches(0.1), rh-Inches(0.08), size=14, bold=True, color=DARK_NAVY, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE) drugs = [ ("Adrenaline", "0.01 mg/kg (max 1 mg) IV/IO | 0.1 mg/kg IT", "IV/IO/IT", "Cardiac arrest"), ("Adenosine", "1st: 0.2 mg/kg (max 6 mg) 2nd: 0.4 mg/kg (max 12)", "IV/IO", "SVT"), ("Amiodarone", "5 mg/kg (max 300 mg) — bolus CA, infusion SVT/VT", "IV/IO", "Refractory VF / pVT"), ("Atropine", "0.02 mg/kg (max 1 mg)", "IV/IO", "Vagal bradycardia"), ("Bicarbonate", "1 mEq/kg (max 50 mEq) — dilute 1:1 NS", "IV/IO", "Refractory CA, toxicity, hyperK"), ("Calcium", "0.2 mEq/kg — Gluconate 10%: 0.4 mL/kg slow infusion","IV/IO", "Hypocalcemia / CCB toxicity"), ("Glucose", "0.2-0.4 g/kg — 10% glucose = 2-4 mL/kg", "IV/IO", "Hypoglycemia"), ("Lidocaine", "1 mg/kg (max 100 mg)", "IV/IO", "Refractory VF / pVT"), ("Magnesium", "50 mg/kg undiluted bolus", "IV/IO", "Torsades de Pointes"), ("Fluids", "10-20 mL/kg normal saline rapid bolus", "IV/IO", "PEA / Hypovolemia"), ] row_bg = [CARD_BG, RGBColor(0x10,0x22,0x4E)] for ri,(drug,dose,route,indication) in enumerate(drugs): ry = hy+rh+ri*rh rb = row_bg[ri%2] for val,cw_,cx_,tc in zip([drug,dose,route,indication], col_ws, col_xs, [AMBER,WHITE,TEAL,LIGHT_GRAY]): rect(s, cx_, ry, cw_, rh, rb) txt(s, val, cx_+Inches(0.06), ry+Inches(0.02), cw_-Inches(0.1), rh-Inches(0.04), size=11.5, bold=(val==drug), color=tc, align=PP_ALIGN.CENTER if val==route else PP_ALIGN.LEFT, anchor=MSO_ANCHOR.MIDDLE) # ══════════════════════════════════════════════════════════════ # SLIDE 8 — POST-RESUSCITATION CARE # ══════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) bg(s) hbar(s, TEAL, Inches(0), Inches(0.08)); hbar(s, TEAL, prs.slide_height-Inches(0.08), Inches(0.08)) title_bar(s, "POST-RESUSCITATION CARE - 2026 TARGETS", TEAL) post = [ ("OXYGENATION & VENTILATION", TEAL, ["SpO2 target: 94-98% (avoid hyperoxia)", "PaCO2: 35-45 mmHg (normocapnia)", "Avoid hyper/hypocapnia"]), ("BLOOD PRESSURE TARGETS", CORAL, ["Target > 10th percentile for age", "GERCPPYN: aim for median BP", "Use intra-arterial monitoring"]), ("NEUROPROGNOSTICATION", AMBER, ["Multimodal monitoring: GCS + pupils", "Early EEG within 24-48 h", "Biomarkers: S100B, NSE, NfL, GFAP", "Brain MRI recommended on day 4", "No definitive prognosis < 3-4 days"]), ("LONG-TERM FOLLOW-UP", LIME, ["Multidisciplinary follow-up after discharge", "Hospital + primary care involvement", "Social work + health professionals", "Neurodevelopmental assessment"]), ] cw=Inches(3.0); ch=Inches(3.3); gap=Inches(0.22); cy=Inches(1.0) for i,(title,col,items) in enumerate(post): cx = Inches(0.22)+i*(cw+gap) card(s, cx, cy, cw, ch, CARD_BG, col, title, col, items) rect(s, Inches(0.22), Inches(4.55), Inches(12.88), Inches(0.6), RGBColor(0x1A,0x35,0x6E), LIGHT_BLUE, Pt(1.5)) txt(s, "Capnography: useful for assessing compression effectiveness and detecting ROSC", Inches(0.35), Inches(4.62), Inches(12.6), Inches(0.5), size=14, bold=True, color=LIGHT_BLUE) # ══════════════════════════════════════════════════════════════ # SLIDE 9 — TRAINING # ══════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) bg(s) hbar(s, LIME, Inches(0), Inches(0.08)); hbar(s, LIME, prs.slide_height-Inches(0.08), Inches(0.08)) title_bar(s, "TRAINING & EDUCATION - 2026 RECOMMENDATIONS", LIME) train = [ ("START EARLY", LIME, ["CPR training from age 4-6 years", "Annual training in school curricula"]), ("MODERN MODALITIES", TEAL, ["Gamified training; RCDP", "Augmented reality & feedback devices", "Remote training"]), ("TEAM SKILLS", AMBER, ["Communication & teamwork in ALL courses", "Leadership, task allocation, closed-loop comms"]), ("IN-SITU SIMULATION", CORAL, ["Workplace simulation recommended", "Each centre plans ongoing training", "Adapt to local resources"]), ("PUBLIC AWARENESS", LIGHT_BLUE, ["Train general population", "Paediatricians responsible beyond HCPs", "Collaborate with schools/institutions"]), ("AI & TECHNOLOGY", MID_GRAY, ["AI support — emerging recommendation", "Cognitive aids during resuscitation", "Feedback devices for CPR quality"]), ] cw=Inches(4.0); ch=Inches(1.85); gap=Inches(0.22) pos = [(Inches(0.22),Inches(1.0)),(Inches(4.44),Inches(1.0)),(Inches(8.88),Inches(1.0)), (Inches(0.22),Inches(3.1)), (Inches(4.44),Inches(3.1)),(Inches(8.88),Inches(3.1))] for i,(title,col,items) in enumerate(train): cx,cy = pos[i] card(s, cx, cy, cw, ch, CARD_BG, col, title, col, items, item_size=13) # ══════════════════════════════════════════════════════════════ # SLIDE 10 — KEY TAKEAWAYS (ANESTHESIA) # ══════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) bg(s) hbar(s, CORAL, Inches(0), Inches(0.08)); hbar(s, AMBER, prs.slide_height-Inches(0.08), Inches(0.08)) title_bar(s, "KEY TAKEAWAYS - MD ANESTHESIA PERSPECTIVE", CORAL) takeaways = [ (CORAL, "1", "Adrenaline every 4 min", "Synchronise doses with 2-min CPR cycles — easier to remember intraoperatively"), (AMBER, "2", "Defibrillation pads", "< 25 kg -> anteroposterior position mandatory; confirm before shocking"), (TEAL, "3", "Haemodynamic targets", "Monitor diastolic BP via art-line: >=25 mmHg (infant), >=30 mmHg (child) during CPR"), (LIME, "4", "Ventilated patient", "Can continue mechanical ventilator during CPR — disable triggers & limits"), (LIGHT_BLUE, "5", "Intubation", "Max 2 attempts; experienced personnel only; minimise compression interruptions"), (CORAL, "6", "Hypothermic arrest", "< 30 deg C: only 1 adrenaline dose until temperature rises"), (AMBER, "7", "Bicarbonate", "Not routine — reserve for tricyclic/CCB toxicity, hyperK, or prolonged arrest > 10 min"), (TEAL, "8", "Post-ROSC goals", "SpO2 94-98%, PaCO2 35-45, BP > 10th %ile; brain MRI day 4 for neuroprognostication"), ] rh=Inches(0.6); ry=Inches(1.0) for col,num,title,detail in takeaways: rect(s, Inches(0.22), ry, Inches(0.5), rh, col) txt(s, num, Inches(0.22), ry, Inches(0.5), rh, size=18, bold=True, color=DARK_NAVY, align=PP_ALIGN.CENTER, anchor=MSO_ANCHOR.MIDDLE) rect(s, Inches(0.75), ry, Inches(2.9), rh, CARD_BG, col, Pt(1)) txt(s, title, Inches(0.82), ry+Inches(0.06), Inches(2.75), rh-Inches(0.1), size=13.5, bold=True, color=col, anchor=MSO_ANCHOR.MIDDLE) rect(s, Inches(3.7), ry, Inches(9.4), rh, RGBColor(0x0F,0x1F,0x45), col, Pt(0.5)) txt(s, detail, Inches(3.8), ry+Inches(0.04), Inches(9.2), rh-Inches(0.06), size=13, color=LIGHT_GRAY, anchor=MSO_ANCHOR.MIDDLE) ry += rh+Inches(0.04) # ══════════════════════════════════════════════════════════════ # SLIDE 11 — CRITICAL APPRAISAL # ══════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) bg(s) hbar(s, AMBER, Inches(0), Inches(0.08)); hbar(s, TEAL, prs.slide_height-Inches(0.08), Inches(0.08)) title_bar(s, "CRITICAL APPRAISAL", AMBER) crit = [ ("STRENGTHS", LIME, [ "Based on 2025 ILCOR — highest quality evidence", "Multi-society Spanish expert group (GERCPPYN)", "Open access — widely disseminable", "Simplifies algorithm -> improves real-world compliance", "Unified paediatric + adult BLS for lay rescuers", ]), ("LIMITATIONS", AMBER, [ "Narrative adaptation — not a new systematic review", "Evidence for some recommendations remains low quality", "Bicarbonate evidence still inconclusive", "Applicability specific to Spanish healthcare context", "Some recommendations are expert opinion level", ]), ("DISCUSSION", CORAL, [ "Is 4-min adrenaline truly better than 3-5 min?", "AP pad position — practical in rapid emergencies?", "DBP target: feasible without intra-arterial line?", "Audit: does our unit comply with current guidelines?", "Role of AI/simulation in our training programme?", ]), ] cw=Inches(3.9); ch=Inches(4.55); gap=Inches(0.22) for i,(title,col,items) in enumerate(crit): cx = Inches(0.22)+i*(cw+gap) card(s, cx, Inches(1.0), cw, ch, CARD_BG, col, title, col, items, item_size=13.5, title_size=16) # ══════════════════════════════════════════════════════════════ # SLIDE 12 — THANK YOU # ══════════════════════════════════════════════════════════════ s = prs.slides.add_slide(blank) bg(s) panel_cols = [TEAL, CORAL, AMBER, LIME, LIGHT_BLUE] pw = int(prs.slide_width / len(panel_cols)) for i,col in enumerate(panel_cols): for yy in [Inches(0), prs.slide_height-Inches(0.5)]: p = s.shapes.add_shape(1, i*pw, yy, pw, Inches(0.5)) p.fill.solid(); p.fill.fore_color.rgb = col; p.line.fill.background() txt(s, "THANK YOU", Inches(1), Inches(1.1), Inches(11.333), Inches(1.8), size=72, bold=True, color=TEAL, align=PP_ALIGN.CENTER) txt(s, "Questions & Discussion", Inches(1), Inches(3.0), Inches(11.333), Inches(0.85), size=32, color=AMBER, align=PP_ALIGN.CENTER) rect(s, Inches(1.5), Inches(4.0), Inches(10.333), Inches(1.3), CARD_BG, TEAL, Pt(1)) txt(s, "Reference:", Inches(1.65), Inches(4.08), Inches(10.0), Inches(0.4), size=13, bold=True, color=TEAL) txt(s, "Lopez-Herce Cid J et al. What's new in the 2026 pediatric cardiopulmonary resuscitation recommendations.\nAnales de Pediatria. 2026;104:504162. DOI: 10.1016/j.anpedi.2026.504162", Inches(1.65), Inches(4.5), Inches(10.0), Inches(0.75), size=12.5, italic=True, color=LIGHT_GRAY) txt(s, "MD Anesthesia | Journal Club | July 2026", Inches(1), Inches(5.55), Inches(11.333), Inches(0.45), size=15, color=MID_GRAY, align=PP_ALIGN.CENTER) # ── SAVE ─────────────────────────────────────────────────────── out = "/tmp/workspace/journal-club-peds-cpr/Peds_CPR_2026_Journal_Club.pptx" prs.save(out) print("Saved:", out) PYEOF

Your credits are exhausted. You can purchase a top-up or subscribe to a plan to continue using Orris. If you're already subscribed, your daily credits will reset tomorrow.

Ok

Your credits are exhausted. You can purchase a top-up or subscribe to a plan to continue using Orris. If you're already subscribed, your daily credits will reset tomorrow.
This is a shared conversation. Sign in to Orris to start your own chat.