From 4777108a0e1f0ff187344dc64025093ec625e6f9 Mon Sep 17 00:00:00 2001 From: user Date: Tue, 21 Jul 2026 19:14:20 +0200 Subject: [PATCH] feat: add lab-rv32i-c-uart card --- .gitignore | 9 + Makefile | 54 + README.md | 20 + crt0.S | 22 + doc/generated/main.tex | 472 +++ doc/generated/main.upb | 0 ...1-e766c4bb-2a43-5f4e-b10a-b3393a42932c.pdf | Bin 0 -> 257830 bytes json/card_source.json | 667 +++++ json/card_spec.json | 229 ++ link/hazard3_c12.ld | 64 + scripts/render_card_layouts.sh | 9 + scripts/render_new_pdf.sh | 12 + src/tasks/c12_common.h | 49 + src/tasks/task01_uart_polling.c | 42 + src/tasks/task02_uart_rx_interrupt.c | 60 + src/tasks/task03_uart_mailbox.c | 74 + tests/check_elf.sh | 16 + tests/test_card.sh | 18 + tests/test_hazard3.sh | 38 + web/app.css | 1 + web/app.js | 61 + web/card-data.json | 2567 +++++++++++++++++ web/index.html | 15 + web/style.css | 39 + 24 files changed, 4538 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 README.md create mode 100644 crt0.S create mode 100644 doc/generated/main.tex create mode 100644 doc/generated/main.upb create mode 100644 doc/pdf/mpabi-inf-c-12-uart-polling-interrupts-v00.01-e766c4bb-2a43-5f4e-b10a-b3393a42932c.pdf create mode 100644 json/card_source.json create mode 100644 json/card_spec.json create mode 100644 link/hazard3_c12.ld create mode 100755 scripts/render_card_layouts.sh create mode 100755 scripts/render_new_pdf.sh create mode 100644 src/tasks/c12_common.h create mode 100644 src/tasks/task01_uart_polling.c create mode 100644 src/tasks/task02_uart_rx_interrupt.c create mode 100644 src/tasks/task03_uart_mailbox.c create mode 100755 tests/check_elf.sh create mode 100755 tests/test_card.sh create mode 100755 tests/test_hazard3.sh create mode 100644 web/app.css create mode 100644 web/app.js create mode 100644 web/card-data.json create mode 100644 web/index.html create mode 100644 web/style.css diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1f87102 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +.stem/ +build/ +doc/generated/*.aux +doc/generated/*.fdb_latexmk +doc/generated/*.fls +doc/generated/*.log +doc/generated/*.out +doc/generated/*.pdf +doc/generated/*.upa diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..368dfdd --- /dev/null +++ b/Makefile @@ -0,0 +1,54 @@ +RISCV_PREFIX ?= riscv64-unknown-elf- +CC := $(RISCV_PREFIX)gcc +OBJCOPY := $(RISCV_PREFIX)objcopy +OBJDUMP := $(RISCV_PREFIX)objdump +SIZE := $(RISCV_PREFIX)size + +RV_ENV_ROOT ?= /home/user/dev/edu/rv32i-hazard3-student-env +H3_COMMON ?= $(RV_ENV_ROOT)/vendor/Hazard3/test/sim/common +H3_INIT ?= $(H3_COMMON)/init.S +H3_IRQ_DISPATCH ?= $(H3_COMMON)/irq_dispatch.S +LDSCRIPT ?= link/hazard3_c12.ld +MEMOPS ?= $(RV_ENV_ROOT)/vendor/lab-runtime/memops.c + +BUILD_ROOT ?= build +TASKS := task01_uart_polling task02_uart_rx_interrupt task03_uart_mailbox +ARCH ?= rv32i_zicsr_zifencei +ABI ?= ilp32 +CFLAGS := -std=gnu11 -march=$(ARCH) -mabi=$(ABI) -nostdlib -nostartfiles \ + -ffreestanding -fno-builtin -fno-stack-protector -O0 -g3 -ggdb \ + -fno-omit-frame-pointer -fno-inline -Wall -Wextra \ + -Isrc/tasks -I$(H3_COMMON) +LDFLAGS := -Wl,--no-relax -T$(LDSCRIPT) +LIBS := -lgcc + +.PHONY: all tasks clean check-support $(TASKS) +all: tasks +tasks: $(TASKS) + +check-support: + @test -f "$(H3_INIT)" + @test -f "$(H3_IRQ_DISPATCH)" + @test -f "$(H3_COMMON)/tb_uart_io.h" + @test -f "$(MEMOPS)" + +define task_rules +$(1): $(BUILD_ROOT)/$(1)/prog.bin $(BUILD_ROOT)/$(1)/prog.elf $(BUILD_ROOT)/$(1)/prog.lst + +$(BUILD_ROOT)/$(1)/prog.elf: crt0.S src/tasks/$(1).c src/tasks/c12_common.h $(H3_INIT) $(H3_IRQ_DISPATCH) $(LDSCRIPT) $(MEMOPS) | check-support + mkdir -p $$(@D) + $(CC) $(CFLAGS) $(LDFLAGS) -Wl,-Map,$(BUILD_ROOT)/$(1)/prog.map \ + -o $$@ $(H3_INIT) $(H3_IRQ_DISPATCH) crt0.S $(MEMOPS) src/tasks/$(1).c $(LIBS) + $(SIZE) -A -x $$@ + +$(BUILD_ROOT)/$(1)/prog.bin: $(BUILD_ROOT)/$(1)/prog.elf + $(OBJCOPY) -O binary $$< $$@ + +$(BUILD_ROOT)/$(1)/prog.lst: $(BUILD_ROOT)/$(1)/prog.elf + $(OBJDUMP) -d -S -M no-aliases,numeric $$< > $$@ +endef + +$(foreach task,$(TASKS),$(eval $(call task_rules,$(task)))) + +clean: + rm -rf $(BUILD_ROOT) diff --git a/README.md b/README.md new file mode 100644 index 0000000..fa11874 --- /dev/null +++ b/README.md @@ -0,0 +1,20 @@ +# C12 — UART: polling i przerwanie RX + +Trzy przykłady rozdzielają mechanizm peryferium od polityki aplikacji: + +1. polling statusu i odczyt jednego bajtu; +2. rzeczywista linia external IRQ 16 modelu Hazard3; +3. jednokomórkowa skrzynka ISR → main z polityką drop-newest. + +`TB_UART_TEST_RX` jest wyłącznie kontrolowanym bodźcem testbench. Nie jest +rejestrem produkcyjnego UART-u ani dowodem zachowania RP2350. Ścieżka +przerwania po wstrzyknięciu bajtu jest jednak rzeczywista dla modelu: +RX FIFO → external IRQ 16 → kontroler Hazard3 → `mtvec` → dispatcher → ISR. + +```bash +make tasks +./tests/check_elf.sh +./tests/test_hazard3.sh +./scripts/render_card_layouts.sh +./scripts/render_new_pdf.sh +``` diff --git a/crt0.S b/crt0.S new file mode 100644 index 0000000..1004d2f --- /dev/null +++ b/crt0.S @@ -0,0 +1,22 @@ + .text + .global _start + .type _start, @function + +_start: +.option push +.option norelax + la gp, __global_pointer$ +.option pop + + la a0, __bss_start + la a1, __bss_end +1: + bgeu a0, a1, 2f + sb zero, 0(a0) + addi a0, a0, 1 + j 1b +2: + call main + tail _exit + + .size _start, .-_start diff --git a/doc/generated/main.tex b/doc/generated/main.tex new file mode 100644 index 0000000..ca2e621 --- /dev/null +++ b/doc/generated/main.tex @@ -0,0 +1,472 @@ +% Generated from json/card_source.json by tools/render_card.py. +% Do not edit manually; update the JSON and regenerate. + +\documentclass[12pt,a4paper]{article} + +\usepackage[T1]{fontenc} +\usepackage{lmodern} +\usepackage[utf8]{inputenc} +\usepackage[polish]{babel} +\usepackage{csquotes} +\usepackage{amsmath} +\usepackage{amssymb} +\usepackage{xcolor} +\usepackage[a4paper,left=2.15cm,right=2.15cm,top=0.5cm,bottom=0.5cm,headheight=24mm,headsep=3mm,includehead]{geometry} +\usepackage{eso-pic} +\usepackage{marginnote} +\usepackage{array} +\usepackage{tabularx} +\usepackage{graphicx} +\usepackage{pdflscape} +\usepackage{float} +\usepackage{silence} +\WarningFilter{soulutf8}{This package is obsolete} +\usepackage{pdfcomment} +\usepackage{enumitem} +\usepackage{needspace} +\usepackage{fancyhdr} +\usepackage{lastpage} +\usepackage{microtype} +\usepackage[most]{tcolorbox} +\usepackage{qrcode} +\IfFileExists{references.bib}{% + \usepackage[backend=biber,style=numeric,sorting=none]{biblatex}% + \addbibresource{references.bib}% +}{} + +\hypersetup{hidelinks} + +\IfFileExists{build-meta.tex}{% + \input{build-meta.tex}% +}{% + \newcommand{\BuildCommit}{lokalna}% +} + +\newcommand{\DocumentAuthor}{M. Pabiszczak} +\newcommand{\DocumentYear}{2026} +\newcommand{\CardSeries}{c} +\newcommand{\CardNumber}{12} +\newcommand{\CardCount}{13} +\newcommand{\CardSlug}{uart-polling-interrupts} +\newcommand{\CardVersion}{v00.01} +\newcommand{\DocumentUUID}{e766c4bb-2a43-5f4e-b10a-b3393a42932c} + +\newcommand{\EmptyCheck}{\(\square\)} +\newcommand{\EscAnswerLines}[1][3]{\par\noindent\dotfill\par\noindent\dotfill\par\noindent\dotfill} +\newcommand{\EscWriteRow}[1][2.8em]{\rule{0pt}{#1}} +\setlength{\parindent}{0pt} +\setlength{\parskip}{0.45em} +\setlength{\headheight}{24mm} +\setlength{\headsep}{3mm} +\setlength{\footskip}{8mm} +\setlength{\marginparwidth}{1.5cm} +\setlength{\marginparsep}{0.25cm} +\renewcommand{\arraystretch}{1.22} +% Margin separator lines disabled for layout trial. + +\newcommand{\ESCPageResourceHeader}{% + \begingroup% + \setlength{\parskip}{0pt}% + \setlength{\fboxsep}{0pt}% + \setlength{\fboxrule}{0.35pt}% + \setlength{\arrayrulewidth}{0.35pt}% + \noindent\fbox{% + \begin{minipage}[c][23.5mm][c]{\dimexpr\textwidth-2\fboxrule\relax}% + \begin{minipage}[c][23mm][c]{24mm}\centering% + \href{https://zsl-gitea.mpabi.pl/edu-inf/lab-rv32i-c-uart}{\qrcode[level=L,height=22mm]{https://zsl-gitea.mpabi.pl/edu-inf/lab-rv32i-c-uart}}% + \end{minipage}% + \vrule width0.35pt% + \begin{minipage}[c][23mm][c]{\dimexpr\linewidth-48mm-0.7pt\relax}% + \setlength{\tabcolsep}{0pt}% + \renewcommand{\arraystretch}{0}% + \begin{tabularx}{\linewidth}{@{}p{\dimexpr0.50000000\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.15126050\linewidth-\arrayrulewidth\relax}|X@{}}% + \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{3.2}{3.4}\selectfont\ttfamily\bfseries TITLE}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{7.7}{7.9}\selectfont\ttfamily\bfseries UART — polling i przerwania RX}\hspace{0.45mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{3.2}{3.4}\selectfont\ttfamily\bfseries VER.}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{6.6}{6.8}\selectfont\ttfamily\bfseries v00.01}\hspace{0.45mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{3.2}{3.4}\selectfont\ttfamily\bfseries DATETIME}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{6.4}{6.6}\selectfont\ttfamily\bfseries 2026-07-20T00:00:00+02:00}\hspace{0.45mm}}\par} \\% + \end{tabularx}% + \par\nointerlineskip% + \hrule height0.35pt% + \nointerlineskip% + \begin{tabularx}{\linewidth}{@{}p{\dimexpr0.50000000\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.25210084\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.14285714\linewidth-\arrayrulewidth\relax}|X@{}}% + \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{3.2}{3.4}\selectfont\ttfamily\bfseries PROJECT}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{7.7}{7.9}\selectfont\ttfamily\bfseries Freestanding C na RV32I}\hspace{0.45mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{3.2}{3.4}\selectfont\ttfamily\bfseries SERIES}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{6.4}{6.6}\selectfont\ttfamily\bfseries C · Freestanding RV32I and K\&R}\hspace{0.45mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{3.2}{3.4}\selectfont\ttfamily\bfseries CARD}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{6.4}{6.6}\selectfont\ttfamily\bfseries 12/13}\hspace{0.45mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{3.2}{3.4}\selectfont\ttfamily\bfseries SHEET}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{6.4}{6.6}\selectfont\ttfamily\bfseries \thepage/\pageref{LastPage}}\hspace{0.45mm}}\par} \\% + \end{tabularx}% + \par\nointerlineskip% + \hrule height0.35pt% + \nointerlineskip% + \begin{tabularx}{\linewidth}{@{}p{\dimexpr0.05882353\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.05042017\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.14705882\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.09243697\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.07563025\linewidth-\arrayrulewidth\relax}|p{\dimexpr0.07563025\linewidth-\arrayrulewidth\relax}|X@{}}% + \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries SUBJ.}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries Inf.}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries PROG.}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries —}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries CORE}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries —}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries SCOPE}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries —}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries LEVEL}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries —}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hspace{0.15mm}{\fontsize{2.85}{3}\selectfont\ttfamily\bfseries POS.}\par\nointerlineskip\vspace{0.12mm}\noindent\makebox[\linewidth][r]{{\fontsize{4.45}{4.65}\selectfont\ttfamily\bfseries —}\hspace{0.15mm}}\par} & \parbox[c][5.19414mm][c]{\linewidth}{\hbox to\linewidth{\hspace{0.35mm}{\fontsize{3.4}{3.75}\selectfont\ttfamily\bfseries GITEA UUID}\hfill{\fontsize{3.4}{3.75}\selectfont\ttfamily e766c4bb-2a43-5f4e-b10a-b3393a42932c}\hspace{0.35mm}}\par\nointerlineskip\hbox to\linewidth{\hspace{0.35mm}{\fontsize{3.4}{3.75}\selectfont\ttfamily\bfseries CARD UUID} {\fontsize{3.4}{3.75}\selectfont\ttfamily 64f7c516-78b1-58ee-8619-a82d7061079f}\hfill{\fontsize{3.4}{3.75}\selectfont\ttfamily\bfseries AUTHOR M. Pabiszczak}\hspace{0.35mm}}} \\% + \end{tabularx}% + \par\nointerlineskip% + \hrule height0.35pt% + \nointerlineskip% + \begin{tabularx}{\linewidth}{@{}X@{}}% + \parbox[c][3.46276mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{4.5}{4.85}\selectfont\ttfamily\bfseries GITEA} {\fontsize{4.5}{4.85}\selectfont\ttfamily\href{https://zsl-gitea.mpabi.pl/edu-inf/lab-rv32i-c-uart}{\nolinkurl{https://zsl-gitea.mpabi.pl/edu-inf/lab-rv32i-c-uart}}}} \\% + \end{tabularx}% + \par\nointerlineskip% + \hrule height0.35pt% + \nointerlineskip% + \begin{tabularx}{\linewidth}{@{}X@{}}% + \parbox[c][3.46276mm][c]{\linewidth}{\hspace{0.45mm}{\fontsize{4.5}{4.85}\selectfont\ttfamily\bfseries HTML} {\fontsize{4.5}{4.85}\selectfont\ttfamily\href{https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/64f7c516-78b1-58ee-8619-a82d7061079f}{\nolinkurl{https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/64f7c516-78b1-58ee-8619-a82d7061079f}}}} \\% + \end{tabularx}% + \end{minipage}% + \vrule width0.35pt% + \begin{minipage}[c][23mm][c]{24mm}\centering% + \href{https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/64f7c516-78b1-58ee-8619-a82d7061079f}{\qrcode[level=L,height=22mm]{https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/64f7c516-78b1-58ee-8619-a82d7061079f}}% + \end{minipage}% + \end{minipage}% + }% + \endgroup% +} + +\pagestyle{fancy} +\fancyhf{} +\fancyhead[C]{\ESCPageResourceHeader} +\renewcommand{\headrulewidth}{0pt} +\renewcommand{\footrulewidth}{0pt} + +\newcommand{\ESCMarginTag}[4]{% + \hspace*{#1}\textcolor{#2}{#3~#4}% +} +\newcommand{\ESCSectionBlockStart}{% + \Needspace{8\baselineskip}% + \par\vspace{0.35em}% + \noindent\textcolor{black!28}{\rule{\textwidth}{0.35pt}}% + \par\vspace{0.15em}% +} +\newcommand{\ESCSectionBlockEnd}{% + \par\vspace{0.45em}% +} +\newcommand{\ESCTinyStepSeparator}{% + \par\vspace{0.10em}% + \noindent{\color{black!18}\leaders\hbox{\rule{0.60em}{0.22pt}\hspace{0.38em}}\hfill\kern0pt}% + \par\vspace{0.10em}% +} +\newtcolorbox{ESCTaskFrame}[1]{enhanced,breakable,arc=0pt,boxrule=0.35pt,colback=white,colframe=black,boxsep=0pt,left=1.4mm,right=1.4mm,top=0.8mm,bottom=0.8mm,colbacktitle=black!7,coltitle=black,title={\ttfamily\bfseries TASK\quad #1}} +\newtcolorbox{ESCBlockFrame}[1]{enhanced,breakable,arc=0pt,boxrule=0.35pt,colback=white,colframe=black!55,boxsep=0pt,left=1.0mm,right=1.0mm,top=0.6mm,bottom=0.6mm,colbacktitle=black!4,coltitle=black,title={\ttfamily\bfseries BLOCK\quad #1}} +\newtcolorbox{ESCStepFrame}[1]{enhanced,breakable,arc=0pt,boxrule=0.35pt,colback=white,colframe=black!28,boxsep=0pt,left=0.8mm,right=0.8mm,top=0.45mm,bottom=0.45mm,colbacktitle=black!2,coltitle=black,title={\ttfamily STEP\quad #1}} +\newtcolorbox{ESCConclusionFrame}{enhanced,breakable,arc=0pt,boxrule=0.45pt,colback=blue!2,colframe=blue!45!black,boxsep=0pt,left=1.2mm,right=1.2mm,top=0.7mm,bottom=0.7mm,colbacktitle=blue!7,coltitle=black,title={\ttfamily\bfseries WNIOSEK}} + +\newcommand{\ESCLearningTreeWidget}{% + \reversemarginpar + \marginnote[% + \begin{minipage}{\marginparwidth}% + \raggedright + {\fontsize{3.55}{3.95}\selectfont\ttfamily + \begin{minipage}[t]{\marginparwidth}% + \raggedright + {\bfseries\textcolor{black!65}{TECH}\par}% + \vspace{0.08em}% + \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% + \hspace*{0.28em}\textcolor{orange!85!black}{EK~LOCAL~C}\textcolor{black!48}{\pdftooltip[width=\textwidth]{.01}{Uczeń uruchamia trzy obrazy RV32I, odczytuje status UART, numer IRQ, bajty i liczniki oraz\textCR wiąże je z listingiem i kodem wyjścia.}}\par% + \hspace*{0.54em}\textcolor{blue!70!black}{KW~LOCAL~C}\textcolor{black!48}{\pdftooltip[width=\textwidth]{.01}{Kod, przewidywanie i pomiar tworzą jeden dowód.}}\par% + \end{minipage}% + }% + \end{minipage}% + ]{} + \normalmarginpar + + \marginnote{% + \begin{minipage}{\marginparwidth}% + \raggedright + {\fontsize{3.55}{3.95}\selectfont\ttfamily + \hspace*{0.06cm}% + \begin{minipage}[t]{\dimexpr\marginparwidth-0.06cm\relax}% + \raggedright + {\bfseries\textcolor{black!65}{OG}\par}% + \vspace{0.08em}% + \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% + \hspace*{0.28em}\textcolor{green!50!black}{EN~LOCAL~EN~C}\textcolor{black!48}{\pdftooltip[width=\textwidth]{.01}{Uczeń rozpisuje cztery oddzielne etapy: stan FIFO, pending i enable, decyzję dispatchera\textCR oraz zmianę stanu aplikacji.}}\par% + \hspace*{0.54em}\textcolor{blue!70!black}{KW~LOCAL~KW~C}\textcolor{black!48}{\pdftooltip[width=\textwidth]{.01}{Kod, przewidywanie i pomiar tworzą jeden dowód.}}\par% + \end{minipage}% + }% + \end{minipage}% + } + +} + +\begin{document} +\sloppy + +\vspace{1.0em} +\noindent{\Large\bfseries Cel karty}\par +\vspace{0.35em} +Uczeń odróżnia polling rejestru statusu od odbioru sterowanego zdarzeniem. Dla ścieżki przerwania wskazuje osobno: bajt w RX FIFO, stan linii external IRQ 16, selekcję przez kontroler Hazard3, wywołanie ISR i efekt konsumowany później przez main. + +\vspace{0.8em} +\noindent\textcolor{black!25}{\rule{\textwidth}{0.35pt}} +\vspace{0.7em} +\noindent{\Large\bfseries Zakres i zachowane przykłady}\par +\vspace{0.35em} +Karta korzysta z laboratoryjnego modelu UART Hazard3. Rejestr \texttt{TB\_UART\_TEST\_RX} jest wyłącznie kontrolowanym bodźcem testbench; nie występuje w produkcyjnym UART ani na RP2350. Po wstrzyknięciu bajtu Task02 i Task03 przechodzą jednak przez rzeczywisty kontroler external IRQ, \texttt{mtvec}, dispatcher i \texttt{mret} modelowanego rdzenia.\par\textbf{Układ każdego przykładu:} pełny profil A1--A8; widok N/D ma jawny powód, a diagram nie jest wymagany, gdy tekst daje lepszy dowód. +\vspace{0.55em} +\small\begin{tabularx}{\textwidth}{@{}>{\ttfamily\raggedright\arraybackslash}p{1.10cm}>{\ttfamily\raggedright\arraybackslash}p{1.45cm}X>{\raggedright\arraybackslash}p{2.50cm}@{}} +\textbf{Typ} & \textbf{Task} & \textbf{Idea} & \textbf{Waga} \\ \hline +\hline +\textbf{\texttt{MMIO}} & \textbf{\texttt{Task01}} & \textbf{STATUS, DATA i kontrolowany RX stimulus} & \textbf{kluczowe} \\ \hline +\hline +\textbf{\texttt{IRQ}} & \textbf{\texttt{Task02}} & \textbf{FIFO, pending, enable, dispatcher i mret} & \textbf{kluczowe} \\ \hline +\hline +\textbf{\texttt{ISR}} & \textbf{\texttt{Task03}} & \textbf{krótki ISR, jawne przepełnienie i konsumpcja w main} & \textbf{kluczowe} \\ \hline +\end{tabularx} +\normalsize + + +\vspace{0.8em} +\noindent\textcolor{black!25}{\rule{\textwidth}{0.35pt}} + +\clearpage + +\ESCSectionBlockStart +\section{Polling pyta o stan w rytmie programu} +\reversemarginpar +\marginnote[% + \begin{minipage}{\marginparwidth}% + \raggedright + {\fontsize{3.55}{3.95}\selectfont\ttfamily + \begin{minipage}[t]{\marginparwidth}% + \raggedright + {\bfseries\textcolor{black!65}{TECH}\par}% + \vspace{0.08em}% + \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% + \end{minipage}% + }% + \end{minipage}% +]{}[-3.1em] +\normalmarginpar + +\marginnote{% + \begin{minipage}{\marginparwidth}% + \raggedright + {\fontsize{3.55}{3.95}\selectfont\ttfamily + \hspace*{0.06cm}% + \begin{minipage}[t]{\dimexpr\marginparwidth-0.06cm\relax}% + \raggedright + {\bfseries\textcolor{black!65}{OG}\par}% + \vspace{0.08em}% + \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% + \end{minipage}% + }% + \end{minipage}% +}[-3.1em] + + +Rejestr \texttt{STATUS.RX\_AVAIL} opisuje niepusty RX FIFO, a odczyt \texttt{DATA} usuwa jeden bajt. W Task01 przerwanie RX pozostaje wyłączone: program sam wykonuje kolejne odczyty statusu. Jest to poprawne dla prostego, krótkiego oczekiwania, lecz czas CPU zależy od częstotliwości odpytywania. Zapis \texttt{TB\_UART\_TEST\_RX='P'} jest bodźcem laboratoryjnym, nie częścią sterownika produkcyjnego. +\ESCSectionBlockEnd + +\ESCSectionBlockStart +\section{RX IRQ jest ścieżką pięciu stanów} +\reversemarginpar +\marginnote[% + \begin{minipage}{\marginparwidth}% + \raggedright + {\fontsize{3.55}{3.95}\selectfont\ttfamily + \begin{minipage}[t]{\marginparwidth}% + \raggedright + {\bfseries\textcolor{black!65}{TECH}\par}% + \vspace{0.08em}% + \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% + \end{minipage}% + }% + \end{minipage}% +]{}[-3.1em] +\normalmarginpar + +\marginnote{% + \begin{minipage}{\marginparwidth}% + \raggedright + {\fontsize{3.55}{3.95}\selectfont\ttfamily + \hspace*{0.06cm}% + \begin{minipage}[t]{\dimexpr\marginparwidth-0.06cm\relax}% + \raggedright + {\bfseries\textcolor{black!65}{OG}\par}% + \vspace{0.08em}% + \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% + \end{minipage}% + }% + \end{minipage}% +}[-3.1em] + + +W Task02 bajt trafia do FIFO i model podnosi external IRQ 16 tylko wtedy, gdy \texttt{CTRL.RX\_IRQ\_EN=1}. Kontroler Hazard3 próbkuje i udostępnia bieżący poziom pending; \texttt{mstatus.MIE}, \texttt{mie.MEIE} i enable linii decydują, czy rdzeń wejdzie do wektora. Dispatcher odczytuje \texttt{meinext}, wybiera wpis 16 z tablicy i wykonuje \texttt{jalr}. Odczyt DATA opróżnia FIFO, więc linia poziomowa i widoczny pending opadają; dopiero \texttt{mret} wraca do normalnego kodu. +\ESCSectionBlockEnd + +\ESCSectionBlockStart +\section{ISR przekazuje minimum, main nadaje znaczenie} +\reversemarginpar +\marginnote[% + \begin{minipage}{\marginparwidth}% + \raggedright + {\fontsize{3.55}{3.95}\selectfont\ttfamily + \begin{minipage}[t]{\marginparwidth}% + \raggedright + {\bfseries\textcolor{black!65}{TECH}\par}% + \vspace{0.08em}% + \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% + \end{minipage}% + }% + \end{minipage}% +]{}[-3.1em] +\normalmarginpar + +\marginnote{% + \begin{minipage}{\marginparwidth}% + \raggedright + {\fontsize{3.55}{3.95}\selectfont\ttfamily + \hspace*{0.06cm}% + \begin{minipage}[t]{\dimexpr\marginparwidth-0.06cm\relax}% + \raggedright + {\bfseries\textcolor{black!65}{OG}\par}% + \vspace{0.08em}% + \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% + \end{minipage}% + }% + \end{minipage}% +}[-3.1em] + + +Task03 nie analizuje komendy w ISR. Handler zawsze opróżnia DATA, a potem albo zapisuje bajt do jednej komórki, albo zwiększa licznik odrzuceń, gdy komórka jest pełna. Polityka \texttt{drop-newest} jest celowo jawna i mierzalna. To nie jest kolejka ani synchronizacja RTOS: pojedyncze 32-bitowe obiekty \texttt{volatile} i kontrolowana kolejność wystarczają wyłącznie dla tego jednego rdzenia i tego przykładu. +\ESCSectionBlockEnd + +\clearpage +\ESCSectionBlockStart +\section{Zadania — zachowane przykłady w profilu A1–A8} +\reversemarginpar +\marginnote[% + \begin{minipage}{\marginparwidth}% + \raggedright + {\fontsize{3.55}{3.95}\selectfont\ttfamily + \begin{minipage}[t]{\marginparwidth}% + \raggedright + {\bfseries\textcolor{black!65}{TECH}\par}% + \vspace{0.08em}% + \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% + \end{minipage}% + }% + \end{minipage}% +]{}[-3.1em] +\normalmarginpar + +\marginnote{% + \begin{minipage}{\marginparwidth}% + \raggedright + {\fontsize{3.55}{3.95}\selectfont\ttfamily + \hspace*{0.06cm}% + \begin{minipage}[t]{\dimexpr\marginparwidth-0.06cm\relax}% + \raggedright + {\bfseries\textcolor{black!65}{OG}\par}% + \vspace{0.08em}% + \hspace*{0.00em}\textcolor{red}{WE~01}\textcolor{black!48}{}\par% + \end{minipage}% + }% + \end{minipage}% +}[-3.1em] + + +\begin{ESCTaskFrame}{TASK01 · Polling jednego bajtu} +{\scriptsize\ttfamily 611a873f-8d37-5084-9ab6-1230e2505249}\par +\begin{ESCBlockFrame}{A1 CONTEXT · AKTYWNE — polling w granicy modelu} +\textbf{Zachowany przykład:} \nolinkurl{src/tasks/task01_uart_polling.c}.\par Odpowiedzialność przykładu zaczyna się od kontrolowanego wstrzyknięcia P do RX FIFO i kończy na odczycie P oraz zapisie T do TX. Nie konfiguruje kontrolera przerwań. \texttt{TEST\_RX} należy wyłącznie do testbench; DATA, STATUS i CTRL modelują interfejs peryferium. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A2 STRUCTURE · AKTYWNE — cztery rejestry i FIFO} +Pod bazą UART0 leżą DATA +0, STATUS +4, CTRL +8 i testowy \texttt{TEST\_RX} +12. FIFO nie jest bezpośrednio adresowalne: \texttt{RX\_AVAIL} mówi tylko, czy zawiera co najmniej jeden bajt, a DATA zwraca i usuwa element czołowy. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A3 DISPATCH · N/D} +\textbf{N/D.} RX IRQ pozostaje wyłączone, więc nie ma wejścia przez mtvec, wyboru ISR ani pośredniego jalr; wszystkie funkcje są wywołaniami bezpośrednimi normalnego kodu. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A4 APPLICATION · AKTYWNE — przewidywanie bitów} +Bez klienta TCP status po wstrzyknięciu P ma wartość 0x3: \texttt{RX\_AVAIL} i \texttt{TX\_READY}. \texttt{RX\_IRQ} jest zerem, bo CTRL nie włącza źródła. Po odczycie DATA FIFO jest puste, więc zostaje 0x2. Znaki mają wartości P=80 i T=84. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A5 FLOW · AKTYWNE — inject, status, data, status, tx} +Kolejność jest częścią dowodu: wyłącz IRQ, wstrzyknij P, odczytaj pierwszy status, odczytaj DATA, odczytaj drugi status, zapisz T. Zamiana DATA z pierwszym statusem zniszczyłaby obserwację \texttt{RX\_AVAIL=1}. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A6 STATE · AKTYWNE — EMPTY do P do EMPTY} +RX FIFO przechodzi \texttt{EMPTY -> ['P'] -> EMPTY}. Status jest funkcją tego stanu i nie przechowuje osobnej kopii flagi. Zapis TX jest widoczny jako T w logu testbencha; bez klienta TCP model nie zachowuje tego bajtu w kolejce sieciowej. Nie zmienia to stanu RX. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A7 RUNTIME · AKTYWNE — adresy 0xc00002xx} +W listingu znajdź zapisy i odczyty pod bazą \texttt{0xc0000200}. W checkpointcie globale mają wartości 3, 80, 2 i 84. Kod 0 pochodzi z pełnego gate, a nie z samego faktu, że program dotarł do \texttt{\_exit}. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A8 PATTERNS · AKTYWNE — status-before-data} +Nazwany wzorzec polling RX brzmi: sprawdź availability, dopiero potem odczytaj destructive DATA. Jest prosty i deterministyczny, ale zużywa czas CPU, jeśli pętla oczekiwania nie ma ograniczenia ani innej pracy. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{Ćwiczenie · Przewidywanie → wykonanie → wniosek} +Przewidź bity statusu przed i po odczycie P. Wskaż, która operacja tworzy bodziec testbench, która tylko obserwuje FIFO, a która usuwa bajt. Potwierdź także zapis T do rejestru TX. +\par\textbf{Evidence:} Tabela bitów STATUS przed i po DATA, odczyt globali Task01, wskazanie transakcji MMIO w listingu RV32I oraz kod wyjścia Hazard3. +\par\textbf{Acceptance:} Hazard3: status\_before=0x3, rx\_byte='P'=80, status\_after=0x2, tx\_byte='T'=84, osobna linia T w logu testbencha, pass=1 i kod wyjścia 0. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{TASK01 · Zapis dowodu ucznia} +\textbf{1. Przewidywanie przed uruchomieniem}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{2. Status i bajt w modelu UART}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{3. Transakcje MMIO RV32I i kod wyjścia}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{4. Wniosek: reguła języka lub kontrakt targetu potwierdzony przez pomiar}\par\noindent\dotfill\par\noindent\dotfill +\end{ESCBlockFrame} +\end{ESCTaskFrame} +\clearpage +\begin{ESCTaskFrame}{TASK02 · Odbiór R przez external IRQ 16} +{\scriptsize\ttfamily 1cd0396c-3eea-5a66-92a9-48439de20b15}\par +\begin{ESCBlockFrame}{A1 CONTEXT · AKTYWNE — pięć granic odpowiedzialności} +\textbf{Zachowany przykład:} \nolinkurl{src/tasks/task02_uart_rx_interrupt.c}.\par \texttt{TEST\_RX} tworzy bodziec, UART utrzymuje FIFO i linię 16, kontroler Hazard3 utrzymuje pending/priority/enable, dispatcher wybiera wpis, a ISR odczytuje DATA. Normalny kod tylko konfiguruje, włącza globalny bit, czeka i ocenia dowód. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A2 STRUCTURE · AKTYWNE — stan peryferium, CSR i tabela} +Stan obejmuje \texttt{CTRL.RX\_IRQ\_EN}, niepusty FIFO, pending linii 16, tablicę \texttt{\_external\_irq\_table[16]}, priorytet, \texttt{mie.MEIE} i \texttt{mstatus.MIE}. Żaden pojedynczy bit nie wystarcza do wejścia w ISR. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A3 DISPATCH · AKTYWNE — meinext do wpisu 16} +Wektor machine external IRQ wchodzi do \texttt{isr\_external\_irq}. Odczyt \texttt{meinext} zwraca gotowy offset tablicy — numer linii 16 przesunięty o dwa bity. Dispatcher dodaje go do bazy \texttt{\_external\_irq\_table} i wykonuje \texttt{jalr} do \texttt{task02\_uart\_handler}. To jest rzeczywisty wybór wykonawcy, nie zwykłe statyczne wywołanie. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A4 APPLICATION · AKTYWNE — R i status 0x13} +Przed globalnym enable pending ma być 1, lecz licznik handlera nadal 0. Po enable ISR ma zobaczyć \texttt{RX\_AVAIL}, \texttt{TX\_READY} i \texttt{RX\_IRQ}, czyli 0x13, odczytać R=82 i opublikować numer 16. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A5 FLOW · AKTYWNE — konfiguracja przed globalnym enable} +Najpierw MIE jest wyzerowane, potem ustawiane są handler, priorytet, enable linii, MEIE i CTRL. Dopiero po wstrzyknięciu R i zmierzeniu pending program ustawia MIE. ISR czyta DATA, dispatcher odtwarza kontekst i wykonuje mret. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A6 STATE · AKTYWNE — PENDING, ACTIVE, DRAINED} +Po bodźcu stan jest PENDING: FIFO zawiera R, linia 16 jest aktywna, lecz globalny gate blokuje wejście. Po MIE przechodzi do ACTIVE. Odczyt DATA tworzy DRAINED: FIFO pusty, linia i pending opadają, a licznik wynosi 1. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A7 RUNTIME · AKTYWNE — mcause 0x8000000b i meinext 16} +Wejście sprzętowe ma machine external interrupt cause 11, czyli \texttt{mcause=0x8000000b}; konkretną linię 16 wybiera dopiero kontroler przez meinext. Listing ma zawierać zapis tablicy, operacje CSR, pośredni jalr i mret. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A8 PATTERNS · AKTYWNE — drain level-triggered source} +Dla źródła poziomowego ISR musi usunąć warunek w peryferium, tutaj opróżnić DATA. Samo wejście do handlera nie jest acknowledge. Gdyby FIFO pozostał niepusty, linia byłaby nadal aktywna i przerwanie wróciłoby po mret. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{Ćwiczenie · Przewidywanie → wykonanie → wniosek} +Rozpisz osobno bity CTRL, pending linii 16, mstatus.MIE, mie.MEIE i enable kontrolera. Przewidź stan przed globalnym enable, numer wybrany przez meinext oraz czynność, która usuwa źródło poziomowe. +\par\textbf{Evidence:} Ślad źródło→pending→enable→dispatcher→ISR→resume, wartości globali w checkpointcie, fragment \texttt{jalr} z \texttt{irq\_dispatch.S} i kod wyjścia Hazard3. +\par\textbf{Acceptance:} Hazard3: pending\_before\_enable=1; jeden handler IRQ 16 widzi status 0x13 i byte='R'=82; po odczycie DATA pending\_after=0, pass=1 i kod 0. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{TASK02 · Zapis dowodu ucznia} +\textbf{1. Przewidywanie przed uruchomieniem}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{2. Macierz pending i enable przed ISR}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{3. Numer IRQ, status, bajt i powrót mret}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{4. Wniosek: reguła języka lub kontrakt targetu potwierdzony przez pomiar}\par\noindent\dotfill\par\noindent\dotfill +\end{ESCBlockFrame} +\end{ESCTaskFrame} +\clearpage +\begin{ESCTaskFrame}{TASK03 · Jednokomórkowa skrzynka drop-newest} +{\scriptsize\ttfamily c60d485a-0e23-522a-a06a-78c86be36f76}\par +\begin{ESCBlockFrame}{A1 CONTEXT · AKTYWNE — ISR transportuje, main konsumuje} +\textbf{Zachowany przykład:} \nolinkurl{src/tasks/task03_uart_mailbox.c}.\par Handler odpowiada za szybkie opróżnienie DATA i próbę publikacji jednego bajtu. Nie interpretuje komendy. Main odpowiada za konsumpcję. Gdy skrzynka jest pełna, kontrakt jawnie odrzuca najnowszy bajt i liczy stratę. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A2 STRUCTURE · AKTYWNE — payload, flaga i telemetria} +Skrzynkę tworzą \texttt{mailbox\_byte} i \texttt{mailbox\_full}. Osobne liczniki irq, accepted i dropped nie sterują algorytmem; są telemetrią dowodu. Każdy obiekt ma szerokość 32 bitów i jest volatile w tym jednordzeniowym kontrakcie bare-metal. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A3 DISPATCH · AKTYWNE — ten sam IRQ, inny odbiorca} +Linia 16 przechodzi przez ten sam dispatcher co Task02, lecz wpis tablicy wskazuje \texttt{task03\_uart\_handler}. Dynamiczny wybór kończy się pośrednim jalr; decyzja accepted/drop odbywa się dopiero wewnątrz handlera na podstawie danych. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A4 APPLICATION · AKTYWNE — A przyjęte, B odrzucone, C przyjęte} +Po A skrzynka jest pełna i accepted=1. B wywołuje drugie IRQ, DATA zostaje opróżnione, lecz payload A pozostaje, a dropped rośnie do 1. Main pobiera A. Po C pusta skrzynka znów przyjmuje dane; main pobiera C. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A5 FLOW · AKTYWNE — drain przed decyzją publish/drop} +ISR najpierw odczytuje DATA, dzięki czemu usuwa źródło poziomowe niezależnie od stanu skrzynki. Następnie zwiększa \texttt{irq\_count} i wybiera publikację albo drop. Main czeka na konkretną liczbę obsług, a nie na sam upływ pętli. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A6 STATE · AKTYWNE — EMPTY, FULL(A), FULL(A), EMPTY, FULL(C), EMPTY} +Pełny ślad skrzynki to \texttt{EMPTY -> FULL(A) -> FULL(A) -> EMPTY -> FULL(C) -> EMPTY}. Drugie przejście nie zmienia payloadu, ale zmienia licznik dropped; dlatego stan domenowy i telemetria muszą być czytane razem. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A7 RUNTIME · AKTYWNE — trzy wejścia i trzy mret} +Checkpoint ma pokazać irq=3, accepted=2, dropped=1, 65, 67 i full=0. W listingu wskaż trzy klasy operacji: MMIO DATA, zapisy globali przez ISR oraz odtworzenie kontekstu i mret w dispatcherze. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{A8 PATTERNS · AKTYWNE — bounded mailbox z jawną utratą} +Jednokomórkowa skrzynka ogranicza czas i pamięć ISR. Jej ważną częścią jest polityka przeciążenia i licznik strat. Nie należy nazywać jej kolejką; nie zachowuje serii zdarzeń i nie zastępuje synchronizacji wielordzeniowej ani RTOS. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{Ćwiczenie · Przewidywanie → wykonanie → wniosek} +Prześledź A, B i C. Dla każdego bajtu zapisz stan FIFO, \texttt{mailbox\_full}, decyzję ISR i późniejszy odczyt main. Wyjaśnij, dlaczego B jest odrzucone, a mimo to DATA musi zostać odczytane. +\par\textbf{Evidence:} Tabela trzech zdarzeń A/B/C, liczniki ISR, dwie wartości odebrane przez main, stan końcowy skrzynki oraz kod wyjścia Hazard3. +\par\textbf{Acceptance:} Hazard3: irq\_count=3, accepted=2, dropped=1, first\_consumed='A'=65, second\_consumed='C'=67, mailbox\_full=0, pass=1 i kod 0. +\end{ESCBlockFrame} +\begin{ESCBlockFrame}{TASK03 · Zapis dowodu ucznia} +\textbf{1. Przewidywanie przed uruchomieniem}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{2. Ślad ISR dla A, B i C}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{3. Konsumpcja main, liczniki i kod wyjścia}\par\noindent\dotfill\par\noindent\dotfill\par\textbf{4. Wniosek: reguła języka lub kontrakt targetu potwierdzony przez pomiar}\par\noindent\dotfill\par\noindent\dotfill +\end{ESCBlockFrame} +\end{ESCTaskFrame} +\ESCSectionBlockEnd + +\end{document} diff --git a/doc/generated/main.upb b/doc/generated/main.upb new file mode 100644 index 0000000..e69de29 diff --git a/doc/pdf/mpabi-inf-c-12-uart-polling-interrupts-v00.01-e766c4bb-2a43-5f4e-b10a-b3393a42932c.pdf b/doc/pdf/mpabi-inf-c-12-uart-polling-interrupts-v00.01-e766c4bb-2a43-5f4e-b10a-b3393a42932c.pdf new file mode 100644 index 0000000000000000000000000000000000000000..bae363ed12da9fb8eb732ffad25fbeff487ad663 GIT binary patch literal 257830 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
DCLR)+EVXRZuXZCb-YJC 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
    tWjabCOWi7Gc`JVw*i%qtDNBda1H=2ra^vns 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%0DTS;zo2(G&EBP-&dP!v9kp6>t0SAcgM53;w^ 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 EK -> KW", + "description": "Kod C, ABI i obserwacja RV32I." + }, + { + "id": "ogolne", + "label": "OG", + "side": "right", + "tree": "WE -> EN -> KW", + "description": "Przewidywanie, pomiar i wniosek." + } + ] + }, + "learning_effects": { + "C12.EN01": { + "bloom_level": "Analiza", + "label": "Źródło to nie handler", + "text": "Uczeń rozpisuje cztery oddzielne etapy: stan FIFO, pending i enable, decyzję dispatchera oraz zmianę stanu aplikacji.", + "assessment_criteria": [ + "C12.KW01" + ] + }, + "C12.EK01": { + "bloom_level": "Zastosowanie", + "label": "Dowód na Hazard3", + "text": "Uczeń uruchamia trzy obrazy RV32I, odczytuje status UART, numer IRQ, bajty i liczniki oraz wiąże je z listingiem i kodem wyjścia.", + "assessment_criteria": [ + "C12.KW01" + ] + } + }, + "assessment_criteria": { + "C12.KW01": { + "text": "Wszystkie trzy programy kończą się kodem 0 w Hazard3. Task01 odczytuje P przez polling: status 0x3 przed i 0x2 po odczycie. Task02 przed globalnym enable widzi pending=1, handler numeru 16 odczytuje R przy statusie 0x13, a po obsłudze pending=0. Task03 obsługuje trzy IRQ, przyjmuje A i C, odrzuca B zgodnie z drop-newest i kończy z accepted=2, dropped=1.", + "learning_effects": [ + "C12.EN01", + "C12.EK01" + ] + } + }, + "educational_requirements": { + "C12.WE01": { + "text": "Obsługa MMIO i przerwania UART z jawnym rozdzieleniem bodźca testbench, stanu peryferium, kontrolera przerwań, ISR i normalnego kodu.", + "label": "MMIO UART, external IRQ oraz jednokomórkowa skrzynka ISR do main", + "learning_effects": [ + "C12.EN01", + "C12.EK01" + ], + "learning_tree": { + "schema": "we-learning-tree.v1", + "policy": "Najpierw przewidywanie, następnie wykonanie i odczyt dowodu.", + "ogolne": [ + { + "effect_ref": "C12.EN01", + "display": "EN C12 01", + "source": "LOCAL", + "official": "C", + "local": "01", + "kind": "EN", + "tree_id": "C12.WE01.OG.LOCAL.C.01", + "text": "Uczeń rozpisuje cztery oddzielne etapy: stan FIFO, pending i enable, decyzję dispatchera oraz zmianę stanu aplikacji.", + "kw": [ + { + "criterion_ref": "C12.KW01", + "display": "KW C12 01", + "source": "LOCAL", + "kind": "KW", + "official": "C", + "local": "01", + "text": "Kod, przewidywanie i pomiar tworzą jeden dowód." + } + ] + } + ], + "zawodowe": [ + { + "effect_ref": "C12.EK01", + "display": "EK C12 01", + "source": "LOCAL", + "official": "C", + "local": "01", + "kind": "EK", + "tree_id": "C12.WE01.TECH.LOCAL.C.01", + "text": "Uczeń uruchamia trzy obrazy RV32I, odczytuje status UART, numer IRQ, bajty i liczniki oraz wiąże je z listingiem i kodem wyjścia.", + "kw": [ + { + "criterion_ref": "C12.KW01", + "display": "KW C12 01", + "source": "LOCAL", + "kind": "KW", + "official": "C", + "local": "01", + "text": "Kod, przewidywanie i pomiar tworzą jeden dowód." + } + ] + } + ] + } + } + }, + "sections": [ + { + "title": "Polling pyta o stan w rytmie programu", + "order": 10, + "content_kind": "prose", + "page_orientation": "portrait", + "content_tex": "Rejestr \\texttt{STATUS.RX\\_AVAIL} opisuje niepusty RX FIFO, a odczyt \\texttt{DATA} usuwa jeden bajt. W Task01 przerwanie RX pozostaje wyłączone: program sam wykonuje kolejne odczyty statusu. Jest to poprawne dla prostego, krótkiego oczekiwania, lecz czas CPU zależy od częstotliwości odpytywania. Zapis \\texttt{TB\\_UART\\_TEST\\_RX='P'} jest bodźcem laboratoryjnym, nie częścią sterownika produkcyjnego.", + "educational_requirement_refs": [ + "C12.WE01" + ], + "learning_effect_refs": [ + "C12.EN01", + "C12.EK01" + ], + "assessment_criterion_refs": [ + "C12.KW01" + ] + }, + { + "title": "RX IRQ jest ścieżką pięciu stanów", + "order": 20, + "content_kind": "prose", + "page_orientation": "portrait", + "content_tex": "W Task02 bajt trafia do FIFO i model podnosi external IRQ 16 tylko wtedy, gdy \\texttt{CTRL.RX\\_IRQ\\_EN=1}. Kontroler Hazard3 próbkuje i udostępnia bieżący poziom pending; \\texttt{mstatus.MIE}, \\texttt{mie.MEIE} i enable linii decydują, czy rdzeń wejdzie do wektora. Dispatcher odczytuje \\texttt{meinext}, wybiera wpis 16 z tablicy i wykonuje \\texttt{jalr}. Odczyt DATA opróżnia FIFO, więc linia poziomowa i widoczny pending opadają; dopiero \\texttt{mret} wraca do normalnego kodu.", + "educational_requirement_refs": [ + "C12.WE01" + ], + "learning_effect_refs": [ + "C12.EN01", + "C12.EK01" + ], + "assessment_criterion_refs": [ + "C12.KW01" + ] + }, + { + "title": "ISR przekazuje minimum, main nadaje znaczenie", + "order": 30, + "content_kind": "prose", + "page_orientation": "portrait", + "content_tex": "Task03 nie analizuje komendy w ISR. Handler zawsze opróżnia DATA, a potem albo zapisuje bajt do jednej komórki, albo zwiększa licznik odrzuceń, gdy komórka jest pełna. Polityka \\texttt{drop-newest} jest celowo jawna i mierzalna. To nie jest kolejka ani synchronizacja RTOS: pojedyncze 32-bitowe obiekty \\texttt{volatile} i kontrolowana kolejność wystarczają wyłącznie dla tego jednego rdzenia i tego przykładu.", + "educational_requirement_refs": [ + "C12.WE01" + ], + "learning_effect_refs": [ + "C12.EN01", + "C12.EK01" + ], + "assessment_criterion_refs": [ + "C12.KW01" + ] + }, + { + "title": "Zadania — zachowane przykłady w profilu A1–A8", + "order": 40, + "content_kind": "tasks", + "page_orientation": "portrait", + "task_refs": [ + "task01", + "task02", + "task03" + ], + "educational_requirement_refs": [ + "C12.WE01" + ], + "learning_effect_refs": [ + "C12.EN01", + "C12.EK01" + ], + "assessment_criterion_refs": [ + "C12.KW01" + ] + } + ], + "tasks": { + "task01": { + "title": "Polling jednego bajtu", + "uuid": "611a873f-8d37-5084-9ab6-1230e2505249", + "prompt_tex": "Przewidź bity statusu przed i po odczycie P. Wskaż, która operacja tworzy bodziec testbench, która tylko obserwuje FIFO, a która usuwa bajt. Potwierdź także zapis T do rejestru TX.", + "criterion": "Hazard3: status_before=0x3, rx_byte='P'=80, status_after=0x2, tx_byte='T'=84, osobna linia T w logu testbencha, pass=1 i kod wyjścia 0.", + "conclusion_tex": "", + "render_task_acceptance": false, + "viewpoints": [ + { + "id": "A1", + "status": "enabled", + "title": "CONTEXT — polling w granicy modelu", + "content_tex": "Odpowiedzialność przykładu zaczyna się od kontrolowanego wstrzyknięcia P do RX FIFO i kończy na odczycie P oraz zapisie T do TX. Nie konfiguruje kontrolera przerwań. \\texttt{TEST\\_RX} należy wyłącznie do testbench; DATA, STATUS i CTRL modelują interfejs peryferium." + }, + { + "id": "A2", + "status": "enabled", + "title": "STRUCTURE — cztery rejestry i FIFO", + "content_tex": "Pod bazą UART0 leżą DATA +0, STATUS +4, CTRL +8 i testowy \\texttt{TEST\\_RX} +12. FIFO nie jest bezpośrednio adresowalne: \\texttt{RX\\_AVAIL} mówi tylko, czy zawiera co najmniej jeden bajt, a DATA zwraca i usuwa element czołowy." + }, + { + "id": "A3", + "status": "unavailable", + "title": "DISPATCH", + "reason": "RX IRQ pozostaje wyłączone, więc nie ma wejścia przez mtvec, wyboru ISR ani pośredniego jalr; wszystkie funkcje są wywołaniami bezpośrednimi normalnego kodu." + }, + { + "id": "A4", + "status": "enabled", + "title": "APPLICATION — przewidywanie bitów", + "content_tex": "Bez klienta TCP status po wstrzyknięciu P ma wartość 0x3: \\texttt{RX\\_AVAIL} i \\texttt{TX\\_READY}. \\texttt{RX\\_IRQ} jest zerem, bo CTRL nie włącza źródła. Po odczycie DATA FIFO jest puste, więc zostaje 0x2. Znaki mają wartości P=80 i T=84." + }, + { + "id": "A5", + "status": "enabled", + "title": "FLOW — inject, status, data, status, tx", + "content_tex": "Kolejność jest częścią dowodu: wyłącz IRQ, wstrzyknij P, odczytaj pierwszy status, odczytaj DATA, odczytaj drugi status, zapisz T. Zamiana DATA z pierwszym statusem zniszczyłaby obserwację \\texttt{RX\\_AVAIL=1}." + }, + { + "id": "A6", + "status": "enabled", + "title": "STATE — EMPTY do P do EMPTY", + "content_tex": "RX FIFO przechodzi \\texttt{EMPTY -> ['P'] -> EMPTY}. Status jest funkcją tego stanu i nie przechowuje osobnej kopii flagi. Zapis TX jest widoczny jako T w logu testbencha; bez klienta TCP model nie zachowuje tego bajtu w kolejce sieciowej. Nie zmienia to stanu RX." + }, + { + "id": "A7", + "status": "enabled", + "title": "RUNTIME — adresy 0xc00002xx", + "content_tex": "W listingu znajdź zapisy i odczyty pod bazą \\texttt{0xc0000200}. W checkpointcie globale mają wartości 3, 80, 2 i 84. Kod 0 pochodzi z pełnego gate, a nie z samego faktu, że program dotarł do \\texttt{\\_exit}." + }, + { + "id": "A8", + "status": "enabled", + "title": "PATTERNS — status-before-data", + "content_tex": "Nazwany wzorzec polling RX brzmi: sprawdź availability, dopiero potem odczytaj destructive DATA. Jest prosty i deterministyczny, ale zużywa czas CPU, jeśli pętla oczekiwania nie ma ograniczenia ani innej pracy." + } + ], + "flow": [ + { + "kind": "block", + "id": "task01.a1", + "title": "A1 CONTEXT · AKTYWNE — polling w granicy modelu", + "content_tex": "\\textbf{Zachowany przykład:} \\nolinkurl{src/tasks/task01_uart_polling.c}.\\par Odpowiedzialność przykładu zaczyna się od kontrolowanego wstrzyknięcia P do RX FIFO i kończy na odczycie P oraz zapisie T do TX. Nie konfiguruje kontrolera przerwań. \\texttt{TEST\\_RX} należy wyłącznie do testbench; DATA, STATUS i CTRL modelują interfejs peryferium." + }, + { + "kind": "block", + "id": "task01.a2", + "title": "A2 STRUCTURE · AKTYWNE — cztery rejestry i FIFO", + "content_tex": "Pod bazą UART0 leżą DATA +0, STATUS +4, CTRL +8 i testowy \\texttt{TEST\\_RX} +12. FIFO nie jest bezpośrednio adresowalne: \\texttt{RX\\_AVAIL} mówi tylko, czy zawiera co najmniej jeden bajt, a DATA zwraca i usuwa element czołowy." + }, + { + "kind": "block", + "id": "task01.a3", + "title": "A3 DISPATCH · N/D", + "content_tex": "\\textbf{N/D.} RX IRQ pozostaje wyłączone, więc nie ma wejścia przez mtvec, wyboru ISR ani pośredniego jalr; wszystkie funkcje są wywołaniami bezpośrednimi normalnego kodu." + }, + { + "kind": "block", + "id": "task01.a4", + "title": "A4 APPLICATION · AKTYWNE — przewidywanie bitów", + "content_tex": "Bez klienta TCP status po wstrzyknięciu P ma wartość 0x3: \\texttt{RX\\_AVAIL} i \\texttt{TX\\_READY}. \\texttt{RX\\_IRQ} jest zerem, bo CTRL nie włącza źródła. Po odczycie DATA FIFO jest puste, więc zostaje 0x2. Znaki mają wartości P=80 i T=84." + }, + { + "kind": "block", + "id": "task01.a5", + "title": "A5 FLOW · AKTYWNE — inject, status, data, status, tx", + "content_tex": "Kolejność jest częścią dowodu: wyłącz IRQ, wstrzyknij P, odczytaj pierwszy status, odczytaj DATA, odczytaj drugi status, zapisz T. Zamiana DATA z pierwszym statusem zniszczyłaby obserwację \\texttt{RX\\_AVAIL=1}." + }, + { + "kind": "block", + "id": "task01.a6", + "title": "A6 STATE · AKTYWNE — EMPTY do P do EMPTY", + "content_tex": "RX FIFO przechodzi \\texttt{EMPTY -> ['P'] -> EMPTY}. Status jest funkcją tego stanu i nie przechowuje osobnej kopii flagi. Zapis TX jest widoczny jako T w logu testbencha; bez klienta TCP model nie zachowuje tego bajtu w kolejce sieciowej. Nie zmienia to stanu RX." + }, + { + "kind": "block", + "id": "task01.a7", + "title": "A7 RUNTIME · AKTYWNE — adresy 0xc00002xx", + "content_tex": "W listingu znajdź zapisy i odczyty pod bazą \\texttt{0xc0000200}. W checkpointcie globale mają wartości 3, 80, 2 i 84. Kod 0 pochodzi z pełnego gate, a nie z samego faktu, że program dotarł do \\texttt{\\_exit}." + }, + { + "kind": "block", + "id": "task01.a8", + "title": "A8 PATTERNS · AKTYWNE — status-before-data", + "content_tex": "Nazwany wzorzec polling RX brzmi: sprawdź availability, dopiero potem odczytaj destructive DATA. Jest prosty i deterministyczny, ale zużywa czas CPU, jeśli pętla oczekiwania nie ma ograniczenia ani innej pracy." + }, + { + "kind": "exercise", + "id": "task01.proof", + "title": "Przewidywanie → wykonanie → wniosek", + "prompt_tex": "Przewidź bity statusu przed i po odczycie P. Wskaż, która operacja tworzy bodziec testbench, która tylko obserwuje FIFO, a która usuwa bajt. Potwierdź także zapis T do rejestru TX.", + "evidence_tex": "Tabela bitów STATUS przed i po DATA, odczyt globali Task01, wskazanie transakcji MMIO w listingu RV32I oraz kod wyjścia Hazard3.", + "criterion": "Hazard3: status_before=0x3, rx_byte='P'=80, status_after=0x2, tx_byte='T'=84, osobna linia T w logu testbencha, pass=1 i kod wyjścia 0." + }, + { + "kind": "block", + "id": "task01.worksheet", + "title": "TASK01 · Zapis dowodu ucznia", + "content_tex": "\\textbf{1. Przewidywanie przed uruchomieniem}\\par\\noindent\\dotfill\\par\\noindent\\dotfill\\par\\textbf{2. Status i bajt w modelu UART}\\par\\noindent\\dotfill\\par\\noindent\\dotfill\\par\\textbf{3. Transakcje MMIO RV32I i kod wyjścia}\\par\\noindent\\dotfill\\par\\noindent\\dotfill\\par\\textbf{4. Wniosek: reguła języka lub kontrakt targetu potwierdzony przez pomiar}\\par\\noindent\\dotfill\\par\\noindent\\dotfill" + } + ], + "educational_requirement_refs": [ + "C12.WE01" + ], + "learning_effect_refs": [ + "C12.EN01", + "C12.EK01" + ], + "assessment_criterion_ref": "C12.KW01" + }, + "task02": { + "title": "Odbiór R przez external IRQ 16", + "uuid": "1cd0396c-3eea-5a66-92a9-48439de20b15", + "prompt_tex": "Rozpisz osobno bity CTRL, pending linii 16, mstatus.MIE, mie.MEIE i enable kontrolera. Przewidź stan przed globalnym enable, numer wybrany przez meinext oraz czynność, która usuwa źródło poziomowe.", + "criterion": "Hazard3: pending_before_enable=1; jeden handler IRQ 16 widzi status 0x13 i byte='R'=82; po odczycie DATA pending_after=0, pass=1 i kod 0.", + "conclusion_tex": "", + "render_task_acceptance": false, + "viewpoints": [ + { + "id": "A1", + "status": "enabled", + "title": "CONTEXT — pięć granic odpowiedzialności", + "content_tex": "\\texttt{TEST\\_RX} tworzy bodziec, UART utrzymuje FIFO i linię 16, kontroler Hazard3 utrzymuje pending/priority/enable, dispatcher wybiera wpis, a ISR odczytuje DATA. Normalny kod tylko konfiguruje, włącza globalny bit, czeka i ocenia dowód." + }, + { + "id": "A2", + "status": "enabled", + "title": "STRUCTURE — stan peryferium, CSR i tabela", + "content_tex": "Stan obejmuje \\texttt{CTRL.RX\\_IRQ\\_EN}, niepusty FIFO, pending linii 16, tablicę \\texttt{\\_external\\_irq\\_table[16]}, priorytet, \\texttt{mie.MEIE} i \\texttt{mstatus.MIE}. Żaden pojedynczy bit nie wystarcza do wejścia w ISR." + }, + { + "id": "A3", + "status": "enabled", + "title": "DISPATCH — meinext do wpisu 16", + "content_tex": "Wektor machine external IRQ wchodzi do \\texttt{isr\\_external\\_irq}. Odczyt \\texttt{meinext} zwraca gotowy offset tablicy — numer linii 16 przesunięty o dwa bity. Dispatcher dodaje go do bazy \\texttt{\\_external\\_irq\\_table} i wykonuje \\texttt{jalr} do \\texttt{task02\\_uart\\_handler}. To jest rzeczywisty wybór wykonawcy, nie zwykłe statyczne wywołanie." + }, + { + "id": "A4", + "status": "enabled", + "title": "APPLICATION — R i status 0x13", + "content_tex": "Przed globalnym enable pending ma być 1, lecz licznik handlera nadal 0. Po enable ISR ma zobaczyć \\texttt{RX\\_AVAIL}, \\texttt{TX\\_READY} i \\texttt{RX\\_IRQ}, czyli 0x13, odczytać R=82 i opublikować numer 16." + }, + { + "id": "A5", + "status": "enabled", + "title": "FLOW — konfiguracja przed globalnym enable", + "content_tex": "Najpierw MIE jest wyzerowane, potem ustawiane są handler, priorytet, enable linii, MEIE i CTRL. Dopiero po wstrzyknięciu R i zmierzeniu pending program ustawia MIE. ISR czyta DATA, dispatcher odtwarza kontekst i wykonuje mret." + }, + { + "id": "A6", + "status": "enabled", + "title": "STATE — PENDING, ACTIVE, DRAINED", + "content_tex": "Po bodźcu stan jest PENDING: FIFO zawiera R, linia 16 jest aktywna, lecz globalny gate blokuje wejście. Po MIE przechodzi do ACTIVE. Odczyt DATA tworzy DRAINED: FIFO pusty, linia i pending opadają, a licznik wynosi 1." + }, + { + "id": "A7", + "status": "enabled", + "title": "RUNTIME — mcause 0x8000000b i meinext 16", + "content_tex": "Wejście sprzętowe ma machine external interrupt cause 11, czyli \\texttt{mcause=0x8000000b}; konkretną linię 16 wybiera dopiero kontroler przez meinext. Listing ma zawierać zapis tablicy, operacje CSR, pośredni jalr i mret." + }, + { + "id": "A8", + "status": "enabled", + "title": "PATTERNS — drain level-triggered source", + "content_tex": "Dla źródła poziomowego ISR musi usunąć warunek w peryferium, tutaj opróżnić DATA. Samo wejście do handlera nie jest acknowledge. Gdyby FIFO pozostał niepusty, linia byłaby nadal aktywna i przerwanie wróciłoby po mret." + } + ], + "flow": [ + { + "kind": "block", + "id": "task02.a1", + "title": "A1 CONTEXT · AKTYWNE — pięć granic odpowiedzialności", + "content_tex": "\\textbf{Zachowany przykład:} \\nolinkurl{src/tasks/task02_uart_rx_interrupt.c}.\\par \\texttt{TEST\\_RX} tworzy bodziec, UART utrzymuje FIFO i linię 16, kontroler Hazard3 utrzymuje pending/priority/enable, dispatcher wybiera wpis, a ISR odczytuje DATA. Normalny kod tylko konfiguruje, włącza globalny bit, czeka i ocenia dowód." + }, + { + "kind": "block", + "id": "task02.a2", + "title": "A2 STRUCTURE · AKTYWNE — stan peryferium, CSR i tabela", + "content_tex": "Stan obejmuje \\texttt{CTRL.RX\\_IRQ\\_EN}, niepusty FIFO, pending linii 16, tablicę \\texttt{\\_external\\_irq\\_table[16]}, priorytet, \\texttt{mie.MEIE} i \\texttt{mstatus.MIE}. Żaden pojedynczy bit nie wystarcza do wejścia w ISR." + }, + { + "kind": "block", + "id": "task02.a3", + "title": "A3 DISPATCH · AKTYWNE — meinext do wpisu 16", + "content_tex": "Wektor machine external IRQ wchodzi do \\texttt{isr\\_external\\_irq}. Odczyt \\texttt{meinext} zwraca gotowy offset tablicy — numer linii 16 przesunięty o dwa bity. Dispatcher dodaje go do bazy \\texttt{\\_external\\_irq\\_table} i wykonuje \\texttt{jalr} do \\texttt{task02\\_uart\\_handler}. To jest rzeczywisty wybór wykonawcy, nie zwykłe statyczne wywołanie." + }, + { + "kind": "block", + "id": "task02.a4", + "title": "A4 APPLICATION · AKTYWNE — R i status 0x13", + "content_tex": "Przed globalnym enable pending ma być 1, lecz licznik handlera nadal 0. Po enable ISR ma zobaczyć \\texttt{RX\\_AVAIL}, \\texttt{TX\\_READY} i \\texttt{RX\\_IRQ}, czyli 0x13, odczytać R=82 i opublikować numer 16." + }, + { + "kind": "block", + "id": "task02.a5", + "title": "A5 FLOW · AKTYWNE — konfiguracja przed globalnym enable", + "content_tex": "Najpierw MIE jest wyzerowane, potem ustawiane są handler, priorytet, enable linii, MEIE i CTRL. Dopiero po wstrzyknięciu R i zmierzeniu pending program ustawia MIE. ISR czyta DATA, dispatcher odtwarza kontekst i wykonuje mret." + }, + { + "kind": "block", + "id": "task02.a6", + "title": "A6 STATE · AKTYWNE — PENDING, ACTIVE, DRAINED", + "content_tex": "Po bodźcu stan jest PENDING: FIFO zawiera R, linia 16 jest aktywna, lecz globalny gate blokuje wejście. Po MIE przechodzi do ACTIVE. Odczyt DATA tworzy DRAINED: FIFO pusty, linia i pending opadają, a licznik wynosi 1." + }, + { + "kind": "block", + "id": "task02.a7", + "title": "A7 RUNTIME · AKTYWNE — mcause 0x8000000b i meinext 16", + "content_tex": "Wejście sprzętowe ma machine external interrupt cause 11, czyli \\texttt{mcause=0x8000000b}; konkretną linię 16 wybiera dopiero kontroler przez meinext. Listing ma zawierać zapis tablicy, operacje CSR, pośredni jalr i mret." + }, + { + "kind": "block", + "id": "task02.a8", + "title": "A8 PATTERNS · AKTYWNE — drain level-triggered source", + "content_tex": "Dla źródła poziomowego ISR musi usunąć warunek w peryferium, tutaj opróżnić DATA. Samo wejście do handlera nie jest acknowledge. Gdyby FIFO pozostał niepusty, linia byłaby nadal aktywna i przerwanie wróciłoby po mret." + }, + { + "kind": "exercise", + "id": "task02.proof", + "title": "Przewidywanie → wykonanie → wniosek", + "prompt_tex": "Rozpisz osobno bity CTRL, pending linii 16, mstatus.MIE, mie.MEIE i enable kontrolera. Przewidź stan przed globalnym enable, numer wybrany przez meinext oraz czynność, która usuwa źródło poziomowe.", + "evidence_tex": "Ślad źródło→pending→enable→dispatcher→ISR→resume, wartości globali w checkpointcie, fragment \\texttt{jalr} z \\texttt{irq\\_dispatch.S} i kod wyjścia Hazard3.", + "criterion": "Hazard3: pending_before_enable=1; jeden handler IRQ 16 widzi status 0x13 i byte='R'=82; po odczycie DATA pending_after=0, pass=1 i kod 0." + }, + { + "kind": "block", + "id": "task02.worksheet", + "title": "TASK02 · Zapis dowodu ucznia", + "content_tex": "\\textbf{1. Przewidywanie przed uruchomieniem}\\par\\noindent\\dotfill\\par\\noindent\\dotfill\\par\\textbf{2. Macierz pending i enable przed ISR}\\par\\noindent\\dotfill\\par\\noindent\\dotfill\\par\\textbf{3. Numer IRQ, status, bajt i powrót mret}\\par\\noindent\\dotfill\\par\\noindent\\dotfill\\par\\textbf{4. Wniosek: reguła języka lub kontrakt targetu potwierdzony przez pomiar}\\par\\noindent\\dotfill\\par\\noindent\\dotfill" + } + ], + "educational_requirement_refs": [ + "C12.WE01" + ], + "learning_effect_refs": [ + "C12.EN01", + "C12.EK01" + ], + "assessment_criterion_ref": "C12.KW01" + }, + "task03": { + "title": "Jednokomórkowa skrzynka drop-newest", + "uuid": "c60d485a-0e23-522a-a06a-78c86be36f76", + "prompt_tex": "Prześledź A, B i C. Dla każdego bajtu zapisz stan FIFO, \\texttt{mailbox\\_full}, decyzję ISR i późniejszy odczyt main. Wyjaśnij, dlaczego B jest odrzucone, a mimo to DATA musi zostać odczytane.", + "criterion": "Hazard3: irq_count=3, accepted=2, dropped=1, first_consumed='A'=65, second_consumed='C'=67, mailbox_full=0, pass=1 i kod 0.", + "conclusion_tex": "", + "render_task_acceptance": false, + "viewpoints": [ + { + "id": "A1", + "status": "enabled", + "title": "CONTEXT — ISR transportuje, main konsumuje", + "content_tex": "Handler odpowiada za szybkie opróżnienie DATA i próbę publikacji jednego bajtu. Nie interpretuje komendy. Main odpowiada za konsumpcję. Gdy skrzynka jest pełna, kontrakt jawnie odrzuca najnowszy bajt i liczy stratę." + }, + { + "id": "A2", + "status": "enabled", + "title": "STRUCTURE — payload, flaga i telemetria", + "content_tex": "Skrzynkę tworzą \\texttt{mailbox\\_byte} i \\texttt{mailbox\\_full}. Osobne liczniki irq, accepted i dropped nie sterują algorytmem; są telemetrią dowodu. Każdy obiekt ma szerokość 32 bitów i jest volatile w tym jednordzeniowym kontrakcie bare-metal." + }, + { + "id": "A3", + "status": "enabled", + "title": "DISPATCH — ten sam IRQ, inny odbiorca", + "content_tex": "Linia 16 przechodzi przez ten sam dispatcher co Task02, lecz wpis tablicy wskazuje \\texttt{task03\\_uart\\_handler}. Dynamiczny wybór kończy się pośrednim jalr; decyzja accepted/drop odbywa się dopiero wewnątrz handlera na podstawie danych." + }, + { + "id": "A4", + "status": "enabled", + "title": "APPLICATION — A przyjęte, B odrzucone, C przyjęte", + "content_tex": "Po A skrzynka jest pełna i accepted=1. B wywołuje drugie IRQ, DATA zostaje opróżnione, lecz payload A pozostaje, a dropped rośnie do 1. Main pobiera A. Po C pusta skrzynka znów przyjmuje dane; main pobiera C." + }, + { + "id": "A5", + "status": "enabled", + "title": "FLOW — drain przed decyzją publish/drop", + "content_tex": "ISR najpierw odczytuje DATA, dzięki czemu usuwa źródło poziomowe niezależnie od stanu skrzynki. Następnie zwiększa \\texttt{irq\\_count} i wybiera publikację albo drop. Main czeka na konkretną liczbę obsług, a nie na sam upływ pętli." + }, + { + "id": "A6", + "status": "enabled", + "title": "STATE — EMPTY, FULL(A), FULL(A), EMPTY, FULL(C), EMPTY", + "content_tex": "Pełny ślad skrzynki to \\texttt{EMPTY -> FULL(A) -> FULL(A) -> EMPTY -> FULL(C) -> EMPTY}. Drugie przejście nie zmienia payloadu, ale zmienia licznik dropped; dlatego stan domenowy i telemetria muszą być czytane razem." + }, + { + "id": "A7", + "status": "enabled", + "title": "RUNTIME — trzy wejścia i trzy mret", + "content_tex": "Checkpoint ma pokazać irq=3, accepted=2, dropped=1, 65, 67 i full=0. W listingu wskaż trzy klasy operacji: MMIO DATA, zapisy globali przez ISR oraz odtworzenie kontekstu i mret w dispatcherze." + }, + { + "id": "A8", + "status": "enabled", + "title": "PATTERNS — bounded mailbox z jawną utratą", + "content_tex": "Jednokomórkowa skrzynka ogranicza czas i pamięć ISR. Jej ważną częścią jest polityka przeciążenia i licznik strat. Nie należy nazywać jej kolejką; nie zachowuje serii zdarzeń i nie zastępuje synchronizacji wielordzeniowej ani RTOS." + } + ], + "flow": [ + { + "kind": "block", + "id": "task03.a1", + "title": "A1 CONTEXT · AKTYWNE — ISR transportuje, main konsumuje", + "content_tex": "\\textbf{Zachowany przykład:} \\nolinkurl{src/tasks/task03_uart_mailbox.c}.\\par Handler odpowiada za szybkie opróżnienie DATA i próbę publikacji jednego bajtu. Nie interpretuje komendy. Main odpowiada za konsumpcję. Gdy skrzynka jest pełna, kontrakt jawnie odrzuca najnowszy bajt i liczy stratę." + }, + { + "kind": "block", + "id": "task03.a2", + "title": "A2 STRUCTURE · AKTYWNE — payload, flaga i telemetria", + "content_tex": "Skrzynkę tworzą \\texttt{mailbox\\_byte} i \\texttt{mailbox\\_full}. Osobne liczniki irq, accepted i dropped nie sterują algorytmem; są telemetrią dowodu. Każdy obiekt ma szerokość 32 bitów i jest volatile w tym jednordzeniowym kontrakcie bare-metal." + }, + { + "kind": "block", + "id": "task03.a3", + "title": "A3 DISPATCH · AKTYWNE — ten sam IRQ, inny odbiorca", + "content_tex": "Linia 16 przechodzi przez ten sam dispatcher co Task02, lecz wpis tablicy wskazuje \\texttt{task03\\_uart\\_handler}. Dynamiczny wybór kończy się pośrednim jalr; decyzja accepted/drop odbywa się dopiero wewnątrz handlera na podstawie danych." + }, + { + "kind": "block", + "id": "task03.a4", + "title": "A4 APPLICATION · AKTYWNE — A przyjęte, B odrzucone, C przyjęte", + "content_tex": "Po A skrzynka jest pełna i accepted=1. B wywołuje drugie IRQ, DATA zostaje opróżnione, lecz payload A pozostaje, a dropped rośnie do 1. Main pobiera A. Po C pusta skrzynka znów przyjmuje dane; main pobiera C." + }, + { + "kind": "block", + "id": "task03.a5", + "title": "A5 FLOW · AKTYWNE — drain przed decyzją publish/drop", + "content_tex": "ISR najpierw odczytuje DATA, dzięki czemu usuwa źródło poziomowe niezależnie od stanu skrzynki. Następnie zwiększa \\texttt{irq\\_count} i wybiera publikację albo drop. Main czeka na konkretną liczbę obsług, a nie na sam upływ pętli." + }, + { + "kind": "block", + "id": "task03.a6", + "title": "A6 STATE · AKTYWNE — EMPTY, FULL(A), FULL(A), EMPTY, FULL(C), EMPTY", + "content_tex": "Pełny ślad skrzynki to \\texttt{EMPTY -> FULL(A) -> FULL(A) -> EMPTY -> FULL(C) -> EMPTY}. Drugie przejście nie zmienia payloadu, ale zmienia licznik dropped; dlatego stan domenowy i telemetria muszą być czytane razem." + }, + { + "kind": "block", + "id": "task03.a7", + "title": "A7 RUNTIME · AKTYWNE — trzy wejścia i trzy mret", + "content_tex": "Checkpoint ma pokazać irq=3, accepted=2, dropped=1, 65, 67 i full=0. W listingu wskaż trzy klasy operacji: MMIO DATA, zapisy globali przez ISR oraz odtworzenie kontekstu i mret w dispatcherze." + }, + { + "kind": "block", + "id": "task03.a8", + "title": "A8 PATTERNS · AKTYWNE — bounded mailbox z jawną utratą", + "content_tex": "Jednokomórkowa skrzynka ogranicza czas i pamięć ISR. Jej ważną częścią jest polityka przeciążenia i licznik strat. Nie należy nazywać jej kolejką; nie zachowuje serii zdarzeń i nie zastępuje synchronizacji wielordzeniowej ani RTOS." + }, + { + "kind": "exercise", + "id": "task03.proof", + "title": "Przewidywanie → wykonanie → wniosek", + "prompt_tex": "Prześledź A, B i C. Dla każdego bajtu zapisz stan FIFO, \\texttt{mailbox\\_full}, decyzję ISR i późniejszy odczyt main. Wyjaśnij, dlaczego B jest odrzucone, a mimo to DATA musi zostać odczytane.", + "evidence_tex": "Tabela trzech zdarzeń A/B/C, liczniki ISR, dwie wartości odebrane przez main, stan końcowy skrzynki oraz kod wyjścia Hazard3.", + "criterion": "Hazard3: irq_count=3, accepted=2, dropped=1, first_consumed='A'=65, second_consumed='C'=67, mailbox_full=0, pass=1 i kod 0." + }, + { + "kind": "block", + "id": "task03.worksheet", + "title": "TASK03 · Zapis dowodu ucznia", + "content_tex": "\\textbf{1. Przewidywanie przed uruchomieniem}\\par\\noindent\\dotfill\\par\\noindent\\dotfill\\par\\textbf{2. Ślad ISR dla A, B i C}\\par\\noindent\\dotfill\\par\\noindent\\dotfill\\par\\textbf{3. Konsumpcja main, liczniki i kod wyjścia}\\par\\noindent\\dotfill\\par\\noindent\\dotfill\\par\\textbf{4. Wniosek: reguła języka lub kontrakt targetu potwierdzony przez pomiar}\\par\\noindent\\dotfill\\par\\noindent\\dotfill" + } + ], + "educational_requirement_refs": [ + "C12.WE01" + ], + "learning_effect_refs": [ + "C12.EN01", + "C12.EK01" + ], + "assessment_criterion_ref": "C12.KW01" + } + }, + "tasks_order": [ + "task01", + "task02", + "task03" + ] +} diff --git a/json/card_spec.json b/json/card_spec.json new file mode 100644 index 0000000..1e88535 --- /dev/null +++ b/json/card_spec.json @@ -0,0 +1,229 @@ +{ + "card": { + "number": "12", + "slug": "uart-polling-interrupts", + "title": "UART — polling i przerwania RX", + "topic": "MMIO UART, external IRQ oraz jednokomórkowa skrzynka ISR do main", + "status": "Gotowa", + "version": "v00.01", + "revision_date": "2026-07-20T00:00:00+02:00" + }, + "scope_headers": ["Typ", "Task", "Idea", "Waga"], + "front": { + "goal": "Uczeń odróżnia polling rejestru statusu od odbioru sterowanego zdarzeniem. Dla ścieżki przerwania wskazuje osobno: bajt w RX FIFO, stan linii external IRQ 16, selekcję przez kontroler Hazard3, wywołanie ISR i efekt konsumowany później przez main.", + "scope": "Karta korzysta z laboratoryjnego modelu UART Hazard3. Rejestr \\texttt{TB\\_UART\\_TEST\\_RX} jest wyłącznie kontrolowanym bodźcem testbench; nie występuje w produkcyjnym UART ani na RP2350. Po wstrzyknięciu bajtu Task02 i Task03 przechodzą jednak przez rzeczywisty kontroler external IRQ, \\texttt{mtvec}, dispatcher i \\texttt{mret} modelowanego rdzenia." + }, + "learning": { + "reasoning_label": "Źródło to nie handler", + "reasoning": "Uczeń rozpisuje cztery oddzielne etapy: stan FIFO, pending i enable, decyzję dispatchera oraz zmianę stanu aplikacji.", + "practice_label": "Dowód na Hazard3", + "practice": "Uczeń uruchamia trzy obrazy RV32I, odczytuje status UART, numer IRQ, bajty i liczniki oraz wiąże je z listingiem i kodem wyjścia.", + "criterion": "Wszystkie trzy programy kończą się kodem 0 w Hazard3. Task01 odczytuje P przez polling: status 0x3 przed i 0x2 po odczycie. Task02 przed globalnym enable widzi pending=1, handler numeru 16 odczytuje R przy statusie 0x13, a po obsłudze pending=0. Task03 obsługuje trzy IRQ, przyjmuje A i C, odrzuca B zgodnie z drop-newest i kończy z accepted=2, dropped=1.", + "requirement": "Obsługa MMIO i przerwania UART z jawnym rozdzieleniem bodźca testbench, stanu peryferium, kontrolera przerwań, ISR i normalnego kodu." + }, + "sections": [ + { + "title": "Polling pyta o stan w rytmie programu", + "content_tex": "Rejestr \\texttt{STATUS.RX\\_AVAIL} opisuje niepusty RX FIFO, a odczyt \\texttt{DATA} usuwa jeden bajt. W Task01 przerwanie RX pozostaje wyłączone: program sam wykonuje kolejne odczyty statusu. Jest to poprawne dla prostego, krótkiego oczekiwania, lecz czas CPU zależy od częstotliwości odpytywania. Zapis \\texttt{TB\\_UART\\_TEST\\_RX='P'} jest bodźcem laboratoryjnym, nie częścią sterownika produkcyjnego." + }, + { + "title": "RX IRQ jest ścieżką pięciu stanów", + "content_tex": "W Task02 bajt trafia do FIFO i model podnosi external IRQ 16 tylko wtedy, gdy \\texttt{CTRL.RX\\_IRQ\\_EN=1}. Kontroler Hazard3 próbkuje i udostępnia bieżący poziom pending; \\texttt{mstatus.MIE}, \\texttt{mie.MEIE} i enable linii decydują, czy rdzeń wejdzie do wektora. Dispatcher odczytuje \\texttt{meinext}, wybiera wpis 16 z tablicy i wykonuje \\texttt{jalr}. Odczyt DATA opróżnia FIFO, więc linia poziomowa i widoczny pending opadają; dopiero \\texttt{mret} wraca do normalnego kodu." + }, + { + "title": "ISR przekazuje minimum, main nadaje znaczenie", + "content_tex": "Task03 nie analizuje komendy w ISR. Handler zawsze opróżnia DATA, a potem albo zapisuje bajt do jednej komórki, albo zwiększa licznik odrzuceń, gdy komórka jest pełna. Polityka \\texttt{drop-newest} jest celowo jawna i mierzalna. To nie jest kolejka ani synchronizacja RTOS: pojedyncze 32-bitowe obiekty \\texttt{volatile} i kontrolowana kolejność wystarczają wyłącznie dla tego jednego rdzenia i tego przykładu." + } + ], + "tasks": [ + { + "id": "task01", + "chapter": "MMIO", + "title": "Polling jednego bajtu", + "idea_tex": "STATUS, DATA i kontrolowany RX stimulus", + "priority": "kluczowe", + "key": true, + "prompt_tex": "Przewidź bity statusu przed i po odczycie P. Wskaż, która operacja tworzy bodziec testbench, która tylko obserwuje FIFO, a która usuwa bajt. Potwierdź także zapis T do rejestru TX.", + "criterion": "Hazard3: status_before=0x3, rx_byte='P'=80, status_after=0x2, tx_byte='T'=84, osobna linia T w logu testbencha, pass=1 i kod wyjścia 0.", + "evidence_tex": "Tabela bitów STATUS przed i po DATA, odczyt globali Task01, wskazanie transakcji MMIO w listingu RV32I oraz kod wyjścia Hazard3.", + "worksheet_step2": "Status i bajt w modelu UART", + "worksheet_step3": "Transakcje MMIO RV32I i kod wyjścia", + "viewpoints": [ + { + "id": "A1", + "status": "enabled", + "title": "CONTEXT — polling w granicy modelu", + "content_tex": "Odpowiedzialność przykładu zaczyna się od kontrolowanego wstrzyknięcia P do RX FIFO i kończy na odczycie P oraz zapisie T do TX. Nie konfiguruje kontrolera przerwań. \\texttt{TEST\\_RX} należy wyłącznie do testbench; DATA, STATUS i CTRL modelują interfejs peryferium." + }, + { + "id": "A2", + "status": "enabled", + "title": "STRUCTURE — cztery rejestry i FIFO", + "content_tex": "Pod bazą UART0 leżą DATA +0, STATUS +4, CTRL +8 i testowy \\texttt{TEST\\_RX} +12. FIFO nie jest bezpośrednio adresowalne: \\texttt{RX\\_AVAIL} mówi tylko, czy zawiera co najmniej jeden bajt, a DATA zwraca i usuwa element czołowy." + }, + { + "id": "A3", + "status": "unavailable", + "title": "DISPATCH", + "reason": "RX IRQ pozostaje wyłączone, więc nie ma wejścia przez mtvec, wyboru ISR ani pośredniego jalr; wszystkie funkcje są wywołaniami bezpośrednimi normalnego kodu." + }, + { + "id": "A4", + "status": "enabled", + "title": "APPLICATION — przewidywanie bitów", + "content_tex": "Bez klienta TCP status po wstrzyknięciu P ma wartość 0x3: \\texttt{RX\\_AVAIL} i \\texttt{TX\\_READY}. \\texttt{RX\\_IRQ} jest zerem, bo CTRL nie włącza źródła. Po odczycie DATA FIFO jest puste, więc zostaje 0x2. Znaki mają wartości P=80 i T=84." + }, + { + "id": "A5", + "status": "enabled", + "title": "FLOW — inject, status, data, status, tx", + "content_tex": "Kolejność jest częścią dowodu: wyłącz IRQ, wstrzyknij P, odczytaj pierwszy status, odczytaj DATA, odczytaj drugi status, zapisz T. Zamiana DATA z pierwszym statusem zniszczyłaby obserwację \\texttt{RX\\_AVAIL=1}." + }, + { + "id": "A6", + "status": "enabled", + "title": "STATE — EMPTY do P do EMPTY", + "content_tex": "RX FIFO przechodzi \\texttt{EMPTY -> ['P'] -> EMPTY}. Status jest funkcją tego stanu i nie przechowuje osobnej kopii flagi. Zapis TX jest widoczny jako T w logu testbencha; bez klienta TCP model nie zachowuje tego bajtu w kolejce sieciowej. Nie zmienia to stanu RX." + }, + { + "id": "A7", + "status": "enabled", + "title": "RUNTIME — adresy 0xc00002xx", + "content_tex": "W listingu znajdź zapisy i odczyty pod bazą \\texttt{0xc0000200}. W checkpointcie globale mają wartości 3, 80, 2 i 84. Kod 0 pochodzi z pełnego gate, a nie z samego faktu, że program dotarł do \\texttt{\\_exit}." + }, + { + "id": "A8", + "status": "enabled", + "title": "PATTERNS — status-before-data", + "content_tex": "Nazwany wzorzec polling RX brzmi: sprawdź availability, dopiero potem odczytaj destructive DATA. Jest prosty i deterministyczny, ale zużywa czas CPU, jeśli pętla oczekiwania nie ma ograniczenia ani innej pracy." + } + ] + }, + { + "id": "task02", + "chapter": "IRQ", + "title": "Odbiór R przez external IRQ 16", + "idea_tex": "FIFO, pending, enable, dispatcher i mret", + "priority": "kluczowe", + "key": true, + "prompt_tex": "Rozpisz osobno bity CTRL, pending linii 16, mstatus.MIE, mie.MEIE i enable kontrolera. Przewidź stan przed globalnym enable, numer wybrany przez meinext oraz czynność, która usuwa źródło poziomowe.", + "criterion": "Hazard3: pending_before_enable=1; jeden handler IRQ 16 widzi status 0x13 i byte='R'=82; po odczycie DATA pending_after=0, pass=1 i kod 0.", + "evidence_tex": "Ślad źródło→pending→enable→dispatcher→ISR→resume, wartości globali w checkpointcie, fragment \\texttt{jalr} z \\texttt{irq\\_dispatch.S} i kod wyjścia Hazard3.", + "worksheet_step2": "Macierz pending i enable przed ISR", + "worksheet_step3": "Numer IRQ, status, bajt i powrót mret", + "viewpoints": [ + { + "id": "A1", + "status": "enabled", + "title": "CONTEXT — pięć granic odpowiedzialności", + "content_tex": "\\texttt{TEST\\_RX} tworzy bodziec, UART utrzymuje FIFO i linię 16, kontroler Hazard3 utrzymuje pending/priority/enable, dispatcher wybiera wpis, a ISR odczytuje DATA. Normalny kod tylko konfiguruje, włącza globalny bit, czeka i ocenia dowód." + }, + { + "id": "A2", + "status": "enabled", + "title": "STRUCTURE — stan peryferium, CSR i tabela", + "content_tex": "Stan obejmuje \\texttt{CTRL.RX\\_IRQ\\_EN}, niepusty FIFO, pending linii 16, tablicę \\texttt{\\_external\\_irq\\_table[16]}, priorytet, \\texttt{mie.MEIE} i \\texttt{mstatus.MIE}. Żaden pojedynczy bit nie wystarcza do wejścia w ISR." + }, + { + "id": "A3", + "status": "enabled", + "title": "DISPATCH — meinext do wpisu 16", + "content_tex": "Wektor machine external IRQ wchodzi do \\texttt{isr\\_external\\_irq}. Odczyt \\texttt{meinext} zwraca gotowy offset tablicy — numer linii 16 przesunięty o dwa bity. Dispatcher dodaje go do bazy \\texttt{\\_external\\_irq\\_table} i wykonuje \\texttt{jalr} do \\texttt{task02\\_uart\\_handler}. To jest rzeczywisty wybór wykonawcy, nie zwykłe statyczne wywołanie." + }, + { + "id": "A4", + "status": "enabled", + "title": "APPLICATION — R i status 0x13", + "content_tex": "Przed globalnym enable pending ma być 1, lecz licznik handlera nadal 0. Po enable ISR ma zobaczyć \\texttt{RX\\_AVAIL}, \\texttt{TX\\_READY} i \\texttt{RX\\_IRQ}, czyli 0x13, odczytać R=82 i opublikować numer 16." + }, + { + "id": "A5", + "status": "enabled", + "title": "FLOW — konfiguracja przed globalnym enable", + "content_tex": "Najpierw MIE jest wyzerowane, potem ustawiane są handler, priorytet, enable linii, MEIE i CTRL. Dopiero po wstrzyknięciu R i zmierzeniu pending program ustawia MIE. ISR czyta DATA, dispatcher odtwarza kontekst i wykonuje mret." + }, + { + "id": "A6", + "status": "enabled", + "title": "STATE — PENDING, ACTIVE, DRAINED", + "content_tex": "Po bodźcu stan jest PENDING: FIFO zawiera R, linia 16 jest aktywna, lecz globalny gate blokuje wejście. Po MIE przechodzi do ACTIVE. Odczyt DATA tworzy DRAINED: FIFO pusty, linia i pending opadają, a licznik wynosi 1." + }, + { + "id": "A7", + "status": "enabled", + "title": "RUNTIME — mcause 0x8000000b i meinext 16", + "content_tex": "Wejście sprzętowe ma machine external interrupt cause 11, czyli \\texttt{mcause=0x8000000b}; konkretną linię 16 wybiera dopiero kontroler przez meinext. Listing ma zawierać zapis tablicy, operacje CSR, pośredni jalr i mret." + }, + { + "id": "A8", + "status": "enabled", + "title": "PATTERNS — drain level-triggered source", + "content_tex": "Dla źródła poziomowego ISR musi usunąć warunek w peryferium, tutaj opróżnić DATA. Samo wejście do handlera nie jest acknowledge. Gdyby FIFO pozostał niepusty, linia byłaby nadal aktywna i przerwanie wróciłoby po mret." + } + ] + }, + { + "id": "task03", + "chapter": "ISR", + "title": "Jednokomórkowa skrzynka drop-newest", + "idea_tex": "krótki ISR, jawne przepełnienie i konsumpcja w main", + "priority": "kluczowe", + "key": true, + "prompt_tex": "Prześledź A, B i C. Dla każdego bajtu zapisz stan FIFO, \\texttt{mailbox\\_full}, decyzję ISR i późniejszy odczyt main. Wyjaśnij, dlaczego B jest odrzucone, a mimo to DATA musi zostać odczytane.", + "criterion": "Hazard3: irq_count=3, accepted=2, dropped=1, first_consumed='A'=65, second_consumed='C'=67, mailbox_full=0, pass=1 i kod 0.", + "evidence_tex": "Tabela trzech zdarzeń A/B/C, liczniki ISR, dwie wartości odebrane przez main, stan końcowy skrzynki oraz kod wyjścia Hazard3.", + "worksheet_step2": "Ślad ISR dla A, B i C", + "worksheet_step3": "Konsumpcja main, liczniki i kod wyjścia", + "viewpoints": [ + { + "id": "A1", + "status": "enabled", + "title": "CONTEXT — ISR transportuje, main konsumuje", + "content_tex": "Handler odpowiada za szybkie opróżnienie DATA i próbę publikacji jednego bajtu. Nie interpretuje komendy. Main odpowiada za konsumpcję. Gdy skrzynka jest pełna, kontrakt jawnie odrzuca najnowszy bajt i liczy stratę." + }, + { + "id": "A2", + "status": "enabled", + "title": "STRUCTURE — payload, flaga i telemetria", + "content_tex": "Skrzynkę tworzą \\texttt{mailbox\\_byte} i \\texttt{mailbox\\_full}. Osobne liczniki irq, accepted i dropped nie sterują algorytmem; są telemetrią dowodu. Każdy obiekt ma szerokość 32 bitów i jest volatile w tym jednordzeniowym kontrakcie bare-metal." + }, + { + "id": "A3", + "status": "enabled", + "title": "DISPATCH — ten sam IRQ, inny odbiorca", + "content_tex": "Linia 16 przechodzi przez ten sam dispatcher co Task02, lecz wpis tablicy wskazuje \\texttt{task03\\_uart\\_handler}. Dynamiczny wybór kończy się pośrednim jalr; decyzja accepted/drop odbywa się dopiero wewnątrz handlera na podstawie danych." + }, + { + "id": "A4", + "status": "enabled", + "title": "APPLICATION — A przyjęte, B odrzucone, C przyjęte", + "content_tex": "Po A skrzynka jest pełna i accepted=1. B wywołuje drugie IRQ, DATA zostaje opróżnione, lecz payload A pozostaje, a dropped rośnie do 1. Main pobiera A. Po C pusta skrzynka znów przyjmuje dane; main pobiera C." + }, + { + "id": "A5", + "status": "enabled", + "title": "FLOW — drain przed decyzją publish/drop", + "content_tex": "ISR najpierw odczytuje DATA, dzięki czemu usuwa źródło poziomowe niezależnie od stanu skrzynki. Następnie zwiększa \\texttt{irq\\_count} i wybiera publikację albo drop. Main czeka na konkretną liczbę obsług, a nie na sam upływ pętli." + }, + { + "id": "A6", + "status": "enabled", + "title": "STATE — EMPTY, FULL(A), FULL(A), EMPTY, FULL(C), EMPTY", + "content_tex": "Pełny ślad skrzynki to \\texttt{EMPTY -> FULL(A) -> FULL(A) -> EMPTY -> FULL(C) -> EMPTY}. Drugie przejście nie zmienia payloadu, ale zmienia licznik dropped; dlatego stan domenowy i telemetria muszą być czytane razem." + }, + { + "id": "A7", + "status": "enabled", + "title": "RUNTIME — trzy wejścia i trzy mret", + "content_tex": "Checkpoint ma pokazać irq=3, accepted=2, dropped=1, 65, 67 i full=0. W listingu wskaż trzy klasy operacji: MMIO DATA, zapisy globali przez ISR oraz odtworzenie kontekstu i mret w dispatcherze." + }, + { + "id": "A8", + "status": "enabled", + "title": "PATTERNS — bounded mailbox z jawną utratą", + "content_tex": "Jednokomórkowa skrzynka ogranicza czas i pamięć ISR. Jej ważną częścią jest polityka przeciążenia i licznik strat. Nie należy nazywać jej kolejką; nie zachowuje serii zdarzeń i nie zastępuje synchronizacji wielordzeniowej ani RTOS." + } + ] + } + ] +} diff --git a/link/hazard3_c12.ld b/link/hazard3_c12.ld new file mode 100644 index 0000000..816f93b --- /dev/null +++ b/link/hazard3_c12.ld @@ -0,0 +1,64 @@ +OUTPUT_FORMAT("elf32-littleriscv") +OUTPUT_ARCH(riscv) +ENTRY(_start) + +MEMORY +{ + RAM (rwx) : ORIGIN = 0x80000000, LENGTH = 16M +} + +PHDRS +{ + text PT_LOAD FLAGS(5); /* read + execute */ + data PT_LOAD FLAGS(6); /* read + write */ +} + +SECTIONS +{ + . = ORIGIN(RAM); + + .text : ALIGN(4) + { + KEEP(*(.vectors)) + *(.text.startup .text.startup.*) + *(.text .text.*) + } > RAM :text + + .rodata : ALIGN(4) + { + *(.rodata .rodata.*) + } > RAM :text + + .data : ALIGN(16) + { + __data_start = .; + *(.data .data.*) + *(.sdata .sdata.*) + __data_end = .; + } > RAM :data + + .bss (NOLOAD) : ALIGN(16) + { + __bss_start = .; + *(.bss .bss.* COMMON) + *(.sbss .sbss.*) + __bss_end = .; + } > RAM :data + + . = ALIGN(16); + _end = .; + PROVIDE(end = .); + __stack_top = ORIGIN(RAM) + LENGTH(RAM); + __stack_reserve = 64K; + __stack_bottom = __stack_top - __stack_reserve; + __global_pointer$ = __data_start + 0x800; + + /DISCARD/ : + { + *(.comment) + *(.note .note.*) + } +} + +ASSERT(_end <= __stack_bottom, + "C12: program overlaps the reserved 64 KiB stack") diff --git a/scripts/render_card_layouts.sh b/scripts/render_card_layouts.sh new file mode 100755 index 0000000..3deecc0 --- /dev/null +++ b/scripts/render_card_layouts.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env sh +set -eu + +script_dir=$(CDPATH= cd "$(dirname "$0")" && pwd) +repo_root=$(CDPATH= cd "$script_dir/.." && pwd) +layouts_root=$repo_root/../../../tools/card-layouts + +python3 "$layouts_root/tools/build_kr_c_card.py" "$repo_root" +exec python3 "$layouts_root/tools/render_card.py" "$repo_root" "$@" diff --git a/scripts/render_new_pdf.sh b/scripts/render_new_pdf.sh new file mode 100755 index 0000000..08afe92 --- /dev/null +++ b/scripts/render_new_pdf.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env sh +set -eu + +script_dir=$(CDPATH= cd "$(dirname "$0")" && pwd) +repo_root=$(CDPATH= cd "$script_dir/.." && pwd) +layouts_root=$repo_root/../../../tools/card-layouts + +if ! git -C "$repo_root" rev-parse --verify HEAD >/dev/null 2>&1; then + export GITEA_SHA=0000000000000000000000000000000000000000 +fi + +exec "$layouts_root/tools/render_card_pdf_preserving.sh" "$repo_root" diff --git a/src/tasks/c12_common.h b/src/tasks/c12_common.h new file mode 100644 index 0000000..952fa99 --- /dev/null +++ b/src/tasks/c12_common.h @@ -0,0 +1,49 @@ +#ifndef C12_COMMON_H +#define C12_COMMON_H + +#include +#include + +#include "hazard3_irq.h" +#include "tb_uart_io.h" + +#define C12_UART_INDEX 0u +#define C12_UART_IRQ (TB_UART_EXTERNAL_IRQ_BASE + C12_UART_INDEX) +#define C12_PRINT_U32 (*(volatile uint32_t *)0xc0000004u) + +static inline void c12_print_u32(uint32_t value) +{ + C12_PRINT_U32 = value; +} + +static inline void c12_external_irq_prepare(void (*handler)(void)) +{ + global_irq_enable(false); + external_irq_enable(false); + tb_uart_rx_irq_enable(C12_UART_INDEX, false); + h3irq_set_handler(C12_UART_IRQ, handler); + h3irq_set_priority(C12_UART_IRQ, 1u); + h3irq_enable(C12_UART_IRQ, true); + external_irq_enable(true); + tb_uart_rx_irq_enable(C12_UART_INDEX, true); +} + +static inline void c12_external_irq_stop(void) +{ + global_irq_enable(false); + tb_uart_rx_irq_enable(C12_UART_INDEX, false); + h3irq_enable(C12_UART_IRQ, false); + external_irq_enable(false); +} + +static inline bool c12_wait_for(volatile uint32_t *value, uint32_t expected) +{ + for (uint32_t spin = 0; spin < 100000u; ++spin) { + if (*value == expected) + return true; + __asm__ volatile("nop"); + } + return false; +} + +#endif diff --git a/src/tasks/task01_uart_polling.c b/src/tasks/task01_uart_polling.c new file mode 100644 index 0000000..bd2b3c7 --- /dev/null +++ b/src/tasks/task01_uart_polling.c @@ -0,0 +1,42 @@ +#include "c12_common.h" + +volatile uint32_t g_status_before; +volatile uint32_t g_status_after; +volatile uint32_t g_rx_byte; +volatile uint32_t g_tx_byte; +volatile uint32_t g_task01_pass; + +__attribute__((noinline)) void task01_debug_checkpoint(void) +{ + __asm__ volatile("" ::: "memory"); +} + +int main(void) +{ + tb_uart_rx_irq_enable(C12_UART_INDEX, false); + tb_uart_test_inject_rx(C12_UART_INDEX, (uint8_t)'P'); + + g_status_before = tb_uart_status(C12_UART_INDEX); + g_rx_byte = (uint32_t)tb_uart_try_read(C12_UART_INDEX); + g_status_after = tb_uart_status(C12_UART_INDEX); + + g_tx_byte = (uint32_t)'T'; + tb_uart_write(C12_UART_INDEX, (uint8_t)g_tx_byte); + tb_uart_write(C12_UART_INDEX, (uint8_t)'\n'); + + g_task01_pass = + (g_status_before & TB_UART_STATUS_RX_AVAIL) != 0u && + (g_status_before & TB_UART_STATUS_RX_IRQ) == 0u && + g_rx_byte == (uint32_t)'P' && + (g_status_after & TB_UART_STATUS_RX_AVAIL) == 0u && + (g_status_after & TB_UART_STATUS_TX_READY) != 0u; + + task01_debug_checkpoint(); + c12_print_u32(0xc1201001u); + c12_print_u32(g_status_before); + c12_print_u32(g_rx_byte); + c12_print_u32(g_status_after); + c12_print_u32(g_tx_byte); + c12_print_u32(g_task01_pass); + return g_task01_pass ? 0 : 1; +} diff --git a/src/tasks/task02_uart_rx_interrupt.c b/src/tasks/task02_uart_rx_interrupt.c new file mode 100644 index 0000000..6eeb370 --- /dev/null +++ b/src/tasks/task02_uart_rx_interrupt.c @@ -0,0 +1,60 @@ +#include "c12_common.h" + +volatile uint32_t g_irq_count; +volatile uint32_t g_irq_number; +volatile uint32_t g_status_in_handler; +volatile uint32_t g_rx_byte; +volatile uint32_t g_pending_before_enable; +volatile uint32_t g_pending_after; +volatile uint32_t g_task02_pass; + +void task02_uart_handler(void) +{ + g_irq_number = (uint32_t)h3irq_get_current_irq(); + g_status_in_handler = tb_uart_status(C12_UART_INDEX); + g_rx_byte = *tb_uart_reg(C12_UART_INDEX, TB_UART_DATA) & 0xffu; + g_irq_count++; +} + +__attribute__((noinline)) void task02_debug_checkpoint(void) +{ + __asm__ volatile("" ::: "memory"); +} + +int main(void) +{ + c12_external_irq_prepare(task02_uart_handler); + tb_uart_test_inject_rx(C12_UART_INDEX, (uint8_t)'R'); + + for (uint32_t settle = 0; settle < 32u; ++settle) + __asm__ volatile("nop"); + g_pending_before_enable = h3irq_pending(C12_UART_IRQ) ? 1u : 0u; + + global_irq_enable(true); + const bool handled = c12_wait_for(&g_irq_count, 1u); + global_irq_enable(false); + + for (uint32_t settle = 0; settle < 32u; ++settle) + __asm__ volatile("nop"); + g_pending_after = h3irq_pending(C12_UART_IRQ) ? 1u : 0u; + + g_task02_pass = handled && + g_irq_count == 1u && + g_irq_number == C12_UART_IRQ && + (g_status_in_handler & TB_UART_STATUS_RX_IRQ) != 0u && + g_rx_byte == (uint32_t)'R' && + g_pending_before_enable == 1u && + g_pending_after == 0u; + + c12_external_irq_stop(); + task02_debug_checkpoint(); + c12_print_u32(0xc1202002u); + c12_print_u32(g_pending_before_enable); + c12_print_u32(g_irq_count); + c12_print_u32(g_irq_number); + c12_print_u32(g_status_in_handler); + c12_print_u32(g_rx_byte); + c12_print_u32(g_pending_after); + c12_print_u32(g_task02_pass); + return g_task02_pass ? 0 : 1; +} diff --git a/src/tasks/task03_uart_mailbox.c b/src/tasks/task03_uart_mailbox.c new file mode 100644 index 0000000..59e6334 --- /dev/null +++ b/src/tasks/task03_uart_mailbox.c @@ -0,0 +1,74 @@ +#include "c12_common.h" + +volatile uint32_t g_irq_count; +volatile uint32_t g_mailbox_full; +volatile uint32_t g_mailbox_byte; +volatile uint32_t g_accepted_count; +volatile uint32_t g_dropped_count; +volatile uint32_t g_first_consumed; +volatile uint32_t g_second_consumed; +volatile uint32_t g_task03_pass; + +void task03_uart_handler(void) +{ + const uint32_t byte = *tb_uart_reg(C12_UART_INDEX, TB_UART_DATA) & 0xffu; + + g_irq_count++; + if (g_mailbox_full) { + g_dropped_count++; + } else { + g_mailbox_byte = byte; + g_mailbox_full = 1u; + g_accepted_count++; + } +} + +static uint32_t consume_mailbox(void) +{ + const uint32_t byte = g_mailbox_byte; + g_mailbox_full = 0u; + return byte; +} + +__attribute__((noinline)) void task03_debug_checkpoint(void) +{ + __asm__ volatile("" ::: "memory"); +} + +int main(void) +{ + c12_external_irq_prepare(task03_uart_handler); + global_irq_enable(true); + + tb_uart_test_inject_rx(C12_UART_INDEX, (uint8_t)'A'); + const bool first_irq = c12_wait_for(&g_irq_count, 1u); + + tb_uart_test_inject_rx(C12_UART_INDEX, (uint8_t)'B'); + const bool second_irq = c12_wait_for(&g_irq_count, 2u); + g_first_consumed = consume_mailbox(); + + tb_uart_test_inject_rx(C12_UART_INDEX, (uint8_t)'C'); + const bool third_irq = c12_wait_for(&g_irq_count, 3u); + g_second_consumed = consume_mailbox(); + + global_irq_enable(false); + g_task03_pass = first_irq && second_irq && third_irq && + g_irq_count == 3u && + g_accepted_count == 2u && + g_dropped_count == 1u && + g_first_consumed == (uint32_t)'A' && + g_second_consumed == (uint32_t)'C' && + g_mailbox_full == 0u; + + c12_external_irq_stop(); + task03_debug_checkpoint(); + c12_print_u32(0xc1203003u); + c12_print_u32(g_irq_count); + c12_print_u32(g_accepted_count); + c12_print_u32(g_dropped_count); + c12_print_u32(g_first_consumed); + c12_print_u32(g_second_consumed); + c12_print_u32(g_mailbox_full); + c12_print_u32(g_task03_pass); + return g_task03_pass ? 0 : 1; +} diff --git a/tests/check_elf.sh b/tests/check_elf.sh new file mode 100755 index 0000000..8df5107 --- /dev/null +++ b/tests/check_elf.sh @@ -0,0 +1,16 @@ +#!/usr/bin/env bash +set -euo pipefail + +root="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)" +prefix="${RISCV_PREFIX:-riscv64-unknown-elf-}" + +make -C "$root" -s tasks +for elf in "$root"/build/task*/prog.elf; do + "$prefix"readelf -h "$elf" | grep -F 'RISC-V' >/dev/null + "$prefix"nm -a "$elf" | grep -E ' task0[1-3]_debug_checkpoint$' >/dev/null +done +"$prefix"nm -a "$root/build/task02_uart_rx_interrupt/prog.elf" | \ + grep -E ' task02_uart_handler$' >/dev/null +"$prefix"nm -a "$root/build/task03_uart_mailbox/prog.elf" | \ + grep -E ' task03_uart_handler$' >/dev/null +printf 'PASS: RV32I ELF symbols and handlers\n' diff --git a/tests/test_card.sh b/tests/test_card.sh new file mode 100755 index 0000000..cf2441c --- /dev/null +++ b/tests/test_card.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash +set -euo pipefail + +root="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)" +source_json="$root/json/card_source.json" +pdf="$root/doc/pdf/mpabi-inf-c-12-uart-polling-interrupts-v00.01-e766c4bb-2a43-5f4e-b10a-b3393a42932c.pdf" + +jq -e '(.tasks | length) == 3 and + ([.tasks[].viewpoints | map(.id)] | + all(. == ["A1","A2","A3","A4","A5","A6","A7","A8"]))' \ + "$source_json" >/dev/null +node --check "$root/web/app.js" +node -e 'JSON.parse(require("fs").readFileSync(process.argv[1], "utf8"))' \ + "$root/web/card-data.json" +qpdf --check "$pdf" >/dev/null +[[ "$(pdftotext -layout "$pdf" - | grep -Eo 'BLOCK A[1-8]' | wc -l)" -eq 24 ]] +[[ "$(pdftotext -layout "$pdf" - | awk 'BEGIN {RS="\f"} /BLOCK A[1-8]/ && !/TASK0[1-3]/ {n++} END {print n+0}')" -eq 0 ]] +printf 'PASS: JSON, web and PDF contain 3 x A1-A8\n' diff --git a/tests/test_hazard3.sh b/tests/test_hazard3.sh new file mode 100755 index 0000000..1275e8f --- /dev/null +++ b/tests/test_hazard3.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env bash +set -euo pipefail + +root="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)" +env_root="${RV_ENV_ROOT:-/home/user/dev/edu/rv32i-hazard3-student-env}" +tb="${HAZARD3_TB:-$env_root/vendor/Hazard3/test/sim/tb_verilator/tb}" + +test -x "$tb" +make -C "$root" -s tasks "RV_ENV_ROOT=$env_root" + +assert_words() { + local output="$1" + shift + local actual expected + mapfile -t actual < <(printf '%s\n' "$output" | grep -E '^[0-9a-f]{8}$') + expected=("$@") + [[ "${actual[*]}" == "${expected[*]}" ]] || { + printf 'FAIL words\nexpected: %s\nactual: %s\n' \ + "${expected[*]}" "${actual[*]}" >&2 + return 1 + } +} + +task1="$($tb --bin "$root/build/task01_uart_polling/prog.bin" --cycles 500000 --cpuret)" +printf '%s\n' "$task1" | grep -F 'Exit code 0' >/dev/null +printf '%s\n' "$task1" | grep -Fqx 'T' +assert_words "$task1" c1201001 00000003 00000050 00000002 00000054 00000001 +printf 'PASS Task01 polling oracle\n' + +task2="$($tb --bin "$root/build/task02_uart_rx_interrupt/prog.bin" --cycles 500000 --cpuret)" +printf '%s\n' "$task2" | grep -F 'Exit code 0' >/dev/null +assert_words "$task2" c1202002 00000001 00000001 00000010 00000013 00000052 00000000 00000001 +printf 'PASS Task02 IRQ oracle\n' + +task3="$($tb --bin "$root/build/task03_uart_mailbox/prog.bin" --cycles 500000 --cpuret)" +printf '%s\n' "$task3" | grep -F 'Exit code 0' >/dev/null +assert_words "$task3" c1203003 00000003 00000002 00000001 00000041 00000043 00000000 00000001 +printf 'PASS Task03 mailbox oracle\n' diff --git a/web/app.css b/web/app.css new file mode 100644 index 0000000..eac8d78 --- /dev/null +++ b/web/app.css @@ -0,0 +1 @@ +.paper{display:flex;flex-direction:column;gap:3.3cm}.paper>.sheet,.paper>.sheet-spread>.sheet{width:210mm;height:297mm;min-height:297mm;max-height:297mm;margin:0 auto;overflow:hidden}.paper>.sheet.sheet--landscape,.paper>.sheet-spread>.sheet.sheet--landscape{width:297mm;min-width:297mm;max-width:297mm;height:210mm;min-height:210mm;max-height:210mm}.paper>.sheet>.sheet-content,.paper>.sheet-spread>.sheet>.sheet-content{height:297mm;min-height:297mm;max-height:297mm;overflow-x:hidden;overflow-y:hidden}.paper>.sheet.sheet--landscape>.sheet-content,.paper>.sheet-spread>.sheet.sheet--landscape>.sheet-content{height:210mm;min-height:210mm;max-height:210mm}.sheet-spread{display:contents}.paper.is-diagram-spread .sheet-spread{display:grid;grid-template-columns:repeat(var(--spread-columns, 1),max-content);width:max-content;max-width:none;margin:0 auto;align-items:flex-start;gap:2mm;zoom:var(--spread-fit-scale, 1)}.paper.is-diagram-spread .sheet-spread>.sheet{flex:0 0 auto}.viewer-chrome{position:sticky;top:0;z-index:80;width:100%}.viewer-action-toast{position:absolute;z-index:12;right:9px;bottom:9px;max-width:min(720px,calc(100vw - 18px));box-sizing:border-box;overflow:hidden;border:1px solid #42b8e7;border-radius:3px;background:#102c38ee;color:#dff7ff;padding:5px 9px;box-shadow:0 4px 14px #0007;text-overflow:ellipsis;white-space:nowrap;font:750 10px/1.25 ui-monospace,monospace}.viewer-chrome .topbar{position:sticky;top:0;z-index:90}.viewpoint-bar{display:grid;grid-template-columns:repeat(8,minmax(0,1fr));gap:1px;min-height:31px;border-top:1px solid #9aa8ae;border-bottom:1px solid #718087;background:#718087;box-shadow:0 2px 5px #0002}.viewpoint-bar button{position:relative;display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:center;gap:5px;min-width:0;border:0;background:#f7f9fa;color:#1f3038;padding:5px 7px;text-align:left;cursor:pointer}.viewpoint-bar button:hover,.viewpoint-bar button:focus-visible{z-index:1;background:#e9f3f7;outline:2px solid #287495;outline-offset:-2px}.viewpoint-bar button[aria-current=location]{background:#dcecf3;box-shadow:inset 0 -3px #167ca4}.viewpoint-bar button>span{color:#1b6785;font:850 10px/1 ui-monospace,monospace}.viewpoint-bar button>strong{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font:750 10px/1.1 system-ui,sans-serif}.viewpoint-bar button.is-unavailable{background:#eef0f1;color:#5d686d;cursor:not-allowed}.viewpoint-bar button.is-unavailable>span{color:#68747a}.viewpoint-bar button.is-unavailable>small{border:1px solid #9da7ab;border-radius:2px;padding:1px 3px;font:750 7px/1 ui-monospace,monospace}.card-library-toggle{display:inline-flex;align-items:center;flex:none;height:28px;gap:6px;border:1px solid #6e7d84;border-radius:3px;background:#f6f8f9;color:#26373f;padding:2px 8px;font:750 11px/1 ui-monospace,monospace;cursor:pointer}.card-library-toggle:hover,.card-library-toggle:focus-visible{border-color:#1d7799;background:#edf7fa;outline:none}.card-library-toggle.is-active{border-color:#126d8f;background:#174f67;color:#fff}.card-library-toggle-icon{font:700 16px/1 system-ui,sans-serif}.card-library-toggle kbd{color:#267697;font:inherit}.card-library-toggle.is-active kbd{color:#aee9ff}:root{--side-panel-top: 36px;--side-panel-width: min(960px, calc(100vw - 28px) );--side-panel-trigger-length: 56px}.side-panel-dock{position:fixed;z-index:240;top:var(--side-panel-top);bottom:0;width:0;pointer-events:none}.side-panel-dock--left{left:0}.side-panel-dock--right{right:0}.side-panel-rail{position:fixed;z-index:243;top:calc(var(--side-panel-top) + 8px);display:flex;width:13px;flex-direction:column;gap:10px;pointer-events:auto}.side-panel-dock--left .side-panel-rail{left:0}.side-panel-dock--right .side-panel-rail{right:0}.side-panel-trigger{--side-panel-accent: #167ca4;position:relative;display:grid;width:13px;height:var(--side-panel-trigger-length);place-items:center;border:0;border-radius:0;background:transparent;padding:0;cursor:pointer}.side-panel-trigger:before{content:"";display:block;width:3px;height:calc(var(--side-panel-trigger-length) - 8px);border-radius:999px;background:var(--side-panel-accent);box-shadow:0 0 0 1px #ffffff73,0 3px 10px -5px var(--side-panel-accent);opacity:.78;transition:width .14s ease,opacity .14s ease,box-shadow .14s ease}.side-panel-trigger:hover:before,.side-panel-trigger:focus-visible:before,.side-panel-trigger.is-open:before{width:4px;opacity:1}.side-panel-trigger.is-pinned:before{width:5px;box-shadow:0 0 0 1px #ffffff9e,0 3px 12px -4px var(--side-panel-accent)}.side-panel-trigger:focus-visible{outline:2px solid var(--side-panel-accent);outline-offset:-2px}.side-panel-trigger>span{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}.side-panel{position:fixed;z-index:241;top:var(--side-panel-top);bottom:0;display:flex;width:var(--side-panel-width);max-width:calc(100vw - 20px);box-sizing:border-box;flex-direction:column;overflow:hidden;border-color:#819098;background:#f7f9fa;color:#17252c;pointer-events:none;transition:transform .18s cubic-bezier(.22,.78,.24,1);will-change:transform}.side-panel-dock--left .side-panel{left:0;border-right:1px solid #819098;box-shadow:15px 0 34px -24px #101b218c;transform:translate(calc(-100% - 14px))}.side-panel-dock--right .side-panel{right:0;border-left:1px solid #819098;box-shadow:-15px 0 34px -24px #101b218c;transform:translate(calc(100% + 14px))}.side-panel.is-open{transform:translate(0);pointer-events:auto}.side-panel:after{content:"";position:absolute;top:10px;width:4px;height:48px;border-radius:999px;background:var(--side-panel-accent);pointer-events:none}.side-panel-dock--left .side-panel:after{right:-2px}.side-panel-dock--right .side-panel:after{left:-2px}.side-panel-header{display:flex;min-height:38px;box-sizing:border-box;align-items:center;justify-content:space-between;gap:10px;border-bottom:1px solid #aebbc1;background:#e7edef;padding:4px 7px 4px 10px}.side-panel-header>div:first-child{display:flex;min-width:0;align-items:baseline;gap:7px}.side-panel-header small{color:#52666f;font:600 16px/1 ui-monospace,monospace;letter-spacing:.08em}.side-panel-header strong{overflow:hidden;color:#11191d;text-overflow:ellipsis;white-space:nowrap;font:600 16px/1.2 system-ui,sans-serif}.side-panel-actions{display:flex;flex:none;gap:4px}.side-panel-actions button{display:grid;min-width:38px;height:24px;place-items:center;border:1px solid #8b999f;border-radius:3px;background:#fff;color:#26373f;padding:0 6px;font:650 16px/1 ui-monospace,monospace;cursor:pointer}.side-panel-actions button:last-child{min-width:24px;padding:0;font-size:18px}.side-panel-actions button:hover,.side-panel-actions button:focus-visible,.side-panel-actions button.is-pinned{border-color:var(--side-panel-accent);background:#edf7fa;outline:none}.side-panel-body,.card-library-panel{display:flex;min-height:0;flex:1;flex-direction:column;overflow:hidden}.card-library-header{display:flex;align-items:flex-start;justify-content:space-between;gap:14px;padding:18px 18px 15px;border-bottom:1px solid #bdc9ce;background:#e8eef1}.card-library-header small{color:#52666f;font:600 16px/1.25 ui-monospace,monospace;letter-spacing:.09em;text-transform:uppercase}.card-library-header h2{margin:4px 0 2px;font:750 22px/1.15 system-ui,sans-serif}.card-library-header p{margin:0;color:#607078;font:500 16px/1.35 system-ui,sans-serif}.card-library-header>button{display:grid;width:34px;height:34px;place-items:center;flex:none;border:1px solid #77878e;border-radius:3px;background:#fff;color:#25353c;padding:0;font:25px/1 system-ui,sans-serif;cursor:pointer}.card-library-header>button:hover,.card-library-header>button:focus-visible{border-color:#126d8f;background:#edf7fa;outline:2px solid #85c5dc;outline-offset:1px}.card-library-tree{flex:1;min-height:0;overflow-y:auto;overscroll-behavior:contain;padding:6px 0 18px;scrollbar-color:#8a9aa1 #edf1f3}.card-library-tree details{border:0}.card-library-tree summary{display:grid;grid-template-columns:14px minmax(0,1fr) auto;align-items:center;gap:6px;min-height:30px;box-sizing:border-box;padding:5px 10px 5px 4px;list-style:none;cursor:pointer;user-select:none}.card-library-tree summary::-webkit-details-marker{display:none}.card-library-tree summary:hover,.card-library-tree summary:focus-visible{background:#eaf1f4;outline:none}.card-library-branch{color:#25363d;font:16px/1 ui-monospace,monospace;transform:rotate(-90deg);transition:transform .12s ease}.card-library-tree details[open]>summary .card-library-branch{transform:rotate(0)}.card-library-tree summary strong,.card-library-tree summary small{display:block}.card-library-tree summary strong{color:#070a0b;font:550 16px/1.3 system-ui,sans-serif}.card-library-tree summary small{margin-top:2px;color:#303b40;font:500 16px/1.25 ui-monospace,monospace;letter-spacing:.04em}.card-library-tree summary output{min-width:22px;color:#26363d;padding:0 2px;text-align:center;font:550 16px/1.2 ui-monospace,monospace}.card-library-subject>summary{min-height:42px;border-bottom:1px solid #9eacb2;background:#dfe8ec;padding:7px 14px}.card-library-subject>summary:hover,.card-library-subject>summary:focus-visible{background:#d5e1e5}.card-library-subject>summary strong{color:#000;font:600 16px/1.3 system-ui,sans-serif}.card-library-subject>summary small{color:#28353a;font:500 16px/1.25 ui-monospace,monospace}.card-library-level-list{margin-left:18px;border-left:1px solid #8e9da4}.card-library-level>summary{min-height:38px;border-bottom:1px solid #cbd4d8;padding-left:8px}.card-library-level>summary strong{color:#000;font:550 16px/1.3 system-ui,sans-serif}.card-library-series-list{margin-left:18px;border-left:1px solid #a5b1b6;padding:2px 0 6px}.card-library-series>summary{min-height:34px;padding-left:8px}.card-library-series>summary strong{color:#000;font:550 16px/1.3 system-ui,sans-serif}.card-library-series>summary small{color:#26343a;font:500 16px/1.25 ui-monospace,monospace}.card-library-cards,.card-library-tasks{list-style:none;margin-top:0;margin-bottom:2px;padding:0}.card-library-cards{margin-left:18px;border-left:1px solid #bac3c7}.card-library-card-entry{margin:0}.card-library-card{display:grid;grid-template-columns:19px minmax(0,1fr) auto;align-items:start;gap:5px;min-height:38px;box-sizing:border-box;border:0;border-left:3px solid transparent;color:#000;padding:5px 8px 5px 3px;text-decoration:none}.card-library-node{color:#536168;font:16px/1.35 ui-monospace,monospace}.card-library-card-copy,.card-library-card-copy strong,.card-library-card-copy>span{display:block;min-width:0}.card-library-card-copy strong{color:#000;font:550 16px/1.3 ui-monospace,monospace}.card-library-card-copy>span{margin-top:2px;color:#0b0d0e;font:500 16px/1.35 system-ui,sans-serif;white-space:normal}.card-library-card-meta{display:flex;align-items:flex-end;flex-direction:column;gap:2px}.card-library-card-meta small{color:#26343a;font:500 16px/1.25 ui-monospace,monospace}.card-library-card.is-available{cursor:pointer}.card-library-card.is-available:hover,.card-library-card.is-available:focus-visible{background:#eaf5f8;outline:none}.card-library-card.is-current{border-left-color:#16769b;background:#dff1f7}.card-library-card.is-current:hover,.card-library-card.is-current:focus-visible{background:#cfeaf3;outline:1px solid #5ba9c4;outline-offset:-1px}.card-library-card.is-unavailable{color:#000}.card-library-card.is-unavailable .card-library-card-copy strong,.card-library-card.is-unavailable .card-library-card-meta small{color:#1d292e}.card-library-card.is-unavailable .card-library-card-copy>span{color:#0b0d0e}.card-library-tasks{margin-left:36px;border-left:1px solid #c3cacc}.card-library-tasks li>a,.card-library-tasks li>span{display:grid;grid-template-columns:19px auto minmax(0,1fr);gap:5px;align-items:start;color:#000;padding:4px 8px 5px 3px;text-decoration:none}.card-library-tasks li>a:hover,.card-library-tasks li>a:focus-visible{background:#eaf5f8;outline:none}.card-library-tasks strong{color:#000;font:550 16px/1.35 ui-monospace,monospace}.card-library-tasks li>a>span:last-child,.card-library-tasks li>span>span:last-child{color:#111;font:500 16px/1.35 system-ui,sans-serif}.card-library-footer{display:flex;align-items:center;gap:12px;flex-wrap:wrap;padding:10px 16px;border-top:1px solid #bdc9ce;background:#edf1f3;color:#5a6a72;font:500 16px/1.3 system-ui,sans-serif}.card-library-footer span{display:inline-flex;align-items:center;gap:4px}.card-library-footer i{width:7px;height:7px;border-radius:50%;background:#929da2}.card-library-footer i.is-online{background:#26815b}.card-library-footer kbd{margin-left:auto;border:1px solid #a2afb5;border-radius:2px;background:#fff;padding:2px 5px;font:600 16px/1 ui-monospace,monospace}.card-library-treegrid{min-height:0;flex:1;overflow:auto;margin:8px;border:1px solid rgb(31 35 40 / 18%);border-radius:6px;background:#fff;scrollbar-color:#93a2a8 #edf1f2;scrollbar-width:thin}.card-library-treegrid-row{display:grid;min-width:760px;min-height:38px;box-sizing:border-box;grid-template-columns:minmax(500px,1fr) 110px 120px;align-items:stretch;border-bottom:1px solid rgb(31 35 40 / 9%);color:#273941;font:500 16px/1.25 ui-monospace,monospace}.card-library-treegrid-row>[role=gridcell],.card-library-treegrid-row>[role=columnheader]{display:flex;min-width:0;align-items:center;overflow:hidden;padding:7px 9px;text-overflow:ellipsis;white-space:nowrap}.card-library-treegrid-row>[role=gridcell]+[role=gridcell],.card-library-treegrid-row>[role=columnheader]+[role=columnheader]{border-left:1px solid rgb(31 35 40 / 9%)}.card-library-treegrid-head{position:sticky;z-index:3;top:0;min-height:34px;border-bottom-color:#1f232833;background:#eef1f2;color:#3e525b;font-weight:700;letter-spacing:.045em}.card-library-treegrid-row:not(.card-library-treegrid-head):hover{background:#1f23280a}.card-library-treegrid-row.is-subject{background:#dfe8e5}.card-library-treegrid-row.is-level{background:#f5f8f8}.card-library-treegrid-row.is-series{background:#f9fbfb}.card-library-treegrid-row.is-card{min-height:42px;background:#fff}.card-library-treegrid-row.is-task{background:#fbfcfc}.card-library-treegrid-row.is-current{box-shadow:inset 3px 0 #1680a5;background:#e1f1f6}.card-library-tree-title{gap:6px;padding-left:calc(8px + (var(--card-library-depth, 0) * 21px))!important;font-family:system-ui,sans-serif}.card-library-tree-expander{display:inline-grid;width:24px;height:24px;flex:none;place-items:center;border:0;background:transparent;color:#405961;padding:0;font:18px/1 ui-monospace,monospace;cursor:pointer}.card-library-tree-expander:hover,.card-library-tree-expander:focus-visible{background:#165d6b1a;color:#165d6b;outline:1px solid rgb(22 93 107 / 28%)}.card-library-tree-expander.is-empty{cursor:default}.card-library-tree-link,.card-library-tree-label{display:flex;min-width:0;align-items:baseline;gap:7px;overflow:hidden;color:#10181c;text-decoration:none;white-space:nowrap}.card-library-tree-link:hover,.card-library-tree-link:focus-visible{color:#075d7c;outline:none;text-decoration:underline;text-underline-offset:2px}.card-library-tree-link strong,.card-library-tree-label strong{flex:none;color:inherit;font:700 16px/1.25 ui-monospace,monospace}.card-library-tree-link>span,.card-library-tree-label>span{min-width:0;overflow:hidden;color:inherit;text-overflow:ellipsis;white-space:nowrap;font:500 16px/1.25 system-ui,sans-serif}.card-library-treegrid-row.is-subject .card-library-tree-label strong,.card-library-treegrid-row.is-level .card-library-tree-label strong,.card-library-treegrid-row.is-series .card-library-tree-label strong{font-family:system-ui,sans-serif;font-weight:650}.card-library-tree-state{display:inline-flex;min-width:76px;min-height:24px;box-sizing:border-box;align-items:center;justify-content:center;border:1px solid transparent;border-radius:5px;color:#33474f;padding:2px 7px;font:650 14px/1 ui-monospace,monospace;white-space:nowrap}.card-library-tree-state[data-state=current]{border-color:#3184a0;background:#e9f5f8;color:#075d7c}.card-library-tree-state[data-state=online]{border-color:#4b9a7a;background:#edf8f2;color:#176144}.card-library-tree-state[data-state=plan]{border-color:#c59a49;background:#fff7e5;color:#775313}.card-library-treegrid-row.is-unavailable .card-library-tree-label,.card-library-treegrid-row.is-unavailable .card-library-tree-label strong{color:#10181c}.side-toc,.side-progress{min-height:0;flex:1;overflow-y:auto;background:#fff;color:#11191d}.side-toc>header,.side-progress>header{padding:16px 18px 13px;border-bottom:1px solid #bdc9ce;background:#f0f4f5}.side-toc>header small,.side-progress>header small{color:#53666f;font:750 9px/1 ui-monospace,monospace;letter-spacing:.08em}.side-toc>header h2,.side-progress>header h2{margin:4px 0 0;color:#10181c;font:750 21px/1.15 system-ui,sans-serif}.side-toc ol{margin:0;padding:7px 0 20px;list-style:none}.side-toc li{border-bottom:1px solid #e2e7e9}.side-toc a{display:grid;grid-template-columns:34px minmax(0,1fr);gap:9px;align-items:baseline;padding:10px 16px;color:#11191d;text-decoration:none}.side-toc a:hover,.side-toc a:focus-visible{background:#eaf5f8;outline:none}.side-toc a span{color:#267493;font:800 10px/1 ui-monospace,monospace}.side-toc a strong{font:650 13px/1.3 system-ui,sans-serif}.side-progress-summary{display:flex;align-items:center;justify-content:space-between;gap:16px;margin:16px;border:1px solid #b6c2c7;background:#f4f7f8;padding:14px;font:650 13px/1.3 system-ui,sans-serif}.side-progress-summary strong{color:#1d617b;font:850 20px/1 ui-monospace,monospace}.side-progress-links{display:grid;gap:8px;padding:0 16px 18px}.side-progress-links a{border:1px solid #87979e;border-radius:3px;background:#fff;color:#174f67;padding:10px 12px;text-decoration:none;font:700 12px/1.2 system-ui,sans-serif}.side-progress-links a:hover,.side-progress-links a:focus-visible{border-color:#167ca4;background:#edf7fa;outline:none}.side-progress-error{margin:0 16px 14px;border-left:3px solid #a52d2d;background:#fff1f1;color:#7d1f1f;padding:8px 10px;font:12px/1.35 system-ui,sans-serif}.classroom-panel{display:flex;min-height:0;flex:1;flex-direction:column;overflow:hidden;background:#f7f9fa;color:#11191d}.classroom-treegrid{min-height:0;flex:1;overflow:auto;margin:8px;border:1px solid rgb(31 35 40 / 18%);border-radius:6px;background:#fff;scrollbar-color:#93a2a8 #edf1f2;scrollbar-width:thin}.classroom-treegrid-row{display:grid;min-width:920px;box-sizing:border-box;grid-template-columns:minmax(410px,1fr) 100px 150px 150px 110px;align-items:center;border-bottom:1px solid rgb(31 35 40 / 8%);color:#273941;font:500 16px/1.25 ui-monospace,monospace}.classroom-treegrid-row>[role=gridcell],.classroom-treegrid-row>[role=columnheader]{min-width:0;overflow:hidden;padding:8px;text-overflow:ellipsis;white-space:nowrap}.classroom-treegrid-row>[role=gridcell]+[role=gridcell],.classroom-treegrid-row>[role=columnheader]+[role=columnheader]{border-left:1px solid rgb(31 35 40 / 8%)}.classroom-treegrid-head{position:sticky;z-index:2;top:0;border-bottom-color:#1f23282e;background:#eef1f2;color:#3e525b;font-weight:650;letter-spacing:.04em}.classroom-node-row:hover{background:#1f23280a}.classroom-node-row.is-class{background:#dfe8e5}.classroom-node-row.is-student{background:#f8faf9}.classroom-node-row.is-task{background:#edf3f5}.classroom-node-row.is-block,.classroom-node-row.is-exercises{background:#f5f7f8}.classroom-node-row.is-phase{background:#fafbfb}.classroom-node-title{display:flex;align-items:center;gap:6px;padding-left:calc(8px + (var(--classroom-depth, 0) * 20px))!important;font-family:system-ui,sans-serif}.classroom-node-title strong{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:16px;font-weight:500}.classroom-node-row.is-class .classroom-node-title strong,.classroom-node-row.is-student .classroom-node-title strong,.classroom-node-row.is-task .classroom-node-title strong{font-weight:650}.classroom-expander{display:inline-grid;width:24px;height:24px;flex:none;place-items:center;border:0;background:transparent;color:#405961;padding:0;font:18px/1 ui-monospace,monospace;cursor:pointer}.classroom-expander:hover,.classroom-expander:focus-visible{background:#165d6b1a;color:#165d6b;outline:1px solid rgb(22 93 107 / 28%)}.classroom-expander.is-empty{cursor:default}.classroom-status,.classroom-sync,.classroom-visit,.classroom-commit{display:inline-flex;min-width:92px;box-sizing:border-box;align-items:center;justify-content:center;border:1px solid;border-radius:5px;padding:4px 6px;font:550 16px/1 ui-monospace,monospace;letter-spacing:.015em}.classroom-status[data-status=online]{border-color:#6b9a87;background:#e7f4ee;color:#155e43}.classroom-status[data-status=away]{border-color:#baa06a;background:#fff5d9;color:#765510}.classroom-status[data-status=offline]{border-color:#a5afb3;background:#f0f2f3;color:#596970}.classroom-status[data-status=error]{border-color:#bd7b7b;background:#fff0f0;color:#8c2929}.classroom-sync[data-sync=follow]{border-color:#6c98aa;background:#e8f3f7;color:#155c77}.classroom-sync[data-sync=paused]{border-color:#baa06a;background:#fff6df;color:#765510}.classroom-sync[data-sync=local]{border-color:#9a86ae;background:#f4eef9;color:#65427c}.classroom-visit[data-visit=present],.classroom-commit[data-commit=committed]{border-color:#6b9a87;background:#e7f4ee;color:#155e43}.classroom-visit[data-visit=missed],.classroom-commit[data-commit=missing]{border-color:#bd7b7b;background:#fff0f0;color:#8c2929}.classroom-visit[data-visit=pending],.classroom-commit[data-commit=working]{border-color:#baa06a;background:#fff6df;color:#765510}.classroom-legend{display:flex;flex:none;flex-wrap:wrap;gap:7px 12px;border-top:1px solid #aebbc1;background:#edf1f2;padding:9px 11px;color:#485c65;font:500 16px/1.35 system-ui,sans-serif}.classroom-legend span{display:inline-flex;align-items:center;gap:4px}.classroom-legend i{width:12px;height:12px;border:1px solid #73858c;border-radius:50%;background:#aeb7bb}.classroom-legend i[data-status=online]{border-color:#3e7c63;background:#45a27b}.classroom-legend i[data-status=away]{border-color:#a0782d;background:#dcae51}.classroom-legend i[data-status=offline]{border-color:#859399;background:#b6c0c4}.classroom-legend b{color:#65427c;font:600 16px/1 ui-monospace,monospace}.viewer-chrome.is-nvim-fit{display:flex;width:100%;height:100vh;height:100dvh;max-height:100dvh;flex-direction:column;overflow:hidden;background:#11171a}.viewer-chrome.is-nvim-fit .topbar,.viewer-chrome.is-nvim-fit .viewpoint-bar,.viewer-chrome.is-nvim-fit .allocator-panel{flex:none}.viewer-chrome.is-nvim-fit .nvim-panel{display:flex;min-height:0;flex:1;flex-direction:column}.viewer-chrome.is-nvim-fit .nvim-screen-scroll{min-height:0;height:auto!important;flex:1}.viewer-chrome.is-nvim-fit .nvim-resize-handle{display:none}.viewer-chrome.is-nvim-fit .nvim-screen-stage{width:100%;height:100%;margin:0;zoom:1}.viewer-chrome.is-nvim-fit .nvim-screen-content{right:1mm;overflow:hidden;scrollbar-width:none}.viewer-chrome.is-nvim-fit .nvim-screen-grid{display:flex;width:100%;min-height:0;height:100%;align-items:center;justify-content:center}.viewer-chrome.is-nvim-fit .nvim-screen{width:auto!important;height:auto!important;max-width:100%;max-height:100%}.viewer-chrome.is-nvim-fit .nvim-screen-content::-webkit-scrollbar{display:none}.topbar-nvim-section{display:flex;align-items:center;min-width:0;gap:6px}.nvim-toolbar-boundary{flex:none;color:#6f7d83;font:700 14px/1 ui-monospace,monospace}.nvim-toolbar-context{flex:none;width:5ch;color:#263238;font:800 12px/1 ui-monospace,monospace;letter-spacing:.08em;text-align:center}.nvim-toolbar-actions{display:flex;align-items:center;gap:3px}.nvim-toolbar-button{display:inline-flex;align-items:center}.nvim-toolbar-key{flex:0 0 2ch;color:#267697;font:inherit;text-align:center}.nvim-toolbar-label{flex:0 0 5ch;max-width:5ch;overflow:hidden;text-align:left;white-space:nowrap}.topbar-nvim-meta{display:flex;align-items:baseline;min-width:0;max-width:min(44vw,720px);gap:6px}.topbar-nvim-meta strong,.topbar-nvim-meta small{overflow:auto;text-overflow:ellipsis;white-space:nowrap}.topbar-nvim-meta strong{color:#263238;font:700 12px/1.25 system-ui,sans-serif}.topbar-nvim-meta small{color:#66747a;font:500 10px/1.25 system-ui,sans-serif}.viewer-nvim-toggle{border:1px solid #68747a;border-radius:3px;background:#fff;color:#263238;padding:2px 8px;font:650 16px/1.3 system-ui,sans-serif;cursor:pointer}.viewer-nvim-toggle[aria-pressed=true]{border-color:#267697;background:#eaf6fb;color:#174d64}.allocator-panel{width:100%;box-sizing:border-box;border-top:1px solid #40515a;border-bottom:1px solid #40515a;background:#f7f9f5;color:#182127;box-shadow:0 4px 12px #0002;font:11px/1.25 system-ui,sans-serif}.allocator-panel>header{display:grid;grid-template-columns:125px minmax(260px,auto) 1fr;gap:8px;align-items:baseline;min-height:22px;padding:3px 8px;border-bottom:1px solid #b7c1c4;background:#e8eef0}.allocator-panel>header>span{color:#166987;font:800 9px/1.2 ui-monospace,monospace;letter-spacing:.06em}.allocator-panel>header>strong{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font:750 11px/1.2 ui-monospace,monospace}.allocator-panel>header>small{overflow:hidden;color:#536168;text-overflow:ellipsis;white-space:nowrap}.allocator-panel-body{display:grid;grid-template-columns:230px minmax(420px,1fr) minmax(310px,.8fr);gap:9px;align-items:stretch;padding:5px 8px 7px}.allocator-metrics{display:grid;grid-template-columns:1fr 1fr;gap:3px 8px;margin:0}.allocator-metrics>div{min-width:0;border-left:2px solid #8ea2ab;padding-left:5px}.allocator-metrics dt{color:#627077;font:750 7px/1.2 ui-monospace,monospace;letter-spacing:.05em}.allocator-metrics dd{margin:1px 0 0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font:700 10px/1.2 ui-monospace,monospace}.allocator-arena-view{min-width:0}.allocator-arena-view.is-inactive{opacity:.42}.allocator-arena-labels{display:flex;justify-content:space-between;gap:8px;margin-bottom:3px;color:#536168;font:700 8px/1.2 ui-monospace,monospace}.allocator-arena-labels strong{color:#075f80}.allocator-pinned-arena{position:relative;display:grid;grid-template-columns:repeat(var(--allocator-size),minmax(2px,1fr));height:32px;border:1px solid #28343a;background:#fff}.allocator-pinned-arena i{min-width:0;border-right:1px solid #e1e5e6;background:#fbfcfc}.allocator-pinned-arena i:nth-child(8n){border-right-color:#87969d}.allocator-pinned-arena i.is-allocated{border-right-color:#b2d8e6;background:#43a8ce}.allocator-cursor{position:absolute;z-index:2;top:-4px;bottom:-4px;width:2px;background:#d02d25;transform:translate(-1px);box-shadow:0 0 0 1px #fff9}.allocator-cursor:before{content:"allocp";position:absolute;top:1px;left:4px;color:#8d1d17;font:800 7px/1 ui-monospace,monospace}.allocator-facts{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:2px 7px;min-width:0}.allocator-facts>div{display:flex;min-width:0;justify-content:space-between;gap:5px;border-bottom:1px dotted #b4bec2}.allocator-facts span{overflow:hidden;color:#46565e;text-overflow:ellipsis;white-space:nowrap}.allocator-facts code{overflow:hidden;color:#142e39;text-overflow:ellipsis;white-space:nowrap;font:700 9px/1.3 ui-monospace,monospace}.allocator-facts p{grid-column:1 / -1;margin:0;color:#647278}.nvim-panel{width:100%;box-sizing:border-box;border-bottom:1px solid #52616a;background:var(--desk, #eee);color:#e7eef1;box-shadow:0 5px 16px #0004;font:12px/1.3 system-ui,sans-serif}.nvim-status{flex:none;border:1px solid #66757c;border-radius:999px;padding:1px 6px;color:#c9d3d8;font:750 9px/1.35 ui-monospace,monospace;letter-spacing:.04em}.nvim-status--connected,.nvim-status--ready{border-color:#31a86d;background:#173b2a;color:#8aefb7}.nvim-status--connecting,.nvim-status--replaying,.nvim-status--verifying{border-color:#c38f2a;background:#3e321b;color:#ffd47d}.nvim-status--failed,.nvim-status--offline,.nvim-status--unselected{border-color:#a34b4b;background:#3b2020;color:#faa}.nvim-control-indicator{flex:none;border:1px solid #60747e;border-radius:3px;background:#222e34;color:#b9c6cc;padding:3px 8px;font:700 10px/1.2 ui-monospace,monospace;letter-spacing:.04em;white-space:nowrap;cursor:pointer}.nvim-control-indicator.is-active{border-color:#3cb3e2;background:#17465a;color:#d9f5ff}.nvim-control-indicator.is-engaged{box-shadow:inset 0 0 0 1px #8ee4ff}.nvim-work-indicator{flex:none;border:1px solid #7a878d;border-radius:3px;background:#f4f6f7;color:#56646a;padding:3px 8px;font:700 10px/1.2 ui-monospace,monospace;letter-spacing:.03em;white-space:nowrap;cursor:pointer}.nvim-work-indicator.is-active{border-color:#cf3d31;background:#fff0ee;color:#9f241b}.nvim-work-indicator.is-engaged{box-shadow:inset 0 0 0 1px #cf3d31}.nvim-work-indicator:disabled{border-color:#a8b0b4;background:#e6e9ea;color:#7c878c;cursor:not-allowed;opacity:.8}.nvim-height-toggle{flex:none;border:1px solid #75848b;border-radius:3px;background:#f4f6f7;color:#425159;padding:3px 8px;font:700 10px/1.2 ui-monospace,monospace;letter-spacing:.03em;white-space:nowrap;cursor:pointer}.nvim-height-toggle.is-active{border-color:#267697;background:#eaf6fb;color:#174d64}.topbar-nvim-section .nvim-toolbar-button{flex:0 0 9.5ch;width:9.5ch;min-width:9.5ch;max-width:9.5ch;height:24px;box-sizing:border-box;justify-content:flex-start;gap:.55ch;padding:2px .55ch;font:750 12px/1 ui-monospace,monospace;letter-spacing:0}.nvim-shortcut-strip{flex:none;color:#536168;font:650 10px/1.2 ui-monospace,monospace;white-space:nowrap}.nvim-shortcut-strip kbd{color:#263238;font:inherit}.nvim-screen-scroll{position:relative;width:100%;box-sizing:border-box;height:var(--nvim-panel-height, 75vh);max-height:none;min-height:240px;overflow:auto;overscroll-behavior:contain;background:var(--desk, #eee);outline:none;scrollbar-color:#58666d #171d20}.nvim-screen-stage{position:relative;width:210mm;margin:0 auto;background:#fff;zoom:var(--viewer-canvas-scale)}.nvim-screen-surface{position:absolute;inset:0 4mm;box-sizing:border-box;padding:1mm;background:#fff}.nvim-screen-frame{position:relative;height:100%;box-sizing:border-box;border:1px solid #267697;background:#101315;box-shadow:0 0 0 3px #000}.nvim-screen-scroll[data-sync=on] .nvim-screen-frame{border-color:#35b9ef}.nvim-screen-scroll[data-control=true] .nvim-screen-frame{box-shadow:0 0 0 3px #cf3d31}.nvim-screen-scroll[data-control=true]{cursor:text}.nvim-screen-content{position:absolute;inset:1mm -5mm 1mm 1mm;overflow-x:hidden;overflow-y:scroll;overscroll-behavior:contain;background:transparent;scrollbar-width:thin;scrollbar-color:#829097 #fff}.nvim-screen-grid{width:calc(100% - 6mm);min-height:100%;background:#101315}.nvim-screen-content::-webkit-scrollbar{width:.8mm}.nvim-screen-content::-webkit-scrollbar-track{background:#fff}.nvim-screen-content::-webkit-scrollbar-thumb{border:.12mm solid #fff;border-radius:99px;background:#829097}.nvim-screen-content::-webkit-scrollbar-thumb:hover{background:#aeb9be}.nvim-screen{display:block;max-width:none;margin:0;outline:none;image-rendering:auto}.nvim-screen:focus{box-shadow:none}.nvim-screen-empty{position:absolute;inset:0;display:grid;place-content:center;gap:5px;padding:16px;color:#9cabb2;text-align:center}.nvim-screen-empty strong{color:#e0e8eb;font:750 11px/1.3 ui-monospace,monospace}.nvim-resize-handle{position:relative;width:100%;height:12px;border-top:1px solid #46565e;background:#182126;cursor:ns-resize;touch-action:none}.nvim-resize-handle:after{content:"";position:absolute;top:4px;left:50%;width:min(160px,22vw);height:3px;border-radius:999px;background:#6c7e87;transform:translate(-50%)}.nvim-resize-handle:hover,.nvim-resize-handle:focus-visible{background:#23323a;outline:none}.nvim-resize-handle:hover:after,.nvim-resize-handle:focus-visible:after{background:#35b9ef}.shortcut-help-backdrop{position:fixed;z-index:200;inset:0;display:grid;place-items:center;padding:20px;background:#10171dcc}.shortcut-help{width:min(680px,calc(100vw - 40px));max-height:calc(100vh - 40px);overflow:auto;border:1px solid #71818a;border-radius:6px;background:#f8fafb;color:#172127;box-shadow:0 18px 60px #0008;font:14px/1.4 system-ui,sans-serif}.shortcut-help>header{display:flex;align-items:start;justify-content:space-between;gap:16px;padding:16px 18px;border-bottom:1px solid #c8d1d5;background:#e8eef1}.shortcut-help header small{color:#52646d;font:750 10px/1.2 ui-monospace,monospace;letter-spacing:.08em}.shortcut-help h2{margin:4px 0 0;font-size:17px}.shortcut-help header button{width:32px;height:32px;border:1px solid #71818a;border-radius:3px;background:#fff;font:22px/1 system-ui,sans-serif;cursor:pointer}.shortcut-help dl{margin:0;padding:10px 18px}.shortcut-help dl>div{display:grid;grid-template-columns:minmax(180px,.8fr) 1.5fr;gap:14px;align-items:center;padding:8px 0;border-bottom:1px solid #dde3e6}.shortcut-help dt,.shortcut-help dd{margin:0}.shortcut-help kbd{display:inline-block;border:1px solid #839198;border-bottom-width:2px;border-radius:3px;background:#fff;padding:3px 7px;font:700 12px/1.2 ui-monospace,monospace}.shortcut-help>p{margin:0;padding:4px 18px 16px;color:#526068}.memory-react{border:1px solid #555;background:#fff;font:14px/1.35 system-ui,sans-serif;padding:10px;color:#1b1b1b}.memory-react>header{display:flex;align-items:center;justify-content:space-between;gap:12px;border-bottom:1px solid #bbb;padding-bottom:7px}.memory-react>header small{display:block;margin-bottom:2px;color:#555;font:700 10px/1.2 ui-monospace,monospace;letter-spacing:.08em}.memory-react h3{font-size:15px;margin:0}.memory-actions{display:flex;gap:5px;flex-wrap:wrap;justify-content:flex-end}.memory-actions button{border:1px solid #777;background:#fff;padding:4px 8px;cursor:pointer}.memory-actions button[aria-pressed=true]{background:#dff3fb;border-color:#237da1;font-weight:700}.memory-lanes{display:grid;grid-template-columns:repeat(auto-fit,minmax(125px,1fr));gap:6px;margin:8px 0}.memory-lane{min-width:0;display:flex;flex-direction:column;align-items:stretch;gap:3px;border:1px solid #999;background:#fafafa;padding:7px;text-align:left}.memory-lane.compile{background:#fff8dc}.memory-lane.bss{background:#edf7fb}.memory-lane.stack{background:#f3f8ef}.memory-lane.registers{background:#f4f4f4}.memory-lane.text{background:#f7f0fa}.memory-lane>b{font-size:11px;letter-spacing:.04em}.memory-lane button{border:1px solid transparent;background:transparent;padding:3px;text-align:left;cursor:pointer}.memory-lane button:hover,.memory-lane button.active{border-color:#238bb7;background:#fff}.memory-lane code{font-size:10px;white-space:normal}.arena-wrap{margin:12px 0 6px}.arena-label{display:flex;justify-content:space-between;margin-bottom:4px}.arena{--allocp: 0;--arena-size: 64;position:relative;display:grid;grid-template-columns:repeat(var(--arena-size),1fr);height:40px;border:1px solid #222;margin-bottom:28px}.arena i{border-right:1px solid #ddd}.arena .allocp{position:absolute;left:calc(var(--allocp) / var(--arena-size) * 100%);top:43px;transform:translate(-50%);color:#087da8;font:700 11px/1.2 ui-monospace,monospace;white-space:nowrap}.memory-stage{border-top:1px solid #ddd;padding-top:7px;margin:0}.memory-inspector{display:grid;grid-template-columns:auto 1fr;gap:2px 10px;margin-top:7px;padding:7px;border-left:3px solid #238bb7;background:#f5fbfd}.memory-inspector strong{grid-row:1/3}.memory-inspector code{font-size:11px}.memory-inspector span{font-size:12px}.asset-static-fallback{display:none}.uml-react{border:1px solid #555;background:#fff;font:13px/1.35 system-ui,sans-serif;color:#1b1b1b}.uml-react>header{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 8px;border-bottom:1px solid #bbb;background:#fafafa}.uml-react>header small{display:block;color:#555;font:700 10px/1.2 ui-monospace,monospace;letter-spacing:.06em}.uml-react h3{margin:2px 0 0;font-size:15px}.uml-actions{display:flex;gap:3px;flex-wrap:wrap;justify-content:flex-end}.uml-actions button{border:1px solid #aaa;border-radius:2px;background:#fcfcfc;color:#444;padding:2px 6px;font:600 10px/1.25 ui-monospace,monospace;cursor:pointer}.uml-actions button:hover{border-color:#64879a;background:#f5fafc}.uml-actions button[data-completed=true]{border-color:#62a47f;background:#edf8f1;color:#14613a}.uml-actions button[aria-pressed=true]{border-color:#287495;background:#edf7fb;color:#174d64;box-shadow:inset 0 0 0 1px #b9dce9}.uml-canvas{display:block;overflow-x:hidden;overflow-y:visible;box-sizing:border-box;padding:8px 10px;text-align:center}.uml-svg-host{width:max-content;min-width:100%}.uml-canvas img,.uml-svg-host svg{display:block;width:auto!important;max-width:none!important;height:auto!important;max-height:none;margin-inline:auto;object-fit:contain}.uml-svg-host{cursor:pointer}.uml-svg-host.is-tiled{position:relative;width:var(--uml-tile-page-width);min-width:var(--uml-tile-page-width);height:var(--uml-tile-page-height);overflow:hidden;cursor:default}.uml-svg-host.is-tiled>svg{position:absolute;top:var(--uml-tile-top);left:var(--uml-tile-left);margin:0}.uml-static-crop{position:absolute;top:var(--uml-tile-top);left:var(--uml-tile-left);overflow:hidden}.uml-static-crop>img{display:block;max-width:none!important;max-height:none!important;margin:0!important;object-fit:fill!important;transform-origin:0 0}.uml-tile-part{display:inline-block;margin-left:.65em;color:#607985;font:650 9px/1.2 ui-monospace,monospace;letter-spacing:.03em;white-space:nowrap}.uml-phase-actions>span{display:inline-flex;align-items:center;border:1px solid #9eb2bd;border-radius:2px;background:#f1f5f7;color:#3d5967;padding:2px 6px;font:700 10px/1.25 ui-monospace,monospace}.uml-stage-region{cursor:pointer;transition:fill .14s ease,stroke .14s ease,stroke-width .14s ease}.uml-stage-region-completed.uml-stage-region-bg{fill:#e7f6ed!important;fill-opacity:1!important;stroke:#258154!important;stroke-width:3px!important}.uml-stage-region-completed.uml-stage-region-outline{stroke:#258154!important;stroke-width:3px!important}.uml-stage-region-active.uml-stage-region-bg{fill:#e7f6fc!important;fill-opacity:1!important;stroke:#187ea7!important;stroke-width:3px!important}.uml-stage-region-active.uml-stage-region-outline{stroke:#187ea7!important;stroke-width:3px!important}.uml-stage-region-active.uml-stage-region-completed.uml-stage-region-bg{fill:#e7f6ed!important}.uml-stage-region:focus{outline:none;stroke:#005f87!important;stroke-width:4px!important}.uml-inline-warning{display:block;padding-top:5px;color:#8b2d20;font-size:11px}.uml-stage{display:grid;grid-template-columns:auto 1fr;gap:3px 10px;margin:0 8px 8px;padding:8px;border-left:3px solid #315f78;background:#eef7fb}.uml-stage strong{grid-row:1/3}.uml-stage code{grid-column:2;font-size:11px}.uml-approval{display:flex;align-items:center;justify-content:space-between;gap:8px;margin:0 8px 8px;padding-top:6px;border-top:1px solid #d2d2d2;color:#555;font-size:11px}.uml-approval button{flex:0 0 auto;border:1px solid #477a5d;border-radius:2px;background:#edf8f1;color:#174e30;padding:3px 7px;font:600 10px/1.25 system-ui,sans-serif;cursor:pointer}.uml-approval button:disabled{border-color:#bbb;background:#f3f3f3;color:#888;cursor:not-allowed}.uml-react>.uml-snapshot-header{display:block;padding:5px 8px 4px}.uml-header-first-line{display:flex;align-items:center;justify-content:space-between;gap:10px}.uml-header-first-line h3{flex:1 1 auto;min-width:0;margin:0;color:#20282c;text-align:left;font-size:12px;line-height:1.25}.uml-header-first-line h3>span{color:#245f7a;font-family:ui-monospace,monospace;letter-spacing:.04em}.uml-header-description{max-width:620px;margin:2px 0 0;color:#555;text-align:left;font-size:8px}.uml-header-navigation{display:flex;flex:0 0 auto;align-items:center;justify-content:flex-end;gap:6px}.uml-page-continuation{display:inline-flex;flex:0 0 auto;align-items:center;gap:2px;min-height:22px;border:1px solid #86a5b3;border-radius:3px;background:#edf7fa;padding:1px 5px;color:#126b8c;font:850 15px/1 ui-monospace,monospace;animation:uml-continuation-pulse 1.15s ease-in-out infinite alternate}.uml-page-continuation i{display:inline-grid;min-width:14px;place-items:center;font-style:normal}@keyframes uml-continuation-pulse{0%{border-color:#9fb5be;background:#f6fafb;color:#4c7180;box-shadow:none}to{border-color:#167ca4;background:#dff2f8;color:#075c7c;box-shadow:0 0 0 2px #8dcde433}}@media(prefers-reduced-motion:reduce){.uml-page-continuation{animation:none}}.uml-phase-actions,.uml-step-actions{display:flex;align-items:center;flex-wrap:wrap;gap:3px}.uml-phase-actions{flex:0 0 auto;flex-wrap:nowrap;justify-content:flex-end;white-space:nowrap}.uml-phase-actions button,.uml-step-actions button,.uml-edit-toggle,.uml-snapshot-cursor button{border:1px solid #aaa;border-radius:2px;background:#fff;color:#444;cursor:pointer;font:600 9px/1.2 ui-monospace,monospace}.uml-edit-toggle{min-width:42px;padding:3px 7px;border:1px solid #8a9ca5;border-radius:2px;background:#f7f9fa;color:#334d59;cursor:pointer;font:750 9px/1.2 ui-monospace,monospace;letter-spacing:.04em}.uml-edit-toggle.is-active{border-color:#b56b16;background:#fff3df;color:#713c00;box-shadow:inset 0 0 0 1px #f0c78f}.uml-phase-actions button{padding:3px 7px}.uml-phase-actions button[aria-pressed=true]{border-color:#287495;background:#edf7fb;color:#174d64}.uml-step-actions{min-height:0;padding:0;border:0;background:transparent}.uml-step-actions>span{margin-right:4px;color:#555;font:700 9px/1.2 ui-monospace,monospace}.uml-step-actions button{min-width:25px;padding:2px 4px}.uml-step-actions button[data-completed=true]{border-color:#62a47f;background:#edf8f1;color:#14613a}.uml-step-actions button[aria-pressed=true]{border-color:#287495;background:#287495;color:#fff}.uml-step-actions button[data-mode=CODE]:after,.uml-step-actions button[data-mode=RUN]:after{margin-left:3px;font-size:7px;letter-spacing:.02em}.uml-step-actions button[data-mode=CODE]:after{content:"C"}.uml-step-actions button[data-mode=RUN]:after{content:"R"}.uml-snapshot-layout{background:#fff;border-bottom:1px solid #ddd}.uml-step-canvas{min-width:0}.uml-step-canvas .uml-svg-host svg{max-height:none}.uml-step-hit{cursor:pointer;fill:transparent}.uml-step-hit-active{fill:#3ea6ce!important;fill-opacity:.08!important}.uml-step-element{transition:fill .12s ease,stroke .12s ease,stroke-width .12s ease}line.uml-step-element-completed:not(.uml-step-element-active){stroke:#258154!important;stroke-width:1.8px!important}polygon.uml-step-element-completed:not(.uml-step-element-active){fill:#258154!important;stroke:#258154!important}text.uml-step-element-completed:not(.uml-step-element-active){fill:#1d7049!important}line.uml-step-element-active{stroke:#087ca8!important;stroke-width:2.6px!important}polygon.uml-step-element-active{fill:#087ca8!important;stroke:#087ca8!important}text.uml-step-element-active{fill:#075d7d!important;font-weight:700!important}.uml-step-hit:focus{outline:none;stroke:#bd554d;stroke-width:.8px;stroke-dasharray:3 3}.uml-class-svg-active>g>*:not(.uml-class-focus-region):not(.uml-class-step-hit):not(.uml-layout-hit):not(.uml-layout-resize){opacity:.62;transition:opacity .12s ease}.uml-class-svg-active .uml-step-element:not(.uml-step-element-active){opacity:.98!important}.uml-class-svg-active text.uml-step-element-tone-a:not(.uml-step-element-active){fill:#174f69!important}.uml-class-svg-active text.uml-step-element-tone-b:not(.uml-step-element-active){fill:#586581!important}.uml-class-svg-active rect.uml-step-element-tone-a:not(.uml-step-element-active){fill:#eaf5f8!important;stroke:#3f7890!important}.uml-class-svg-active rect.uml-step-element-tone-b:not(.uml-step-element-active){fill:#f2eef8!important;stroke:#7b86a1!important}.uml-class-svg-active path.uml-step-element-tone-a:not(.uml-step-element-active),.uml-class-svg-active line.uml-step-element-tone-a:not(.uml-step-element-active),.uml-class-svg-active polygon.uml-step-element-tone-a:not(.uml-step-element-active){stroke:#3f7890!important}.uml-class-svg-active path.uml-step-element-tone-b:not(.uml-step-element-active),.uml-class-svg-active line.uml-step-element-tone-b:not(.uml-step-element-active),.uml-class-svg-active polygon.uml-step-element-tone-b:not(.uml-step-element-active){stroke:#7b86a1!important}.uml-class-svg-active .uml-step-element-active{opacity:1!important}.uml-class-svg-active text.uml-step-element-active{fill:#b42318!important;font-weight:700!important}.uml-class-svg-active path.uml-step-element-active,.uml-class-svg-active line.uml-step-element-active,.uml-class-svg-active polygon.uml-step-element-active,.uml-class-svg-active rect.uml-step-element-active{stroke:#bd554d!important;stroke-width:1.35px!important}.uml-class-svg-active polygon.uml-step-element-active{fill:#bd554d!important}.uml-class-focus-region{display:none}.uml-step-canvas.is-layout-editing{position:relative;touch-action:none;background-color:#fbfcfd;background-image:linear-gradient(#7d98a20d 1px,transparent 1px),linear-gradient(90deg,#7d98a20d 1px,transparent 1px);background-size:12px 12px}.uml-layout-editing .uml-step-hit,.uml-layout-editing .uml-class-focus-region{pointer-events:none}.uml-layout-hit{fill:#4e9ec4;fill-opacity:.035;stroke:#247a9e;stroke-width:1.1px;stroke-dasharray:5 3;vector-effect:non-scaling-stroke;cursor:grab;pointer-events:all}.uml-layout-hit:hover{fill-opacity:.09;stroke-width:1.6px}.uml-layout-hit.is-selected{fill:#f7a928;fill-opacity:.08;stroke:#b66b00;stroke-width:1.8px;stroke-dasharray:none}.uml-layout-hit:active{cursor:grabbing}.uml-layout-resize{fill:#fff;stroke:#b66b00;stroke-width:1.5px;vector-effect:non-scaling-stroke;cursor:nwse-resize;pointer-events:all}.uml-layout-editor{display:grid;grid-template-columns:minmax(140px,.8fr) minmax(240px,1.8fr) minmax(260px,1.4fr);gap:7px 10px;align-items:end;padding:8px 10px 9px;border-top:2px solid #b97822;background:#f7f5f0;color:#26343a;text-align:left;font:10px/1.3 system-ui,sans-serif}.uml-layout-editor-title{grid-column:1/-1;display:flex;align-items:baseline;gap:9px}.uml-layout-editor-title strong{color:#713c00;font:800 11px/1.2 ui-monospace,monospace;text-transform:uppercase}.uml-layout-editor-title span{color:#65737a}.uml-layout-editor-title b{margin-left:auto;color:#9c2f1b;font-size:9px}.uml-layout-editor label{display:grid;gap:2px;color:#52636b;font:700 8px/1.2 ui-monospace,monospace;text-transform:uppercase}.uml-layout-editor input,.uml-layout-editor select,.uml-layout-editor textarea{box-sizing:border-box;width:100%;min-width:0;border:1px solid #9ca9ae;border-radius:2px;background:#fff;color:#172126;padding:4px 5px;font:10px/1.25 ui-monospace,monospace;text-transform:none}.uml-layout-editor textarea{resize:vertical;line-height:1.35}.uml-layout-number-grid,.uml-layout-style-grid{display:grid;gap:5px}.uml-layout-number-grid{grid-template-columns:repeat(4,minmax(48px,1fr))}.uml-layout-style-grid{grid-template-columns:repeat(5,minmax(54px,1fr))}.uml-layout-editor-text{align-self:stretch}.uml-layout-editor input[type=color]{min-height:27px;padding:2px}.uml-layout-editor-actions{grid-column:1/-1;display:flex;gap:5px}.uml-layout-editor-actions button{border:1px solid #87979f;border-radius:2px;background:#fff;color:#283940;padding:4px 8px;cursor:pointer;font:700 9px/1.2 ui-monospace,monospace}.uml-layout-editor-actions button.is-primary{border-color:#287495;background:#287495;color:#fff}.uml-layout-editor-actions button.is-danger{margin-left:auto;border-color:#a26156;color:#812b1c}.uml-layout-editor-actions button:disabled{opacity:.45;cursor:not-allowed}.uml-layout-editor output{grid-column:1/-1;min-height:1.2em;color:#52636b;font:9px/1.25 ui-monospace,monospace}@media(max-width:900px){.uml-layout-editor{grid-template-columns:1fr}.uml-layout-editor-title,.uml-layout-editor-actions,.uml-layout-editor output{grid-column:1}}@media print{.uml-edit-toggle,.uml-layout-editor,.uml-layout-hit,.uml-layout-resize{display:none!important}}.uml-snapshot-panel{display:grid;gap:8px;min-width:0;padding:8px;background:#fafafa;font-size:10px}.uml-snapshot-panel>header{display:flex;justify-content:space-between;gap:8px;align-items:center}.uml-snapshot-panel>header>div:first-child>span,.uml-snapshot-panel>header>div:first-child>strong{display:block}.uml-snapshot-panel>header>div:first-child>span{color:#5a5a5a;font:700 9px/1.2 ui-monospace,monospace}.uml-snapshot-panel>header>div:first-child>strong{font-size:12px}.uml-snapshot-panel>header>div:first-child>strong code{display:inline-block;min-width:24px;color:#075d7d}.uml-snapshot-cursor{display:flex;align-items:center;gap:4px}.uml-snapshot-cursor button{width:23px;height:23px;padding:0}.uml-snapshot-cursor button:disabled{opacity:.35;cursor:default}.uml-snapshot-cursor output{min-width:34px;text-align:center;font:700 9px/1 ui-monospace,monospace}.uml-snapshot-description{margin:0;color:#333}.uml-snapshot-panel section{min-width:0;border:1px solid #d0d0d0;background:#fff;padding:7px}.uml-snapshot-panel h4{margin:0 0 4px;color:#315f78;font:700 9px/1.2 ui-monospace,monospace;text-transform:uppercase}.uml-state-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:7px;min-width:0}.uml-snapshot-registers dl{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:3px;margin:0}.uml-snapshot-registers dl>div{display:grid;grid-template-columns:auto 1fr;gap:5px;min-width:0;padding:2px 4px;border-left:2px solid #bbb;background:#f6f6f6}.uml-snapshot-registers dl>div.primary{grid-column:1/-1;border-color:#287495;background:#edf7fb}.uml-snapshot-registers dt{color:#555;font-weight:700}.uml-snapshot-registers dd,.uml-snapshot-variables dd,.uml-snapshot-memory dd{min-width:0;margin:0;overflow-wrap:anywhere;text-align:right;font:600 9px/1.25 ui-monospace,monospace}.uml-snapshot-variables dl{display:grid;gap:3px;margin:0}.uml-snapshot-variables dl>div{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:5px;padding:3px 5px;border-left:2px solid #5f899b;background:#f5f8f9}.uml-snapshot-variables dt{font-weight:700}.uml-snapshot-variables dt small{display:block;color:#777;font:8px/1.2 ui-monospace,monospace}.uml-snapshot-variables [data-state=uninitialised],.uml-stack-lane article[data-state=uninitialised]{color:#777;background:#f5f5f5}.uml-snapshot-variables [data-state=uninitialised] dt:after,.uml-stack-lane article[data-state=uninitialised]>strong:after{content:" ?";color:#9a6a00}.uml-arena-snapshot>div{position:relative;height:10px;border:1px solid #666;background:repeating-linear-gradient(90deg,#fff 0 7px,#eee 7px 8px)}.uml-arena-snapshot>div span{display:block;height:100%;background:#b8ddeb}.uml-arena-snapshot>div i{position:absolute;top:-3px;bottom:-3px;width:2px;background:#075d7d;transform:translate(-1px)}.uml-arena-snapshot>p{display:grid;grid-template-columns:1fr auto 1fr;gap:4px;margin:3px 0;font-size:8px}.uml-arena-snapshot>p code:last-child{text-align:right}.uml-arena-bytes{display:block;margin-bottom:4px;overflow-wrap:anywhere;color:#666;font-size:8px}.uml-snapshot-memory dl{display:grid;gap:2px;margin:0}.uml-snapshot-memory dl>div{display:grid;grid-template-columns:1fr auto;gap:4px;padding-top:2px;border-top:1px solid #eee}.uml-snapshot-memory dt{font-weight:700}.uml-snapshot-memory dt small{display:block;color:#777;font:8px/1.2 ui-monospace,monospace}.uml-snapshot-stack>header{display:flex;align-items:baseline;justify-content:space-between;gap:8px}.uml-snapshot-stack>header>p{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:4px 9px;margin:0;color:#555;font-size:8px}.uml-stack-axis{display:flex;justify-content:space-between;gap:8px;margin:3px 89px 2px;color:#777;font:8px/1.2 ui-monospace,monospace}.uml-stack-lane{display:flex;align-items:stretch;min-width:0;overflow-x:auto;border:1px solid #66757c;background:#eef1f2}.uml-stack-boundary{display:grid;place-content:center;flex:0 1 82px;min-width:64px;padding:5px;background:#273941;color:#fff;text-align:center;font:700 8px/1.25 ui-monospace,monospace}.uml-stack-boundary small{color:#a9d9eb;font-size:8px;text-transform:uppercase}.uml-stack-gap{display:grid;place-content:center;flex:.7 1 70px;min-width:60px;min-height:52px;border-right:1px dashed #9da8ad;color:#78858b;text-align:center;font:8px/1.2 ui-monospace,monospace}.uml-stack-gap strong,.uml-stack-gap small{display:block}.uml-stack-gap strong{color:#52636b}.uml-stack-gap small{color:#78858b;font-size:8px}.uml-stack-lane article{display:grid;align-content:center;flex:1 1 92px;min-width:76px;padding:5px 7px;border-right:1px solid #9da8ad;background:#fff;text-align:center}.uml-stack-lane article[data-state=initialised]{border-top:3px solid #2c8060}.uml-stack-lane article[data-state=saved]{border-top:3px solid #6d7196;background:#f7f6fb}.uml-stack-lane article strong,.uml-stack-lane article code,.uml-stack-lane article small{display:block;overflow-wrap:anywhere}.uml-stack-lane article strong{font:700 9px/1.2 ui-monospace,monospace}.uml-stack-lane article code{margin:2px 0;color:#1f4555;font-size:8px}.uml-stack-lane article small{color:#777;font:8px/1.2 ui-monospace,monospace}.uml-snapshot-observation p{margin:0 0 3px}.uml-snapshot-observation small{display:block;overflow-wrap:anywhere;color:#666;font:8px/1.3 ui-monospace,monospace}.task-conclusion{margin:8px 0 0;padding:7px 9px;border:1px solid #315f78;background:#f3f9fc}.task-conclusion>strong{display:block;margin-bottom:3px;color:#315f78;font:700 10px/1.2 ui-monospace,monospace}.task-conclusion p{margin:0}.asset-source-link{display:inline-block;margin:5px 0;color:#315f78;font:600 11px/1.3 system-ui,sans-serif}.section-sheet--asset .section-heading{align-items:baseline;margin:0 0 1.5mm}.section-sheet--asset .section-heading .section-index{margin-right:4mm;color:#68757b;font-size:10px;font-weight:600}.section-sheet--asset .section-heading .section-title{color:#20282c;font:750 13px/1.2 system-ui,sans-serif}.section-sheet--asset .card-section>p{max-width:110ch;margin:0 0 2mm;color:#58656b;font:9px/1.3 system-ui,sans-serif}.section-sheet--asset .card-asset{margin-top:2mm}.lesson-progress-control{display:inline-flex;align-items:center;margin-right:7px;padding:2px 7px;border:1px solid #8c8c8c;border-radius:12px;background:#fff;cursor:pointer}.lesson-progress-control:disabled{cursor:wait;opacity:.6}.lesson-progress-control[data-status=approved]{background:#e7f6ed;border-color:#18794e}.lesson-progress-topbar{display:flex;flex:none;align-items:center;gap:5px;min-width:0;padding-left:7px;border-left:1px solid #a9b3b8;color:#33444c;font:650 10px/1.2 system-ui,sans-serif;white-space:nowrap}.lesson-progress-topbar strong{color:#52636b;font:800 9px/1 ui-monospace,monospace;letter-spacing:.05em}.lesson-progress-topbar output{min-width:3.8ch;border:1px solid #91a1a8;border-radius:999px;background:#fff;padding:2px 6px;color:#1e566e;text-align:center;font:800 9px/1 ui-monospace,monospace}.lesson-progress-topbar a{color:#245f7a;text-decoration:none}.lesson-progress-topbar a:hover,.lesson-progress-topbar a:focus-visible{text-decoration:underline}.lesson-progress-error{color:#9b1c1c;font-weight:900}.step-row{display:flex;align-items:center;margin:4px 0}.section-anchor{position:relative;top:-45px}.app-load-error{max-width:760px;margin:10vh auto;padding:24px;border:1px solid #9b1c1c;background:#fff;font-family:system-ui,sans-serif}.app-load-error pre{white-space:pre-wrap}@media(max-width:800px){.viewpoint-bar{grid-template-columns:repeat(4,minmax(0,1fr))}.viewpoint-bar button{min-height:28px}.card-library-toggle>span:last-child{display:none}.card-library-toggle{gap:4px;padding-inline:6px}.topbar-nvim-meta{display:none}.topbar-nvim-section .nvim-control-indicator{max-width:42vw;overflow:hidden;text-overflow:ellipsis}.nvim-shortcut-strip,.nvim-work-indicator{display:none}.allocator-panel>header{grid-template-columns:auto 1fr}.allocator-panel>header>small{display:none}.allocator-panel-body{grid-template-columns:1fr}.allocator-metrics,.allocator-facts{display:none}.memory-lanes{grid-template-columns:1fr 1fr}.memory-react>header,.uml-react>header{align-items:flex-start;flex-direction:column}.uml-header-first-line,.uml-header-navigation{width:100%;align-items:flex-start;flex-direction:column}.uml-header-navigation{gap:4px}.memory-actions{justify-content:flex-start}.uml-snapshot-layout{display:block}.uml-step-canvas{border:0}.uml-phase-actions{width:100%;justify-content:flex-end}.uml-state-grid{grid-template-columns:1fr}.uml-snapshot-stack>header{align-items:flex-start;flex-direction:column}.uml-snapshot-stack>header>p{justify-content:flex-start}.uml-stack-axis{margin-right:0;margin-left:0}}@media print{@page card-portrait{size:A4 portrait;margin:0}@page card-landscape{size:A4 landscape;margin:0}.sheet--portrait{page:card-portrait}.sheet--landscape{page:card-landscape}.paper{display:block;gap:0}.paper>.sheet,.paper>.sheet>.sheet-content,.paper>.sheet-spread>.sheet,.paper>.sheet-spread>.sheet>.sheet-content{height:auto;min-height:0;max-height:none;overflow:visible}.sheet-spread{display:contents!important}.viewer-chrome,.side-panel-dock,.memory-react{display:none!important}.asset-static-fallback{display:block!important;width:100%}.uml-actions,.uml-phase-actions,.uml-step-actions,.uml-snapshot-panel,.uml-stage,.uml-approval,.asset-source-link,.lesson-progress-topbar,.lesson-progress-control,.uml-page-continuation{display:none!important}} diff --git a/web/app.js b/web/app.js new file mode 100644 index 0000000..c1573ef --- /dev/null +++ b/web/app.js @@ -0,0 +1,61 @@ +var Pp=Object.create;var ks=Object.defineProperty;var Tp=Object.getOwnPropertyDescriptor;var Mp=Object.getOwnPropertyNames;var Rp=Object.getPrototypeOf,Op=Object.prototype.hasOwnProperty;var $t=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var $p=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of Mp(t))!Op.call(e,o)&&o!==n&&ks(e,o,{get:()=>t[o],enumerable:!(r=Tp(t,o))||r.enumerable});return e};var bo=(e,t,n)=>(n=e!=null?Pp(Rp(e)):{},$p(t||!e||!e.__esModule?ks(n,"default",{value:e,enumerable:!0}):n,e));var Rs=$t(W=>{"use strict";var xr=Symbol.for("react.element"),Ip=Symbol.for("react.portal"),Fp=Symbol.for("react.fragment"),Dp=Symbol.for("react.strict_mode"),jp=Symbol.for("react.profiler"),Up=Symbol.for("react.provider"),Vp=Symbol.for("react.context"),Bp=Symbol.for("react.forward_ref"),Hp=Symbol.for("react.suspense"),Kp=Symbol.for("react.memo"),Wp=Symbol.for("react.lazy"),Ss=Symbol.iterator;function Gp(e){return e===null||typeof e!="object"?null:(e=Ss&&e[Ss]||e["@@iterator"],typeof e=="function"?e:null)}var _s={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},Cs=Object.assign,Ls={};function Vn(e,t,n){this.props=e,this.context=t,this.refs=Ls,this.updater=n||_s}Vn.prototype.isReactComponent={};Vn.prototype.setState=function(e,t){if(typeof e!="object"&&typeof e!="function"&&e!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")};Vn.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")};function zs(){}zs.prototype=Vn.prototype;function Qi(e,t,n){this.props=e,this.context=t,this.refs=Ls,this.updater=n||_s}var qi=Qi.prototype=new zs;qi.constructor=Qi;Cs(qi,Vn.prototype);qi.isPureReactComponent=!0;var Ns=Array.isArray,As=Object.prototype.hasOwnProperty,Xi={current:null},Ps={key:!0,ref:!0,__self:!0,__source:!0};function Ts(e,t,n){var r,o={},i=null,l=null;if(t!=null)for(r in t.ref!==void 0&&(l=t.ref),t.key!==void 0&&(i=""+t.key),t)As.call(t,r)&&!Ps.hasOwnProperty(r)&&(o[r]=t[r]);var s=arguments.length-2;if(s===1)o.children=n;else if(1{"use strict";Os.exports=Rs()});var Ks=$t(le=>{"use strict";function nl(e,t){var n=e.length;e.push(t);e:for(;0>>1,o=e[r];if(0>>1;rEo(s,n))uEo(d,s)?(e[r]=d,e[u]=n,r=u):(e[r]=s,e[l]=n,r=l);else if(uEo(d,n))e[r]=d,e[u]=n,r=u;else break e}}return t}function Eo(e,t){var n=e.sortIndex-t.sortIndex;return n!==0?n:e.id-t.id}typeof performance=="object"&&typeof performance.now=="function"?($s=performance,le.unstable_now=function(){return $s.now()}):(Ji=Date,Is=Ji.now(),le.unstable_now=function(){return Ji.now()-Is});var $s,Ji,Is,At=[],Zt=[],Zp=1,mt=null,Oe=3,Lo=!1,kn=!1,wr=!1,js=typeof setTimeout=="function"?setTimeout:null,Us=typeof clearTimeout=="function"?clearTimeout:null,Fs=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function rl(e){for(var t=wt(Zt);t!==null;){if(t.callback===null)Co(Zt);else if(t.startTime<=e)Co(Zt),t.sortIndex=t.expirationTime,nl(At,t);else break;t=wt(Zt)}}function ol(e){if(wr=!1,rl(e),!kn)if(wt(At)!==null)kn=!0,ll(il);else{var t=wt(Zt);t!==null&&al(ol,t.startTime-e)}}function il(e,t){kn=!1,wr&&(wr=!1,Us(kr),kr=-1),Lo=!0;var n=Oe;try{for(rl(t),mt=wt(At);mt!==null&&(!(mt.expirationTime>t)||e&&!Hs());){var r=mt.callback;if(typeof r=="function"){mt.callback=null,Oe=mt.priorityLevel;var o=r(mt.expirationTime<=t);t=le.unstable_now(),typeof o=="function"?mt.callback=o:mt===wt(At)&&Co(At),rl(t)}else Co(At);mt=wt(At)}if(mt!==null)var i=!0;else{var l=wt(Zt);l!==null&&al(ol,l.startTime-t),i=!1}return i}finally{mt=null,Oe=n,Lo=!1}}var zo=!1,_o=null,kr=-1,Vs=5,Bs=-1;function Hs(){return!(le.unstable_now()-Bse||125r?(e.sortIndex=n,nl(Zt,e),wt(At)===null&&e===wt(Zt)&&(wr?(Us(kr),kr=-1):wr=!0,al(ol,n-r))):(e.sortIndex=o,nl(At,e),kn||Lo||(kn=!0,ll(il))),e};le.unstable_shouldYield=Hs;le.unstable_wrapCallback=function(e){var t=Oe;return function(){var n=Oe;Oe=t;try{return e.apply(this,arguments)}finally{Oe=n}}}});var Gs=$t((uh,Ws)=>{"use strict";Ws.exports=Ks()});var Xd=$t(lt=>{"use strict";var Jp=No(),ot=Gs();function z(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),Al=Object.prototype.hasOwnProperty,em=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,Ys={},Qs={};function tm(e){return Al.call(Qs,e)?!0:Al.call(Ys,e)?!1:em.test(e)?Qs[e]=!0:(Ys[e]=!0,!1)}function nm(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return r?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function rm(e,t,n,r){if(t===null||typeof t>"u"||nm(e,t,n,r))return!0;if(r)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function We(e,t,n,r,o,i,l){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=o,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=i,this.removeEmptyString=l}var Me={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){Me[e]=new We(e,0,!1,e,null,!1,!1)});[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];Me[t]=new We(t,1,!1,e[1],null,!1,!1)});["contentEditable","draggable","spellCheck","value"].forEach(function(e){Me[e]=new We(e,2,!1,e.toLowerCase(),null,!1,!1)});["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){Me[e]=new We(e,2,!1,e,null,!1,!1)});"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){Me[e]=new We(e,3,!1,e.toLowerCase(),null,!1,!1)});["checked","multiple","muted","selected"].forEach(function(e){Me[e]=new We(e,3,!0,e,null,!1,!1)});["capture","download"].forEach(function(e){Me[e]=new We(e,4,!1,e,null,!1,!1)});["cols","rows","size","span"].forEach(function(e){Me[e]=new We(e,6,!1,e,null,!1,!1)});["rowSpan","start"].forEach(function(e){Me[e]=new We(e,5,!1,e.toLowerCase(),null,!1,!1)});var ka=/[\-:]([a-z])/g;function Sa(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(ka,Sa);Me[t]=new We(t,1,!1,e,null,!1,!1)});"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(ka,Sa);Me[t]=new We(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)});["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(ka,Sa);Me[t]=new We(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)});["tabIndex","crossOrigin"].forEach(function(e){Me[e]=new We(e,1,!1,e.toLowerCase(),null,!1,!1)});Me.xlinkHref=new We("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1);["src","href","action","formAction"].forEach(function(e){Me[e]=new We(e,1,!1,e.toLowerCase(),null,!0,!0)});function Na(e,t,n,r){var o=Me.hasOwnProperty(t)?Me[t]:null;(o!==null?o.type!==0:r||!(2s||o[l]!==i[s]){var u=` +`+o[l].replace(" at new "," at ");return e.displayName&&u.includes("")&&(u=u.replace("",e.displayName)),u}while(1<=l&&0<=s);break}}}finally{ul=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?Pr(e):""}function om(e){switch(e.tag){case 5:return Pr(e.type);case 16:return Pr("Lazy");case 13:return Pr("Suspense");case 19:return Pr("SuspenseList");case 0:case 2:case 15:return e=cl(e.type,!1),e;case 11:return e=cl(e.type.render,!1),e;case 1:return e=cl(e.type,!0),e;default:return""}}function Rl(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case Wn:return"Fragment";case Kn:return"Portal";case Pl:return"Profiler";case Ea:return"StrictMode";case Tl:return"Suspense";case Ml:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case nc:return(e.displayName||"Context")+".Consumer";case tc:return(e._context.displayName||"Context")+".Provider";case _a:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case Ca:return t=e.displayName||null,t!==null?t:Rl(e.type)||"Memo";case en:t=e._payload,e=e._init;try{return Rl(e(t))}catch{}}return null}function im(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return Rl(t);case 8:return t===Ea?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function gn(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function oc(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function lm(e){var t=oc(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var o=n.get,i=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return o.call(this)},set:function(l){r=""+l,i.call(this,l)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(l){r=""+l},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function Po(e){e._valueTracker||(e._valueTracker=lm(e))}function ic(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=oc(e)?e.checked?"true":"false":e.value),e=r,e!==n?(t.setValue(e),!0):!1}function ii(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function Ol(e,t){var n=t.checked;return ve({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function Xs(e,t){var n=t.defaultValue==null?"":t.defaultValue,r=t.checked!=null?t.checked:t.defaultChecked;n=gn(t.value!=null?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function lc(e,t){t=t.checked,t!=null&&Na(e,"checked",t,!1)}function $l(e,t){lc(e,t);var n=gn(t.value),r=t.type;if(n!=null)r==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?Il(e,t.type,n):t.hasOwnProperty("defaultValue")&&Il(e,t.type,gn(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function Zs(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!(r!=="submit"&&r!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function Il(e,t,n){(t!=="number"||ii(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var Tr=Array.isArray;function rr(e,t,n,r){if(e=e.options,t){t={};for(var o=0;o"+t.valueOf().toString()+"",t=To.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Kr(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var Or={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},am=["Webkit","ms","Moz","O"];Object.keys(Or).forEach(function(e){am.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Or[t]=Or[e]})});function cc(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||Or.hasOwnProperty(e)&&Or[e]?(""+t).trim():t+"px"}function dc(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=n.indexOf("--")===0,o=cc(n,t[n],r);n==="float"&&(n="cssFloat"),r?e.setProperty(n,o):e[n]=o}}var sm=ve({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function jl(e,t){if(t){if(sm[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(z(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(z(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(z(61))}if(t.style!=null&&typeof t.style!="object")throw Error(z(62))}}function Ul(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Vl=null;function La(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Bl=null,or=null,ir=null;function tu(e){if(e=uo(e)){if(typeof Bl!="function")throw Error(z(280));var t=e.stateNode;t&&(t=Mi(t),Bl(e.stateNode,e.type,t))}}function pc(e){or?ir?ir.push(e):ir=[e]:or=e}function mc(){if(or){var e=or,t=ir;if(ir=or=null,tu(e),t)for(e=0;e>>=0,e===0?32:31-(xm(e)/bm|0)|0}var Mo=64,Ro=4194304;function Mr(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function ui(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,o=e.suspendedLanes,i=e.pingedLanes,l=n&268435455;if(l!==0){var s=l&~o;s!==0?r=Mr(s):(i&=l,i!==0&&(r=Mr(i)))}else l=n&~o,l!==0?r=Mr(l):i!==0&&(r=Mr(i));if(r===0)return 0;if(t!==0&&t!==r&&(t&o)===0&&(o=r&-r,i=t&-t,o>=i||o===16&&(i&4194240)!==0))return t;if((r&4)!==0&&(r|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0n;n++)t.push(e);return t}function ao(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-_t(t),e[t]=n}function Nm(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0=Ir),cu=" ",du=!1;function Mc(e,t){switch(e){case"keyup":return Zm.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Rc(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var Gn=!1;function ef(e,t){switch(e){case"compositionend":return Rc(t);case"keypress":return t.which!==32?null:(du=!0,cu);case"textInput":return e=t.data,e===cu&&du?null:e;default:return null}}function tf(e,t){if(Gn)return e==="compositionend"||!$a&&Mc(e,t)?(e=Pc(),qo=Ma=on=null,Gn=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=fu(n)}}function Fc(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Fc(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Dc(){for(var e=window,t=ii();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=ii(e.document)}return t}function Ia(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function df(e){var t=Dc(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&Fc(n.ownerDocument.documentElement,n)){if(r!==null&&Ia(n)){if(t=r.start,e=r.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var o=n.textContent.length,i=Math.min(r.start,o);r=r.end===void 0?i:Math.min(r.end,o),!e.extend&&i>r&&(o=r,r=i,i=o),o=gu(n,i);var l=gu(n,r);o&&l&&(e.rangeCount!==1||e.anchorNode!==o.node||e.anchorOffset!==o.offset||e.focusNode!==l.node||e.focusOffset!==l.offset)&&(t=t.createRange(),t.setStart(o.node,o.offset),e.removeAllRanges(),i>r?(e.addRange(t),e.extend(l.node,l.offset)):(t.setEnd(l.node,l.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n=document.documentMode,Yn=null,Ql=null,Dr=null,ql=!1;function hu(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;ql||Yn==null||Yn!==ii(r)||(r=Yn,"selectionStart"in r&&Ia(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),Dr&&Xr(Dr,r)||(Dr=r,r=pi(Ql,"onSelect"),0Xn||(e.current=na[Xn],na[Xn]=null,Xn--)}function ae(e,t){Xn++,na[Xn]=e.current,e.current=t}var hn={},De=vn(hn),Xe=vn(!1),An=hn;function cr(e,t){var n=e.type.contextTypes;if(!n)return hn;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var o={},i;for(i in n)o[i]=t[i];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=o),o}function Ze(e){return e=e.childContextTypes,e!=null}function fi(){de(Xe),de(De)}function Eu(e,t,n){if(De.current!==hn)throw Error(z(168));ae(De,t),ae(Xe,n)}function Yc(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,typeof r.getChildContext!="function")return n;r=r.getChildContext();for(var o in r)if(!(o in t))throw Error(z(108,im(e)||"Unknown",o));return ve({},n,r)}function gi(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||hn,An=De.current,ae(De,e),ae(Xe,Xe.current),!0}function _u(e,t,n){var r=e.stateNode;if(!r)throw Error(z(169));n?(e=Yc(e,t,An),r.__reactInternalMemoizedMergedChildContext=e,de(Xe),de(De),ae(De,e)):de(Xe),ae(Xe,n)}var Ft=null,Ri=!1,wl=!1;function Qc(e){Ft===null?Ft=[e]:Ft.push(e)}function wf(e){Ri=!0,Qc(e)}function xn(){if(!wl&&Ft!==null){wl=!0;var e=0,t=ee;try{var n=Ft;for(ee=1;e>=l,o-=l,Dt=1<<32-_t(t)+o|n<R?(j=T,T=null):j=T.sibling;var I=g(p,T,h[R],k);if(I===null){T===null&&(T=j);break}e&&T&&I.alternate===null&&t(p,T),c=i(I,c,R),P===null?C=I:P.sibling=I,P=I,T=j}if(R===h.length)return n(p,T),pe&&Sn(p,R),C;if(T===null){for(;RR?(j=T,T=null):j=T.sibling;var ke=g(p,T,I.value,k);if(ke===null){T===null&&(T=j);break}e&&T&&ke.alternate===null&&t(p,T),c=i(ke,c,R),P===null?C=ke:P.sibling=ke,P=ke,T=j}if(I.done)return n(p,T),pe&&Sn(p,R),C;if(T===null){for(;!I.done;R++,I=h.next())I=y(p,I.value,k),I!==null&&(c=i(I,c,R),P===null?C=I:P.sibling=I,P=I);return pe&&Sn(p,R),C}for(T=r(p,T);!I.done;R++,I=h.next())I=f(T,p,R,I.value,k),I!==null&&(e&&I.alternate!==null&&T.delete(I.key===null?R:I.key),c=i(I,c,R),P===null?C=I:P.sibling=I,P=I);return e&&T.forEach(function(re){return t(p,re)}),pe&&Sn(p,R),C}function _(p,c,h,k){if(typeof h=="object"&&h!==null&&h.type===Wn&&h.key===null&&(h=h.props.children),typeof h=="object"&&h!==null){switch(h.$$typeof){case Ao:e:{for(var C=h.key,P=c;P!==null;){if(P.key===C){if(C=h.type,C===Wn){if(P.tag===7){n(p,P.sibling),c=o(P,h.props.children),c.return=p,p=c;break e}}else if(P.elementType===C||typeof C=="object"&&C!==null&&C.$$typeof===en&&zu(C)===P.type){n(p,P.sibling),c=o(P,h.props),c.ref=Cr(p,P,h),c.return=p,p=c;break e}n(p,P);break}else t(p,P);P=P.sibling}h.type===Wn?(c=zn(h.props.children,p.mode,k,h.key),c.return=p,p=c):(k=oi(h.type,h.key,h.props,null,p.mode,k),k.ref=Cr(p,c,h),k.return=p,p=k)}return l(p);case Kn:e:{for(P=h.key;c!==null;){if(c.key===P)if(c.tag===4&&c.stateNode.containerInfo===h.containerInfo&&c.stateNode.implementation===h.implementation){n(p,c.sibling),c=o(c,h.children||[]),c.return=p,p=c;break e}else{n(p,c);break}else t(p,c);c=c.sibling}c=zl(h,p.mode,k),c.return=p,p=c}return l(p);case en:return P=h._init,_(p,c,P(h._payload),k)}if(Tr(h))return E(p,c,h,k);if(Sr(h))return b(p,c,h,k);Ko(p,h)}return typeof h=="string"&&h!==""||typeof h=="number"?(h=""+h,c!==null&&c.tag===6?(n(p,c.sibling),c=o(c,h),c.return=p,p=c):(n(p,c),c=Ll(h,p.mode,k),c.return=p,p=c),l(p)):n(p,c)}return _}var pr=Jc(!0),ed=Jc(!1),vi=vn(null),xi=null,er=null,Ua=null;function Va(){Ua=er=xi=null}function Ba(e){var t=vi.current;de(vi),e._currentValue=t}function ia(e,t,n){for(;e!==null;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,r!==null&&(r.childLanes|=t)):r!==null&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function ar(e,t){xi=e,Ua=er=null,e=e.dependencies,e!==null&&e.firstContext!==null&&((e.lanes&t)!==0&&(qe=!0),e.firstContext=null)}function vt(e){var t=e._currentValue;if(Ua!==e)if(e={context:e,memoizedValue:t,next:null},er===null){if(xi===null)throw Error(z(308));er=e,xi.dependencies={lanes:0,firstContext:e}}else er=er.next=e;return t}var _n=null;function Ha(e){_n===null?_n=[e]:_n.push(e)}function td(e,t,n,r){var o=t.interleaved;return o===null?(n.next=n,Ha(t)):(n.next=o.next,o.next=n),t.interleaved=n,Ht(e,r)}function Ht(e,t){e.lanes|=t;var n=e.alternate;for(n!==null&&(n.lanes|=t),n=e,e=e.return;e!==null;)e.childLanes|=t,n=e.alternate,n!==null&&(n.childLanes|=t),n=e,e=e.return;return n.tag===3?n.stateNode:null}var tn=!1;function Ka(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function nd(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function Ut(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function dn(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,(Y&2)!==0){var o=r.pending;return o===null?t.next=t:(t.next=o.next,o.next=t),r.pending=t,Ht(e,n)}return o=r.interleaved,o===null?(t.next=t,Ha(r)):(t.next=o.next,o.next=t),r.interleaved=t,Ht(e,n)}function Zo(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,(n&4194240)!==0)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Aa(e,n)}}function Au(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var o=null,i=null;if(n=n.firstBaseUpdate,n!==null){do{var l={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};i===null?o=i=l:i=i.next=l,n=n.next}while(n!==null);i===null?o=i=t:i=i.next=t}else o=i=t;n={baseState:r.baseState,firstBaseUpdate:o,lastBaseUpdate:i,shared:r.shared,effects:r.effects},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function bi(e,t,n,r){var o=e.updateQueue;tn=!1;var i=o.firstBaseUpdate,l=o.lastBaseUpdate,s=o.shared.pending;if(s!==null){o.shared.pending=null;var u=s,d=u.next;u.next=null,l===null?i=d:l.next=d,l=u;var m=e.alternate;m!==null&&(m=m.updateQueue,s=m.lastBaseUpdate,s!==l&&(s===null?m.firstBaseUpdate=d:s.next=d,m.lastBaseUpdate=u))}if(i!==null){var y=o.baseState;l=0,m=d=u=null,s=i;do{var g=s.lane,f=s.eventTime;if((r&g)===g){m!==null&&(m=m.next={eventTime:f,lane:0,tag:s.tag,payload:s.payload,callback:s.callback,next:null});e:{var E=e,b=s;switch(g=t,f=n,b.tag){case 1:if(E=b.payload,typeof E=="function"){y=E.call(f,y,g);break e}y=E;break e;case 3:E.flags=E.flags&-65537|128;case 0:if(E=b.payload,g=typeof E=="function"?E.call(f,y,g):E,g==null)break e;y=ve({},y,g);break e;case 2:tn=!0}}s.callback!==null&&s.lane!==0&&(e.flags|=64,g=o.effects,g===null?o.effects=[s]:g.push(s))}else f={eventTime:f,lane:g,tag:s.tag,payload:s.payload,callback:s.callback,next:null},m===null?(d=m=f,u=y):m=m.next=f,l|=g;if(s=s.next,s===null){if(s=o.shared.pending,s===null)break;g=s,s=g.next,g.next=null,o.lastBaseUpdate=g,o.shared.pending=null}}while(!0);if(m===null&&(u=y),o.baseState=u,o.firstBaseUpdate=d,o.lastBaseUpdate=m,t=o.shared.interleaved,t!==null){o=t;do l|=o.lane,o=o.next;while(o!==t)}else i===null&&(o.shared.lanes=0);Mn|=l,e.lanes=l,e.memoizedState=y}}function Pu(e,t,n){if(e=t.effects,t.effects=null,e!==null)for(t=0;tn?n:4,e(!0);var r=Sl.transition;Sl.transition={};try{e(!1),t()}finally{ee=n,Sl.transition=r}}function xd(){return xt().memoizedState}function Ef(e,t,n){var r=mn(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},bd(e))wd(t,n);else if(n=td(e,t,n,r),n!==null){var o=Ke();Ct(n,e,r,o),kd(n,t,r)}}function _f(e,t,n){var r=mn(e),o={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(bd(e))wd(t,o);else{var i=e.alternate;if(e.lanes===0&&(i===null||i.lanes===0)&&(i=t.lastRenderedReducer,i!==null))try{var l=t.lastRenderedState,s=i(l,n);if(o.hasEagerState=!0,o.eagerState=s,Lt(s,l)){var u=t.interleaved;u===null?(o.next=o,Ha(t)):(o.next=u.next,u.next=o),t.interleaved=o;return}}catch{}finally{}n=td(e,t,o,r),n!==null&&(o=Ke(),Ct(n,e,r,o),kd(n,t,r))}}function bd(e){var t=e.alternate;return e===ye||t!==null&&t===ye}function wd(e,t){jr=ki=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function kd(e,t,n){if((n&4194240)!==0){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,Aa(e,n)}}var Si={readContext:vt,useCallback:$e,useContext:$e,useEffect:$e,useImperativeHandle:$e,useInsertionEffect:$e,useLayoutEffect:$e,useMemo:$e,useReducer:$e,useRef:$e,useState:$e,useDebugValue:$e,useDeferredValue:$e,useTransition:$e,useMutableSource:$e,useSyncExternalStore:$e,useId:$e,unstable_isNewReconciler:!1},Cf={readContext:vt,useCallback:function(e,t){return Tt().memoizedState=[e,t===void 0?null:t],e},useContext:vt,useEffect:Mu,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,ei(4194308,4,fd.bind(null,t,e),n)},useLayoutEffect:function(e,t){return ei(4194308,4,e,t)},useInsertionEffect:function(e,t){return ei(4,2,e,t)},useMemo:function(e,t){var n=Tt();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=Tt();return t=n!==void 0?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=Ef.bind(null,ye,e),[r.memoizedState,e]},useRef:function(e){var t=Tt();return e={current:e},t.memoizedState=e},useState:Tu,useDebugValue:Ja,useDeferredValue:function(e){return Tt().memoizedState=e},useTransition:function(){var e=Tu(!1),t=e[0];return e=Nf.bind(null,e[1]),Tt().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=ye,o=Tt();if(pe){if(n===void 0)throw Error(z(407));n=n()}else{if(n=t(),Ae===null)throw Error(z(349));(Tn&30)!==0||ld(r,t,n)}o.memoizedState=n;var i={value:n,getSnapshot:t};return o.queue=i,Mu(sd.bind(null,r,i,e),[e]),r.flags|=2048,io(9,ad.bind(null,r,i,n,t),void 0,null),n},useId:function(){var e=Tt(),t=Ae.identifierPrefix;if(pe){var n=jt,r=Dt;n=(r&~(1<<32-_t(r)-1)).toString(32)+n,t=":"+t+"R"+n,n=ro++,0<\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=l.createElement(n,{is:r.is}):(e=l.createElement(n),n==="select"&&(l=e,r.multiple?l.multiple=!0:r.size&&(l.size=r.size))):e=l.createElementNS(e,n),e[Mt]=t,e[eo]=r,Td(e,t,!1,!1),t.stateNode=e;e:{switch(l=Ul(n,r),n){case"dialog":ce("cancel",e),ce("close",e),o=r;break;case"iframe":case"object":case"embed":ce("load",e),o=r;break;case"video":case"audio":for(o=0;ogr&&(t.flags|=128,r=!0,Lr(i,!1),t.lanes=4194304)}else{if(!r)if(e=wi(l),e!==null){if(t.flags|=128,r=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),Lr(i,!0),i.tail===null&&i.tailMode==="hidden"&&!l.alternate&&!pe)return Ie(t),null}else 2*we()-i.renderingStartTime>gr&&n!==1073741824&&(t.flags|=128,r=!0,Lr(i,!1),t.lanes=4194304);i.isBackwards?(l.sibling=t.child,t.child=l):(n=i.last,n!==null?n.sibling=l:t.child=l,i.last=l)}return i.tail!==null?(t=i.tail,i.rendering=t,i.tail=t.sibling,i.renderingStartTime=we(),t.sibling=null,n=he.current,ae(he,r?n&1|2:n&1),t):(Ie(t),null);case 22:case 23:return is(),r=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(t.flags|=8192),r&&(t.mode&1)!==0?(tt&1073741824)!==0&&(Ie(t),t.subtreeFlags&6&&(t.flags|=8192)):Ie(t),null;case 24:return null;case 25:return null}throw Error(z(156,t.tag))}function Of(e,t){switch(Da(t),t.tag){case 1:return Ze(t.type)&&fi(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return mr(),de(Xe),de(De),Ya(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 5:return Ga(t),null;case 13:if(de(he),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(z(340));dr()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return de(he),null;case 4:return mr(),null;case 10:return Ba(t.type._context),null;case 22:case 23:return is(),null;case 24:return null;default:return null}}var Go=!1,Fe=!1,$f=typeof WeakSet=="function"?WeakSet:Set,$=null;function tr(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(r){be(e,t,r)}else n.current=null}function fa(e,t,n){try{n()}catch(r){be(e,t,r)}}var Hu=!1;function If(e,t){if(Xl=ci,e=Dc(),Ia(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var o=r.anchorOffset,i=r.focusNode;r=r.focusOffset;try{n.nodeType,i.nodeType}catch{n=null;break e}var l=0,s=-1,u=-1,d=0,m=0,y=e,g=null;t:for(;;){for(var f;y!==n||o!==0&&y.nodeType!==3||(s=l+o),y!==i||r!==0&&y.nodeType!==3||(u=l+r),y.nodeType===3&&(l+=y.nodeValue.length),(f=y.firstChild)!==null;)g=y,y=f;for(;;){if(y===e)break t;if(g===n&&++d===o&&(s=l),g===i&&++m===r&&(u=l),(f=y.nextSibling)!==null)break;y=g,g=y.parentNode}y=f}n=s===-1||u===-1?null:{start:s,end:u}}else n=null}n=n||{start:0,end:0}}else n=null;for(Zl={focusedElem:e,selectionRange:n},ci=!1,$=t;$!==null;)if(t=$,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,$=e;else for(;$!==null;){t=$;try{var E=t.alternate;if((t.flags&1024)!==0)switch(t.tag){case 0:case 11:case 15:break;case 1:if(E!==null){var b=E.memoizedProps,_=E.memoizedState,p=t.stateNode,c=p.getSnapshotBeforeUpdate(t.elementType===t.type?b:St(t.type,b),_);p.__reactInternalSnapshotBeforeUpdate=c}break;case 3:var h=t.stateNode.containerInfo;h.nodeType===1?h.textContent="":h.nodeType===9&&h.documentElement&&h.removeChild(h.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(z(163))}}catch(k){be(t,t.return,k)}if(e=t.sibling,e!==null){e.return=t.return,$=e;break}$=t.return}return E=Hu,Hu=!1,E}function Ur(e,t,n){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var o=r=r.next;do{if((o.tag&e)===e){var i=o.destroy;o.destroy=void 0,i!==void 0&&fa(t,n,i)}o=o.next}while(o!==r)}}function Ii(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function ga(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t=="function"?t(e):t.current=e}}function Od(e){var t=e.alternate;t!==null&&(e.alternate=null,Od(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Mt],delete t[eo],delete t[ta],delete t[xf],delete t[bf])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function $d(e){return e.tag===5||e.tag===3||e.tag===4}function Ku(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||$d(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function ha(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=mi));else if(r!==4&&(e=e.child,e!==null))for(ha(e,t,n),e=e.sibling;e!==null;)ha(e,t,n),e=e.sibling}function ya(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(ya(e,t,n),e=e.sibling;e!==null;)ya(e,t,n),e=e.sibling}var Pe=null,Nt=!1;function Jt(e,t,n){for(n=n.child;n!==null;)Id(e,t,n),n=n.sibling}function Id(e,t,n){if(Rt&&typeof Rt.onCommitFiberUnmount=="function")try{Rt.onCommitFiberUnmount(zi,n)}catch{}switch(n.tag){case 5:Fe||tr(n,t);case 6:var r=Pe,o=Nt;Pe=null,Jt(e,t,n),Pe=r,Nt=o,Pe!==null&&(Nt?(e=Pe,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):Pe.removeChild(n.stateNode));break;case 18:Pe!==null&&(Nt?(e=Pe,n=n.stateNode,e.nodeType===8?bl(e.parentNode,n):e.nodeType===1&&bl(e,n),Qr(e)):bl(Pe,n.stateNode));break;case 4:r=Pe,o=Nt,Pe=n.stateNode.containerInfo,Nt=!0,Jt(e,t,n),Pe=r,Nt=o;break;case 0:case 11:case 14:case 15:if(!Fe&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){o=r=r.next;do{var i=o,l=i.destroy;i=i.tag,l!==void 0&&((i&2)!==0||(i&4)!==0)&&fa(n,t,l),o=o.next}while(o!==r)}Jt(e,t,n);break;case 1:if(!Fe&&(tr(n,t),r=n.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(s){be(n,t,s)}Jt(e,t,n);break;case 21:Jt(e,t,n);break;case 22:n.mode&1?(Fe=(r=Fe)||n.memoizedState!==null,Jt(e,t,n),Fe=r):Jt(e,t,n);break;default:Jt(e,t,n)}}function Wu(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new $f),t.forEach(function(r){var o=Wf.bind(null,e,r);n.has(r)||(n.add(r),r.then(o,o))})}}function kt(e,t){var n=t.deletions;if(n!==null)for(var r=0;ro&&(o=l),r&=~i}if(r=o,r=we()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*Df(r/1960))-r,10e?16:e,ln===null)var r=!1;else{if(e=ln,ln=null,_i=0,(Y&6)!==0)throw Error(z(331));var o=Y;for(Y|=4,$=e.current;$!==null;){var i=$,l=i.child;if(($.flags&16)!==0){var s=i.deletions;if(s!==null){for(var u=0;uwe()-rs?Ln(e,0):ns|=n),Je(e,t)}function Kd(e,t){t===0&&((e.mode&1)===0?t=1:(t=Ro,Ro<<=1,(Ro&130023424)===0&&(Ro=4194304)));var n=Ke();e=Ht(e,t),e!==null&&(ao(e,t,n),Je(e,n))}function Kf(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),Kd(e,n)}function Wf(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,o=e.memoizedState;o!==null&&(n=o.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(z(314))}r!==null&&r.delete(t),Kd(e,n)}var Wd;Wd=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||Xe.current)qe=!0;else{if((e.lanes&n)===0&&(t.flags&128)===0)return qe=!1,Mf(e,t,n);qe=(e.flags&131072)!==0}else qe=!1,pe&&(t.flags&1048576)!==0&&qc(t,yi,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;ti(e,t),e=t.pendingProps;var o=cr(t,De.current);ar(t,n),o=qa(null,t,r,e,o,n);var i=Xa();return t.flags|=1,typeof o=="object"&&o!==null&&typeof o.render=="function"&&o.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,Ze(r)?(i=!0,gi(t)):i=!1,t.memoizedState=o.state!==null&&o.state!==void 0?o.state:null,Ka(t),o.updater=$i,t.stateNode=o,o._reactInternals=t,aa(t,r,e,n),t=ca(null,t,r,!0,i,n)):(t.tag=0,pe&&i&&Fa(t),He(null,t,o,n),t=t.child),t;case 16:r=t.elementType;e:{switch(ti(e,t),e=t.pendingProps,o=r._init,r=o(r._payload),t.type=r,o=t.tag=Yf(r),e=St(r,e),o){case 0:t=ua(null,t,r,e,n);break e;case 1:t=Uu(null,t,r,e,n);break e;case 11:t=Du(null,t,r,e,n);break e;case 14:t=ju(null,t,r,St(r.type,e),n);break e}throw Error(z(306,r,""))}return t;case 0:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:St(r,o),ua(e,t,r,o,n);case 1:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:St(r,o),Uu(e,t,r,o,n);case 3:e:{if(zd(t),e===null)throw Error(z(387));r=t.pendingProps,i=t.memoizedState,o=i.element,nd(e,t),bi(t,r,null,n);var l=t.memoizedState;if(r=l.element,i.isDehydrated)if(i={element:r,isDehydrated:!1,cache:l.cache,pendingSuspenseBoundaries:l.pendingSuspenseBoundaries,transitions:l.transitions},t.updateQueue.baseState=i,t.memoizedState=i,t.flags&256){o=fr(Error(z(423)),t),t=Vu(e,t,r,n,o);break e}else if(r!==o){o=fr(Error(z(424)),t),t=Vu(e,t,r,n,o);break e}else for(nt=cn(t.stateNode.containerInfo.firstChild),rt=t,pe=!0,Et=null,n=ed(t,null,r,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(dr(),r===o){t=Kt(e,t,n);break e}He(e,t,r,n)}t=t.child}return t;case 5:return rd(t),e===null&&oa(t),r=t.type,o=t.pendingProps,i=e!==null?e.memoizedProps:null,l=o.children,Jl(r,o)?l=null:i!==null&&Jl(r,i)&&(t.flags|=32),Ld(e,t),He(e,t,l,n),t.child;case 6:return e===null&&oa(t),null;case 13:return Ad(e,t,n);case 4:return Wa(t,t.stateNode.containerInfo),r=t.pendingProps,e===null?t.child=pr(t,null,r,n):He(e,t,r,n),t.child;case 11:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:St(r,o),Du(e,t,r,o,n);case 7:return He(e,t,t.pendingProps,n),t.child;case 8:return He(e,t,t.pendingProps.children,n),t.child;case 12:return He(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,o=t.pendingProps,i=t.memoizedProps,l=o.value,ae(vi,r._currentValue),r._currentValue=l,i!==null)if(Lt(i.value,l)){if(i.children===o.children&&!Xe.current){t=Kt(e,t,n);break e}}else for(i=t.child,i!==null&&(i.return=t);i!==null;){var s=i.dependencies;if(s!==null){l=i.child;for(var u=s.firstContext;u!==null;){if(u.context===r){if(i.tag===1){u=Ut(-1,n&-n),u.tag=2;var d=i.updateQueue;if(d!==null){d=d.shared;var m=d.pending;m===null?u.next=u:(u.next=m.next,m.next=u),d.pending=u}}i.lanes|=n,u=i.alternate,u!==null&&(u.lanes|=n),ia(i.return,n,t),s.lanes|=n;break}u=u.next}}else if(i.tag===10)l=i.type===t.type?null:i.child;else if(i.tag===18){if(l=i.return,l===null)throw Error(z(341));l.lanes|=n,s=l.alternate,s!==null&&(s.lanes|=n),ia(l,n,t),l=i.sibling}else l=i.child;if(l!==null)l.return=i;else for(l=i;l!==null;){if(l===t){l=null;break}if(i=l.sibling,i!==null){i.return=l.return,l=i;break}l=l.return}i=l}He(e,t,o.children,n),t=t.child}return t;case 9:return o=t.type,r=t.pendingProps.children,ar(t,n),o=vt(o),r=r(o),t.flags|=1,He(e,t,r,n),t.child;case 14:return r=t.type,o=St(r,t.pendingProps),o=St(r.type,o),ju(e,t,r,o,n);case 15:return _d(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:St(r,o),ti(e,t),t.tag=1,Ze(r)?(e=!0,gi(t)):e=!1,ar(t,n),Sd(t,r,o),aa(t,r,o,n),ca(null,t,r,!0,e,n);case 19:return Pd(e,t,n);case 22:return Cd(e,t,n)}throw Error(z(156,t.tag))};function Gd(e,t){return bc(e,t)}function Gf(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function ht(e,t,n,r){return new Gf(e,t,n,r)}function as(e){return e=e.prototype,!(!e||!e.isReactComponent)}function Yf(e){if(typeof e=="function")return as(e)?1:0;if(e!=null){if(e=e.$$typeof,e===_a)return 11;if(e===Ca)return 14}return 2}function fn(e,t){var n=e.alternate;return n===null?(n=ht(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function oi(e,t,n,r,o,i){var l=2;if(r=e,typeof e=="function")as(e)&&(l=1);else if(typeof e=="string")l=5;else e:switch(e){case Wn:return zn(n.children,o,i,t);case Ea:l=8,o|=8;break;case Pl:return e=ht(12,n,t,o|2),e.elementType=Pl,e.lanes=i,e;case Tl:return e=ht(13,n,t,o),e.elementType=Tl,e.lanes=i,e;case Ml:return e=ht(19,n,t,o),e.elementType=Ml,e.lanes=i,e;case rc:return Di(n,o,i,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case tc:l=10;break e;case nc:l=9;break e;case _a:l=11;break e;case Ca:l=14;break e;case en:l=16,r=null;break e}throw Error(z(130,e==null?e:typeof e,""))}return t=ht(l,n,t,o),t.elementType=e,t.type=r,t.lanes=i,t}function zn(e,t,n,r){return e=ht(7,e,r,t),e.lanes=n,e}function Di(e,t,n,r){return e=ht(22,e,r,t),e.elementType=rc,e.lanes=n,e.stateNode={isHidden:!1},e}function Ll(e,t,n){return e=ht(6,e,null,t),e.lanes=n,e}function zl(e,t,n){return t=ht(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Qf(e,t,n,r,o){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=pl(0),this.expirationTimes=pl(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=pl(0),this.identifierPrefix=r,this.onRecoverableError=o,this.mutableSourceEagerHydrationData=null}function ss(e,t,n,r,o,i,l,s,u){return e=new Qf(e,t,n,s,u),t===1?(t=1,i===!0&&(t|=8)):t=0,i=ht(3,null,null,t),e.current=i,i.stateNode=e,i.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},Ka(i),e}function qf(e,t,n){var r=3{"use strict";function Zd(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(Zd)}catch(e){console.error(e)}}Zd(),Jd.exports=Xd()});var np=$t(ps=>{"use strict";var tp=ep();ps.createRoot=tp.createRoot,ps.hydrateRoot=tp.hydrateRoot;var ph});var op=$t(Hi=>{"use strict";var tg=No(),ng=Symbol.for("react.element"),rg=Symbol.for("react.fragment"),og=Object.prototype.hasOwnProperty,ig=tg.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,lg={key:!0,ref:!0,__self:!0,__source:!0};function rp(e,t,n){var r,o={},i=null,l=null;n!==void 0&&(i=""+n),t.key!==void 0&&(i=""+t.key),t.ref!==void 0&&(l=t.ref);for(r in t)og.call(t,r)&&!lg.hasOwnProperty(r)&&(o[r]=t[r]);if(e&&e.defaultProps)for(r in t=e.defaultProps,t)o[r]===void 0&&(o[r]=t[r]);return{$$typeof:ng,type:e,key:i,ref:l,props:o,_owner:ig.current}}Hi.Fragment=rg;Hi.jsx=rp;Hi.jsxs=rp});var ms=$t((yh,ip)=>{"use strict";ip.exports=op()});var N=bo(No(),1),bp=bo(np(),1);var a=bo(ms(),1),wp={hidden:"UKRYTY",connecting:"\u0141\u0104CZENIE",connected:"ONLINE \xB7 LIVE",replaying:"ONLINE \xB7 REPLAY",verifying:"ONLINE \xB7 WERYFIKACJA",ready:"ONLINE \xB7 GOTOWY",failed:"ONLINE \xB7 B\u0141\u0104D STANU",offline:"OFFLINE \xB7 ZAPIS",unselected:"OFFLINE \xB7 BRAK CELU"},lp=.25,Fn=1,ap=4;function ag(e){let t=window.getComputedStyle(e).overflowY;return t==="auto"||t==="scroll"||t==="hidden"||t==="clip"}function kp(e){let t=e.getBoundingClientRect(),n=e.offsetHeight||e.clientHeight,r=n>0?t.height/n:1,o=t.top+e.clientTop*r;return{top:o,bottom:o+e.clientHeight*r}}function Sp(e){let t=document.querySelector(".viewer-chrome");if(t?.classList.contains("is-nvim-fit"))return null;let n=0,r=window.innerHeight;if(t){let o=t.getBoundingClientRect(),i=e.getBoundingClientRect();o.lefti.left&&o.bottom>0&&o.topFn?{top:n,bottom:r}:null}function sg(e){let t=Sp(e);if(!t)return null;let{top:n,bottom:r}=t;for(let o=e.parentElement;o&&o!==document.body&&o!==document.documentElement;o=o.parentElement){if(!ag(o))continue;let i=kp(o);n=Math.max(n,i.top),r=Math.min(r,i.bottom)}return r-n>Fn?{top:n,bottom:r}:null}function Gi(){return document.scrollingElement??document.documentElement}function ug(e){let t=[];for(let r=e.parentElement;r&&r!==document.body&&r!==document.documentElement;r=r.parentElement){let o=window.getComputedStyle(r).overflowY;(o==="auto"||o==="scroll")&&r.scrollHeight-r.clientHeight>1&&t.push(r)}let n=Gi();return t.includes(n)||t.push(n),t}function cg(e){if(e===Gi())return 1;let t=e.getBoundingClientRect(),n=e.offsetHeight||e.clientHeight,r=n>0?t.height/n:1;return Number.isFinite(r)&&r>0?r:1}function Ki(e,t){let n=e.style.scrollBehavior;e.style.scrollBehavior="auto",t.left!=null&&(e.scrollLeft=t.left),t.top!=null&&(e.scrollTop=t.top),e.style.scrollBehavior=n}function dg(e,t){let n=e.closest(".sheet-content");if(!n)return 0;let r=kp(n),o=0;if(r.bottom<=t.top?o=r.bottom-t.bottom:r.top>=t.bottom&&(o=r.top-t.top),Math.abs(o)<=Fn)return 0;let i=Gi(),l=i.scrollTop,s=Math.max(0,i.scrollHeight-i.clientHeight);return Ki(i,{top:Math.max(0,Math.min(s,l+o))}),i.scrollTop-l}function sp(e,t){let n=t;for(let r of ug(e)){if(Math.abs(n)<=Fn)break;let o=cg(r),i=Math.max(0,r.scrollHeight-r.clientHeight),l=r.scrollTop,s=Math.max(0,Math.min(i,l+n/o));Ki(r,{top:s}),n-=(r.scrollTop-l)*o}return t-n}function up(e,t){let n=e.getBoundingClientRect(),r=(n.top+n.bottom)/2,o=t.bottom-t.top,i=t.top+o*lp,l=t.bottom-o*lp;return rl?r-l:0}var Yt=({html:e,className:t})=>(0,a.jsx)("div",{className:t,dangerouslySetInnerHTML:{__html:e}});function Np(e,t){e.setAttribute("preserveAspectRatio","xMinYMin meet"),t&&(e.setAttribute("viewBox",`${t.x} ${t.y} ${t.width} ${t.height}`),e.setAttribute("width",`${t.width}px`),e.setAttribute("height",`${t.height}px`),e.dataset.tileIndex=String(t.index),e.dataset.tileRow=String(t.row),e.dataset.tileColumn=String(t.column))}function pg(e){return e.normalize("NFKD").replace(/[\u0300-\u036f]/g,"").toLowerCase().replace(/[^a-z0-9_.:-]+/g,"-").replace(/^-+|-+$/g,"").slice(0,120)||"uml-element"}function gs(e){let t=e;if(typeof t.getBBox!="function")return null;try{let n=t.getBBox();return[n.x,n.y,n.width,n.height].every(Number.isFinite)?{x:n.x,y:n.y,width:n.width,height:n.height}:null}catch{return null}}function mg(e){let t=gs(e);if(!t)return null;let n=Number(e.dataset.umlLayoutOriginX),r=Number(e.dataset.umlLayoutOriginY),o=Number(e.dataset.umlLayoutDx),i=Number(e.dataset.umlLayoutDy),l=Number(e.dataset.umlLayoutSx),s=Number(e.dataset.umlLayoutSy);return[n,r,o,i,l,s].every(Number.isFinite)?{x:n+(t.x-n)*l+o,y:r+(t.y-r)*s+i,width:t.width*l,height:t.height*s}:t}function Ep(e){e.dataset.umlLayoutRemembered!=="true"&&(e.dataset.umlLayoutRemembered="true",e.dataset.umlLayoutOriginalTransform=e.getAttribute("transform")??"",e.dataset.umlLayoutOriginalVisibility=e.getAttribute("visibility")??"",e.dataset.umlLayoutOriginalStyle=e.getAttribute("style")??"",e instanceof SVGTextElement&&(e.dataset.umlLayoutOriginalText=e.textContent??"",e.dataset.umlLayoutOriginalX=e.getAttribute("x")??"",e.dataset.umlLayoutOriginalTextAnchor=e.getAttribute("text-anchor")??"",e.dataset.umlLayoutOriginalFontFamily=e.getAttribute("font-family")??"",e.dataset.umlLayoutOriginalFontSize=e.getAttribute("font-size")??"",e.dataset.umlLayoutOriginalFontWeight=e.getAttribute("font-weight")??""),e instanceof SVGRectElement&&(e.dataset.umlLayoutOriginalFill=e.getAttribute("fill")??"",e.dataset.umlLayoutOriginalStroke=e.getAttribute("stroke")??"",e.dataset.umlLayoutOriginalStrokeWidth=e.getAttribute("stroke-width")??""))}function fg(e){e.querySelectorAll(".uml-layout-hit,.uml-layout-resize,.uml-layout-generated").forEach(t=>t.remove()),e.querySelectorAll("[data-uml-layout-remembered='true']").forEach(t=>{let n=(r,o)=>{o?t.setAttribute(r,o):t.removeAttribute(r)};n("transform",t.dataset.umlLayoutOriginalTransform),n("visibility",t.dataset.umlLayoutOriginalVisibility),n("style",t.dataset.umlLayoutOriginalStyle),t instanceof SVGTextElement&&(t.textContent=t.dataset.umlLayoutOriginalText??"",n("x",t.dataset.umlLayoutOriginalX),n("text-anchor",t.dataset.umlLayoutOriginalTextAnchor),n("font-family",t.dataset.umlLayoutOriginalFontFamily),n("font-size",t.dataset.umlLayoutOriginalFontSize),n("font-weight",t.dataset.umlLayoutOriginalFontWeight)),t instanceof SVGRectElement&&(n("fill",t.dataset.umlLayoutOriginalFill),n("stroke",t.dataset.umlLayoutOriginalStroke),n("stroke-width",t.dataset.umlLayoutOriginalStrokeWidth)),delete t.dataset.umlLayoutOriginX,delete t.dataset.umlLayoutOriginY,delete t.dataset.umlLayoutDx,delete t.dataset.umlLayoutDy,delete t.dataset.umlLayoutSx,delete t.dataset.umlLayoutSy,delete t.dataset.umlLayoutId})}function gg(e,t){let n=e.querySelector(":scope > g")??e,r=Array.from(n.children).filter(s=>s instanceof SVGElement),o=r.filter(s=>s instanceof SVGRectElement).map(s=>({rect:s,box:gs(s)})).filter(s=>!!(s.box&&s.box.width>=30&&s.box.height>=14)).sort((s,u)=>s.box.width*s.box.height-u.box.width*u.box.height),i=new Map;for(let s of r){let u=gs(s);if(!u)continue;let d=u.x+u.width/2,m=u.y+u.height/2,y=o.find(({box:g})=>d>=g.x-.5&&d<=g.x+g.width+.5&&m>=g.y-.5&&m<=g.y+g.height+.5);y&&i.set(s,y.rect)}let l=new Set;return o.map(({rect:s,box:u},d)=>{let m=r.filter(c=>i.get(c)===s);m.includes(s)||m.unshift(s);let y=m.filter(c=>c instanceof SVGTextElement).sort((c,h)=>Number(c.getAttribute("y"))-Number(h.getAttribute("y"))),g=(y[0]?.textContent??s.id??`element-${d+1}`).trim(),f=/^(\d{1,3})\b/.exec(g)?.[1]?.padStart(2,"0"),E=s.id||(f?t.get(f):"")||g,b=pg(E),_=b,p=2;for(;l.has(_);)_=`${b}-${p++}`;return l.add(_),m.forEach(Ep),{id:_,box:u,rect:s,members:m,texts:y}})}function po(e){let t=e.texts[0],n=e.rect.getAttribute("style")??"",r=i=>new RegExp(`${i}\\s*:\\s*([^;]+)`,"i").exec(n)?.[1]?.trim(),o=Number(t?.getAttribute("font-size")??12);return{...e.box,z:0,scale:1,rotation:0,text:{title:(e.texts[0]?.textContent??"").trim(),description:e.texts.slice(1).map(i=>(i.textContent??"").trim()).join(` +`),lines:e.texts.map(i=>(i.textContent??"").trim()),font_family:t?.getAttribute("font-family")??"Monospace",font_size:Number.isFinite(o)?o:12,font_weight:Number(t?.getAttribute("font-weight")??400)||400,align:"left"},style:{fill:e.rect.getAttribute("fill")??r("fill")??"#edf6fa",stroke:e.rect.getAttribute("stroke")??r("stroke")??"#2c7794",stroke_width:Number(e.rect.getAttribute("stroke-width")??r("stroke-width")??1.5)}}}function hg(e,t){let n=Math.max(12,Number(t.width)||e.box.width),r=Math.max(12,Number(t.height)||e.box.height),o=Number.isFinite(Number(t.x))?Number(t.x):e.box.x,i=Number.isFinite(Number(t.y))?Number(t.y):e.box.y,l=n/Math.max(1,e.box.width),s=r/Math.max(1,e.box.height),u=o-e.box.x,d=i-e.box.y,m=`translate(${u} ${d}) translate(${e.box.x} ${e.box.y}) scale(${l} ${s}) translate(${-e.box.x} ${-e.box.y})`;e.members.forEach(f=>{Ep(f);let E=f.dataset.umlLayoutOriginalTransform??"";f.setAttribute("transform",`${m}${E?` ${E}`:""}`),f.dataset.umlLayoutOriginX=String(e.box.x),f.dataset.umlLayoutOriginY=String(e.box.y),f.dataset.umlLayoutDx=String(u),f.dataset.umlLayoutDy=String(d),f.dataset.umlLayoutSx=String(l),f.dataset.umlLayoutSy=String(s),f.dataset.umlLayoutId=e.id});let y=t.text??{},g=y.lines??[y.title??"",...y.description?y.description.split(` +`):[]];e.texts.forEach((f,E)=>{E(e.tile?.page_height??0)?"landscape":"portrait",scale:1},elements:{},relations:{}}}function hs(e){if(!e)return{};let t=e.column===1&&e.columns>1?e.page_width-e.width:e.column===e.columns?0:Math.max(0,(e.page_width-e.width)/2),n=e.row===1&&e.rows>1?e.page_height-e.height:e.row===e.rows?0:Math.max(0,(e.page_height-e.height)/2);return{"--uml-tile-page-width":`${e.page_width}px`,"--uml-tile-page-height":`${e.page_height}px`,"--uml-tile-left":`${t}px`,"--uml-tile-top":`${n}px`}}function yg({html:e}){return(0,a.jsx)(Yt,{html:e})}function vg(e){let t=e.spread_count??1;if(t<=1)return null;let n=Math.max(1,Math.min(t,e.spread_index??1)),r=Math.max(1,Math.min(t,e.spread_columns??1)),o=n-1,i=Math.floor(o/r),l=o%r;return{left:l>0,right:l+10,down:n+r<=t,index:n,count:t}}function _p({continuation:e}){if(!e)return null;let t=[e.left&&["left","\u2190","kontynuacja po lewej"],e.up&&["up","\u2191","kontynuacja powy\u017Cej"],e.down&&["down","\u2193","kontynuacja poni\u017Cej"],e.right&&["right","\u2192","kontynuacja po prawej"]].filter(Boolean);return(0,a.jsx)("span",{className:"uml-page-continuation","aria-label":`Logiczny diagram: strona ${e.index} z ${e.count}`,title:`Ten sam diagram \xB7 strona ${e.index}/${e.count}`,children:t.map(([n,r,o])=>(0,a.jsx)("i",{"data-direction":n,"aria-label":o,children:r},n))})}function cp({side:e,html:t}){return(0,a.jsx)("aside",{className:`pdf-margin ${e}`,dangerouslySetInnerHTML:{__html:t}})}function ys({header:e,left:t="",right:n="",children:r,className:o=""}){return(0,a.jsx)("article",{className:`sheet ${o}`,children:(0,a.jsxs)("div",{className:"sheet-content",children:[(0,a.jsx)(yg,{html:e}),(0,a.jsx)(cp,{side:"left",html:t}),(0,a.jsx)("section",{className:"pdf-main card-section",children:r}),(0,a.jsx)(cp,{side:"right",html:n})]})})}function xg({viewpoints:e}){let t=e.filter(i=>i.status==="enabled"&&i.target_id),[n,r]=(0,N.useState)(t[0]?.id??"");(0,N.useEffect)(()=>{if(!t.length)return;let i=0,l=()=>{window.cancelAnimationFrame(i),i=window.requestAnimationFrame(()=>{let s=document.querySelector(".viewer-chrome")?.getBoundingClientRect().bottom??0,u=t.map(m=>({viewpoint:m,element:document.getElementById(m.target_id)})).filter(m=>!!m.element);if(!u.length)return;let d=u.reduce((m,y)=>{let g=Math.abs(y.element.getBoundingClientRect().top-s-18);return g{window.cancelAnimationFrame(i),window.removeEventListener("scroll",l),window.removeEventListener("resize",l)}},[e]);let o=i=>{if(i.status!=="enabled"||!i.target_id)return;let l=document.getElementById(i.target_id);if(!l)return;let u=document.querySelector(".viewer-chrome")?.getBoundingClientRect().height??0;r(i.id),window.scrollTo({top:Math.max(0,window.scrollY+l.getBoundingClientRect().top-u-8),behavior:"smooth"})};return(0,a.jsx)("nav",{className:"viewpoint-bar","aria-label":"Perspektywy architektury A1\u2013A8",children:e.map(i=>{let l=i.status==="unavailable";return(0,a.jsxs)("button",{type:"button",className:l?"is-unavailable":"","aria-current":!l&&n===i.id?"location":void 0,disabled:l,title:l?i.reason:i.subtitle,onClick:()=>o(i),children:[(0,a.jsx)("span",{children:i.id}),(0,a.jsx)("strong",{children:i.label}),l&&(0,a.jsx)("small",{children:"N/D"})]},i.id)})})}function bg({toc:e,libraryAvailable:t,libraryOpen:n,setLibraryOpen:r,scale:o,setScale:i,nvimVisible:l,setNvimVisible:s,nvimSyncMode:u,setNvimSyncMode:d,nvimControlMode:m,setNvimControlMode:y,nvimExpanded:g,setNvimExpanded:f,nvimFit:E,setNvimFit:b,allocatorVisible:_,setAllocatorVisible:p,hasAllocatorModel:c,diagramSpread:h,setDiagramSpread:k,hasDiagramSpread:C,nvimSummary:P,progress:T,progressError:R}){return(0,a.jsx)("nav",{className:"topbar",children:(0,a.jsxs)("div",{className:"topbar-inner",children:[t&&(0,a.jsxs)("button",{type:"button",className:`card-library-toggle${n?" is-active":""}`,"aria-controls":"side-panel-left-library","aria-expanded":n,"aria-label":n?"Alt+0: zamknij serie i karty":"Alt+0: poka\u017C serie i karty",title:n?"Alt+0 \xB7 Zamknij serie i karty":"Alt+0 \xB7 Serie i karty",onClick:()=>r(!n),children:[(0,a.jsx)("span",{"aria-hidden":"true",className:"card-library-toggle-icon",children:"\u2630"}),(0,a.jsx)("kbd",{children:"A0"}),(0,a.jsx)("span",{children:"KARTY"})]}),(0,a.jsxs)("details",{children:[(0,a.jsx)("summary",{children:"Spis tre\u015Bci"}),(0,a.jsx)("div",{className:"toc-links",children:e.map(j=>(0,a.jsx)("a",{href:`#${j.id}`,children:j.label},j.id))})]}),(0,a.jsxs)("div",{className:"topbar-nvim-section","aria-label":"Panel Neovima",children:[(0,a.jsx)("span",{className:"nvim-toolbar-boundary","aria-hidden":"true",children:"|"}),(0,a.jsx)("span",{className:"nvim-toolbar-context",children:"NVIM"}),(0,a.jsxs)("div",{className:"nvim-toolbar-actions","aria-label":"Narz\u0119dzia okna Neovima",children:[(0,a.jsxs)("button",{className:"viewer-nvim-toggle nvim-toolbar-button","aria-label":l?"Alt+1: ukryj Neovim":"Alt+1: poka\u017C Neovim",title:l?"Alt+1 \xB7 Ukryj Neovim":"Alt+1 \xB7 Poka\u017C Neovim","aria-pressed":l,onClick:()=>s(!l),children:[(0,a.jsx)("kbd",{className:"nvim-toolbar-key",children:"A1"}),(0,a.jsx)("span",{className:"nvim-toolbar-label",children:"PANEL"})]}),(0,a.jsxs)("button",{type:"button",className:`nvim-control-indicator nvim-toolbar-button${P.syncMode?" is-active":""}${P.syncReady?" is-engaged":""}`,"aria-label":`Alt+2: synchronizacja ${u?"w\u0142\u0105czona":"wy\u0142\u0105czona"}`,title:`Alt+2 \xB7 SYNC ${u?"ON":"OFF"}`,"aria-pressed":u,onClick:()=>d(!u),children:[(0,a.jsx)("kbd",{className:"nvim-toolbar-key",children:"A2"}),(0,a.jsx)("span",{className:"nvim-toolbar-label",children:"SYNC"})]}),(0,a.jsxs)("button",{type:"button",className:`nvim-work-indicator nvim-toolbar-button${m?" is-active":""}${P.controlEnabled?" is-engaged":""}`,"aria-label":`Alt+3: sterowanie ${u?m?"w\u0142\u0105czone":"wy\u0142\u0105czone":"niedost\u0119pne"}`,title:u?`Alt+3 \xB7 Sterowanie ${m?"ON":"OFF"}`:"Alt+3 \xB7 Sterowanie wymaga SYNC ON","aria-pressed":m,disabled:!u,onClick:()=>y(!m),children:[(0,a.jsx)("kbd",{className:"nvim-toolbar-key",children:"A3"}),(0,a.jsx)("span",{className:"nvim-toolbar-label",children:"CTRL"})]}),(0,a.jsxs)("button",{type:"button",className:`nvim-height-toggle nvim-toolbar-button${g?" is-active":""}`,"aria-label":`Alt+4: ${g?"przywr\xF3\u0107 normaln\u0105 wysoko\u015B\u0107":"ustaw wysoki panel"}`,title:g?"Alt+4 \xB7 Normalna wysoko\u015B\u0107":"Alt+4 \xB7 Wysoki panel 90%","aria-pressed":g,onClick:()=>f(!g),children:[(0,a.jsx)("kbd",{className:"nvim-toolbar-key",children:"A4"}),(0,a.jsx)("span",{className:"nvim-toolbar-label",children:"HIGH"})]}),(0,a.jsxs)("button",{type:"button",className:`nvim-height-toggle nvim-toolbar-button${E?" is-active":""}`,"aria-label":`Alt+5: automatyczne dopasowanie ${E?"w\u0142\u0105czone":"wy\u0142\u0105czone"}`,title:E?"Alt+5 \xB7 Wy\u0142\u0105cz auto-fit":"Alt+5 \xB7 Poka\u017C ca\u0142y Neovim","aria-pressed":E,onClick:()=>b(!E),children:[(0,a.jsx)("kbd",{className:"nvim-toolbar-key",children:"A5"}),(0,a.jsx)("span",{className:"nvim-toolbar-label",children:"FIT"})]}),c&&(0,a.jsxs)("button",{type:"button",className:`nvim-height-toggle nvim-toolbar-button${_?" is-active":""}`,"aria-label":`Alt+6: model alokatora ${_?"przypi\u0119ty":"ukryty"}`,title:_?"Alt+6 \xB7 Ukryj model alokatora":"Alt+6 \xB7 Przypnij model alokatora","aria-pressed":_,onClick:()=>p(!_),children:[(0,a.jsx)("kbd",{className:"nvim-toolbar-key",children:"A6"}),(0,a.jsx)("span",{className:"nvim-toolbar-label",children:"MODEL"})]}),C&&(0,a.jsxs)("button",{type:"button",className:`nvim-height-toggle nvim-toolbar-button${h?" is-active":""}`,"aria-label":`Alt+7: diagram UML ${h?"jako osobne kartki A4":"jako po\u0142\u0105czony spread"}`,title:h?"Alt+7 \xB7 Osobne kartki A4":"Alt+7 \xB7 Po\u0142\u0105cz strony UML","aria-pressed":h,onClick:()=>k(!h),children:[(0,a.jsx)("kbd",{className:"nvim-toolbar-key",children:"A7"}),(0,a.jsx)("span",{className:"nvim-toolbar-label",children:"UML"})]})]}),(0,a.jsx)("span",{className:"nvim-toolbar-boundary","aria-hidden":"true",children:"|"}),l&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("span",{className:`nvim-status nvim-status--${P.state}`,children:wp[P.state]}),(0,a.jsxs)("span",{className:"topbar-nvim-meta",title:P.message,children:[(0,a.jsx)("strong",{children:P.instance??"Neovim MCP"}),P.detail&&(0,a.jsx)("small",{children:P.detail})]}),(0,a.jsxs)("span",{className:"nvim-shortcut-strip","aria-label":"Skr\xF3ty panelu Neovima",children:[(0,a.jsx)("kbd",{children:"F1"})," reset \xB7 ",(0,a.jsx)("kbd",{children:"F2"})," sync \xB7 ",(0,a.jsx)("kbd",{children:"Alt+W"})," okna \xB7 ",(0,a.jsx)("kbd",{children:"F12"})," skr\xF3ty"]})]})]}),(0,a.jsx)(Gg,{progress:T,error:R}),(0,a.jsxs)("div",{className:"viewer-zoom-controls",children:[(0,a.jsxs)("output",{className:"viewer-zoom-status",children:["P\u0142\xF3tno ",Math.round(o*100),"% \xB7 Tre\u015B\u0107 100%"]}),(0,a.jsx)("button",{className:"viewer-zoom-reset",onClick:()=>i(2.18),children:"Reset zoom"})]})]})})}function dp(e,t){for(let n of e.sections)for(let r of n.assets){let o=r.interactive;if(!(o?.kind!=="uml-sequence"||!o.phases?.length)&&!(t?.task.id&&o.task?.id!==t.task.id)&&!(t?.block.id&&o.block?.id!==t.block.id))for(let i of o.phases){if(t?.phase.id&&i.id!==t.phase.id)continue;let l=t?.step.id?i.steps.find(s=>s.id===t.step.id):i.steps[0];if(l)return{task:o.task??null,block:o.block??null,phase:{id:i.id,label:i.label},step:l,focusLevel:t?.focus_level??"step",activate:!1}}}return null}function wg({visible:e,model:t}){let[n,r]=(0,N.useState)(null);if((0,N.useEffect)(()=>{let g=f=>{r(f.detail??null)};return window.addEventListener("stem:nvim-step",g),r(dp(t)),fetch("/api/navigation/current",{cache:"no-store"}).then(f=>f.ok?f.json():Promise.reject()).then(f=>{let E=dp(t,f.current??null);E&&r(E)}).catch(()=>{}),()=>window.removeEventListener("stem:nvim-step",g)},[t]),!e)return null;let o=n?.focusLevel??"card",i=n?.step.snapshot?.memory.arena,l=!!(n&&o!=="card"&&o!=="task"),s=Math.max(1,Number(i?.size_bytes??64)),u=i?.offset==null?null:Math.max(0,Math.min(s,Number(i.offset))),d=i?.bytes.trim().split(/\s+/).filter(Boolean)??[],m=Math.min(s,64),y=n?[...(n.step.snapshot?.memory.items??[]).map(g=>({name:g.name,value:g.value})),...(n.step.snapshot?.frame.fields??[]).map(g=>({name:g.name,value:g.value}))].filter((g,f,E)=>E.findIndex(b=>b.name===g.name)===f).slice(0,8):[];return(0,a.jsxs)("section",{className:"allocator-panel","aria-label":"Przypi\u0119ty model alokatora",children:[(0,a.jsxs)("header",{children:[(0,a.jsx)("span",{children:"ALLOCATOR \xB7 PINNED"}),(0,a.jsx)("strong",{children:n?`${n.phase.label} \xB7 ${String(n.step.number).padStart(2,"0")} ${n.step.label}`:"Oczekiwanie na diagram UML"}),(0,a.jsx)("small",{children:l?n.step.snapshot?.description??n.step.description:"Wybierz co najmniej BLOCK. F2 wybierze jego pierwszy krok i wykona synchronizacj\u0119."})]}),(0,a.jsxs)("div",{className:"allocator-panel-body",children:[(0,a.jsxs)("dl",{className:"allocator-metrics",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("dt",{children:"FOCUS"}),(0,a.jsx)("dd",{children:o.toUpperCase()})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("dt",{children:"BASE"}),(0,a.jsx)("dd",{children:i?.base??"\u2014"})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("dt",{children:"ALLOCP"}),(0,a.jsx)("dd",{children:i?.cursor??"\u2014"})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("dt",{children:"USED / FREE"}),(0,a.jsx)("dd",{children:u==null?"\u2014":`${u} / ${s-u} B`})]})]}),(0,a.jsxs)("div",{className:`allocator-arena-view${l?"":" is-inactive"}`,children:[(0,a.jsxs)("div",{className:"allocator-arena-labels",children:[(0,a.jsx)("span",{children:"allocbuf[0]"}),(0,a.jsx)("strong",{children:u==null?"allocp jeszcze nieustawiony":`offset ${u}`}),(0,a.jsxs)("span",{children:["allocbuf[",s-1,"]"]})]}),(0,a.jsxs)("div",{className:"allocator-pinned-arena",style:{"--allocator-size":m},children:[Array.from({length:m},(g,f)=>(0,a.jsx)("i",{className:u!=null&&f(0,a.jsxs)("div",{children:[(0,a.jsx)("span",{children:g.name}),(0,a.jsx)("code",{children:g.value})]},g.name)):(0,a.jsx)("p",{children:"Brak snapshotu."})})]})]})}var Wi=()=>({text:" ",highlight:0});function pp(e=1,t=1){return{width:e,height:t,cells:Array.from({length:t},()=>Array.from({length:e},Wi)),highlights:new Map,foreground:15263976,background:1053461,cursor:{row:0,column:0}}}function kg(e,t,n){if(t<=0||n<=0)return;let r=e.cells;e.width=t,e.height=n,e.cells=Array.from({length:n},(o,i)=>Array.from({length:t},(l,s)=>r[i]?.[s]??Wi()))}function Cp(e){return`stem-card:nvim-grid:${e}`}function Sg(e,t){if(t.width<=1||t.height<=1)return;let n={schema:"stem-nvim-grid.v1",snapshot_ref:e,saved_at:new Date().toISOString(),width:t.width,height:t.height,cells:t.cells.map(r=>r.map(o=>[o.text,o.highlight])),highlights:Array.from(t.highlights.entries()),foreground:t.foreground,background:t.background,cursor:{...t.cursor}};try{localStorage.setItem(Cp(e),JSON.stringify(n))}catch{}}function Lp(e,t){try{return e?.schema!=="stem-nvim-grid.v1"||e.snapshot_ref!==t||!Number.isInteger(e.width)||!Number.isInteger(e.height)||e.width<2||e.height<2||e.width>400||e.height>200||e.cells.length!==e.height?null:{width:e.width,height:e.height,cells:e.cells.map(n=>n.map(([r,o])=>({text:typeof r=="string"?r:" ",highlight:Number.isInteger(o)?o:0}))),highlights:new Map(e.highlights),foreground:e.foreground,background:e.background,cursor:e.cursor}}catch{return null}}function Ng(e){try{return Lp(JSON.parse(localStorage.getItem(Cp(e))??"null"),e)}catch{return null}}async function mp(e){let t=e.snapshot_ref;if(!t)return null;let n=Ng(t);if(n)return n;let r=e.view?.recorded_grid_ref;if(!r||/^(?:[a-z]+:|\/\/)/i.test(r))return null;try{let o=await fetch(r,{cache:"no-store"});return o.ok?Lp(await o.json(),t):null}catch{return null}}var Eg=[1842207,12590120,3064446,16106001,1997028,9978299,702940,12631996,6184036,15545147,5759881,16311388,5349887,12607947,5231357,16184820];function go(e){let t=Number(e);if(!Number.isInteger(t)||t<0||t>255)return;if(t<16)return Eg[t];if(t<232){let r=t-16,o=[0,95,135,175,215,255],i=o[Math.floor(r/36)],l=o[Math.floor(r%36/6)],s=o[r%6];return i<<16|l<<8|s}let n=8+(t-232)*10;return n<<16|n<<8|n}function _g(e){if(!e||typeof e!="object")return null;let t=e;return Object.keys(t).length?{...t,foreground:go(t.foreground),background:go(t.background),special:go(t.special)}:null}function Cg(e){if(!e||typeof e!="object")return null;let t=e;return Object.keys(t).length?{...t}:null}function Lg(e,t){for(let n of t){if(!Array.isArray(n)||typeof n[0]!="string")continue;let r=n[0],o=n.slice(1);for(let i of o)if(Array.isArray(i)){if(r==="grid_resize"){let[l,s,u]=i.map(Number);l===1&&kg(e,s,u)}else if(r==="default_colors_set"){let l=Number(i[0]),s=Number(i[1]),u=l>=0?l:go(i[3]),d=s>=0?s:go(i[4]);typeof u=="number"&&Number.isFinite(u)&&u>=0&&(e.foreground=u),typeof d=="number"&&Number.isFinite(d)&&d>=0&&(e.background=d)}else if(r==="hl_attr_define"){let l=Number(i[0]),s=_g(i[2])??Cg(i[1]);Number.isInteger(l)&&s&&typeof s=="object"&&e.highlights.set(l,s)}else if(r==="grid_clear"&&Number(i[0])===1)e.cells=Array.from({length:e.height},()=>Array.from({length:e.width},Wi));else if(r==="grid_cursor_goto"&&Number(i[0])===1)e.cursor={row:Number(i[1]),column:Number(i[2])};else if(r==="grid_line"&&Number(i[0])===1){let l=Number(i[1]),s=Number(i[2]),u=i[3];if(!e.cells[l]||!Array.isArray(u))continue;let d=0;for(let m of u){if(!Array.isArray(m))continue;let y=typeof m[0]=="string"?m[0]:" ";Number.isInteger(m[1])&&(d=Number(m[1]));let g=Number.isInteger(m[2])?Number(m[2]):1;for(let f=0;f=0&&(e.cells[l][s]={text:y,highlight:d}),s+=1}}else if(r==="grid_scroll"&&Number(i[0])===1){let l=Number(i[1]),s=Number(i[2]),u=Number(i[3]),d=Number(i[4]),m=Number(i[5]),y=Number(i[6]),g=e.cells.map(f=>f.map(E=>({...E})));for(let f=l;f=l&&b=u&&_i.text||" ").join(""),r=[],o=0;for(;o=n&&t.cursor.rowR.column-T.column||T.row-R.row):["asm","reg","memory"].includes(C??"")&&k.sort((T,R)=>T.column-R.column||T.row-R.row);let P=k[Math.max(0,Number(d.occurrence??1)-1)];m=P?.row??-1,y=P?.column??-1,f=d.text.length}if(m<0||y<0||m>=t.height||y>=t.width)continue;let E=Math.max(0,Number(d.padding_cells??1)),b=Math.max(0,y-E)*i,_=Math.max(0,m-E)*l,p=Math.min(t.width-y+E,f+E*2)*i,c=Math.min(t.height-m+E,g+E*2)*l,h=s[u.tone??"danger"];if(o.strokeStyle=h,o.lineWidth=2,u.shape==="underline"?(o.beginPath(),o.moveTo(b,_+c-2),o.lineTo(b+p,_+c-2),o.stroke()):o.strokeRect(b+1,_+1,Math.max(1,p-2),Math.max(1,c-2)),u.label){o.font="700 10px system-ui, sans-serif";let k=o.measureText(u.label).width+8;o.fillStyle=h,o.fillRect(b+1,Math.max(0,_-15),k,14),o.fillStyle="#fff",o.fillText(u.label,b+5,Math.max(10,_-4))}}}function Tg(e){if(e.nativeEvent.isComposing||e.metaKey)return null;let n={Enter:"CR",Escape:"Esc",Backspace:"BS",Delete:"Del",Tab:"Tab",ArrowLeft:"Left",ArrowRight:"Right",ArrowUp:"Up",ArrowDown:"Down",Home:"Home",End:"End",PageUp:"PageUp",PageDown:"PageDown",Insert:"Insert"}[e.key]??(/^F\d{1,2}$/.test(e.key)?e.key:null),r=[e.ctrlKey?"C":"",e.altKey?"M":"",e.shiftKey&&n?"S":""].filter(Boolean).join("-");return n?`<${r?`${r}-`:""}${n}>`:e.key.length!==1?null:e.ctrlKey||e.altKey?`<${r}-${e.key==="<"?"lt":e.key}>`:e.key==="<"?"":e.key}function Mg({visible:e,syncMode:t,controlMode:n,expanded:r,fit:o,scale:i,onSummaryChange:l}){let s=(0,N.useRef)(null),u=(0,N.useRef)(null),d=(0,N.useRef)(null),m=(0,N.useRef)(0),y=(0,N.useRef)(0),g=(0,N.useRef)(0),f=(0,N.useRef)(pp()),E=(0,N.useRef)(null),b=(0,N.useRef)(null),_=(0,N.useRef)(null),p=(0,N.useRef)(0),c=(0,N.useRef)(null),h=(0,N.useRef)(null),[k,C]=(0,N.useState)(null),[P,T]=(0,N.useState)(!1),[R,j]=(0,N.useState)(0),[I,ke]=(0,N.useState)(!1),[re,G]=(0,N.useState)(()=>{let A=Number(localStorage.getItem("stem-card-nvim-height-vh"));return Number.isFinite(A)&&A>=25&&A<=90?A:75}),[U,Le]=(0,N.useState)({state:"hidden"}),[Ne,Q]=(0,N.useState)({state:"idle"}),et=Ne.state==="replaying"||Ne.state==="verifying",Ge=t&&U.state==="connected"&&!et,je=n&&I&&U.state==="connected"&&!et,me=()=>{s.current&&Pg(s.current,f.current,_.current===b.current?.step.snapshot_ref?b.current?.step.view?.annotations??[]:[])},Dn=()=>{m.current||(m.current=window.requestAnimationFrame(()=>{m.current=0,me()}))};if((0,N.useEffect)(()=>{let A=F=>{let B=F.detail;b.current=B,C(B),_.current=null;let te=B.step.snapshot_ref;if(U.state!=="connected"&&te&&mp(B.step).then(ie=>{!ie||b.current?.step.snapshot_ref!==te||(f.current=ie,T(!0),_.current=te,Q({state:"idle",snapshot_ref:te,message:"Pokazano ostatni zapisany, zweryfikowany ekran."}),me())}),me(),!B.activate)return;let at=B.step.mode??"RUN",zt=async()=>{if(!B.step.code_ref)return null;let ie=await fetch("/api/nvim/open",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({code_ref:B.step.code_ref,actor:document.documentElement.dataset.cardClientId??"browser"})}),q=await ie.json().catch(()=>({}));if(!ie.ok)throw new Error(q.message??q.error??`HTTP ${ie.status}`);return q};if(at==="CODE"||!te){zt().then(()=>{Q({state:"ready",phase:"code",message:B.step.code_ref?`Otwarto ${B.step.code_ref}; program nie zosta\u0142 zrestartowany.`:"Krok CODE nie ma przypisanego code_ref."})}).catch(ie=>{Q({state:"failed",phase:"code",message:ie instanceof Error?ie.message:String(ie)})});return}if(!e||U.state!=="connected"){Q({state:"failed",snapshot_ref:te,message:"Cel jest offline; pozostaje zapisany wynik tego kroku."});return}let Ee=zt(),ne=Math.max(p.current+1,Date.now());p.current=ne,c.current?.abort();let st=new AbortController;c.current=st,Q({state:"replaying",phase:"dispatch",generation:ne,snapshot_ref:te,message:"Resetuj\u0119 cel i odtwarzam wykonanie do wybranego kroku."});let Ye=0,wn=async()=>{try{let ie=await fetch("/api/checkpoint/status",{cache:"no-store",signal:st.signal});if(!ie.ok)return;let q=await ie.json(),bt=q.active?.generation===ne?q.active:null;if(!bt||p.current!==ne)return;Q({state:bt.phase==="verify"?"verifying":"replaying",phase:bt.phase,generation:ne,snapshot_ref:te,message:bt.message})}catch{}};Ye=window.setInterval(wn,120),wn(),Ee.then(()=>fetch("/api/checkpoint/activate",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({snapshot_ref:te,generation:ne}),signal:st.signal})).then(async ie=>{let q=await ie.json();if(p.current!==ne)return;if(!ie.ok||q.status!=="ready")throw new Error(q.message??`Replay zako\u0144czy\u0142 si\u0119 kodem HTTP ${ie.status}.`);let bt=d.current;if(bt?.readyState!==WebSocket.OPEN)throw new Error("Replay zako\u0144czony, ale most Neovima jest offline.");let fe=y.current;bt.send(JSON.stringify({type:"refresh"}));let Qt=Date.now()+1800;for(;y.current<=fe&&Date.now()window.setTimeout(qt,20));if(y.current<=fe)throw new Error("Neovim nie potwierdzi\u0142 pe\u0142nego redraw po replay.");if(p.current!==ne)return;_.current=te,Q({state:"ready",phase:q.phase,generation:ne,snapshot_ref:te,message:q.message??"Stan maszyny zosta\u0142 odtworzony i zweryfikowany."}),Sg(te,f.current),me(),await new Promise(qt=>window.requestAnimationFrame(()=>qt()));let jn=s.current;if(jn&&b.current?.step.snapshot_ref===te)try{fetch("/api/evidence",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({actor:document.documentElement.dataset.cardClientId??"browser",snapshot_ref:te,event_id:B.step.event_id??null,strategy_ref:B.step.strategy_ref??null,code_ref:B.step.code_ref??null,caption:`${String(B.step.number).padStart(2,"0")} ${B.step.label}`,data_url:jn.toDataURL("image/png")})}).catch(()=>{})}catch{}}).catch(ie=>{st.signal.aborted||p.current!==ne||(mp(B.step).then(q=>{!q||b.current?.step.snapshot_ref!==te||(f.current=q,T(!0),_.current=te,me())}),Q({state:"failed",generation:ne,snapshot_ref:te,message:ie instanceof Error?ie.message:String(ie)}))}).finally(()=>{window.clearInterval(Ye),c.current===st&&(c.current=null)})};return window.addEventListener("stem:nvim-step",A),()=>{window.removeEventListener("stem:nvim-step",A),c.current?.abort()}},[U.state,e]),(0,N.useEffect)(()=>{localStorage.setItem("stem-card-nvim-height-vh",re.toFixed(2))},[re]),(0,N.useEffect)(()=>{let A=window.requestAnimationFrame(me);return()=>window.cancelAnimationFrame(A)},[r,o,i]),(0,N.useEffect)(()=>{let A=()=>{let F=d.current;F?.readyState===WebSocket.OPEN&&F.send(JSON.stringify({type:"refresh"})),me()};return window.addEventListener("stem:nvim-refresh",A),()=>window.removeEventListener("stem:nvim-refresh",A)},[]),(0,N.useEffect)(()=>{let A=U.state;U.state==="connected"&&(A=Ne.state==="idle"?"connected":Ne.state),l({state:A,message:Ne.message??U.message,instance:U.target?.instance??U.target?.container_name,detail:[U.target?.profile??k?.step.view?.connection_ref,k?`${String(k.step.number).padStart(2,"0")} ${k.step.label}`:void 0,Ne.phase].filter(Boolean).join(" \xB7 "),syncMode:t,syncReady:Ge,controlMode:n,controlEnabled:je,screenCursor:{...f.current.cursor},grid:{columns:f.current.width,rows:f.current.height}})},[k,Ne,je,n,R,l,U,t,Ge]),(0,N.useEffect)(()=>()=>window.clearTimeout(g.current),[]),(0,N.useEffect)(()=>{if(!je)return;let A=F=>{let B=d.current;if(B?.readyState!==WebSocket.OPEN)return;if(F.altKey&&!F.ctrlKey&&!F.metaKey&&F.key.toLowerCase()==="w"){F.preventDefault(),F.stopImmediatePropagation(),F.repeat||B.send(JSON.stringify({type:"input",keys:""}));return}let te={ArrowLeft:"h",ArrowDown:"j",ArrowUp:"k",ArrowRight:"l"};F.altKey&&!F.ctrlKey&&!F.metaKey&&te[F.key]&&(F.preventDefault(),F.stopImmediatePropagation(),F.repeat||B.send(JSON.stringify({type:"input",keys:`${te[F.key]}`})))};return window.addEventListener("keydown",A,!0),()=>window.removeEventListener("keydown",A,!0)},[je]),(0,N.useEffect)(()=>{if(!e||!t){d.current?.close(),d.current=null,ke(!1),Le(e?{state:"offline",message:"SYNC OFF: pokazuj\u0119 zapisany ekran bez po\u0142\u0105czenia z kontenerem."}:{state:"hidden"});return}let A=!1,F=0,B=()=>{if(A)return;let te=window.location.protocol==="https:"?"wss:":"ws:",at=new WebSocket(`${te}//${window.location.host}/api/nvim-ui`);d.current=at,Le({state:"connecting"}),at.addEventListener("message",zt=>{try{let Ee=JSON.parse(String(zt.data));if(Ee.type==="status"){typeof Ee.epoch=="string"&&E.current&&E.current!==Ee.epoch&&(f.current=pp(),T(!1),_.current=null),typeof Ee.epoch=="string"&&(E.current=Ee.epoch),Le(Ee);return}Ee.type==="redraw"&&Array.isArray(Ee.events)&&(Lg(f.current,Ee.events),f.current.width>1&&f.current.height>1&&T(!0),Ee.events.some(ne=>Array.isArray(ne)&&ne[0]==="flush")&&(y.current+=1,Dn(),g.current||(g.current=window.setTimeout(()=>{g.current=0,j(ne=>ne+1)},120))))}catch{}}),at.addEventListener("close",()=>{d.current===at&&(d.current=null),A||(F=window.setTimeout(B,1200))}),at.addEventListener("error",()=>{Le(zt=>({...zt,state:"offline",message:"Most Neovima jest chwilowo niedost\u0119pny."}))})};return B(),()=>{A=!0,window.clearTimeout(F),window.cancelAnimationFrame(m.current),m.current=0,d.current?.close(),d.current=null}},[t,e]),!e)return null;let xe=A=>{let F=d.current;F?.readyState===WebSocket.OPEN&&F.send(JSON.stringify(A))},bn=A=>{let F=A.currentTarget.getBoundingClientRect();return{row:Math.max(0,Math.min(f.current.height-1,Math.floor((A.clientY-F.top)/F.height*f.current.height))),column:Math.max(0,Math.min(f.current.width-1,Math.floor((A.clientX-F.left)/F.width*f.current.width)))}},se=A=>[A.shiftKey?"S":"",A.ctrlKey?"C":"",A.altKey?"A":""].filter(Boolean).join("-");return(0,a.jsxs)("section",{className:"nvim-panel","aria-label":"Neovim po\u0142\u0105czony z kontenerem",onWheel:A=>{A.stopPropagation();let F=A.target;(!(F instanceof Element)||!F.closest(".nvim-screen-scroll"))&&A.preventDefault()},children:[(0,a.jsxs)("div",{ref:u,className:"nvim-screen-scroll",style:o?void 0:{height:`${r?90:re}vh`},"data-sync":t?"on":"off","data-control":je?"true":"false",tabIndex:0,onPointerEnter:A=>{ke(!0),A.currentTarget.focus({preventScroll:!0})},onPointerLeave:A=>{ke(!1),A.currentTarget.blur()},onMouseDown:A=>A.currentTarget.focus({preventScroll:!0}),onKeyDown:A=>{if(!je)return;let F=Tg(A);F&&(A.preventDefault(),A.stopPropagation(),xe({type:"input",keys:F}))},children:[(0,a.jsx)("div",{className:"nvim-screen-stage",style:o?void 0:{height:`${(r?90:re)/Math.max(i,.25)}vh`},children:(0,a.jsx)("div",{className:"nvim-screen-surface",children:(0,a.jsx)("div",{className:"nvim-screen-frame",children:(0,a.jsx)("div",{className:"nvim-screen-content",children:(0,a.jsx)("div",{className:"nvim-screen-grid",children:(0,a.jsx)("canvas",{ref:s,className:"nvim-screen",tabIndex:-1,"aria-label":je?"Interaktywny ekran Neovima":"Ekran Neovima",onMouseDown:A=>{if(!je||U.state!=="connected")return;A.preventDefault();let F=bn(A),B=A.button===1?"middle":A.button===2?"right":"left";xe({type:"mouse",button:B,action:"press",modifier:se(A),...F})},onMouseUp:A=>{if(!je||U.state!=="connected")return;A.preventDefault();let F=bn(A),B=A.button===1?"middle":A.button===2?"right":"left";xe({type:"mouse",button:B,action:"release",modifier:se(A),...F})},onWheel:A=>{if(!je||U.state!=="connected")return;A.preventDefault();let F=bn(A);xe({type:"mouse",button:"wheel",action:A.deltaY<0?"up":"down",modifier:se(A),...F})},onContextMenu:A=>je&&A.preventDefault()})})})})})}),!P&&(0,a.jsxs)("div",{className:"nvim-screen-empty",children:[(0,a.jsx)("strong",{children:wp[U.state]}),(0,a.jsx)("span",{children:U.message??"Oczekiwanie na ekran Neovima lub zapisany stan kroku."})]})]}),(0,a.jsx)("div",{className:"nvim-resize-handle",role:"separator","aria-label":"Zmie\u0144 wysoko\u015B\u0107 panelu Neovima","aria-orientation":"horizontal","aria-valuemin":25,"aria-valuemax":90,"aria-valuenow":Math.round(re),tabIndex:0,title:"Przeci\u0105gnij, aby zmieni\u0107 wysoko\u015B\u0107. Dwuklik: 75%.",onPointerDown:A=>{A.preventDefault(),h.current={y:A.clientY,heightVh:re},A.currentTarget.setPointerCapture(A.pointerId)},onPointerMove:A=>{let F=h.current;if(!F)return;let B=(A.clientY-F.y)/window.innerHeight*100;G(Math.max(25,Math.min(90,F.heightVh+B)))},onPointerUp:A=>{h.current=null,A.currentTarget.hasPointerCapture(A.pointerId)&&A.currentTarget.releasePointerCapture(A.pointerId)},onPointerCancel:()=>{h.current=null},onDoubleClick:()=>G(75),onKeyDown:A=>{if(A.key==="ArrowUp"||A.key==="ArrowDown"){A.preventDefault();let F=A.key==="ArrowUp"?-2:2;G(B=>Math.max(25,Math.min(90,B+F)))}else A.key==="Home"&&(A.preventDefault(),G(75))}})]})}function Rg({column:e,row:t}){return e==="chapter"||e==="task"||e==="version"?(0,a.jsx)("td",{children:(0,a.jsx)("code",{children:t[e]})}):e==="idea"?(0,a.jsx)("td",{dangerouslySetInnerHTML:{__html:t.idea_html}}):e==="status"?(0,a.jsx)("td",{children:(0,a.jsx)("span",{className:"scope-status","data-status":t.status,title:t.status,children:t.status_label})}):(0,a.jsx)("td",{children:t[e]})}function Og({front:e}){let t=e.scope_columns??["chapter","task","idea","priority"];return(0,a.jsxs)(ys,{header:e.header_html,left:e.left_margin_html,right:e.right_margin_html,className:"front-sheet",children:[(0,a.jsxs)("section",{className:"front-scope front-goal",children:[(0,a.jsx)("h2",{children:e.goal_title}),(0,a.jsx)(Yt,{html:e.goal_html})]}),(0,a.jsxs)("section",{className:"front-scope front-card-scope",children:[(0,a.jsx)("h2",{children:e.scope_title}),e.scope_html&&(0,a.jsx)(Yt,{html:e.scope_html}),(0,a.jsx)("div",{className:"scope-table-wrap",children:(0,a.jsxs)("table",{className:"scope-table scope-table--task",children:[(0,a.jsx)("thead",{children:(0,a.jsx)("tr",{children:e.scope_headers.map(n=>(0,a.jsx)("th",{children:n},n))})}),(0,a.jsx)("tbody",{children:e.scope_rows.map(n=>(0,a.jsx)("tr",{className:n.key?"scope-row--key":"",children:t.map(r=>(0,a.jsx)(Rg,{column:r,row:n},r))},`${n.chapter}-${n.task}`))})]})})]})]})}function $g({taskRef:e,step:t}){return(0,a.jsxs)("li",{id:`${e}-${t.id}`,children:[(0,a.jsx)("strong",{children:t.title}),(0,a.jsx)(Yt,{html:t.content_html})]})}function Ig({taskRef:e,block:t}){let n=t.kind==="exercise"?"\u0106wiczenie":"Block";return(0,a.jsxs)("section",{className:`task-block task-block--${t.kind}`,id:`${e}-${t.id}`,"data-stem-nav":"block",children:[(0,a.jsxs)("header",{children:[(0,a.jsx)("span",{children:n}),(0,a.jsx)("h4",{children:t.title})]}),(0,a.jsx)(Yt,{html:t.content_html}),t.steps.length>0&&(0,a.jsx)("ol",{className:"block-steps",children:t.steps.map(r=>(0,a.jsx)($g,{taskRef:e,step:r},r.id))})]})}function Fg({task:e}){return e.flow.length?(0,a.jsxs)("article",{className:"task-flow",id:e.ref,"data-stem-nav":"task",children:[(0,a.jsxs)("header",{className:"task-flow-header",children:[(0,a.jsx)("span",{children:e.ref.toUpperCase()}),(0,a.jsx)("h3",{children:e.title}),e.uuid&&(0,a.jsx)("code",{children:e.uuid})]}),e.flow.map(t=>(0,a.jsx)(Ig,{taskRef:e.ref,block:t},t.id)),(0,a.jsxs)("footer",{children:[(0,a.jsx)("strong",{children:"Task acceptance:"})," ",e.criterion]})]}):(0,a.jsxs)("article",{className:"task-legacy",id:e.ref,"data-stem-nav":"task",children:[(0,a.jsx)("strong",{children:e.ref.toUpperCase()}),(0,a.jsx)(Yt,{html:e.prompt_html??""}),(0,a.jsxs)("footer",{children:[(0,a.jsx)("strong",{children:"Task acceptance:"})," ",e.criterion]})]})}var fp={compile:"KOMPILACJA",bss:".BSS",stack:"STOS",registers:"REJESTRY",text:".TEXT"},gp=["#9bcfe2","#c4dfc0","#f4c889","#d2b6dc"];function Dg({config:e,title:t}){let n=e.arena_size??64,r=e.allocations??[5,7],o=e.symbols??[],i=`${e.storage_key??"allocator-memory-flow"}-stage`,[l,s]=(0,N.useState)(()=>Math.min(r.length,Number(localStorage.getItem(i)??0))),[u,d]=(0,N.useState)(o[0]?.id??"");(0,N.useEffect)(()=>localStorage.setItem(i,String(l)),[l,i]);let m=r.slice(0,l).reduce((_,p)=>_+p,0),y=o.find(_=>_.id===u)??o[0],g=Array.from({length:n},(_,p)=>p),f=_=>{let p=0;for(let c=0;co.some(p=>p.area===_));return(0,a.jsxs)("div",{className:"memory-react","aria-label":`Interaktywny diagram: ${t}`,children:[(0,a.jsxs)("header",{children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("small",{children:"INTERAKTYWNY MODEL PAMI\u0118CI"}),(0,a.jsx)("h3",{children:t})]}),(0,a.jsxs)("div",{className:"memory-actions",children:[(0,a.jsx)("button",{"aria-pressed":l===0,onClick:()=>s(0),children:"definicje / reset"}),r.map((_,p)=>(0,a.jsxs)("button",{"aria-pressed":l===p+1,onClick:()=>s(p+1),children:["alloc(",_,")"]},`${_}-${p}`))]})]}),(0,a.jsx)("div",{className:"memory-lanes",children:b.map(_=>(0,a.jsxs)("section",{className:`memory-lane ${_}`,children:[(0,a.jsx)("b",{children:fp[_]}),o.filter(p=>p.area===_).map(p=>(0,a.jsx)("button",{className:u===p.id?"active":"",onClick:()=>d(p.id),children:(0,a.jsx)("code",{children:p.declaration})},p.id))]},_))}),(0,a.jsxs)("div",{className:"arena-wrap",children:[(0,a.jsxs)("div",{className:"arena-label",children:[(0,a.jsxs)("code",{children:["allocbuf[",n,"]"]}),(0,a.jsxs)("span",{children:["u\u017Cyte ",m," B / wolne ",n-m," B"]})]}),(0,a.jsxs)("div",{className:"arena",style:{"--allocp":m,"--arena-size":n},children:[g.map(_=>{let p=f(_);return(0,a.jsx)("i",{style:p>=0?{background:gp[p%gp.length]}:void 0},_)}),(0,a.jsxs)("span",{className:"allocp",children:["allocp \u2191 ",m]})]})]}),(0,a.jsxs)("p",{className:"memory-stage",children:[(0,a.jsxs)("strong",{children:[l+1,"/",r.length+1]})," ",(0,a.jsx)("code",{children:E})]}),y&&(0,a.jsxs)("aside",{className:"memory-inspector",children:[(0,a.jsx)("strong",{children:y.id}),(0,a.jsx)("code",{children:y.declaration}),(0,a.jsx)("span",{children:y.description})]})]})}function jg({config:e,asset:t,progress:n,onSetStatus:r}){let o=e.stages??[],i=`${e.storage_key??t.label}-uml-stage`,l=(0,N.useRef)(null),[s,u]=(0,N.useState)(""),[d,m]=(0,N.useState)(!1),[y,g]=(0,N.useState)(!1),[f,E]=(0,N.useState)(()=>Math.max(0,Math.min(o.length-1,Number(localStorage.getItem(i)??0))));(0,N.useEffect)(()=>localStorage.setItem(i,String(f)),[f,i]),(0,N.useEffect)(()=>{let c=!0;return m(!1),fetch(t.href,{cache:"no-store"}).then(h=>{if(!h.ok)throw new Error(`HTTP ${h.status}`);return h.text()}).then(h=>{let k=new DOMParser().parseFromString(h,"image/svg+xml"),C=k.documentElement;if(C.nodeName.toLowerCase()!=="svg"||k.querySelector("parsererror"))throw new Error("Niepoprawny SVG");k.querySelectorAll("script, foreignObject").forEach(P=>P.remove()),Np(C,t.tile),c&&u(C.outerHTML)}).catch(()=>{c&&m(!0)}),()=>{c=!1}},[t.href,t.tile]),(0,N.useEffect)(()=>{let c=l.current?.querySelector("svg");if(!c)return;c.setAttribute("role","img"),c.setAttribute("aria-label",t.alt),c.querySelectorAll("[data-uml-stage]").forEach(C=>{C.classList.remove("uml-stage-region","uml-stage-region-bg","uml-stage-region-outline","uml-stage-region-active","uml-stage-region-completed"),C.removeAttribute("data-uml-stage"),C.removeAttribute("data-uml-stage-label"),C.removeAttribute("role"),C.removeAttribute("tabindex"),C.removeAttribute("aria-label")});let h=Array.from(c.querySelectorAll("text")),k=Array.from(c.querySelectorAll("rect"));o.forEach((C,P)=>{if(!C.svg_label)return;let T=h.find(G=>(G.textContent??"").trim().startsWith(C.svg_label)),R=Number(T?.getAttribute("y"));if(!T||!Number.isFinite(R))return;let j=k.map(G=>{let U=Number(G.getAttribute("y")),Le=Number(G.getAttribute("height")),Ne=Number(G.getAttribute("width")),Q=G.getAttribute("style")??"",et=Number(Q.match(/stroke-width:\s*([\d.]+)/)?.[1]??G.getAttribute("stroke-width")??0);return{rect:G,y:U,height:Le,width:Ne,strokeWidth:et,area:Ne*Le}}).filter(({y:G,height:U,width:Le,strokeWidth:Ne})=>Number.isFinite(G)&&Number.isFinite(U)&&Number.isFinite(Le)&&Ne>=2&&G<=R&&G+U>=R).sort((G,U)=>G.area-U.area),I=j[0];if(!I)return;let ke=j.filter(({y:G,height:U,width:Le})=>Math.abs(G-I.y)<.1&&Math.abs(U-I.height)<.1&&Math.abs(Le-I.width)<.1),re=!!(C.progress_id&&n?.items?.[C.progress_id]?.status==="approved");ke.forEach(({rect:G},U)=>{let Le=G.getAttribute("fill")!=="none";G.dataset.umlStage=String(P),G.dataset.umlStageLabel=C.label,G.classList.add("uml-stage-region",Le?"uml-stage-region-bg":"uml-stage-region-outline"),G.classList.toggle("uml-stage-region-active",P===f),G.classList.toggle("uml-stage-region-completed",re),U===0&&(G.setAttribute("role","button"),G.setAttribute("tabindex","0"),G.setAttribute("aria-label",`Poka\u017C etap ${C.label}`))})})},[t.alt,n,f,o,s]);let b=(c,h)=>{let k=l.current?.querySelector("svg");if(!k)return;let C=Array.from(k.querySelectorAll(".uml-stage-region-bg[data-uml-stage]")).filter(T=>{let R=T.getBoundingClientRect();return c>=R.left&&c<=R.right&&h>=R.top&&h<=R.bottom}).sort((T,R)=>{let j=T.getBoundingClientRect(),I=R.getBoundingClientRect();return j.width*j.height-I.width*I.height})[0],P=Number(C?.dataset.umlStage);Number.isInteger(P)&&E(P)},_=c=>{if(c.key!=="Enter"&&c.key!==" ")return;let h=c.target,k=Number(h.dataset?.umlStage);Number.isInteger(k)&&(c.preventDefault(),E(k))},p=o[f];return(0,a.jsxs)("div",{className:"uml-react",children:[(0,a.jsxs)("header",{children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("small",{children:"KANONICZNY DIAGRAM UML \xB7 PLANTUML"}),(0,a.jsx)("h3",{children:"Reset i dwa przydzia\u0142y liniowe"})]}),(0,a.jsx)("div",{className:"uml-actions",children:o.map((c,h)=>(0,a.jsxs)("button",{"aria-pressed":f===h,"data-completed":c.progress_id&&n?.items?.[c.progress_id]?.status==="approved"?"true":"false",onClick:()=>E(h),children:[c.progress_id&&n?.items?.[c.progress_id]?.status==="approved"&&(0,a.jsx)("span",{"aria-hidden":"true",children:"\u2713 "}),c.label]},c.id))})]}),(0,a.jsxs)("div",{ref:l,className:"uml-canvas",onClick:c=>b(c.clientX,c.clientY),onKeyDown:_,children:[s?(0,a.jsx)("div",{className:`uml-svg-host${t.tile?" is-tiled":""}`,style:hs(t.tile),dangerouslySetInnerHTML:{__html:s}}):(0,a.jsx)("img",{src:t.href,alt:t.alt}),d&&(0,a.jsx)("span",{className:"uml-inline-warning",children:"Widok statyczny \u2014 nie uda\u0142o si\u0119 wczyta\u0107 interaktywnego SVG."})]}),p&&(0,a.jsxs)("aside",{className:"uml-stage",children:[(0,a.jsx)("strong",{children:p.label}),(0,a.jsx)("span",{children:p.description}),p.code_ref&&(0,a.jsx)("code",{children:p.code_ref})]}),p?.progress_id&&(0,a.jsxs)("footer",{className:"uml-approval",children:[(0,a.jsx)("span",{children:n?.items?.[p.progress_id]?.status==="approved"?"Ten stan jest zatwierdzony i zapisany w JSON-ie zaj\u0119\u0107.":"Kursor wybiera stan; zatwierdzenie zapisuje go w JSON-ie zaj\u0119\u0107."}),(0,a.jsx)("button",{disabled:!n||y,onClick:async()=>{if(!p.progress_id||!n)return;let c=n.items?.[p.progress_id]?.status==="approved";g(!0);try{await r(p.progress_id,c?"pending":"approved")}finally{g(!1)}},children:y?"Zapisywanie\u2026":n?.items?.[p.progress_id]?.status==="approved"?"Cofnij zatwierdzenie":"Zatwierd\u017A stan"})]})]})}function Ug({config:e,asset:t,progress:n,onSetStatus:r,continuation:o}){let i=e.phases??[],l=i.flatMap(x=>x.steps.map(S=>({phase:x,step:S}))),s=`${e.storage_key??t.label}-uml-step`,u=`${e.storage_key??t.label}-navigation-level`,d=(0,N.useRef)(null),m=(0,N.useRef)(null),y=(0,N.useRef)(new Map),g=(0,N.useRef)(null),f=(0,N.useRef)(0),E=(0,N.useRef)(!1),b=(0,N.useRef)(null),_=(0,N.useRef)(!0),[p,c]=(0,N.useState)(""),[h,k]=(0,N.useState)(!1),[C,P]=(0,N.useState)(!1),[T,R]=(0,N.useState)(null),[j,I]=(0,N.useState)(null),[ke,re]=(0,N.useState)(!1),[G,U]=(0,N.useState)(""),[Le,Ne]=(0,N.useState)(!1),[Q,et]=(0,N.useState)(null),[Ge,je]=(0,N.useState)([]),[me,Dn]=(0,N.useState)(0),[xe,bn]=(0,N.useState)(()=>Math.max(0,Math.min(l.length-1,Number(localStorage.getItem(s)??0)))),[se,A]=(0,N.useState)(()=>{let x=localStorage.getItem(u);return x==="card"||x==="task"||x==="block"||x==="phase"||x==="step"||x==="snapshot"?x:"step"});(0,N.useEffect)(()=>localStorage.setItem(s,String(xe)),[xe,s]),(0,N.useEffect)(()=>localStorage.setItem(u,se),[se,u]),(0,N.useEffect)(()=>{let x=!0;return k(!1),fetch(t.href,{cache:"no-store"}).then(S=>{if(!S.ok)throw new Error(`HTTP ${S.status}`);return S.text()}).then(S=>{let M=new DOMParser().parseFromString(S,"image/svg+xml"),O=M.documentElement;if(O.nodeName.toLowerCase()!=="svg"||M.querySelector("parsererror"))throw new Error("Niepoprawny SVG");M.querySelectorAll("script, foreignObject").forEach(v=>v.remove()),Np(O,t.tile),x&&c(O.outerHTML)}).catch(()=>{x&&k(!0)}),()=>{x=!1}},[t.href,t.tile]),(0,N.useEffect)(()=>{let x=!0,S=fs(t,e);if(U("Wczytywanie uk\u0142adu\u2026"),Ne(!1),!t.source_href)return R(S),I(S),U("Brak \u017Ar\xF3d\u0142a PlantUML \u2014 zapis wy\u0142\u0105czony."),()=>{x=!1};let M=t.source_href.replace(/\.puml(?:\?.*)?$/,".layout.json");return fetch(`/api/uml-layout?source=${encodeURIComponent(t.source_href)}`,{cache:"no-store"}).then(async O=>{if(!O.ok)throw new Error(`HTTP ${O.status}`);return O.json()}).catch(async()=>{let O=await fetch(M,{cache:"no-store"});return O.ok?{layout:await O.json(),source_digest:"",stale:!1}:{layout:null,source_digest:"",stale:!1}}).then(O=>{if(!x)return;let v=O.layout??fs(t,e,O.source_digest??"");R(v),I(v),re(!1),Ne(!!O.stale),U(O.layout?"Uk\u0142ad wczytany z JSON.":"Uk\u0142ad PlantUML \u2014 brak r\u0119cznych zmian.")}).catch(O=>{x&&(R(S),I(S),U(`Nie wczytano uk\u0142adu: ${O instanceof Error?O.message:String(O)}`))}),()=>{x=!1}},[t.source_href,t.label,e.block?.id,e.task?.id]),(0,N.useEffect)(()=>{let x=m.current?.querySelector("svg");if(!x||!j)return;fg(x);let S=new Map(l.map(({step:L})=>[String(L.number).padStart(2,"0"),L.id])),M=gg(x,S),O=new Map(M.map(L=>[L.id,L]));y.current=O;let v=M.map(L=>L.id);je(L=>L.join("\0")===v.join("\0")?L:v),M.forEach(L=>{let H=j.elements[L.id];H&&hg(L,H)});let w=x.viewBox.baseVal;(j.canvas.width<=0||j.canvas.height<=0)&&I(L=>L&&{...L,canvas:{...L.canvas,width:w?.width||Number(x.getAttribute("width")?.replace("px",""))||0,height:w?.height||Number(x.getAttribute("height")?.replace("px",""))||0}})},[l,p,j]),(0,N.useEffect)(()=>{let x=m.current?.querySelector("svg");if(!x)return;let S=e.kind==="uml-class"&&x.contains(document.activeElement);x.setAttribute("role","img"),x.setAttribute("aria-label",t.alt),x.classList.toggle("uml-class-svg",e.kind==="uml-class"),x.classList.toggle("uml-class-svg-active",e.kind==="uml-class"&&se!=="card"),x.querySelectorAll(".uml-step-hit, .uml-class-focus-region").forEach(K=>K.remove()),x.querySelectorAll("[data-uml-step-element]").forEach(K=>{K.classList.remove("uml-step-element","uml-step-element-active","uml-step-element-completed","uml-step-element-tone-a","uml-step-element-tone-b"),K.removeAttribute("data-uml-step-element"),K.removeAttribute("data-uml-step-claim-area")});let M=Array.from(x.querySelectorAll("text")),O=Array.from(x.querySelectorAll("line")),v=Array.from(x.querySelectorAll("polygon"));if(e.kind==="uml-class"){let K=V=>V?mg(V):null,X=V=>{if(!V.length)return null;let oe=Math.min(...V.map(J=>J.x)),ct=Math.min(...V.map(J=>J.y)),Ue=Math.max(...V.map(J=>J.x+J.width)),ue=Math.max(...V.map(J=>J.y+J.height));return{x:oe,y:ct,width:Ue-oe,height:ue-ct}},D=Array.from(x.querySelectorAll("g > *")),Z=Array.from(x.querySelectorAll("[id]"));l.forEach(({step:V},oe)=>{let ct=V.svg_label??String(V.number).padStart(2,"0"),Ue=M.find(ge=>(ge.textContent??"").trim().startsWith(ct));if(!Ue)return;let ue=K(Ue);if(!ue)return;let J=Number(Ue.getAttribute("y")),Re=M.filter(ge=>Number.isFinite(J)&&Math.abs(Number(ge.getAttribute("y"))-J)<.8),Ve=V.svg_target?Z.find(ge=>ge.id===V.svg_target||ge.id.startsWith(`${V.svg_target}-`))??null:null,dt=K(Ve)??X(Re.map(ge=>K(ge)).filter(ge=>ge!==null))??ue,vr=Ve?.tagName.toLowerCase()==="rect",vs=Ve?[Ve,Ue]:Re;vr&&D.forEach(ge=>{let Xt=K(ge);if(!Xt||ge===Ve)return;let bs=Xt.x+Xt.width/2,ws=Xt.y+Xt.height/2;bs>=dt.x&&bs<=dt.x+dt.width&&ws>=dt.y&&ws<=dt.y+dt.height&&vs.push(ge)});let Ap=!!(V.progress_id&&n?.items?.[V.progress_id]?.status==="approved"),xs=Math.max(1,dt.width*dt.height);vs.forEach(ge=>{let Xt=Number(ge.dataset.umlStepClaimArea);Number.isFinite(Xt)&&Xt{let D=K.svg_label??String(K.number).padStart(2,"0"),Z=M.find(J=>(J.textContent??"").trim()===D),V=Number(Z?.getAttribute("y"));if(!Z||!Number.isFinite(V))return;let oe=V+5,ct=!!(K.progress_id&&n?.items?.[K.progress_id]?.status==="approved"),Ue=M.filter(J=>Math.abs(Number(J.getAttribute("y"))-V)<.8);Ue.push(...O.filter(J=>{let Re=Number(J.getAttribute("y1")),Ve=Number(J.getAttribute("y2"));return Number.isFinite(Re)&&Number.isFinite(Ve)&&Math.abs(Re-Ve)<.8&&Math.abs((Re+Ve)/2-oe)<=14})),Ue.push(...v.filter(J=>{let Re=(J.getAttribute("points")??"").trim().split(/\s+/).map(vr=>Number(vr.split(",")[1])).filter(Number.isFinite);if(!Re.length)return!1;let Ve=Math.min(...Re),dt=Math.max(...Re);return dt-Ve<=16&&Math.abs((Ve+dt)/2-oe)<=14})),Ue.forEach(J=>{J.dataset.umlStepElement=String(X),J.classList.add("uml-step-element"),J.classList.toggle("uml-step-element-active",X===xe),J.classList.toggle("uml-step-element-completed",ct)});let ue=document.createElementNS("http://www.w3.org/2000/svg","rect");ue.setAttribute("x",String(L)),ue.setAttribute("y",String(V-12)),ue.setAttribute("width",String(H)),ue.setAttribute("height","31"),ue.setAttribute("fill","transparent"),ue.setAttribute("pointer-events","all"),ue.setAttribute("role","button"),ue.setAttribute("tabindex","0"),ue.setAttribute("aria-label",`Poka\u017C krok ${String(K.number).padStart(2,"0")}: ${K.label}`),ue.dataset.umlStep=String(X),ue.classList.add("uml-step-hit"),ue.classList.toggle("uml-step-hit-active",se!=="card"&&X===xe),ue.classList.toggle("uml-step-hit-completed",ct),x.appendChild(ue)})},[t.alt,e.kind,l,se,n,xe,p,j]),(0,N.useEffect)(()=>{let x=m.current?.querySelector("svg");if(x&&(x.querySelectorAll(".uml-layout-hit,.uml-layout-resize").forEach(S=>S.remove()),x.classList.toggle("uml-layout-editing",C),!(!C||!j)))for(let S of y.current.values()){let M=j.elements[S.id]??po(S),O=document.createElementNS("http://www.w3.org/2000/svg","rect");O.setAttribute("x",String(M.x)),O.setAttribute("y",String(M.y)),O.setAttribute("width",String(Math.max(12,M.width))),O.setAttribute("height",String(Math.max(12,M.height))),O.setAttribute("tabindex","0"),O.setAttribute("role","button"),O.setAttribute("aria-label",`Edytuj element UML ${S.id}`),O.dataset.umlLayoutId=S.id,O.dataset.umlLayoutAction="move",O.classList.add("uml-layout-hit"),S.id===Q&&O.classList.add("is-selected");let v=document.createElementNS("http://www.w3.org/2000/svg","title");if(v.textContent=`${S.id} \xB7 przeci\u0105gnij, aby zmieni\u0107 po\u0142o\u017Cenie`,O.appendChild(v),x.appendChild(O),S.id===Q){let w=Math.max(8,Math.min(14,Math.min(M.width,M.height)*.1)),L=document.createElementNS("http://www.w3.org/2000/svg","rect");L.setAttribute("x",String(M.x+M.width-w/2)),L.setAttribute("y",String(M.y+M.height-w/2)),L.setAttribute("width",String(w)),L.setAttribute("height",String(w)),L.dataset.umlLayoutId=S.id,L.dataset.umlLayoutAction="resize",L.classList.add("uml-layout-resize"),x.appendChild(L)}}},[p,C,j,Q,Ge]),(0,N.useEffect)(()=>{C&&(!Q||!y.current.has(Q))&&et(Ge[0]??null)},[C,Ge,Q]),(0,N.useEffect)(()=>{if(me===0||f.current===me)return;let x=!1,S=0,M=v=>{if(x)return;let w=m.current?.querySelector(`.uml-step-hit[data-uml-step="${xe}"]`);if(!w)return;if(document.querySelector(".viewer-chrome")?.classList.contains("is-nvim-fit")){f.current=me;return}let H=Sp(w);if(!H){f.current=me;return}let K=sg(w);if(!K){let Z=dg(w,H),V=Z===0?up(w,H):0,oe=Z===0?sp(w,V):Z;if(vFn){S=window.requestAnimationFrame(()=>M(v+1));return}f.current=me;return}let X=up(w,K);if(Math.abs(X)<=Fn){f.current=me;return}let D=sp(w,X);if(vFn){S=window.requestAnimationFrame(()=>M(v+1));return}f.current=me},O=window.requestAnimationFrame(()=>M(0));return()=>{x=!0,window.cancelAnimationFrame(O),window.cancelAnimationFrame(S)}},[me,xe,p]);let F=(x,S,M=se,O=!0)=>{let v={task:e.task??null,block:e.block??null,phase:{id:x.phase.id,label:x.phase.label},step:x.step,focusLevel:M,activate:S&&document.documentElement.dataset.nvimSyncMode==="on"},w=()=>{window.dispatchEvent(new CustomEvent("stem:nvim-step",{detail:v}))};if(!O){w();return}let L=fetch("/api/navigation/current",{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({task:v.task,block:v.block,phase:v.phase,step:{id:v.step.id,number:v.step.number,label:v.step.label,mode:v.step.mode??(v.step.snapshot_ref?"RUN":"CODE"),code_ref:v.step.code_ref??null,event_id:v.step.event_id??null,strategy_ref:v.step.strategy_ref??null},snapshot_ref:v.step.snapshot_ref??null,focus_level:v.focusLevel,sync_requested:!!v.activate,actor:document.documentElement.dataset.cardClientId??"browser"})});v.activate?L.then(w,w):(w(),L.catch(()=>{}))},B=(x,S=!1,M=se,O=!0)=>{let v=Math.max(0,Math.min(l.length-1,x)),w=l[v];if(w){if(A(M),v===xe){F(w,S,M,O);return}Dn(L=>L+1),E.current=S,b.current=M,_.current=O,bn(v)}},te=(x,S)=>{let M=m.current?.querySelector("svg"),O=M?.getScreenCTM();if(!M||!O)return null;let v=M.createSVGPoint();return v.x=x,v.y=S,v.matrixTransform(O.inverse())},at=x=>{if(!C||!j)return;let S=x.target?.closest(".uml-layout-hit[data-uml-layout-id],.uml-layout-resize[data-uml-layout-id]"),M=S?.dataset.umlLayoutId,O=M?y.current.get(M):null,v=te(x.clientX,x.clientY);if(!M||!O||!v)return;x.preventDefault(),x.stopPropagation();let w=j.elements[M]??po(O);g.current={id:M,action:S?.dataset.umlLayoutAction==="resize"?"resize":"move",pointerId:x.pointerId,startX:v.x,startY:v.y,initial:w},et(M),I(L=>L&&{...L,elements:{...L.elements,[M]:w}}),x.currentTarget.setPointerCapture(x.pointerId)},zt=x=>{let S=g.current;if(!S||S.pointerId!==x.pointerId)return;let M=te(x.clientX,x.clientY);if(!M)return;x.preventDefault();let O=M.x-S.startX,v=M.y-S.startY,w=S.action==="resize"?{...S.initial,width:Math.max(24,S.initial.width+O),height:Math.max(18,S.initial.height+v)}:{...S.initial,x:S.initial.x+O,y:S.initial.y+v};I(L=>L&&{...L,elements:{...L.elements,[S.id]:w}}),re(!0)},Ee=x=>{let S=g.current;!S||S.pointerId!==x.pointerId||(g.current=null,x.currentTarget.hasPointerCapture(x.pointerId)&&x.currentTarget.releasePointerCapture(x.pointerId))},ne=(x,S)=>{let M=y.current.get(x);M&&(I(O=>{if(!O)return O;let v=O.elements[x]??po(M);return{...O,elements:{...O.elements,[x]:S(v)}}}),re(!0))},st=async()=>{if(!j||!t.source_href)return;let x=Object.fromEntries(Array.from(y.current.values()).map(M=>[M.id,j.elements[M.id]??po(M)])),S={...j,elements:x};U("Zapisywanie uk\u0142adu\u2026");try{let M=await fetch("/api/uml-layout",{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({source:t.source_href,layout:S,actor:document.documentElement.dataset.cardClientId??"browser"})});if(!M.ok)throw new Error((await M.json().catch(()=>null))?.message??`HTTP ${M.status}`);let O=await M.json();R(O.layout),I(O.layout),re(!1),Ne(!1),U(`Zapisano ${Object.keys(O.layout.elements).length} element\xF3w w JSON.`)}catch(M){U(`B\u0142\u0105d zapisu: ${M instanceof Error?M.message:String(M)}`)}},Ye=()=>{T&&(I(T),re(!1),U("Przywr\xF3cono ostatnio zapisany uk\u0142ad."))},wn=async()=>{if(!(!t.source_href||!window.confirm("Usun\u0105\u0107 r\u0119czny uk\u0142ad i wr\xF3ci\u0107 do geometrii PlantUML?"))){U("Resetowanie uk\u0142adu\u2026");try{let x=await fetch(`/api/uml-layout?source=${encodeURIComponent(t.source_href)}&actor=${encodeURIComponent(document.documentElement.dataset.cardClientId??"browser")}`,{method:"DELETE"});if(!x.ok)throw new Error(`HTTP ${x.status}`);let S=fs(t,e,T?.source_digest??"");R(S),I(S),re(!1),et(null),U("Przywr\xF3cono automatyczny uk\u0142ad PlantUML.")}catch(x){U(`B\u0142\u0105d resetu: ${x instanceof Error?x.message:String(x)}`)}}},ie=(x,S)=>{if(C)return;let M=Array.from(m.current?.querySelectorAll(".uml-step-hit[data-uml-step]")??[]).filter(v=>{let w=v.getBoundingClientRect();return x>=w.left&&x<=w.right&&S>=w.top&&S<=w.bottom}).sort((v,w)=>{let L=v.getBoundingClientRect(),H=w.getBoundingClientRect();return Math.abs(S-(L.top+L.bottom)/2)-Math.abs(S-(H.top+H.bottom)/2)}),O=Number(M[0]?.dataset.umlStep);Number.isInteger(O)&&B(O,!1,"step")},q=x=>{if(C||x.key!=="Enter"&&x.key!==" ")return;let S=x.target,M=Number(S.dataset?.umlStep);Number.isInteger(M)&&(x.preventDefault(),B(M,x.key==="Enter","step"))},bt=x=>{let S=l.findIndex(M=>M.phase.id===x.id);S>=0&&B(S,!1,"phase")},fe=l[xe];if((0,N.useEffect)(()=>{fe&&(F(fe,E.current,b.current??se,_.current),E.current=!1,b.current=null,_.current=!0)},[fe?.phase.id,fe?.step.id,e.block]),(0,N.useEffect)(()=>{let x=S=>{let M=S.detail;if(!M||e.task?.id&&M.task.id!==e.task.id||e.block?.id&&M.block.id!==e.block.id)return;let O=l.findIndex(v=>v.phase.id===M.phase.id&&v.step.id===M.step.id);if(O<0){A("card");return}B(O,!1,M.focus_level,!1)};return window.addEventListener("stem:navigation-command",x),()=>window.removeEventListener("stem:navigation-command",x)},[e.block?.id,e.task?.id,l,se,xe]),(0,N.useEffect)(()=>{let x=S=>{if(S.metaKey||C||S.target?.closest("input, textarea, select, [contenteditable='true']"))return;let O=d.current;if(!O)return;let v=Array.from(document.querySelectorAll("[data-stem-nav='uml-block']")),w=window.innerHeight/2;if(v.sort((D,Z)=>{let V=D.getBoundingClientRect(),oe=Z.getBoundingClientRect();return Math.abs((V.top+V.bottom)/2-w)-Math.abs((oe.top+oe.bottom)/2-w)})[0]!==O)return;if(S.key==="Enter"&&S.ctrlKey&&!S.altKey&&!S.shiftKey){if(!fe?.step.progress_id||!n)return;S.preventDefault(),S.stopPropagation();let D=n.items?.[fe.step.progress_id]?.status==="approved";r(fe.step.progress_id,D?"pending":"approved");return}if(S.key==="Enter"&&!S.altKey&&!S.shiftKey){if(!fe)return;S.preventDefault(),S.stopPropagation(),F(fe,!0,se);return}let H=["card","task","block","phase","step","snapshot"];if((S.key==="ArrowLeft"||S.key==="ArrowRight"||S.key==="Escape")&&!S.altKey&&!S.ctrlKey&&!S.shiftKey){let D=S.key==="ArrowRight"?1:-1,Z=H[Math.max(0,Math.min(H.length-1,H.indexOf(se)+D))];S.preventDefault(),S.stopPropagation(),A(Z),fe&&F(fe,!1,Z);return}if(S.key!=="ArrowUp"&&S.key!=="ArrowDown"||se==="card"&&!S.altKey&&!S.ctrlKey&&!S.shiftKey)return;let K=S.key==="ArrowUp"?-1:1,X=se;if(S.altKey&&S.shiftKey&&!S.ctrlKey)X="snapshot";else if(S.ctrlKey&&S.shiftKey&&!S.altKey)X="step";else if(S.altKey&&!S.ctrlKey&&!S.shiftKey)X="task";else if(S.ctrlKey&&!S.altKey&&!S.shiftKey)X="block";else if(S.shiftKey&&!S.altKey&&!S.ctrlKey)X="phase";else if(S.altKey||S.ctrlKey||S.shiftKey)return;S.preventDefault(),S.stopPropagation(),fetch("/api/navigation/move",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({level:X,delta:K,sync_requested:!1,actor:document.documentElement.dataset.cardClientId??"browser"})}).then(D=>D.ok?D.json():Promise.reject(new Error(`HTTP ${D.status}`))).then(D=>{D.current&&window.dispatchEvent(new CustomEvent("stem:navigation-command",{detail:D.current}))}).catch(()=>{})};return window.addEventListener("keydown",x),()=>window.removeEventListener("keydown",x)},[fe,l,se,r,n,C]),!fe)return null;let{phase:Qt,step:jn}=fe,qt=l.filter(x=>x.phase.id===Qt.id),ho=e.block?.label.match(/^A[1-8]\b/)?.[0]??"UML",yo=(e.title??e.block?.label??t.caption).replace(/^A[1-8]\s*[·—:-]\s*/i,""),Un=Q?y.current.get(Q)??null:null,ut=Un?j?.elements[Un.id]??po(Un):null;return(0,a.jsxs)("div",{ref:d,className:"uml-react uml-snapshot-react","data-stem-nav":"uml-block","data-task-id":e.task?.id,"data-block-id":e.block?.id,"data-navigation-level":se,children:[(0,a.jsxs)("header",{className:"uml-snapshot-header",children:[(0,a.jsxs)("div",{className:"uml-header-first-line",children:[(0,a.jsxs)("h3",{children:[(0,a.jsx)("span",{children:ho})," \u2014 ",yo,t.tile&&(0,a.jsxs)("small",{className:"uml-tile-part",children:["cz\u0119\u015B\u0107 ",t.tile.index,"/",t.tile.count," \xB7 r",t.tile.row," c",t.tile.column]})]}),(0,a.jsxs)("div",{className:"uml-header-navigation",children:[(0,a.jsx)(_p,{continuation:o}),t.source_href&&(0,a.jsx)("button",{className:`uml-edit-toggle${C?" is-active":""}`,"aria-pressed":C,title:"R\u0119czna edycja po\u0142o\u017Cenia i parametr\xF3w blok\xF3w UML",onClick:()=>P(x=>!x),children:C?"ZAMKNIJ EDIT":"EDIT"}),(0,a.jsx)("div",{className:"uml-phase-actions","aria-label":"Fazy diagramu",children:i.map(x=>(0,a.jsx)("button",{"aria-pressed":Qt.id===x.id,onClick:()=>bt(x),children:x.label},x.id))}),(0,a.jsx)("div",{className:"uml-step-actions","aria-label":`Checkpointy fazy ${Qt.label}`,children:qt.map(x=>{let S=l.indexOf(x),M=!!(x.step.progress_id&&n?.items?.[x.step.progress_id]?.status==="approved");return(0,a.jsx)("button",{"aria-label":`Krok ${x.step.number}: ${x.step.label}`,"aria-pressed":se!=="card"&&S===xe,"data-completed":M?"true":"false","data-mode":x.step.mode??"RUN",title:`${x.step.mode??"RUN"} \xB7 ${x.step.label}`,onClick:()=>B(S),children:String(x.step.number).padStart(2,"0")},x.step.id)})})]})]}),e.block?.description&&(0,a.jsx)("p",{className:"uml-header-description",children:e.block.description})]}),(0,a.jsxs)("div",{className:"uml-snapshot-layout",children:[(0,a.jsxs)("div",{ref:m,className:`uml-canvas uml-step-canvas${C?" is-layout-editing":""}`,onClick:x=>ie(x.clientX,x.clientY),onKeyDown:q,onPointerDown:at,onPointerMove:zt,onPointerUp:Ee,onPointerCancel:Ee,children:[p?(0,a.jsx)("div",{className:`uml-svg-host${t.tile?" is-tiled":""}`,style:hs(t.tile),dangerouslySetInnerHTML:{__html:p}}):(0,a.jsx)("img",{src:t.href,alt:t.alt}),h&&(0,a.jsx)("span",{className:"uml-inline-warning",children:"Widok statyczny \u2014 wybierz krok przyciskiem nad diagramem."})]}),C&&j&&(0,a.jsxs)("aside",{className:"uml-layout-editor","aria-label":"Edytor uk\u0142adu UML",children:[(0,a.jsxs)("div",{className:"uml-layout-editor-title",children:[(0,a.jsx)("strong",{children:"UML layout"}),(0,a.jsx)("span",{children:ke?"niezapisane zmiany":"zapisany"}),Le&&(0,a.jsx)("b",{children:"\u0179r\xF3d\u0142o PlantUML zmieni\u0142o si\u0119"})]}),(0,a.jsxs)("label",{children:["Element",(0,a.jsx)("select",{value:Q??"",onChange:x=>et(x.target.value||null),children:Ge.map(x=>(0,a.jsx)("option",{value:x,children:x},x))})]}),Q&&ut&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("div",{className:"uml-layout-number-grid",children:["x","y","width","height"].map(x=>(0,a.jsxs)("label",{children:[x,(0,a.jsx)("input",{type:"number",step:"1",min:x==="width"||x==="height"?12:void 0,value:Math.round(ut[x]*100)/100,onChange:S=>ne(Q,M=>({...M,[x]:Number(S.target.value)}))})]},x))}),(0,a.jsxs)("label",{className:"uml-layout-editor-text",children:["Tekst bloku \u2014 jeden wiersz SVG na lini\u0119",(0,a.jsx)("textarea",{rows:Math.max(3,Math.min(10,ut.text?.lines?.length??3)),value:(ut.text?.lines??[]).join(` +`),onChange:x=>ne(Q,S=>({...S,text:{...S.text,title:x.target.value.split(` +`)[0]??"",description:x.target.value.split(` +`).slice(1).join(` +`),lines:x.target.value.split(` +`)}}))})]}),(0,a.jsxs)("div",{className:"uml-layout-style-grid",children:[(0,a.jsxs)("label",{children:["Font",(0,a.jsx)("input",{type:"number",min:"4",max:"96",step:"0.5",value:ut.text?.font_size??12,onChange:x=>ne(Q,S=>({...S,text:{...S.text,font_size:Number(x.target.value)}}))})]}),(0,a.jsxs)("label",{children:["Wyr\xF3wnanie",(0,a.jsxs)("select",{value:ut.text?.align??"left",onChange:x=>ne(Q,S=>({...S,text:{...S.text,align:x.target.value}})),children:[(0,a.jsx)("option",{value:"left",children:"left"}),(0,a.jsx)("option",{value:"center",children:"center"}),(0,a.jsx)("option",{value:"right",children:"right"})]})]}),(0,a.jsxs)("label",{children:["Wype\u0142nienie",(0,a.jsx)("input",{type:"color",value:ut.style?.fill??"#edf6fa",onChange:x=>ne(Q,S=>({...S,style:{...S.style,fill:x.target.value}}))})]}),(0,a.jsxs)("label",{children:["Obramowanie",(0,a.jsx)("input",{type:"color",value:ut.style?.stroke??"#2c7794",onChange:x=>ne(Q,S=>({...S,style:{...S.style,stroke:x.target.value}}))})]}),(0,a.jsxs)("label",{children:["Linia",(0,a.jsx)("input",{type:"number",min:"0.5",max:"12",step:"0.25",value:ut.style?.stroke_width??1.5,onChange:x=>ne(Q,S=>({...S,style:{...S.style,stroke_width:Number(x.target.value)}}))})]})]})]}),(0,a.jsxs)("div",{className:"uml-layout-editor-actions",children:[(0,a.jsx)("button",{className:"is-primary",disabled:!ke,onClick:()=>void st(),children:"Zapisz uk\u0142ad"}),(0,a.jsx)("button",{disabled:!ke,onClick:Ye,children:"Cofnij zmiany"}),(0,a.jsx)("button",{className:"is-danger",onClick:()=>void wn(),children:"Reset PlantUML"})]}),(0,a.jsx)("output",{children:G})]})]})]})}function Vg(e){return e.config.phases?.length?(0,a.jsx)(Ug,{...e}):(0,a.jsx)(jg,{...e})}function Bg({asset:e,continuation:t}){let n=e.tile;if(!n)return(0,a.jsx)("img",{src:e.href,alt:e.alt,loading:"lazy"});let r=e.diagram_block_label?.match(/^A[1-8]\b/)?.[0]??e.diagram_title?.match(/^A[1-8]\b/)?.[0]??e.caption.match(/^A[1-8]\b/)?.[0]??"UML",o=(e.diagram_title??e.caption).replace(/^A[1-8]\s*[·—:-]\s*/i,"");return(0,a.jsxs)("div",{className:"uml-react uml-snapshot-react uml-static-tile",children:[(0,a.jsxs)("header",{className:"uml-snapshot-header",children:[(0,a.jsxs)("div",{className:"uml-header-first-line",children:[(0,a.jsxs)("h3",{children:[(0,a.jsx)("span",{children:r})," \u2014 ",o,(0,a.jsxs)("small",{className:"uml-tile-part",children:["cz\u0119\u015B\u0107 ",n.index,"/",n.count," \xB7 r",n.row," c",n.column]})]}),(0,a.jsxs)("div",{className:"uml-header-navigation",children:[(0,a.jsx)(_p,{continuation:t}),(0,a.jsx)("div",{className:"uml-phase-actions","aria-label":"Fazy logicznego diagramu",children:(e.diagram_phase_labels??[]).map(i=>(0,a.jsx)("span",{children:i},i))})]})]}),e.diagram_description&&(0,a.jsx)("p",{className:"uml-header-description",children:e.diagram_description})]}),(0,a.jsx)("div",{className:"uml-snapshot-layout",children:(0,a.jsx)("div",{className:"uml-canvas uml-step-canvas",children:(0,a.jsx)("div",{className:"uml-svg-host is-tiled is-static",style:hs(n),children:(0,a.jsx)("div",{className:"uml-static-crop",style:{width:`${n.width}px`,height:`${n.height}px`},children:(0,a.jsx)("img",{src:e.href,alt:e.alt,style:{width:`${n.full_width}px`,height:`${n.full_height}px`,transform:`translate(${-(n.x-n.full_x)}px, ${-(n.y-n.full_y)}px)`}})})})})})]})}function Hg({asset:e,number:t,progress:n,onSetStatus:r,continuation:o}){let i=e.interactive?.kind,l=!!i;return(0,a.jsxs)("figure",{className:`card-asset asset-${e.kind} ${l?"asset-interactive":""}`,id:e.label.replace(":","-"),children:[i==="uml-sequence"||i==="uml-class"?(0,a.jsx)(Vg,{config:e.interactive,asset:e,progress:n,onSetStatus:r,continuation:o}):i==="allocator-memory-flow"?(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(Dg,{config:e.interactive,title:e.caption}),(0,a.jsx)("img",{className:"asset-static-fallback",src:e.href,alt:e.alt})]}):e.tile?(0,a.jsx)(Bg,{asset:e,continuation:o}):(0,a.jsx)("a",{href:e.href,target:"_blank",rel:"noopener",children:(0,a.jsx)("img",{src:e.href,alt:e.alt,loading:"lazy",style:{width:`${e.width*100}%`}})}),e.source_href&&(0,a.jsx)("a",{className:"asset-source-link",href:e.source_href,target:"_blank",rel:"noopener",children:"\u0179r\xF3d\u0142o PlantUML"}),(0,a.jsxs)("figcaption",{children:["Rys. ",e.figure_number??t,". ",e.caption]})]})}function Kg({steps:e,progress:t,onCycle:n}){if(!e.length)return null;let r={pending:"\u25CB niezatwierdzony",approved:"\u25CF zatwierdzony"};return(0,a.jsx)("div",{className:"step-map",children:e.map(o=>{let i=t?.items?.[o.id]?.status??"pending";return(0,a.jsxs)("div",{className:`step-row ${i==="approved"?"lesson-progress-completed":""}`,children:[(0,a.jsx)("button",{className:"lesson-progress-control","data-status":i,onClick:()=>n(o.id,i),disabled:!t,children:r[i]}),(0,a.jsx)("span",{className:"step-title",children:o.title})]},o.id)})})}function Wg({section:e,progress:t,onCycle:n,onSetStatus:r,figureOffset:o}){let i=vg(e);return(0,a.jsxs)(ys,{header:e.header_html,left:e.left_margin_html,right:e.right_margin_html,className:`section-sheet${e.assets.length?" section-sheet--asset":""} sheet--${e.page_orientation||"portrait"}`,children:[(0,a.jsx)("div",{id:e.id,className:"section-anchor"}),e.show_heading&&(0,a.jsxs)("h2",{className:"section-heading",children:[(0,a.jsx)("span",{className:"section-index",children:e.index}),(0,a.jsx)("span",{className:"section-title",children:e.title})]}),(0,a.jsx)(Kg,{steps:e.steps,progress:t,onCycle:n}),e.content_html&&(0,a.jsx)(Yt,{html:e.content_html}),(0,a.jsx)("div",{className:"tasks",children:e.tasks.map(l=>(0,a.jsx)(Fg,{task:l},l.ref))}),e.assets.map((l,s)=>(0,a.jsx)(Hg,{asset:l,number:o+s+1,progress:t,onSetStatus:r,continuation:i},l.label)),e.tasks.map(l=>l.conclusion_html&&(0,a.jsxs)("aside",{className:"task-conclusion",children:[(0,a.jsx)("strong",{children:"WNIOSEK"}),(0,a.jsx)(Yt,{html:l.conclusion_html})]},`${l.ref}-conclusion`))]})}function Gg({progress:e,error:t}){if(!e?.summary&&!t)return null;let n=e?.summary.counts;return(0,a.jsxs)("section",{className:"lesson-progress-topbar","aria-label":"Przebieg zaj\u0119\u0107",children:[(0,a.jsx)("strong",{children:"PRZEBIEG"}),n&&(0,a.jsxs)("output",{title:"Zatwierdzone kroki",children:[n.approved,"/",e.summary.total]}),t&&(0,a.jsx)("span",{className:"lesson-progress-error",title:t,children:"!"}),(0,a.jsx)("a",{href:"/api/report/teams.md",target:"_blank",rel:"noopener",title:"Otw\xF3rz raport do Teams",children:"Teams"}),(0,a.jsx)("a",{href:"/api/report/lesson.html",target:"_blank",rel:"noopener",title:"Otw\xF3rz \u015Blad lekcji ze zrzutami",children:"\u015Alad"})]})}var In=[{id:"u01",name:"Alicja Nowak",laptop:3,connection:"online",sync:"follow",position:"A5\xB708"},{id:"u02",name:"Bartosz Kowalski",laptop:7,connection:"online",sync:"follow",position:"A5\xB708"},{id:"u03",name:"Celina Wi\u015Bniewska",laptop:11,connection:"away",sync:"paused",position:"A5\xB705"},{id:"u04",name:"Dawid W\xF3jcik",laptop:14,connection:"offline",sync:"follow",position:"\u2014"},{id:"u05",name:"Emilia Kami\u0144ska",laptop:18,connection:"online",sync:"local",position:"A3\xB702"},{id:"u06",name:"Filip Lewandowski",laptop:22,connection:"error",sync:"follow",position:"A5\xB706"},{id:"u07",name:"Gabriela Zieli\u0144ska",laptop:24,connection:"online",sync:"follow",position:"A5\xB708"}];function Yg(e){let t=new Map,n=(r,o)=>{let i=r.trim()||"task",l=t.get(i);return l||(l={id:i,label:o.trim()||i.toUpperCase(),blocks:[],exercises:[]},t.set(i,l)),l};for(let r of e.sections){for(let o of r.assets){let i=o.interactive;if(!i?.task||!i.block)continue;let l=n(i.task.id,i.task.label),s=`diagram:${i.block.id}`,u=l.blocks.find(d=>d.id===s);u||(u={id:s,label:i.block.label,kind:"diagram",phases:[],steps:[]},l.blocks.push(u));for(let d of i.phases??[]){let m=u.phases.find(y=>y.id===d.id);m||(m={...d,steps:[]},u.phases.push(m));for(let y of d.steps)m.steps.some(g=>g.id===y.id)||m.steps.push(y)}}for(let o of r.tasks){let i=n(o.ref,o.title);i.label=o.title||i.label;for(let l of o.flow){if(l.kind==="exercise"){i.exercises.some(u=>u.id===l.id)||i.exercises.push(l);continue}let s=`flow:${l.id}`;i.blocks.some(u=>u.id===s)||i.blocks.push({id:s,label:l.title,kind:"flow",phases:[],steps:l.steps.map((u,d)=>({id:u.id,number:d+1,label:u.title,description:u.title,mode:"RUN"}))})}}}return[...t.values()]}function hp({side:e,panels:t,activeId:n,pinnedId:r,onActiveChange:o,onPinnedChange:i}){let l=(0,N.useRef)(0),s=t.find(f=>f.id===n)??null,u=(0,N.useCallback)(()=>{window.clearTimeout(l.current)},[]),d=(0,N.useCallback)(()=>{u(),!r&&(l.current=window.setTimeout(()=>o(null),150))},[u,o,r]),m=(0,N.useCallback)(f=>{u(),r||o(f)},[u,o,r]),y=(0,N.useCallback)(f=>{if(u(),r===f){i(null),o(null);return}i(f),o(f)},[u,o,i,r]),g=(0,N.useCallback)(()=>{u(),i(null),o(null)},[u,o,i]);return(0,N.useEffect)(()=>()=>window.clearTimeout(l.current),[]),t.length?(0,a.jsxs)("div",{className:`side-panel-dock side-panel-dock--${e}`,"data-side":e,children:[(0,a.jsx)("nav",{className:"side-panel-rail","aria-label":`Panele ${e==="left"?"lewe":"prawe"}`,children:t.map(f=>{let E=n===f.id,b=r===f.id;return(0,a.jsx)("button",{type:"button",className:`side-panel-trigger${E?" is-open":""}${b?" is-pinned":""}`,style:{"--side-panel-accent":f.accent},"aria-controls":`side-panel-${e}-${f.id}`,"aria-expanded":E,"aria-pressed":b,"aria-label":`${f.title}: ${b?"odpnij":"przypnij"} panel`,title:`${f.title} \xB7 ${b?"Fixed":"Auto"}`,onMouseEnter:()=>m(f.id),onMouseLeave:d,onFocus:()=>m(f.id),onClick:()=>y(f.id),children:(0,a.jsx)("span",{children:f.railLabel})},f.id)})}),(0,a.jsx)("aside",{id:s?`side-panel-${e}-${s.id}`:void 0,className:`side-panel${s?" is-open":""}`,"aria-hidden":!s,"aria-label":s?.title,style:s?{"--side-panel-accent":s.accent}:void 0,onMouseEnter:u,onMouseLeave:d,onFocusCapture:u,children:s&&(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("header",{className:"side-panel-header",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("small",{children:e==="left"?"LEWY PANEL":"PRAWY PANEL"}),(0,a.jsx)("strong",{children:s.title})]}),(0,a.jsxs)("div",{className:"side-panel-actions",children:[(0,a.jsx)("button",{type:"button",className:r===s.id?"is-pinned":"",onClick:()=>y(s.id),title:r===s.id?"Tryb Fixed \u2014 kliknij, aby przej\u015B\u0107 do Auto":"Tryb Auto \u2014 kliknij, aby przypi\u0105\u0107",children:r===s.id?"Fixed":"Auto"}),(0,a.jsx)("button",{type:"button",onClick:g,"aria-label":`Zamknij ${s.title}`,children:"\xD7"})]})]}),(0,a.jsx)("div",{className:"side-panel-body",children:s.content})]})})]}):null}function fo({id:e,depth:t,kind:n,title:r,label:o,refValue:i,stateValue:l,stateKind:s,hasChildren:u=!1,expanded:d=!1,onToggle:m,href:y,current:g=!1,unavailable:f=!1,onNavigate:E}){let b=y?(0,a.jsx)("a",{className:"card-library-tree-link",href:y,onClick:E,"aria-current":g?"page":void 0,title:g?"Poka\u017C bie\u017C\u0105c\u0105 kart\u0119":`Otw\xF3rz: ${r}`,children:o}):(0,a.jsx)("span",{className:"card-library-tree-label",title:r,children:o});return(0,a.jsxs)("div",{className:`card-library-treegrid-row is-${n}${g?" is-current":""}${f?" is-unavailable":""}`,role:"row","aria-level":t+1,"aria-expanded":u?d:void 0,"aria-disabled":f||void 0,"data-node-id":e,style:{"--card-library-depth":t},children:[(0,a.jsxs)("span",{className:"card-library-tree-title",role:"gridcell",children:[u?(0,a.jsx)("button",{className:"card-library-tree-expander",type:"button",onClick:m,"aria-label":`${d?"Zwi\u0144":"Rozwi\u0144"}: ${r}`,children:d?"\u25BE":"\u25B8"}):(0,a.jsx)("span",{className:"card-library-tree-expander is-empty","aria-hidden":"true"}),b]}),(0,a.jsx)("span",{role:"gridcell",children:i}),(0,a.jsx)("span",{role:"gridcell",children:(0,a.jsx)("b",{className:"card-library-tree-state","data-state":s,children:l})})]})}function Qg({library:e,onNavigate:t}){if(!e)return null;let n=e.subjects.reduce((d,m)=>d+m.levels.reduce((y,g)=>y+g.series.length,0),0),r=e.subjects.reduce((d,m)=>d+m.levels.reduce((y,g)=>y+g.series.reduce((f,E)=>f+E.cards.filter(b=>b.available).length,0),0),0),o=e.subjects.reduce((d,m)=>d+m.levels.reduce((y,g)=>y+g.series.reduce((f,E)=>f+E.cards.length,0),0),0),[i,l]=(0,N.useState)(()=>{let d=new Set;return e.subjects.forEach(m=>{let y=`subject:${m.id}`;m.current&&d.add(y),m.levels.forEach(g=>{let f=`${y}:level:${g.id}`;g.current&&d.add(f),g.series.forEach(E=>{let b=`${f}:series:${E.id}`;E.current&&d.add(b),E.cards.forEach(_=>{_.current&&(_.tasks?.length??0)>0&&d.add(`${b}:card:${_.id}`)})})})}),d}),s=d=>i.has(d),u=d=>{l(m=>{let y=new Set(m);return y.has(d)?y.delete(d):y.add(d),y})};return(0,a.jsxs)("div",{className:"card-library-panel",children:[(0,a.jsxs)("div",{className:"card-library-treegrid",role:"treegrid","aria-label":"Serie, karty i taski","aria-colcount":3,children:[(0,a.jsxs)("div",{className:"card-library-treegrid-row card-library-treegrid-head",role:"row",children:[(0,a.jsx)("span",{role:"columnheader",children:"DRZEWO"}),(0,a.jsx)("span",{role:"columnheader",children:"REF"}),(0,a.jsx)("span",{role:"columnheader",children:"STATUS"})]}),e.subjects.map(d=>{let m=`subject:${d.id}`;return(0,a.jsxs)(N.default.Fragment,{children:[(0,a.jsx)(fo,{id:m,depth:0,kind:"subject",title:d.title,label:(0,a.jsx)("strong",{children:d.title}),refValue:"PRZEDMIOT",stateValue:`${d.levels.length} POZ.`,hasChildren:d.levels.length>0,expanded:s(m),onToggle:()=>u(m)}),s(m)&&d.levels.map(y=>{let g=`${m}:level:${y.id}`;return(0,a.jsxs)(N.default.Fragment,{children:[(0,a.jsx)(fo,{id:g,depth:1,kind:"level",title:y.title,label:(0,a.jsx)("strong",{children:y.title}),refValue:"ROK",stateValue:`${y.series.length} SERII`,hasChildren:y.series.length>0,expanded:s(g),onToggle:()=>u(g)}),s(g)&&y.series.map(f=>{let E=`${g}:series:${f.id}`;return(0,a.jsxs)(N.default.Fragment,{children:[(0,a.jsx)(fo,{id:E,depth:2,kind:"series",title:f.title,label:(0,a.jsx)("strong",{children:f.title}),refValue:f.role==="reference"?"REF.":"SERIA",stateValue:`${f.cards.length} KART`,hasChildren:f.cards.length>0,expanded:s(E),onToggle:()=>u(E)}),s(E)&&f.cards.map(b=>{let _=`${E}:card:${b.id}`,p=b.tasks??[],c=b.current||b.available,h=b.current?"current":b.available?"online":"plan";return(0,a.jsxs)(N.default.Fragment,{children:[(0,a.jsx)(fo,{id:_,depth:3,kind:"card",title:`${b.id} \xB7 ${b.title}`,label:(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("strong",{children:b.id}),(0,a.jsx)("span",{children:b.title})]}),refValue:b.version||"\u2014",stateValue:b.current?"BIE\u017B\u0104CA":b.available?"ONLINE":"PLAN",stateKind:h,hasChildren:p.length>0,expanded:s(_),onToggle:()=>u(_),href:c?b.current?"#":b.href:void 0,current:b.current,unavailable:!c,onNavigate:t}),s(_)&&p.map(k=>{let C=b.current?`#${k.id}`:`${b.href}#${k.id}`;return(0,a.jsx)(fo,{id:`${_}:task:${k.id}`,depth:4,kind:"task",title:`${k.id.toUpperCase()} \xB7 ${k.title}`,label:(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)("strong",{children:k.id.toUpperCase()}),(0,a.jsx)("span",{children:k.title})]}),refValue:"TASK",stateValue:c?"GOTOWY":"PLAN",stateKind:c?"online":"plan",href:c?C:void 0,unavailable:!c,onNavigate:t},`${_}:task:${k.id}`)})]},_)})]},E)})]},g)})]},m)})]}),(0,a.jsxs)("footer",{className:"card-library-footer",children:[(0,a.jsx)("span",{children:e.workspace||"STEM"}),(0,a.jsxs)("span",{children:[n," serii"]}),(0,a.jsxs)("span",{children:[(0,a.jsx)("i",{className:"is-online"})," ",r,"/",o," online"]}),(0,a.jsx)("kbd",{children:"Esc"})]})]})}function qg({toc:e,onNavigate:t}){return(0,a.jsxs)("nav",{className:"side-toc","aria-label":"Spis tre\u015Bci karty",children:[(0,a.jsxs)("header",{children:[(0,a.jsx)("small",{children:"KARTA PRACY"}),(0,a.jsx)("h2",{children:"Spis tre\u015Bci"})]}),(0,a.jsx)("ol",{children:e.map((n,r)=>(0,a.jsx)("li",{children:(0,a.jsxs)("a",{href:`#${n.id}`,onClick:t,children:[(0,a.jsx)("span",{children:String(r+1).padStart(2,"0")}),(0,a.jsx)("strong",{children:n.label})]})},n.id))})]})}function Xg({progress:e,error:t}){let n=e?.summary?.counts;return(0,a.jsxs)("section",{className:"side-progress","aria-label":"Przebieg zaj\u0119\u0107 i raport",children:[(0,a.jsxs)("header",{children:[(0,a.jsx)("small",{children:"DOWODY I RAPORT"}),(0,a.jsx)("h2",{children:"Przebieg zaj\u0119\u0107"})]}),(0,a.jsxs)("div",{className:"side-progress-summary",children:[(0,a.jsx)("span",{children:"Zatwierdzone kroki"}),(0,a.jsx)("strong",{children:n?`${n.approved}/${e.summary.total}`:"\u2014"})]}),t&&(0,a.jsx)("p",{className:"side-progress-error",children:t}),(0,a.jsxs)("div",{className:"side-progress-links",children:[(0,a.jsx)("a",{href:"/api/report/teams.md",target:"_blank",rel:"noopener",children:"Raport do Teams"}),(0,a.jsx)("a",{href:"/api/report/lesson.html",target:"_blank",rel:"noopener",children:"\u015Alad lekcji ze zrzutami"})]})]})}var Zg={online:"ONLINE",away:"ZAJ\u0118TY",offline:"OFFLINE",error:"B\u0141\u0104D"},Jg={follow:"SYNC",paused:"PAUZA",local:"LOKAL."},yp={present:"BY\u0141",missed:"NIE BY\u0141",pending:"OCZEK."},eh={committed:"COMMIT",working:"PRACA",missing:"BRAK"};function zp(e){let t=2166136261;for(let n=0;n>>0}function vp(e,t,n){let r=zp(`${e.id}:step:${t}`),o=r%8,i=o===0?"missed":o===1?"pending":"present",l=8+n*4+r%3,s=10+Math.floor(l/60),u=l%60,d=(e.laptop*7+r)%60;return{state:i,timestamp:i==="present"?`${String(s).padStart(2,"0")}:${String(u).padStart(2,"0")}:${String(d).padStart(2,"0")}`:"\u2014"}}function xp(e,t){let n=zp(`${e.id}:exercise:${t}`),r=n%6,o=r===0?"missing":r===1?"working":"committed";return{state:o,commit:o==="committed"?n.toString(16).padStart(8,"0").slice(0,7):"\u2014"}}function Gt({id:e,depth:t,title:n,kind:r,refValue:o,session:i,evidence:l,state:s,hasChildren:u=!1,expanded:d=!1,onToggle:m}){return(0,a.jsxs)("div",{className:`classroom-treegrid-row classroom-node-row is-${r}`,role:"row","aria-level":t+1,"aria-expanded":u?d:void 0,"data-node-id":e,style:{"--classroom-depth":t},children:[(0,a.jsxs)("span",{className:"classroom-node-title",role:"gridcell",title:n,children:[u?(0,a.jsx)("button",{className:"classroom-expander",type:"button",onClick:m,"aria-label":`${d?"Zwi\u0144":"Rozwi\u0144"}: ${n}`,children:d?"\u25BE":"\u25B8"}):(0,a.jsx)("span",{className:"classroom-expander is-empty","aria-hidden":"true"}),(0,a.jsx)("strong",{children:n})]}),(0,a.jsx)("span",{role:"gridcell",children:o}),(0,a.jsx)("span",{role:"gridcell",children:i}),(0,a.jsx)("span",{role:"gridcell",children:l}),(0,a.jsx)("span",{role:"gridcell",children:s})]})}function th({model:e}){let t=Yg(e),n=In[0]?.id,r=t[0]?.id,[o,i]=(0,N.useState)(()=>new Set(["class",...n?[`student:${n}`]:[],...n&&r?[`student:${n}:task:${r}`]:[]])),l=m=>o.has(m),s=m=>{i(y=>{let g=new Set(y);return g.has(m)?g.delete(m):g.add(m),g})},u=In.filter(m=>m.connection==="online"||m.connection==="away").length,d=In.filter(m=>m.sync==="follow").length;return(0,a.jsxs)("section",{className:"classroom-panel","aria-label":"Klasa i stanowiska uczni\xF3w",children:[(0,a.jsxs)("div",{className:"classroom-treegrid",role:"treegrid","aria-label":"Uczniowie, struktura karty, obecno\u015B\u0107 i commity","aria-colcount":5,children:[(0,a.jsxs)("div",{className:"classroom-treegrid-row classroom-treegrid-head",role:"row",children:[(0,a.jsx)("span",{role:"columnheader",children:"DRZEWO"}),(0,a.jsx)("span",{role:"columnheader",children:"REF"}),(0,a.jsx)("span",{role:"columnheader",children:"SESJA"}),(0,a.jsx)("span",{role:"columnheader",children:"DOW\xD3D"}),(0,a.jsx)("span",{role:"columnheader",children:"STAN"})]}),(0,a.jsx)(Gt,{id:"class",depth:0,kind:"class",title:"2TP \xB7 grupa A",refValue:`${In.length} ucz.`,session:`${u}/${In.length}`,evidence:`${d}/${In.length} SYNC`,state:`${t.length} TASK`,hasChildren:!0,expanded:l("class"),onToggle:()=>s("class")}),l("class")&&In.map(m=>{let y=`student:${m.id}`;return(0,a.jsxs)(N.default.Fragment,{children:[(0,a.jsx)(Gt,{id:y,depth:1,kind:"student",title:m.name,refValue:`L${String(m.laptop).padStart(2,"0")}`,session:(0,a.jsx)("b",{className:"classroom-status","data-status":m.connection,children:Zg[m.connection]}),evidence:(0,a.jsx)("b",{className:"classroom-sync","data-sync":m.sync,children:Jg[m.sync]}),state:m.position,hasChildren:t.length>0,expanded:l(y),onToggle:()=>s(y)}),l(y)&&t.map(g=>{let f=`${y}:task:${g.id}`,E=g.exercises.filter(b=>xp(m,b.id).state==="committed").length;return(0,a.jsxs)(N.default.Fragment,{children:[(0,a.jsx)(Gt,{id:f,depth:2,kind:"task",title:g.label,refValue:g.id.toUpperCase(),session:`${g.blocks.length} BLOCK`,evidence:`${E}/${g.exercises.length} COMMIT`,state:"TASK",hasChildren:g.blocks.length+g.exercises.length>0,expanded:l(f),onToggle:()=>s(f)}),l(f)&&g.blocks.map(b=>{let _=`${f}:block:${b.id}`,p=b.phases.length||b.steps.length;return(0,a.jsxs)(N.default.Fragment,{children:[(0,a.jsx)(Gt,{id:_,depth:3,kind:"block",title:b.label,refValue:b.kind==="diagram"?"BLOCK":"TASK BLOCK",session:`${p} ${b.phases.length?"PHASE":"STEP"}`,evidence:"\u2014",state:b.kind==="diagram"?"UML":"FLOW",hasChildren:p>0,expanded:l(_),onToggle:()=>s(_)}),l(_)&&b.phases.map(c=>{let h=`${_}:phase:${c.id}`;return(0,a.jsxs)(N.default.Fragment,{children:[(0,a.jsx)(Gt,{id:h,depth:4,kind:"phase",title:`PHASE \xB7 ${c.label}`,refValue:`${c.steps.length} STEP`,session:"\u2014",evidence:"\u2014",state:"PHASE",hasChildren:c.steps.length>0,expanded:l(h),onToggle:()=>s(h)}),l(h)&&c.steps.map(k=>{let C=vp(m,`${b.id}:${c.id}:${k.id}`,k.number);return(0,a.jsx)(Gt,{id:`${h}:step:${k.id}`,depth:5,kind:"step",title:`STEP ${String(k.number).padStart(2,"0")} \xB7 ${k.label}`,refValue:k.mode??"CODE",session:(0,a.jsx)("b",{className:"classroom-visit","data-visit":C.state,children:yp[C.state]}),evidence:C.timestamp,state:C.state==="present"?"OK":C.state==="missed"?"BRAK":"\u2014"},`${h}:step:${k.id}`)})]},h)}),l(_)&&b.steps.map(c=>{let h=vp(m,`${b.id}:${c.id}`,c.number);return(0,a.jsx)(Gt,{id:`${_}:step:${c.id}`,depth:4,kind:"step",title:`STEP ${String(c.number).padStart(2,"0")} \xB7 ${c.label}`,refValue:c.mode??"RUN",session:(0,a.jsx)("b",{className:"classroom-visit","data-visit":h.state,children:yp[h.state]}),evidence:h.timestamp,state:h.state==="present"?"OK":h.state==="missed"?"BRAK":"\u2014"},`${_}:step:${c.id}`)})]},_)}),l(f)&&g.exercises.length>0&&(()=>{let b=`${f}:exercises`;return(0,a.jsxs)(N.default.Fragment,{children:[(0,a.jsx)(Gt,{id:b,depth:3,kind:"exercises",title:"EXERCISES",refValue:`${g.exercises.length} EX`,session:`${E}/${g.exercises.length}`,evidence:"GIT",state:E===g.exercises.length?"DONE":"TODO",hasChildren:!0,expanded:l(b),onToggle:()=>s(b)}),l(b)&&g.exercises.map(_=>{let p=xp(m,_.id);return(0,a.jsx)(Gt,{id:`${b}:${_.id}`,depth:4,kind:"exercise",title:`EXERCISE \xB7 ${_.title}`,refValue:_.id,session:(0,a.jsx)("b",{className:"classroom-commit","data-commit":p.state,children:eh[p.state]}),evidence:p.commit,state:p.state==="committed"?"DONE":p.state==="working"?"W TOKU":"TODO"},`${b}:${_.id}`)})]},b)})()]},f)})]},m.id)})]}),(0,a.jsxs)("footer",{className:"classroom-legend",children:[(0,a.jsxs)("span",{children:[(0,a.jsx)("b",{children:"BY\u0141"})," obecny przy omawianym STEP"]}),(0,a.jsxs)("span",{children:[(0,a.jsx)("b",{children:"COMMIT"})," rozwi\u0105zanie EXERCISE zapisane w Git"]})]})]})}function nh({open:e,onClose:t}){return e?(0,a.jsx)("div",{className:"shortcut-help-backdrop",role:"presentation",onMouseDown:t,children:(0,a.jsxs)("section",{className:"shortcut-help",role:"dialog","aria-modal":"true","aria-labelledby":"shortcut-help-title",onMouseDown:r=>r.stopPropagation(),children:[(0,a.jsxs)("header",{children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("small",{children:"F12 \xB7 NAWIGACJA DYDAKTYCZNA"}),(0,a.jsx)("h2",{id:"shortcut-help-title",children:"CARD \u2192 TASK \u2192 BLOCK \u2192 PHASE \u2192 STEP \u2192 SNAPSHOT"})]}),(0,a.jsx)("button",{onClick:t,"aria-label":"Zamknij skorowidz",children:"\xD7"})]}),(0,a.jsx)("dl",{children:[["Alt + \u2191 / \u2193","poprzedni / nast\u0119pny TASK"],["Ctrl + \u2191 / \u2193","poprzedni / nast\u0119pny BLOCK"],["Shift + \u2191 / \u2193","poprzednia / nast\u0119pna PHASE"],["Ctrl + Shift + \u2191 / \u2193","poprzedni / nast\u0119pny STEP"],["Alt + Shift + \u2191 / \u2193","poprzedni / nast\u0119pny unikalny SNAPSHOT"],["\u2191 / \u2193","poprzedni / nast\u0119pny element aktywnego poziomu"],["\u2192","zejd\u017A poziom ni\u017Cej"],["\u2190 / Esc","wr\xF3\u0107 poziom wy\u017Cej"],["Enter","wybierz element; przy SYNC ON odtw\xF3rz stan"],["F1","reset aktualnego celu Neovima/kontenera"],["F2","synchronizuj cel z kursorem drzewa UML"],["Ctrl + `","maksymalizuj pane, dopasuj siatk\u0119 i od\u015Bwie\u017C Neovima"],["Ctrl + Enter","zatwierd\u017A lub cofnij zatwierdzenie kroku"],["Alt + 0","wysu\u0144 lub schowaj panel serii i kart"],["Alt + 1","poka\u017C lub ukryj panel Neovima"],["Alt + 2","prze\u0142\u0105cz SYNC OFF / SYNC ON"],["Alt + 3","uzbr\xF3j lub rozbr\xF3j sterowanie Neovimem"],["Alt + 4","wysoki panel 90% / zapisana wysoko\u015B\u0107 normalna"],["Alt + 5","dopasuj ca\u0142y ekran Neovima; wy\u0142\u0105cz r\u0119czny suwak"],["Alt + 6","przypnij lub ukryj model alokatora"],["Alt + 7","po\u0142\u0105cz segmenty UML w szeroki spread / wr\xF3\u0107 do A4"],["Alt + 3, potem najed\u017A","przeka\u017C klawiatur\u0119 i mysz do aktywnej sesji"],["Alt + W","prefiks polece\u0144 okien Neovima ()"],["Alt + strza\u0142ka","przejd\u017A do s\u0105siedniego okna Neovima"],["F12","poka\u017C lub ukryj ten skorowidz"]].map(([r,o])=>(0,a.jsxs)("div",{children:[(0,a.jsx)("dt",{children:(0,a.jsx)("kbd",{children:r})}),(0,a.jsx)("dd",{children:o})]},r))}),(0,a.jsx)("p",{children:"Przy SYNC ON wyb\xF3r stepu odtwarza i weryfikuje przypi\u0119ty stan maszyny. SYNC OFF nie resetuje debuggera. Po najechaniu panel przekazuje do Neovima wy\u0142\u0105cznie kontrolowane zdarzenia klawiatury i myszy, wi\u0119c mo\u017Cna normalnie kontynuowa\u0107 debugowanie."})]})}):null}function rh({model:e}){let t=!!e.has_allocator_model,n=(0,N.useRef)(null),r=(0,N.useRef)(null),o=(0,N.useRef)(`browser-${globalThis.crypto?.randomUUID?.()??Math.random().toString(36).slice(2)}`),i=(0,N.useRef)(0),l=(0,N.useRef)(0),s=(0,N.useRef)(!1),u=(0,N.useRef)(!1),d=(0,N.useRef)(0),m=(0,N.useRef)(0),y=(0,N.useRef)(0),[g,f]=(0,N.useState)(2.18),[E,b]=(0,N.useState)(()=>localStorage.getItem("stem-card-nvim-visible")!=="false"),[_,p]=(0,N.useState)(()=>localStorage.getItem("stem-card-nvim-sync-mode")==="true"),[c,h]=(0,N.useState)(()=>localStorage.getItem("stem-card-nvim-sync-mode")==="true"&&localStorage.getItem("stem-card-nvim-control-mode")==="true"),[k,C]=(0,N.useState)(!1),[P,T]=(0,N.useState)(!1),[R,j]=(0,N.useState)(()=>t&&localStorage.getItem("stem-card-allocator-visible")!=="false"),[I,ke]=(0,N.useState)(()=>{let v=localStorage.getItem("stem-card-diagram-spread");return v===null?!!e.has_spread:v==="true"}),[re,G]=(0,N.useState)({state:"hidden",syncMode:!1,syncReady:!1,controlMode:!1,controlEnabled:!1}),[U,Le]=(0,N.useState)(null),[Ne,Q]=(0,N.useState)(""),[et,Ge]=(0,N.useState)(null),[je,me]=(0,N.useState)(null),[Dn,xe]=(0,N.useState)(null),[bn,se]=(0,N.useState)(null),[A,F]=(0,N.useState)(!1),[B,te]=(0,N.useState)(""),[at,zt]=(0,N.useState)(()=>window.innerWidth),Ee=et==="library",ne=!!(et||Dn),st=(0,N.useCallback)(v=>{if(v){Ge("library"),me("library");return}Ge(w=>w==="library"?null:w),me(w=>w==="library"?null:w)},[]),Ye=(0,N.useCallback)(v=>{window.clearTimeout(y.current),te(v),y.current=window.setTimeout(()=>te(""),4200)},[]),wn=(0,N.useCallback)(async v=>{Ye(`${v} \xB7 wykonywanie\u2026`);try{let L=await fetch(v==="F1"?"/api/nvim/reset":"/api/navigation/sync",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({actor:o.current})}),H=await L.json().catch(()=>({}));if(!L.ok)throw new Error(H.message??H.error??`HTTP ${L.status}`);v==="F2"&&H.current?(l.current=Math.max(l.current,Number(H.current.revision??0)),window.dispatchEvent(new CustomEvent("stem:navigation-command",{detail:H.current})),Ye(`F2 \xB7 ${String(H.current.step.number).padStart(2,"0")} ${H.current.step.label} \xB7 READY`)):Ye("F1 \xB7 reset przyj\u0119ty"),window.setTimeout(()=>window.dispatchEvent(new Event("stem:nvim-refresh")),120)}catch(w){Ye(`${v} \xB7 ${w instanceof Error?w.message:String(w)}`)}},[Ye]),ie=(0,N.useCallback)(async()=>{Ye("Ctrl+` \xB7 przeliczanie widoku\u2026");try{let v=await fetch("/api/nvim/redraw",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({actor:o.current})}),w=await v.json().catch(()=>({}));if(!v.ok)throw new Error(w.message??w.error??`HTTP ${v.status}`);let L=w.external_ui?.grid,H=L?` \xB7 ${L.width}\xD7${L.height}`:"";Ye(`Ctrl+\` \xB7 widok od\u015Bwie\u017Cony${H}`),window.dispatchEvent(new Event("stem:nvim-refresh"))}catch(v){Ye(`Ctrl+\` \xB7 ${v instanceof Error?v.message:String(v)}`)}},[Ye]),q=(0,N.useCallback)(async v=>{try{let w=await fetch("/api/viewer/state",{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({actor:o.current,viewer:v})});if(!w.ok)return;let L=await w.json();i.current=Math.max(i.current,Number(L.viewer?.revision??0))}catch{}},[]),bt=v=>{let w=Math.max(.25,Math.min(3,v));f(w),q({scale:w})};(0,N.useEffect)(()=>{document.documentElement.style.setProperty("--viewer-canvas-scale",g.toFixed(3))},[g]),(0,N.useEffect)(()=>{if(!I)return;let v=r.current;if(!v)return;let w=0,L=()=>{window.cancelAnimationFrame(w),w=window.requestAnimationFrame(()=>{v.scrollLeft=Math.max(0,(v.scrollWidth-v.clientWidth)/2)})},H=window.requestAnimationFrame(L);return window.addEventListener("resize",L),()=>{window.cancelAnimationFrame(H),window.cancelAnimationFrame(w),window.removeEventListener("resize",L)}},[I,g,at]),(0,N.useEffect)(()=>{let v=()=>zt(window.innerWidth);return window.addEventListener("resize",v),()=>window.removeEventListener("resize",v)},[]),(0,N.useEffect)(()=>{document.documentElement.dataset.nvimSyncMode=_?"on":"off"},[_]),(0,N.useEffect)(()=>{document.documentElement.dataset.cardClientId=o.current},[]);let fe=v=>{b(v),v||(C(!1),T(!1)),localStorage.setItem("stem-card-nvim-visible",String(v)),q({nvim:{visible:v,...v?{}:{expanded:!1,fit:!1}}})},Qt=v=>{let w=v&&_;h(w),localStorage.setItem("stem-card-nvim-control-mode",String(w)),q({nvim:{control:w}})},jn=v=>{p(v),localStorage.setItem("stem-card-nvim-sync-mode",String(v)),v||(h(!1),localStorage.setItem("stem-card-nvim-control-mode","false")),q({nvim:{sync:v,control:v?c:!1}})},qt=v=>{v&&fe(!0),v&&T(!1),C(v),q({nvim:{visible:v||E,expanded:v,fit:!1}})},ho=v=>{v&&(fe(!0),C(!1)),T(v),q({nvim:{visible:v||E,fit:v,expanded:!1}})},yo=v=>{let w=t&&v;j(w),localStorage.setItem("stem-card-allocator-visible",String(w)),q({allocator:{visible:w}})},Un=v=>{let w=!!(e.has_spread&&v);ke(w),localStorage.setItem("stem-card-diagram-spread",String(w))};(0,N.useEffect)(()=>{let v=0,w=window.requestAnimationFrame(()=>{v=window.requestAnimationFrame(()=>{window.dispatchEvent(new Event("stem:nvim-refresh"))})});return()=>{window.cancelAnimationFrame(w),window.cancelAnimationFrame(v)}},[k,P]),(0,N.useEffect)(()=>{fetch("/api/progress").then(v=>v.ok?v.json():Promise.reject(new Error(`HTTP ${v.status}`))).then(v=>Le(v.progress)).catch(v=>Q(`Post\u0119p dzia\u0142a tylko przez serwer karty (${v.message}).`))},[]),(0,N.useEffect)(()=>{let v=!1,w=!1,L={scale:g,viewport:{width:window.innerWidth,height:window.innerHeight},nvim:{visible:E,sync:_,control:c,expanded:k,fit:P},allocator:{visible:R}},H=D=>{let Z=D.nvim.visible&&D.nvim.fit,V=D.nvim.visible&&!Z&&D.nvim.expanded;f(Math.max(.25,Math.min(3,D.scale))),b(D.nvim.visible),p(D.nvim.sync),h(D.nvim.sync&&D.nvim.control),C(V),T(Z);let oe=t&&(D.allocator?.visible??!0);j(oe),localStorage.setItem("stem-card-nvim-visible",String(D.nvim.visible)),localStorage.setItem("stem-card-nvim-sync-mode",String(D.nvim.sync)),localStorage.setItem("stem-card-nvim-control-mode",String(D.nvim.sync&&D.nvim.control)),localStorage.setItem("stem-card-allocator-visible",String(oe));let ct=++m.current;s.current=!0,window.cancelAnimationFrame(d.current),d.current=window.requestAnimationFrame(()=>{if(ct!==m.current)return;let Ue=Gi();Ki(Ue,{left:D.scroll.x,top:D.scroll.y});let ue=Array.from(document.querySelectorAll(".paper .sheet")),Re=ue[Math.max(0,Math.min(ue.length-1,D.scroll.page_index))]?.querySelector(".sheet-content");Re&&Number.isFinite(D.scroll.sheet_scroll_top)&&Ki(Re,{top:D.scroll.sheet_scroll_top??0}),d.current=window.requestAnimationFrame(()=>{ct===m.current&&(s.current=!1,u.current&&(u.current=!1,window.dispatchEvent(new Event("stem:viewer-scroll-settled"))))})})},K=async()=>{try{let D=await fetch("/api/control/state",{cache:"no-store"});if(!D.ok||v)return;let Z=await D.json(),V=Z.viewer;w||(w=!0,Number(V?.revision??0)===0&&q(L)),V&&V.revision>i.current&&(i.current=V.revision,V.actor!==o.current&&H(V));let oe=Z.navigation;oe&&oe.revision>l.current&&(l.current=oe.revision,oe.actor!==o.current&&(s.current&&(u.current=!0),window.dispatchEvent(new CustomEvent("stem:navigation-command",{detail:oe}))))}catch{}};K();let X=window.setInterval(K,300);return()=>{v=!0,window.clearInterval(X),m.current+=1,window.cancelAnimationFrame(d.current),s.current=!1,u.current=!1}},[]),(0,N.useEffect)(()=>{q({nvim:{connection:re.state,screen_cursor:re.screenCursor,grid:re.grid}})},[re.grid?.columns,re.grid?.rows,re.screenCursor?.column,re.screenCursor?.row,re.state,q]),(0,N.useEffect)(()=>{let v=0,w=null,L=Array.from(document.querySelectorAll(".paper .sheet")),H=L.map(X=>X.querySelector(".sheet-content")).filter(X=>!!X),K=X=>{if(s.current)return;let D=X?.currentTarget;D instanceof HTMLElement&&D.classList.contains("sheet-content")&&(w=D),window.clearTimeout(v),v=window.setTimeout(()=>{let Z=w?.closest(".sheet"),V=Z?L.indexOf(Z):-1,oe=V>=0?V:L.reduce((Ue,ue,J)=>{let Re=ue.getBoundingClientRect(),Ve=Math.abs((Re.top+Re.bottom)/2-window.innerHeight/2);return Ve=0?w:L[oe]?.querySelector(".sheet-content")??null;q({scroll:{x:window.scrollX,y:window.scrollY,page_index:oe,sheet_scroll_top:ct?.scrollTop??0},viewport:{width:window.innerWidth,height:window.innerHeight}}),w=null},120)};return window.addEventListener("scroll",K,{passive:!0}),window.addEventListener("resize",K),window.addEventListener("stem:viewer-scroll-settled",K),H.forEach(X=>X.addEventListener("scroll",K,{passive:!0})),K(),()=>{window.clearTimeout(v),window.removeEventListener("scroll",K),window.removeEventListener("resize",K),window.removeEventListener("stem:viewer-scroll-settled",K),H.forEach(X=>X.removeEventListener("scroll",K))}},[q]),(0,N.useEffect)(()=>{let v=w=>{if(w.repeat)return;let L=w.altKey&&!w.ctrlKey&&!w.metaKey?w.code:"";if(L==="Digit0"&&e.library){w.preventDefault(),w.stopImmediatePropagation(),F(!1),st(!Ee);return}if(L==="Digit1"){w.preventDefault(),w.stopImmediatePropagation(),fe(!E);return}if(L==="Digit2"){w.preventDefault(),w.stopImmediatePropagation(),jn(!_);return}if(L==="Digit3"){if(w.preventDefault(),w.stopImmediatePropagation(),!_)return;fe(!0),Qt(!c);return}if(L==="Digit4"){w.preventDefault(),w.stopImmediatePropagation(),qt(!k);return}if(L==="Digit5"){w.preventDefault(),w.stopImmediatePropagation(),ho(!P);return}if(L==="Digit6"&&t){w.preventDefault(),w.stopImmediatePropagation(),yo(!R);return}if(L==="Digit7"&&e.has_spread){w.preventDefault(),w.stopImmediatePropagation(),Un(!I);return}if((w.key==="F1"||w.key==="F2")&&!w.altKey&&!w.ctrlKey&&!w.metaKey&&!w.shiftKey){w.preventDefault(),w.stopImmediatePropagation(),wn(w.key);return}if(w.ctrlKey&&!w.altKey&&!w.metaKey&&!w.shiftKey&&(w.code==="Backquote"||w.key==="`")){w.preventDefault(),w.stopImmediatePropagation(),ie();return}if(w.key==="F12"){w.preventDefault(),w.stopImmediatePropagation(),st(!1),Ge(null),me(null),xe(null),se(null),F(H=>!H);return}if(w.key==="Escape"&&(ne||A)){w.preventDefault(),w.stopImmediatePropagation(),Ge(null),me(null),xe(null),se(null),F(!1);return}};return window.addEventListener("keydown",v,!0),()=>window.removeEventListener("keydown",v,!0)},[R,I,t,Ee,e.has_spread,e.library,c,k,P,_,E,wn,ie,A,ne]),(0,N.useEffect)(()=>{let v=n.current?.querySelector(".topbar");if(!v)return;let w=()=>{document.documentElement.style.setProperty("--side-panel-top",`${Math.ceil(v.getBoundingClientRect().bottom)}px`)};w();let L=new ResizeObserver(w);return L.observe(v),window.addEventListener("resize",w),()=>{L.disconnect(),window.removeEventListener("resize",w),document.documentElement.style.removeProperty("--side-panel-top")}},[]),(0,N.useEffect)(()=>()=>window.clearTimeout(y.current),[]),(0,N.useEffect)(()=>{let v=w=>{!w.altKey||w.ctrlKey||(w.preventDefault(),f(L=>{let H=Math.max(.25,Math.min(3,L*Math.exp(-Math.max(-120,Math.min(120,w.deltaY))*.001)));return q({scale:H}),H}))};return window.addEventListener("wheel",v,{passive:!1}),()=>window.removeEventListener("wheel",v)},[q]);let ut=async(v,w)=>{try{let L=await fetch(`/api/progress/${encodeURIComponent(v)}`,{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify({status:w})});if(!L.ok)throw new Error(await L.text());Le((await L.json()).progress),Q("")}catch(L){Q(`Nie zapisano post\u0119pu: ${L instanceof Error?L.message:String(L)}`)}},x=(v,w)=>{ut(v,{pending:"approved",approved:"pending"}[w])},S=0,M=e.sections.map(v=>{let w=S;return S+=v.assets.length,{section:v,figureOffset:w}}),O=[];return M.forEach(v=>{let w=v.section.spread_group??"",L=O[O.length-1];if(w&&L?.spreadGroup===w){L.pages.push(v);return}O.push({key:w||v.section.id,spreadGroup:w,spreadLabel:v.section.spread_label??"",spreadColumns:v.section.spread_columns??1,pages:[v]})}),(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)("div",{ref:n,className:`viewer-chrome${k?" is-nvim-expanded":""}${P?" is-nvim-fit":""}`,children:[(0,a.jsx)(bg,{toc:e.toc,libraryAvailable:!!e.library,libraryOpen:Ee,setLibraryOpen:st,scale:g,setScale:bt,nvimVisible:E,setNvimVisible:fe,nvimSyncMode:_,setNvimSyncMode:jn,nvimControlMode:c,setNvimControlMode:Qt,nvimExpanded:k,setNvimExpanded:qt,nvimFit:P,setNvimFit:ho,allocatorVisible:R,setAllocatorVisible:yo,hasAllocatorModel:t,diagramSpread:I,setDiagramSpread:Un,hasDiagramSpread:!!e.has_spread,nvimSummary:re,progress:U,progressError:Ne}),e.viewpoints?.length?(0,a.jsx)(xg,{viewpoints:e.viewpoints}):null,(0,a.jsx)(wg,{visible:t&&R,model:e}),(0,a.jsx)(Mg,{visible:E,syncMode:_,controlMode:c,expanded:k,fit:P,scale:g,onSummaryChange:G}),B&&(0,a.jsx)("output",{className:"viewer-action-toast",children:B})]}),(0,a.jsxs)("main",{ref:r,className:`paper${I?" is-diagram-spread":""}`,children:[(0,a.jsx)(Og,{front:e.front}),O.map(v=>{let w=Array.from({length:Math.ceil(v.pages.length/v.spreadColumns)},(D,Z)=>v.pages.slice(Z*v.spreadColumns,(Z+1)*v.spreadColumns)),H=Math.max(1,...w.map(D=>D.reduce((Z,V)=>Z+(V.section.page_orientation==="landscape"?297:210),Math.max(0,D.length-1)*2)))*(96/25.4)*g,K=Math.min(1,Math.max(.25,(at-24)/H)),X=v.pages.map(({section:D,figureOffset:Z})=>(0,a.jsx)(Wg,{section:D,progress:U,onCycle:x,onSetStatus:ut,figureOffset:Z},D.id));return v.spreadGroup?(0,a.jsx)("section",{className:"sheet-spread","data-spread-group":v.spreadGroup,"aria-label":v.spreadLabel||"Wielostronicowy diagram UML",style:{"--spread-columns":v.spreadColumns,"--spread-fit-scale":K},children:X},v.key):X[0]}),e.dictionary&&(0,a.jsxs)(ys,{header:e.dictionary.header_html,className:"dictionary-sheet",children:[(0,a.jsx)("h2",{children:"S\u0142ownik WE/EN/EK/KW"}),(0,a.jsx)(Yt,{html:e.dictionary.content_html})]})]}),(0,a.jsx)(hp,{side:"left",panels:[...e.library?[{id:"library",railLabel:"K",title:"Serie i karty",accent:"#167ca4",content:(0,a.jsx)(Qg,{library:e.library,onNavigate:()=>st(!1)})}]:[],{id:"contents",railLabel:"S",title:"Spis tre\u015Bci",accent:"#16805d",content:(0,a.jsx)(qg,{toc:e.toc,onNavigate:()=>{Ge(null),me(null)}})}],activeId:et,pinnedId:je,onActiveChange:Ge,onPinnedChange:me}),(0,a.jsx)(hp,{side:"right",panels:[{id:"classroom",railLabel:"U",title:"Klasa i stanowiska",accent:"#267357",content:(0,a.jsx)(th,{model:e})},{id:"progress",railLabel:"R",title:"Przebieg i raport",accent:"#b45b26",content:(0,a.jsx)(Xg,{progress:U,error:Ne})}],activeId:Dn,pinnedId:bn,onActiveChange:xe,onPinnedChange:se}),(0,a.jsx)(nh,{open:A,onClose:()=>F(!1)})]})}async function oh(){let e=(0,bp.createRoot)(document.getElementById("root"));try{let t=await fetch("./card-data.json",{cache:"no-store"});if(!t.ok)throw new Error(`Nie mo\u017Cna wczyta\u0107 card-data.json: ${t.status}`);let n=await t.json();e.render((0,a.jsx)(rh,{model:n}))}catch(t){e.render((0,a.jsxs)("main",{className:"app-load-error",children:[(0,a.jsx)("h1",{children:"Nie uda\u0142o si\u0119 uruchomi\u0107 karty"}),(0,a.jsx)("pre",{children:t instanceof Error?t.message:String(t)})]}))}}oh(); +/*! Bundled license information: + +react/cjs/react.production.min.js: + (** + * @license React + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + *) + +scheduler/cjs/scheduler.production.min.js: + (** + * @license React + * scheduler.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + *) + +react-dom/cjs/react-dom.production.min.js: + (** + * @license React + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + *) + +react/cjs/react-jsx-runtime.production.min.js: + (** + * @license React + * react-jsx-runtime.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + *) +*/ diff --git a/web/card-data.json b/web/card-data.json new file mode 100644 index 0000000..7779d9e --- /dev/null +++ b/web/card-data.json @@ -0,0 +1,2567 @@ +{ + "schema": "esc-card-react-view.v1", + "card": { + "id": "mpabi-inf-c-12-uart-polling-interrupts", + "series": "c", + "series_title": "C · Freestanding RV32I and K&R", + "number": "12", + "count": "13", + "slug": "uart-polling-interrupts", + "title": "UART — polling i przerwania RX", + "topic": "MMIO UART, external IRQ oraz jednokomórkowa skrzynka ISR do main", + "project": "Freestanding C na RV32I", + "subject": "Informatyka", + "level": "Rok 1 · C12 · RV32I/Hazard3", + "revision_date": "2026-07-20T00:00:00+02:00", + "status": "Gotowa", + "version": "v00.01", + "uuid": "e766c4bb-2a43-5f4e-b10a-b3393a42932c", + "author": "M. Pabiszczak", + "year": "2026" + }, + "library": { + "schema": "stem-card-library.v2", + "workspace": "edu", + "subjects": [ + { + "id": "inf", + "title": "INF · Informatyka", + "current": true, + "levels": [ + { + "id": "year-1", + "title": "Rok 1", + "current": true, + "series": [ + { + "id": "console-bash", + "title": "Bash · Console Tools", + "current": false, + "catalog_only": true, + "role": "", + "status": "", + "cards": [ + { + "id": "L01", + "title": "BusyBox — the Swiss Army Knife", + "repo": "lab-console-busybox", + "href": "", + "available": false, + "current": false, + "number": "01", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L02", + "title": "Tmux — sessions, windows and panes", + "repo": "lab-console-tmux", + "href": "", + "available": false, + "current": false, + "number": "02", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L03", + "title": "Neovim — navigation and editing", + "repo": "lab-console-neovim", + "href": "", + "available": false, + "current": false, + "number": "03", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L04", + "title": "Git Basics I — status, add and commit", + "repo": "lab-console-git-basics-1", + "href": "", + "available": false, + "current": false, + "number": "04", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L05", + "title": "Git Basics II — log, diff and restore", + "repo": "lab-console-git-basics-2", + "href": "", + "available": false, + "current": false, + "number": "05", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L06", + "title": "Git Branching I — branch, switch and merge", + "repo": "lab-console-git-branching-1", + "href": "", + "available": false, + "current": false, + "number": "06", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L07", + "title": "Git Branching II — rebase and conflicts", + "repo": "lab-console-git-branching-2", + "href": "", + "available": false, + "current": false, + "number": "07", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L08", + "title": "Docker Fundamentals", + "repo": "lab-console-docker", + "href": "", + "available": false, + "current": false, + "number": "08", + "version": "", + "status": "planned", + "tasks": [] + } + ] + }, + { + "id": "rv32i-asm", + "title": "ASM · RV32I From Blinker to RISC-V", + "current": false, + "catalog_only": true, + "role": "", + "status": "", + "cards": [ + { + "id": "L01", + "title": "Number Systems and Storage", + "repo": "lab-rv32i-asm-number-systems", + "href": "", + "available": false, + "current": false, + "number": "01", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L02", + "title": "FPGA Bring-up and Programming", + "repo": "lab-rv32i-asm-fpga-bringup", + "href": "", + "available": false, + "current": false, + "number": "02", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L03", + "title": "Blinker and Synchronous Logic", + "repo": "lab-rv32i-asm-blinker", + "href": "", + "available": false, + "current": false, + "number": "03", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L04", + "title": "The RISC-V ISA and Instruction Decoder", + "repo": "lab-rv32i-asm-decoder", + "href": "", + "available": false, + "current": false, + "number": "04", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L05", + "title": "ALU and the Verilog Assembler", + "repo": "lab-rv32i-asm-alu", + "href": "", + "available": false, + "current": false, + "number": "05", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L06", + "title": "Control Flow — Jumps and Branches", + "repo": "lab-rv32i-asm-control-flow", + "href": "", + "available": false, + "current": false, + "number": "06", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L07", + "title": "Addresses and Memory", + "repo": "lab-rv32i-asm-addresses-memory", + "href": "", + "available": false, + "current": false, + "number": "07", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L08", + "title": "Subroutines and the RISC-V ABI", + "repo": "lab-rv32i-asm-subroutines-abi", + "href": "", + "available": false, + "current": false, + "number": "08", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "L09", + "title": "Load and Store", + "repo": "lab-rv32i-asm-load-store", + "href": "", + "available": false, + "current": false, + "number": "09", + "version": "", + "status": "planned", + "tasks": [] + } + ] + }, + { + "id": "c", + "title": "C · Freestanding RV32I and K&R", + "current": true, + "catalog_only": true, + "role": "", + "status": "", + "cards": [ + { + "id": "C01", + "title": "ASM, C and GCC", + "repo": "lab-rv32i-strlen-asm-c-gcc", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/852fa3c7-8329-583a-a244-b639d2e04495", + "available": true, + "current": false, + "number": "01", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Ręczna implementacja RV32I ASM" + }, + { + "id": "task02", + "title": "Referencyjna implementacja w C" + }, + { + "id": "task03", + "title": "ASM wyemitowany przez GCC" + } + ] + }, + { + "id": "C02", + "title": ".bss, .data and static storage", + "repo": "lab-rv32i-strlen-bss-data-stack", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/74afa921-fb51-5017-bcdb-f6e84fb444d8", + "available": true, + "current": false, + "number": "02", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Wynik strlen w .bss" + }, + { + "id": "task02", + "title": "Wynik i napis w .data" + }, + { + "id": "task03", + "title": "Nieużyta tablica lokalna" + }, + { + "id": "task04", + "title": "Użyta tablica lokalna i stack frame" + } + ] + }, + { + "id": "C03", + "title": "ABI and Stack Frame", + "repo": "lab-rv32i-strlen-abi-stack", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/72b22a0a-3297-5d75-a6ff-d1af48132d6c", + "available": true, + "current": false, + "number": "03", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Argument i wynik bez powrotu z main" + }, + { + "id": "task02", + "title": "Pełny stack frame i zachowanie ra" + } + ] + }, + { + "id": "C04", + "title": "Types, Operators and Expressions", + "repo": "lab-rv32i-c-types-operators-expressions", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/7818aa68-4983-5aca-bf7f-541cfce5c601", + "available": true, + "current": false, + "number": "04", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Nazwy i stałe symboliczne" + }, + { + "id": "task02", + "title": "Typy i zakresy" + }, + { + "id": "task03", + "title": "Stałe, długość i enum" + }, + { + "id": "task04", + "title": "Deklaracje, inicjalizacja i const" + }, + { + "id": "task05", + "title": "Arytmetyka i rok przestępny" + }, + { + "id": "task06", + "title": "Porównania i logika" + }, + { + "id": "task07", + "title": "Konwersje: atoi, lower i htoi" + }, + { + "id": "task08", + "title": "Inkrementacja i operacje na napisach" + }, + { + "id": "task09", + "title": "Operatory bitowe" + }, + { + "id": "task10", + "title": "Przypisania i bitcount" + }, + { + "id": "task11", + "title": "Operator warunkowy" + }, + { + "id": "task12", + "title": "Priorytet i kolejność obliczeń" + } + ] + }, + { + "id": "C05", + "title": "Control Flow", + "repo": "lab-rv32i-c-control-flow", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/7512361d-e5e6-5c08-ab18-8be29dacdc10", + "available": true, + "current": false, + "number": "05", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Instrukcje i bloki" + }, + { + "id": "task02", + "title": "if-else i dangling else" + }, + { + "id": "task03", + "title": "else-if i wyszukiwanie binarne" + }, + { + "id": "task04", + "title": "switch: escape i unescape" + }, + { + "id": "task05", + "title": "while, for i Shell sort" + }, + { + "id": "task06", + "title": "do-while i itoa" + }, + { + "id": "task07", + "title": "break i continue" + }, + { + "id": "task08", + "title": "goto i etykiety" + } + ] + }, + { + "id": "C06", + "title": "Functions and Program Structure", + "repo": "lab-rv32i-c-functions-program-structure", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/9667818d-b691-501d-817c-b58be4cbd594", + "available": true, + "current": false, + "number": "06", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Funkcje i strindex" + }, + { + "id": "task02", + "title": "double i atof z wykładnikiem" + }, + { + "id": "task03", + "title": "Zewnętrzny stos RPN" + }, + { + "id": "task04", + "title": "Scope i extern" + }, + { + "id": "task05", + "title": "Nagłówki i prototypy" + }, + { + "id": "task06", + "title": "Static storage" + }, + { + "id": "task07", + "title": "Zmienne register" + }, + { + "id": "task08", + "title": "Struktura blokowa" + }, + { + "id": "task09", + "title": "Inicjalizacja" + }, + { + "id": "task10", + "title": "Rekurencja i quicksort" + }, + { + "id": "task11", + "title": "Preprocesor i makra" + } + ] + }, + { + "id": "C07", + "title": "Pointers, Arrays and Linear Allocator", + "repo": "lab-rv32i-c-pointers-arrays", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/98dbe323-c624-53d6-9fe2-4ee688c44b38", + "available": true, + "current": false, + "number": "07", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "task01" + }, + { + "id": "task02", + "title": "task02" + }, + { + "id": "task03", + "title": "task03" + }, + { + "id": "task04", + "title": "K&R 5.4 -- Linear Memory Allocator" + }, + { + "id": "task05", + "title": "task05" + }, + { + "id": "task06", + "title": "task06" + }, + { + "id": "task07", + "title": "task07" + }, + { + "id": "task08", + "title": "task08" + }, + { + "id": "task09", + "title": "task09" + }, + { + "id": "task10", + "title": "task10" + }, + { + "id": "task11", + "title": "task11" + }, + { + "id": "task12", + "title": "task12" + } + ] + }, + { + "id": "C08", + "title": "Structures and Linked State", + "repo": "lab-rv32i-c-structures", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/f60fbba3-a788-5f1e-bc24-52af82f227c9", + "available": true, + "current": false, + "number": "08", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Układ BlockHeader" + }, + { + "id": "task02", + "title": "Nagłówek, payload i odzyskanie właściciela" + }, + { + "id": "task03", + "title": "Intruzywna lista wolnych bloków" + }, + { + "id": "task04", + "title": "Wyrównana arena dwóch bloków" + } + ] + }, + { + "id": "C09", + "title": "smalloc, sbrk and minimal libc", + "repo": "lab-rv32i-c-smalloc-sbrk-libc", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/8e4f8bee-41f0-523b-8ea2-8926bd3d7ab0", + "available": true, + "current": false, + "number": "09", + "version": "v00.01", + "status": "planned", + "tasks": [ + { + "id": "task01", + "title": "strlen z libc bez sterty" + }, + { + "id": "task02", + "title": "Kontrolowany brak dostawcy sbrk" + }, + { + "id": "task03", + "title": "Bounded sbrk i atomowy błąd" + }, + { + "id": "task04", + "title": "Wyrównany smalloc append-only" + }, + { + "id": "task05", + "title": "malloc/free picolibc jako czarna skrzynka" + } + ] + }, + { + "id": "C10", + "title": "RV32I Traps and Interrupt Control", + "repo": "lab-rv32i-c-interrupts", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/8fb9c110-557b-5081-8ae2-a56800f872e8", + "available": true, + "current": false, + "number": "10", + "version": "v00.01", + "status": "planned", + "tasks": [ + { + "id": "task01", + "title": "ECALL i wznowienie pod mepc+4" + }, + { + "id": "task02", + "title": "Machine software IRQ i clear źródła" + }, + { + "id": "task03", + "title": "Macierz pending, MSIE i MIE" + } + ] + }, + { + "id": "C11", + "title": "Machine Timer and Periodic Work", + "repo": "lab-rv32i-c-timer", + "href": "", + "available": false, + "current": false, + "number": "11", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "C12", + "title": "UART — polling and interrupts", + "repo": "lab-rv32i-c-uart", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/64f7c516-78b1-58ee-8619-a82d7061079f", + "available": true, + "current": true, + "number": "12", + "version": "v00.01", + "status": "planned", + "tasks": [ + { + "id": "task01", + "title": "Polling jednego bajtu" + }, + { + "id": "task02", + "title": "Odbiór R przez external IRQ 16" + }, + { + "id": "task03", + "title": "Jednokomórkowa skrzynka drop-newest" + } + ] + }, + { + "id": "C13", + "title": "GPIO, Edges and Debounce", + "repo": "lab-rv32i-c-gpio", + "href": "", + "available": false, + "current": false, + "number": "13", + "version": "", + "status": "planned", + "tasks": [] + } + ] + } + ] + }, + { + "id": "year-2", + "title": "Rok 2", + "current": false, + "series": [ + { + "id": "cpp", + "title": "C++", + "current": false, + "catalog_only": true, + "role": "", + "status": "", + "cards": [ + { + "id": "CPP01", + "title": "Translation Units, Linkage and Namespaces", + "repo": "lab-cpp-build-namespaces", + "href": "", + "available": false, + "current": false, + "number": "01", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "CPP02", + "title": "Classes, Encapsulation and Invariants", + "repo": "lab-cpp-classes-invariants", + "href": "", + "available": false, + "current": false, + "number": "02", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "CPP03", + "title": "Construction, Destruction and RAII", + "repo": "lab-cpp-lifetime-raii", + "href": "", + "available": false, + "current": false, + "number": "03", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "CPP04", + "title": "References, const and Value Categories", + "repo": "lab-cpp-references-const", + "href": "", + "available": false, + "current": false, + "number": "04", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "CPP05", + "title": "Copy, Move and the Rule of Zero/Five", + "repo": "lab-cpp-copy-move", + "href": "", + "available": false, + "current": false, + "number": "05", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "CPP06", + "title": "Ownership and Resource Types", + "repo": "lab-cpp-ownership", + "href": "", + "available": false, + "current": false, + "number": "06", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "CPP07", + "title": "Function and Class Templates", + "repo": "lab-cpp-templates", + "href": "", + "available": false, + "current": false, + "number": "07", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "CPP08", + "title": "Static Polymorphism and CRTP", + "repo": "lab-cpp-static-polymorphism", + "href": "", + "available": false, + "current": false, + "number": "08", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "CPP09", + "title": "Inheritance, Interfaces and Dynamic Dispatch", + "repo": "lab-cpp-dynamic-polymorphism", + "href": "", + "available": false, + "current": false, + "number": "09", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "CPP10", + "title": "Operator Overloading and Strong Types", + "repo": "lab-cpp-strong-types", + "href": "", + "available": false, + "current": false, + "number": "10", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "CPP11", + "title": "Containers, Iterators and Algorithms", + "repo": "lab-cpp-containers-iterators", + "href": "", + "available": false, + "current": false, + "number": "11", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "CPP12", + "title": "Lambdas, Function Objects and Callables", + "repo": "lab-cpp-lambdas-callables", + "href": "", + "available": false, + "current": false, + "number": "12", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "CPP13", + "title": "Error Models with and without Exceptions", + "repo": "lab-cpp-error-models", + "href": "", + "available": false, + "current": false, + "number": "13", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "CPP14", + "title": "Object Layout, ABI and Binary Evidence", + "repo": "lab-cpp-abi-evidence", + "href": "", + "available": false, + "current": false, + "number": "14", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "CPP15", + "title": "Resource-type Integration Project", + "repo": "lab-cpp-resource-integration", + "href": "", + "available": false, + "current": false, + "number": "15", + "version": "", + "status": "planned", + "tasks": [] + } + ] + }, + { + "id": "freertos-c", + "title": "FreeRTOS C", + "current": false, + "catalog_only": true, + "role": "", + "status": "", + "cards": [ + { + "id": "FC01", + "title": "heap_4: From Linear Cursor to Reusable Blocks", + "repo": "lab-rv32i-freertos-heap4", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/aea09ab7-9bfd-5368-8d1b-c8724871c1a7", + "available": true, + "current": false, + "number": "01", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Predict and prove reusable heap_4 blocks" + } + ] + }, + { + "id": "FC02", + "title": "First Task, TCB and Task Stack", + "repo": "lab-rv32i-freertos-c-first-task", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/a2538a1a-3c37-4c14-a6ea-db5aba8fd038", + "available": true, + "current": false, + "number": "02", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Pierwszy task FreeRTOS — callback, context, TCB i stos" + } + ] + }, + { + "id": "FC03", + "title": "Tick, Scheduler, Priorities and Time Slicing", + "repo": "lab-rv32i-freertos-c-scheduler", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/2214a13f-34c6-40a1-a561-70a00ec98285", + "available": true, + "current": false, + "number": "03", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Kontrolowany eksperyment schedulera FreeRTOS" + } + ] + }, + { + "id": "FC04", + "title": "Delay, Blocking and Task States", + "repo": "lab-rv32i-freertos-c-delay-state", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/4a7ef04c-ab08-5783-9192-5b02a90f05f8", + "available": true, + "current": false, + "number": "04", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Delay, blokowanie, zawieszenie i self-delete" + } + ] + }, + { + "id": "FC05", + "title": "Queues and Byte-copy Semantics", + "repo": "lab-rv32i-freertos-c-queue", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/8ee8f36a-471b-51bc-97b8-e204bd541c61", + "available": true, + "current": false, + "number": "05", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Kolejka długości 1: empty, full, copy i FIFO" + } + ] + }, + { + "id": "FC06", + "title": "Software Timers and the Daemon Task", + "repo": "lab-rv32i-freertos-c-software-timers", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/ab188300-f03d-5ddb-8316-b9534876a5bc", + "available": true, + "current": false, + "number": "06", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "One-shot, auto-reload i timer daemon" + } + ] + }, + { + "id": "FC07", + "title": "Interrupt-safe API and Semaphore Handoff", + "repo": "lab-rv32i-freertos-c-isr-semaphore", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/a6da1075-8d1f-5615-b0e6-0fc33e59e1e3", + "available": true, + "current": false, + "number": "07", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "External IRQ → FromISR semaphore → high-priority task" + } + ] + }, + { + "id": "FC08", + "title": "Critical Sections, Mutexes and Priority Inheritance", + "repo": "lab-rv32i-freertos-c-resource-management", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/2392f81a-ed6c-510b-86b5-06c5e2f1c6aa", + "available": true, + "current": false, + "number": "08", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Low/Medium/High: ownership i dziedziczenie priorytetu" + } + ] + }, + { + "id": "FC09", + "title": "Event Groups and Multi-event Synchronization", + "repo": "lab-rv32i-freertos-c-event-groups", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/3f4c1b8b-d54b-58d5-b92d-87a7233cbd9f", + "available": true, + "current": false, + "number": "09", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "ALL-ready i trzyosobowa bariera" + } + ] + }, + { + "id": "FC10", + "title": "Direct-to-task Notifications", + "repo": "lab-rv32i-freertos-c-notifications", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/3b57334e-2c35-5207-a51d-9321906db078", + "available": true, + "current": false, + "number": "10", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Count, overwrite i bit flags na jednym slocie" + } + ] + }, + { + "id": "FC11", + "title": "Static Allocation and Bounded Storage", + "repo": "lab-rv32i-freertos-c-static-allocation", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/f4d7caf3-d665-5a2d-b9eb-39a120a64ff7", + "available": true, + "current": false, + "number": "11", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Same behavior, two storage policies" + } + ] + }, + { + "id": "FC12", + "title": "Assertions, Hooks, Stack Checks and Runtime Diagnostics", + "repo": "lab-rv32i-freertos-c-diagnostics", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/c3027314-85a4-5e4a-af13-0939c7467a62", + "available": true, + "current": false, + "number": "12", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Diagnose before changing the program" + } + ] + }, + { + "id": "FC13", + "title": "UART Interrupt-to-task Pipeline", + "repo": "lab-rv32i-freertos-c-uart", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/6a838fd1-ab1b-52b6-baaf-659120a4d60a", + "available": true, + "current": false, + "number": "13", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Build and prove a bounded UART RX pipeline" + } + ] + }, + { + "id": "FC14", + "title": "GPIO, Hardware Timer and Deferred Work", + "repo": "lab-rv32i-freertos-c-gpio-timer", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/0cc561df-bf81-5bba-9df1-c872d5b42eb8", + "available": true, + "current": false, + "number": "14", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Prove one machine-timer event from ISR to daemon GPIO work" + } + ] + }, + { + "id": "FC15", + "title": "Integrated Deterministic FreeRTOS C Application", + "repo": "lab-rv32i-freertos-c-integration", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/fe92efeb-3c38-5975-86d8-ed630e1ad3bb", + "available": true, + "current": false, + "number": "15", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Prove one complete FreeRTOS C architecture" + } + ] + } + ] + }, + { + "id": "freertos-cpp", + "title": "FreeRTOS C++", + "current": false, + "catalog_only": true, + "role": "", + "status": "", + "cards": [ + { + "id": "K02", + "title": "C++ Task Wrapper, CRTP and Lifecycle", + "repo": "lab-rv32i-freertos-task-stack-vector", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/948ce9fd-3d0c-5721-a0ae-ef422008fec8", + "available": true, + "current": false, + "number": "02", + "version": "v00.04", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "C++ Task wrapper — OOP i debugowanie cyklu życia" + } + ] + }, + { + "id": "K03", + "title": "Vector V1 — Destructor, Move, Ownership and RAII", + "repo": "lab-rv32i-freertos-vector-raii", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/de1a2818-4c30-5760-8b31-255114f82e90", + "available": true, + "current": false, + "number": "03", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Vector V1 — transfer własności i powrót heapu" + } + ] + }, + { + "id": "K04", + "title": "Scheduler States, Priorities and Typed Ticks", + "repo": "lab-rv32i-freertos-scheduler-states", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/853a7dd7-b00b-4f4a-96e8-c160fc5bb04a", + "available": true, + "current": false, + "number": "04", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Osiem snapshotów decyzji schedulera" + } + ] + }, + { + "id": "K05", + "title": "C++ Heap Bridge, Heap Models and HeapStats", + "repo": "lab-rv32i-freertos-heap-models", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/c456b505-dc5c-4894-b832-bb4c5afd0feb", + "available": true, + "current": false, + "number": "05", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Fragmentacja, koalescencja i historyczny watermark" + } + ] + }, + { + "id": "K06", + "title": "MemoryResource and FreeRtosAllocator", + "repo": "lab-rv32i-freertos-allocator-resource", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/1af48a2e-8564-4e18-8115-b2c0208169d6", + "available": true, + "current": false, + "number": "06", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Dwa zasoby, jeden typed allocator" + } + ] + }, + { + "id": "K07", + "title": "TaskHandle_t, Explicit Start and Static Trampoline", + "repo": "lab-rv32i-freertos-task-wrapper", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/9bffead0-4341-4350-806d-e975b1a3a08f", + "available": true, + "current": false, + "number": "07", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Stabilny obiekt przez statyczny trampoline" + } + ] + }, + { + "id": "K08", + "title": "DynamicTask, StaticTask, Deletion and Lifetime", + "repo": "lab-rv32i-freertos-static-task", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/d9e45417-a37f-487c-813f-fc7a44d4b4f3", + "available": true, + "current": false, + "number": "08", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Dwie polityki storage i pełna oś delete" + } + ] + }, + { + "id": "K09", + "title": "Scheduler Facade and Scoped Kernel Guards", + "repo": "lab-rv32i-freertos-kernel-facade", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/6a2ab068-17e7-4bfa-b726-2df37787ed69", + "available": true, + "current": false, + "number": "09", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Fasada kernela i restore na każdej ścieżce" + } + ] + }, + { + "id": "K10", + "title": "Queue and StaticQueue", + "repo": "lab-rv32i-freertos-queue", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/66967c2d-bb34-4344-8064-f54d06cce47a", + "available": true, + "current": false, + "number": "10", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Typed byte-copy queue z dwiema politykami storage" + } + ] + }, + { + "id": "K11", + "title": "Mutex, LockGuard and Priority Inheritance", + "repo": "lab-rv32i-freertos-mutex", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/34d7ad61-6b03-4922-8e58-b8b98316e5f7", + "available": true, + "current": false, + "number": "11", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "LockGuard i zmierzone priority inheritance" + } + ] + }, + { + "id": "K12", + "title": "Semaphores and Task Notifications", + "repo": "lab-rv32i-freertos-semaphore-notify", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/fcb6107c-268f-4e86-a8cc-092e5875f6f0", + "available": true, + "current": false, + "number": "12", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Semaphore slots i jednoodbiorcza notification" + } + ] + }, + { + "id": "K13", + "title": "EventGroup and Coordinated State", + "repo": "lab-rv32i-freertos-event-group", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/5fbcd7c6-3a73-4cd2-b76c-bdb016d1daaa", + "available": true, + "current": false, + "number": "13", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Typed EventGroup i trzy źródła stanu" + } + ] + }, + { + "id": "K14", + "title": "Software Timer and the Timer Daemon Task", + "repo": "lab-rv32i-freertos-sw-timer", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/78db37df-63e5-4c5b-80ce-f73a411f0b50", + "available": true, + "current": false, + "number": "14", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "Static one-shot i periodic timer na daemon tasku" + } + ] + }, + { + "id": "K15", + "title": "Explicit FromISR, UART and GPIO Wrappers", + "repo": "lab-rv32i-freertos-isr-drivers", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/02f6cd71-5c85-4883-a237-1d4ba08d9469", + "available": true, + "current": false, + "number": "15", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "UART queue i GPIO notify z realnego IRQ" + } + ] + }, + { + "id": "K16", + "title": "Integrated Real-time Application and Evidence", + "repo": "lab-rv32i-freertos-integration", + "href": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/05b4f486-a27c-455d-a315-f4e51a4c66b3", + "available": true, + "current": false, + "number": "16", + "version": "v00.01", + "status": "existing", + "tasks": [ + { + "id": "task01", + "title": "End-to-end RTOS service i evidence report" + } + ] + } + ] + }, + { + "id": "posix-threads", + "title": "POSIX Threads", + "current": false, + "catalog_only": true, + "role": "", + "status": "", + "cards": [ + { + "id": "PT01", + "title": "Process and Thread Execution Context", + "repo": "lab-posix-process-thread", + "href": "", + "available": false, + "current": false, + "number": "01", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "PT02", + "title": "pthread_create, pthread_join and Lifecycle", + "repo": "lab-posix-pthread-create-join", + "href": "", + "available": false, + "current": false, + "number": "02", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "PT03", + "title": "Arguments, Return Values and Ownership", + "repo": "lab-posix-thread-arguments", + "href": "", + "available": false, + "current": false, + "number": "03", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "PT04", + "title": "Data Races and the Happens-before Question", + "repo": "lab-posix-data-races", + "href": "", + "available": false, + "current": false, + "number": "04", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "PT05", + "title": "Mutex, Critical Section and Deadlock", + "repo": "lab-posix-mutex", + "href": "", + "available": false, + "current": false, + "number": "05", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "PT06", + "title": "Condition Variables and Predicates", + "repo": "lab-posix-condition-variable", + "href": "", + "available": false, + "current": false, + "number": "06", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "PT07", + "title": "Bounded Producer–Consumer Queue", + "repo": "lab-posix-producer-consumer", + "href": "", + "available": false, + "current": false, + "number": "07", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "PT08", + "title": "POSIX Semaphores", + "repo": "lab-posix-semaphore", + "href": "", + "available": false, + "current": false, + "number": "08", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "PT09", + "title": "Reader–Writer Lock", + "repo": "lab-posix-rwlock", + "href": "", + "available": false, + "current": false, + "number": "09", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "PT10", + "title": "C Atomics and Memory Ordering", + "repo": "lab-posix-atomics", + "href": "", + "available": false, + "current": false, + "number": "10", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "PT11", + "title": "Cancellation, Cleanup and Safe Shutdown", + "repo": "lab-posix-cancellation-cleanup", + "href": "", + "available": false, + "current": false, + "number": "11", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "PT12", + "title": "Thread-local Storage", + "repo": "lab-posix-thread-local", + "href": "", + "available": false, + "current": false, + "number": "12", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "PT13", + "title": "Scheduling Policy, Priority and Affinity", + "repo": "lab-posix-scheduling", + "href": "", + "available": false, + "current": false, + "number": "13", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "PT14", + "title": "GDB, Sanitizers and Race Evidence", + "repo": "lab-posix-thread-debugging", + "href": "", + "available": false, + "current": false, + "number": "14", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "PT15", + "title": "POSIX Threads vs FreeRTOS Integration", + "repo": "lab-posix-freertos-comparison", + "href": "", + "available": false, + "current": false, + "number": "15", + "version": "", + "status": "planned", + "tasks": [] + } + ] + }, + { + "id": "oop", + "title": "OOP and Design Patterns", + "current": false, + "catalog_only": true, + "role": "reference", + "status": "", + "cards": [ + { + "id": "OOP01", + "title": "Strategy — Replaceable Behaviour", + "repo": "lab-cpp-oop-strategy", + "href": "", + "available": false, + "current": false, + "number": "01", + "version": "", + "status": "design", + "tasks": [] + }, + { + "id": "OOP02", + "title": "Adapter — Stable Boundary", + "repo": "lab-cpp-oop-adapter", + "href": "", + "available": false, + "current": false, + "number": "02", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP03", + "title": "Template Method — Fixed Skeleton", + "repo": "lab-cpp-oop-template-method", + "href": "", + "available": false, + "current": false, + "number": "03", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP04", + "title": "Static vs Dynamic Dispatch", + "repo": "lab-cpp-oop-dispatch", + "href": "", + "available": false, + "current": false, + "number": "04", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP05", + "title": "RAII and Ownership", + "repo": "lab-cpp-oop-raii", + "href": "", + "available": false, + "current": false, + "number": "05", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP06", + "title": "State — Explicit Behaviour", + "repo": "lab-cpp-oop-state", + "href": "", + "available": false, + "current": false, + "number": "06", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP07", + "title": "Facade — Subsystem Boundary", + "repo": "lab-cpp-oop-facade", + "href": "", + "available": false, + "current": false, + "number": "07", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP08", + "title": "Command — Request as Object", + "repo": "lab-cpp-oop-command", + "href": "", + "available": false, + "current": false, + "number": "08", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP09", + "title": "Observer — Subscription and Telemetry", + "repo": "lab-cpp-oop-observer", + "href": "", + "available": false, + "current": false, + "number": "09", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP10", + "title": "Factory Method — Resource Policy", + "repo": "lab-cpp-oop-factory-method", + "href": "", + "available": false, + "current": false, + "number": "10", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP11", + "title": "Builder — Valid Configuration", + "repo": "lab-cpp-oop-builder", + "href": "", + "available": false, + "current": false, + "number": "11", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP12", + "title": "Decorator — Measurement and Diagnostics", + "repo": "lab-cpp-oop-decorator", + "href": "", + "available": false, + "current": false, + "number": "12", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP13", + "title": "Composite — Component Tree", + "repo": "lab-cpp-oop-composite", + "href": "", + "available": false, + "current": false, + "number": "13", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP14", + "title": "Chain of Responsibility", + "repo": "lab-cpp-oop-chain", + "href": "", + "available": false, + "current": false, + "number": "14", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP15", + "title": "Pattern-language Integration", + "repo": "lab-cpp-oop-integration", + "href": "", + "available": false, + "current": false, + "number": "15", + "version": "", + "status": "planned", + "tasks": [] + } + ] + } + ] + }, + { + "id": "year-3", + "title": "Rok 3 · plan", + "current": false, + "series": [ + { + "id": "modern-cpp-stl", + "title": "Modern C++ / STL", + "current": false, + "catalog_only": true, + "role": "", + "status": "scope-reserved", + "cards": [] + }, + { + "id": "std-threads", + "title": "std::thread / std::jthread", + "current": false, + "catalog_only": true, + "role": "", + "status": "scope-reserved", + "cards": [] + }, + { + "id": "boost-asio", + "title": "Boost.Asio", + "current": false, + "catalog_only": true, + "role": "", + "status": "scope-reserved", + "cards": [] + }, + { + "id": "oop", + "title": "OOP and Design Patterns", + "current": false, + "catalog_only": true, + "role": "reference", + "status": "", + "cards": [ + { + "id": "OOP01", + "title": "Strategy — Replaceable Behaviour", + "repo": "lab-cpp-oop-strategy", + "href": "", + "available": false, + "current": false, + "number": "01", + "version": "", + "status": "design", + "tasks": [] + }, + { + "id": "OOP02", + "title": "Adapter — Stable Boundary", + "repo": "lab-cpp-oop-adapter", + "href": "", + "available": false, + "current": false, + "number": "02", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP03", + "title": "Template Method — Fixed Skeleton", + "repo": "lab-cpp-oop-template-method", + "href": "", + "available": false, + "current": false, + "number": "03", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP04", + "title": "Static vs Dynamic Dispatch", + "repo": "lab-cpp-oop-dispatch", + "href": "", + "available": false, + "current": false, + "number": "04", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP05", + "title": "RAII and Ownership", + "repo": "lab-cpp-oop-raii", + "href": "", + "available": false, + "current": false, + "number": "05", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP06", + "title": "State — Explicit Behaviour", + "repo": "lab-cpp-oop-state", + "href": "", + "available": false, + "current": false, + "number": "06", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP07", + "title": "Facade — Subsystem Boundary", + "repo": "lab-cpp-oop-facade", + "href": "", + "available": false, + "current": false, + "number": "07", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP08", + "title": "Command — Request as Object", + "repo": "lab-cpp-oop-command", + "href": "", + "available": false, + "current": false, + "number": "08", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP09", + "title": "Observer — Subscription and Telemetry", + "repo": "lab-cpp-oop-observer", + "href": "", + "available": false, + "current": false, + "number": "09", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP10", + "title": "Factory Method — Resource Policy", + "repo": "lab-cpp-oop-factory-method", + "href": "", + "available": false, + "current": false, + "number": "10", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP11", + "title": "Builder — Valid Configuration", + "repo": "lab-cpp-oop-builder", + "href": "", + "available": false, + "current": false, + "number": "11", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP12", + "title": "Decorator — Measurement and Diagnostics", + "repo": "lab-cpp-oop-decorator", + "href": "", + "available": false, + "current": false, + "number": "12", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP13", + "title": "Composite — Component Tree", + "repo": "lab-cpp-oop-composite", + "href": "", + "available": false, + "current": false, + "number": "13", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP14", + "title": "Chain of Responsibility", + "repo": "lab-cpp-oop-chain", + "href": "", + "available": false, + "current": false, + "number": "14", + "version": "", + "status": "planned", + "tasks": [] + }, + { + "id": "OOP15", + "title": "Pattern-language Integration", + "repo": "lab-cpp-oop-integration", + "href": "", + "available": false, + "current": false, + "number": "15", + "version": "", + "status": "planned", + "tasks": [] + } + ] + } + ] + }, + { + "id": "year-4", + "title": "Rok 4 · plan", + "current": false, + "series": [ + { + "id": "transformers-gpu", + "title": "Transformers on GPU", + "current": false, + "catalog_only": true, + "role": "", + "status": "scope-reserved", + "cards": [] + } + ] + } + ] + }, + { + "id": "fiz", + "title": "FIZ · Fizyka", + "current": false, + "levels": [ + { + "id": "all", + "title": "Katalog", + "current": false, + "series": [ + { + "id": "fiz", + "title": "Fizyka", + "current": false, + "catalog_only": false, + "role": "", + "status": "", + "cards": [ + { + "id": "ruch-1d", + "title": "Ruch 1D", + "repo": "ruch-1d", + "href": "", + "available": false, + "current": false, + "number": "", + "version": "", + "status": "", + "tasks": [] + }, + { + "id": "ruch-2d", + "title": "Ruch 2D", + "repo": "ruch-2d", + "href": "", + "available": false, + "current": false, + "number": "", + "version": "", + "status": "", + "tasks": [] + }, + { + "id": "ruch-po-okregu", + "title": "Ruch po okręgu", + "repo": "ruch-po-okregu", + "href": "", + "available": false, + "current": false, + "number": "", + "version": "", + "status": "", + "tasks": [] + } + ] + } + ] + } + ] + } + ] + }, + "total_pages": 7, + "front": { + "header_html": "

    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    TITLEUART — polling i przerwania RX
    VER.v00.01
    DATETIME2026-07-20T00:00:00+02:00
    PROJECTFreestanding C na RV32I
    SERIESC · Freestanding RV32I and K&R
    CARD12/13
    SHEET1/7
    SUBJ.Inf.
    PROG.
    CORE
    SCOPE
    LEVEL
    POS.
    GITEA UUIDe766c4bb-2a43-5f4e-b10a-b3393a42932cCARD UUID64f7c516-78b1-58ee-8619-a82d7061079fAUTHOR  M. Pabiszczak
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    ", + "left_margin_html": "
    TECH
    ", + "right_margin_html": "
    OG
    ", + "goal_title": "Cel karty", + "goal_html": "

    Uczeń odróżnia polling rejestru statusu od odbioru sterowanego zdarzeniem. Dla ścieżki przerwania wskazuje osobno: bajt w RX FIFO, stan linii external IRQ 16, selekcję przez kontroler Hazard3, wywołanie ISR i efekt konsumowany później przez main.

    ", + "scope_title": "Zakres i zachowane przykłady", + "scope_html": "

    Karta korzysta z laboratoryjnego modelu UART Hazard3. Rejestr TB_UART_TEST_RX jest wyłącznie kontrolowanym bodźcem testbench; nie występuje w produkcyjnym UART ani na RP2350. Po wstrzyknięciu bajtu Task02 i Task03 przechodzą jednak przez rzeczywisty kontroler external IRQ, mtvec, dispatcher i mret modelowanego rdzenia. Układ każdego przykładu: pełny profil A1-A8; widok N/D ma jawny powód, a diagram nie jest wymagany, gdy tekst daje lepszy dowód.

    ", + "scope_columns": [ + "chapter", + "task", + "idea", + "priority" + ], + "scope_headers": [ + "Typ", + "Task", + "Idea", + "Waga" + ], + "scope_rows": [ + { + "chapter": "MMIO", + "task": "Task01", + "idea_html": "

    STATUS, DATA i kontrolowany RX stimulus

    ", + "priority": "kluczowe", + "status": "", + "status_label": "", + "version": "", + "key": true + }, + { + "chapter": "IRQ", + "task": "Task02", + "idea_html": "

    FIFO, pending, enable, dispatcher i mret

    ", + "priority": "kluczowe", + "status": "", + "status_label": "", + "version": "", + "key": true + }, + { + "chapter": "ISR", + "task": "Task03", + "idea_html": "

    krótki ISR, jawne przepełnienie i konsumpcja w main

    ", + "priority": "kluczowe", + "status": "", + "status_label": "", + "version": "", + "key": true + } + ] + }, + "sections": [ + { + "id": "section-1-content", + "index": 1, + "title": "Polling pyta o stan w rytmie programu", + "show_heading": true, + "toc_entry": true, + "header_html": "
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    TITLEUART — polling i przerwania RX
    VER.v00.01
    DATETIME2026-07-20T00:00:00+02:00
    PROJECTFreestanding C na RV32I
    SERIESC · Freestanding RV32I and K&R
    CARD12/13
    SHEET2/7
    SUBJ.Inf.
    PROG.
    CORE
    SCOPE
    LEVEL
    POS.
    GITEA UUIDe766c4bb-2a43-5f4e-b10a-b3393a42932cCARD UUID64f7c516-78b1-58ee-8619-a82d7061079fAUTHOR  M. Pabiszczak
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    ", + "left_margin_html": "
    TECH
    ", + "right_margin_html": "
    OG
    ", + "content_html": "

    Rejestr STATUS.RX_AVAIL opisuje niepusty RX FIFO, a odczyt DATA usuwa jeden bajt. W Task01 przerwanie RX pozostaje wyłączone: program sam wykonuje kolejne odczyty statusu. Jest to poprawne dla prostego, krótkiego oczekiwania, lecz czas CPU zależy od częstotliwości odpytywania. Zapis TB_UART_TEST_RX='P' jest bodźcem laboratoryjnym, nie częścią sterownika produkcyjnego.

    ", + "tasks": [], + "assets": [], + "steps": [], + "spread_group": "", + "spread_label": "", + "spread_columns": 1, + "spread_index": 1, + "spread_count": 1, + "page_orientation": "portrait" + }, + { + "id": "section-2-content", + "index": 2, + "title": "RX IRQ jest ścieżką pięciu stanów", + "show_heading": true, + "toc_entry": true, + "header_html": "
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    TITLEUART — polling i przerwania RX
    VER.v00.01
    DATETIME2026-07-20T00:00:00+02:00
    PROJECTFreestanding C na RV32I
    SERIESC · Freestanding RV32I and K&R
    CARD12/13
    SHEET3/7
    SUBJ.Inf.
    PROG.
    CORE
    SCOPE
    LEVEL
    POS.
    GITEA UUIDe766c4bb-2a43-5f4e-b10a-b3393a42932cCARD UUID64f7c516-78b1-58ee-8619-a82d7061079fAUTHOR  M. Pabiszczak
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    ", + "left_margin_html": "
    TECH
    ", + "right_margin_html": "
    OG
    ", + "content_html": "

    W Task02 bajt trafia do FIFO i model podnosi external IRQ 16 tylko wtedy, gdy CTRL.RX_IRQ_EN=1. Kontroler Hazard3 próbkuje i udostępnia bieżący poziom pending; mstatus.MIE, mie.MEIE i enable linii decydują, czy rdzeń wejdzie do wektora. Dispatcher odczytuje meinext, wybiera wpis 16 z tablicy i wykonuje jalr. Odczyt DATA opróżnia FIFO, więc linia poziomowa i widoczny pending opadają; dopiero mret wraca do normalnego kodu.

    ", + "tasks": [], + "assets": [], + "steps": [], + "spread_group": "", + "spread_label": "", + "spread_columns": 1, + "spread_index": 1, + "spread_count": 1, + "page_orientation": "portrait" + }, + { + "id": "section-3-content", + "index": 3, + "title": "ISR przekazuje minimum, main nadaje znaczenie", + "show_heading": true, + "toc_entry": true, + "header_html": "
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    TITLEUART — polling i przerwania RX
    VER.v00.01
    DATETIME2026-07-20T00:00:00+02:00
    PROJECTFreestanding C na RV32I
    SERIESC · Freestanding RV32I and K&R
    CARD12/13
    SHEET4/7
    SUBJ.Inf.
    PROG.
    CORE
    SCOPE
    LEVEL
    POS.
    GITEA UUIDe766c4bb-2a43-5f4e-b10a-b3393a42932cCARD UUID64f7c516-78b1-58ee-8619-a82d7061079fAUTHOR  M. Pabiszczak
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    ", + "left_margin_html": "
    TECH
    ", + "right_margin_html": "
    OG
    ", + "content_html": "

    Task03 nie analizuje komendy w ISR. Handler zawsze opróżnia DATA, a potem albo zapisuje bajt do jednej komórki, albo zwiększa licznik odrzuceń, gdy komórka jest pełna. Polityka drop-newest jest celowo jawna i mierzalna. To nie jest kolejka ani synchronizacja RTOS: pojedyncze 32-bitowe obiekty volatile i kontrolowana kolejność wystarczają wyłącznie dla tego jednego rdzenia i tego przykładu.

    ", + "tasks": [], + "assets": [], + "steps": [], + "spread_group": "", + "spread_label": "", + "spread_columns": 1, + "spread_index": 1, + "spread_count": 1, + "page_orientation": "portrait" + }, + { + "id": "section-4-task01", + "index": 4, + "title": "TASK01 — Polling jednego bajtu", + "show_heading": true, + "toc_entry": true, + "header_html": "
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    TITLEUART — polling i przerwania RX
    VER.v00.01
    DATETIME2026-07-20T00:00:00+02:00
    PROJECTFreestanding C na RV32I
    SERIESC · Freestanding RV32I and K&R
    CARD12/13
    SHEET5/7
    SUBJ.Inf.
    PROG.
    CORE
    SCOPE
    LEVEL
    POS.
    GITEA UUIDe766c4bb-2a43-5f4e-b10a-b3393a42932cCARD UUID64f7c516-78b1-58ee-8619-a82d7061079fAUTHOR  M. Pabiszczak
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    ", + "left_margin_html": "
    TECH
    ", + "right_margin_html": "
    OG
    ", + "content_html": "", + "tasks": [ + { + "ref": "task01", + "title": "Polling jednego bajtu", + "uuid": "611a873f-8d37-5084-9ab6-1230e2505249", + "criterion": "Hazard3: status_before=0x3, rx_byte='P'=80, status_after=0x2, tx_byte='T'=84, osobna linia T w logu testbencha, pass=1 i kod wyjścia 0.", + "conclusion_html": "", + "prompt_html": "

    Przewidź bity statusu przed i po odczycie P. Wskaż, która operacja tworzy bodziec testbench, która tylko obserwuje FIFO, a która usuwa bajt. Potwierdź także zapis T do rejestru TX.

    ", + "flow": [ + { + "id": "task01.a1", + "kind": "block", + "title": "A1 CONTEXT · AKTYWNE — polling w granicy modelu", + "content_html": "

    Zachowany przykład: \\nolinkurl{src/tasks/task01_uart_polling.c}. Odpowiedzialność przykładu zaczyna się od kontrolowanego wstrzyknięcia P do RX FIFO i kończy na odczycie P oraz zapisie T do TX. Nie konfiguruje kontrolera przerwań. TEST_RX należy wyłącznie do testbench; DATA, STATUS i CTRL modelują interfejs peryferium.

    ", + "steps": [] + }, + { + "id": "task01.a2", + "kind": "block", + "title": "A2 STRUCTURE · AKTYWNE — cztery rejestry i FIFO", + "content_html": "

    Pod bazą UART0 leżą DATA +0, STATUS +4, CTRL +8 i testowy TEST_RX +12. FIFO nie jest bezpośrednio adresowalne: RX_AVAIL mówi tylko, czy zawiera co najmniej jeden bajt, a DATA zwraca i usuwa element czołowy.

    ", + "steps": [] + }, + { + "id": "task01.a3", + "kind": "block", + "title": "A3 DISPATCH · N/D", + "content_html": "

    N/D. RX IRQ pozostaje wyłączone, więc nie ma wejścia przez mtvec, wyboru ISR ani pośredniego jalr; wszystkie funkcje są wywołaniami bezpośrednimi normalnego kodu.

    ", + "steps": [] + }, + { + "id": "task01.a4", + "kind": "block", + "title": "A4 APPLICATION · AKTYWNE — przewidywanie bitów", + "content_html": "

    Bez klienta TCP status po wstrzyknięciu P ma wartość 0x3: RX_AVAIL i TX_READY. RX_IRQ jest zerem, bo CTRL nie włącza źródła. Po odczycie DATA FIFO jest puste, więc zostaje 0x2. Znaki mają wartości P=80 i T=84.

    ", + "steps": [] + }, + { + "id": "task01.a5", + "kind": "block", + "title": "A5 FLOW · AKTYWNE — inject, status, data, status, tx", + "content_html": "

    Kolejność jest częścią dowodu: wyłącz IRQ, wstrzyknij P, odczytaj pierwszy status, odczytaj DATA, odczytaj drugi status, zapisz T. Zamiana DATA z pierwszym statusem zniszczyłaby obserwację RX_AVAIL=1.

    ", + "steps": [] + }, + { + "id": "task01.a6", + "kind": "block", + "title": "A6 STATE · AKTYWNE — EMPTY do P do EMPTY", + "content_html": "

    RX FIFO przechodzi EMPTY -> ['P'] -> EMPTY. Status jest funkcją tego stanu i nie przechowuje osobnej kopii flagi. Zapis TX jest widoczny jako T w logu testbencha; bez klienta TCP model nie zachowuje tego bajtu w kolejce sieciowej. Nie zmienia to stanu RX.

    ", + "steps": [] + }, + { + "id": "task01.a7", + "kind": "block", + "title": "A7 RUNTIME · AKTYWNE — adresy 0xc00002xx", + "content_html": "

    W listingu znajdź zapisy i odczyty pod bazą 0xc0000200. W checkpointcie globale mają wartości 3, 80, 2 i 84. Kod 0 pochodzi z pełnego gate, a nie z samego faktu, że program dotarł do _exit.

    ", + "steps": [] + }, + { + "id": "task01.a8", + "kind": "block", + "title": "A8 PATTERNS · AKTYWNE — status-before-data", + "content_html": "

    Nazwany wzorzec polling RX brzmi: sprawdź availability, dopiero potem odczytaj destructive DATA. Jest prosty i deterministyczny, ale zużywa czas CPU, jeśli pętla oczekiwania nie ma ograniczenia ani innej pracy.

    ", + "steps": [] + }, + { + "id": "task01.proof", + "kind": "exercise", + "title": "Przewidywanie → wykonanie → wniosek", + "content_html": "", + "steps": [] + }, + { + "id": "task01.worksheet", + "kind": "block", + "title": "TASK01 · Zapis dowodu ucznia", + "content_html": "

    1. Przewidywanie przed uruchomieniem \\noindent \\noindent 2. Status i bajt w modelu UART \\noindent \\noindent 3. Transakcje MMIO RV32I i kod wyjścia \\noindent \\noindent 4. Wniosek: reguła języka lub kontrakt targetu potwierdzony przez pomiar \\noindent \\noindent

    ", + "steps": [] + } + ] + } + ], + "assets": [], + "steps": [], + "spread_group": "", + "spread_label": "", + "spread_columns": 1, + "spread_index": 1, + "spread_count": 1, + "page_orientation": "portrait" + }, + { + "id": "section-5-task02", + "index": 5, + "title": "TASK02 — Odbiór R przez external IRQ 16", + "show_heading": true, + "toc_entry": true, + "header_html": "
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    TITLEUART — polling i przerwania RX
    VER.v00.01
    DATETIME2026-07-20T00:00:00+02:00
    PROJECTFreestanding C na RV32I
    SERIESC · Freestanding RV32I and K&R
    CARD12/13
    SHEET6/7
    SUBJ.Inf.
    PROG.
    CORE
    SCOPE
    LEVEL
    POS.
    GITEA UUIDe766c4bb-2a43-5f4e-b10a-b3393a42932cCARD UUID64f7c516-78b1-58ee-8619-a82d7061079fAUTHOR  M. Pabiszczak
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    ", + "left_margin_html": "
    TECH
    ", + "right_margin_html": "
    OG
    ", + "content_html": "", + "tasks": [ + { + "ref": "task02", + "title": "Odbiór R przez external IRQ 16", + "uuid": "1cd0396c-3eea-5a66-92a9-48439de20b15", + "criterion": "Hazard3: pending_before_enable=1; jeden handler IRQ 16 widzi status 0x13 i byte='R'=82; po odczycie DATA pending_after=0, pass=1 i kod 0.", + "conclusion_html": "", + "prompt_html": "

    Rozpisz osobno bity CTRL, pending linii 16, mstatus.MIE, mie.MEIE i enable kontrolera. Przewidź stan przed globalnym enable, numer wybrany przez meinext oraz czynność, która usuwa źródło poziomowe.

    ", + "flow": [ + { + "id": "task02.a1", + "kind": "block", + "title": "A1 CONTEXT · AKTYWNE — pięć granic odpowiedzialności", + "content_html": "

    Zachowany przykład: \\nolinkurl{src/tasks/task02_uart_rx_interrupt.c}. TEST_RX tworzy bodziec, UART utrzymuje FIFO i linię 16, kontroler Hazard3 utrzymuje pending/priority/enable, dispatcher wybiera wpis, a ISR odczytuje DATA. Normalny kod tylko konfiguruje, włącza globalny bit, czeka i ocenia dowód.

    ", + "steps": [] + }, + { + "id": "task02.a2", + "kind": "block", + "title": "A2 STRUCTURE · AKTYWNE — stan peryferium, CSR i tabela", + "content_html": "

    Stan obejmuje CTRL.RX_IRQ_EN, niepusty FIFO, pending linii 16, tablicę _external_irq_table[16], priorytet, mie.MEIE i mstatus.MIE. Żaden pojedynczy bit nie wystarcza do wejścia w ISR.

    ", + "steps": [] + }, + { + "id": "task02.a3", + "kind": "block", + "title": "A3 DISPATCH · AKTYWNE — meinext do wpisu 16", + "content_html": "

    Wektor machine external IRQ wchodzi do isr_external_irq. Odczyt meinext zwraca gotowy offset tablicy — numer linii 16 przesunięty o dwa bity. Dispatcher dodaje go do bazy _external_irq_table i wykonuje jalr do task02_uart_handler. To jest rzeczywisty wybór wykonawcy, nie zwykłe statyczne wywołanie.

    ", + "steps": [] + }, + { + "id": "task02.a4", + "kind": "block", + "title": "A4 APPLICATION · AKTYWNE — R i status 0x13", + "content_html": "

    Przed globalnym enable pending ma być 1, lecz licznik handlera nadal 0. Po enable ISR ma zobaczyć RX_AVAIL, TX_READY i RX_IRQ, czyli 0x13, odczytać R=82 i opublikować numer 16.

    ", + "steps": [] + }, + { + "id": "task02.a5", + "kind": "block", + "title": "A5 FLOW · AKTYWNE — konfiguracja przed globalnym enable", + "content_html": "

    Najpierw MIE jest wyzerowane, potem ustawiane są handler, priorytet, enable linii, MEIE i CTRL. Dopiero po wstrzyknięciu R i zmierzeniu pending program ustawia MIE. ISR czyta DATA, dispatcher odtwarza kontekst i wykonuje mret.

    ", + "steps": [] + }, + { + "id": "task02.a6", + "kind": "block", + "title": "A6 STATE · AKTYWNE — PENDING, ACTIVE, DRAINED", + "content_html": "

    Po bodźcu stan jest PENDING: FIFO zawiera R, linia 16 jest aktywna, lecz globalny gate blokuje wejście. Po MIE przechodzi do ACTIVE. Odczyt DATA tworzy DRAINED: FIFO pusty, linia i pending opadają, a licznik wynosi 1.

    ", + "steps": [] + }, + { + "id": "task02.a7", + "kind": "block", + "title": "A7 RUNTIME · AKTYWNE — mcause 0x8000000b i meinext 16", + "content_html": "

    Wejście sprzętowe ma machine external interrupt cause 11, czyli mcause=0x8000000b; konkretną linię 16 wybiera dopiero kontroler przez meinext. Listing ma zawierać zapis tablicy, operacje CSR, pośredni jalr i mret.

    ", + "steps": [] + }, + { + "id": "task02.a8", + "kind": "block", + "title": "A8 PATTERNS · AKTYWNE — drain level-triggered source", + "content_html": "

    Dla źródła poziomowego ISR musi usunąć warunek w peryferium, tutaj opróżnić DATA. Samo wejście do handlera nie jest acknowledge. Gdyby FIFO pozostał niepusty, linia byłaby nadal aktywna i przerwanie wróciłoby po mret.

    ", + "steps": [] + }, + { + "id": "task02.proof", + "kind": "exercise", + "title": "Przewidywanie → wykonanie → wniosek", + "content_html": "", + "steps": [] + }, + { + "id": "task02.worksheet", + "kind": "block", + "title": "TASK02 · Zapis dowodu ucznia", + "content_html": "

    1. Przewidywanie przed uruchomieniem \\noindent \\noindent 2. Macierz pending i enable przed ISR \\noindent \\noindent 3. Numer IRQ, status, bajt i powrót mret \\noindent \\noindent 4. Wniosek: reguła języka lub kontrakt targetu potwierdzony przez pomiar \\noindent \\noindent

    ", + "steps": [] + } + ] + } + ], + "assets": [], + "steps": [], + "spread_group": "", + "spread_label": "", + "spread_columns": 1, + "spread_index": 1, + "spread_count": 1, + "page_orientation": "portrait" + }, + { + "id": "section-6-task03", + "index": 6, + "title": "TASK03 — Jednokomórkowa skrzynka drop-newest", + "show_heading": true, + "toc_entry": true, + "header_html": "
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    TITLEUART — polling i przerwania RX
    VER.v00.01
    DATETIME2026-07-20T00:00:00+02:00
    PROJECTFreestanding C na RV32I
    SERIESC · Freestanding RV32I and K&R
    CARD12/13
    SHEET7/7
    SUBJ.Inf.
    PROG.
    CORE
    SCOPE
    LEVEL
    POS.
    GITEA UUIDe766c4bb-2a43-5f4e-b10a-b3393a42932cCARD UUID64f7c516-78b1-58ee-8619-a82d7061079fAUTHOR  M. Pabiszczak
    \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
    ", + "left_margin_html": "
    TECH
    ", + "right_margin_html": "
    OG
    ", + "content_html": "", + "tasks": [ + { + "ref": "task03", + "title": "Jednokomórkowa skrzynka drop-newest", + "uuid": "c60d485a-0e23-522a-a06a-78c86be36f76", + "criterion": "Hazard3: irq_count=3, accepted=2, dropped=1, first_consumed='A'=65, second_consumed='C'=67, mailbox_full=0, pass=1 i kod 0.", + "conclusion_html": "", + "prompt_html": "

    Prześledź A, B i C. Dla każdego bajtu zapisz stan FIFO, mailbox_full, decyzję ISR i późniejszy odczyt main. Wyjaśnij, dlaczego B jest odrzucone, a mimo to DATA musi zostać odczytane.

    ", + "flow": [ + { + "id": "task03.a1", + "kind": "block", + "title": "A1 CONTEXT · AKTYWNE — ISR transportuje, main konsumuje", + "content_html": "

    Zachowany przykład: \\nolinkurl{src/tasks/task03_uart_mailbox.c}. Handler odpowiada za szybkie opróżnienie DATA i próbę publikacji jednego bajtu. Nie interpretuje komendy. Main odpowiada za konsumpcję. Gdy skrzynka jest pełna, kontrakt jawnie odrzuca najnowszy bajt i liczy stratę.

    ", + "steps": [] + }, + { + "id": "task03.a2", + "kind": "block", + "title": "A2 STRUCTURE · AKTYWNE — payload, flaga i telemetria", + "content_html": "

    Skrzynkę tworzą mailbox_byte i mailbox_full. Osobne liczniki irq, accepted i dropped nie sterują algorytmem; są telemetrią dowodu. Każdy obiekt ma szerokość 32 bitów i jest volatile w tym jednordzeniowym kontrakcie bare-metal.

    ", + "steps": [] + }, + { + "id": "task03.a3", + "kind": "block", + "title": "A3 DISPATCH · AKTYWNE — ten sam IRQ, inny odbiorca", + "content_html": "

    Linia 16 przechodzi przez ten sam dispatcher co Task02, lecz wpis tablicy wskazuje task03_uart_handler. Dynamiczny wybór kończy się pośrednim jalr; decyzja accepted/drop odbywa się dopiero wewnątrz handlera na podstawie danych.

    ", + "steps": [] + }, + { + "id": "task03.a4", + "kind": "block", + "title": "A4 APPLICATION · AKTYWNE — A przyjęte, B odrzucone, C przyjęte", + "content_html": "

    Po A skrzynka jest pełna i accepted=1. B wywołuje drugie IRQ, DATA zostaje opróżnione, lecz payload A pozostaje, a dropped rośnie do 1. Main pobiera A. Po C pusta skrzynka znów przyjmuje dane; main pobiera C.

    ", + "steps": [] + }, + { + "id": "task03.a5", + "kind": "block", + "title": "A5 FLOW · AKTYWNE — drain przed decyzją publish/drop", + "content_html": "

    ISR najpierw odczytuje DATA, dzięki czemu usuwa źródło poziomowe niezależnie od stanu skrzynki. Następnie zwiększa irq_count i wybiera publikację albo drop. Main czeka na konkretną liczbę obsług, a nie na sam upływ pętli.

    ", + "steps": [] + }, + { + "id": "task03.a6", + "kind": "block", + "title": "A6 STATE · AKTYWNE — EMPTY, FULL(A), FULL(A), EMPTY, FULL(C), EMPTY", + "content_html": "

    Pełny ślad skrzynki to EMPTY -> FULL(A) -> FULL(A) -> EMPTY -> FULL(C) -> EMPTY. Drugie przejście nie zmienia payloadu, ale zmienia licznik dropped; dlatego stan domenowy i telemetria muszą być czytane razem.

    ", + "steps": [] + }, + { + "id": "task03.a7", + "kind": "block", + "title": "A7 RUNTIME · AKTYWNE — trzy wejścia i trzy mret", + "content_html": "

    Checkpoint ma pokazać irq=3, accepted=2, dropped=1, 65, 67 i full=0. W listingu wskaż trzy klasy operacji: MMIO DATA, zapisy globali przez ISR oraz odtworzenie kontekstu i mret w dispatcherze.

    ", + "steps": [] + }, + { + "id": "task03.a8", + "kind": "block", + "title": "A8 PATTERNS · AKTYWNE — bounded mailbox z jawną utratą", + "content_html": "

    Jednokomórkowa skrzynka ogranicza czas i pamięć ISR. Jej ważną częścią jest polityka przeciążenia i licznik strat. Nie należy nazywać jej kolejką; nie zachowuje serii zdarzeń i nie zastępuje synchronizacji wielordzeniowej ani RTOS.

    ", + "steps": [] + }, + { + "id": "task03.proof", + "kind": "exercise", + "title": "Przewidywanie → wykonanie → wniosek", + "content_html": "", + "steps": [] + }, + { + "id": "task03.worksheet", + "kind": "block", + "title": "TASK03 · Zapis dowodu ucznia", + "content_html": "

    1. Przewidywanie przed uruchomieniem \\noindent \\noindent 2. Ślad ISR dla A, B i C \\noindent \\noindent 3. Konsumpcja main, liczniki i kod wyjścia \\noindent \\noindent 4. Wniosek: reguła języka lub kontrakt targetu potwierdzony przez pomiar \\noindent \\noindent

    ", + "steps": [] + } + ] + } + ], + "assets": [], + "steps": [], + "spread_group": "", + "spread_label": "", + "spread_columns": 1, + "spread_index": 1, + "spread_count": 1, + "page_orientation": "portrait" + } + ], + "viewpoints": [], + "has_spread": false, + "has_allocator_model": false, + "dictionary": null, + "toc": [ + { + "id": "section-1-content", + "label": "1. Polling pyta o stan w rytmie programu" + }, + { + "id": "section-2-content", + "label": "2. RX IRQ jest ścieżką pięciu stanów" + }, + { + "id": "section-3-content", + "label": "3. ISR przekazuje minimum, main nadaje znaczenie" + }, + { + "id": "section-4-task01", + "label": "4. TASK01 — Polling jednego bajtu" + }, + { + "id": "section-5-task02", + "label": "5. TASK02 — Odbiór R przez external IRQ 16" + }, + { + "id": "section-6-task03", + "label": "6. TASK03 — Jednokomórkowa skrzynka drop-newest" + } + ] +} diff --git a/web/index.html b/web/index.html new file mode 100644 index 0000000..8f9f9f5 --- /dev/null +++ b/web/index.html @@ -0,0 +1,15 @@ + + + + + + + Karta pracy + + + + +
    + + + diff --git a/web/style.css b/web/style.css new file mode 100644 index 0000000..2e89cf9 --- /dev/null +++ b/web/style.css @@ -0,0 +1,39 @@ + +:root{--ink:#111;--muted:#666;--line:#b9b9b9;--line-soft:#dddddd;--paper:#fff;--desk:#eeeeee;--og:#008000;--tech:#d36b00;--kw:#0018c8;--we:#e00000;--viewer-canvas-scale:1;--viewer-content-scale:1} +*{box-sizing:border-box} html{scroll-behavior:smooth} body{margin:0;background:var(--desk);color:var(--ink);font-family:"Latin Modern Roman","LM Roman 12",Georgia,"Times New Roman",serif;line-height:1.25} +.topbar{position:sticky;top:0;z-index:20;background:rgba(245,245,245,.94);border-bottom:1px solid #d0d0d0;padding:3px 0;font-family:system-ui,-apple-system,Segoe UI,sans-serif} +.topbar-inner{width:calc(100% - 8px);max-width:none;margin:0 4px;display:flex;align-items:center;justify-content:space-between;gap:6px}.topbar details{min-width:0;flex:1}.topbar summary{cursor:pointer;font-size:16px;line-height:1.35;font-weight:650}.toc-links{display:flex;flex-wrap:wrap;gap:6px;margin-top:5px}.toc-links a{font-size:16px;color:#333;text-decoration:none;border:1px solid #ccc;background:white;border-radius:3px;padding:2px 5px}.viewer-zoom-controls{display:flex;align-items:center;gap:7px;flex:none}.viewer-zoom-status{font:600 16px/1.4 ui-monospace,SFMono-Regular,Consolas,monospace;color:#444;white-space:nowrap}.viewer-zoom-reset{border:1px solid #bbb;border-radius:3px;background:#fff;color:#333;padding:1px 6px;font:600 16px/1.35 system-ui,-apple-system,Segoe UI,sans-serif;cursor:pointer}.viewer-zoom-reset:hover{background:#eee}.viewer-zoom-reset:focus-visible{outline:2px solid #555;outline-offset:1px} +.paper{padding:18px 12px 44px;overflow-x:auto}.sheet{position:relative;width:210mm;min-height:297mm;margin:0 auto 18px;background:var(--paper);box-shadow:0 2px 12px rgba(0,0,0,.13);display:block;padding:0;overflow:visible;zoom:var(--viewer-canvas-scale)}.sheet-content{position:relative;width:100%;min-height:297mm;padding:13mm 21.5mm 15mm;transform:scale(var(--sheet-effective-scale,1));transform-origin:top left}.resource-header-enabled .sheet-content{padding-top:5mm}.sheet-content>.page-resource-header{margin-bottom:3mm} +@media(max-width:900px){.sheet{height:auto}}@media print{.sheet{height:auto}} +.pdf-main{min-width:0;width:100%}.running-header{display:flex;justify-content:space-between;gap:18px;align-items:flex-end;border-bottom:1px solid #111;padding-bottom:3px;margin-bottom:26px;font-size:15px}.running-header span{white-space:nowrap} +.hero h1{font-size:24px;line-height:1.15;margin:0 0 4px;border-bottom:1px solid #111;padding-bottom:4px}.hero .byline{float:right;margin-top:-31px;font-size:15px} +.meta{clear:both;display:grid;grid-template-columns:148px minmax(0,1fr);gap:4px 18px;padding:34px 0 24px;border-bottom:1px solid #111;font-size:17px}.meta dt{color:#333}.meta dd{margin:0;font-family:"Latin Modern Mono",ui-monospace,SFMono-Regular,Consolas,monospace} +.front-scope{padding:0 0 3mm;border-bottom:1px solid var(--line-soft)}.front-scope h2{font-size:24px;line-height:1.15;margin:0 0 3mm}.front-scope p{font-size:16px} +.scope-table-wrap{margin:3mm 0;overflow:hidden}.scope-table{width:100%;border-collapse:collapse;font-family:"Latin Modern Mono",ui-monospace,SFMono-Regular,Consolas,monospace;font-size:11px;line-height:1.22}.scope-table th,.scope-table td{border:0;border-bottom:1px solid #888;padding:4px 7px;text-align:left;vertical-align:top}.scope-table th{border-bottom:2px solid #555;background:#f3f3f3;font-weight:700}.scope-table th:first-child,.scope-table td:first-child{width:7%}.scope-table--task th:nth-child(2),.scope-table--task td:nth-child(2){width:11%}.scope-table--task th:nth-child(4),.scope-table--task td:nth-child(4){width:19%}.scope-table--task th:nth-child(5),.scope-table--task td:nth-child(5){width:14%}.scope-table--task th:nth-child(6),.scope-table--task td:nth-child(6){width:10%}.scope-table tr.scope-row--key td{font-weight:700;background:#f4f4f4;border-top:2px solid #111;border-bottom:2px solid #111}.scope-table tr.scope-row--key td:first-child{border-left:2px solid #111}.scope-table tr.scope-row--key td:last-child{border-right:2px solid #111}.scope-table td p{font:inherit;margin:0}.scope-table code{font-size:inherit}.scope-status{display:inline-block;white-space:nowrap;border:1px solid #aaa;border-radius:2px;padding:1px 4px;font-weight:600;background:#f5f5f5}.scope-status[data-status="in-progress"]{border-color:#307da1;background:#eaf5fa;color:#174f69}.scope-status[data-status="ready"]{border-color:#4c7d56;background:#edf6ee;color:#295b33}.scope-status[data-status="draft"],.scope-status[data-status="review"]{border-color:#9a7932;background:#faf4e5;color:#694f16}.scope-status[data-status="blocked"]{border-color:#9c4b4b;background:#faeded;color:#712f2f} +.card-section h2{font-size:24px;line-height:1.15;margin:0 0 4mm}.section-heading{display:flex;align-items:flex-start;gap:0}.section-heading .section-index{font-family:"Latin Modern Mono",ui-monospace,SFMono-Regular,Consolas,monospace;font-size:23px;margin-right:12mm;font-weight:400}.section-heading .section-title{min-width:0}.task-identity{margin-left:auto;padding-left:22px;text-align:right;font-family:"Latin Modern Mono",ui-monospace,SFMono-Regular,Consolas,monospace;font-size:10px;line-height:1.25;color:#555;white-space:nowrap}.task-identity strong,.task-identity-name,.task-identity code{display:block}.task-identity strong{font-size:12px;color:#111}.task-identity-name{max-width:240px;overflow:hidden;text-overflow:ellipsis}.task-identity code{font-size:9px;color:#777} +p{font-size:16px;margin:0 0 3mm}.pdf-main ul{font-size:16px;margin:2mm 0 3mm 7mm;padding:0}.pdf-main li{margin:1.2mm 0} +.pdf-margin{position:absolute;top:34mm;width:18mm;font-family:"Latin Modern Mono",ui-monospace,SFMono-Regular,Consolas,monospace;font-size:5px;line-height:1.12;color:#333;max-height:245mm;overflow:hidden}.pdf-margin.left{left:2mm;text-align:left}.pdf-margin.right{right:2mm;text-align:left} +.margin-title{font-weight:700;color:#666;margin-bottom:3px;letter-spacing:.02em}.margin-list{display:flex;flex-direction:column;align-items:flex-start}.margin-tag{display:block;margin:0 0 1px;padding:0;border:0;background:transparent;font:inherit;line-height:inherit;text-align:left;cursor:pointer;margin-left:var(--indent)}.margin-tag.we{color:var(--we)}.margin-tag.og,.margin-tag.tech{color:var(--og)}.margin-tag.kw{color:var(--kw)}.margin-tag .local{color:#777}.margin-tag:hover{text-decoration:underline}.margin-empty{color:#aaa} +.step-map{font-family:"Latin Modern Mono",ui-monospace,SFMono-Regular,Consolas,monospace;font-size:11px;line-height:1.3;color:#5c5c5c;background:transparent;border:0;border-top:1px solid #cfcfcf;border-bottom:1px solid #e0e0e0;border-radius:0;padding:8px 0;margin:0 0 16px}.step-map summary{cursor:pointer;font-weight:400;color:#555} +.tree-legend{display:flex;flex-wrap:wrap;gap:4px;margin:7px 0}.steps{display:grid;gap:6px}.step-row{border-top:1px dashed #c9c9c9;padding-top:6px}.step-row:first-child{border-top:0}.step-title span{font-weight:700;margin-right:7px}.step-trees{display:flex;flex-wrap:wrap;gap:4px;margin-top:3px}.step-refs{display:flex;flex-wrap:wrap;gap:6px;margin-top:3px}.step-refs a{font-size:10px;color:#666} +.tree-token{font:10px/1 "Latin Modern Mono",ui-monospace,SFMono-Regular,Consolas,monospace;border:1px solid #c8c8c8;background:#fff;border-radius:3px;padding:3px 5px;cursor:pointer}.tree-token.active{background:#111;color:white;border-color:#111} +.equation{display:grid;grid-template-columns:1fr auto;align-items:center;gap:14px;margin:18px 0;padding:4px 0;background:transparent;border:0}.equation .display{font-size:17px}.equation-number{font-family:"Latin Modern Mono",ui-monospace,SFMono-Regular,Consolas,monospace;font-size:15px} +figure{margin:24px 0;text-align:center}figure img{max-width:100%;display:block;margin:0 auto;border:0;border-radius:0}figcaption{font-size:14px;color:#444;margin-top:8px;text-align:left}.card-asset.asset-screenshot img{border:1px solid #aaa}.card-asset a{display:block;cursor:zoom-in} +.table-wrap{overflow:auto;margin:14px 0}table{border-collapse:collapse;width:100%;font-size:16px}th,td{border:1px solid #111;padding:5px 8px;text-align:left;vertical-align:top}th{font-weight:400;background:white} +.empty-check{display:inline-block;width:1em;height:1em;border:1px solid #111;vertical-align:-.12em}.answer-line,.dotfill{display:block;border-bottom:1px dotted #111;height:1.45em;min-width:10em}.write-row{display:block;min-height:2.8em} +code{font-family:"Latin Modern Mono",ui-monospace,SFMono-Regular,Consolas,monospace}.tasks{font-size:16px}.task-legacy{margin:2.5mm 0}.task-legacy>strong{display:block;font:700 10px/1.2 "Latin Modern Mono",ui-monospace,monospace;color:#555}.task-flow{border:1px solid #222;margin:1mm 0 2mm;background:#fff}.task-flow-header{display:grid;grid-template-columns:auto 1fr auto;align-items:baseline;gap:6px;padding:5px 7px;background:#eaeaea;border-bottom:1px solid #222}.task-flow-header span{font:700 10px/1.2 "Latin Modern Mono",ui-monospace,monospace;color:#222}.task-flow-header h3{font-size:18px;margin:0}.task-flow-header code{font-size:8px;color:#555}.task-block{margin:6px 7px;padding:5px 6px;border:1px solid #777;background:#fff}.task-block header,.task-exercise header{display:flex;align-items:baseline;gap:5px;margin-bottom:3px}.task-block header span,.task-exercise header span{font:700 9px/1.2 "Latin Modern Mono",ui-monospace,monospace;text-transform:uppercase;color:#555}.task-block h4,.task-exercise h4{font-size:16px;margin:0}.block-steps{margin:4px 0 0 16px!important;padding:0;display:grid;gap:3px}.block-steps li{margin:0;border:1px solid #b9b9b9;padding:4px 5px;background:#fff}.block-steps li::marker{font-family:"Latin Modern Mono",ui-monospace,monospace;font-weight:700}.block-steps li p:last-child{margin-bottom:0}.task-exercise{margin:6px 7px;border:1px solid #777;border-left:1px solid #222;padding:5px 6px;background:#fafafa}.task-exercise header{flex-wrap:wrap}.exercise-based-on{margin-left:auto;font-size:8px;color:#777}.exercise-evidence{border-top:1px dashed #bbb;margin-top:5px;padding-top:4px}.exercise-evidence>strong{font-size:11px;text-transform:uppercase}.exercise-criterion{font-size:13px;margin:4px 0 0}.task-flow>footer{padding:5px 7px;border-top:1px solid #222;font-size:12px;background:#f6f6f6}.task-conclusion{margin:8px 0;padding:7px 9px;border:1px solid #315f78;background:#f3f9fc}.task-conclusion>strong{display:block;margin-bottom:3px;font:700 10px/1.2 "Latin Modern Mono",ui-monospace,monospace;color:#315f78}.task-conclusion p{margin:0}.we-block{border-top:1px solid #ddd;padding:8px 0}.we-block summary{cursor:pointer}.dictionary-sheet .pdf-margin{display:none} +.inspector{position:fixed;right:14px;bottom:14px;width:min(360px,calc(100vw - 28px));max-height:46vh;overflow:auto;background:white;border:1px solid #cfcfcf;box-shadow:0 4px 18px rgba(0,0,0,.18);border-radius:6px;padding:12px;font-family:system-ui,-apple-system,Segoe UI,sans-serif;font-size:13px;z-index:30}.inspector h2{font-size:14px;margin:0 0 8px}.inspector .empty{color:#777}.tree-card h3{font-size:15px;margin:6px 0}.tree-card code{display:inline-block;margin:4px 0}.tree-card .line{font-weight:700}.tree-card .line.OG{color:var(--og)}.tree-card .line.TECH{color:var(--tech)}.kw-list{padding-left:18px}.kw-list code{color:var(--kw)} +@media(max-width:900px){.sheet{display:block;min-height:0}.sheet-content{min-height:0;padding:26px 18px}.pdf-margin{position:static;max-height:none;overflow:visible;margin:10px 0;padding:8px;border:1px solid #ddd}.pdf-margin.left{border-left:3px solid var(--tech)}.pdf-margin.right{border-left:3px solid var(--og)}.hero .byline{float:none;margin:0 0 14px}.meta{grid-template-columns:1fr}.section-heading{flex-wrap:wrap}.task-identity{width:100%;padding:6px 0 0}.inspector{position:static;width:auto;max-height:none;margin:0 12px 18px}.topbar{position:sticky;top:0}.viewer-zoom-status{font-size:16px}} +@media print{html,body{background:white}.topbar,.inspector{display:none}.paper{padding:0}.sheet{position:relative;display:block;width:auto;min-height:0;margin:0;box-shadow:none;break-after:page;padding:0;overflow:visible;zoom:1!important}.sheet-content{position:relative;width:auto;min-height:0;padding:0;transform:none!important}.sheet:last-child{break-after:auto}.resource-header-enabled .sheet-content{padding:0}.sheet-content>.page-resource-header,.sheet-content>.page-resource-footer{display:none!important}.pdf-margin{position:absolute;top:0;width:18mm;max-height:none;overflow:hidden;margin:0;padding:0;border:0}.pdf-margin.left{left:-19.5mm}.pdf-margin.right{right:-19.5mm}.task-block,.task-exercise,.block-steps li,figure{break-inside:avoid}} + +.page-resource-header{width:100%;height:24mm;min-height:24mm;max-height:24mm;background:#fff;color:#111;overflow:hidden;font-family:ui-monospace,SFMono-Regular,"Latin Modern Mono",Consolas,monospace;line-height:1.08} +.resource-header-table{width:100%;height:100%;border-collapse:collapse;table-layout:fixed;border:1px solid #111}.resource-header-table>tbody>tr{height:100%}.resource-header-center{height:100%;padding:0;vertical-align:middle;overflow:hidden}.resource-header-grid{display:grid;grid-template-rows:3fr 3fr 3fr 2fr 2fr;width:100%;height:100%}.resource-header-row{display:grid;min-width:0;min-height:0}.resource-header-field{display:flex;flex-direction:column;align-items:stretch;justify-content:space-between;gap:.08mm;min-width:0;padding:.28mm .55mm;border-right:1px solid #888;border-bottom:1px solid #aaa;overflow:hidden;white-space:nowrap}.resource-header-row .resource-header-field:last-child{border-right:0}.resource-header-row:last-child .resource-header-field{border-bottom:0}.resource-header-field a{display:flex;flex-direction:column;align-items:flex-start;gap:.08mm;min-width:0;color:#111;text-decoration:none}.resource-label{align-self:flex-start;font:800 3.2pt/1 ui-monospace,SFMono-Regular,"Latin Modern Mono",Consolas,monospace;text-transform:uppercase;flex:none}.resource-value{align-self:flex-end;max-width:100%;text-align:right;font:700 6.4pt/1 ui-monospace,SFMono-Regular,"Latin Modern Mono",Consolas,monospace;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.resource-header-field--title .resource-value{font-size:7.7pt;font-weight:800}.resource-header-field--emphasis .resource-value{font-size:6.6pt;font-weight:800}.resource-header-field--compact{gap:.05mm;padding:.2mm .2mm}.resource-header-field--compact .resource-label{font-size:2.85pt}.resource-header-field--compact .resource-value{font-size:4.45pt}.resource-header-field--identity{display:flex;flex-direction:column;align-items:stretch;justify-content:center;gap:.15mm;padding:.12mm .45mm;font:700 3.55pt/1.1 ui-monospace,SFMono-Regular,"Latin Modern Mono",Consolas,monospace}.resource-header-field--identity>span{display:flex;align-items:baseline;gap:.3mm;min-width:0}.resource-header-field--identity b{font-weight:800;flex:none}.resource-header-field--identity .resource-identity-value{margin-left:auto;text-align:right}.resource-header-field--identity .resource-author{margin-left:auto;text-align:right}.resource-header-field--url-row{display:flex;align-items:stretch;justify-content:center;padding:.2mm .55mm}.resource-header-field--url-row a{display:block;overflow:hidden;text-overflow:clip;font:700 4.9pt/1.05 ui-monospace,SFMono-Regular,"Latin Modern Mono",Consolas,monospace}.resource-header-field--url-row b{font-weight:800} +.resource-qr-cell{height:100%;padding:0;vertical-align:middle;overflow:hidden}.resource-qr-cell--left{border-right:1px solid #777}.resource-qr-cell--right{border-left:1px solid #777}.resource-qr{box-sizing:border-box;width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:.4mm;color:#333;text-decoration:none}.resource-qr .title-qr{display:block;width:22mm;height:22mm;max-width:22mm;max-height:22mm;flex:none}.resource-qr-empty{text-align:center}.resource-qr-empty span,.resource-qr-empty strong{display:block;font:600 5pt/1.15 ui-monospace,SFMono-Regular,Consolas,monospace} + +@page{ + size:A4; + margin:29mm 21.5mm 5mm; + @top-left{content:"";width:24mm;height:24mm;box-sizing:border-box;padding:0;border:1px solid #111;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:22mm 22mm;vertical-align:middle;text-align:center;font:0/0 sans-serif;color:transparent;background-image:url("data:image/svg+xml;base64,PHN2ZyBjbGFzcz0idGl0bGUtcXIiIHJvbGU9ImltZyIgYXJpYS1sYWJlbD0iS29kIFFSOiBodHRwczovL3pzbC1naXRlYS5tcGFiaS5wbC9lZHUtaW5mL2xhYi1ydjMyaS1jLXVhcnQiIHZlcnNpb249JzEuMScgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB4bWxuczp4bGluaz0naHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycgd2lkdGg9Jzg1LjAzODk2OHB0JyBoZWlnaHQ9Jzg1LjAzODk2OHB0JyB2aWV3Qm94PSctNzIuMDAwMDA0IC03Mi4wMDAwMDQgODUuMDM4OTY4IDg1LjAzODk2OCc+CjxnIGlkPSdwYWdlMSc+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy03Mi4wMDAwMDQnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNjkuMDY3NjI2JyB5PSctNzIuMDAwMDA0JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTY2LjEzNTI0OCcgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy02My4yMDI4NycgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy02MC4yNzA0OTEnIHk9Jy03Mi4wMDAwMDQnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNTcuMzM4MTEzJyB5PSctNzIuMDAwMDA0JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTU0LjQwNTczNScgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0zOS43NDM4NDQnIHk9Jy03Mi4wMDAwMDQnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMzAuOTQ2NzA5JyB5PSctNzIuMDAwMDA0JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTI4LjAxNDMzMScgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0yMi4xNDk1NzUnIHk9Jy03Mi4wMDAwMDQnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMTkuMjE3MTk2JyB5PSctNzIuMDAwMDA0JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTE2LjI4NDgxOCcgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy03LjQ4NzY4NCcgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy00LjU1NTMwNScgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0xLjYyMjkyNycgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9JzEuMzA5NDUxJyB5PSctNzIuMDAwMDA0JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nNC4yNDE4MjknIHk9Jy03Mi4wMDAwMDQnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSc3LjE3NDIwOCcgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9JzEwLjEwNjU4NicgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy02OS4wNjc2MjYnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNTQuNDA1NzM1JyB5PSctNjkuMDY3NjI2JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTQ4LjU0MDk3OScgeT0nLTY5LjA2NzYyNicgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy00NS42MDg2JyB5PSctNjkuMDY3NjI2JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTM5Ljc0Mzg0NCcgeT0nLTY5LjA2NzYyNicgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0yOC4wMTQzMzEnIHk9Jy02OS4wNjc2MjYnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMjUuMDgxOTUzJyB5PSctNjkuMDY3NjI2JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTIyLjE0OTU3NScgeT0nLTY5LjA2NzYyNicgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy03LjQ4NzY4NCcgeT0nLTY5LjA2NzYyNicgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9JzEwLjEwNjU4NicgeT0nLTY5LjA2NzYyNicgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy02Ni4xMzUyNDgnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNjYuMTM1MjQ4JyB5PSctNjYuMTM1MjQ4JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTYzLjIwMjg3JyB5PSctNjYuMTM1MjQ4JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTYwLjI3MDQ5MScgeT0nLTY2LjEzNTI0OCcgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy01NC40MDU3MzUnIHk9Jy02Ni4xMzUyNDgnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNDguNTQwOTc5JyB5PSctNjYuMTM1MjQ4JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTQyLjY3NjIyMicgeT0nLTY2LjEzNTI0OCcgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0zNi44MTE0NjYnIHk9Jy02Ni4xMzUyNDgnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMzAuOTQ2NzA5JyB5PSctNjYuMTM1MjQ4JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTIyLjE0OTU3NScgeT0nLTY2LjEzNTI0OCcgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0xNi4yODQ4MTgnIHk9Jy02Ni4xMzUyNDgnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNy40ODc2ODQnIHk9Jy02Ni4xMzUyNDgnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMS42MjI5MjcnIHk9Jy02Ni4xMzUyNDgnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PScxLjMwOTQ1MScgeT0nLTY2LjEzNTI0OCcgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9JzQuMjQxODI5JyB5PSctNjYuMTM1MjQ4JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nMTAuMTA2NTg2JyB5PSctNjYuMTM1MjQ4JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLTYzLjIwMjg3JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTY2LjEzNTI0OCcgeT0nLTYzLjIwMjg3JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTYzLjIwMjg3JyB5PSctNjMuMjAyODcnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNjAuMjcwNDkxJyB5PSctNjMuMjAyODcnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNTQuNDA1NzM1JyB5PSctNjMuMjAyODcnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNDUuNjA4NicgeT0nLTYzLjIwMjg3JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTM5Ljc0Mzg0NCcgeT0nLTYzLjIwMjg3JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTM2LjgxMTQ2NicgeT0nLTYzLjIwMjg3JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTMwLjk0NjcwOScgeT0nLTYzLjIwMjg3JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTE2LjI4NDgxOCcgeT0nLTYzLjIwMjg3JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTcuNDg3Njg0JyB5PSctNjMuMjAyODcnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMS42MjI5MjcnIHk9Jy02My4yMDI4NycgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9JzEuMzA5NDUxJyB5PSctNjMuMjAyODcnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSc0LjI0MTgyOScgeT0nLTYzLjIwMjg3JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nMTAuMTA2NTg2JyB5PSctNjMuMjAyODcnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNzIuMDAwMDA0JyB5PSctNjAuMjcwNDkxJyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTY2LjEzNTI0OCcgeT0nLTYwLjI3MDQ5MScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy02My4yMDI4NycgeT0nLTYwLjI3MDQ5MScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy02MC4yNzA0OTEnIHk9Jy02MC4yNzA0OTEnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNTQuNDA1NzM1JyB5PSctNjAuMjcwNDkxJyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTQ4LjU0MDk3OScgeT0nLTYwLjI3MDQ5MScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy00NS42MDg2JyB5PSctNjAuMjcwNDkxJyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTM5Ljc0Mzg0NCcgeT0nLTYwLjI3MDQ5MScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0zMy44NzkwODcnIHk9Jy02MC4yNzA0OTEnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMzAuOTQ2NzA5JyB5PSctNjAuMjcwNDkxJyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTI4LjAxNDMzMScgeT0nLTYwLjI3MDQ5MScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0yNS4wODE5NTMnIHk9Jy02MC4yNzA0OTEnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMjIuMTQ5NTc1JyB5PSctNjAuMjcwNDkxJyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTE5LjIxNzE5NicgeT0nLTYwLjI3MDQ5MScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy03LjQ4NzY4NCcgeT0nLTYwLjI3MDQ5MScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0xLjYyMjkyNycgeT0nLTYwLjI3MDQ5MScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9JzEuMzA5NDUxJyB5PSctNjAuMjcwNDkxJyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nNC4yNDE4MjknIHk9Jy02MC4yNzA0OTEnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PScxMC4xMDY1ODYnIHk9Jy02MC4yNzA0OTEnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNzIuMDAwMDA0JyB5PSctNTcuMzM4MTEzJyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTU0LjQwNTczNScgeT0nLTU3LjMzODExMycgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy00OC41NDA5NzknIHk9Jy01Ny4zMzgxMTMnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNDIuNjc2MjIyJyB5PSctNTcuMzM4MTEzJyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTM2LjgxMTQ2NicgeT0nLTU3LjMzODExMycgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0zMC45NDY3MDknIHk9Jy01Ny4zMzgxMTMnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMjguMDE0MzMxJyB5PSctNTcuMzM4MTEzJyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTI1LjA4MTk1MycgeT0nLTU3LjMzODExMycgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0yMi4xNDk1NzUnIHk9Jy01Ny4zMzgxMTMnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMTkuMjE3MTk2JyB5PSctNTcuMzM4MTEzJyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTE2LjI4NDgxOCcgeT0nLTU3LjMzODExMycgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy03LjQ4NzY4NCcgeT0nLTU3LjMzODExMycgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9JzEwLjEwNjU4NicgeT0nLTU3LjMzODExMycgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy01NC40MDU3MzUnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNjkuMDY3NjI2JyB5PSctNTQuNDA1NzM1JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTY2LjEzNTI0OCcgeT0nLTU0LjQwNTczNScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy02My4yMDI4NycgeT0nLTU0LjQwNTczNScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy02MC4yNzA0OTEnIHk9Jy01NC40MDU3MzUnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNTcuMzM4MTEzJyB5PSctNTQuNDA1NzM1JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTU0LjQwNTczNScgeT0nLTU0LjQwNTczNScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy00OC41NDA5NzknIHk9Jy01NC40MDU3MzUnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNDIuNjc2MjIyJyB5PSctNTQuNDA1NzM1JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTM2LjgxMTQ2NicgeT0nLTU0LjQwNTczNScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0zMC45NDY3MDknIHk9Jy01NC40MDU3MzUnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMjUuMDgxOTUzJyB5PSctNTQuNDA1NzM1JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTE5LjIxNzE5NicgeT0nLTU0LjQwNTczNScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0xMy4zNTI0NCcgeT0nLTU0LjQwNTczNScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy03LjQ4NzY4NCcgeT0nLTU0LjQwNTczNScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy00LjU1NTMwNScgeT0nLTU0LjQwNTczNScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0xLjYyMjkyNycgeT0nLTU0LjQwNTczNScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9JzEuMzA5NDUxJyB5PSctNTQuNDA1NzM1JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nNC4yNDE4MjknIHk9Jy01NC40MDU3MzUnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSc3LjE3NDIwOCcgeT0nLTU0LjQwNTczNScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9JzEwLjEwNjU4NicgeT0nLTU0LjQwNTczNScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy00OC41NDA5NzknIHk9Jy01MS40NzMzNTcnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNDIuNjc2MjIyJyB5PSctNTEuNDczMzU3JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTM5Ljc0Mzg0NCcgeT0nLTUxLjQ3MzM1NycgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0yMi4xNDk1NzUnIHk9Jy01MS40NzMzNTcnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNzIuMDAwMDA0JyB5PSctNDguNTQwOTc5JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTY5LjA2NzYyNicgeT0nLTQ4LjU0MDk3OScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy02My4yMDI4NycgeT0nLTQ4LjU0MDk3OScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy01NC40MDU3MzUnIHk9Jy00OC41NDA5NzknIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNTEuNDczMzU3JyB5PSctNDguNTQwOTc5JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTM5Ljc0Mzg0NCcgeT0nLTQ4LjU0MDk3OScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0zNi44MTE0NjYnIHk9Jy00OC41NDA5NzknIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMzMuODc5MDg3JyB5PSctNDguNTQwOTc5JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTI4LjAxNDMzMScgeT0nLTQ4LjU0MDk3OScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0yNS4wODE5NTMnIHk9Jy00OC41NDA5NzknIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNy40ODc2ODQnIHk9Jy00OC41NDA5NzknIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNC41NTUzMDUnIHk9Jy00OC41NDA5NzknIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMS42MjI5MjcnIHk9Jy00OC41NDA5NzknIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSc0LjI0MTgyOScgeT0nLTQ4LjU0MDk3OScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9JzcuMTc0MjA4JyB5PSctNDguNTQwOTc5JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTY2LjEzNTI0OCcgeT0nLTQ1LjYwODYnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNjMuMjAyODcnIHk9Jy00NS42MDg2JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTU3LjMzODExMycgeT0nLTQ1LjYwODYnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNDUuNjA4NicgeT0nLTQ1LjYwODYnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMzYuODExNDY2JyB5PSctNDUuNjA4NicgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0yMi4xNDk1NzUnIHk9Jy00NS42MDg2JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTE5LjIxNzE5NicgeT0nLTQ1LjYwODYnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMTMuMzUyNDQnIHk9Jy00NS42MDg2JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTEwLjQyMDA2MicgeT0nLTQ1LjYwODYnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNy40ODc2ODQnIHk9Jy00NS42MDg2JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nMS4zMDk0NTEnIHk9Jy00NS42MDg2JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nMTAuMTA2NTg2JyB5PSctNDUuNjA4NicgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy02My4yMDI4NycgeT0nLTQyLjY3NjIyMicgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy02MC4yNzA0OTEnIHk9Jy00Mi42NzYyMjInIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNTQuNDA1NzM1JyB5PSctNDIuNjc2MjIyJyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTMzLjg3OTA4NycgeT0nLTQyLjY3NjIyMicgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0xOS4yMTcxOTYnIHk9Jy00Mi42NzYyMjInIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMTYuMjg0ODE4JyB5PSctNDIuNjc2MjIyJyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTEzLjM1MjQ0JyB5PSctNDIuNjc2MjIyJyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTEwLjQyMDA2MicgeT0nLTQyLjY3NjIyMicgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy00LjU1NTMwNScgeT0nLTQyLjY3NjIyMicgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0xLjYyMjkyNycgeT0nLTQyLjY3NjIyMicgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9JzEuMzA5NDUxJyB5PSctNDIuNjc2MjIyJyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nNC4yNDE4MjknIHk9Jy00Mi42NzYyMjInIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSc3LjE3NDIwOCcgeT0nLTQyLjY3NjIyMicgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy0zOS43NDM4NDQnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNjAuMjcwNDkxJyB5PSctMzkuNzQzODQ0JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTU3LjMzODExMycgeT0nLTM5Ljc0Mzg0NCcgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy01MS40NzMzNTcnIHk9Jy0zOS43NDM4NDQnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNDUuNjA4NicgeT0nLTM5Ljc0Mzg0NCcgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy00Mi42NzYyMjInIHk9Jy0zOS43NDM4NDQnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMzYuODExNDY2JyB5PSctMzkuNzQzODQ0JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTMzLjg3OTA4NycgeT0nLTM5Ljc0Mzg0NCcgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0yNS4wODE5NTMnIHk9Jy0zOS43NDM4NDQnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMTYuMjg0ODE4JyB5PSctMzkuNzQzODQ0JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTEzLjM1MjQ0JyB5PSctMzkuNzQzODQ0JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTcuNDg3Njg0JyB5PSctMzkuNzQzODQ0JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTQuNTU1MzA1JyB5PSctMzkuNzQzODQ0JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTEuNjIyOTI3JyB5PSctMzkuNzQzODQ0JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nNC4yNDE4MjknIHk9Jy0zOS43NDM4NDQnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSc3LjE3NDIwOCcgeT0nLTM5Ljc0Mzg0NCcgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy02Ni4xMzUyNDgnIHk9Jy0zNi44MTE0NjYnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNTQuNDA1NzM1JyB5PSctMzYuODExNDY2JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTQyLjY3NjIyMicgeT0nLTM2LjgxMTQ2NicgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0zMy44NzkwODcnIHk9Jy0zNi44MTE0NjYnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMjUuMDgxOTUzJyB5PSctMzYuODExNDY2JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTIyLjE0OTU3NScgeT0nLTM2LjgxMTQ2NicgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0xMC40MjAwNjInIHk9Jy0zNi44MTE0NjYnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNy40ODc2ODQnIHk9Jy0zNi44MTE0NjYnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PScxLjMwOTQ1MScgeT0nLTM2LjgxMTQ2NicgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9JzcuMTc0MjA4JyB5PSctMzYuODExNDY2JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nMTAuMTA2NTg2JyB5PSctMzYuODExNDY2JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLTMzLjg3OTA4NycgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy02Ni4xMzUyNDgnIHk9Jy0zMy44NzkwODcnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNDUuNjA4NicgeT0nLTMzLjg3OTA4NycgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0zNi44MTE0NjYnIHk9Jy0zMy44NzkwODcnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMzAuOTQ2NzA5JyB5PSctMzMuODc5MDg3JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTE2LjI4NDgxOCcgeT0nLTMzLjg3OTA4NycgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0xMy4zNTI0NCcgeT0nLTMzLjg3OTA4NycgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0xMC40MjAwNjInIHk9Jy0zMy44NzkwODcnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNC41NTUzMDUnIHk9Jy0zMy44NzkwODcnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNjYuMTM1MjQ4JyB5PSctMzAuOTQ2NzA5JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTYwLjI3MDQ5MScgeT0nLTMwLjk0NjcwOScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy01NC40MDU3MzUnIHk9Jy0zMC45NDY3MDknIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNDguNTQwOTc5JyB5PSctMzAuOTQ2NzA5JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTQ1LjYwODYnIHk9Jy0zMC45NDY3MDknIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNDIuNjc2MjIyJyB5PSctMzAuOTQ2NzA5JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTM5Ljc0Mzg0NCcgeT0nLTMwLjk0NjcwOScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0zMy44NzkwODcnIHk9Jy0zMC45NDY3MDknIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMjUuMDgxOTUzJyB5PSctMzAuOTQ2NzA5JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTIyLjE0OTU3NScgeT0nLTMwLjk0NjcwOScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0xMy4zNTI0NCcgeT0nLTMwLjk0NjcwOScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy00LjU1NTMwNScgeT0nLTMwLjk0NjcwOScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0xLjYyMjkyNycgeT0nLTMwLjk0NjcwOScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9JzEuMzA5NDUxJyB5PSctMzAuOTQ2NzA5JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nNC4yNDE4MjknIHk9Jy0zMC45NDY3MDknIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSc3LjE3NDIwOCcgeT0nLTMwLjk0NjcwOScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9JzEwLjEwNjU4NicgeT0nLTMwLjk0NjcwOScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy02Ni4xMzUyNDgnIHk9Jy0yOC4wMTQzMzEnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNTEuNDczMzU3JyB5PSctMjguMDE0MzMxJyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTQ4LjU0MDk3OScgeT0nLTI4LjAxNDMzMScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy00Mi42NzYyMjInIHk9Jy0yOC4wMTQzMzEnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMzkuNzQzODQ0JyB5PSctMjguMDE0MzMxJyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTM2LjgxMTQ2NicgeT0nLTI4LjAxNDMzMScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0zMy44NzkwODcnIHk9Jy0yOC4wMTQzMzEnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMjUuMDgxOTUzJyB5PSctMjguMDE0MzMxJyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTIyLjE0OTU3NScgeT0nLTI4LjAxNDMzMScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0xNi4yODQ4MTgnIHk9Jy0yOC4wMTQzMzEnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMTMuMzUyNDQnIHk9Jy0yOC4wMTQzMzEnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMS42MjI5MjcnIHk9Jy0yOC4wMTQzMzEnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PScxLjMwOTQ1MScgeT0nLTI4LjAxNDMzMScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9JzcuMTc0MjA4JyB5PSctMjguMDE0MzMxJyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLTI1LjA4MTk1MycgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy02My4yMDI4NycgeT0nLTI1LjA4MTk1MycgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy02MC4yNzA0OTEnIHk9Jy0yNS4wODE5NTMnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNTcuMzM4MTEzJyB5PSctMjUuMDgxOTUzJyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTU0LjQwNTczNScgeT0nLTI1LjA4MTk1MycgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0zOS43NDM4NDQnIHk9Jy0yNS4wODE5NTMnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMzYuODExNDY2JyB5PSctMjUuMDgxOTUzJyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTI4LjAxNDMzMScgeT0nLTI1LjA4MTk1MycgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0yMi4xNDk1NzUnIHk9Jy0yNS4wODE5NTMnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMTkuMjE3MTk2JyB5PSctMjUuMDgxOTUzJyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTEzLjM1MjQ0JyB5PSctMjUuMDgxOTUzJyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTEwLjQyMDA2MicgeT0nLTI1LjA4MTk1MycgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9JzcuMTc0MjA4JyB5PSctMjUuMDgxOTUzJyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTY5LjA2NzYyNicgeT0nLTIyLjE0OTU3NScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy02Ni4xMzUyNDgnIHk9Jy0yMi4xNDk1NzUnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNjMuMjAyODcnIHk9Jy0yMi4xNDk1NzUnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNDguNTQwOTc5JyB5PSctMjIuMTQ5NTc1JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTQ1LjYwODYnIHk9Jy0yMi4xNDk1NzUnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNDIuNjc2MjIyJyB5PSctMjIuMTQ5NTc1JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTM5Ljc0Mzg0NCcgeT0nLTIyLjE0OTU3NScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0zMy44NzkwODcnIHk9Jy0yMi4xNDk1NzUnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMjUuMDgxOTUzJyB5PSctMjIuMTQ5NTc1JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTIyLjE0OTU3NScgeT0nLTIyLjE0OTU3NScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy03LjQ4NzY4NCcgeT0nLTIyLjE0OTU3NScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy00LjU1NTMwNScgeT0nLTIyLjE0OTU3NScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9JzEuMzA5NDUxJyB5PSctMjIuMTQ5NTc1JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nMTAuMTA2NTg2JyB5PSctMjIuMTQ5NTc1JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLTE5LjIxNzE5NicgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy02Ni4xMzUyNDgnIHk9Jy0xOS4yMTcxOTYnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNTQuNDA1NzM1JyB5PSctMTkuMjE3MTk2JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTQ1LjYwODYnIHk9Jy0xOS4yMTcxOTYnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMzMuODc5MDg3JyB5PSctMTkuMjE3MTk2JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTIyLjE0OTU3NScgeT0nLTE5LjIxNzE5NicgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0xMy4zNTI0NCcgeT0nLTE5LjIxNzE5NicgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0xMC40MjAwNjInIHk9Jy0xOS4yMTcxOTYnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNy40ODc2ODQnIHk9Jy0xOS4yMTcxOTYnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNC41NTUzMDUnIHk9Jy0xOS4yMTcxOTYnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSc3LjE3NDIwOCcgeT0nLTE5LjIxNzE5NicgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9JzEwLjEwNjU4NicgeT0nLTE5LjIxNzE5NicgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy02Ni4xMzUyNDgnIHk9Jy0xNi4yODQ4MTgnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNTcuMzM4MTEzJyB5PSctMTYuMjg0ODE4JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTUxLjQ3MzM1NycgeT0nLTE2LjI4NDgxOCcgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0yOC4wMTQzMzEnIHk9Jy0xNi4yODQ4MTgnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMjUuMDgxOTUzJyB5PSctMTYuMjg0ODE4JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTIyLjE0OTU3NScgeT0nLTE2LjI4NDgxOCcgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0xOS4yMTcxOTYnIHk9Jy0xNi4yODQ4MTgnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMTYuMjg0ODE4JyB5PSctMTYuMjg0ODE4JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTEzLjM1MjQ0JyB5PSctMTYuMjg0ODE4JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTEwLjQyMDA2MicgeT0nLTE2LjI4NDgxOCcgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy03LjQ4NzY4NCcgeT0nLTE2LjI4NDgxOCcgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy00LjU1NTMwNScgeT0nLTE2LjI4NDgxOCcgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9JzcuMTc0MjA4JyB5PSctMTYuMjg0ODE4JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nMTAuMTA2NTg2JyB5PSctMTYuMjg0ODE4JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLTEzLjM1MjQ0JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTY2LjEzNTI0OCcgeT0nLTEzLjM1MjQ0JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTU0LjQwNTczNScgeT0nLTEzLjM1MjQ0JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTUxLjQ3MzM1NycgeT0nLTEzLjM1MjQ0JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTM5Ljc0Mzg0NCcgeT0nLTEzLjM1MjQ0JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTM2LjgxMTQ2NicgeT0nLTEzLjM1MjQ0JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTMzLjg3OTA4NycgeT0nLTEzLjM1MjQ0JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTI4LjAxNDMzMScgeT0nLTEzLjM1MjQ0JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTI1LjA4MTk1MycgeT0nLTEzLjM1MjQ0JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTE2LjI4NDgxOCcgeT0nLTEzLjM1MjQ0JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTEzLjM1MjQ0JyB5PSctMTMuMzUyNDQnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMTAuNDIwMDYyJyB5PSctMTMuMzUyNDQnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNy40ODc2ODQnIHk9Jy0xMy4zNTI0NCcgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy00LjU1NTMwNScgeT0nLTEzLjM1MjQ0JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTEuNjIyOTI3JyB5PSctMTMuMzUyNDQnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSc0LjI0MTgyOScgeT0nLTEzLjM1MjQ0JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTQ4LjU0MDk3OScgeT0nLTEwLjQyMDA2MicgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0zNi44MTE0NjYnIHk9Jy0xMC40MjAwNjInIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMzMuODc5MDg3JyB5PSctMTAuNDIwMDYyJyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTMwLjk0NjcwOScgeT0nLTEwLjQyMDA2MicgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0yNS4wODE5NTMnIHk9Jy0xMC40MjAwNjInIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMjIuMTQ5NTc1JyB5PSctMTAuNDIwMDYyJyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTE2LjI4NDgxOCcgeT0nLTEwLjQyMDA2MicgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0xMy4zNTI0NCcgeT0nLTEwLjQyMDA2MicgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0xLjYyMjkyNycgeT0nLTEwLjQyMDA2MicgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9JzQuMjQxODI5JyB5PSctMTAuNDIwMDYyJyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nNy4xNzQyMDgnIHk9Jy0xMC40MjAwNjInIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PScxMC4xMDY1ODYnIHk9Jy0xMC40MjAwNjInIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNzIuMDAwMDA0JyB5PSctNy40ODc2ODQnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNjkuMDY3NjI2JyB5PSctNy40ODc2ODQnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNjYuMTM1MjQ4JyB5PSctNy40ODc2ODQnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNjMuMjAyODcnIHk9Jy03LjQ4NzY4NCcgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy02MC4yNzA0OTEnIHk9Jy03LjQ4NzY4NCcgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy01Ny4zMzgxMTMnIHk9Jy03LjQ4NzY4NCcgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy01NC40MDU3MzUnIHk9Jy03LjQ4NzY4NCcgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy00OC41NDA5NzknIHk9Jy03LjQ4NzY4NCcgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy00Mi42NzYyMjInIHk9Jy03LjQ4NzY4NCcgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0zMC45NDY3MDknIHk9Jy03LjQ4NzY4NCcgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0yNS4wODE5NTMnIHk9Jy03LjQ4NzY4NCcgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0xMy4zNTI0NCcgeT0nLTcuNDg3Njg0JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTcuNDg3Njg0JyB5PSctNy40ODc2ODQnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMS42MjI5MjcnIHk9Jy03LjQ4NzY4NCcgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9JzcuMTc0MjA4JyB5PSctNy40ODc2ODQnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNzIuMDAwMDA0JyB5PSctNC41NTUzMDUnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNTQuNDA1NzM1JyB5PSctNC41NTUzMDUnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNDUuNjA4NicgeT0nLTQuNTU1MzA1JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTM2LjgxMTQ2NicgeT0nLTQuNTU1MzA1JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTMzLjg3OTA4NycgeT0nLTQuNTU1MzA1JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTI4LjAxNDMzMScgeT0nLTQuNTU1MzA1JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTI1LjA4MTk1MycgeT0nLTQuNTU1MzA1JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTE5LjIxNzE5NicgeT0nLTQuNTU1MzA1JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTE2LjI4NDgxOCcgeT0nLTQuNTU1MzA1JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTEzLjM1MjQ0JyB5PSctNC41NTUzMDUnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMS42MjI5MjcnIHk9Jy00LjU1NTMwNScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9JzEuMzA5NDUxJyB5PSctNC41NTUzMDUnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSc0LjI0MTgyOScgeT0nLTQuNTU1MzA1JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nMTAuMTA2NTg2JyB5PSctNC41NTUzMDUnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNzIuMDAwMDA0JyB5PSctMS42MjI5MjcnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNjYuMTM1MjQ4JyB5PSctMS42MjI5MjcnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNjMuMjAyODcnIHk9Jy0xLjYyMjkyNycgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy02MC4yNzA0OTEnIHk9Jy0xLjYyMjkyNycgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy01NC40MDU3MzUnIHk9Jy0xLjYyMjkyNycgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy00NS42MDg2JyB5PSctMS42MjI5MjcnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMzkuNzQzODQ0JyB5PSctMS42MjI5MjcnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMzYuODExNDY2JyB5PSctMS42MjI5MjcnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMzMuODc5MDg3JyB5PSctMS42MjI5MjcnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMzAuOTQ2NzA5JyB5PSctMS42MjI5MjcnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMjguMDE0MzMxJyB5PSctMS42MjI5MjcnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMjUuMDgxOTUzJyB5PSctMS42MjI5MjcnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMjIuMTQ5NTc1JyB5PSctMS42MjI5MjcnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMTMuMzUyNDQnIHk9Jy0xLjYyMjkyNycgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0xMC40MjAwNjInIHk9Jy0xLjYyMjkyNycgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy03LjQ4NzY4NCcgeT0nLTEuNjIyOTI3JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTQuNTU1MzA1JyB5PSctMS42MjI5MjcnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMS42MjI5MjcnIHk9Jy0xLjYyMjkyNycgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9JzEwLjEwNjU4NicgeT0nLTEuNjIyOTI3JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nMS4zMDk0NTEnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNjYuMTM1MjQ4JyB5PScxLjMwOTQ1MScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy02My4yMDI4NycgeT0nMS4zMDk0NTEnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNjAuMjcwNDkxJyB5PScxLjMwOTQ1MScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy01NC40MDU3MzUnIHk9JzEuMzA5NDUxJyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTQ4LjU0MDk3OScgeT0nMS4zMDk0NTEnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNDIuNjc2MjIyJyB5PScxLjMwOTQ1MScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0zMC45NDY3MDknIHk9JzEuMzA5NDUxJyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTI1LjA4MTk1MycgeT0nMS4zMDk0NTEnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMjIuMTQ5NTc1JyB5PScxLjMwOTQ1MScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0xNi4yODQ4MTgnIHk9JzEuMzA5NDUxJyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTcuNDg3Njg0JyB5PScxLjMwOTQ1MScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0xLjYyMjkyNycgeT0nMS4zMDk0NTEnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PScxLjMwOTQ1MScgeT0nMS4zMDk0NTEnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSc0LjI0MTgyOScgeT0nMS4zMDk0NTEnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNzIuMDAwMDA0JyB5PSc0LjI0MTgyOScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy02Ni4xMzUyNDgnIHk9JzQuMjQxODI5JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTYzLjIwMjg3JyB5PSc0LjI0MTgyOScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy02MC4yNzA0OTEnIHk9JzQuMjQxODI5JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTU0LjQwNTczNScgeT0nNC4yNDE4MjknIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNDUuNjA4NicgeT0nNC4yNDE4MjknIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMzkuNzQzODQ0JyB5PSc0LjI0MTgyOScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0zMy44NzkwODcnIHk9JzQuMjQxODI5JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTIyLjE0OTU3NScgeT0nNC4yNDE4MjknIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMS42MjI5MjcnIHk9JzQuMjQxODI5JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nMS4zMDk0NTEnIHk9JzQuMjQxODI5JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nNC4yNDE4MjknIHk9JzQuMjQxODI5JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nMTAuMTA2NTg2JyB5PSc0LjI0MTgyOScgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9JzcuMTc0MjA4JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTU0LjQwNTczNScgeT0nNy4xNzQyMDgnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNDguNTQwOTc5JyB5PSc3LjE3NDIwOCcgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy00Mi42NzYyMjInIHk9JzcuMTc0MjA4JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTM5Ljc0Mzg0NCcgeT0nNy4xNzQyMDgnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMzMuODc5MDg3JyB5PSc3LjE3NDIwOCcgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0yOC4wMTQzMzEnIHk9JzcuMTc0MjA4JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTI1LjA4MTk1MycgeT0nNy4xNzQyMDgnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMjIuMTQ5NTc1JyB5PSc3LjE3NDIwOCcgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy0xNi4yODQ4MTgnIHk9JzcuMTc0MjA4JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTEzLjM1MjQ0JyB5PSc3LjE3NDIwOCcgaGVpZ2h0PScyLjkzMjM3OCcgd2lkdGg9JzIuOTMyMzc4Jy8+CjxyZWN0IHg9Jy00LjU1NTMwNScgeT0nNy4xNzQyMDgnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMS42MjI5MjcnIHk9JzcuMTc0MjA4JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nNy4xNzQyMDgnIHk9JzcuMTc0MjA4JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nMTAuMTA2NTg2JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTY5LjA2NzYyNicgeT0nMTAuMTA2NTg2JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTY2LjEzNTI0OCcgeT0nMTAuMTA2NTg2JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTYzLjIwMjg3JyB5PScxMC4xMDY1ODYnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNjAuMjcwNDkxJyB5PScxMC4xMDY1ODYnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNTcuMzM4MTEzJyB5PScxMC4xMDY1ODYnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNTQuNDA1NzM1JyB5PScxMC4xMDY1ODYnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNDguNTQwOTc5JyB5PScxMC4xMDY1ODYnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctNDUuNjA4NicgeT0nMTAuMTA2NTg2JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTM5Ljc0Mzg0NCcgeT0nMTAuMTA2NTg2JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTM2LjgxMTQ2NicgeT0nMTAuMTA2NTg2JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTI1LjA4MTk1MycgeT0nMTAuMTA2NTg2JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTIyLjE0OTU3NScgeT0nMTAuMTA2NTg2JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPHJlY3QgeD0nLTEzLjM1MjQ0JyB5PScxMC4xMDY1ODYnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSctMTAuNDIwMDYyJyB5PScxMC4xMDY1ODYnIGhlaWdodD0nMi45MzIzNzgnIHdpZHRoPScyLjkzMjM3OCcvPgo8cmVjdCB4PSc3LjE3NDIwOCcgeT0nMTAuMTA2NTg2JyBoZWlnaHQ9JzIuOTMyMzc4JyB3aWR0aD0nMi45MzIzNzgnLz4KPC9nPgo8L3N2Zz4=")} + @top-center{content:" TITLE VER. DATETIME \A \A UART — polling i przerwania RX v00.01 2026-07-20T00:00:00+02:00 \A PROJECT SERIES CARD SHEET \A \A Freestanding C na RV32I C · Freestanding RV32I and K&R 12/13 " counter(page) "/" counter(pages) " \A SUBJ. PROG. CORE SCOPE LEVEL POS. GITEA UUID e766c4bb-2a43-5f4e-b10a-b3393a42932c\A CARD UUID 64f7c516-78b1-58ee-8619-a82d7061079f AUTHOR M. Pabiszczak\A Inf. — — — — — \A \A GITEA https://zsl-gitea.mpabi.pl/edu-inf/lab-rv32i-c-uart \A \A HTML https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/64f7c516-78b1-58ee-8619-a82d7061079f ";width:119mm;height:24mm;box-sizing:border-box;padding:.2mm .7mm 0;border-block:1px solid #111;background-color:#fff;background-image:url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxMTkgMjQiIHByZXNlcnZlQXNwZWN0UmF0aW89Im5vbmUiPjxyZWN0IHdpZHRoPSIxMTkiIGhlaWdodD0iMjQiIGZpbGw9IndoaXRlIi8+PHBhdGggZD0iTTAgNS41Mzg0NkgxMTkgTTAgMTEuMDc2OUgxMTkgTTAgMTYuNjE1NEgxMTkgTTAgMjAuMzA3N0gxMTkgTTU5LjUgMFY1LjUzODQ2IE03Ny41IDBWNS41Mzg0NiBNNTkuNSA1LjUzODQ2VjExLjA3NjkgTTg5LjUgNS41Mzg0NlYxMS4wNzY5IE0xMDYuNSA1LjUzODQ2VjExLjA3NjkgTTcgMTEuMDc2OVYxNi42MTU0IE0xMyAxMS4wNzY5VjE2LjYxNTQgTTMwLjUgMTEuMDc2OVYxNi42MTU0IE00MS41IDExLjA3NjlWMTYuNjE1NCBNNTAuNSAxMS4wNzY5VjE2LjYxNTQgTTU5LjUgMTEuMDc2OVYxNi42MTU0IiBmaWxsPSJub25lIiBzdHJva2U9IiM4ODgiIHN0cm9rZS13aWR0aD0iMC4xNCIvPjwvc3ZnPg==");background-repeat:no-repeat;background-position:center;background-size:100% 100%;white-space:pre;vertical-align:top;text-align:left;font:700 5.2px/1.81538mm ui-monospace,SFMono-Regular,Consolas,monospace;letter-spacing:-.02px;color:#111;overflow:hidden} + @top-right{content:"";width:24mm;height:24mm;box-sizing:border-box;padding:0;border:1px solid #111;background-color:#fff;background-repeat:no-repeat;background-position:center;background-size:22mm 22mm;vertical-align:middle;text-align:center;font:0/0 sans-serif;color:transparent;background-image:url("data:image/svg+xml;base64,PHN2ZyBjbGFzcz0idGl0bGUtcXIiIHJvbGU9ImltZyIgYXJpYS1sYWJlbD0iS29kIFFSOiBodHRwczovL2RjZTdmYjlkLTdiMmYtNWQ0OS05NmEyLTNhMzBkMzA3MGI4NC5tcGFiaS5wbC82NGY3YzUxNi03OGIxLTU4ZWUtODYxOS1hODJkNzA2MTA3OWYiIHZlcnNpb249JzEuMScgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB4bWxuczp4bGluaz0naHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluaycgd2lkdGg9Jzg1LjAzOTIyN3B0JyBoZWlnaHQ9Jzg1LjAzOTIyN3B0JyB2aWV3Qm94PSctNzIuMDAwMDA0IC03Mi4wMDAwMDQgODUuMDM5MjI3IDg1LjAzOTIyNyc+CjxnIGlkPSdwYWdlMSc+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy03Mi4wMDAwMDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjkuNzAxNjQ3JyB5PSctNzIuMDAwMDA0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY3LjQwMzI4OScgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02NS4xMDQ5MzInIHk9Jy03Mi4wMDAwMDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjIuODA2NTc0JyB5PSctNzIuMDAwMDA0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTYwLjUwODIxNycgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01OC4yMDk4NTknIHk9Jy03Mi4wMDAwMDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDkuMDE2NDI5JyB5PSctNzIuMDAwMDA0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ0LjQxOTcxNScgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zOS44MjMnIHk9Jy03Mi4wMDAwMDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjguMzMxMjEyJyB5PSctNzIuMDAwMDA0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE5LjEzNzc4MicgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xNi44Mzk0MjUnIHk9Jy03Mi4wMDAwMDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTIuMjQyNzEnIHk9Jy03Mi4wMDAwMDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMy4wNDkyOCcgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0uNzUwOTIyJyB5PSctNzIuMDAwMDA0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMS41NDc0MzUnIHk9Jy03Mi4wMDAwMDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSczLjg0NTc5MycgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzYuMTQ0MTUnIHk9Jy03Mi4wMDAwMDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc4LjQ0MjUwNycgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEwLjc0MDg2NScgeT0nLTcyLjAwMDAwNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy02OS43MDE2NDcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTguMjA5ODU5JyB5PSctNjkuNzAxNjQ3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUzLjYxMzE0NCcgeT0nLTY5LjcwMTY0NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00OS4wMTY0MjknIHk9Jy02OS43MDE2NDcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzcuNTI0NjQyJyB5PSctNjkuNzAxNjQ3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM1LjIyNjI4NScgeT0nLTY5LjcwMTY0NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yNi4wMzI4NTUnIHk9Jy02OS43MDE2NDcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjEuNDM2MTQnIHk9Jy02OS43MDE2NDcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTQuNTQxMDY3JyB5PSctNjkuNzAxNjQ3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTkuOTQ0MzUyJyB5PSctNjkuNzAxNjQ3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcuNjQ1OTk1JyB5PSctNjkuNzAxNjQ3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMuMDQ5MjgnIHk9Jy02OS43MDE2NDcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PScxMC43NDA4NjUnIHk9Jy02OS43MDE2NDcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNzIuMDAwMDA0JyB5PSctNjcuNDAzMjg5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY3LjQwMzI4OScgeT0nLTY3LjQwMzI4OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02NS4xMDQ5MzInIHk9Jy02Ny40MDMyODknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjIuODA2NTc0JyB5PSctNjcuNDAzMjg5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTU4LjIwOTg1OScgeT0nLTY3LjQwMzI4OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00NC40MTk3MTUnIHk9Jy02Ny40MDMyODknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzcuNTI0NjQyJyB5PSctNjcuNDAzMjg5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTI2LjAzMjg1NScgeT0nLTY3LjQwMzI4OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yMy43MzQ0OTcnIHk9Jy02Ny40MDMyODknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTYuODM5NDI1JyB5PSctNjcuNDAzMjg5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTEyLjI0MjcxJyB5PSctNjcuNDAzMjg5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTkuOTQ0MzUyJyB5PSctNjcuNDAzMjg5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcuNjQ1OTk1JyB5PSctNjcuNDAzMjg5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMuMDQ5MjgnIHk9Jy02Ny40MDMyODknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PScxLjU0NzQzNScgeT0nLTY3LjQwMzI4OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzMuODQ1NzkzJyB5PSctNjcuNDAzMjg5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nNi4xNDQxNScgeT0nLTY3LjQwMzI4OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEwLjc0MDg2NScgeT0nLTY3LjQwMzI4OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy02NS4xMDQ5MzInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjcuNDAzMjg5JyB5PSctNjUuMTA0OTMyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY1LjEwNDkzMicgeT0nLTY1LjEwNDkzMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Mi44MDY1NzQnIHk9Jy02NS4xMDQ5MzInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTguMjA5ODU5JyB5PSctNjUuMTA0OTMyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUzLjYxMzE0NCcgeT0nLTY1LjEwNDkzMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01MS4zMTQ3ODcnIHk9Jy02NS4xMDQ5MzInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDkuMDE2NDI5JyB5PSctNjUuMTA0OTMyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ0LjQxOTcxNScgeT0nLTY1LjEwNDkzMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00Mi4xMjEzNTcnIHk9Jy02NS4xMDQ5MzInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzcuNTI0NjQyJyB5PSctNjUuMTA0OTMyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM1LjIyNjI4NScgeT0nLTY1LjEwNDkzMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zMi45Mjc5MjcnIHk9Jy02NS4xMDQ5MzInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzAuNjI5NTcnIHk9Jy02NS4xMDQ5MzInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjguMzMxMjEyJyB5PSctNjUuMTA0OTMyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTIxLjQzNjE0JyB5PSctNjUuMTA0OTMyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE5LjEzNzc4MicgeT0nLTY1LjEwNDkzMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xNi44Mzk0MjUnIHk9Jy02NS4xMDQ5MzInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTQuNTQxMDY3JyB5PSctNjUuMTA0OTMyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTEyLjI0MjcxJyB5PSctNjUuMTA0OTMyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMuMDQ5MjgnIHk9Jy02NS4xMDQ5MzInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PScxLjU0NzQzNScgeT0nLTY1LjEwNDkzMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzMuODQ1NzkzJyB5PSctNjUuMTA0OTMyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nNi4xNDQxNScgeT0nLTY1LjEwNDkzMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEwLjc0MDg2NScgeT0nLTY1LjEwNDkzMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy02Mi44MDY1NzQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjcuNDAzMjg5JyB5PSctNjIuODA2NTc0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY1LjEwNDkzMicgeT0nLTYyLjgwNjU3NCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Mi44MDY1NzQnIHk9Jy02Mi44MDY1NzQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTguMjA5ODU5JyB5PSctNjIuODA2NTc0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUxLjMxNDc4NycgeT0nLTYyLjgwNjU3NCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zOS44MjMnIHk9Jy02Mi44MDY1NzQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzIuOTI3OTI3JyB5PSctNjIuODA2NTc0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTI4LjMzMTIxMicgeT0nLTYyLjgwNjU3NCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yMy43MzQ0OTcnIHk9Jy02Mi44MDY1NzQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjEuNDM2MTQnIHk9Jy02Mi44MDY1NzQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTkuMTM3NzgyJyB5PSctNjIuODA2NTc0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMuMDQ5MjgnIHk9Jy02Mi44MDY1NzQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PScxLjU0NzQzNScgeT0nLTYyLjgwNjU3NCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzMuODQ1NzkzJyB5PSctNjIuODA2NTc0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nNi4xNDQxNScgeT0nLTYyLjgwNjU3NCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEwLjc0MDg2NScgeT0nLTYyLjgwNjU3NCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy02MC41MDgyMTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTguMjA5ODU5JyB5PSctNjAuNTA4MjE3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUzLjYxMzE0NCcgeT0nLTYwLjUwODIxNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01MS4zMTQ3ODcnIHk9Jy02MC41MDgyMTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDYuNzE4MDcyJyB5PSctNjAuNTA4MjE3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ0LjQxOTcxNScgeT0nLTYwLjUwODIxNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00Mi4xMjEzNTcnIHk9Jy02MC41MDgyMTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzkuODIzJyB5PSctNjAuNTA4MjE3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM3LjUyNDY0MicgeT0nLTYwLjUwODIxNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zMC42Mjk1NycgeT0nLTYwLjUwODIxNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yNi4wMzI4NTUnIHk9Jy02MC41MDgyMTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjMuNzM0NDk3JyB5PSctNjAuNTA4MjE3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE2LjgzOTQyNScgeT0nLTYwLjUwODIxNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy05Ljk0NDM1MicgeT0nLTYwLjUwODIxNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zLjA0OTI4JyB5PSctNjAuNTA4MjE3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMTAuNzQwODY1JyB5PSctNjAuNTA4MjE3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLTU4LjIwOTg1OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02OS43MDE2NDcnIHk9Jy01OC4yMDk4NTknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjcuNDAzMjg5JyB5PSctNTguMjA5ODU5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY1LjEwNDkzMicgeT0nLTU4LjIwOTg1OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Mi44MDY1NzQnIHk9Jy01OC4yMDk4NTknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjAuNTA4MjE3JyB5PSctNTguMjA5ODU5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTU4LjIwOTg1OScgeT0nLTU4LjIwOTg1OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01My42MTMxNDQnIHk9Jy01OC4yMDk4NTknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDkuMDE2NDI5JyB5PSctNTguMjA5ODU5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ0LjQxOTcxNScgeT0nLTU4LjIwOTg1OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zOS44MjMnIHk9Jy01OC4yMDk4NTknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzUuMjI2Mjg1JyB5PSctNTguMjA5ODU5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMwLjYyOTU3JyB5PSctNTguMjA5ODU5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTI2LjAzMjg1NScgeT0nLTU4LjIwOTg1OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yMS40MzYxNCcgeT0nLTU4LjIwOTg1OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xNi44Mzk0MjUnIHk9Jy01OC4yMDk4NTknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTIuMjQyNzEnIHk9Jy01OC4yMDk4NTknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNy42NDU5OTUnIHk9Jy01OC4yMDk4NTknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMy4wNDkyOCcgeT0nLTU4LjIwOTg1OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0uNzUwOTIyJyB5PSctNTguMjA5ODU5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMS41NDc0MzUnIHk9Jy01OC4yMDk4NTknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSczLjg0NTc5MycgeT0nLTU4LjIwOTg1OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzYuMTQ0MTUnIHk9Jy01OC4yMDk4NTknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc4LjQ0MjUwNycgeT0nLTU4LjIwOTg1OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEwLjc0MDg2NScgeT0nLTU4LjIwOTg1OScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01MS4zMTQ3ODcnIHk9Jy01NS45MTE1MDInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDkuMDE2NDI5JyB5PSctNTUuOTExNTAyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ2LjcxODA3MicgeT0nLTU1LjkxMTUwMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zOS44MjMnIHk9Jy01NS45MTE1MDInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzUuMjI2Mjg1JyB5PSctNTUuOTExNTAyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMwLjYyOTU3JyB5PSctNTUuOTExNTAyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTIzLjczNDQ5NycgeT0nLTU1LjkxMTUwMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xOS4xMzc3ODInIHk9Jy01NS45MTE1MDInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTYuODM5NDI1JyB5PSctNTUuOTExNTAyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTEyLjI0MjcxJyB5PSctNTUuOTExNTAyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLTUzLjYxMzE0NCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02OS43MDE2NDcnIHk9Jy01My42MTMxNDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjcuNDAzMjg5JyB5PSctNTMuNjEzMTQ0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY1LjEwNDkzMicgeT0nLTUzLjYxMzE0NCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Mi44MDY1NzQnIHk9Jy01My42MTMxNDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTguMjA5ODU5JyB5PSctNTMuNjEzMTQ0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTU1LjkxMTUwMicgeT0nLTUzLjYxMzE0NCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01My42MTMxNDQnIHk9Jy01My42MTMxNDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTEuMzE0Nzg3JyB5PSctNTMuNjEzMTQ0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ2LjcxODA3MicgeT0nLTUzLjYxMzE0NCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00Mi4xMjEzNTcnIHk9Jy01My42MTMxNDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzcuNTI0NjQyJyB5PSctNTMuNjEzMTQ0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM1LjIyNjI4NScgeT0nLTUzLjYxMzE0NCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zMi45Mjc5MjcnIHk9Jy01My42MTMxNDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjYuMDMyODU1JyB5PSctNTMuNjEzMTQ0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTIxLjQzNjE0JyB5PSctNTMuNjEzMTQ0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE2LjgzOTQyNScgeT0nLTUzLjYxMzE0NCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xNC41NDEwNjcnIHk9Jy01My42MTMxNDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctOS45NDQzNTInIHk9Jy01My42MTMxNDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNy42NDU5OTUnIHk9Jy01My42MTMxNDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNS4zNDc2MzcnIHk9Jy01My42MTMxNDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctLjc1MDkyMicgeT0nLTUzLjYxMzE0NCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzMuODQ1NzkzJyB5PSctNTMuNjEzMTQ0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nOC40NDI1MDcnIHk9Jy01My42MTMxNDQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNzIuMDAwMDA0JyB5PSctNTEuMzE0Nzg3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY1LjEwNDkzMicgeT0nLTUxLjMxNDc4NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01NS45MTE1MDInIHk9Jy01MS4zMTQ3ODcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTMuNjEzMTQ0JyB5PSctNTEuMzE0Nzg3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUxLjMxNDc4NycgeT0nLTUxLjMxNDc4NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00OS4wMTY0MjknIHk9Jy01MS4zMTQ3ODcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDQuNDE5NzE1JyB5PSctNTEuMzE0Nzg3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQyLjEyMTM1NycgeT0nLTUxLjMxNDc4NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zOS44MjMnIHk9Jy01MS4zMTQ3ODcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzAuNjI5NTcnIHk9Jy01MS4zMTQ3ODcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjguMzMxMjEyJyB5PSctNTEuMzE0Nzg3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE5LjEzNzc4MicgeT0nLTUxLjMxNDc4NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xMi4yNDI3MScgeT0nLTUxLjMxNDc4NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0uNzUwOTIyJyB5PSctNTEuMzE0Nzg3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMy44NDU3OTMnIHk9Jy01MS4zMTQ3ODcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc2LjE0NDE1JyB5PSctNTEuMzE0Nzg3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nOC40NDI1MDcnIHk9Jy01MS4zMTQ3ODcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNzIuMDAwMDA0JyB5PSctNDkuMDE2NDI5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY5LjcwMTY0NycgeT0nLTQ5LjAxNjQyOScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01OC4yMDk4NTknIHk9Jy00OS4wMTY0MjknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTUuOTExNTAyJyB5PSctNDkuMDE2NDI5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM3LjUyNDY0MicgeT0nLTQ5LjAxNjQyOScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yMy43MzQ0OTcnIHk9Jy00OS4wMTY0MjknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjEuNDM2MTQnIHk9Jy00OS4wMTY0MjknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTQuNTQxMDY3JyB5PSctNDkuMDE2NDI5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTkuOTQ0MzUyJyB5PSctNDkuMDE2NDI5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcuNjQ1OTk1JyB5PSctNDkuMDE2NDI5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMuMDQ5MjgnIHk9Jy00OS4wMTY0MjknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctLjc1MDkyMicgeT0nLTQ5LjAxNjQyOScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEuNTQ3NDM1JyB5PSctNDkuMDE2NDI5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMy44NDU3OTMnIHk9Jy00OS4wMTY0MjknIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc2LjE0NDE1JyB5PSctNDkuMDE2NDI5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMTAuNzQwODY1JyB5PSctNDkuMDE2NDI5JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY1LjEwNDkzMicgeT0nLTQ2LjcxODA3MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01NS45MTE1MDInIHk9Jy00Ni43MTgwNzInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTMuNjEzMTQ0JyB5PSctNDYuNzE4MDcyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUxLjMxNDc4NycgeT0nLTQ2LjcxODA3MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00OS4wMTY0MjknIHk9Jy00Ni43MTgwNzInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDQuNDE5NzE1JyB5PSctNDYuNzE4MDcyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM5LjgyMycgeT0nLTQ2LjcxODA3MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNy41MjQ2NDInIHk9Jy00Ni43MTgwNzInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjguMzMxMjEyJyB5PSctNDYuNzE4MDcyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTIzLjczNDQ5NycgeT0nLTQ2LjcxODA3MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xNi44Mzk0MjUnIHk9Jy00Ni43MTgwNzInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTIuMjQyNzEnIHk9Jy00Ni43MTgwNzInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctOS45NDQzNTInIHk9Jy00Ni43MTgwNzInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctLjc1MDkyMicgeT0nLTQ2LjcxODA3MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzMuODQ1NzkzJyB5PSctNDYuNzE4MDcyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nOC40NDI1MDcnIHk9Jy00Ni43MTgwNzInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNzIuMDAwMDA0JyB5PSctNDQuNDE5NzE1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTYyLjgwNjU3NCcgeT0nLTQ0LjQxOTcxNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02MC41MDgyMTcnIHk9Jy00NC40MTk3MTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTguMjA5ODU5JyB5PSctNDQuNDE5NzE1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUzLjYxMzE0NCcgeT0nLTQ0LjQxOTcxNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01MS4zMTQ3ODcnIHk9Jy00NC40MTk3MTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDQuNDE5NzE1JyB5PSctNDQuNDE5NzE1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQyLjEyMTM1NycgeT0nLTQ0LjQxOTcxNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zOS44MjMnIHk9Jy00NC40MTk3MTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzcuNTI0NjQyJyB5PSctNDQuNDE5NzE1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM1LjIyNjI4NScgeT0nLTQ0LjQxOTcxNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zMi45Mjc5MjcnIHk9Jy00NC40MTk3MTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTYuODM5NDI1JyB5PSctNDQuNDE5NzE1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE0LjU0MTA2NycgeT0nLTQ0LjQxOTcxNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy05Ljk0NDM1MicgeT0nLTQ0LjQxOTcxNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zLjA0OTI4JyB5PSctNDQuNDE5NzE1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLS43NTA5MjInIHk9Jy00NC40MTk3MTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PScxLjU0NzQzNScgeT0nLTQ0LjQxOTcxNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzMuODQ1NzkzJyB5PSctNDQuNDE5NzE1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nNi4xNDQxNScgeT0nLTQ0LjQxOTcxNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEwLjc0MDg2NScgeT0nLTQ0LjQxOTcxNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy00Mi4xMjEzNTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjcuNDAzMjg5JyB5PSctNDIuMTIxMzU3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY1LjEwNDkzMicgeT0nLTQyLjEyMTM1NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Mi44MDY1NzQnIHk9Jy00Mi4xMjEzNTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTEuMzE0Nzg3JyB5PSctNDIuMTIxMzU3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ5LjAxNjQyOScgeT0nLTQyLjEyMTM1NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zMC42Mjk1NycgeT0nLTQyLjEyMTM1NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yOC4zMzEyMTInIHk9Jy00Mi4xMjEzNTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjYuMDMyODU1JyB5PSctNDIuMTIxMzU3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE5LjEzNzc4MicgeT0nLTQyLjEyMTM1NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xMi4yNDI3MScgeT0nLTQyLjEyMTM1NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03LjY0NTk5NScgeT0nLTQyLjEyMTM1NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01LjM0NzYzNycgeT0nLTQyLjEyMTM1NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzYuMTQ0MTUnIHk9Jy00Mi4xMjEzNTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc4LjQ0MjUwNycgeT0nLTQyLjEyMTM1NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Mi44MDY1NzQnIHk9Jy0zOS44MjMnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTguMjA5ODU5JyB5PSctMzkuODIzJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ2LjcxODA3MicgeT0nLTM5LjgyMycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00NC40MTk3MTUnIHk9Jy0zOS44MjMnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDIuMTIxMzU3JyB5PSctMzkuODIzJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM5LjgyMycgeT0nLTM5LjgyMycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNy41MjQ2NDInIHk9Jy0zOS44MjMnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzUuMjI2Mjg1JyB5PSctMzkuODIzJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTIxLjQzNjE0JyB5PSctMzkuODIzJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE2LjgzOTQyNScgeT0nLTM5LjgyMycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy05Ljk0NDM1MicgeT0nLTM5LjgyMycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zLjA0OTI4JyB5PSctMzkuODIzJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLS43NTA5MjInIHk9Jy0zOS44MjMnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc2LjE0NDE1JyB5PSctMzkuODIzJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nOC40NDI1MDcnIHk9Jy0zOS44MjMnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PScxMC43NDA4NjUnIHk9Jy0zOS44MjMnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjcuNDAzMjg5JyB5PSctMzcuNTI0NjQyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY1LjEwNDkzMicgeT0nLTM3LjUyNDY0MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00Ni43MTgwNzInIHk9Jy0zNy41MjQ2NDInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzUuMjI2Mjg1JyB5PSctMzcuNTI0NjQyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTIzLjczNDQ5NycgeT0nLTM3LjUyNDY0MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yMS40MzYxNCcgeT0nLTM3LjUyNDY0MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xNi44Mzk0MjUnIHk9Jy0zNy41MjQ2NDInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNy42NDU5OTUnIHk9Jy0zNy41MjQ2NDInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctLjc1MDkyMicgeT0nLTM3LjUyNDY0MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEuNTQ3NDM1JyB5PSctMzcuNTI0NjQyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMy44NDU3OTMnIHk9Jy0zNy41MjQ2NDInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PScxMC43NDA4NjUnIHk9Jy0zNy41MjQ2NDInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNzIuMDAwMDA0JyB5PSctMzUuMjI2Mjg1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY5LjcwMTY0NycgeT0nLTM1LjIyNjI4NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Ny40MDMyODknIHk9Jy0zNS4yMjYyODUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjUuMTA0OTMyJyB5PSctMzUuMjI2Mjg1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTYyLjgwNjU3NCcgeT0nLTM1LjIyNjI4NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02MC41MDgyMTcnIHk9Jy0zNS4yMjYyODUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTguMjA5ODU5JyB5PSctMzUuMjI2Mjg1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTU1LjkxMTUwMicgeT0nLTM1LjIyNjI4NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01MS4zMTQ3ODcnIHk9Jy0zNS4yMjYyODUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDkuMDE2NDI5JyB5PSctMzUuMjI2Mjg1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ2LjcxODA3MicgeT0nLTM1LjIyNjI4NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNy41MjQ2NDInIHk9Jy0zNS4yMjYyODUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzUuMjI2Mjg1JyB5PSctMzUuMjI2Mjg1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMyLjkyNzkyNycgeT0nLTM1LjIyNjI4NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zMC42Mjk1NycgeT0nLTM1LjIyNjI4NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yOC4zMzEyMTInIHk9Jy0zNS4yMjYyODUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjYuMDMyODU1JyB5PSctMzUuMjI2Mjg1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE0LjU0MTA2NycgeT0nLTM1LjIyNjI4NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xMi4yNDI3MScgeT0nLTM1LjIyNjI4NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy05Ljk0NDM1MicgeT0nLTM1LjIyNjI4NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03LjY0NTk5NScgeT0nLTM1LjIyNjI4NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01LjM0NzYzNycgeT0nLTM1LjIyNjI4NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zLjA0OTI4JyB5PSctMzUuMjI2Mjg1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMS41NDc0MzUnIHk9Jy0zNS4yMjYyODUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSczLjg0NTc5MycgeT0nLTM1LjIyNjI4NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzYuMTQ0MTUnIHk9Jy0zNS4yMjYyODUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PScxMC43NDA4NjUnIHk9Jy0zNS4yMjYyODUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjcuNDAzMjg5JyB5PSctMzIuOTI3OTI3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY1LjEwNDkzMicgeT0nLTMyLjkyNzkyNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Mi44MDY1NzQnIHk9Jy0zMi45Mjc5MjcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjAuNTA4MjE3JyB5PSctMzIuOTI3OTI3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTU1LjkxMTUwMicgeT0nLTMyLjkyNzkyNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01My42MTMxNDQnIHk9Jy0zMi45Mjc5MjcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDQuNDE5NzE1JyB5PSctMzIuOTI3OTI3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQyLjEyMTM1NycgeT0nLTMyLjkyNzkyNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zMi45Mjc5MjcnIHk9Jy0zMi45Mjc5MjcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzAuNjI5NTcnIHk9Jy0zMi45Mjc5MjcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjguMzMxMjEyJyB5PSctMzIuOTI3OTI3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTIzLjczNDQ5NycgeT0nLTMyLjkyNzkyNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yMS40MzYxNCcgeT0nLTMyLjkyNzkyNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xOS4xMzc3ODInIHk9Jy0zMi45Mjc5MjcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc2LjE0NDE1JyB5PSctMzIuOTI3OTI3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nOC40NDI1MDcnIHk9Jy0zMi45Mjc5MjcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjcuNDAzMjg5JyB5PSctMzAuNjI5NTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTguMjA5ODU5JyB5PSctMzAuNjI5NTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTUuOTExNTAyJyB5PSctMzAuNjI5NTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTMuNjEzMTQ0JyB5PSctMzAuNjI5NTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDIuMTIxMzU3JyB5PSctMzAuNjI5NTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzkuODIzJyB5PSctMzAuNjI5NTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzcuNTI0NjQyJyB5PSctMzAuNjI5NTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjYuMDMyODU1JyB5PSctMzAuNjI5NTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjEuNDM2MTQnIHk9Jy0zMC42Mjk1NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xMi4yNDI3MScgeT0nLTMwLjYyOTU3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTkuOTQ0MzUyJyB5PSctMzAuNjI5NTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNy42NDU5OTUnIHk9Jy0zMC42Mjk1NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01LjM0NzYzNycgeT0nLTMwLjYyOTU3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMuMDQ5MjgnIHk9Jy0zMC42Mjk1NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzYuMTQ0MTUnIHk9Jy0zMC42Mjk1NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzguNDQyNTA3JyB5PSctMzAuNjI5NTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PScxMC43NDA4NjUnIHk9Jy0zMC42Mjk1NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy0yOC4zMzEyMTInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjcuNDAzMjg5JyB5PSctMjguMzMxMjEyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTYyLjgwNjU3NCcgeT0nLTI4LjMzMTIxMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02MC41MDgyMTcnIHk9Jy0yOC4zMzEyMTInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTMuNjEzMTQ0JyB5PSctMjguMzMxMjEyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUxLjMxNDc4NycgeT0nLTI4LjMzMTIxMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00NC40MTk3MTUnIHk9Jy0yOC4zMzEyMTInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDIuMTIxMzU3JyB5PSctMjguMzMxMjEyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM3LjUyNDY0MicgeT0nLTI4LjMzMTIxMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNS4yMjYyODUnIHk9Jy0yOC4zMzEyMTInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjguMzMxMjEyJyB5PSctMjguMzMxMjEyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTI2LjAzMjg1NScgeT0nLTI4LjMzMTIxMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yMy43MzQ0OTcnIHk9Jy0yOC4zMzEyMTInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctOS45NDQzNTInIHk9Jy0yOC4zMzEyMTInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctLjc1MDkyMicgeT0nLTI4LjMzMTIxMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEwLjc0MDg2NScgeT0nLTI4LjMzMTIxMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy0yNi4wMzI4NTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjkuNzAxNjQ3JyB5PSctMjYuMDMyODU1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY1LjEwNDkzMicgeT0nLTI2LjAzMjg1NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01OC4yMDk4NTknIHk9Jy0yNi4wMzI4NTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTMuNjEzMTQ0JyB5PSctMjYuMDMyODU1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUxLjMxNDc4NycgeT0nLTI2LjAzMjg1NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00OS4wMTY0MjknIHk9Jy0yNi4wMzI4NTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDQuNDE5NzE1JyB5PSctMjYuMDMyODU1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM5LjgyMycgeT0nLTI2LjAzMjg1NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNy41MjQ2NDInIHk9Jy0yNi4wMzI4NTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzIuOTI3OTI3JyB5PSctMjYuMDMyODU1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMwLjYyOTU3JyB5PSctMjYuMDMyODU1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTI2LjAzMjg1NScgeT0nLTI2LjAzMjg1NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xOS4xMzc3ODInIHk9Jy0yNi4wMzI4NTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTYuODM5NDI1JyB5PSctMjYuMDMyODU1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE0LjU0MTA2NycgeT0nLTI2LjAzMjg1NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03LjY0NTk5NScgeT0nLTI2LjAzMjg1NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zLjA0OTI4JyB5PSctMjYuMDMyODU1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMS41NDc0MzUnIHk9Jy0yNi4wMzI4NTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSczLjg0NTc5MycgeT0nLTI2LjAzMjg1NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzYuMTQ0MTUnIHk9Jy0yNi4wMzI4NTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc4LjQ0MjUwNycgeT0nLTI2LjAzMjg1NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEwLjc0MDg2NScgeT0nLTI2LjAzMjg1NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy0yMy43MzQ0OTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjUuMTA0OTMyJyB5PSctMjMuNzM0NDk3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTYyLjgwNjU3NCcgeT0nLTIzLjczNDQ5NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01NS45MTE1MDInIHk9Jy0yMy43MzQ0OTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTEuMzE0Nzg3JyB5PSctMjMuNzM0NDk3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM1LjIyNjI4NScgeT0nLTIzLjczNDQ5NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zMi45Mjc5MjcnIHk9Jy0yMy43MzQ0OTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjguMzMxMjEyJyB5PSctMjMuNzM0NDk3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTIzLjczNDQ5NycgeT0nLTIzLjczNDQ5NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yMS40MzYxNCcgeT0nLTIzLjczNDQ5NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xOS4xMzc3ODInIHk9Jy0yMy43MzQ0OTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTIuMjQyNzEnIHk9Jy0yMy43MzQ0OTcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctLjc1MDkyMicgeT0nLTIzLjczNDQ5NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzguNDQyNTA3JyB5PSctMjMuNzM0NDk3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLTIxLjQzNjE0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY5LjcwMTY0NycgeT0nLTIxLjQzNjE0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTYyLjgwNjU3NCcgeT0nLTIxLjQzNjE0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTU4LjIwOTg1OScgeT0nLTIxLjQzNjE0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTU1LjkxMTUwMicgeT0nLTIxLjQzNjE0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUzLjYxMzE0NCcgeT0nLTIxLjQzNjE0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ2LjcxODA3MicgeT0nLTIxLjQzNjE0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ0LjQxOTcxNScgeT0nLTIxLjQzNjE0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM3LjUyNDY0MicgeT0nLTIxLjQzNjE0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMwLjYyOTU3JyB5PSctMjEuNDM2MTQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjYuMDMyODU1JyB5PSctMjEuNDM2MTQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjMuNzM0NDk3JyB5PSctMjEuNDM2MTQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjEuNDM2MTQnIHk9Jy0yMS40MzYxNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xNi44Mzk0MjUnIHk9Jy0yMS40MzYxNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xNC41NDEwNjcnIHk9Jy0yMS40MzYxNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy05Ljk0NDM1MicgeT0nLTIxLjQzNjE0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcuNjQ1OTk1JyB5PSctMjEuNDM2MTQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNS4zNDc2MzcnIHk9Jy0yMS40MzYxNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0uNzUwOTIyJyB5PSctMjEuNDM2MTQnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSczLjg0NTc5MycgeT0nLTIxLjQzNjE0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nOC40NDI1MDcnIHk9Jy0yMS40MzYxNCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEwLjc0MDg2NScgeT0nLTIxLjQzNjE0JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLTE5LjEzNzc4MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02OS43MDE2NDcnIHk9Jy0xOS4xMzc3ODInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjUuMTA0OTMyJyB5PSctMTkuMTM3NzgyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTYyLjgwNjU3NCcgeT0nLTE5LjEzNzc4MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02MC41MDgyMTcnIHk9Jy0xOS4xMzc3ODInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTMuNjEzMTQ0JyB5PSctMTkuMTM3NzgyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ2LjcxODA3MicgeT0nLTE5LjEzNzc4MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zOS44MjMnIHk9Jy0xOS4xMzc3ODInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzAuNjI5NTcnIHk9Jy0xOS4xMzc3ODInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjYuMDMyODU1JyB5PSctMTkuMTM3NzgyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTIzLjczNDQ5NycgeT0nLTE5LjEzNzc4MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xOS4xMzc3ODInIHk9Jy0xOS4xMzc3ODInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTIuMjQyNzEnIHk9Jy0xOS4xMzc3ODInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctOS45NDQzNTInIHk9Jy0xOS4xMzc3ODInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNy42NDU5OTUnIHk9Jy0xOS4xMzc3ODInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNS4zNDc2MzcnIHk9Jy0xOS4xMzc3ODInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMy4wNDkyOCcgeT0nLTE5LjEzNzc4MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEuNTQ3NDM1JyB5PSctMTkuMTM3NzgyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMTAuNzQwODY1JyB5PSctMTkuMTM3NzgyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY5LjcwMTY0NycgeT0nLTE2LjgzOTQyNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01OC4yMDk4NTknIHk9Jy0xNi44Mzk0MjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTUuOTExNTAyJyB5PSctMTYuODM5NDI1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUxLjMxNDc4NycgeT0nLTE2LjgzOTQyNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00OS4wMTY0MjknIHk9Jy0xNi44Mzk0MjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDYuNzE4MDcyJyB5PSctMTYuODM5NDI1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM3LjUyNDY0MicgeT0nLTE2LjgzOTQyNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNS4yMjYyODUnIHk9Jy0xNi44Mzk0MjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzIuOTI3OTI3JyB5PSctMTYuODM5NDI1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMwLjYyOTU3JyB5PSctMTYuODM5NDI1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTI4LjMzMTIxMicgeT0nLTE2LjgzOTQyNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yMS40MzYxNCcgeT0nLTE2LjgzOTQyNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xOS4xMzc3ODInIHk9Jy0xNi44Mzk0MjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTYuODM5NDI1JyB5PSctMTYuODM5NDI1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE0LjU0MTA2NycgeT0nLTE2LjgzOTQyNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zLjA0OTI4JyB5PSctMTYuODM5NDI1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLS43NTA5MjInIHk9Jy0xNi44Mzk0MjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PScxLjU0NzQzNScgeT0nLTE2LjgzOTQyNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzMuODQ1NzkzJyB5PSctMTYuODM5NDI1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nNi4xNDQxNScgeT0nLTE2LjgzOTQyNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzguNDQyNTA3JyB5PSctMTYuODM5NDI1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMTAuNzQwODY1JyB5PSctMTYuODM5NDI1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLTE0LjU0MTA2NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02OS43MDE2NDcnIHk9Jy0xNC41NDEwNjcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjcuNDAzMjg5JyB5PSctMTQuNTQxMDY3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY1LjEwNDkzMicgeT0nLTE0LjU0MTA2NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Mi44MDY1NzQnIHk9Jy0xNC41NDEwNjcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjAuNTA4MjE3JyB5PSctMTQuNTQxMDY3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTU1LjkxMTUwMicgeT0nLTE0LjU0MTA2NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01My42MTMxNDQnIHk9Jy0xNC41NDEwNjcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTEuMzE0Nzg3JyB5PSctMTQuNTQxMDY3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ5LjAxNjQyOScgeT0nLTE0LjU0MTA2NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00NC40MTk3MTUnIHk9Jy0xNC41NDEwNjcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDIuMTIxMzU3JyB5PSctMTQuNTQxMDY3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM5LjgyMycgeT0nLTE0LjU0MTA2NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yOC4zMzEyMTInIHk9Jy0xNC41NDEwNjcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjMuNzM0NDk3JyB5PSctMTQuNTQxMDY3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE5LjEzNzc4MicgeT0nLTE0LjU0MTA2NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xNi44Mzk0MjUnIHk9Jy0xNC41NDEwNjcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTIuMjQyNzEnIHk9Jy0xNC41NDEwNjcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNS4zNDc2MzcnIHk9Jy0xNC41NDEwNjcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSczLjg0NTc5MycgeT0nLTE0LjU0MTA2NycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzguNDQyNTA3JyB5PSctMTQuNTQxMDY3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLTEyLjI0MjcxJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY1LjEwNDkzMicgeT0nLTEyLjI0MjcxJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTU4LjIwOTg1OScgeT0nLTEyLjI0MjcxJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTU1LjkxMTUwMicgeT0nLTEyLjI0MjcxJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUzLjYxMzE0NCcgeT0nLTEyLjI0MjcxJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUxLjMxNDc4NycgeT0nLTEyLjI0MjcxJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ5LjAxNjQyOScgeT0nLTEyLjI0MjcxJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQyLjEyMTM1NycgeT0nLTEyLjI0MjcxJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM5LjgyMycgeT0nLTEyLjI0MjcxJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM3LjUyNDY0MicgeT0nLTEyLjI0MjcxJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMyLjkyNzkyNycgeT0nLTEyLjI0MjcxJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTIxLjQzNjE0JyB5PSctMTIuMjQyNzEnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTYuODM5NDI1JyB5PSctMTIuMjQyNzEnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctOS45NDQzNTInIHk9Jy0xMi4yNDI3MScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03LjY0NTk5NScgeT0nLTEyLjI0MjcxJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUuMzQ3NjM3JyB5PSctMTIuMjQyNzEnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMy4wNDkyOCcgeT0nLTEyLjI0MjcxJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMS41NDc0MzUnIHk9Jy0xMi4yNDI3MScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzYuMTQ0MTUnIHk9Jy0xMi4yNDI3MScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzguNDQyNTA3JyB5PSctMTIuMjQyNzEnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PScxMC43NDA4NjUnIHk9Jy0xMi4yNDI3MScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy05Ljk0NDM1MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Ny40MDMyODknIHk9Jy05Ljk0NDM1MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Mi44MDY1NzQnIHk9Jy05Ljk0NDM1MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01MS4zMTQ3ODcnIHk9Jy05Ljk0NDM1MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00NC40MTk3MTUnIHk9Jy05Ljk0NDM1MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00Mi4xMjEzNTcnIHk9Jy05Ljk0NDM1MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNy41MjQ2NDInIHk9Jy05Ljk0NDM1MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zMC42Mjk1NycgeT0nLTkuOTQ0MzUyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTI4LjMzMTIxMicgeT0nLTkuOTQ0MzUyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTI2LjAzMjg1NScgeT0nLTkuOTQ0MzUyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTIzLjczNDQ5NycgeT0nLTkuOTQ0MzUyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTkuOTQ0MzUyJyB5PSctOS45NDQzNTInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNS4zNDc2MzcnIHk9Jy05Ljk0NDM1MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zLjA0OTI4JyB5PSctOS45NDQzNTInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PScxMC43NDA4NjUnIHk9Jy05Ljk0NDM1MicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9Jy03LjY0NTk5NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Ny40MDMyODknIHk9Jy03LjY0NTk5NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Mi44MDY1NzQnIHk9Jy03LjY0NTk5NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01OC4yMDk4NTknIHk9Jy03LjY0NTk5NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01NS45MTE1MDInIHk9Jy03LjY0NTk5NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01MS4zMTQ3ODcnIHk9Jy03LjY0NTk5NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00NC40MTk3MTUnIHk9Jy03LjY0NTk5NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zOS44MjMnIHk9Jy03LjY0NTk5NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNS4yMjYyODUnIHk9Jy03LjY0NTk5NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zMi45Mjc5MjcnIHk9Jy03LjY0NTk5NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zMC42Mjk1NycgeT0nLTcuNjQ1OTk1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTI2LjAzMjg1NScgeT0nLTcuNjQ1OTk1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE0LjU0MTA2NycgeT0nLTcuNjQ1OTk1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcuNjQ1OTk1JyB5PSctNy42NDU5OTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNS4zNDc2MzcnIHk9Jy03LjY0NTk5NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zLjA0OTI4JyB5PSctNy42NDU5OTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctLjc1MDkyMicgeT0nLTcuNjQ1OTk1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMS41NDc0MzUnIHk9Jy03LjY0NTk5NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzMuODQ1NzkzJyB5PSctNy42NDU5OTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc2LjE0NDE1JyB5PSctNy42NDU5OTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTMuNjEzMTQ0JyB5PSctNS4zNDc2MzcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjguMzMxMjEyJyB5PSctNS4zNDc2MzcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjMuNzM0NDk3JyB5PSctNS4zNDc2MzcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjEuNDM2MTQnIHk9Jy01LjM0NzYzNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xOS4xMzc3ODInIHk9Jy01LjM0NzYzNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xNi44Mzk0MjUnIHk9Jy01LjM0NzYzNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xMi4yNDI3MScgeT0nLTUuMzQ3NjM3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcuNjQ1OTk1JyB5PSctNS4zNDc2MzcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PScxLjU0NzQzNScgeT0nLTUuMzQ3NjM3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcyLjAwMDAwNCcgeT0nLTMuMDQ5MjgnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjkuNzAxNjQ3JyB5PSctMy4wNDkyOCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Ny40MDMyODknIHk9Jy0zLjA0OTI4JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY1LjEwNDkzMicgeT0nLTMuMDQ5MjgnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjIuODA2NTc0JyB5PSctMy4wNDkyOCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02MC41MDgyMTcnIHk9Jy0zLjA0OTI4JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTU4LjIwOTg1OScgeT0nLTMuMDQ5MjgnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTMuNjEzMTQ0JyB5PSctMy4wNDkyOCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00Ni43MTgwNzInIHk9Jy0zLjA0OTI4JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ0LjQxOTcxNScgeT0nLTMuMDQ5MjgnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzcuNTI0NjQyJyB5PSctMy4wNDkyOCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNS4yMjYyODUnIHk9Jy0zLjA0OTI4JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMwLjYyOTU3JyB5PSctMy4wNDkyOCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yNi4wMzI4NTUnIHk9Jy0zLjA0OTI4JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTIxLjQzNjE0JyB5PSctMy4wNDkyOCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xNi44Mzk0MjUnIHk9Jy0zLjA0OTI4JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE0LjU0MTA2NycgeT0nLTMuMDQ5MjgnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTIuMjQyNzEnIHk9Jy0zLjA0OTI4JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcuNjQ1OTk1JyB5PSctMy4wNDkyOCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zLjA0OTI4JyB5PSctMy4wNDkyOCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEuNTQ3NDM1JyB5PSctMy4wNDkyOCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzguNDQyNTA3JyB5PSctMy4wNDkyOCcgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEwLjc0MDg2NScgeT0nLTMuMDQ5MjgnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNzIuMDAwMDA0JyB5PSctLjc1MDkyMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01OC4yMDk4NTknIHk9Jy0uNzUwOTIyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ5LjAxNjQyOScgeT0nLS43NTA5MjInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDYuNzE4MDcyJyB5PSctLjc1MDkyMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zOS44MjMnIHk9Jy0uNzUwOTIyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM3LjUyNDY0MicgeT0nLS43NTA5MjInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjMuNzM0NDk3JyB5PSctLjc1MDkyMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yMS40MzYxNCcgeT0nLS43NTA5MjInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTYuODM5NDI1JyB5PSctLjc1MDkyMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xMi4yNDI3MScgeT0nLS43NTA5MjInIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctOS45NDQzNTInIHk9Jy0uNzUwOTIyJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcuNjQ1OTk1JyB5PSctLjc1MDkyMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEuNTQ3NDM1JyB5PSctLjc1MDkyMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzMuODQ1NzkzJyB5PSctLjc1MDkyMicgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9JzEuNTQ3NDM1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY3LjQwMzI4OScgeT0nMS41NDc0MzUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjUuMTA0OTMyJyB5PScxLjU0NzQzNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Mi44MDY1NzQnIHk9JzEuNTQ3NDM1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTU4LjIwOTg1OScgeT0nMS41NDc0MzUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTMuNjEzMTQ0JyB5PScxLjU0NzQzNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00OS4wMTY0MjknIHk9JzEuNTQ3NDM1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ2LjcxODA3MicgeT0nMS41NDc0MzUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzcuNTI0NjQyJyB5PScxLjU0NzQzNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zMi45Mjc5MjcnIHk9JzEuNTQ3NDM1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMwLjYyOTU3JyB5PScxLjU0NzQzNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yNi4wMzI4NTUnIHk9JzEuNTQ3NDM1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTIxLjQzNjE0JyB5PScxLjU0NzQzNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xOS4xMzc3ODInIHk9JzEuNTQ3NDM1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE0LjU0MTA2NycgeT0nMS41NDc0MzUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctOS45NDQzNTInIHk9JzEuNTQ3NDM1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTcuNjQ1OTk1JyB5PScxLjU0NzQzNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01LjM0NzYzNycgeT0nMS41NDc0MzUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMy4wNDkyOCcgeT0nMS41NDc0MzUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctLjc1MDkyMicgeT0nMS41NDc0MzUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PScxLjU0NzQzNScgeT0nMS41NDc0MzUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc2LjE0NDE1JyB5PScxLjU0NzQzNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9JzMuODQ1NzkzJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY3LjQwMzI4OScgeT0nMy44NDU3OTMnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjUuMTA0OTMyJyB5PSczLjg0NTc5MycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Mi44MDY1NzQnIHk9JzMuODQ1NzkzJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTU4LjIwOTg1OScgeT0nMy44NDU3OTMnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTMuNjEzMTQ0JyB5PSczLjg0NTc5MycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00OS4wMTY0MjknIHk9JzMuODQ1NzkzJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ0LjQxOTcxNScgeT0nMy44NDU3OTMnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDIuMTIxMzU3JyB5PSczLjg0NTc5MycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zOS44MjMnIHk9JzMuODQ1NzkzJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM1LjIyNjI4NScgeT0nMy44NDU3OTMnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzIuOTI3OTI3JyB5PSczLjg0NTc5MycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yOC4zMzEyMTInIHk9JzMuODQ1NzkzJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTIzLjczNDQ5NycgeT0nMy44NDU3OTMnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMTkuMTM3NzgyJyB5PSczLjg0NTc5MycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xNi44Mzk0MjUnIHk9JzMuODQ1NzkzJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTEyLjI0MjcxJyB5PSczLjg0NTc5MycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy05Ljk0NDM1MicgeT0nMy44NDU3OTMnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNS4zNDc2MzcnIHk9JzMuODQ1NzkzJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMuMDQ5MjgnIHk9JzMuODQ1NzkzJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMS41NDc0MzUnIHk9JzMuODQ1NzkzJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nOC40NDI1MDcnIHk9JzMuODQ1NzkzJyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMTAuNzQwODY1JyB5PSczLjg0NTc5MycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9JzYuMTQ0MTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjcuNDAzMjg5JyB5PSc2LjE0NDE1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTY1LjEwNDkzMicgeT0nNi4xNDQxNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy02Mi44MDY1NzQnIHk9JzYuMTQ0MTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTguMjA5ODU5JyB5PSc2LjE0NDE1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUzLjYxMzE0NCcgeT0nNi4xNDQxNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy01MS4zMTQ3ODcnIHk9JzYuMTQ0MTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDIuMTIxMzU3JyB5PSc2LjE0NDE1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM5LjgyMycgeT0nNi4xNDQxNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNy41MjQ2NDInIHk9JzYuMTQ0MTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzUuMjI2Mjg1JyB5PSc2LjE0NDE1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTMwLjYyOTU3JyB5PSc2LjE0NDE1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTI2LjAzMjg1NScgeT0nNi4xNDQxNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xNi44Mzk0MjUnIHk9JzYuMTQ0MTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctLjc1MDkyMicgeT0nNi4xNDQxNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzYuMTQ0MTUnIHk9JzYuMTQ0MTUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc4LjQ0MjUwNycgeT0nNi4xNDQxNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEwLjc0MDg2NScgeT0nNi4xNDQxNScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy03Mi4wMDAwMDQnIHk9JzguNDQyNTA3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTU4LjIwOTg1OScgeT0nOC40NDI1MDcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTMuNjEzMTQ0JyB5PSc4LjQ0MjUwNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy00OS4wMTY0MjknIHk9JzguNDQyNTA3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTQ0LjQxOTcxNScgeT0nOC40NDI1MDcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDIuMTIxMzU3JyB5PSc4LjQ0MjUwNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zNy41MjQ2NDInIHk9JzguNDQyNTA3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTM1LjIyNjI4NScgeT0nOC40NDI1MDcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMjYuMDMyODU1JyB5PSc4LjQ0MjUwNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yMy43MzQ0OTcnIHk9JzguNDQyNTA3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTIxLjQzNjE0JyB5PSc4LjQ0MjUwNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xOS4xMzc3ODInIHk9JzguNDQyNTA3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTE2LjgzOTQyNScgeT0nOC40NDI1MDcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNy42NDU5OTUnIHk9JzguNDQyNTA3JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTUuMzQ3NjM3JyB5PSc4LjQ0MjUwNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0zLjA0OTI4JyB5PSc4LjQ0MjUwNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEuNTQ3NDM1JyB5PSc4LjQ0MjUwNycgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzEwLjc0MDg2NScgeT0nOC40NDI1MDcnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNzIuMDAwMDA0JyB5PScxMC43NDA4NjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjkuNzAxNjQ3JyB5PScxMC43NDA4NjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjcuNDAzMjg5JyB5PScxMC43NDA4NjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjUuMTA0OTMyJyB5PScxMC43NDA4NjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjIuODA2NTc0JyB5PScxMC43NDA4NjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNjAuNTA4MjE3JyB5PScxMC43NDA4NjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTguMjA5ODU5JyB5PScxMC43NDA4NjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTMuNjEzMTQ0JyB5PScxMC43NDA4NjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNTEuMzE0Nzg3JyB5PScxMC43NDA4NjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctNDQuNDE5NzE1JyB5PScxMC43NDA4NjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzkuODIzJyB5PScxMC43NDA4NjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzIuOTI3OTI3JyB5PScxMC43NDA4NjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMzAuNjI5NTcnIHk9JzEwLjc0MDg2NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0yNi4wMzI4NTUnIHk9JzEwLjc0MDg2NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xNi44Mzk0MjUnIHk9JzEwLjc0MDg2NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xNC41NDEwNjcnIHk9JzEwLjc0MDg2NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9Jy0xMi4yNDI3MScgeT0nMTAuNzQwODY1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLTkuOTQ0MzUyJyB5PScxMC43NDA4NjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSctMy4wNDkyOCcgeT0nMTAuNzQwODY1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nLS43NTA5MjInIHk9JzEwLjc0MDg2NScgaGVpZ2h0PScyLjI5ODM1Nycgd2lkdGg9JzIuMjk4MzU3Jy8+CjxyZWN0IHg9JzMuODQ1NzkzJyB5PScxMC43NDA4NjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc2LjE0NDE1JyB5PScxMC43NDA4NjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8cmVjdCB4PSc4LjQ0MjUwNycgeT0nMTAuNzQwODY1JyBoZWlnaHQ9JzIuMjk4MzU3JyB3aWR0aD0nMi4yOTgzNTcnLz4KPHJlY3QgeD0nMTAuNzQwODY1JyB5PScxMC43NDA4NjUnIGhlaWdodD0nMi4yOTgzNTcnIHdpZHRoPScyLjI5ODM1NycvPgo8L2c+Cjwvc3ZnPg==")} +}