diff options
| author | JulianCamacho <jjulian.341@gmail.com> | 2022-11-17 08:16:14 -0600 |
|---|---|---|
| committer | JulianCamacho <jjulian.341@gmail.com> | 2022-11-17 08:16:14 -0600 |
| commit | 61bf2100fbd5e0a5f4bd1f013d70d8027604bbba (patch) | |
| tree | f8dda309768c57d3cbce052baf7b094ff996374a | |
| parent | 268512c3f2c67bb72f0dab45b8112313fd585e2c (diff) | |
Bug fixes
Diffstat (limited to '')
| -rw-r--r-- | app/descifrador.s | 65 | ||||
| -rw-r--r-- | conspiracion.qsf | 9 | ||||
| -rw-r--r-- | doc/block_diagram.drawio | 120 | ||||
| -rw-r--r-- | hps/fpga.kermit | 2 | ||||
| -rw-r--r-- | image_processing/out_file | 1 | ||||
| -rw-r--r-- | nix/flake.nix | 2 | ||||
| -rw-r--r-- | platform.qsys | 98 | ||||
| -rw-r--r-- | rtl/top/conspiracion.sv | 14 | ||||
| -rw-r--r-- | tb/platform.sv | 2 | ||||
| -rw-r--r-- | tb/sim/blank.S | 13 | ||||
| -rw-r--r-- | tb/sim/blank.py | 2 | ||||
| -rw-r--r-- | tb/sim/descifrador.S | 72 | ||||
| -rw-r--r-- | tb/sim/descifrador.py | 2 |
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 |
