summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJulianCamacho <jjulian.341@gmail.com>2022-11-17 08:16:14 -0600
committerJulianCamacho <jjulian.341@gmail.com>2022-11-17 08:16:14 -0600
commit61bf2100fbd5e0a5f4bd1f013d70d8027604bbba (patch)
treef8dda309768c57d3cbce052baf7b094ff996374a
parent268512c3f2c67bb72f0dab45b8112313fd585e2c (diff)
Bug fixes
Diffstat (limited to '')
-rw-r--r--app/descifrador.s65
-rw-r--r--conspiracion.qsf9
-rw-r--r--doc/block_diagram.drawio120
-rw-r--r--hps/fpga.kermit2
-rw-r--r--image_processing/out_file1
-rw-r--r--nix/flake.nix2
-rw-r--r--platform.qsys98
-rw-r--r--rtl/top/conspiracion.sv14
-rw-r--r--tb/platform.sv2
-rw-r--r--tb/sim/blank.S13
-rw-r--r--tb/sim/blank.py2
-rw-r--r--tb/sim/descifrador.S72
-rw-r--r--tb/sim/descifrador.py2
13 files changed, 294 insertions, 108 deletions
diff --git a/app/descifrador.s b/app/descifrador.s
deleted file mode 100644
index bb10e87..0000000
--- a/app/descifrador.s
+++ /dev/null
@@ -1,65 +0,0 @@
-.global reset
-reset:
-
-@ IO utilizado:
-@ 5 switches para la llave
-@ 1 switch de selección de algoritmo (xor o not)
-@ 1 botón de inicio
-
-.equ START_BUTTON, 0x30050000 @ Dirección de memoria del botón
-.equ KEY_SWITCHES, 0x30060000 @ Dirección de memoria de los switches
-.equ START, 0x00010000 @ Dirección de memoria de los pixeles
-
-@ Dirección inicial de lectura, contador y tamaño de la imagen
-ldr r1, =START
-mov r7, #0x0
-ldr r8, =307200
-
-@Esperar botón
-ldr r2, =START_BUTTON
-ldr r3, =KEY_SWITCHES
-
-
-idle:
- ldr r5, [r2] @ Lee valor del botón
- ldr r6, [r3] @ Lee valores de los switches
- cmp r5, #1 @ Si el botón de inicio es 1, se salta a start
- bne idle
-
-@ Verificar el algoritmo seleccionado
- and r10, r6, #1 @ Bit mask para seleccionar el primer bit de los switches
- cmp r10, #1 @ Si el valor es 1, se salta a not, si es 0 a xor
- beq not
- cmp r10, #0
- beq xor
-
-
-@ Recorrer la memoria desde START y hacer not al valor en cada posicion
-@ y volverlo a guardar
-not:
- @Procesar la mask
- mov r9, #0b11111111 @Hacer mask de 1s
- mov r0, r9, lsl #8
- orr r0, r0, r9, lsl #16
- orr r0, r0, r9, lsl #24
- b loop
-
-xor:
-@Procesar la llave
- lsr r9, r6, #1
- mov r0, r9, lsl #8
- orr r0, r0, r9, lsl #16
- orr r0, r0, r9, lsl #24
-
-loop:
- ldr r4, [r1] @ Guarda en r4 el dato en la posición de memoria de start
- eor r4, r4, r0 @ Hace XOR entre r4 y 46
- str r4, [r1] @ Vuelve a guardar en memoria ya modificado
- add r1, r1, #4 @ Incrementa el valor de r4, para ir al siguiente pixel
- add r7, r7, #1 @ Incrementa contador de tamaño de la imagen
- cmp r7, r8 @ Compara contador con tamaño de la imagen 640 * 480
- bne loop
- b halt
-
-halt:
- b halt \ No newline at end of file
diff --git a/conspiracion.qsf b/conspiracion.qsf
index d4e404a..c6252b9 100644
--- a/conspiracion.qsf
+++ b/conspiracion.qsf
@@ -120,6 +120,15 @@ set_location_assignment PIN_W19 -to pio_leds[5]
set_location_assignment PIN_Y19 -to pio_leds[6]
set_location_assignment PIN_W20 -to pio_leds[7]
+set_location_assignment PIN_AA14 -to pio_buttons
+
+set_location_assignment PIN_AD11 -to pio_switches[0]
+set_location_assignment PIN_AD12 -to pio_switches[1]
+set_location_assignment PIN_AE11 -to pio_switches[2]
+set_location_assignment PIN_AC9 -to pio_switches[3]
+set_location_assignment PIN_AD10 -to pio_switches[4]
+set_location_assignment PIN_AE12 -to pio_switches[5]
+
set_location_assignment PIN_A11 -to vga_dac_clk
set_location_assignment PIN_B11 -to vga_dac_hsync
set_location_assignment PIN_D11 -to vga_dac_vsync
diff --git a/doc/block_diagram.drawio b/doc/block_diagram.drawio
index a8366a9..a17e16e 100644
--- a/doc/block_diagram.drawio
+++ b/doc/block_diagram.drawio
@@ -1,6 +1,6 @@
<mxfile host="65bd71144e">
<diagram id="rbUwAMRFyLn30EeSbVYh" name="Page-1">
- <mxGraphModel dx="1120" dy="581" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="0" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
+ <mxGraphModel dx="988" dy="341" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="0" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0"/>
<mxCell id="1" parent="0"/>
@@ -20,90 +20,126 @@
<mxCell id="183" value="MMU" style="rounded=1;whiteSpace=wrap;html=1;fontSize=8;fillColor=none;" parent="181" vertex="1">
<mxGeometry x="598" y="32.239999999999995" width="76" height="60" as="geometry"/>
</mxCell>
- <mxCell id="197" style="edgeStyle=none;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="181" source="190" target="189">
+ <mxCell id="197" style="edgeStyle=none;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;" parent="181" source="190" target="189" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
- <mxCell id="190" value="FETCH" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="181">
- <mxGeometry x="380" y="34.24000000000001" width="85" height="53" as="geometry"/>
+ <mxCell id="190" value="FETCH" style="rounded=1;whiteSpace=wrap;html=1;" parent="181" vertex="1">
+ <mxGeometry x="470" y="32.24000000000001" width="85" height="53" as="geometry"/>
</mxCell>
- <mxCell id="200" style="edgeStyle=orthogonalEdgeStyle;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="181" source="191" target="192">
+ <mxCell id="200" style="edgeStyle=orthogonalEdgeStyle;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;endArrow=none;endFill=0;" parent="181" source="191" target="192" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
- <mxCell id="206" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;elbow=vertical;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="181" source="191" target="205">
+ <mxCell id="206" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;endArrow=none;endFill=0;elbow=vertical;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="181" source="191" target="205" edge="1">
<mxGeometry relative="1" as="geometry">
- <mxPoint x="206" y="168.24" as="sourcePoint"/>
+ <mxPoint x="296" y="166.24" as="sourcePoint"/>
<Array as="points">
- <mxPoint x="276" y="155"/>
- <mxPoint x="276" y="222"/>
+ <mxPoint x="413" y="153"/>
</Array>
</mxGeometry>
</mxCell>
- <mxCell id="191" value="CONTROL" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="181">
- <mxGeometry x="118" y="128.24" width="85" height="53" as="geometry"/>
+ <mxCell id="218" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.75;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;endArrow=none;endFill=0;strokeColor=default;" edge="1" parent="181" source="191" target="212">
+ <mxGeometry relative="1" as="geometry">
+ <Array as="points">
+ <mxPoint x="272" y="192"/>
+ <mxPoint x="308" y="192"/>
+ </Array>
+ </mxGeometry>
+ </mxCell>
+ <mxCell id="191" value="CONTROL" style="rounded=1;whiteSpace=wrap;html=1;" parent="181" vertex="1">
+ <mxGeometry x="204" y="123.12" width="93" height="59.24" as="geometry"/>
</mxCell>
- <mxCell id="201" style="edgeStyle=orthogonalEdgeStyle;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;endArrow=none;endFill=0;rounded=0;" edge="1" parent="181" source="192">
+ <mxCell id="201" style="edgeStyle=orthogonalEdgeStyle;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;endArrow=none;endFill=0;rounded=0;" parent="181" source="192" edge="1">
<mxGeometry relative="1" as="geometry">
- <mxPoint x="43" y="174.62" as="targetPoint"/>
+ <mxPoint x="133" y="172.62" as="targetPoint"/>
</mxGeometry>
</mxCell>
- <mxCell id="192" value="ALU" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="181">
- <mxGeometry x="119.5" y="232.24" width="82" height="46.76" as="geometry"/>
+ <mxCell id="215" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;entryX=0;entryY=0.25;entryDx=0;entryDy=0;endArrow=none;endFill=0;strokeColor=default;" edge="1" parent="181" source="192" target="212">
+ <mxGeometry relative="1" as="geometry"/>
</mxCell>
- <mxCell id="202" style="edgeStyle=orthogonalEdgeStyle;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;elbow=vertical;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" edge="1" parent="181" source="194" target="191">
+ <mxCell id="192" value="ALU" style="rounded=1;whiteSpace=wrap;html=1;" parent="181" vertex="1">
+ <mxGeometry x="209.5" y="230.24" width="82" height="46.76" as="geometry"/>
+ </mxCell>
+ <mxCell id="202" style="edgeStyle=orthogonalEdgeStyle;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;elbow=vertical;rounded=0;exitX=1;exitY=0.5;exitDx=0;exitDy=0;" parent="181" source="194" target="191" edge="1">
<mxGeometry relative="1" as="geometry">
- <mxPoint x="70" y="154.74" as="sourcePoint"/>
+ <mxPoint x="160" y="152.74" as="sourcePoint"/>
</mxGeometry>
</mxCell>
- <mxCell id="203" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;elbow=vertical;" edge="1" parent="181" source="194" target="195">
+ <mxCell id="203" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;elbow=vertical;" parent="181" source="194" target="195" edge="1">
<mxGeometry relative="1" as="geometry">
- <mxPoint x="43" y="134.86" as="sourcePoint"/>
+ <mxPoint x="133" y="132.86" as="sourcePoint"/>
</mxGeometry>
</mxCell>
- <mxCell id="194" value="PSR" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="181">
- <mxGeometry x="16" y="134.86" width="54" height="39.76" as="geometry"/>
+ <mxCell id="194" value="PSR" style="rounded=1;whiteSpace=wrap;html=1;" parent="181" vertex="1">
+ <mxGeometry x="106" y="132.86" width="54" height="39.76" as="geometry"/>
</mxCell>
- <mxCell id="198" style="edgeStyle=none;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;endArrow=none;endFill=0;" edge="1" parent="181" source="195" target="191">
+ <mxCell id="198" style="edgeStyle=none;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;endArrow=none;endFill=0;" parent="181" source="195" target="191" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
- <mxCell id="195" value="PORCH" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="181">
- <mxGeometry x="127.75" y="41.17" width="65.5" height="39.14" as="geometry"/>
+ <mxCell id="195" value="PORCH" style="rounded=1;whiteSpace=wrap;html=1;" parent="181" vertex="1">
+ <mxGeometry x="217.75" y="39.17" width="65.5" height="39.14" as="geometry"/>
</mxCell>
- <mxCell id="199" style="edgeStyle=orthogonalEdgeStyle;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=1;entryY=0.25;entryDx=0;entryDy=0;endArrow=none;endFill=0;rounded=0;" edge="1" parent="181" source="189" target="191">
+ <mxCell id="199" style="edgeStyle=orthogonalEdgeStyle;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;endArrow=none;endFill=0;rounded=0;entryX=1;entryY=0.25;entryDx=0;entryDy=0;" parent="181" source="189" target="191" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
- <mxPoint x="291" y="141"/>
- <mxPoint x="203" y="141"/>
+ <mxPoint x="382" y="138"/>
</Array>
+ <mxPoint x="316" y="114.24000000000001" as="targetPoint"/>
</mxGeometry>
</mxCell>
- <mxCell id="189" value="DECODE" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="181">
- <mxGeometry x="249" y="34.24000000000001" width="85" height="53" as="geometry"/>
+ <mxCell id="189" value="DECODE" style="rounded=1;whiteSpace=wrap;html=1;" parent="181" vertex="1">
+ <mxGeometry x="339" y="32.24000000000001" width="85" height="53" as="geometry"/>
</mxCell>
- <mxCell id="196" style="edgeStyle=none;html=1;endArrow=none;endFill=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="181" source="189" target="195">
+ <mxCell id="196" style="edgeStyle=none;html=1;endArrow=none;endFill=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" parent="181" source="189" target="195" edge="1">
<mxGeometry relative="1" as="geometry">
- <mxPoint x="206" y="60.74000000000001" as="targetPoint"/>
+ <mxPoint x="296" y="58.74000000000001" as="targetPoint"/>
</mxGeometry>
</mxCell>
- <mxCell id="204" value="MUL" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="181">
- <mxGeometry x="296" y="262.24" width="54" height="39.76" as="geometry"/>
+ <mxCell id="214" style="edgeStyle=orthogonalEdgeStyle;html=1;entryX=1;entryY=0.75;entryDx=0;entryDy=0;strokeColor=default;rounded=0;endArrow=none;endFill=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="181" source="204" target="191">
+ <mxGeometry relative="1" as="geometry"/>
</mxCell>
- <mxCell id="205" value="SHIFTER" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="181">
- <mxGeometry x="296" y="202.24" width="54" height="39.76" as="geometry"/>
+ <mxCell id="216" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;entryX=0.75;entryY=0;entryDx=0;entryDy=0;endArrow=none;endFill=0;strokeColor=default;" edge="1" parent="181" source="204" target="212">
+ <mxGeometry relative="1" as="geometry"/>
</mxCell>
- <mxCell id="207" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;endArrow=none;endFill=0;elbow=vertical;entryX=1;entryY=0.75;entryDx=0;entryDy=0;" edge="1" parent="181" source="204" target="191">
+ <mxCell id="204" value="MUL" style="rounded=1;whiteSpace=wrap;html=1;" parent="181" vertex="1">
+ <mxGeometry x="320" y="237.24" width="54" height="39.76" as="geometry"/>
+ </mxCell>
+ <mxCell id="217" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;strokeColor=default;" edge="1" parent="181" source="205" target="212">
<mxGeometry relative="1" as="geometry">
- <mxPoint x="206" y="172.24" as="targetPoint"/>
<Array as="points">
- <mxPoint x="256" y="282"/>
- <mxPoint x="256" y="168"/>
+ <mxPoint x="413" y="329"/>
</Array>
</mxGeometry>
</mxCell>
- <mxCell id="211" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;elbow=vertical;" edge="1" parent="181" source="210" target="190">
+ <mxCell id="205" value="SHIFTER" style="rounded=1;whiteSpace=wrap;html=1;" parent="181" vertex="1">
+ <mxGeometry x="386" y="237.24" width="54" height="39.76" as="geometry"/>
+ </mxCell>
+ <mxCell id="211" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;elbow=vertical;" parent="181" source="210" target="190" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
- <mxCell id="210" value="PREFETCH" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="181">
- <mxGeometry x="496" y="42.99000000000001" width="76" height="35.5" as="geometry"/>
+ <mxCell id="210" value="PREFETCH" style="rounded=1;whiteSpace=wrap;html=1;" parent="181" vertex="1">
+ <mxGeometry x="598" y="114.24000000000001" width="76" height="35.5" as="geometry"/>
+ </mxCell>
+ <mxCell id="219" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=0.25;entryY=1;entryDx=0;entryDy=0;endArrow=none;endFill=0;strokeColor=default;" edge="1" parent="181" source="212" target="194">
+ <mxGeometry relative="1" as="geometry"/>
+ </mxCell>
+ <mxCell id="212" value="WRITEBACK" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="181">
+ <mxGeometry x="283.25" y="312.24" width="85" height="53" as="geometry"/>
+ </mxCell>
+ <mxCell id="222" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=none;endFill=0;strokeColor=default;exitX=0.5;exitY=0;exitDx=0;exitDy=0;" edge="1" parent="181" source="220" target="194">
+ <mxGeometry relative="1" as="geometry"/>
+ </mxCell>
+ <mxCell id="220" value="REGS" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="181">
+ <mxGeometry x="16" y="294.24" width="64" height="53.76" as="geometry"/>
+ </mxCell>
+ <mxCell id="221" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;exitX=0;exitY=0.75;exitDx=0;exitDy=0;endArrow=none;endFill=0;strokeColor=default;" edge="1" parent="181" source="212" target="220">
+ <mxGeometry relative="1" as="geometry">
+ <mxPoint x="46" y="352.2055172413793" as="targetPoint"/>
+ <Array as="points">
+ <mxPoint x="266" y="352.24"/>
+ <mxPoint x="266" y="364.24"/>
+ <mxPoint x="46" y="364.24"/>
+ </Array>
+ </mxGeometry>
</mxCell>
<mxCell id="7" value="HPS" style="swimlane;" parent="2" vertex="1">
<mxGeometry x="1314" y="73" width="520" height="310" as="geometry"/>
diff --git a/hps/fpga.kermit b/hps/fpga.kermit
index 0f53b24..36579bc 100644
--- a/hps/fpga.kermit
+++ b/hps/fpga.kermit
@@ -63,6 +63,8 @@ lineout "fatload mmc 0:1 0x20000000 taller_bootrom.bin"
input 1 "SOCFPGA_CYCLONE5 #"
lineout "fatload mmc 0:1 0x2000000 soc_system.rbf"
input 1 "SOCFPGA_CYCLONE5 #"
+lineout "fatload mmc 0:1 0x20010000 jerry"
+input 1 "SOCFPGA_CYCLONE5 #"
lineout "fpga load 0 0x2000000 0x700000"
# Falla con mw 0xFFC2505C 0xA
input 1 "SOCFPGA_CYCLONE5 #"
diff --git a/image_processing/out_file b/image_processing/out_file
new file mode 100644
index 0000000..7961383
--- /dev/null
+++ b/image_processing/out_file
@@ -0,0 +1 @@
+ssskkkeeebbbaaabbbdddfffggghhhhhhiiijjjlllnnnqqquuuzzz}}}|||{{{|||}}}~~~~~~~~~|||zzzxxxvvvuuutttuuuwwwzzz|||~~~~~~|||wwwsssmmmiiiggghhhnnnxxx{{{lll^^^SSSLLLGGGFFFFFFHHHIIIJJJKKKLLLMMMNNNPPPSSSVVV[[[aaahhhmmmqqqrrrqqqnnnjjjeeebbb___^^^___```aaabbbcccbbb```^^^\\\ZZZZZZZZZ\\\___dddhhhkkknnnpppqqqppppppooommmjjjddd]]]TTTNNNJJJLLLRRR```qqqssseeeYYYOOOHHHCCC@@@??????@@@AAABBBDDDHHHKKKOOOSSSXXX]]]cccjjjooorrrsssrrrnnniiiddd```]]]\\\]]]^^^___```aaabbb```^^^\\\ZZZZZZZZZ\\\```eeeiiimmmppprrrsssssstttsssqqqnnnfff]]]RRRJJJDDDDDDKKKZZZlllwwwoooiiiaaa\\\WWWQQQMMMIIIFFFEEEFFFJJJPPPXXX```iiipppuuu{{{|||xxxuuutttuuuwwwxxxzzz{{{|||zzzyyywwwvvvvvvuuuwwwyyy}}}}}}rrreeeZZZRRRPPPUUUbbbsss~~~xxxsssooonnnnnnppprrrssssssqqqllleee]]]WWWTTTVVV\\\gggtttvvvkkkgggiiissswwwttttttyyy}}}nnneee^^^ZZZXXXWWWXXXZZZ___hhhsssvvvmmmhhhjjjrrrwwwjjjddd```______aaadddiiiooovvvzzzcccQQQGGGAAA>>>???BBBGGGMMMXXXfffxxx{{{}}}rrrdddZZZSSSOOOKKKJJJJJJNNNSSS\\\gggsss{{{www{{{ppp\\\LLLCCC===<<<<<<@@@FFFMMMYYYkkktttdddZZZSSSNNNJJJHHHHHHJJJNNNUUU^^^gggrrr~~~uuuiiidddfffmmmxxx{{{nnnaaaXXXRRRNNNKKKKKKLLLPPPWWWcccuuu|||lll```ZZZWWWVVVVVVWWWYYYZZZ[[[]]]___cccjjjsssuuueeeYYYQQQQQQUUU]]]eeemmmrrrttttttsssqqqooonnnllliiifffbbbaaabbbgggrrrwwwlllhhhhhhkkknnnqqqrrrpppjjjccc[[[WWWVVV\\\iii|||zzziiiZZZMMMEEEBBBCCCFFFKKKRRRXXX^^^eeeoooxxx~~~yyyvvvzzz|||zzz}}}|||lll\\\OOOGGGJJJUUUiiissscccVVVKKKBBB???======???CCCIIIRRR___pppxxxaaaOOOBBBAAAJJJ]]]sssyyyoooeee^^^WWWQQQMMMIIIFFFFFFGGGLLLUUUdddwwwnnnYYYJJJFFFKKKYYYjjj}}}tttpppnnnnnnooopppnnnkkkeee___[[[XXXZZZcccqqqmmm\\\TTTTTTYYYcccooozzzuuujjjeeehhhpppzzz~~~vvvppppppwwwttthhhbbb___^^^```bbbfffiiimmmssszzzrrrddd\\\[[[dddtttsssggg^^^VVVQQQMMMLLLLLLNNNRRRWWW^^^dddnnnyyyvvvhhh]]]XXX[[[gggzzzsssdddUUUJJJBBB<<<999888:::<<<BBBIIITTTaaapppwwwooohhheeeeeeiiisssuuubbbRRRFFF>>>888333222222666<<<FFFSSSbbbrrr~~~qqqkkkjjjlllqqqwww}}}xxxeeeVVVKKKAAA:::555222222666>>>JJJXXXffftttvvvbbbWWWWWW___lll||||||jjj]]]QQQFFF>>>777555666<<<EEEPPP\\\hhhsss|||vvv___NNNEEEJJJYYYooo}}}oooaaaUUUJJJAAA<<<:::===CCCKKKUUU^^^gggooovvviiiVVVHHHBBBHHHZZZrrr{{{mmm```UUUKKKEEEBBBBBBEEEJJJPPPWWW]]]dddkkkrrr{{{ssseeeYYYRRROOOVVVfffzzzyyyoooeee\\\VVVQQQNNNMMMMMMNNNPPPTTTYYY___fffooowww}}}vvvpppmmmiiifffeeefffhhhnnnyyyxxxqqqlllfff___YYYSSSNNNKKKKKKNNNSSSYYYbbbkkksss|||xxxsssmmmfffaaa[[[WWWUUUVVV[[[bbbkkkttt}}}{{{rrrfff[[[QQQIIIFFFFFFJJJOOOWWW___gggoooxxxxxxmmmcccYYYQQQKKKFFFBBB???>>>AAAEEEQQQ```qqqsssdddWWWKKKFFFDDDFFFJJJPPPVVV]]]dddllluuu~~~vvvlllbbbXXXPPPJJJEEE@@@>>><<<<<<???FFFSSSdddxxx|||nnnaaaUUUOOOKKKJJJJJJMMMPPPUUU[[[cccmmmxxx{{{ppphhhccc```^^^\\\[[[YYYVVVTTTRRRRRRTTTYYYdddrrr{{{rrriiiccc]]]WWWRRRNNNLLLNNNRRR\\\hhhvvv}}}jjj___[[[^^^eeemmmtttzzz{{{zzzxxxvvvtttsssvvv|||~~~}}}uuujjj]]]RRRJJJHHHLLLWWWgggxxxrrr\\\RRRSSS^^^mmm~~~}}}kkkYYYKKKEEEHHHVVVhhh}}}mmmVVVMMMRRRaaavvv}}}~~~wwwaaaQQQHHHKKKYYYmmmrrr^^^VVV[[[kkk}}}~~~lll\\\SSSVVVdddwwwrrrlllqqq}}}}}}|||pppiiilllxxxwwwsssyyyooo```[[[cccxxx}}}}}}yyyaaaOOOJJJSSSjjjsssYYYFFF@@@IIIaaa}}}oooTTT@@@:::CCCYYYxxxxxxmmmhhhiiirrr|||{{{}}}mmmSSS???888@@@UUUqqq}}}ooobbbXXXSSSTTT```ooo|||yyyyyy|||~~~oooVVVCCC;;;BBBSSSlllssscccUUUJJJEEEGGGSSSdddxxx}}}zzzxxxxxx|||~~~ttt]]]LLLDDDIIIWWWjjjuuudddSSSFFF@@@AAAMMM^^^rrr~~~{{{xxxvvvwww{{{~~~mmm```YYY[[[aaalllyyylllYYYIII@@@@@@JJJ[[[nnn~~~zzzwwwuuuuuuyyy}}}xxxuuusssqqqqqqtttxxxwwwbbbPPPDDDCCCKKKZZZlll~~~zzzwwwuuuuuuyyywwwkkkbbb^^^fffwwwjjjXXXKKKIIIOOO\\\lll~~~|||zzzxxxyyy}}}|||eeeSSSIIIOOOcccooo___TTTQQQVVVaaannn}}}}}}aaaJJJ===BBBWWWxxx}}}qqqhhhaaa```ccckkktttyyy]]]EEE999===RRRrrr{{{vvvsssrrrrrrrrrsssuuuyyy}}}rrrYYYDDD999===QQQooouuufff```ccciiirrr|||lllXXXGGG???CCCTTTnnn~~~bbbRRRNNNVVVdddttt}}}jjjZZZNNNHHHKKKZZZooo|||aaaRRROOOXXXgggxxx}}}}}}~~~~~~pppdddZZZVVVXXXcccrrrpppdddaaagggrrr~~~}}}~~~zzzzzz{{{~~~}}}vvvpppnnnnnnsssyyy|||}}}{{{yyyzzz{{{xxxxxxyyy|||~~~~~~~~~~~~}}}~~~~~~{{{xxxyyy|||{{{xxxxxxzzz~~~tttoooqqq}}}}}}}}}~~~~~~~~~~~~}}}}}}~~~~~~}}}~~~~~~~~~}}}jjj```^^^kkk}}}{{{zzz|||}}}yyycccTTTQQQ]]]vvv|||zzzyyyyyyzzz}}}}}}|||sss[[[JJJEEEPPPfff}}}ppplllrrr}}}zzzxxxxxxyyy{{{{{{mmmTTTCCC===EEEXXXpppmmm\\\WWW^^^mmm|||yyyyyyzzz}}}jjjRRRAAA:::???NNNbbbwww~~~cccOOOIIIPPP```www~~~~~~kkkUUUEEE???BBBMMM]]]nnn|||___JJJCCCIIIYYYooo~~~~~~sssbbbUUUPPPRRR[[[ggguuu}}}```KKKCCCHHHUUUiii~~~|||{{{|||~~~wwwooommmooovvv~~~eeeQQQHHHKKKUUUeeewww~~~zzzzzz|||~~~lllYYYPPPQQQXXXdddrrr}}}|||tttcccZZZZZZ___hhhrrr|||~~~qqqjjjiiilllrrryyy~~~|||qqqkkkpppyyyfffWWWQQQWWWjjjoooZZZIIIBBBIII]]]zzzmmmVVVEEE===DDDXXXuuu}}}}}}oooXXXFFF===DDDXXXttt{{{zzzzzzsss[[[IIIAAAGGGZZZttt}}}zzzzzz|||uuu^^^LLLDDDJJJ\\\vvvttt]]]KKKDDDJJJ\\\wwwoooZZZIIIBBBIII]]]yyyjjjVVVFFF@@@III^^^|||zzzeeeRRRCCC???III```uuuaaaOOOBBB???JJJaaarrr___OOOCCC@@@KKKcccqqq___PPPEEECCCNNNfffqqqaaaRRRHHHGGGRRRhhhqqqbbbTTTLLLJJJUUUjjj~~~qqqcccVVVNNNMMMWWWlll}}}qqqcccWWWOOONNNXXXmmm}}}qqqcccWWWOOOOOOYYYmmm}}}qqqcccWWWOOOOOOYYYmmm}}}qqqcccWWWOOONNNXXXmmm~~~qqqcccVVVNNNMMMWWWlllqqqbbbTTTLLLJJJUUUjjjqqqaaaRRRHHHGGGRRRhhhqqq___PPPEEECCCNNNfffrrr___OOOCCC@@@KKKcccuuuaaaOOOBBB???JJJaaazzzeeeRRRCCC???III```jjjVVVFFF@@@III^^^|||xxxrrrmmmkkkjjjlllnnnttt{{{oooZZZIIIBBBIII]]]yyyvvviii]]]UUURRRSSSYYY```kkkwwwttt]]]KKKDDDJJJ\\\wwwooo___QQQHHHEEEGGGOOOZZZgggvvvvvv^^^LLLDDDJJJ\\\vvv|||jjjYYYKKKBBB@@@CCCMMMYYYhhhyyyuuu^^^KKKBBBHHHZZZuuuxxxfffWWWIIIAAA???DDDOOO\\\lll}}}ttt\\\III@@@FFFYYYuuuvvveeeVVVJJJBBBBBBGGGRRRaaaqqqsss[[[HHH???FFFZZZvvvwwwfffWWWKKKCCCCCCIIIUUUddduuuqqq[[[JJJCCCJJJ^^^zzz}}}jjjZZZKKKBBBBBBHHHTTTeeewwwqqq___RRRMMMTTThhhrrr]]]KKK???>>>DDDRRRdddxxx~~~qqqggg___^^^gggxxx{{{cccLLL>>>:::@@@OOOdddyyy}}}{{{vvvrrroooooorrr|||jjjQQQ@@@;;;@@@OOOeee{{{xxxssspppmmmlllmmmooorrrwww}}}uuuZZZHHHBBBGGGUUUiii~~~ssskkkddd___^^^aaahhhppp{{{kkk[[[UUUXXXddduuurrrfff\\\UUUSSSVVV___jjjxxxxxxrrrttt|||uuudddVVVKKKHHHJJJSSS```ooo}}}xxxdddRRREEE???AAAIIIVVVeeesss{{{eeeRRRCCC<<<===DDDQQQ___nnn{{{|||gggVVVHHHBBBCCCJJJVVVdddrrrzzzlllaaaXXXVVVYYY```kkkxxx|||wwwtttrrrrrrtttyyy~~~yyyxxx|||}}}sssmmmkkkmmmsss{{{vvvmmmhhhfffhhhoooyyy{{{nnncccZZZVVVXXXaaappp}}}qqqfff^^^[[[\\\bbbmmmxxxzzzlll___TTTLLLJJJNNN[[[mmmttteeeZZZUUUWWW^^^jjjwwwvvvhhh\\\RRRKKKIIIMMMZZZlll|||iii[[[SSSUUU^^^mmm}}}yyylll```WWWPPPNNNQQQ[[[jjj}}}ppp^^^TTTVVVaaarrr}}}qqqfff]]]WWWUUUWWW___jjjxxxyyydddYYYZZZeeewww~~~sssiiibbb\\\ZZZ[[[bbbkkkwwwmmm``````iiixxxxxxmmmeee^^^ZZZZZZ[[[cccnnn{{{yyyllljjjmmmvvvxxxkkkaaaYYYTTTQQQSSSWWWcccsss|||vvvssstttwww{{{|||hhh\\\RRRJJJGGGFFFJJJQQQcccyyyzzzsssmmmiiihhhkkkrrrzzznnnZZZNNNDDD===;;;<<<CCCNNNdddtttggg\\\VVVUUU[[[cccooo}}}cccOOODDD;;;555666999BBBOOOiiiyyyfffWWWLLLIIILLLSSS^^^lllxxxxxx]]]JJJ@@@:::777:::@@@JJJXXXrrrjjjUUUFFF@@@AAAEEEOOOZZZeeeqqq}}}qqqXXXGGG@@@>>>???EEENNNZZZiiipppWWWEEE;;;999;;;AAAJJJTTT]]]hhhuuukkkUUUHHHDDDEEEKKKUUUaaannn}}}xxx\\\GGG;;;666555999???FFFMMMUUU```mmmzzz|||gggUUUKKKJJJPPPZZZggguuucccMMM???888666777:::???CCCJJJRRR\\\gggtttvvvfffXXXRRRTTT]]]iiixxxoooZZZLLLEEE@@@??????BBBDDDGGGMMMTTT\\\fffppp}}}ssshhh```^^^bbblll{{{oooccc[[[TTTQQQNNNMMMLLLLLLNNNQQQUUU[[[ccclllyyyxxxqqqnnnlllnnnttt|||tttlllfffaaa]]]XXXUUUSSSRRRRRRSSSXXX^^^hhhuuu{{{tttpppppprrruuuzzzyyyrrrkkkddd___YYYUUUQQQOOOPPPTTT[[[dddooo{{{sssgggcccdddjjjttt~~~|||ssskkkddd]]]VVVPPPLLLLLLNNNTTT\\\fffqqq}}}qqqcccYYYWWW\\\hhhxxxwwwoooggg___WWWPPPLLLKKKMMMTTT\\\gggsssssscccWWWOOOPPPZZZjjj~~~wwwpppiiiaaaYYYRRRNNNNNNQQQYYYdddqqqssseeeXXXNNNIIIMMMZZZooo{{{uuupppiiibbb[[[VVVSSSSSSXXXbbbooo~~~zzzqqqeeeYYYOOOHHHFFFMMM^^^vvv~~~zzzvvvrrrooojjjddd___[[[ZZZ[[[bbbmmm{{{zzzqqqjjjcccYYYPPPIIIEEEFFFOOOccc~~~|||wwwtttqqqooommmjjjgggdddbbbccceeemmmxxxyyypppjjjccc^^^XXXQQQKKKGGGFFFIIITTTiii}}}vvvqqqmmmkkkiiihhhhhhhhhiiijjjmmmqqqvvv}}}{{{qqqiiibbb]]]XXXTTTQQQLLLIIIHHHJJJPPP\\\qqqzzzpppjjjeeeaaa_________bbbeeekkkrrrzzzxxxlllbbb[[[UUURRROOOMMMLLLKKKKKKMMMRRRZZZfff{{{xxxlllccc^^^ZZZWWWUUUVVVWWW\\\cccnnnzzz{{{kkk^^^VVVPPPKKKIIIIIIIIIJJJLLLPPPUUU\\\fffssswwwlllaaaYYYUUURRRPPPOOOQQQUUU[[[eeerrrppp```TTTLLLHHHEEEEEEFFFHHHKKKPPPWWW^^^iiisssvvvlllcccZZZTTTQQQPPPPPPQQQUUUZZZaaakkkxxxxxxfffWWWMMMGGGCCCBBBDDDGGGKKKPPPWWW```jjjvvv{{{rrriiibbb[[[UUURRRQQQSSSVVVZZZ```fffmmmuuunnn^^^QQQHHHDDDCCCDDDHHHMMMSSSZZZcccooo{{{tttkkkddd]]]YYYUUUSSSRRRTTTYYY```gggpppxxx~~~ttteeeXXXLLLFFFEEEFFFJJJOOOWWW___gggsss|||pppeee\\\WWWSSSRRRQQQRRRUUUYYYaaakkkwww~~~}}}~~~yyysssnnnnnnppptttzzz~~~|||tttiii^^^SSSKKKGGGHHHLLLRRRYYYccclllvvv|||ooocccYYYQQQNNNLLLNNNPPPTTTYYY```jjjxxx}}}~~~{{{{{{vvviii\\\SSSMMMMMMQQQXXXaaaiiimmmnnniiiaaaYYYQQQKKKKKKNNNTTT\\\eeeppp{{{~~~qqqeeeZZZQQQKKKIIIIIIMMMRRRXXX```hhhuuu{{{lll^^^QQQGGGAAA@@@DDDKKKSSSZZZ___aaa___ZZZVVVQQQOOOQQQVVV___hhhsss|||qqqfff[[[QQQJJJGGGGGGJJJPPPWWWaaajjjuuuuuuiii]]]SSSJJJDDDBBBCCCFFFJJJNNNQQQSSSSSSSSSSSSSSSUUUZZZbbbmmmyyy~~~vvvooofff\\\TTTLLLGGGEEEGGGMMMVVV___jjjvvvyyyrrrjjjccc\\\UUUPPPLLLIIIGGGFFFFFFFFFHHHJJJMMMRRRWWW]]]eeeppp~~~xxxqqqllleee___WWWPPPJJJHHHHHHKKKSSS]]]hhhtttyyytttrrrrrrrrrtttsssrrrpppmmmjjjgggccc___ZZZUUUNNNHHHDDDBBBCCCGGGMMMUUU___hhhrrryyytttoookkkhhhddd^^^XXXSSSNNNMMMNNNRRRZZZdddooo{{{}}}pppddd\\\XXXXXX\\\___eeeiiikkklllmmmnnnooommmkkkgggaaaYYYQQQKKKHHHIIINNNVVV```kkkvvv}}}uuuqqqppppppppppppnnnjjjeeeaaa\\\[[[\\\___eeemmmvvvrrrcccVVVNNNJJJJJJNNNSSSZZZ___cccgggjjjmmmqqqssssssrrrnnniiiddd```___```eeellluuu~~~tttmmmnnnqqqwww}}}}}}yyyuuusssrrrsssuuuyyy}}}|||lll]]]PPPHHHDDDCCCGGGJJJPPPUUUZZZ___eeekkkqqqvvv{{{~~~{{{lllggglllttt}}}wwwiii\\\PPPHHHDDDBBBCCCEEEIIIMMMRRRXXX```hhhrrrzzzuuufffbbbjjjxxxuuuhhh___\\\\\\^^^bbbfffjjjnnnrrrwww||||||ttthhh^^^TTTMMMHHHFFFEEEDDDEEEHHHMMMTTT^^^hhhtttnnn___]]]hhhxxxwwwfffWWWMMMHHHGGGHHHKKKNNNRRRVVV\\\ccckkkqqqvvvwwwtttppphhh```ZZZTTTPPPMMMJJJHHHFFFHHHMMMUUUaaammm{{{}}}zzz{{{yyycccXXXWWWbbbsss~~~{{{xxxvvvtttttttttuuuvvvxxx{{{~~~ooo___RRRIIIDDDBBBAAACCCFFFHHHKKKPPPUUU[[[```eeehhhhhhhhhfffdddbbb___]]]ZZZUUUQQQNNNOOOTTT]]]jjjxxx}}}~~~wwweeeVVVOOOQQQ\\\lllvvvjjjbbb______bbbggglllppprrruuuxxx{{{}}}~~~}}}||||||}}}uuujjj___UUUMMMIIIGGGEEEEEEFFFFFFGGGHHHJJJMMMOOORRRVVVZZZ___dddiiinnnpppooolllfff```[[[[[[___iiixxxsssfff[[[QQQKKKIIILLLVVVddduuuppp\\\OOOJJJLLLRRR[[[eeellloooqqqrrrsssssstttttttttsssrrrrrrqqqqqqqqqsssuuuwwwyyyyyywwwsssooohhhbbb]]]XXXUUUQQQOOOMMMLLLJJJHHHFFFDDDBBBAAACCCFFFNNNYYYeeerrr}}}zzzrrrkkkiiimmmxxxlllZZZOOOHHHDDDCCCDDDGGGKKKUUU```mmmzzzoooTTTBBB<<<???HHHTTT___hhhlllnnnnnnmmmlllkkkkkkjjjiiiiiihhhgggggggggiiijjjlllmmmnnnmmmmmmllljjjiiigggdddbbb^^^[[[WWWTTTQQQMMMIIIDDD???<<<<<<@@@JJJYYYkkk}}}{{{xxx|||qqqVVVDDD;;;888;;;???FFFKKKQQQYYYcccmmmwww~~~sssVVVCCC;;;>>>EEEQQQ\\\eeehhhjjjjjjiiihhhgggfffeeedddcccaaa`````````ccceeehhhjjjlllmmmooopppqqqqqqqqqooonnniiieeeaaa]]]XXXUUUPPPKKKGGGEEEEEEJJJUUUeeeyyyfffJJJ999333555===GGGRRRZZZ```fffmmmssszzz~~~~~~cccQQQIIIIIILLLSSSZZZ```bbbdddfffgggiiiiiiiiigggdddaaa^^^\\\[[[\\\aaagggmmmsssxxx{{{~~~~~~yyysssnnniiieeecccaaa``````bbbeeelllvvv~~~^^^DDD666444:::GGGUUUdddoootttyyy|||~~~yyyjjjaaa\\\YYYYYYZZZ[[[\\\___cccggglllnnnooommmhhhbbb]]]YYYXXX[[[cccmmmxxx~~~xxxuuuuuuxxx~~~zzzsssmmmkkkkkkpppvvvwwwZZZDDD999:::DDDUUUgggyyy|||rrrjjjbbb\\\YYYXXX[[[aaahhhppptttvvvssslllddd]]]WWWVVV[[[ffftttqqqfff___ZZZUUUTTTRRRUUUXXX```iiitttqqqYYYGGG@@@DDDPPPcccwww{{{nnnbbb[[[XXX[[[aaajjjrrrwwwzzzvvvnnneee\\\VVVUUUZZZgggyyy{{{eeeRRRFFFAAA>>>===AAADDDJJJPPPYYYdddppp}}}nnn\\\OOOJJJPPP]]]ooo|||nnnddd______dddjjjqqqtttvvvrrrjjjbbbZZZTTTTTTZZZfffxxx{{{|||sss\\\III>>>:::;;;===DDDKKKSSSZZZdddooozzzxxxmmmddd^^^^^^cccnnn}}}}}}}}}|||}}}vvvnnnjjjiiiiiijjjjjjhhheee___ZZZUUUSSSTTTYYYdddrrrsssiiikkkuuuwwwcccSSSJJJJJJNNNUUU^^^hhhrrryyyzzztttpppnnnnnnppprrrvvv{{{~~~}}}}}}|||{{{zzzzzzyyy{{{yyypppiiibbb\\\XXXUUURRRQQQQQQRRRUUUYYY```jjjsss|||}}}{{{{{{sssaaaWWWZZZfffxxxsssgggcccfffmmmyyy{{{zzziii^^^ZZZ^^^fffppp|||}}}||||||{{{{{{zzzzzzyyyyyy|||xxxiii\\\QQQIIIGGGGGGIIIMMMQQQVVVYYY\\\aaadddiiikkkllljjjfffbbb___]]]___fffqqq|||dddQQQHHHLLLZZZnnn}}}hhh```cccooo~~~xxxdddSSSIIIGGGPPP___rrr~~~~~~mmm\\\NNNEEEBBBCCCFFFLLLQQQUUUWWWWWWXXXXXXXXXXXXWWWSSSOOOJJJGGGFFFIIIRRRaaarrrsss\\\IIIAAAFFFUUUkkkqqqYYYOOOPPP[[[jjj}}}{{{gggTTTEEE<<<<<<HHH[[[qqquuueeeYYYOOOKKKJJJKKKNNNPPPSSSRRRQQQPPPOOONNNMMMKKKGGGCCC???<<<;;;>>>GGGVVVgggyyy~~~sss]]]MMMFFFKKKZZZppppppVVVJJJIIIQQQ^^^mmm}}}wwwfffUUUFFF;;;555777DDDXXXooowwwnnnfff```[[[VVVRRROOOLLLJJJHHHFFFEEEEEEDDDCCC???<<<888666666888???KKKYYYhhhuuu}}}vvvqqqoooqqqzzzyyyxxx~~~zzzhhh[[[VVV\\\jjjuuu\\\OOOKKKMMMTTT^^^iiivvvmmm___QQQEEE;;;555333777DDDWWWmmm|||qqqeeeYYYNNNFFFAAA>>>======>>>>>>===;;;999777555555777;;;CCCMMMVVV___eeeiiijjjhhhdddbbbbbbdddiiiqqq{{{uuukkkccc```dddoooxxxnnnlllrrriii[[[SSSOOONNNPPPVVV```qqqkkkWWWKKK@@@999555444666<<<HHHYYYmmm~~~~~~tttaaaOOOAAA;;;777777888:::<<<<<<;;;;;;:::999999:::<<<@@@DDDHHHLLLPPPSSSUUUVVVVVVWWWYYY[[[]]]```cccfffiiijjjiiifffccc___\\\YYYXXXXXXYYYZZZ\\\\\\]]][[[WWWQQQLLLJJJMMMUUUdddxxxyyykkk___VVVMMMHHHIIIPPPaaa}}}{{{]]]HHH===555333555888===DDDOOO^^^ooo~~~jjjSSSBBB;;;777777999<<<???@@@@@@AAAAAAAAABBBBBBBBBCCCCCCDDDEEEFFFHHHKKKNNNQQQTTTWWWXXXXXXWWWVVVUUUSSSQQQOOOLLLJJJGGGEEECCCBBBAAA@@@@@@@@@@@@AAAAAA@@@>>>===???EEEOOO```vvv|||nnnaaaSSSIIIFFFJJJZZZuuusssUUUAAA888555777===EEELLLTTT^^^jjjxxxuuu\\\KKKBBB>>>>>>BBBEEEIIIJJJLLLNNNOOOPPPRRRRRRRRRRRRPPPNNNNNNNNNOOORRRUUUXXX[[[^^^___^^^[[[YYYUUURRROOOMMMKKKJJJHHHGGGFFFEEEDDDCCCCCCBBBBBBCCCDDDDDDDDDEEEHHHNNNWWWgggzzztttdddXXXRRRSSS^^^tttlllPPP???999;;;CCCNNNZZZdddlllttt|||jjjXXXOOOLLLLLLPPPTTTXXX[[[]]]aaaeeehhhkkkllllllkkkhhhfffdddcccccceeegggjjjmmmoooooonnnjjjgggddd```^^^\\\[[[[[[[[[\\\\\\\\\[[[[[[ZZZZZZZZZ[[[[[[\\\\\\^^^aaaeeelllwwwuuukkkhhhlllvvvgggOOOAAA???GGGSSScccsssyyyhhh```]]]^^^bbbgggkkkooosssyyy}}}}}}}}}}}}~~~~~~{{{xxxuuutttssssssuuuwwwyyyzzz{{{{{{{{{{{{{{{{{{{{{|||}}}}}}~~~~~~{{{zzzzzz}}}~~~eeeRRRGGGHHHTTTdddwwwzzzsssqqqrrrwww{{{ssseee]]]ZZZ```pppyyyeeeWWWPPPSSS```qqq~~~~~~qqq]]]OOOHHHLLL]]]wwwvvvjjjbbb___cccnnn||||||zzzyyy}}}}}}|||}}}wwwdddXXXQQQUUUdddzzz|||wwwuuusssssstttxxx{{{yyyyyy}}}~~~|||{{{|||wwwppplllpppzzztttkkkiiimmmttt}}}}}}|||}}}zzzzzzwww```WWWYYYdddttt}}}||||||}}}~~~}}}}}}kkkSSSJJJNNN]]]qqqcccLLLCCCGGGVVViii~~~}}}|||{{{^^^III@@@CCCOOO```rrr{{{lllddddddpppuuu\\\IIIAAACCCLLLXXXhhhwwwxxxfffVVVNNNOOO___zzzqqq]]]NNNGGGGGGOOOXXXeeerrr}}}~~~~~~mmmYYYIIIAAACCCUUUtttooo```VVVQQQSSS[[[dddppp|||~~~~~~qqq]]]LLLDDDEEEVVVtttzzzqqqjjjfffeeejjjsss~~~}}}}}}~~~~~~qqq___VVVVVVccc|||{{{wwwttttttvvvyyy~~~{{{zzz||||||qqqooowww}}}nnniiijjjooowww|||{{{|||nnn^^^ZZZ___jjjyyyzzzaaaRRRPPPWWWeeewwwmmmVVVGGGFFFOOO^^^qqq~~~~~~}}}}}}zzz```LLL@@@@@@HHHXXXkkk~~~~~~~~~|||zzzyyy|||lllWWWGGG===>>>GGGVVVhhh}}}|||{{{}}}|||zzzyyy|||tttdddSSSGGGAAADDDMMM\\\mmm|||zzz{{{xxxkkkaaaXXXRRRPPPUUU___nnn~~~|||qqqkkkfffddddddfffjjjqqq{{{|||kkkbbb```cccjjjsss}}}qqq^^^VVVXXXaaapppkkkWWWOOOSSS```tttkkkVVVMMMRRRaaawww~~~{{{yyy{{{}}}|||}}}pppZZZQQQUUUdddyyy}}}|||}}}{{{{{{~~~xxx```WWWZZZhhh{{{{{{|||~~~fff\\\^^^kkk}}}}}}hhh^^^```lll}}}zzzeee\\\^^^jjj{{{}}}{{{yyyzzz}}}ttt```XXX[[[gggwww~~~}}}}}}}}}}}}}}}~~~~~~}}}|||zzzyyyzzz{{{mmm\\\VVVYYYeeettt~~~~~~~~~|||jjj]]]XXX[[[ffftttyyyllldddaaadddlllwww}}}yyytttssssssuuuzzz~~~}}}vvvqqqqqqtttzzz{{{yyy{{{}}}}}}rrrnnnnnnqqqwww~~~{{{jjj^^^[[[aaammm}}}~~~yyywwwxxxzzzsssaaaTTTQQQUUU]]]jjjvvvnnnXXXKKKJJJUUUgggzzzyyyzzz}}}{{{cccOOOBBBAAAHHHTTTeeeuuuhhhPPPAAA@@@NNNddd~~~rrr^^^NNNEEEFFFOOO]]]oookkkPPP???>>>LLLddduuujjj```ZZZXXX\\\fffuuuqqqTTTBBB@@@MMMeeesssjjjeeedddeeehhhmmmsss{{{wwwXXXEEEBBBOOOfff}}}gggWWWOOOPPPXXXeeetttxxxZZZGGGDDDPPPgggoooYYYHHHCCCIIIWWWlllsssWWWFFFCCCPPPfff{{{{{{kkkZZZNNNLLLTTTfff}}}iiiRRRDDDCCCOOOeeerrriiihhhlllttt|||yyynnnfffbbbeeeooouuu___LLLBBBBBBOOOccc|||}}}mmmaaaXXXUUUWWW\\\bbbjjjooosssuuuvvvvvvyyy}}}yyygggUUUHHH@@@BBBOOObbbyyy}}}mmm^^^RRRJJJGGGFFFIIIMMMTTTZZZbbblllvvvppp```QQQFFF@@@BBBOOOaaawwwqqqbbbTTTIIIBBB???>>>@@@DDDKKKRRR\\\jjj{{{ppp___PPPFFF@@@BBBNNN```uuuvvviii[[[OOOFFF@@@>>>???BBBGGGOOOXXXcccsssvvvdddSSSFFF???@@@MMM^^^ttt{{{vvvmmmcccXXXNNNGGGCCCDDDFFFLLLSSS]]]gggtttkkkXXXIII@@@AAALLL^^^ttt~~~uuuooojjjjjjkkkmmmoooooommmggg```WWWPPPKKKJJJMMMRRRZZZeeeqqq|||ttt___OOOEEEEEEPPP```uuu|||nnnbbbWWWPPPMMMPPPUUU\\\cccggghhhfffaaaZZZUUUQQQRRRWWW___jjjwww}}}jjjZZZPPPPPPXXXfffxxx|||mmm^^^QQQFFF@@@>>>CCCLLLVVV```gggkkkjjjfff```]]]ZZZ\\\bbblllxxx|||nnneeedddiiisssqqqdddVVVJJJAAA<<<<<<CCCNNN[[[hhhpppuuuuuurrrlllhhheeehhhoooyyyzzzsssiii^^^SSSIIIBBB@@@BBBKKKXXXggguuu|||wwwtttvvv}}}zzzvvvsssqqqpppmmmjjjddd\\\TTTMMMIIIHHHMMMXXXgggxxxqqqddd\\\ZZZ[[[___cccfffgggddd___YYYTTTRRRSSSYYYfffvvvuuuaaaSSSLLLNNNRRRZZZbbbiiillljjjgggbbb]]][[[]]]dddrrr}}}{{{{{{{{{|||{{{zzzxxxvvvvvvxxx{{{{{{www||||||iiiXXXMMMHHHMMMUUU```kkkuuuyyyyyyuuupppjjjgggiiiqqqyyy|||yyyrrrmmmiiifffeeefffhhhkkkooosssxxx~~~vvvpppnnnqqqwww|||nnn___SSSLLLLLLTTT___nnn{{{{{{wwwxxxtttddd\\\```mmmyyylllaaaXXXTTTTTTWWW[[[bbbhhhmmmoooqqqqqqsssvvvyyywwwrrrnnnkkkiiihhhhhhjjjmmmqqqtttvvvvvvssslllbbbYYYSSSPPPTTT___mmm~~~}}}cccPPPFFFJJJZZZpppzzzhhhYYYLLLGGGGGGKKKRRR[[[bbbggggggeeeaaa]]]\\\]]]bbbmmm|||ooobbb\\\ZZZ\\\___bbbeeeggghhhiiijjjjjjjjjiiigggccc]]]XXXVVVVVV]]]jjj{{{yyy\\\GGG<<<@@@QQQiiizzzfffTTTFFF@@@@@@EEELLLUUU\\\aaaaaa]]]WWWRRROOOOOOSSS^^^lll{{{~~~}}}{{{yyywwwwwwyyymmm]]]QQQNNNOOOUUU]]]eeekkknnnooopppooommmllljjjhhheee```]]]\\\^^^fffttt|||]]]FFF:::>>>PPPiiizzzfffSSSEEE>>>===BBBIIIRRRYYY^^^]]]YYYTTTOOOLLLKKKOOOXXXdddqqq}}}~~~}}}{{{zzzxxxwwwvvvtttqqqnnnmmmnnnqqqxxx{{{jjjZZZMMMEEEEEELLLWWWdddpppzzz~~~{{{xxxvvvtttpppkkkhhhgggjjjrrrbbbIII<<<AAARRRlll|||hhhVVVGGG@@@???CCCIIIQQQWWW[[[ZZZXXXTTTPPPNNNMMMPPPWWW```jjjttt|||~~~{{{yyyxxxwwwwwwvvvtttsssqqqoookkkhhheeeddddddgggnnnvvvyyyvvvuuuvvvxxxxxxxxxuuummmbbbVVVJJJBBB>>>BBBMMM]]]ooo{{{wwwvvvxxxhhhNNNAAAEEEVVVooolll[[[MMMEEEDDDFFFKKKPPPUUUXXXXXXWWWUUUSSSSSSRRRTTTYYY___ffflllqqqtttvvvvvvvvvuuutttsssrrrrrrrrrrrrpppooonnnjjjgggccc^^^\\\YYYYYYZZZ\\\^^^```bbbccccccddddddddddddddddddccccccbbbbbbaaabbbbbbbbbbbbbbbccccccccccccbbbaaaaaaaaaaaaaaa`````````aaabbbdddhhhkkknnnqqqsssuuuvvvwwwxxxxxxxxxxxxxxxvvvvvvuuuttttttuuuwwwzzz|||}}}}}}{{{zzzwwwtttqqqnnnllljjjhhheeeccc```]]]WWWOOOGGG@@@<<<===DDDSSSfff{{{lllQQQCCCGGGXXXqqqrrrbbbVVVNNNKKKKKKNNNQQQSSSUUUUUUUUUUUUTTTUUUUUUWWWZZZ]]]aaaeeehhhjjjkkklllllllllllllllllllllmmmmmmlllkkkiiifffbbb^^^YYYUUUQQQNNNLLLIIIGGGFFFEEEEEEEEEFFFHHHIIIIIIJJJJJJJJJIIIHHHHHHHHHHHHHHHGGGGGGGGGGGGGGGGGGGGGFFFFFFFFFFFFFFFFFFEEEEEEEEEFFFHHHJJJNNNQQQUUUXXXZZZ\\\^^^___`````````___^^^[[[YYYWWWVVVVVVXXX\\\___cccfffiiijjjkkklllllllllkkkiiifffbbb]]]XXXTTTQQQLLLGGGBBB>>>===@@@IIIYYYmmmnnnQQQCCCFFFXXXqqq|||oooddd\\\WWWTTTSSSRRRQQQPPPPPPPPPQQQRRRTTTUUUVVVYYYZZZ]]]___aaabbbbbbcccccccccccccccddddddeeeeeedddcccaaa___[[[WWWRRRNNNJJJGGGDDDAAA>>>;;;:::::::::<<<???AAABBBCCCCCCCCCBBB@@@@@@>>>>>>>>>=====================<<<<<<<<<<<<======<<<<<<<<<===???@@@DDDGGGJJJMMMNNNOOOQQQQQQQQQQQQQQQOOONNNKKKIIIGGGFFFHHHKKKQQQXXX^^^dddiiikkkoooqqqrrrsssrrrqqqnnniiiddd^^^ZZZWWWRRRNNNKKKHHHIIILLLTTTbbbssspppRRRBBBEEEWWWpppyyyqqqjjjbbbZZZSSSMMMJJJHHHIIIKKKNNNRRRTTTUUUWWWXXXZZZZZZ[[[\\\\\\\\\[[[[[[ZZZZZZZZZ[[[[[[\\\[[[[[[YYYWWWSSSPPPKKKHHHEEEBBB@@@>>>===;;;;;;<<<===???CCCEEEGGGHHHHHHGGGEEECCCBBB@@@??????>>>>>>>>>>>>>>>>>>>>>>>>>>>?????????????????????@@@AAABBBEEEGGGIIIJJJKKKKKKKKKIIIHHHFFFFFFDDDCCC@@@>>>>>>???BBBHHHRRR\\\fffnnnuuuzzz~~~{{{vvvpppllliiifffccc```]]]^^^```eeemmmxxxqqqRRRBBBDDDVVVppp}}}pppcccVVVJJJDDDAAABBBFFFKKKPPPTTTUUUWWWWWWXXXWWWXXXWWWVVVVVVTTTSSSRRRQQQRRRRRRRRRRRRSSSRRRQQQOOOLLLIIIFFFDDDBBBAAAAAAAAAAAABBBDDDEEEGGGKKKNNNQQQSSSTTTTTTRRROOOMMMJJJHHHGGGGGGFFFFFFFFFFFFFFFFFFGGGGGGGGGHHHHHHHHHIIIIIIIIIIIIIIIJJJKKKLLLMMMNNNNNNMMMKKKJJJGGGDDDAAA@@@>>><<<;;;::::::===BBBLLLYYYfffttt}}}{{{xxxxxxxxxyyy{{{~~~qqqRRRAAADDDUUUooo~~~kkkZZZJJJAAA===???DDDJJJQQQVVVWWWXXXXXXWWWVVVUUUTTTRRRQQQOOONNNLLLKKKKKKKKKKKKKKKLLLKKKKKKJJJHHHFFFDDDCCCCCCDDDEEEGGGIIILLLOOORRRUUUXXX\\\___aaacccbbb___\\\YYYUUURRRQQQQQQQQQQQQRRRRRRRRRRRRSSSSSSSSSUUUUUUUUUUUUUUUUUUUUUVVVVVVVVVVVVVVVVVVUUUTTTPPPMMMHHHDDD@@@>>>===;;;:::999;;;???FFFSSSccctttpppRRRBBBDDDUUUnnnsss```OOOEEEAAACCCIIIPPPWWW\\\]]]]]]ZZZXXXUUUSSSQQQOOOMMMKKKJJJHHHGGGGGGGGGGGGGGGHHHHHHHHHHHHGGGGGGHHHHHHIIIKKKMMMPPPSSSVVVZZZ]]]```dddhhhkkkmmmnnnmmmjjjfffccc___\\\[[[[[[[[[\\\]]]^^^^^^^^^_________``````````````````````````````______^^^]]][[[WWWSSSNNNIIIEEECCCAAA???>>><<<>>>CCCLLLZZZlllkkkRRRDDDFFFVVVmmmxxxgggXXXOOOLLLOOOUUU\\\bbbffffffddd```[[[UUUQQQMMMKKKIIIHHHGGGFFFFFFFFFFFFFFFFFFHHHIIIJJJLLLNNNQQQTTTWWWYYY\\\^^^```bbbcccfffiiikkknnnrrrtttvvvwwwuuurrrnnnkkkgggeeedddeeefffiiikkklllmmmmmmmmmmmmlllllllllkkkkkkjjjjjjiiiiiihhhiiihhhhhhggggggeeeaaa^^^ZZZUUUQQQOOOMMMJJJHHHEEEFFFJJJSSSbbbvvv~~~eeeQQQGGGJJJXXXlll|||pppeee___^^^aaagggmmmrrruuusssnnnggg___VVVOOOJJJGGGFFFFFFFFFGGGHHHHHHHHHHHHIIIJJJLLLOOOTTTZZZaaahhhmmmrrrtttuuuvvvuuuuuuuuuwwwxxxzzz}}}~~~~~~{{{wwwtttqqqpppppprrruuuyyy|||~~~~~~|||{{{zzzyyywwwvvvtttsssrrrrrrsssrrrsssssstttsssqqqnnnkkkhhheeeccc```\\\XXXSSSRRRUUU]]]nnnppp^^^PPPJJJNNNZZZkkk~~~zzzuuussssssvvv{{{zzzooodddXXXOOOHHHEEEEEEEEEHHHIIIKKKLLLLLLLLLMMMNNNQQQVVV^^^gggrrr|||||||||}}}}}}}}}~~~~~~~~~|||zzzvvvqqqkkkdddaaabbbjjj{{{sssdddXXXOOOMMMQQQ[[[jjjzzzzzzlll]]]QQQIIIFFFGGGHHHKKKOOOQQQRRRQQQQQQQQQRRRVVV[[[dddppp~~~~~~vvvrrrqqqyyyuuuiii^^^TTTOOONNNRRR\\\jjjyyyuuueeeWWWNNNKKKLLLNNNSSSWWWZZZZZZXXXWWWUUUTTTWWW\\\eeeqqq~~~ssshhh]]]SSSNNNNNNRRR]]]kkk{{{~~~}}}||||||~~~pppaaaVVVSSSUUUXXX]]]bbbeeedddaaa]]]XXXUUUTTTWWW___iiivvvxxxkkk^^^TTTNNNLLLRRR]]]mmm}}}|||~~~}}}{{{zzzzzz}}}~~~mmmaaa^^^```eeekkkqqqtttqqqkkkccc[[[TTTPPPPPPTTT[[[dddmmmwwwqqqbbbUUUMMMKKKPPP]]]ooo{{{{{{}}}}}}{{{yyyyyy}}}{{{ooolllnnnuuu{{{vvvlll```UUUMMMIIIJJJLLLQQQXXX```gggqqq|||vvveeeWWWMMMIIIOOO]]]ppp}}}}}}{{{yyyyyy}}}~~~|||uuugggYYYMMMGGGEEEDDDEEEIIIPPPWWWbbbpppxxxgggWWWMMMIIIOOO]]]ooo}}}{{{yyyyyy}}}qqqaaaSSSKKKHHHEEEFFFHHHNNNUUU```oooyyyhhhXXXNNNIIINNN[[[mmm}}}{{{zzzzzz}}}~~~mmm^^^UUUQQQOOOOOORRRWWW]]]hhhwwwzzziiiYYYNNNIIINNNYYYjjj}}}~~~}}}|||{{{{{{~~~|||mmmccc___]]]^^^aaagggmmmuuu{{{jjjZZZOOOIIIMMMWWWgggxxx~~~}}}}}}|||}}}}}}ssspppoooqqqtttzzzrrrggggggttt|||lll\\\PPPJJJMMMVVVddduuu~~~~~~mmmVVVHHHHHHWWWttt~~~mmm\\\PPPIIILLLUUUcccsssiiiTTTGGGFFFSSSmmmmmm[[[MMMGGGIIISSSbbbsss~~~~~~}}}~~~rrrddd\\\\\\dddtttmmmZZZKKKDDDGGGRRRaaattt~~~{{{|||}}}|||~~~~~~}}}}}}~~~ooo[[[LLLEEEGGGRRRcccuuu~~~{{{|||xxxuuuyyytttaaaRRRKKKMMMWWWfffxxxwwwggg^^^___hhhvvvnnnaaaZZZ[[[cccnnn|||}}}{{{|||xxxeeeYYYXXX]]]hhhwwwxxxrrrqqqtttzzz}}}{{{|||lll___[[[[[[```hhhqqqyyyzzzmmmeee```^^^]]]^^^___aaacccfffjjjoootttzzz}}}rrriiiaaaYYYTTTNNNLLLIIIIIIJJJLLLOOOUUU[[[dddnnnyyytttiii___VVVNNNIIIDDD@@@??????AAAEEEKKKSSS]]]iiiuuu}}}tttmmmeee```ZZZVVVRRRPPPOOOPPPRRRUUUZZZ```hhhpppyyy||||||~~~~~~zzztttppplllhhhddd___\\\\\\^^^eeeqqqxxxnnnhhhhhhppp}}}}}}~~~zzzzzz}}}xxxjjj\\\SSSNNNRRR^^^ppp~~~pppcccXXXSSSTTT]]]mmm~~~}}}{{{vvv```OOOEEEEEEPPPcccyyyxxxjjj^^^TTTOOOPPPZZZjjj|||hhhSSSFFFDDDLLL]]]qqqwwwmmmeeeaaaaaaiiiuuuwwwbbbTTTPPPSSS^^^lll|||~~~xxxjjjcccaaadddhhhooovvvzzz~~~~~~{{{sssmmmiiifffdddcccdddfffiiimmmrrrwww{{{|||}}}yyynnneee]]]WWWTTTRRRQQQRRRUUUXXX]]]dddmmmwww~~~{{{}}}}}}rrrhhh___YYYRRRLLLIIIGGGGGGJJJRRR[[[fffqqq}}}zzzxxxzzz}}}tttgggZZZMMMDDD>>>===CCCKKKUUU```lllvvv{{{wwwvvvxxx{{{qqq[[[HHH<<<666888>>>GGGQQQ[[[eeeooo|||vvvnnnjjjkkksss|||zzzvvvwwwyyy|||nnnRRR???666444777===EEENNNWWW```kkkwww~~~sssjjjbbb\\\ZZZ[[[cccnnnzzz|||}}}```JJJ===999888<<<BBBIIIOOOVVV___jjjttttttllleee```]]][[[[[[^^^eeemmmwwwsss]]]PPPJJJGGGGGGJJJNNNRRRUUU[[[ccckkkttt}}}mmm```[[[ZZZ^^^cccggglllooosssvvvzzz~~~rrrjjjddd```]]]\\\\\\[[[\\\```ccciiioooyyyuuu\\\NNNMMMTTT```nnn{{{wwwppplllfffbbb```^^^___ccckkkvvvlllPPPBBBDDDQQQddd{{{~~~tttkkkddd]]]ZZZ[[[```kkkxxxiiiMMM???CCCSSSjjjwwwkkk```ZZZXXX\\\eeerrrnnnTTTGGGKKKYYYnnn|||zzzzzz|||xxxjjj```]]]___hhhttt{{{fffZZZ[[[eeesss}}}xxxuuussstttxxxzzznnngggiiiqqq}}}|||sssqqqtttzzz{{{uuurrrqqqssswww~~~vvvwww~~~~~~xxxttttttwww|||}}}}}}zzz{{{}}}uuuttt|||vvveee]]]```ooosssddd[[[YYYbbbssswwwaaaOOOGGGLLL```~~~yyyeeeTTTIIIFFFPPPbbbzzzkkkUUUDDD>>>DDD[[[|||zzzeeeRRRFFFCCCLLL^^^vvvsss```PPPDDDBBBJJJaaatttaaaTTTPPPWWWggg{{{|||pppcccXXXPPPLLLOOOYYYnnn{{{nnnhhhlllxxxxxxggg]]]VVVTTTUUUYYYaaallljjjYYYQQQQQQUUU^^^iiiuuufffWWWRRRVVV___lllzzz~~~}}}}}}yyyiii``````hhhttt{{{yyywwwvvvwwwyyy}}}zzztttpppqqqvvv|||wwwuuutttvvvyyy|||qqqhhhdddeeekkkrrr{{{zzzxxxxxxzzz}}}jjjSSSJJJKKKTTTddduuueeeOOOGGGJJJWWWjjj~~~|||{{{zzzzzz|||ooo^^^YYY^^^kkk~~~}}}xxxwwwuuuvvvyyy|||xxxvvv|||zzzwwwuuuwwwyyy}}}|||yyy{{{}}}|||yyyyyy|||{{{vvvsssrrrttt{{{|||}}}|||xxxtttqqqrrrtttyyy~~~}}}{{{vvvttttttuuuxxx{{{~~~iii___bbbnnn}}}yyywwwxxxzzz}}}~~~pppXXXMMMRRRaaawww~~~~~~~~~ttt^^^TTTXXXggg}}}rrrjjjnnn{{{~~~~~~~~~zzzxxxxxx{{{~~~yyyuuuvvvyyy}}}||||||}}}}}}}}}~~~}}}|||}}}yyytttpppooorrrwwwwwwnnnfffbbb``````cccjjjvvv||||||~~~qqqddd\\\UUURRRQQQRRRVVV]]]kkk~~~||||||rrrbbbWWWOOOIIIFFFFFFGGGLLLSSSaaatttuuugggZZZPPPJJJDDDAAAAAAAAAFFFLLLXXXiii}}}vvvjjjaaaWWWOOOJJJDDDAAA??????AAAEEENNN\\\lll{{{zzzxxx|||~~~tttkkkccc]]]WWWRRRMMMHHHDDDAAA??????AAAGGGPPPZZZeeeooouuuxxxvvvrrrnnnkkkkkkrrr~~~xxxnnnfffaaa]]][[[YYYVVVSSSNNNIIIEEEBBB@@@@@@BBBGGGLLLSSSYYY]]]```___^^^]]]]]]aaaiiiuuuuuuiiiaaa\\\ZZZYYY[[[\\\\\\YYYUUUPPPKKKGGGDDDBBBCCCEEEGGGKKKNNNPPPRRRRRRSSSSSSUUUYYYaaalllzzz}}}qqqfff\\\VVVSSSSSSVVV[[[^^^``````]]]XXXTTTPPPLLLJJJJJJLLLMMMQQQSSSTTTUUUTTTRRRQQQQQQSSSZZZcccooo}}}}}}rrrggg]]]TTTMMMJJJJJJMMMSSS[[[bbbfffhhhfffccc___[[[YYYWWWXXX[[[]]]aaacccdddccc___ZZZUUUQQQOOOSSSYYYbbbmmmyyy{{{nnnddd[[[SSSKKKFFFBBBAAADDDKKKSSS^^^gggmmmqqqqqqooollliiiggggggiiimmmrrrvvvyyyzzzwwwpppggg]]]TTTNNNMMMPPPVVV^^^gggooovvv|||}}}~~~zzzkkkaaa```ffftttssseeeXXXOOOHHHCCC???>>>>>>@@@EEENNNYYYeeeooowww|||}}}|||{{{xxxwwwxxx{{{uuugggZZZOOOKKKKKKNNNSSSZZZ___dddffffffggghhhjjjnnnuuu~~~}}}iiiXXXMMMLLLUUUfff|||qqqaaaTTTIIIAAA=========AAAEEEJJJQQQ[[[fffrrr}}}qqqaaaTTTMMMKKKMMMQQQVVVZZZ]]]]]]YYYVVVTTTRRRUUU\\\iiiyyyyyyeeeUUUKKKKKKUUUhhh~~~pppaaaSSSHHH@@@<<<===CCCJJJTTT^^^fffnnnwww|||kkk\\\UUUSSSUUUZZZ___bbbdddbbb[[[TTTNNNIIIHHHMMMXXXgggyyyzzziii\\\TTTUUU```tttzzzkkk]]]QQQGGG???<<<<<<DDDRRRbbbssswwwiiiaaa```dddiiippptttvvvpppggg\\\QQQGGGBBBCCCKKKWWWeeessssssiiidddfffrrr}}}hhhYYYMMMDDD===:::;;;AAAPPPeee}}}wwwppppppuuu}}}xxxiiiYYYKKKBBB???CCCJJJTTT^^^hhhnnnrrrvvvxxxzzz}}}~~~|||}}}zzzooogggbbbdddlllyyyyyyvvvzzzoooYYYKKK@@@:::777888>>>HHH\\\wwwwwwcccQQQEEE>>>???CCCIIIOOOVVVYYYZZZYYYXXXVVVWWWZZZ```hhhrrr}}}}}}|||}}}mmm___SSSMMMNNNVVVddduuu~~~eeePPPBBB:::666666:::CCCOOOfffmmmXXXJJJAAA@@@CCCHHHMMMQQQSSSQQQMMMHHHDDDBBBCCCIIIRRR^^^kkkzzznnn^^^PPPHHHGGGNNNZZZiiizzz{{{^^^JJJ>>>888777:::AAAKKKXXXooowwwbbbRRRJJJHHHLLLQQQWWW[[[\\\XXXQQQIII@@@;;;999===EEEOOO\\\iiixxxooo___TTTQQQSSSYYYaaammmxxxsssYYYGGG===:::<<<BBBKKKWWWdddxxxnnn^^^VVVVVV\\\bbbjjjooonnniii___SSSFFF===888999===EEENNNYYYfffssszzzmmmeee```]]]]]]___dddmmm{{{mmmWWWHHHAAA@@@EEENNNXXXeeeqqq|||mmmfffhhhoooxxx~~~qqqbbbRRREEE<<<999;;;>>>DDDMMMWWWbbbrrr~~~rrrfff\\\VVVTTTZZZiiiiiiWWWLLLGGGJJJQQQ\\\hhhuuu~~~xxx{{{rrr___OOOCCC>>>======AAAGGGNNNXXXgggyyyrrraaaSSSLLLOOO___zzzyyyhhh[[[TTTRRRWWW```mmmzzzkkkYYYLLLEEECCCCCCFFFKKKQQQZZZfffuuunnn]]]RRRTTTaaa{{{|||qqqnnntttsssiiiccc```bbbjjjvvvzzzgggXXXRRRQQQRRRVVV\\\bbbhhhpppyyywwwtttvvvuuujjjiiittt|||jjj___]]]eeetttxxxsssooommmnnnqqqvvvwwwiiiccccccgggmmmtttzzz}}}{{{ssslllfffdddhhhqqq}}}lll[[[QQQPPPZZZkkk|||rrrkkkiiijjjnnnttt{{{{{{uuuwww}}}zzzuuuooohhhaaa[[[VVVWWW[[[dddqqqtttaaaRRRKKKKKKUUUggg|||xxxkkkccc___aaahhhrrr}}}}}}ssskkkddd\\\UUUPPPLLLNNNRRRZZZfffvvv{{{lll```UUUQQQSSS\\\lll~~~}}}{{{|||xxxmmmddd```___dddooo}}}~~~tttllleee\\\UUUOOOJJJKKKNNNUUU___mmmzzz}}}vvvnnniiieeeccccccgggnnnzzz{{{zzz{{{~~~|||ssslllgggdddeeehhhqqq|||vvvooofff]]]VVVOOOMMMNNNRRRYYYdddnnnzzzyyyllldddaaaccchhhnnnuuu|||~~~|||{{{|||qqqiiieeedddfffjjjpppxxxvvvkkkaaaXXXSSSQQQRRRVVV\\\cccllluuu}}}tttooonnnrrr}}}ppp```UUUPPPRRR[[[jjjzzzpppaaa\\\\\\aaaiiittt{{{nnncccZZZVVVTTTTTTWWW[[[aaaiiitttsssggg]]]VVVUUUZZZgggyyypppaaaSSSJJJHHHNNN[[[oooxxxfffZZZXXX[[[eeerrrzzzlllaaa[[[XXXWWWXXXZZZ___eeemmmyyy{{{lll___SSSKKKIIIMMMZZZkkk~~~yyymmmbbbXXXRRRRRRYYYgggzzz}}}zzzxxxwwwzzzssshhh```bbbhhhuuutttggg```]]]]]]```ccchhhmmmrrrzzzxxxkkk^^^UUUQQQRRRZZZfffttt{{{tttoookkkjjjlllrrr|||zzzvvvrrrqqqqqquuu|||zzzvvvrrrqqqsssyyyzzzlllfffeeeiiiooouuu|||yyyoooiiifffeeegggkkkpppwwwyyytttpppooopppuuu}}}xxxllldddccceeellluuurrrlllnnnvvv}}}uuuqqqppprrrvvv{{{vvvmmmddd______fffvvv|||wwwtttsssuuuzzzsss```QQQJJJMMMWWWgggyyy{{{vvvyyyyyyjjj```ZZZWWWVVVVVVXXX[[[___eeemmmvvvsssaaaTTTMMMRRRddd~~~~~~~~~~~~}}}}}}}}}gggUUUGGGAAAFFFSSSggg}}}xxxgggZZZQQQKKKEEEBBBAAABBBDDDKKKTTT___mmmyyyxxxbbbQQQHHHKKK^^^{{{~~~~~~uuuggg[[[SSSPPPVVVaaaqqq{{{lllaaaWWWOOOGGG@@@<<<;;;<<<BBBJJJTTTaaammmyyy|||jjj[[[TTTWWWhhhxxxsssooonnnmmmnnnqqquuuzzzxxxpppggg^^^TTTKKKDDD???>>>AAAGGGPPPZZZdddnnnyyyvvvooolllqqq~~~rrrfff```dddlllwww}}}ttthhh\\\RRRJJJFFFGGGJJJOOOVVV^^^fffoooyyynnn[[[OOOMMMWWWhhh}}}ooocccXXXRRRPPPPPPRRRUUUZZZ___fffnnnxxxrrr^^^LLLBBBBBBOOOeee~~~qqqeee]]]YYYVVVUUUUUUWWW[[[___fffnnnxxxrrraaaQQQCCC<<<>>>KKK```zzzuuullleee```[[[XXXWWWXXX[[[___fffmmmwww}}}{{{{{{|||}}}{{{ooofff[[[OOOFFF???<<<???JJJ[[[ooo}}}tttllleee^^^ZZZXXXXXXZZZ^^^dddlllttt{{{vvvyyy|||sssmmmfffbbb___```eeennnzzzoooaaaUUUMMMGGGAAA???>>>???DDDLLLXXXffftttzzzoooeee^^^YYYVVVWWWXXX\\\aaahhhqqq~~~|||lll___YYY[[[dddpppzzznnncccXXXOOOJJJIIINNN[[[lll~~~ppp___QQQEEE???<<<;;;===@@@EEEKKKPPPXXXaaakkkvvv{{{nnnccc\\\WWWUUUTTTUUUYYY^^^fffqqqnnn\\\NNNFFFHHHPPP]]]lll|||vvvgggVVVHHH???<<<BBBPPPdddyyy}}}yyyjjj\\\PPPGGGCCCAAAAAACCCGGGLLLRRRWWW^^^fffoooyyyvvviii```YYYUUURRRQQQSSSVVV\\\gggtttlll[[[OOOGGGHHHOOOZZZhhhvvvxxx```KKK===666;;;KKK```xxx}}}{{{yyy{{{yyyrrrlllgggbbb^^^[[[XXXUUUTTTSSSUUUZZZ```iiitttqqqfff]]]WWWRRRNNNNNNPPPSSS\\\gggtttuuujjjbbb]]]]]]aaahhhqqqzzzqqqUUU@@@555888III___yyy|||yyyxxxxxx|||uuummmkkkmmmrrrxxx~~~~~~yyyqqqjjjdddbbbeeelllxxxzzzlllbbbZZZSSSNNNKKKJJJLLLRRRZZZeeeoooxxx~~~}}}~~~bbbGGG999;;;JJJ```{{{zzzwwwxxxzzzooobbb\\\```kkk{{{vvvpppqqqzzzuuujjj```WWWOOOKKKHHHGGGKKKQQQYYYbbbhhhlllkkkhhhccc```___cccooopppRRRBBBAAANNNbbb{{{~~~zzz{{{}}}uuucccWWWTTT\\\mmm~~~~~~tttiii^^^UUUNNNJJJGGGIIINNNUUU\\\```bbb___YYYPPPJJJGGGJJJWWWnnnbbbQQQNNNWWWeeexxxqqqddd\\\[[[dddtttvvvjjj___WWWPPPMMMOOOTTTZZZaaaeeegggbbbZZZOOOGGGAAABBBNNNbbb~~~zzzkkkeeefffkkksss{{{yyytttpppnnnpppwww}}}oooddd]]]YYY\\\bbbjjjrrrwwwxxxrrriii]]]RRRIIIHHHNNN\\\oooxxxrrrnnnkkkjjjiiijjjlllooouuu}}}vvvpppppptttzzzvvvllliiimmmuuurrreeeZZZTTTTTTYYYaaakkkwwwxxxiii[[[SSSQQQSSSYYYaaalllyyy~~~mmmaaa^^^dddqqq}}}zzz{{{mmmddd^^^ZZZWWWVVVYYY___jjj~~~|||eeeRRREEEAAADDDMMMXXXgggwwwrrraaaWWWVVVaaasss}}}qqqggg]]]RRRJJJEEEFFFPPPeee{{{dddOOOBBB>>>AAAKKKXXXhhhxxxqqqeee______jjjzzz{{{pppbbbTTTHHH@@@>>>DDDWWWsssxxxcccRRRGGGDDDGGGPPP]]]lll|||~~~yyyvvvuuuvvv}}}zzzkkk[[[MMMCCC>>>AAANNNccc{{{sssdddWWWOOONNNQQQZZZeeerrr{{{xxxuuurrrqqqrrrtttyyyvvvfffXXXMMMFFFEEEJJJUUUcccsss~~~~~~~~~qqqeee]]]WWWWWW[[[bbbmmmxxx|||rrrhhh```[[[WWWTTTTTTTTTVVV[[[dddqqqtttfffZZZQQQMMMKKKMMMPPPWWW```mmm~~~uuuooojjjhhhiiinnnuuu}}}ttthhh```[[[[[[___fffqqq|||xxxkkk___TTTKKKFFFBBBAAABBBDDDJJJQQQ]]]nnnsssggg]]]VVVPPPKKKHHHHHHLLLVVVggguuujjjaaa[[[XXXZZZaaakkkwww|||mmmaaaXXXWWW[[[dddqqq}}}tttiii]]]SSSJJJCCC@@@???AAAEEEJJJQQQYYYdddssswwwlllddd[[[SSSLLLIIIIIIOOO]]]sssuuuiii^^^UUUOOOMMMPPPXXXeeerrrrrr___RRROOOTTT^^^mmm}}}xxxlllcccZZZRRRLLLGGGDDDDDDFFFLLLTTT\\\eeemmmuuu~~~vvvmmmcccZZZTTTPPPRRRZZZgggyyyyyyooodddYYYPPPIIIEEEDDDHHHRRR```nnn|||yyy___MMMGGGLLLXXXjjj}}}ssseeeZZZSSSMMMJJJIIIIIIKKKNNNTTT^^^iiisss}}}vvvlllddd]]][[[[[[___dddmmmuuuxxxnnnddd\\\RRRKKKEEE@@@>>>???EEEPPP^^^lll{{{aaaKKKCCCIIIVVViii~~~qqqaaaTTTKKKEEECCCEEEHHHNNNSSSYYYbbbooo|||uuulllfff```ZZZUUUSSSSSSYYYeeezzzyyymmmcccZZZSSSLLLFFFAAA>>>======@@@GGGRRRaaappphhhQQQIIINNNZZZnnnssscccUUUHHHAAA===>>>CCCJJJSSS[[[cccmmmyyyxxxpppfff[[[OOOGGGBBBDDDNNNddduuuiii___VVVPPPKKKFFFBBB@@@???@@@CCCGGGOOO\\\kkkzzzsss^^^WWW\\\hhhzzzsssdddVVVJJJ@@@;;;:::===EEEOOOZZZdddllluuu~~~{{{ooobbbTTTIIIAAA???GGGXXXpppvvvjjj```XXXRRRMMMJJJHHHFFFGGGIIILLLQQQWWWaaaoooqqqkkkpppzzz}}}nnnaaaTTTJJJAAA:::888999@@@KKKWWWdddpppwww}}}{{{mmm___SSSIIIEEEHHHQQQ```rrr{{{lllccc\\\UUURRROOONNNOOOPPPSSSXXX^^^fffnnnzzz|||kkk]]]RRRHHHAAA;;;888888<<<FFFSSSbbbppp||||||nnnbbbWWWPPPNNNOOOSSSZZZcccmmmxxx~~~pppeee___ZZZVVVUUUUUUVVVYYY]]]dddkkksss}}}ooo```TTTKKKCCC>>>;;;999<<<AAANNN]]]mmm}}}~~~|||~~~}}}qqqfff]]]VVVQQQLLLIIIIIIMMMVVVhhh}}}rrrhhhaaa]]]ZZZYYY[[[]]]aaafffllluuu~~~}}}nnnbbbYYYQQQJJJEEEAAA@@@CCCIIIWWWgggyyy~~~rrrggg^^^TTTJJJBBB======EEEXXXsss|||rrriiiccc^^^\\\\\\]]]bbbffflllsss{{{zzztttnnnggg___WWWQQQMMMNNNTTTbbbtttssshhh\\\OOODDD<<<:::???QQQlll{{{ssskkkddd___\\\]]]```eeelllsss|||{{{pppeee]]]\\\aaappptttgggYYYLLLCCC???BBBRRRjjj{{{wwwrrrlllfffaaa^^^]]]```fffnnnxxxxxxooopppwww~~~ssslllhhhffffffhhhkkkpppyyy{{{ppplllqqqtttfffYYYNNNHHHJJJVVVjjjxxxpppllljjjiiikkklllmmmmmmkkkgggccc```___```fffnnnyyylll______eeepppsssdddXXXRRROOOOOORRRVVV]]]eeettt~~~uuuggg[[[TTTTTT]]]lllrrrggg\\\TTTQQQQQQSSSXXX]]]bbbdddeeedddbbbaaacccfffmmmxxxooobbb```eeeooo~~~{{{lll___VVVQQQNNNNNNPPPTTT[[[dddrrrwwwjjjbbb___eeeooo~~~yyynnnaaaWWWNNNGGGEEEEEEHHHMMMSSSYYY]]]___aaabbbeeeiiinnnwww~~~sssqqquuu~~~~~~wwwqqqmmmiiifffbbb```___```ccciiittt~~~uuupppppptttzzztttiii___VVVOOOHHHCCCBBBBBBCCCGGGLLLQQQVVVZZZ___dddjjjrrrzzz}}}uuupppmmmnnnrrrxxx~~~{{{wwwsssqqqsssxxx~~~zzzxxxwwwwww{{{rrrddd[[[TTTOOOKKKIIIFFFFFFEEEDDDFFFHHHKKKQQQWWW___hhhrrr}}}|||ssshhh```XXXSSSQQQSSS]]]kkk{{{xxxooojjjhhhmmmwwwvvvdddWWWPPPLLLKKKLLLMMMNNNNNNLLLIIIHHHHHHIIINNNVVVaaannn|||nnn```WWWNNNGGGBBB@@@AAAGGGUUUiii|||oooddd___bbbmmm}}}lll[[[OOOIIIHHHLLLPPPUUUXXXYYYVVVQQQMMMKKKJJJOOOXXXeeeuuu~~~ooo]]]QQQJJJDDDBBB@@@BBBFFFMMM[[[mmmwwwjjjcccccckkkxxxvvvdddUUUJJJHHHJJJQQQZZZaaafffgggddd]]]WWWRRROOOSSS]]]mmmxxxssstttzzzzzzlll^^^QQQIIIFFFFFFIIIMMMSSSZZZaaakkkxxxyyypppmmmpppvvv{{{kkk\\\QQQJJJKKKRRR]]]iiissszzz|||wwwnnneee]]]YYY\\\fffxxx~~~ppphhhfffhhhkkknnnpppoooiiiaaaYYYPPPHHHEEEHHHNNNWWWaaalllvvv}}}}}}yyyxxxyyy{{{yyynnnbbbWWWPPPMMMRRR\\\kkk{{{vvvllleeefffqqq|||tttnnnjjjiiilllpppvvv}}}wwwhhh___ZZZYYYXXXYYYZZZXXXTTTPPPKKKGGGDDDFFFMMMXXXhhhwww}}}xxxsssppprrrwwwvvvjjjbbb___```dddiiimmmqqqpppllleee]]]VVVRRRRRRZZZiiizzz|||ssssss~~~uuuiii```ZZZXXXZZZ^^^eeemmmwwwooo```WWWRRRQQQPPPPPPQQQPPPMMMJJJGGGEEEEEEIIISSSbbbuuu|||ssslllkkknnnttt~~~|||mmm```TTTLLLJJJMMMSSS[[[ccciiikkkiiiddd___ZZZXXXZZZdddtttuuueeeWWWNNNLLLOOOVVV___kkkwww|||ssscccWWWPPPNNNPPPSSSVVVZZZZZZXXXUUUPPPMMMLLLPPPZZZkkkwwwsssrrrtttyyy~~~|||ooobbbVVVLLLFFFFFFKKKTTT___hhhppptttsssnnniiidddccceeeppp{{{dddQQQEEECCCHHHSSSaaaqqquuummmiiilllttt}}}}}}pppbbbUUULLLJJJMMMUUU^^^gggooorrrpppjjjccc]]]YYYZZZdddvvv{{{wwwvvvwww|||yyynnneee[[[SSSMMMKKKMMMUUU```mmmxxxzzzuuurrrttt~~~gggOOO@@@>>>FFFTTTfff{{{{{{tttlllddd^^^ZZZXXXZZZaaagggnnnrrrtttpppggg]]]QQQIIICCCFFFOOO]]]nnn}}}zzzpppiiihhhpppxxxooojjjlllwwwtttkkkccc]]]XXXUUUTTTUUUZZZeeerrrlllQQQAAA>>>GGGXXXllluuummmgggaaa\\\WWWSSSOOOLLLJJJJJJJJJLLLQQQWWW\\\___```^^^WWWOOOFFFAAA???EEETTThhh~~~zzzwww~~~xxxhhh______jjj~~~qqqggg___ZZZXXXWWWXXX\\\aaahhhuuuuuuYYYHHHEEELLL[[[mmm~~~rrrfff\\\TTTMMMHHHCCC@@@>>>>>>>>>@@@AAADDDJJJOOOTTTWWWYYYXXXRRRKKKEEEAAABBBJJJ\\\rrrtttbbbWWWTTT___uuuqqqfff\\\WWWSSSTTTWWW[[[aaaiiisssjjjYYYTTTWWW```kkkyyyssshhh^^^TTTLLLEEE@@@<<<:::888888999<<<>>>BBBIIIPPPVVV[[[^^^^^^YYYSSSMMMJJJLLLUUUhhhlllZZZNNNKKKTTTggg}}}qqqeee[[[SSSPPPOOORRRWWW]]]gggppp|||qqqjjjffffffhhhlllqqqxxxyyyqqqhhhaaaYYYQQQJJJDDD@@@===;;;999999999;;;???EEEMMMVVV___gggkkklllhhhbbb]]]ZZZ[[[eeexxxtttaaaRRRGGGDDDJJJXXXmmmzzztttkkkbbbXXXQQQLLLKKKLLLQQQYYYaaammmxxxxxxnnneee___\\\^^^cccnnnzzzyyyrrrllliiigggdddccc___\\\WWWRRRMMMIIIFFFDDDAAA>>>===<<<>>>BBBJJJTTTaaammmvvv}}}~~~{{{uuuppplllnnnwwwvvvhhhYYYLLLCCC@@@CCCKKKXXXhhhwwwwwwqqqmmmkkkiiigggeeeaaa\\\UUUOOOJJJGGGIIILLLSSS]]]gggtttwwweeeWWWLLLJJJMMMVVVbbbqqqtttcccUUUNNNKKKMMMPPPTTTWWWXXXXXXVVVTTTRRRPPPNNNMMMJJJFFFCCCBBBCCCHHHQQQ]]]lll{{{{{{ooobbbVVVLLLDDD???@@@CCCIIIRRR[[[eeeppp~~~mmm]]]RRRLLLLLLNNNRRRUUUWWWWWWTTTPPPKKKHHHFFFJJJOOOXXXdddppp~~~jjjUUUFFFAAACCCLLLXXXgggwwwyyyzzztttaaaOOOAAA<<<;;;>>>DDDJJJPPPSSSUUUVVVVVVVVVVVVVVVVVVSSSNNNKKKIIIJJJOOOYYYgggxxxuuuiii]]]SSSJJJDDDBBBAAACCCGGGLLLRRR[[[iiiyyynnnZZZIII>>>:::===CCCKKKRRRWWWYYYWWWSSSOOOLLLKKKOOOVVVaaannn|||sssZZZGGG@@@BBBLLLZZZjjj|||uuuoooooouuu|||tttdddSSSEEE:::666555999>>>DDDJJJNNNRRRVVVZZZ]]]```bbbbbb___ZZZVVVSSSSSSYYYeeettt}}}ooocccWWWOOOIIIEEECCCCCCEEEHHHNNNXXXfffuuuuuuaaaNNN???666555<<<FFFRRR\\\dddhhhfffaaa\\\WWWUUUYYYaaannn}}}~~~bbbMMMEEEGGGRRRbbbuuuyyyrrrlllhhhgggjjjmmmpppqqqooojjjbbbVVVKKKAAA:::777666999===BBBGGGLLLQQQYYY___ffflllpppqqqmmmiiiccc```___eeerrrxxxiii]]]UUUNNNIIIEEECCCCCCEEELLLUUU```kkktttyyy|||~~~}}}|||||||||}}}wwwhhhWWWGGG<<<666999CCCQQQaaaooozzz~~~|||uuunnngggdddfffooolllVVVMMMPPP[[[lll{{{pppiiifffeeedddddddddcccbbbbbbaaa```^^^\\\XXXTTTMMMGGGBBB>>>===<<<>>>@@@CCCGGGLLLRRR\\\fffqqqyyy~~~yyyrrrnnnmmmsss}}}nnncccZZZRRRKKKFFFBBBBBBDDDIIIOOOVVV]]]aaadddhhhjjjllloooppprrruuuvvvxxxxxxwwwsssjjj^^^QQQEEE===;;;AAAOOOaaatttyyytttvvvwwwaaaVVVYYYcccsssmmm]]]QQQLLLLLLOOOTTTZZZ^^^^^^]]]\\\YYYVVVSSSQQQNNNMMMJJJHHHFFFEEEEEEDDDDDDDDDGGGJJJOOOVVVcccooo|||}}}|||ttthhh]]]TTTLLLFFFBBBBBBCCCGGGKKKOOORRRVVV[[[```dddiiilllnnnppppppppppppnnnkkkcccZZZPPPFFFAAABBBJJJ[[[ooolll``````gggsss~~~sss___NNNCCC>>>@@@DDDKKKRRRXXXYYYYYYZZZXXXVVVTTTSSSQQQQQQOOONNNMMMMMMMMMLLLKKKKKKMMMPPPUUU^^^lllzzzzzzlll```UUULLLGGGFFFFFFIIIMMMQQQTTTXXX]]]ccchhhnnnqqqssstttssssssqqqooollleee]]]SSSKKKHHHJJJTTTeee{{{zzzmmmiiihhhlllqqqzzz{{{sssqqqtttzzzxxxhhhXXXIII@@@<<<===@@@FFFLLLRRRTTTWWWZZZ\\\]]]^^^```___^^^]]]ZZZYYYWWWWWWVVVUUUUUUVVVYYY___iiiyyyqqqcccYYYRRRQQQRRRVVV[[[```cccgggmmmrrrwww|||~~~{{{xxxuuunnnfff]]]VVVSSSUUU```qqq|||rrrjjjccc``````dddnnnwwwpppjjjeeeeeehhhnnntttzzz~~~}}}xxxnnnbbbVVVKKKDDD@@@@@@BBBDDDHHHMMMPPPUUU]]]cccjjjooossstttrrroookkkhhheeedddcccaaaaaabbbeeelllwwwuuuhhhbbbaaadddiiipppvvvzzz~~~|||tttllldddbbbdddnnn~~~nnn___SSSLLLKKKSSSfff~~~yyykkkaaa]]]\\\]]]___aaabbbaaa___]]][[[ZZZYYY[[[^^^ccchhhmmmqqqpppmmmggg```YYYQQQMMMJJJHHHFFFFFFGGGJJJOOOVVVbbbnnnyyy~~~yyyuuusssqqqpppoooppptttzzzyyyssssssxxx|||uuurrrttt}}}xxxcccQQQEEE@@@FFFWWWooowwwbbbRRRGGGBBB@@@@@@BBBDDDFFFGGGHHHIIIKKKNNNPPPTTTWWW]]]bbbgggkkklllkkkhhhccc___ZZZWWWTTTQQQMMMJJJJJJLLLQQQZZZiiiyyy~~~tttaaaRRRJJJMMMYYYkkk~~~jjjWWWGGG===888555444666777999:::<<<???BBBFFFIIINNNTTT\\\cccjjjpppssssssqqqnnnkkkgggdddaaa]]]WWWSSSPPPRRRWWWcccttt}}}mmmcccaaafffnnnxxx}}}nnn```QQQEEE===999666444444444555666777999<<<@@@DDDKKKTTT___jjjuuu}}}}}}yyyvvvrrrmmmeee___\\\\\\bbbooo|||xxxvvvuuuvvvvvvwwwyyy|||~~~yyyuuuooohhh```XXXQQQJJJEEEAAA===:::999777777777777888:::===BBBJJJVVVeeetttvvvnnnjjjiiiooo}}}uuullleeeccceeeiiipppvvv{{{|||yyyvvvpppjjjccc___\\\YYYWWWVVVTTTRRRPPPLLLIIIEEEBBB???======<<<;;;;;;>>>CCCLLL[[[mmm~~~xxxwww|||yyyiii^^^YYY[[[```hhhpppvvvxxxuuupppiiibbb[[[WWWUUUUUUVVVYYY[[[[[[[[[XXXTTTPPPLLLHHHFFFEEECCCAAAAAACCCHHHRRRbbbvvvnnnaaaZZZ\\\aaajjjssszzz}}}zzzvvvoooiiibbb___^^^^^^aaadddggghhhhhhfffbbb^^^ZZZVVVSSSRRROOOLLLKKKLLLQQQ[[[lllzzzkkkdddeeekkkttt}}}~~~yyytttqqqqqqqqqsssvvvxxxyyyyyywwwssspppllliiifffddd```\\\ZZZ[[[___iiizzzzzzssstttyyy~~~{{{xxxsssooolllllloooxxx~~~}}} \ No newline at end of file
diff --git a/nix/flake.nix b/nix/flake.nix
index 582beda..b9f443a 100644
--- a/nix/flake.nix
+++ b/nix/flake.nix
@@ -20,7 +20,7 @@
gnumake
gtkwave
pkg-config
- (python39.withPackages (py: [ py.numpy py.pillow ]))
+ (python39.withPackages (py: [ py.numpy py.pillow py.matplotlib ]))
(quartus-prime-lite.override { supportedDevices = [ "Cyclone V" ]; })
verilator
];
diff --git a/platform.qsys b/platform.qsys
index 30158b8..7e92b3e 100644
--- a/platform.qsys
+++ b/platform.qsys
@@ -17,6 +17,14 @@
type = "int";
}
}
+ element buttons
+ {
+ datum _sortIndex
+ {
+ value = "17";
+ type = "int";
+ }
+ }
element clk_0
{
datum _sortIndex
@@ -134,6 +142,14 @@
type = "int";
}
}
+ element switches
+ {
+ datum _sortIndex
+ {
+ value = "16";
+ type = "int";
+ }
+ }
element sys_sdram_pll_0
{
datum _sortIndex
@@ -200,6 +216,11 @@
<parameter name="timeStamp" value="0" />
<parameter name="useTestBenchNamingPattern" value="false" />
<instanceScript></instanceScript>
+ <interface
+ name="buttons_external_connection"
+ internal="buttons.external_connection"
+ type="conduit"
+ dir="end" />
<interface name="clk" internal="clk_0.clk_in" type="clock" dir="end" />
<interface name="master_0_conduit_end" internal="master_0.conduit_end" />
<interface
@@ -217,6 +238,11 @@
<interface name="pll_0_reset" internal="pll_0.reset" type="reset" dir="end" />
<interface name="reset" internal="clk_0.clk_in_reset" type="reset" dir="end" />
<interface
+ name="switches_external_connection"
+ internal="switches.external_connection"
+ type="conduit"
+ dir="end" />
+ <interface
name="sys_sdram_pll_0_sdram_clk"
internal="sys_sdram_pll_0.sdram_clk"
type="clock"
@@ -241,6 +267,20 @@
<parameter name="SLAVE_ADDRESS_WIDTH" value="27" />
<parameter name="SUB_WINDOW_COUNT" value="1" />
</module>
+ <module name="buttons" kind="altera_avalon_pio" version="20.1" enabled="1">
+ <parameter name="bitClearingEdgeCapReg" value="false" />
+ <parameter name="bitModifyingOutReg" value="false" />
+ <parameter name="captureEdge" value="false" />
+ <parameter name="clockRate" value="50000000" />
+ <parameter name="direction" value="Input" />
+ <parameter name="edgeType" value="RISING" />
+ <parameter name="generateIRQ" value="false" />
+ <parameter name="irqType" value="LEVEL" />
+ <parameter name="resetValue" value="0" />
+ <parameter name="simDoTestBenchWiring" value="false" />
+ <parameter name="simDrivenValue" value="0" />
+ <parameter name="width" value="8" />
+ </module>
<module name="clk_0" kind="clock_source" version="20.1" enabled="1">
<parameter name="clockFrequency" value="50000000" />
<parameter name="clockFrequencyKnown" value="true" />
@@ -1070,6 +1110,20 @@
<parameter name="gui_switchover_mode">Automatic Switchover</parameter>
<parameter name="gui_use_locked" value="false" />
</module>
+ <module name="switches" kind="altera_avalon_pio" version="20.1" enabled="1">
+ <parameter name="bitClearingEdgeCapReg" value="false" />
+ <parameter name="bitModifyingOutReg" value="false" />
+ <parameter name="captureEdge" value="false" />
+ <parameter name="clockRate" value="50000000" />
+ <parameter name="direction" value="Input" />
+ <parameter name="edgeType" value="RISING" />
+ <parameter name="generateIRQ" value="false" />
+ <parameter name="irqType" value="LEVEL" />
+ <parameter name="resetValue" value="0" />
+ <parameter name="simDoTestBenchWiring" value="false" />
+ <parameter name="simDrivenValue" value="0" />
+ <parameter name="width" value="8" />
+ </module>
<module
name="sys_sdram_pll_0"
kind="altera_up_avalon_sys_sdram_pll"
@@ -1213,6 +1267,24 @@
kind="avalon"
version="20.1"
start="master_0.avalon_master_1_1"
+ end="switches.s1">
+ <parameter name="arbitrationPriority" value="1" />
+ <parameter name="baseAddress" value="0x30060000" />
+ <parameter name="defaultConnection" value="false" />
+ </connection>
+ <connection
+ kind="avalon"
+ version="20.1"
+ start="master_0.avalon_master_1_1"
+ end="buttons.s1">
+ <parameter name="arbitrationPriority" value="1" />
+ <parameter name="baseAddress" value="0x30050000" />
+ <parameter name="defaultConnection" value="false" />
+ </connection>
+ <connection
+ kind="avalon"
+ version="20.1"
+ start="master_0.avalon_master_1_1"
end="address_span_extender_0.windowed_slave">
<parameter name="arbitrationPriority" value="1" />
<parameter name="baseAddress" value="0x0000" />
@@ -1282,6 +1354,20 @@
kind="avalon"
version="20.1"
start="jtag_dbg.master"
+ end="switches.s1">
+ <parameter name="arbitrationPriority" value="1" />
+ <parameter name="baseAddress" value="0x30060000" />
+ <parameter name="defaultConnection" value="false" />
+ </connection>
+ <connection kind="avalon" version="20.1" start="jtag_dbg.master" end="buttons.s1">
+ <parameter name="arbitrationPriority" value="1" />
+ <parameter name="baseAddress" value="0x30050000" />
+ <parameter name="defaultConnection" value="false" />
+ </connection>
+ <connection
+ kind="avalon"
+ version="20.1"
+ start="jtag_dbg.master"
end="address_span_extender_0.windowed_slave">
<parameter name="arbitrationPriority" value="1" />
<parameter name="baseAddress" value="0x0000" />
@@ -1321,6 +1407,8 @@
<connection kind="clock" version="20.1" start="pll_0.outclk0" end="timer_0.clk" />
<connection kind="clock" version="20.1" start="pll_0.outclk0" end="pio_0.clk" />
<connection kind="clock" version="20.1" start="pll_0.outclk0" end="jtag_dbg.clk" />
+ <connection kind="clock" version="20.1" start="pll_0.outclk0" end="switches.clk" />
+ <connection kind="clock" version="20.1" start="pll_0.outclk0" end="buttons.clk" />
<connection
kind="clock"
version="20.1"
@@ -1397,6 +1485,16 @@
kind="reset"
version="20.1"
start="clk_0.clk_reset"
+ end="switches.reset" />
+ <connection
+ kind="reset"
+ version="20.1"
+ start="clk_0.clk_reset"
+ end="buttons.reset" />
+ <connection
+ kind="reset"
+ version="20.1"
+ start="clk_0.clk_reset"
end="master_0.reset_sink" />
<connection
kind="reset"
diff --git a/rtl/top/conspiracion.sv b/rtl/top/conspiracion.sv
index 62e71b3..c3ffb93 100644
--- a/rtl/top/conspiracion.sv
+++ b/rtl/top/conspiracion.sv
@@ -30,6 +30,8 @@ module conspiracion
output wire vram_wire_ras_n,
output wire vram_wire_we_n,
output wire [7:0] pio_leds,
+ input wire pio_buttons,
+ input wire [5:0] pio_switches,
output wire vga_dac_clk,
output wire vga_dac_hsync,
output wire vga_dac_vsync,
@@ -40,6 +42,7 @@ module conspiracion
output wire [7:0] vga_dac_b
);
+ logic button;
logic[3:0] data_be;
logic[29:0] addr;
logic[31:0] data_rd, data_wr;
@@ -49,6 +52,7 @@ module conspiracion
`ifdef VERILATOR
assign cpu_halt = halt;
assign reset_reset_n = rst_n;
+ assign button = pio_buttons;
`else
debounce reset_debounce
(
@@ -63,6 +67,13 @@ module conspiracion
.dirty(halt),
.clean(cpu_halt)
);
+
+ debounce button_debounce
+ (
+ .clk(clk_clk),
+ .dirty(pio_buttons),
+ .clean(button)
+ );
`endif
arm810 core
@@ -95,6 +106,9 @@ module conspiracion
.master_0_core_irq(irq),
.pll_0_reset_reset(0), //TODO: reset controller, algún día
.pio_0_external_connection_export(pio_leds),
+ .switches_external_connection_export({2'b00, pio_switches}),
+ //TODO: glitch rst
+ .buttons_external_connection_export({7'b0000000, !button}),
.sys_sdram_pll_0_sdram_clk_clk(vram_wire_clk),
.vga_dac_CLK(vga_dac_clk),
.vga_dac_HS(vga_dac_hsync),
diff --git a/tb/platform.sv b/tb/platform.sv
index 1e708cc..2dade78 100644
--- a/tb/platform.sv
+++ b/tb/platform.sv
@@ -28,6 +28,8 @@ module platform
output wire memory_mem_dm, // .mem_dm
input wire memory_oct_rzqin, // .oct_rzqin
output wire [7:0] pio_0_external_connection_export, // pio_0_external_connection.export
+ input wire [7:0] switches_external_connection_export, // pio_1_external_connection.export
+ input wire [7:0] buttons_external_connection_export, // pio_2_external_connection.export
input wire pll_0_reset_reset,
output wire sys_sdram_pll_0_sdram_clk_clk,
input wire reset_reset_n /*verilator public*/,// reset.reset_n
diff --git a/tb/sim/blank.S b/tb/sim/blank.S
new file mode 100644
index 0000000..ea8b6e5
--- /dev/null
+++ b/tb/sim/blank.S
@@ -0,0 +1,13 @@
+.global reset
+
+reset:
+ ldr r0, =0x38000000
+ ldr r1, =0xffffffff
+ ldr r2, =(640*480)
+
+ .loop:
+ str r1, [r0], #4
+ subs r2, r2, #1
+ bne .loop
+
+ mov pc, lr \ No newline at end of file
diff --git a/tb/sim/blank.py b/tb/sim/blank.py
new file mode 100644
index 0000000..8fda8b8
--- /dev/null
+++ b/tb/sim/blank.py
@@ -0,0 +1,2 @@
+def final():
+ pass \ No newline at end of file
diff --git a/tb/sim/descifrador.S b/tb/sim/descifrador.S
new file mode 100644
index 0000000..84b529c
--- /dev/null
+++ b/tb/sim/descifrador.S
@@ -0,0 +1,72 @@
+.global reset
+reset:
+
+@ IO utilizado:
+@ 5 switches para la llave
+@ 1 switch de selección de algoritmo (xor o not)
+@ 1 botón de inicio
+
+.equ START_BUTTON, 0x30050000 @ Dirección de memoria del botón
+.equ KEY_SWITCHES, 0x30060000 @ Dirección de memoria de los switches
+.equ START, 0x00010000 @ Dirección de memoria de los pixeles
+.equ VRAM, 0x38000000
+
+@ Dirección inicial de lectura, contador y tamaño de la imagen
+ldr r1, =START
+ldr r11, =VRAM
+mov r7, #0x0
+ldr r8, =(640*480)
+
+init:
+ ldr r4, [r1], #4 @ Guarda en r4 el dato en la posición de memoria de start
+ str r4, [r11], #4 @ Vuelve a guardar en memoria ya modificado
+ add r7, r7, #1 @ Incrementa contador de tamaño de la imagen
+ cmp r7, r8 @ Compara contador con tamaño de la imagen 640 * 480
+ bne init
+
+ldr r1, =START
+ldr r11, =VRAM
+mov r7, #0x0
+
+@Esperar botón
+ldr r2, =START_BUTTON
+ldr r3, =KEY_SWITCHES
+
+idle:
+ ldr r5, [r2] @ Lee valor del botón
+ ldr r6, [r3] @ Lee valores de los switches
+ tst r5, #1 @ Si el botón de inicio es 1, se salta a start
+ beq idle
+
+@ Verificar el algoritmo seleccionado
+tst r6, #1 @ Si el valor es 1, se salta a xor, si es 0 a not
+bne xor
+
+@ Recorrer la memoria desde START y hacer not al valor en cada posicion
+@ y volverlo a guardar
+not:
+ @Procesar la mask
+ ldr r0, =0x00ffffff
+ b loop
+
+xor:
+@Procesar la llave
+ lsr r9, r6, #1
+ mov r0, r9
+ orr r0, r0, r9, lsl #8
+ orr r0, r0, r9, lsl #16
+
+loop:
+ ldr r4, [r1] @ Guarda en r4 el dato en la posición de memoria de start
+ eor r4, r4, r0 @ Hace XOR entre r4
+ str r4, [r1], #4 @ Vuelve a guardar en memoria ya modificado
+ add r7, r7, #1 @ Incrementa contador de tamaño de la imagen
+ cmp r7, r8 @ Compara contador con tamaño de la imagen 640 * 480
+ bne loop
+
+release:
+ ldr r5, [r2] @ Lee valor del botón
+ tst r5, #1 @ Si el botón de inicio es 1, se salta a start
+ bne release
+
+ b reset \ No newline at end of file
diff --git a/tb/sim/descifrador.py b/tb/sim/descifrador.py
new file mode 100644
index 0000000..8fda8b8
--- /dev/null
+++ b/tb/sim/descifrador.py
@@ -0,0 +1,2 @@
+def final():
+ pass \ No newline at end of file