Please check this presentation to present the conference
~/
~/attachments/39bc459a-9788-470b-92e0-056e49ff141a
python -c "from pptx import Presentation; p=Presentation('/tmp/workspace/attachments/39bc459a-9788-470b-92e0-056e49ff141a/Rebuilding the base EOC (1).pptx'); print('slides',len(p.slides),'size',p.slide_width,p.slide_height);\nfor i,s in enumerate(p.slides,1):\n print('\\n--- SLIDE',i,'---');\n for sh in s.shapes:\n if getattr(sh,'has_text_frame',False) and sh.text_frame.text.strip(): print('[TEXT]',repr(sh.text_frame.text));\n print('shapes',len(s.shapes),'pictures',sum(1 for x in s.shapes if x.shape_type==13))"
python -c "from pptx import Presentation; p=Presentation('/tmp/workspace/attachments/39bc459a-9788-470b-92e0-056e49ff141a/Rebuilding the base EOC (1).pptx'); print('slides:',len(p.slides)); exec(\"for i,s in enumerate(p.slides,1):\\n print('\\\\n--- SLIDE',i,'---')\\n print('\\\\n'.join('[TEXT] '+repr(sh.text_frame.text) for sh in s.shapes if getattr(sh,'has_text_frame',False) and sh.text_frame.text.strip()))\\n print('shapes',len(s.shapes),'pictures',sum(x.shape_type==13 for x in s.shapes))\")"
cervical cancer pelvic floor rehabilitation
WHO cervical cancer global 2022 660000 350000 deaths factsheet
python -c "from pptx import Presentation; p=Presentation('/tmp/workspace/attachments/39bc459a-9788-470b-92e0-056e49ff141a/Rebuilding the base EOC (1).pptx'); exec(\"for i,s in enumerate(p.slides,1):\\n notes=s.notes_slide.notes_text_frame.text.strip() if s.has_notes_slide else ''\\n fonts=[]\\n for sh in s.shapes:\\n if getattr(sh,'has_text_frame',False):\\n for pa in sh.text_frame.paragraphs:\\n for r in pa.runs:\\n if r.font.size: fonts.append(round(r.font.size.pt,1))\\n print(i, 'notes='+repr(notes[:110]), 'font range='+str((min(fonts),max(fonts)) if fonts else None))\")"
| Slide | Issue | Recommendation |
|---|---|---|
| 7 | Too much assessment detail | Keep 3 headings and 2 bullets each |
| 8 | Consent and grading compete for attention | Split into consent/setup and examination/grading, if time permits |
| 11 | Excellent core message but dense | Retain “tone, not diagnosis” and convert each pathway into 3 concise actions |
| 12 | Three sections plus detailed bullets | Use one short clinical takeaway per section |
| 13 | Protocol is presented too definitively | Frame it as an individualized, oncology-cleared plan |
| 16-18 | Medical and rehabilitation interventions blend together | Clearly label what requires medical or specialist prescription/review |
| 19 | Long text block | Turn into a simple home-program checklist |
| 26 | References are too small for projection | Provide a QR code or handout instead |
“Following oncology clearance and individualized assessment, introduce graded vaginal rehabilitation when tissue healing and symptoms allow. Frequency, duration, and progression should be guided by tolerance, goals, and local protocol.”
“Pelvic autonomic nerve disruption following radical pelvic surgery may contribute to impaired bladder sensation, detrusor underactivity, incomplete emptying, or retention.”
“New rectal bleeding, severe pain, fever, obstruction symptoms, significant weight loss, or suspected fistula require medical assessment before rehabilitation progression.”
“For many cervical cancer survivors, the end of treatment does not mean the end of morbidity. Bladder, bowel, pain, and intimacy concerns may remain invisible unless we ask. Today, I will focus on how pelvic floor rehabilitation can make recovery more functional, safe, and patient-defined.”
“No recurrence is not the same as no morbidity. If we ask early, assess the phenotype, and create a named pelvic-health pathway, we can help survivors rebuild not only pelvic function, but confidence and participation in life.”
Make a 20-minute version of this presentation
~/
WHO cervical cancer 2022 660000 350000
cervical cancer pelvic floor rehabilitation
mkdir -p "/tmp/workspace/rebuilding-base-20min/src" "/tmp/workspace/rebuilding-base-20min/output" && python -c "from pptx import Presentation; p=Presentation('/tmp/workspace/attachments/39bc459a-9788-470b-92e0-056e49ff141a/Rebuilding the base EOC (1).pptx'); print(len(p.slides))"
~/rebuilding-base-20min/src/make_20min.py
from pptx import Presentation
from pptx.util import Pt
from pptx.enum.text import MSO_AUTO_SIZE
from copy import deepcopy
SRC = '/tmp/workspace/attachments/39bc459a-9788-470b-92e0-056e49ff141a/Rebuilding the base EOC (1).pptx'
OUT = '/tmp/workspace/rebuilding-base-20min/output/Rebuilding_the_Base_20_Minute_Conference.pptx'
KEEP = [1,2,3,7,8,11,13,15,16,17,20,21,23,25,26]
prs = Presentation(SRC)
# remove all unneeded slides, in reverse so retained slide identities remain stable
for idx in range(len(prs.slides), 0, -1):
if idx not in KEEP:
rId = prs.slides._sldIdLst[idx-1].rId
prs.part.drop_rel(rId)
del prs.slides._sldIdLst[idx-1]
# helper methods
def all_text(slide):
return [sh for sh in slide.shapes if getattr(sh, 'has_text_frame', False)]
def find_text(slide, starts):
for sh in all_text(slide):
text = sh.text_frame.text.strip()
if any(text.startswith(s) for s in starts):
return sh
return None
def set_text(sh, text, size=None, bold_first=False):
tf = sh.text_frame
tf.clear()
lines = text.split('\n')
for i, line in enumerate(lines):
p = tf.paragraphs[0] if i == 0 else tf.add_paragraph()
p.text = line
p.level = 0
for run in p.runs:
if size:
run.font.size = Pt(size)
if bold_first and i == 0:
run.font.bold = True
tf.word_wrap = True
tf.auto_size = MSO_AUTO_SIZE.TEXT_TO_FIT_SHAPE
def remove_page_numbers(slide):
for sh in list(all_text(slide)):
text = sh.text_frame.text.strip()
if text.isdigit() and len(text) <= 2:
sp = sh._element
sp.getparent().remove(sp)
def set_notes(slide, note):
tf = slide.notes_slide.notes_text_frame
tf.text = note
# streamline contents after the retained slides have moved to 1..15
slides = list(prs.slides)
for s in slides:
remove_page_numbers(s)
# 1 title
set_notes(slides[0], 'TIME 0:45. Opening: “For many survivors, finishing cancer treatment does not mean finishing morbidity. Today is about making pelvic recovery visible, safe and actionable.”')
# 2 context: keep data but reduce dense copy
sh = find_text(slides[1], ['• 4th most common'])
set_text(sh, '• Cervical cancer is the fourth most common cancer in women worldwide.\n• In 2022, about 660,000 women were diagnosed and 350,000 died.\n• Better cancer outcomes mean more survivors living with bladder, bowel, pain and intimacy concerns.', 19)
set_notes(slides[1], 'TIME 1:00. The burden is not only cancer mortality. Survivorship needs to include function and quality of life. State the figures as 2022 WHO/IARC estimates.')
# 3 anatomy
sh = find_text(slides[2], ['• The pelvic floor'])
set_text(sh, '• A coordinated muscular and fascial support system for bladder, vagina and rectum.\n• It contributes to continence, evacuation, sexual function and load transfer.\n• Treatment can affect tissue mobility, sensation, strength, coordination and pain.', 18)
set_notes(slides[2], 'TIME 1:00. Do not teach every muscle. The point is coordinated function: strength is only one possible rehabilitation target.')
#4 is original slide 7 assessment
sh = find_text(slides[3], ['Comprehensive History'])
set_text(sh, 'HISTORY\n• Begin with the survivor’s main concern and functional goal.\n• Review treatment, urinary, bowel, sexual and pain symptoms.\n• Include fatigue, distress, work, hobbies and medical trauma.', 18)
sh = find_text(slides[3], ['Movement & Postural'])
set_text(sh, 'MOVEMENT SCREEN\n• Screen the whole body, breathing, abdominal tenderness and scar mobility.\n• Treatment may change strength, mobility and balance.', 18)
sh = find_text(slides[3], ['Breathing-Abdominal'])
set_text(sh, 'COORDINATION\n• Observe diaphragm, abdominal wall and pelvic-floor coordination.\n• Compensation in one part may signal dysfunction in another.', 18)
set_notes(slides[3], 'TIME 1:45. Ask before examining. Assessment starts with the patient goal, then looks at the entire movement and breathing system rather than the pelvis in isolation.')
#5 consent
sh = find_text(slides[4], ['CONSENT & SETUP'])
set_text(sh, 'CONSENT & SETUP\n• Explain the examination and obtain explicit consent.\n• Offer internal, external or no internal examination.\n• The patient can stop at any time.\n• Use a gentle, symptom-led approach, especially after radiotherapy.', 17)
sh = find_text(slides[4], ['MODIFIED OXFORD'])
set_text(sh, 'EXAMINATION\n• Assess resting tone, relaxation, voluntary contraction, tenderness, tissue tolerance and functional coordination.\n• Use a validated measure such as the Modified Oxford Scale where appropriate.\n• Document the baseline that matters to the patient.', 17)
set_notes(slides[4], 'TIME 1:15. Consent is ongoing. Internal examination is never a prerequisite for education or initial rehabilitation. Do not rush an irradiated or painful presentation.')
#6 phenotype matched slide
sh = find_text(slides[5], ['"More Kegels"'])
set_text(sh, '“More Kegels” is not always correct. Match treatment to tone, symptoms and goals.', 20)
sh = find_text(slides[5], ['Hypotonic / Weak'])
set_text(sh, 'WEAK / HYPOTONIC\n• Graded strength, endurance and functional training.\n• Integrate with cough, lifting and exertion.\n• Reassess function, not strength alone.', 18)
sh = find_text(slides[5], ['Hypertonic / Guarded'])
set_text(sh, 'GUARDED / HYPERTONIC\n• Start with down-training, breathing and symptom modulation.\n• Use gentle mobility and manual strategies when indicated.\n• Strengthen only when relaxation and tissue tolerance allow.', 18)
set_notes(slides[5], 'TIME 2:00. This is the clinical hinge of the talk. Same diagnosis does not equal same rehabilitation. A guarded, painful floor can worsen if we prescribe strengthening without assessment.')
#7 dilators
sh = find_text(slides[6], ['WHAT & WHY'])
set_text(sh, 'WHAT & WHY\n• Graded vaginal rehabilitation can support tissue accommodation, examination tolerance and sexual goals.\n• It is a rehabilitation tool, not a test of adherence or sexual activity.', 18)
sh = find_text(slides[6], ['PROTOCOL'])
set_text(sh, 'INDIVIDUALIZE THE PLAN\n• Introduce after oncology clearance when healing and symptoms allow.\n• Choose size, frequency and progression according to tolerance and goals.\n• Use lubricant and pause for bleeding, infection, severe pain or active mucositis.\n• Discuss barriers without judgement.', 17)
set_notes(slides[6], 'TIME 1:30. Avoid a universal protocol. Confirm oncology clearance and assess healing. The goal may be a comfortable examination, reduced fear, or intimacy, not necessarily intercourse.')
#8 breathing
sh = find_text(slides[7], ['DIAPHRAGMATIC'])
set_text(sh, 'DIAPHRAGMATIC BREATHING\n• A simple entry point for restoring diaphragm, abdominal-wall and pelvic-floor coordination.\n• Supports pelvic-floor release before active training in a guarded presentation.', 18)
sh = find_text(slides[7], ['PAIN NEUROSCIENCE'])
set_text(sh, 'PAIN EDUCATION\n• Explain that persistent pain can reflect a sensitized protective system as well as tissue change.\n• Reduce fear and build graded return to movement and intimacy.\n• Work alongside psychology and sexual-health care when needed.', 18)
set_notes(slides[7], 'TIME 1:00. Use plain language: an alarm system can become overprotective. This validates symptoms while showing that safe, graded recovery is possible.')
#9 bladder
sh = find_text(slides[8], ['Neurogenic / Post'])
set_text(sh, 'POST-SURGICAL VOIDING DYSFUNCTION\n• Pelvic autonomic nerve disruption may contribute to impaired sensation, incomplete emptying or retention.\n• Use timed and double voiding only within an assessed plan.\n• Refer for residual assessment and urology input when retention is suspected.', 17)
sh = find_text(slides[8], ['Stress Incontinence'])
set_text(sh, 'STRESS-INCONTINENCE COMPONENT\n• Treat confirmed weakness with graded pelvic-floor muscle training and functional practice.\n• Refer refractory or complex presentations to urogynecology/urology.', 17)
set_notes(slides[8], 'TIME 1:00. Bladder management is phenotype-led. Do not normalize retention. New, progressive, or unexplained symptoms need medical assessment.')
#10 bowel
sh = find_text(slides[9], ['FUNCTIONAL BOWEL'])
set_text(sh, 'FUNCTIONAL BOWEL MANAGEMENT\n• Assess urgency, leakage, stool consistency, diet, hydration and evacuation pattern.\n• Use coordination training and individualized dietary or continence strategies.\n• Involve gastroenterology and nutrition for suspected chronic radiation injury or malabsorption.\n• New bleeding, severe pain, fever, obstruction symptoms or suspected fistula require medical review.', 17)
set_notes(slides[9], 'TIME 1:00. The key safety message is that rectal bleeding and progressive symptoms are not automatically “radiation proctitis.” Pause and seek medical review when red flags occur.')
#11 sexual health retains visual ladder but concise paragraph
sh = find_text(slides[10], ['• This stepped'])
set_text(sh, '• Progress stepwise and never rush or skip a stage.\n• Start with permission to discuss, then comfort, reconnection and graded exposure.\n• Penetration is optional and patient-defined.\n• Refer for persistent pain, distress or request for specialist support.', 18)
set_notes(slides[10], 'TIME 1:30. Walk through the staircase. Emphasize that “success” is a survivor-defined return to safety, connection and valued activity, not a mandatory sexual endpoint.')
#12 pathway
set_notes(slides[11], 'TIME 2:00. This is the implementation message: make the route visible. At every oncology follow-up, ask about bladder, bowel, pain and intimacy. A positive screen gets a named next step, not a vague referral.')
#13 sprint
set_notes(slides[12], 'TIME 1:30. Start small. In 90 days, agree red flags and screening questions, pilot in one clinic, then audit referral completion and delays. Build a service, not a brochure.')
#14 take-home
set_notes(slides[13], 'TIME 0:45. Deliver these three messages slowly. “No recurrence” is not “no morbidity.”')
#15 refs
set_notes(slides[14], 'TIME 0:15. Selected sources. Thank the audience and invite questions.')
# Standardize footer page number removal left enough branding; ensure no accidental internal slide number remains.
prs.save(OUT)
print(OUT)
python "/tmp/workspace/rebuilding-base-20min/src/make_20min.py" && ls -lh "/tmp/workspace/rebuilding-base-20min/output/Rebuilding_the_Base_20_Minute_Conference.pptx"
python -c "from pptx import Presentation; from zipfile import ZipFile; f='/tmp/workspace/rebuilding-base-20min/output/Rebuilding_the_Base_20_Minute_Conference.pptx'; p=Presentation(f); print('slide_count:',len(p.slides)); print('dimensions:',p.slide_width,p.slide_height); exec(\"for i,s in enumerate(p.slides,1):\\n texts=[sh.text_frame.text.strip().replace('\\\\n',' / ') for sh in s.shapes if getattr(sh,'has_text_frame',False) and sh.text_frame.text.strip()]\\n print(i, '|', texts[0] if texts else '[visual]', '| notes:', bool(s.notes_slide.notes_text_frame.text.strip()))\"); z=ZipFile(f); print('zip_test:',z.testzip()); print('slides_xml:',len([n for n in z.namelist() if n.startswith('ppt/slides/slide') and n.endswith('.xml')]))"
python -c "from pptx import Presentation; f='/tmp/workspace/rebuilding-base-20min/output/Rebuilding_the_Base_20_Minute_Conference.pptx'; p=Presentation(f); exec(\"for i,s in enumerate(p.slides,1):\\n sizes=[r.font.size.pt for sh in s.shapes if getattr(sh,'has_text_frame',False) for pa in sh.text_frame.paragraphs for r in pa.runs if r.font.size]\\n print(i, min(sizes) if sizes else None, max(sizes) if sizes else None)\")"
no download
Rebuilding the Base 20 Minute Conference
Presentation · PPTX
Regenerate the 20-minute deck and provide a working download link
~/
python "/tmp/workspace/rebuilding-base-20min/src/make_20min.py" && python -c "from pptx import Presentation; from zipfile import ZipFile; f='/tmp/workspace/rebuilding-base-20min/output/Rebuilding_the_Base_20_Minute_Conference.pptx'; p=Presentation(f); assert len(p.slides)==15; assert ZipFile(f).testzip() is None; print('Validated:', len(p.slides), 'slides |', f)" && ls -lh "/tmp/workspace/rebuilding-base-20min/output/Rebuilding_the_Base_20_Minute_Conference.pptx"
Rebuilding the Base 20 Minute Conference
Presentation · PPTX
slides inside overwriting is there, not understanding
~/rebuilding-base-20min/
~/rebuilding-base-20min/src/build_clean_deck.py
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
from pptx.enum.shapes import MSO_SHAPE
from pptx.enum.dml import MSO_THEME_COLOR
OUT = '/tmp/workspace/rebuilding-base-20min/output/Rebuilding_the_Base_20_Minute_Clean.pptx'
prs = Presentation()
prs.slide_width = Inches(13.333)
prs.slide_height = Inches(7.5)
blank = prs.slide_layouts[6]
NAVY = RGBColor(18, 42, 62)
TEAL = RGBColor(20, 130, 133)
CORAL = RGBColor(224, 107, 91)
CREAM = RGBColor(248, 246, 241)
INK = RGBColor(30, 45, 56)
MUTED = RGBColor(91, 108, 117)
PALE = RGBColor(228, 240, 239)
WHITE = RGBColor(255,255,255)
def rect(slide, x,y,w,h,color, radius=False):
shape = slide.shapes.add_shape(MSO_SHAPE.ROUNDED_RECTANGLE if radius else MSO_SHAPE.RECTANGLE, Inches(x), Inches(y), Inches(w), Inches(h))
shape.fill.solid(); shape.fill.fore_color.rgb = color
shape.line.fill.background()
return shape
def text(slide, x,y,w,h, value, size=18, color=INK, bold=False, align=PP_ALIGN.LEFT, font='Aptos', valign=MSO_ANCHOR.TOP):
box=slide.shapes.add_textbox(Inches(x),Inches(y),Inches(w),Inches(h))
tf=box.text_frame; tf.clear(); tf.word_wrap=True; tf.margin_left=0; tf.margin_right=0; tf.margin_top=0; tf.margin_bottom=0; tf.vertical_anchor=valign
lines=value.split('\n')
for i,line in enumerate(lines):
p=tf.paragraphs[0] if i==0 else tf.add_paragraph(); p.text=line; p.alignment=align
p.space_after=Pt(4)
for r in p.runs:
r.font.name=font; r.font.size=Pt(size); r.font.bold=bold; r.font.color.rgb=color
return box
def rich_lines(slide,x,y,w,h, lines, size=17):
box=slide.shapes.add_textbox(Inches(x),Inches(y),Inches(w),Inches(h)); tf=box.text_frame; tf.clear(); tf.word_wrap=True
tf.margin_left=tf.margin_right=tf.margin_top=tf.margin_bottom=0
for i,(content, color, bold) in enumerate(lines):
p=tf.paragraphs[0] if i==0 else tf.add_paragraph(); p.text=content; p.space_after=Pt(10)
for r in p.runs: r.font.name='Aptos'; r.font.size=Pt(size); r.font.color.rgb=color; r.font.bold=bold
return box
def base(section, title, number):
s=prs.slides.add_slide(blank); rect(s,0,0,13.333,7.5,CREAM); rect(s,0,0,13.333,.18,TEAL)
text(s,.6,.4,9,.25,section.upper(),11,TEAL,True)
text(s,.6,.75,11.8,.8,title,30,NAVY,True)
text(s,12.1,.42,.6,.25,f'{number:02d}',11,MUTED,True,PP_ALIGN.RIGHT)
text(s,.6,7.12,12,.18,'CERVICAL CANCER SURVIVORSHIP • PELVIC FLOOR REHABILITATION',9,MUTED,True)
return s
def note(slide, content):
slide.notes_slide.notes_text_frame.text=content
def bullets(slide,x,y,w,items,size=17):
return rich_lines(slide,x,y,w,5.5,[(f'• {i}',INK,False) for i in items],size)
def card(slide,x,y,w,h,heading,body,accent=TEAL):
rect(slide,x,y,w,h,WHITE,True); rect(slide,x,y,w,.09,accent)
text(slide,x+.22,y+.25,w-.44,.3,heading,16,accent,True)
text(slide,x+.22,y+.75,w-.44,h-.95,body,15,INK,False)
# 1
s=prs.slides.add_slide(blank); rect(s,0,0,13.333,7.5,NAVY); rect(s,0,0,13.333,.18,CORAL)
text(s,.75,1.05,7.2,1.5,'Rebuilding\nthe Base',42,WHITE,True)
text(s,.78,3.05,8.2,.45,'Pelvic floor rehabilitation in cervical cancer survivorship',21,RGBColor(213,235,233),False)
text(s,.78,3.75,7.4,.7,'A whole-person pathway from treatment to recovery',25,WHITE,True)
rect(s,.78,5.3,4.1,.08,CORAL)
text(s,.78,5.6,6.4,.5,'Mohanambal Natesan | Physiotherapist | Tawam Hospital, Al Ain',14,RGBColor(213,235,233))
text(s,10.1,6.25,2.4,.35,'20-MINUTE SESSION',13,RGBColor(213,235,233),True,PP_ALIGN.RIGHT)
note(s,'TIME 0:45. Opening: finishing treatment does not always mean finishing morbidity. This session makes pelvic recovery visible, safe and actionable.')
#2
s=base('Clinical context','Survival changes the clinical question',2)
text(s,.65,1.8,4.1,.35,'Cervical cancer is the fourth most common cancer in women worldwide.',20,NAVY,True)
for x,num,lab,col in [(0.7,'660,000','new diagnoses in 2022',TEAL),(4.55,'350,000','deaths in 2022',CORAL),(8.4,'Decades','many years of survivorship',NAVY)]:
rect(s,x,3.0,3.3,1.65,WHITE,True); text(s,x+.2,3.28,2.9,.46,num,30,col,True,PP_ALIGN.CENTER); text(s,x+.2,3.93,2.9,.28,lab,14,MUTED,False,PP_ALIGN.CENTER)
text(s,.75,5.25,11.5,.7,'The rehabilitation question is not only “Is she cancer-free?” It is also “Can she void, move, sleep and be intimate without fear?”',22,NAVY,True,PP_ALIGN.CENTER)
text(s,.7,6.25,11.8,.25,'WHO/IARC 2022 estimates: approximately 660,000 diagnoses and 350,000 deaths.',11,MUTED,False,PP_ALIGN.CENTER)
note(s,'TIME 1:15. Give the global burden briefly. Pivot immediately to survivorship function: bladder, bowel, pain and intimacy deserve routine attention.')
#3
s=base('Foundation','The pelvic floor is a coordinated system',3)
text(s,.75,1.75,5.1,.9,'Not just a muscle.\nA support, continence and pressure-management system.',23,NAVY,True)
for x,h,b in [(6.0,'Support','Bladder, vagina and rectum'),(8.2,'Control','Urethral and anal continence'),(10.4,'Coordination','Breathing, abdomen and movement')]: card(s,x,2.0,1.85,2.45,h,b)
rect(s,.75,4.55,11.7,1.2,PALE,True); text(s,1.0,4.88,11.2,.5,'Clinical implication: dysfunction may present as weakness, overactivity, pain, impaired relaxation or a mixture.',21,NAVY,True,PP_ALIGN.CENTER)
note(s,'TIME 1:00. Give the 30-second anatomy overview. The key message is coordinated function, not isolated pelvic-floor squeezing.')
#4
s=base('Assessment','Start with safety, consent and the survivor’s goal',4)
card(s,.72,1.75,3.7,3.65,'1. Ask','Bladder\nBowel\nPain\nIntimacy',TEAL)
card(s,4.82,1.75,3.7,3.65,'2. Screen','Treatment timeline\nFatigue, scars, mobility\nRed flags and recurrence concerns',CORAL)
card(s,8.92,1.75,3.7,3.65,'3. Assess','Movement and breathing\nExternal or internal exam only with explicit consent\nPatient may stop at any time',NAVY)
text(s,.8,5.95,11.6,.45,'A named functional goal makes assessment meaningful: “I want a comfortable examination” may come before intercourse.',18,NAVY,True,PP_ALIGN.CENTER)
note(s,'TIME 1:30. State consent explicitly. Explain that history, movement, breathing and a patient-chosen pelvic examination guide the plan.')
#5
s=base('Assessment','Match the intervention to the phenotype',5)
rect(s,.8,1.75,5.65,3.85,WHITE,True); rect(s,.8,1.75,5.65,.1,TEAL); text(s,1.05,2.08,5.1,.4,'HYPOTONIC / WEAK',21,TEAL,True)
bullets(s,1.05,2.75,4.9,['Often follows surgical nerve or fascial disruption','Reduced lift, endurance or pressure control','Strengthening, endurance and functional integration'],16)
rect(s,6.9,1.75,5.65,3.85,WHITE,True); rect(s,6.9,1.75,5.65,.1,CORAL); text(s,7.15,2.08,5.1,.4,'HYPERTONIC / GUARDED',21,CORAL,True)
bullets(s,7.15,2.75,4.9,['Often associated with pain, fibrosis or fear-driven guarding','Tenderness, restricted excursion, difficulty relaxing','Down-training, breathing and graded exposure first'],16)
text(s,.85,6.05,11.6,.4,'“More Kegels” is not always correct. Direction of training depends on tone and function, not diagnosis alone.',19,NAVY,True,PP_ALIGN.CENTER)
note(s,'TIME 1:30. This is the clinical pivot. Explain that strengthening a guarded, painful pelvic floor can worsen symptoms. Treat the phenotype.')
#6
s=base('Rehabilitation','A small toolkit, applied precisely',6)
for x,h,b,c in [(0.7,'Retrain','Pelvic-floor work matched to tone',TEAL),(3.8,'Release','Manual therapy and scar mobility',CORAL),(6.9,'Accommodate','Graded vaginal rehabilitation when appropriate',NAVY),(10.0,'Learn','Biofeedback and self-management',TEAL)]: card(s,x,2.0,2.6,2.65,h,b,c)
text(s,.9,5.35,11.4,.55,'The common thread: individualized dosage, symptom monitoring and progression at the patient’s pace.',21,NAVY,True,PP_ALIGN.CENTER)
note(s,'TIME 1:00. Do not list every modality in depth. Introduce the toolkit, then focus on two high-yield examples: dilator rehabilitation and pain/guarding.')
#7
s=base('Rehabilitation','Vaginal rehabilitation: graded, informed and individualized',7)
card(s,.72,1.8,3.65,3.75,'Purpose','Support tissue accommodation, examination tolerance and intimacy goals.',TEAL)
card(s,4.84,1.8,3.65,3.75,'Approach','Oncology clearance and symptom review\nProgressive size and duration\nWater-based lubricant\nStop for concerning symptoms',CORAL)
card(s,8.96,1.8,3.65,3.75,'Conversation','Normalize the tool clinically\nAddress barriers without pressure\nThe patient defines the goal',NAVY)
text(s,.85,6.0,11.5,.36,'Avoid progression during active mucositis, infection, unexplained bleeding or severe pain. Refer for medical review when needed.',16,NAVY,True,PP_ALIGN.CENTER)
note(s,'TIME 1:30. Avoid a one-size-fits-all protocol. Explain progression is based on tissue healing, tolerance, goals and local oncology guidance.')
#8
s=base('Rehabilitation','For guarding and pain, begin with safety and relaxation',8)
rect(s,.75,1.8,11.85,1.1,PALE,True); text(s,1.0,2.12,11.3,.38,'Breathing, abdominal wall and pelvic floor move as one system.',22,NAVY,True,PP_ALIGN.CENTER)
for x,n,h,b in [(1.0,'01','Explain','Pain can persist through sensitivity and guarding, not only ongoing damage.'),(4.45,'02','Down-train','Use diaphragmatic breathing, release and pacing before strengthening.'),(7.9,'03','Expose gradually','Return to movement, examination and intimacy in safe, patient-chosen steps.')]:
text(s,x,3.55,1,.35,n,18,CORAL,True); text(s,x,4.0,2.75,.3,h,18,NAVY,True); text(s,x,4.55,2.75,1.25,b,15,INK)
note(s,'TIME 1:15. Use simple language: an alarm system can stay sensitive after treatment. Validate symptoms while avoiding the message that pain is “all in the mind.”')
#9
s=base('Organ-specific management','Bladder and bowel: rehabilitate, but know the red flags',9)
card(s,.75,1.8,5.65,3.95,'BLADDER','Post-surgical autonomic nerve disruption may cause impaired sensation, incomplete emptying or retention.\n\nRehabilitation: timed voiding, double voiding, pressure-control training and referral when needed.',TEAL)
card(s,6.9,1.8,5.65,3.95,'BOWEL','Radiation-related urgency, frequency or incontinence can benefit from dietary review and coordination training.\n\nNew bleeding, severe pain, fever, obstruction symptoms or suspected fistula need medical assessment first.',CORAL)
note(s,'TIME 1:15. Keep the scope clear. Physiotherapy contributes to symptom management but does not replace investigation of retention, bleeding, infection, fistula or recurrence.')
#10
s=base('Self-management','Sexual recovery is a stepped pathway, not a performance test',10)
steps=[('1','Permission','Make space to discuss intimacy'),('2','Reconnect','Non-genital touch and communication'),('3','Explore','Self-exploration or dilator progression'),('4','Partner','Non-penetrative partnered activity'),('5','If desired','Penetrative intercourse')]
for i,(n,h,b) in enumerate(steps):
x=.55+i*2.5; rect(s,x,2.35,2.15,2.55,WHITE,True); text(s,x+.15,2.65,1.85,.25,n,17,CORAL,True,PP_ALIGN.CENTER); text(s,x+.15,3.15,1.85,.35,h,16,NAVY,True,PP_ALIGN.CENTER); text(s,x+.18,3.8,1.8,.65,b,13,INK,False,PP_ALIGN.CENTER)
text(s,.75,5.75,11.8,.45,'No step is compulsory, skipped or rushed. Persistent pain, relationship distress or a request for help should trigger referral.',17,NAVY,True,PP_ALIGN.CENTER)
note(s,'TIME 1:30. State that penetrative intercourse is never the sole outcome. The patient’s definition of meaningful intimacy guides progression.')
#11
s=base('Systems of care','Make the pathway visible',11)
path=[('Ask','4-domain screen at follow-up'),('Define','Rule out red flags; agree a goal'),('Support','Education and symptom-specific basics'),('Refer','Pelvic-health assessment and plan'),('Review','Measure, escalate and close the loop')]
for i,(h,b) in enumerate(path):
x=.6+i*2.52; rect(s,x,2.2,2.1,2.4,WHITE,True); text(s,x+.2,2.55,1.7,.3,str(i+1),20,CORAL,True,PP_ALIGN.CENTER); text(s,x+.2,3.0,1.7,.3,h,17,TEAL,True,PP_ALIGN.CENTER); text(s,x+.17,3.5,1.76,.6,b,13,INK,False,PP_ALIGN.CENTER)
text(s,.85,5.5,11.4,.46,'A named route is more useful than a generic referral. Confirm completion and return the plan to the oncology team.',19,NAVY,True,PP_ALIGN.CENTER)
note(s,'TIME 1:30. This is the service-level takeaway. Name the route, define ownership and close the feedback loop.')
#12
s=base('Implementation','Start where you are: a 90-day service sprint',12)
for x,h,b,c in [(0.85,'0-30 days: MAP','Agree red flags\nChoose the 4-domain screen\nMap referral routes',TEAL),(4.8,'31-60 days: PILOT','Train one clinic team\nUse one patient information sheet\nTest referral flow',CORAL),(8.75,'61-90 days: MEASURE','Audit completion and delay\nReview patient goals\nRefine the pathway',NAVY)]: card(s,x,2.0,3.65,3.4,h,b,c)
note(s,'TIME 1:00. End systems content with practical action. A small pilot is better than waiting for a perfect program.')
#13
s=base('Case application','From symptom list to meaningful recovery',13)
text(s,.85,1.7,11.5,.55,'“I want intimacy to feel safe again and to move without fear.”',25,NAVY,True,PP_ALIGN.CENTER)
for x,h,b in [(1.0,'ASSESS','Rule out infection or recurrence. Assess tissue tolerance, guarding, bladder pattern and priorities.'),(4.55,'PLAN','Education, bladder strategies, down-training and graded exposure. Consider vaginal rehabilitation if appropriate.'),(8.1,'REVIEW','Track pain, urgency, examination tolerance and return to valued activity. Escalate when needed.')]: card(s,x,3.1,3.15,2.45,h,b,[TEAL,CORAL,NAVY][[1.0,4.55,8.1].index(x)])
note(s,'TIME 1:15. The goal is not a generic exercise prescription. It is a shared, safe plan based on phenotype and the survivor’s priorities.')
#14
s=base('Take-home messages','Rebuild the base. Restore the life.',14)
for x,n,h,b,c in [(1.0,'01','Ask early','Bladder, bowel, pain and intimacy are survivorship outcomes.',TEAL),(4.55,'02','Assess the phenotype','Generic strengthening is not the answer to every symptom.',CORAL),(8.1,'03','Build the pathway','A named pelvic-health route makes recovery actionable.',NAVY)]:
text(s,x,2.1,2.8,.3,n,18,c,True,PP_ALIGN.CENTER); text(s,x,2.7,2.8,.4,h,19,NAVY,True,PP_ALIGN.CENTER); text(s,x,3.45,2.8,.8,b,16,INK,False,PP_ALIGN.CENTER)
text(s,.8,5.85,11.7,.45,'“No recurrence” is not “no morbidity.”',26,NAVY,True,PP_ALIGN.CENTER)
note(s,'TIME 1:00. Close with the three actions. Repeat the final line, pause, then thank the audience.')
#15
s=base('Selected references','Evidence and guidance',15)
refs=['World Health Organization. Cervical cancer fact sheet and 2022 global estimates.','Hao J, Yao Z, Remis A. Pelvic floor rehabilitation in cancer survivorship: an umbrella review. J Cancer Surviv. 2026. PMID: 39581933.','Tim S, Mazur-Bialy A. Physiotherapy interventions after gynaecological oncology procedures: systematic review. J Gynecol Obstet Hum Reprod. 2024;53:102688.','Yang EJ, et al. Pelvic floor muscle training in gynecologic cancer survivors with pelvic floor dysfunction: randomized controlled trial. Gynecol Oncol. 2012;123:705-711.']
text(s,.95,1.75,11.4,.35,'Selected references. Adapt local protocols and oncology guidance to your setting.',17,NAVY,True)
rich_lines(s,1.05,2.55,11.0,3.4,[(f'• {r}',INK,False) for r in refs],15)
rect(s,.9,6.0,11.55,.55,PALE,True); text(s,1.1,6.16,11.15,.2,'Safety note: new bleeding, progressive pain, suspected infection, fistula or recurrence require medical assessment before rehabilitation progression.',12,NAVY,True,PP_ALIGN.CENTER)
note(s,'TIME 0:15. References only. Thank the audience and invite questions if the format permits.')
prs.save(OUT)
print(OUT)
python "/tmp/workspace/rebuilding-base-20min/src/build_clean_deck.py" && python -c "from pptx import Presentation; from zipfile import ZipFile; f='/tmp/workspace/rebuilding-base-20min/output/Rebuilding_the_Base_20_Minute_Clean.pptx'; p=Presentation(f); assert len(p.slides)==15; assert ZipFile(f).testzip() is None; print('VALID',len(p.slides),'slides')" && ls -lh "/tmp/workspace/rebuilding-base-20min/output/Rebuilding_the_Base_20_Minute_Clean.pptx"
Rebuilding the Base 20 Minute Clean
Presentation · PPTX