OpenCores
URL https://opencores.org/ocsvn/funbase_ip_library/funbase_ip_library/trunk

Subversion Repositories funbase_ip_library

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /funbase_ip_library
    from Rev 17 to Rev 18
    Reverse comparison

Rev 17 → Rev 18

/trunk/TUT/ip.hwp.storage/fifos/multi_clk/Testbenches/tb_mixed_clk_fifo_v3.vhd
0,0 → 1,229
-------------------------------------------------------------------------------
-- Title : Testbench for design "mixed_clk_fifo"
-- Project :
-------------------------------------------------------------------------------
-- File : tb_mixed_clk_fifo.vhd
-- Author : kulmala3
-- Created : 16.12.2005
-- Last update: 14.12.2006
-- Description:
-------------------------------------------------------------------------------
-- Copyright (c) 2005
-------------------------------------------------------------------------------
-- Revisions :
-- Date Version Author Description
-- 16.12.2005 1.0 AK Created
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_1164.all;
use work.txt_util.all;
 
-------------------------------------------------------------------------------
 
entity tb_mixed_clk_fifo is
 
end tb_mixed_clk_fifo;
 
-------------------------------------------------------------------------------
 
architecture rtl of tb_mixed_clk_fifo is
 
-- component generics
-- constant re_freq_g : integer := 1;
-- constant we_freq_g : integer := 3;
-- constant Period_re : time := 30 ns;
-- constant Period_we : time := 10 ns;
constant re_freq_g : integer := 2;
constant we_freq_g : integer := 1;
constant Period_re : time := 14 ns;
constant Period_we : time := 18 ns; -- HAS TO BE EVEN due to divide
constant re_faster_c : integer := 1;
 
constant depth_g : integer := 3;
constant data_width_g : integer := 4;
 
-- component ports
signal clk_re : std_logic;
signal clk_we : std_logic;
signal clk_ps_re : std_logic;
signal clk_ps_we : std_logic;
signal rst_n : std_logic;
signal data_to_dut : std_logic_vector (data_width_g-1 downto 0);
signal we_to_dut : std_logic;
signal full_from_dut : std_logic;
signal one_p_from_dut : std_logic;
signal re_to_dut : std_logic;
signal data_from_dut : std_logic_vector (data_width_g-1 downto 0);
signal empty_from_dut : std_logic;
signal one_d_from_dut : std_logic;
signal data_cnt_r : std_logic_vector(data_width_g-1 downto 0);
 
-- to create periods of not reading or not writing,
-- full and empty cases
constant write_phase_c : integer := 7;
constant read_phase_c : integer := 6;
signal read_phase_r : integer;
signal write_phase_r : integer;
signal int_re_r : std_logic;
signal int_we_r : std_logic;
begin -- rtl
 
-- component instantiation
DUT : entity work.mixed_clk_fifo
generic map (
re_faster_g => re_faster_c,
depth_g => depth_g,
data_width_g => data_width_g)
port map (
clk_re => clk_re,
clk_we => clk_we,
clk_ps_re => clk_ps_re,
clk_ps_we => clk_ps_we,
rst_n => rst_n,
data_in => data_to_dut,
we_in => we_to_dut,
full_out => full_from_dut,
one_p_out => one_p_from_dut,
re_in => re_to_dut,
data_out => data_from_dut,
empty_out => empty_from_dut,
one_d_out => one_d_from_dut
);
 
we_to_dut <= (not full_from_dut) and int_we_r;
 
wr : process (clk_we, rst_n)
begin -- process write
if rst_n = '0' then -- asynchronous reset (active low)
data_to_dut <= (others => '0');
write_phase_r <= 0;
int_we_r <= '0';
elsif clk_we'event and clk_we = '1' then -- rising clock edge
if we_to_dut = '1' then
if data_to_dut /= data_to_dut'high then
data_to_dut <= data_to_dut+1;
else
data_to_dut <= (others => '0');
end if;
else
data_to_dut <= data_to_dut;
end if;
 
if write_phase_r < write_phase_c then
write_phase_r <= write_phase_r+1;
int_we_r <= '1';
else
if write_phase_r < write_phase_c*2 then
int_we_r <= '0';
write_phase_r <= write_phase_r+1;
else
write_phase_r <= 0;
end if;
end if;
end if;
 
end process wr;
 
re_to_dut <= not empty_from_dut and int_re_r;
 
re : process (clk_re, rst_n)
begin -- process re
if rst_n = '0' then -- asynchronous reset (active low)
data_cnt_r <= conv_std_logic_vector(0, data_width_g);
read_phase_r <= 0;
int_re_r <= '1';
elsif clk_re'event and clk_re = '1' then -- rising clock edge
 
if re_to_dut = '1' then
assert data_cnt_r = data_from_dut report "wrong value read: " & str(data_from_dut) & "wait: " & str(data_cnt_r) severity error;
if data_cnt_r /= data_cnt_r'high then
data_cnt_r <= data_cnt_r+1;
else
data_cnt_r <= (others => '0');
end if;
else
data_cnt_r <= data_cnt_r;
end if;
 
if read_phase_r < read_phase_c then
int_re_r <= '1';
read_phase_r <= read_phase_r+1;
else
if read_phase_r < read_phase_c*2 then
int_re_r <= '0';
read_phase_r <= read_phase_r+1;
else
int_re_r <= '0';
read_phase_r <= 0;
end if;
end if;
end if;
end process re;
 
 
 
-- clock generation
-- PROC
CLOCK1 : process -- generate clock signal for design
variable clktmp : std_logic := '0';
begin
clktmp := not clktmp;
clk_re <= clktmp;
wait for Period_re/2;
end process CLOCK1;
 
CLOCK2 : process -- generate clock signal for design
variable clktmp : std_logic := '0';
begin
clktmp := not clktmp;
clk_we <= clktmp;
wait for Period_we/2;
end process CLOCK2;
 
CLOCK3 : process -- generate clock signal for design
begin
clk_ps_re <= '1';
wait for 2 ns;
clk_ps_re <= '0';
wait for (Period_re -4 ns);
clk_ps_re <= '1';
wait for 2 ns;
end process CLOCK3;
 
CLOCK4 : process -- generate clock signal for design
begin
clk_ps_we <= '1';
wait for 2 ns;
clk_ps_we <= '0';
wait for (Period_we -4 ns);
clk_ps_we <= '1';
wait for 2 ns;
end process CLOCK4;
 
-- clk_ps_we <= clk_we;
-- clk_ps_re <= clk_re;
 
-- PROC
RESET : process
begin
Rst_n <= '0'; -- Reset the testsystem
wait for 6*Period_re; -- Wait
Rst_n <= '1'; -- de-assert reset
wait;
end process RESET;
 
 
end rtl;
 
-------------------------------------------------------------------------------
/trunk/TUT/ip.hwp.storage/fifos/multi_clk/Testbenches/tb_mixed_clk_fifo_v2_fpga.vhd
0,0 → 1,181
-------------------------------------------------------------------------------
-- Title : Testbench for design "mixed_clk_fifo"
-- Project :
-------------------------------------------------------------------------------
-- File : tb_mixed_clk_fifo.vhd
-- Author : kulmala3
-- Created : 16.12.2005
-- Last update: 08.12.2006
-- Description:
-------------------------------------------------------------------------------
-- Copyright (c) 2005
-------------------------------------------------------------------------------
-- Revisions :
-- Date Version Author Description
-- 16.12.2005 1.0 AK Created
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_1164.all;
use work.txt_util.all;
 
-------------------------------------------------------------------------------
 
entity tb_mixed_clk_fifo is
port (
clk_we : in std_logic;
clk_re : in std_logic;
clk_ps_re : in std_logic;
clk_ps_we : in std_logic;
error_out : out std_logic;
rst_n : in std_logic
);
end tb_mixed_clk_fifo;
 
-------------------------------------------------------------------------------
 
architecture rtl of tb_mixed_clk_fifo is
 
-- component generics
 
constant depth_g : integer := 3;
constant data_width_g : integer := 4;
 
-- component ports
-- signal clk_re : std_logic;
-- signal clk_we : std_logic;
-- signal clk_ps_re : std_logic;
-- signal clk_ps_we : std_logic;
-- signal rst_n : std_logic;
signal data_to_dut : std_logic_vector (data_width_g-1 downto 0);
signal we_to_dut : std_logic;
signal full_from_dut : std_logic;
signal one_p_from_dut : std_logic;
signal re_to_dut : std_logic;
signal data_from_dut : std_logic_vector (data_width_g-1 downto 0);
signal empty_from_dut : std_logic;
signal one_d_from_dut : std_logic;
signal data_cnt_r : std_logic_vector(data_width_g-1 downto 0);
 
-- to create periods of not reading or not writing,
-- full and empty cases
constant write_phase_c : integer := 7;
constant read_phase_c : integer := 6;
signal read_phase_r : integer;
signal write_phase_r : integer;
signal int_re_r : std_logic;
signal int_we_r : std_logic;
begin -- rtl
 
-- component instantiation
DUT : entity work.mixed_clk_fifo
generic map (
depth_g => depth_g,
data_width_g => data_width_g)
port map (
clk_re => clk_re,
clk_we => clk_we,
clk_ps_re => clk_ps_re,
clk_ps_we => clk_ps_we,
rst_n => rst_n,
data_in => data_to_dut,
we_in => we_to_dut,
full_out => full_from_dut,
one_p_out => one_p_from_dut,
re_in => re_to_dut,
data_out => data_from_dut,
empty_out => empty_from_dut,
one_d_out => one_d_from_dut
);
 
we_to_dut <= (not full_from_dut) and int_we_r;
 
wr : process (clk_we, rst_n)
begin -- process write
if rst_n = '0' then -- asynchronous reset (active low)
data_to_dut <= (others => '0');
-- we_to_dut <= '0';
write_phase_r <= 0;
int_we_r <= '0';
elsif clk_we'event and clk_we = '1' then -- rising clock edge
if we_to_dut = '1' then
if data_to_dut /= data_to_dut'high then
data_to_dut <= data_to_dut+1;
else
data_to_dut <= (others => '0');
end if;
else
-- we_to_dut <= '1';
data_to_dut <= data_to_dut;
end if;
 
if write_phase_r < write_phase_c then
write_phase_r <= write_phase_r+1;
int_we_r <= '1';
else
if write_phase_r < write_phase_c*2 then
int_we_r <= '0';
-- we_to_dut <= '0';
write_phase_r <= write_phase_r+1;
else
write_phase_r <= 0;
-- we_to_dut <= '1';
end if;
end if;
end if;
 
end process wr;
 
re_to_dut <= not empty_from_dut and int_re_r;
 
re : process (clk_re, rst_n)
begin -- process re
if rst_n = '0' then -- asynchronous reset (active low)
-- re_to_dut <= '0';
data_cnt_r <= conv_std_logic_vector(0, data_width_g);
read_phase_r <= 0;
int_re_r <= '1';
elsif clk_re'event and clk_re = '1' then -- rising clock edge
error_out <= '0';
if re_to_dut = '1' then
if data_cnt_r /= data_from_dut then
error_out <= '1';
assert data_cnt_r = data_from_dut report "wrong value read: " & str(data_from_dut) & "wait: " & str(data_cnt_r) severity error;
end if;
if data_cnt_r /= data_cnt_r'high then
data_cnt_r <= data_cnt_r+1;
else
data_cnt_r <= (others => '0');
end if;
else
data_cnt_r <= data_cnt_r;
end if;
 
if read_phase_r < read_phase_c then
int_re_r <= '1';
read_phase_r <= read_phase_r+1;
else
if read_phase_r < read_phase_c*2 then
int_re_r <= '0';
read_phase_r <= read_phase_r+1;
else
int_re_r <= '0';
read_phase_r <= 0;
end if;
end if;
end if;
end process re;
 
 
end rtl;
 
-------------------------------------------------------------------------------
/trunk/TUT/ip.hwp.storage/fifos/multi_clk/Testbenches/tb_multiclk_fifo.vhd
0,0 → 1,231
-------------------------------------------------------------------------------
-- Title : Testbench for design "multiclk_fifo"
-- Project :
-------------------------------------------------------------------------------
-- File : tb_multiclk_fifo.vhd
-- Author : kulmala3
-- Created : 16.12.2005
-- Last update: 16.12.2005
-- Description:
-------------------------------------------------------------------------------
-- Copyright (c) 2005
-------------------------------------------------------------------------------
-- Revisions :
-- Date Version Author Description
-- 16.12.2005 1.0 AK Created
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_1164.all;
use work.txt_util.all;
 
-------------------------------------------------------------------------------
 
entity tb_multiclk_fifo is
 
end tb_multiclk_fifo;
 
-------------------------------------------------------------------------------
 
architecture rtl of tb_multiclk_fifo is
 
component multiclk_fifo
generic (
re_freq_g : integer;
we_freq_g : integer;
depth_g : integer;
data_width_g : integer);
port (
clk_re : in std_logic;
clk_we : in std_logic;
rst_n : in std_logic;
data_in : in std_logic_vector (data_width_g-1 downto 0);
we_in : in std_logic;
full_out : out std_logic;
one_p_out : out std_logic;
re_in : in std_logic;
data_out : out std_logic_vector (data_width_g-1 downto 0);
empty_out : out std_logic;
one_d_out : out std_logic);
end component;
 
-- component generics
constant re_freq_g : integer := 3;
constant we_freq_g : integer := 1;
constant Period_re : time := 10 ns;
constant Period_we : time := 30 ns;
-- constant re_freq_g : integer := 1;
-- constant we_freq_g : integer := 3;
-- constant Period_re : time := 30 ns;
-- constant Period_we : time := 10 ns;
constant re_freq_g : integer := 1;
constant we_freq_g : integer := 1;
constant Period_re : time := 10 ns;
constant Period_we : time := 10 ns;
 
constant depth_g : integer := 3;
constant data_width_g : integer := 4;
 
-- component ports
signal clk_re : std_logic;
signal clk_we : std_logic;
signal rst_n : std_logic;
signal data_to_dut : std_logic_vector (data_width_g-1 downto 0);
signal we_to_dut : std_logic;
signal full_from_dut : std_logic;
signal one_p_from_dut : std_logic;
signal re_to_dut : std_logic;
signal data_from_dut : std_logic_vector (data_width_g-1 downto 0);
signal empty_from_dut : std_logic;
signal one_d_from_dut : std_logic;
signal data_cnt_r : std_logic_vector(data_width_g-1 downto 0);
 
-- to create periods of not reading or not writing,
-- full and empty cases
constant write_phase_c : integer := 7;
constant read_phase_c : integer := 6;
signal read_phase_r : integer;
signal write_phase_r : integer;
signal int_re_r : std_logic;
signal int_we_r : std_logic;
begin -- rtl
 
-- component instantiation
DUT : multiclk_fifo
generic map (
re_freq_g => re_freq_g,
we_freq_g => we_freq_g,
depth_g => depth_g,
data_width_g => data_width_g)
port map (
clk_re => clk_re,
clk_we => clk_we,
rst_n => rst_n,
data_in => data_to_dut,
we_in => we_to_dut,
full_out => full_from_dut,
one_p_out => one_p_from_dut,
re_in => re_to_dut,
data_out => data_from_dut,
empty_out => empty_from_dut,
one_d_out => one_d_from_dut
);
 
we_to_dut <= (not full_from_dut) and int_we_r;
 
wr : process (clk_we, rst_n)
begin -- process write
if rst_n = '0' then -- asynchronous reset (active low)
data_to_dut <= (others => '0');
-- we_to_dut <= '0';
write_phase_r <= 0;
int_we_r <= '0';
elsif clk_we'event and clk_we = '1' then -- rising clock edge
if we_to_dut = '1' then
if data_to_dut /= data_to_dut'high then
data_to_dut <= data_to_dut+1;
else
data_to_dut <= (others => '0');
end if;
else
-- we_to_dut <= '1';
data_to_dut <= data_to_dut;
end if;
 
if write_phase_r < write_phase_c then
write_phase_r <= write_phase_r+1;
int_we_r <= '1';
else
if write_phase_r < write_phase_c*2 then
int_we_r <= '0';
-- we_to_dut <= '0';
write_phase_r <= write_phase_r+1;
else
write_phase_r <= 0;
-- we_to_dut <= '1';
end if;
end if;
end if;
 
end process wr;
 
re_to_dut <= not empty_from_dut and int_re_r;
 
re : process (clk_re, rst_n)
begin -- process re
if rst_n = '0' then -- asynchronous reset (active low)
-- re_to_dut <= '0';
data_cnt_r <= conv_std_logic_vector(0, data_width_g);
read_phase_r <= 0;
int_re_r <= '1';
elsif clk_re'event and clk_re = '1' then -- rising clock edge
 
if re_to_dut = '1' then
assert data_cnt_r = data_from_dut report "wrong value read: " & str(data_from_dut) & "wait: " & str(data_cnt_r) severity error;
if data_cnt_r /= data_cnt_r'high then
data_cnt_r <= data_cnt_r+1;
else
data_cnt_r <= (others => '0');
end if;
else
data_cnt_r <= data_cnt_r;
end if;
 
if read_phase_r < read_phase_c then
int_re_r <= '1';
read_phase_r <= read_phase_r+1;
else
if read_phase_r < read_phase_c*2 then
int_re_r <= '0';
read_phase_r <= read_phase_r+1;
else
int_re_r <= '0';
read_phase_r <= 0;
end if;
end if;
end if;
end process re;
 
 
 
-- clock generation
-- PROC
CLOCK1 : process -- generate clock signal for design
variable clktmp : std_logic := '0';
begin
clktmp := not clktmp;
clk_re <= clktmp;
wait for Period_re/2;
end process CLOCK1;
 
CLOCK2 : process -- generate clock signal for design
variable clktmp : std_logic := '0';
begin
clktmp := not clktmp;
clk_we <= clktmp;
wait for Period_we/2;
end process CLOCK2;
 
-- PROC
RESET : process
begin
Rst_n <= '0'; -- Reset the testsystem
wait for 6*Period_re; -- Wait
Rst_n <= '1'; -- de-assert reset
wait;
end process RESET;
 
 
end rtl;
 
-------------------------------------------------------------------------------
/trunk/TUT/ip.hwp.storage/fifos/multi_clk/Testbenches/tb_mixed_clk_fifo_v3_fpga.vhd
0,0 → 1,179
-------------------------------------------------------------------------------
-- Title : Testbench for design "mixed_clk_fifo"
-- Project :
-------------------------------------------------------------------------------
-- File : tb_mixed_clk_fifo.vhd
-- Author : kulmala3
-- Created : 16.12.2005
-- Last update: 14.12.2006
-- Description:
-------------------------------------------------------------------------------
-- Copyright (c) 2005
-------------------------------------------------------------------------------
-- Revisions :
-- Date Version Author Description
-- 16.12.2005 1.0 AK Created
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_1164.all;
use work.txt_util.all;
 
-------------------------------------------------------------------------------
 
entity tb_mixed_clk_fifo is
generic (
re_faster_g : integer := 0); -- 0 we faster, 1 re
port (
clk_we : in std_logic;
clk_re : in std_logic;
clk_ps_re : in std_logic;
clk_ps_we : in std_logic;
error_out : out std_logic;
rst_n : in std_logic
);
end tb_mixed_clk_fifo;
 
-------------------------------------------------------------------------------
 
architecture rtl of tb_mixed_clk_fifo is
 
-- component generics
 
constant depth_g : integer := 3;
constant data_width_g : integer := 4;
 
-- component ports
-- signal clk_re : std_logic;
-- signal clk_we : std_logic;
-- signal clk_ps_re : std_logic;
-- signal clk_ps_we : std_logic;
-- signal rst_n : std_logic;
signal data_to_dut : std_logic_vector (data_width_g-1 downto 0);
signal we_to_dut : std_logic;
signal full_from_dut : std_logic;
signal one_p_from_dut : std_logic;
signal re_to_dut : std_logic;
signal data_from_dut : std_logic_vector (data_width_g-1 downto 0);
signal empty_from_dut : std_logic;
signal one_d_from_dut : std_logic;
signal data_cnt_r : std_logic_vector(data_width_g-1 downto 0);
 
-- to create periods of not reading or not writing,
-- full and empty cases
constant write_phase_c : integer := 7;
constant read_phase_c : integer := 6;
signal read_phase_r : integer;
signal write_phase_r : integer;
signal int_re_r : std_logic;
signal int_we_r : std_logic;
begin -- rtl
 
-- component instantiation
DUT : entity work.mixed_clk_fifo
generic map (
re_faster_g => re_faster_g,
depth_g => depth_g,
data_width_g => data_width_g)
port map (
clk_re => clk_re,
clk_we => clk_we,
clk_ps_re => clk_ps_re,
clk_ps_we => clk_ps_we,
rst_n => rst_n,
data_in => data_to_dut,
we_in => we_to_dut,
full_out => full_from_dut,
one_p_out => one_p_from_dut,
re_in => re_to_dut,
data_out => data_from_dut,
empty_out => empty_from_dut,
one_d_out => one_d_from_dut
);
 
we_to_dut <= (not full_from_dut) and int_we_r;
 
wr : process (clk_we, rst_n)
begin -- process write
if rst_n = '0' then -- asynchronous reset (active low)
data_to_dut <= (others => '0');
write_phase_r <= 0;
int_we_r <= '0';
elsif clk_we'event and clk_we = '1' then -- rising clock edge
if we_to_dut = '1' then
if data_to_dut /= data_to_dut'high then
data_to_dut <= data_to_dut+1;
else
data_to_dut <= (others => '0');
end if;
else
data_to_dut <= data_to_dut;
end if;
 
if write_phase_r < write_phase_c then
write_phase_r <= write_phase_r+1;
int_we_r <= '1';
else
if write_phase_r < write_phase_c*2 then
int_we_r <= '0';
write_phase_r <= write_phase_r+1;
else
write_phase_r <= 0;
end if;
end if;
end if;
 
end process wr;
 
re_to_dut <= not empty_from_dut and int_re_r;
 
re : process (clk_re, rst_n)
begin -- process re
if rst_n = '0' then -- asynchronous reset (active low)
data_cnt_r <= conv_std_logic_vector(0, data_width_g);
read_phase_r <= 0;
int_re_r <= '1';
elsif clk_re'event and clk_re = '1' then -- rising clock edge
error_out <= '0';
if re_to_dut = '1' then
if data_cnt_r /= data_from_dut then
error_out <= '1';
assert data_cnt_r = data_from_dut report "wrong value read: " & str(data_from_dut) & "wait: " & str(data_cnt_r) severity error;
end if;
if data_cnt_r /= data_cnt_r'high then
data_cnt_r <= data_cnt_r+1;
else
data_cnt_r <= (others => '0');
end if;
else
data_cnt_r <= data_cnt_r;
end if;
 
if read_phase_r < read_phase_c then
int_re_r <= '1';
read_phase_r <= read_phase_r+1;
else
if read_phase_r < read_phase_c*2 then
int_re_r <= '0';
read_phase_r <= read_phase_r+1;
else
int_re_r <= '0';
read_phase_r <= 0;
end if;
end if;
end if;
end process re;
 
 
end rtl;
 
-------------------------------------------------------------------------------
/trunk/TUT/ip.hwp.storage/fifos/multi_clk/Testbenches/tb_mixed_clk_fifo_v2.vhd
0,0 → 1,227
-------------------------------------------------------------------------------
-- Title : Testbench for design "mixed_clk_fifo"
-- Project :
-------------------------------------------------------------------------------
-- File : tb_mixed_clk_fifo.vhd
-- Author : kulmala3
-- Created : 16.12.2005
-- Last update: 14.12.2006
-- Description:
-------------------------------------------------------------------------------
-- Copyright (c) 2005
-------------------------------------------------------------------------------
-- Revisions :
-- Date Version Author Description
-- 16.12.2005 1.0 AK Created
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_1164.all;
use work.txt_util.all;
 
-------------------------------------------------------------------------------
 
entity tb_mixed_clk_fifo is
 
end tb_mixed_clk_fifo;
 
-------------------------------------------------------------------------------
 
architecture rtl of tb_mixed_clk_fifo is
 
-- component generics
-- constant re_freq_g : integer := 1;
-- constant we_freq_g : integer := 3;
-- constant Period_re : time := 30 ns;
-- constant Period_we : time := 10 ns;
constant re_freq_g : integer := 2;
constant we_freq_g : integer := 1;
constant Period_re : time := 20 ns;
constant Period_we : time := 180 ns; -- HAS TO BE EVEN due to divide
 
constant depth_g : integer := 3;
constant data_width_g : integer := 4;
 
-- component ports
signal clk_re : std_logic;
signal clk_we : std_logic;
signal clk_ps_re : std_logic;
signal clk_ps_we : std_logic;
signal rst_n : std_logic;
signal data_to_dut : std_logic_vector (data_width_g-1 downto 0);
signal we_to_dut : std_logic;
signal full_from_dut : std_logic;
signal one_p_from_dut : std_logic;
signal re_to_dut : std_logic;
signal data_from_dut : std_logic_vector (data_width_g-1 downto 0);
signal empty_from_dut : std_logic;
signal one_d_from_dut : std_logic;
signal data_cnt_r : std_logic_vector(data_width_g-1 downto 0);
 
-- to create periods of not reading or not writing,
-- full and empty cases
constant write_phase_c : integer := 7;
constant read_phase_c : integer := 6;
signal read_phase_r : integer;
signal write_phase_r : integer;
signal int_re_r : std_logic;
signal int_we_r : std_logic;
begin -- rtl
 
-- component instantiation
DUT : entity work.mixed_clk_fifo
generic map (
depth_g => depth_g,
data_width_g => data_width_g)
port map (
clk_re => clk_re,
clk_we => clk_we,
clk_ps_re => clk_ps_re,
clk_ps_we => clk_ps_we,
rst_n => rst_n,
data_in => data_to_dut,
we_in => we_to_dut,
full_out => full_from_dut,
one_p_out => one_p_from_dut,
re_in => re_to_dut,
data_out => data_from_dut,
empty_out => empty_from_dut,
one_d_out => one_d_from_dut
);
 
we_to_dut <= (not full_from_dut) and int_we_r;
 
wr : process (clk_we, rst_n)
begin -- process write
if rst_n = '0' then -- asynchronous reset (active low)
data_to_dut <= (others => '0');
write_phase_r <= 0;
int_we_r <= '0';
elsif clk_we'event and clk_we = '1' then -- rising clock edge
if we_to_dut = '1' then
if data_to_dut /= data_to_dut'high then
data_to_dut <= data_to_dut+1;
else
data_to_dut <= (others => '0');
end if;
else
data_to_dut <= data_to_dut;
end if;
 
if write_phase_r < write_phase_c then
write_phase_r <= write_phase_r+1;
int_we_r <= '1';
else
if write_phase_r < write_phase_c*2 then
int_we_r <= '0';
write_phase_r <= write_phase_r+1;
else
write_phase_r <= 0;
end if;
end if;
end if;
 
end process wr;
 
re_to_dut <= not empty_from_dut and int_re_r;
 
re : process (clk_re, rst_n)
begin -- process re
if rst_n = '0' then -- asynchronous reset (active low)
data_cnt_r <= conv_std_logic_vector(0, data_width_g);
read_phase_r <= 0;
int_re_r <= '1';
elsif clk_re'event and clk_re = '1' then -- rising clock edge
 
if re_to_dut = '1' then
assert data_cnt_r = data_from_dut report "wrong value read: " & str(data_from_dut) & "wait: " & str(data_cnt_r) severity error;
if data_cnt_r /= data_cnt_r'high then
data_cnt_r <= data_cnt_r+1;
else
data_cnt_r <= (others => '0');
end if;
else
data_cnt_r <= data_cnt_r;
end if;
 
if read_phase_r < read_phase_c then
int_re_r <= '1';
read_phase_r <= read_phase_r+1;
else
if read_phase_r < read_phase_c*2 then
int_re_r <= '0';
read_phase_r <= read_phase_r+1;
else
int_re_r <= '0';
read_phase_r <= 0;
end if;
end if;
end if;
end process re;
 
 
 
-- clock generation
-- PROC
CLOCK1 : process -- generate clock signal for design
variable clktmp : std_logic := '0';
begin
clktmp := not clktmp;
clk_re <= clktmp;
wait for Period_re/2;
end process CLOCK1;
 
CLOCK2 : process -- generate clock signal for design
variable clktmp : std_logic := '0';
begin
clktmp := not clktmp;
clk_we <= clktmp;
wait for Period_we/2;
end process CLOCK2;
 
CLOCK3 : process -- generate clock signal for design
begin
clk_ps_re <= '1';
wait for 2 ns;
clk_ps_re <= '0';
wait for (Period_re -4 ns);
clk_ps_re <= '1';
wait for 2 ns;
end process CLOCK3;
 
CLOCK4 : process -- generate clock signal for design
begin
clk_ps_we <= '1';
wait for 2 ns;
clk_ps_we <= '0';
wait for (Period_we -4 ns);
clk_ps_we <= '1';
wait for 2 ns;
end process CLOCK4;
 
-- clk_ps_we <= clk_we;
-- clk_ps_re <= clk_re;
 
-- PROC
RESET : process
begin
Rst_n <= '0'; -- Reset the testsystem
wait for 6*Period_re; -- Wait
Rst_n <= '1'; -- de-assert reset
wait;
end process RESET;
 
 
end rtl;
 
-------------------------------------------------------------------------------
/trunk/TUT/ip.hwp.storage/fifos/multi_clk/Vhdl/multiclk_fifo_v3.vhd
0,0 → 1,229
-------------------------------------------------------------------------------
-- Title : Multiclock FIFO
-- Project :
-------------------------------------------------------------------------------
-- File : multiclk_fifo.vhd
-- Author : kulmala3
-- Created : 16.12.2005
-- Last update: 02.01.2006
-- Description: Synchronous multi-clock FIFO. Note that clock frequencies MUST
-- be realted (synchronized) in order to avoid metastability.
-- Clocks that are asynchronous wrt. each other do not work.
--
-- Note! data must be ready in the data in wrt. faster clock when writing!
-- same applies for re and we
--
-- In this implementation we really utilize both clocks, whch can be a problem
-- in some systems (routing the another clock).
-------------------------------------------------------------------------------
-- Copyright (c) 2005
-------------------------------------------------------------------------------
-- Revisions :
-- Date Version Author Description
-- 16.12.2005 1.0 AK Created
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
 
entity multiclk_fifo is
generic (
re_freq_g : integer := 0; -- integer multiple of clk_we
we_freq_g : integer := 0; -- or vice versa
depth_g : integer := 0;
data_width_g : integer := 0
);
port (
clk_re : in std_logic;
clk_we : in std_logic;
rst_n : in std_logic;
 
data_in : in std_logic_vector (data_width_g-1 downto 0);
we_in : in std_logic;
full_out : out std_logic;
one_p_out : out std_logic;
 
re_in : in std_logic;
data_out : out std_logic_vector (data_width_g-1 downto 0);
empty_out : out std_logic;
one_d_out : out std_logic
);
end multiclk_fifo;
 
architecture rtl of multiclk_fifo is
 
component fifo
generic (
data_width_g : integer;
depth_g : integer);
port (
clk : in std_logic;
rst_n : in std_logic;
data_in : in std_logic_vector (data_width_g-1 downto 0);
we_in : in std_logic;
full_out : out std_logic;
one_p_out : out std_logic;
re_in : in std_logic;
data_out : out std_logic_vector (data_width_g-1 downto 0);
empty_out : out std_logic;
one_d_out : out std_logic);
end component;
 
constant re_per_we_c : integer := re_freq_g / we_freq_g;
constant we_per_re_c : integer := we_freq_g / re_freq_g;
 
-- no 0 to x-1, cuz otherwise range 0 to -1 is possible
signal re_cnt_r : integer range 0 to re_per_we_c;
signal we_cnt_r : integer range 0 to we_per_re_c;
 
signal data_to_fifo : std_logic_vector (data_width_g-1 downto 0);
signal we_to_fifo : std_logic;
signal full_from_fifo : std_logic;
signal one_p_from_fifo : std_logic;
signal re_to_fifo : std_logic;
signal data_from_fifo : std_logic_vector (data_width_g-1 downto 0);
signal empty_from_fifo : std_logic;
signal one_d_from_fifo : std_logic;
signal clk_fifo : std_logic;
signal slow_r : std_logic; -- frequncy halver for slower clock
signal slow_was_r : std_logic;
signal rst_cnt : std_logic;
signal clk_slow : std_logic;
begin -- rtl
 
data_to_fifo <= data_in;
full_out <= full_from_fifo;
one_p_out <= one_p_from_fifo;
data_out <= data_from_fifo;
empty_out <= empty_from_fifo;
one_d_out <= one_d_from_fifo;
 
regular_fifo: fifo
generic map (
data_width_g => data_width_g,
depth_g => depth_g)
port map (
clk => clk_fifo, -- this is the difference
rst_n => rst_n,
data_in => data_to_fifo,
we_in => we_to_fifo,
full_out => full_from_fifo,
one_p_out => one_p_from_fifo,
re_in => re_to_fifo,
data_out => data_from_fifo,
empty_out => empty_from_fifo,
one_d_out => one_d_from_fifo
);
 
process (clk_slow, rst_n)
begin -- process
if rst_n = '0' then -- asynchronous reset (active low)
slow_r <= '0';
elsif clk_slow'event and clk_slow = '1' then -- rising clock edge
slow_r <= not slow_r;
end if;
end process;
 
process (clk_fifo, rst_n)
begin -- process
if rst_n = '0' then -- asynchronous reset (active low)
slow_was_r <= '0';
elsif clk_fifo'event and clk_fifo = '1' then -- rising clock edge
slow_was_r <= slow_r;
end if;
end process;
nullify: process (slow_r, slow_was_r)
begin -- process nullify
rst_cnt <= slow_was_r xor slow_r;
end process nullify;
re_gt_we : if re_freq_g >= we_freq_g generate
clk_fifo <= clk_re;
clk_slow <= clk_we;
re_to_fifo <= re_in;
 
equal : if re_per_we_c = 1 generate
we_to_fifo <= we_in;
end generate equal;
 
greater : if re_per_we_c > 1 generate
-- re clk is faster than we
gen_we : process (re_cnt_r, we_in, rst_cnt)
begin -- process gen_we
if we_in = '1' then
if re_cnt_r = re_per_we_c-2 and rst_cnt = '0' then
we_to_fifo <= '1';
else
we_to_fifo <= '0';
end if;
else
we_to_fifo <= '0';
end if;
end process gen_we;
 
process (clk_re, rst_n)
begin -- process
if rst_n = '0' then -- asynchronous reset (active low)
re_cnt_r <= 0;
elsif clk_re'event and clk_re = '1' then -- rising clock edge
if rst_cnt = '1' then
re_cnt_r <= 0;
else
re_cnt_r <= re_cnt_r+1;
end if;
end if;
end process;
end generate greater;
 
end generate re_gt_we;
 
we_gt_re : if re_freq_g < we_freq_g generate
 
clk_fifo <= clk_we;
clk_slow <= clk_re;
we_to_fifo <= we_in;
 
-- we clk is faster than re
gen_we : process (we_cnt_r, re_in, rst_cnt)
begin -- process gen_we
if re_in = '1' then
if we_cnt_r = we_per_re_c-2 and rst_cnt = '0' then
re_to_fifo <= '1';
else
re_to_fifo <= '0';
end if;
else
re_to_fifo <= '0';
end if;
end process gen_we;
 
process (clk_we, rst_n)
begin -- process
if rst_n = '0' then -- asynchronous reset (active low)
we_cnt_r <= 0;
elsif clk_we'event and clk_we = '1' then -- rising clock edge
if rst_cnt = '1' then
we_cnt_r <= 0;
else
we_cnt_r <= we_cnt_r+1;
end if;
end if;
end process;
 
end generate we_gt_re;
end rtl;
/trunk/TUT/ip.hwp.storage/fifos/multi_clk/Vhdl/multiclk_fifo_v4.vhd
0,0 → 1,256
-------------------------------------------------------------------------------
-- Title : Multiclock FIFO
-- Project :
-------------------------------------------------------------------------------
-- File : multiclk_fifo.vhd
-- Author : kulmala3
-- Created : 16.12.2005
-- Last update: 16.08.2006
-- Description: Synchronous multi-clock FIFO. Note that clock frequencies MUST
-- be related (synchronized) in order to avoid metastability.
-- Clocks that are asynchronous wrt. each other do not work.
--
-- Note! data must be ready in the data in wrt. faster clock when writing!
-- same applies for re and we
--
-- This one uses slow full and empty for the corresponding slower clock (i.e.
-- reader is slower -> empty is delayed). eg. empty transition from 1->0 is
-- delayed.
--
-- In this implementation we really utilize both clocks, whch can be a problem
-- in some systems (routing the another clock).
-------------------------------------------------------------------------------
-- Copyright (c) 2005
-------------------------------------------------------------------------------
-- Revisions :
-- Date Version Author Description
-- 16.12.2005 1.0 AK Created
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
 
entity multiclk_fifo is
generic (
re_freq_g : integer := 1; -- integer multiple of clk_we
we_freq_g : integer := 1; -- or vice versa
depth_g : integer := 0;
data_width_g : integer := 0
);
port (
clk_re : in std_logic;
clk_we : in std_logic;
rst_n : in std_logic;
 
data_in : in std_logic_vector (data_width_g-1 downto 0);
we_in : in std_logic;
full_out : out std_logic;
one_p_out : out std_logic;
 
re_in : in std_logic;
data_out : out std_logic_vector (data_width_g-1 downto 0);
empty_out : out std_logic;
one_d_out : out std_logic
);
end multiclk_fifo;
 
architecture rtl of multiclk_fifo is
 
component fifo
generic (
data_width_g : integer;
depth_g : integer);
port (
clk : in std_logic;
rst_n : in std_logic;
data_in : in std_logic_vector (data_width_g-1 downto 0);
we_in : in std_logic;
full_out : out std_logic;
one_p_out : out std_logic;
re_in : in std_logic;
data_out : out std_logic_vector (data_width_g-1 downto 0);
empty_out : out std_logic;
one_d_out : out std_logic);
end component;
 
constant re_per_we_c : integer := re_freq_g / we_freq_g;
constant we_per_re_c : integer := we_freq_g / re_freq_g;
 
-- no 0 to x-1, cuz otherwise range 0 to -1 is possible
signal re_cnt_r : integer range 0 to re_per_we_c;
signal we_cnt_r : integer range 0 to we_per_re_c;
 
signal data_to_fifo : std_logic_vector (data_width_g-1 downto 0);
signal we_to_fifo : std_logic;
signal full_from_fifo : std_logic;
signal one_p_from_fifo : std_logic;
signal re_to_fifo : std_logic;
signal data_from_fifo : std_logic_vector (data_width_g-1 downto 0);
signal empty_from_fifo : std_logic;
signal one_d_from_fifo : std_logic;
signal empty_out_r : std_logic;
signal full_out_r : std_logic;
signal clk_fifo : std_logic;
signal slow_r : std_logic; -- frequncy halver for slower clock
signal slow_was_r : std_logic;
signal rst_cnt : std_logic;
signal clk_slow : std_logic;
begin -- rtl
 
data_to_fifo <= data_in;
full_out <= full_out_r; --from_fifo;
one_p_out <= one_p_from_fifo;
data_out <= data_from_fifo;
empty_out <= empty_out_r; --empty_from_fifo;
one_d_out <= one_d_from_fifo;
 
regular_fifo: fifo
generic map (
data_width_g => data_width_g,
depth_g => depth_g)
port map (
clk => clk_fifo, -- this is the difference
rst_n => rst_n,
data_in => data_to_fifo,
we_in => we_to_fifo,
full_out => full_from_fifo,
one_p_out => one_p_from_fifo,
re_in => re_to_fifo,
data_out => data_from_fifo,
empty_out => empty_from_fifo,
one_d_out => one_d_from_fifo
);
 
process (clk_slow, rst_n)
begin -- process
if rst_n = '0' then -- asynchronous reset (active low)
slow_r <= '0';
elsif clk_slow'event and clk_slow = '1' then -- rising clock edge
slow_r <= not slow_r;
end if;
end process;
 
process (clk_fifo, rst_n)
begin -- process
if rst_n = '0' then -- asynchronous reset (active low)
slow_was_r <= '0';
elsif clk_fifo'event and clk_fifo = '1' then -- rising clock edge
slow_was_r <= slow_r;
end if;
end process;
nullify: process (slow_r, slow_was_r)
begin -- process nullify
rst_cnt <= slow_was_r xor slow_r;
end process nullify;
re_gt_we : if re_freq_g >= we_freq_g generate
clk_fifo <= clk_re;
clk_slow <= clk_we;
re_to_fifo <= re_in;
 
equal : if re_per_we_c = 1 generate
we_to_fifo <= we_in;
empty_out_r <= empty_from_fifo;
full_out_r <= full_from_fifo;
end generate equal;
 
greater : if re_per_we_c > 1 generate
-- re clk is faster than we
gen_we : process (re_cnt_r, we_in, rst_cnt)
begin -- process gen_we
if we_in = '1' then
if re_cnt_r = re_per_we_c-2 and rst_cnt = '0' then
we_to_fifo <= '1';
else
we_to_fifo <= '0';
end if;
else
we_to_fifo <= '0';
end if;
end process gen_we;
 
empty_out_r <= empty_from_fifo;
process (clk_re, rst_n)
begin -- process
if rst_n = '0' then -- asynchronous reset (active low)
re_cnt_r <= 0;
elsif clk_re'event and clk_re = '1' then -- rising clock edge
if rst_cnt = '1' then
re_cnt_r <= 0;
else
re_cnt_r <= re_cnt_r+1;
end if;
 
if re_cnt_r = 0 then
full_out_r <= full_from_fifo;
else
full_out_r <= full_out_r;
end if;
end if;
end process;
end generate greater;
 
end generate re_gt_we;
 
we_gt_re : if re_freq_g < we_freq_g generate
 
clk_fifo <= clk_we;
clk_slow <= clk_re;
we_to_fifo <= we_in;
 
-- we clk is faster than re
gen_we : process (we_cnt_r, re_in, rst_cnt)
begin -- process gen_we
if re_in = '1' then
if we_cnt_r = we_per_re_c-2 and rst_cnt = '0' then
re_to_fifo <= '1';
else
re_to_fifo <= '0';
end if;
else
re_to_fifo <= '0';
end if;
 
end process gen_we;
 
full_out_r <= full_from_fifo;
process (clk_we, rst_n)
begin -- process
if rst_n = '0' then -- asynchronous reset (active low)
we_cnt_r <= 0;
empty_out_r <= '1';
elsif clk_we'event and clk_we = '1' then -- rising clock edge
if rst_cnt = '1' then
we_cnt_r <= 0;
else
we_cnt_r <= we_cnt_r+1;
end if;
 
if we_cnt_r = 0 then
empty_out_r <= empty_from_fifo;
else
empty_out_r <= empty_out_r;
end if;
end if;
end process;
 
end generate we_gt_re;
end rtl;
/trunk/TUT/ip.hwp.storage/fifos/multi_clk/Vhdl/we_pulse_synchronizer.vhd
0,0 → 1,136
-------------------------------------------------------------------------------
-- Title : Write pulse synchronizer for Mixed clock FIFO
-- Project :
-------------------------------------------------------------------------------
-- File :
-- Author : kulmala3
-- Created : 16.12.2005
-- Last update: 18.12.2006
-- Description: Re faster than WE
-------------------------------------------------------------------------------
-- Copyright (c) 2005
-- one p may be a bit suspicious if blindly trusted. should not be used.
-------------------------------------------------------------------------------
-- Revisions :
-- Date Version Author Description
-- 16.12.2005 1.0 AK Created
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
 
entity we_pulse_synchronizer is
generic (
data_width_g : integer := 0
);
port (
clk_re : in std_logic; -- THIS IS ALWAYS THE FASTER CLOCK!!!
clk_ps_re : in std_logic; -- phase shifted pulse
clk_we : in std_logic;
clk_ps_we : in std_logic; -- phase shifted pulse
rst_n : in std_logic;
 
-- to synchronize clk_we -> clk_re
data_in : in std_logic_vector (data_width_g-1 downto 0);
we_in : in std_logic;
full_out : out std_logic;
one_p_out : out std_logic;
-- from synchronization to clk_re, we pulse width adjusted
data_out : out std_logic_vector (data_width_g-1 downto 0);
we_out : out std_logic;
 
-- From clk_re domain FIFO
full_in : in std_logic;
one_p_in : in std_logic
 
 
);
end we_pulse_synchronizer;
 
architecture rtl of we_pulse_synchronizer is
 
 
signal data_to_fifo : std_logic_vector (data_width_g-1 downto 0);
signal we_to_fifo : std_logic;
signal we_local_r : std_logic;
signal clk_we_was_r : std_logic;
 
signal data_between_r : std_logic_vector (data_width_g-1 downto 0);
signal we_between_r : std_logic;
signal full_between_r : std_logic;
signal one_p_between_r : std_logic;
signal full_from_fifo : std_logic;
signal one_p_from_fifo : std_logic;
signal full_out_r : std_logic;
signal clk_we_period_r : std_logic;
 
signal derived_clk : std_logic;
begin -- rtl
 
full_out <= full_out_r; --from_fifo;
data_out <= data_to_fifo;
we_out <= we_to_fifo;
one_p_from_fifo <= one_p_in;
full_from_fifo <= full_in;
refaster : process (clk_we, rst_n)
begin -- process refaster
if rst_n = '0' then -- asynchronous reset (active low)
full_out_r <= '1';
data_between_r <= (others => '0');
we_between_r <= '0';
elsif clk_we'event and clk_we = '1' then -- rising clock edge
if full_between_r = '0' then
data_between_r <= data_in;
we_between_r <= we_in;
end if;
full_out_r <= full_between_r or one_p_between_r;
end if;
end process refaster;
 
 
derived_clk <= (clk_ps_we nand clk_ps_re) and clk_we;
 
derclk : process (derived_clk, rst_n)
begin -- process derclk
if rst_n = '0' then -- asynchronous reset (active low)
data_to_fifo <= (others => '0');
we_local_r <= '0';
full_between_r <= '0';
one_p_between_r <= '0';
clk_we_period_r <= '0';
elsif derived_clk'event and derived_clk = '1' then -- rising clock edge
if full_from_fifo = '0' then
data_to_fifo <= data_between_r;
we_local_r <= we_between_r;
else
we_local_r <= '0';
end if;
full_between_r <= full_from_fifo;
one_p_between_r <= one_p_from_fifo;
clk_we_period_r <= not clk_we_period_r;
end if;
end process derclk;
 
one_p_out <= one_p_between_r; -- follows one_p_between.
we_to_fifo <= (clk_we_period_r xor clk_we_was_r) and we_local_r;
 
process (clk_re, rst_n)
begin -- process
if rst_n = '0' then -- asynchronous reset (active low)
clk_we_was_r <= '0';
elsif clk_re'event and clk_re = '1' then -- rising clock edge
clk_we_was_r <= clk_we_period_r;
end if;
end process;
 
end rtl;
/trunk/TUT/ip.hwp.storage/fifos/multi_clk/Vhdl/multiclk_fifo.vhd
0,0 → 1,223
-------------------------------------------------------------------------------
-- Title : Multiclock FIFO
-- Project :
-------------------------------------------------------------------------------
-- File : multiclk_fifo.vhd
-- Author : kulmala3
-- Created : 16.12.2005
-- Last update: 2010-04-27
-- Description: Synchronous multi-clock FIFO. Note that clock frequencies MUST
-- be realted (synchronized) in order to avoid metastability.
-- Clocks that are asynchronous wrt. each other do not work.
--
-- Note! data must be ready in the data in wrt. faster clock when writing!
-- same applies for re and we
-------------------------------------------------------------------------------
-- Copyright (c) 2005
-------------------------------------------------------------------------------
-- This file is part of Transaction Generator.
--
-- Transaction Generator is free software: you can redistribute it and/or modify
-- it under the terms of the Lesser GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.
--
-- Transaction Generator is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- Lesser GNU General Public License for more details.
--
-- You should have received a copy of the Lesser GNU General Public License
-- along with Transaction Generator. If not, see <http://www.gnu.org/licenses/>.
-------------------------------------------------------------------------------
-- Revisions :
-- Date Version Author Description
-- 16.12.2005 1.0 AK Created
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
 
entity multiclk_fifo is
generic (
re_freq_g : integer := 0; -- integer multiple of clk_we
we_freq_g : integer := 0; -- or vice versa
depth_g : integer := 0;
data_width_g : integer := 0
);
port (
clk_re : in std_logic;
clk_we : in std_logic;
rst_n : in std_logic;
 
data_in : in std_logic_vector (data_width_g-1 downto 0);
we_in : in std_logic;
full_out : out std_logic;
one_p_out : out std_logic;
 
re_in : in std_logic;
data_out : out std_logic_vector (data_width_g-1 downto 0);
empty_out : out std_logic;
one_d_out : out std_logic
);
end multiclk_fifo;
 
architecture rtl of multiclk_fifo is
 
component fifo
generic (
data_width_g : integer;
depth_g : integer);
port (
clk : in std_logic;
rst_n : in std_logic;
data_in : in std_logic_vector (data_width_g-1 downto 0);
we_in : in std_logic;
full_out : out std_logic;
one_p_out : out std_logic;
re_in : in std_logic;
data_out : out std_logic_vector (data_width_g-1 downto 0);
empty_out : out std_logic;
one_d_out : out std_logic);
end component;
 
constant re_per_we_c : integer := re_freq_g / we_freq_g;
constant we_per_re_c : integer := we_freq_g / re_freq_g;
 
-- no 0 to x-1, cuz otherwise range 0 to -1 is possible
signal re_cnt_r : integer range 0 to re_per_we_c;
signal we_cnt_r : integer range 0 to we_per_re_c;
 
signal data_to_fifo : std_logic_vector (data_width_g-1 downto 0);
signal we_to_fifo : std_logic;
signal full_from_fifo : std_logic;
signal one_p_from_fifo : std_logic;
signal re_to_fifo : std_logic;
signal data_from_fifo : std_logic_vector (data_width_g-1 downto 0);
signal empty_from_fifo : std_logic;
signal one_d_from_fifo : std_logic;
begin -- rtl
 
data_to_fifo <= data_in;
full_out <= full_from_fifo;
one_p_out <= one_p_from_fifo;
data_out <= data_from_fifo;
empty_out <= empty_from_fifo;
one_d_out <= one_d_from_fifo;
 
re_gt_we : if re_freq_g >= we_freq_g generate
 
fifo_re_gt_we : fifo
generic map (
data_width_g => data_width_g,
depth_g => depth_g)
port map (
clk => clk_re, -- this is the difference
rst_n => rst_n,
data_in => data_to_fifo,
we_in => we_to_fifo,
full_out => full_from_fifo,
one_p_out => one_p_from_fifo,
re_in => re_to_fifo,
data_out => data_from_fifo,
empty_out => empty_from_fifo,
one_d_out => one_d_from_fifo
);
 
re_to_fifo <= re_in;
 
equal : if re_per_we_c = 1 generate
we_to_fifo <= we_in;
end generate equal;
 
greater : if re_per_we_c > 1 generate
-- re clk is faster than we
process (clk_re, rst_n)
begin -- process
if rst_n = '0' then -- asynchronous reset (active low)
we_to_fifo <= '0';--we_in;
re_cnt_r <= 0;
elsif clk_re'event and clk_re = '1' then -- rising clock edge
if we_in = '1' then
if re_cnt_r = re_per_we_c-2 then
we_to_fifo <= '1';
else
we_to_fifo <= '0';
end if;
if re_cnt_r /= re_per_we_c-1 then
re_cnt_r <= re_cnt_r+1;
else
re_cnt_r <= 0;
end if;
else
we_to_fifo <= '0';
re_cnt_r <= 0;
end if;
end if;
end process;
end generate greater;
 
end generate re_gt_we;
 
we_gt_re : if re_freq_g < we_freq_g generate
 
fifo_re_gt_we : fifo
generic map (
data_width_g => data_width_g,
depth_g => depth_g)
port map (
clk => clk_we,
rst_n => rst_n,
data_in => data_to_fifo,
we_in => we_to_fifo,
full_out => full_from_fifo,
one_p_out => one_p_from_fifo,
re_in => re_to_fifo,
data_out => data_from_fifo,
empty_out => empty_from_fifo,
one_d_out => one_d_from_fifo
);
 
we_to_fifo <= we_in;
 
-- we clk is faster than re
process (clk_we, rst_n)
begin -- process
if rst_n = '0' then -- asynchronous reset (active low)
re_to_fifo <= '0';--re_in;
we_cnt_r <= 0;
elsif clk_we'event and clk_we = '1' then -- rising clock edge
if re_in = '1' then
if we_cnt_r = we_per_re_c-2 then
re_to_fifo <= '1';
else
re_to_fifo <= '0';
end if;
if we_cnt_r /= we_per_re_c-1 then
we_cnt_r <= we_cnt_r+1;
else
we_cnt_r <= 0;
end if;
else
re_to_fifo <= '0';
we_cnt_r <= 0;
end if;
end if;
end process;
 
end generate we_gt_re;
end rtl;
/trunk/TUT/ip.hwp.storage/fifos/multi_clk/Vhdl/mixed_clk_fifo_v2.vhd
0,0 → 1,169
-------------------------------------------------------------------------------
-- Title : Mixed clock FIFO
-- Project :
-------------------------------------------------------------------------------
-- File :
-- Author : kulmala3
-- Created : 16.12.2005
-- Last update: 14.12.2006
-- Description:
-------------------------------------------------------------------------------
-- Copyright (c) 2005
-- Works in fpga testbench.
-------------------------------------------------------------------------------
-- Revisions :
-- Date Version Author Description
-- 16.12.2005 1.0 AK Created
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
 
entity mixed_clk_fifo is
generic (
depth_g : integer := 0;
data_width_g : integer := 0
);
port (
clk_re : in std_logic;
clk_ps_re : in std_logic; -- phase shifted pulse
clk_we : in std_logic;
clk_ps_we : in std_logic; -- phase shifted pulse
rst_n : in std_logic;
 
data_in : in std_logic_vector (data_width_g-1 downto 0);
we_in : in std_logic;
full_out : out std_logic;
one_p_out : out std_logic;
 
re_in : in std_logic;
data_out : out std_logic_vector (data_width_g-1 downto 0);
empty_out : out std_logic;
one_d_out : out std_logic
);
end mixed_clk_fifo;
 
architecture rtl of mixed_clk_fifo is
 
component fifo
generic (
data_width_g : integer;
depth_g : integer);
port (
clk : in std_logic;
rst_n : in std_logic;
data_in : in std_logic_vector (data_width_g-1 downto 0);
we_in : in std_logic;
full_out : out std_logic;
one_p_out : out std_logic;
re_in : in std_logic;
data_out : out std_logic_vector (data_width_g-1 downto 0);
empty_out : out std_logic;
one_d_out : out std_logic);
end component;
 
signal data_to_fifo : std_logic_vector (data_width_g-1 downto 0);
signal we_to_fifo : std_logic;
signal we_local_r : std_logic;
signal clk_we_was_r : std_logic;
 
signal data_between_r : std_logic_vector (data_width_g-1 downto 0);
signal we_between_r : std_logic;
signal full_between_r : std_logic;
signal one_p_between_r : std_logic;
signal full_from_fifo : std_logic;
signal one_p_from_fifo : std_logic;
signal re_to_fifo : std_logic;
signal data_from_fifo : std_logic_vector (data_width_g-1 downto 0);
signal empty_from_fifo : std_logic;
signal one_d_from_fifo : std_logic;
signal empty_out_r : std_logic;
signal full_out_r : std_logic;
signal clk_we_period_r : std_logic;
 
signal derived_clk : std_logic;
begin -- rtl
 
full_out <= full_out_r; --from_fifo;
data_out <= data_from_fifo;
empty_out <= empty_from_fifo;
 
regular_fifo : fifo
generic map (
data_width_g => data_width_g,
depth_g => depth_g)
port map (
clk => clk_re,
rst_n => rst_n,
data_in => data_to_fifo,
we_in => we_to_fifo,
full_out => full_from_fifo,
one_p_out => one_p_from_fifo,
re_in => re_in,
data_out => data_from_fifo,
empty_out => empty_from_fifo,
one_d_out => one_d_from_fifo
);
 
-----------------------------------------------------------------------------
-- RE CLK IS FASTER
process (clk_we, rst_n)
begin -- process wefaster
if rst_n = '0' then -- asynchronous reset (active low)
full_out_r <= '1';
data_between_r <= (others => '0');
we_between_r <= '0';
elsif clk_we'event and clk_we = '1' then -- rising clock edge
if full_between_r = '0' then
data_between_r <= data_in;
we_between_r <= we_in;
end if;
full_out_r <= full_between_r or one_p_between_r;
end if;
end process;
 
 
derived_clk <= (clk_ps_we nand clk_ps_re) and clk_we;
 
derclk : process (derived_clk, rst_n)
begin -- process derclk
if rst_n = '0' then -- asynchronous reset (active low)
data_to_fifo <= (others => '0');
we_local_r <= '0';
full_between_r <= '0';
one_p_between_r <= '0';
clk_we_period_r <= '0';
elsif derived_clk'event and derived_clk = '1' then -- rising clock edge
if full_from_fifo = '0' then
data_to_fifo <= data_between_r;
we_local_r <= we_between_r;
else
we_local_r <= '0';
end if;
full_between_r <= full_from_fifo;
one_p_between_r <= one_p_from_fifo;
clk_we_period_r <= not clk_we_period_r;
end if;
end process derclk;
 
we_to_fifo <= (clk_we_period_r xor clk_we_was_r) and we_local_r;
 
process (clk_re, rst_n)
begin -- process
if rst_n = '0' then -- asynchronous reset (active low)
clk_we_was_r <= '0';
elsif clk_re'event and clk_re = '1' then -- rising clock edge
clk_we_was_r <= clk_we_period_r;
end if;
end process;
 
end rtl;
/trunk/TUT/ip.hwp.storage/fifos/multi_clk/Vhdl/threeclk_fifo_v1.vhd
0,0 → 1,155
-------------------------------------------------------------------------------
-- Title : Multiclock FIFO
-- Project :
-------------------------------------------------------------------------------
-- File : multiclk_fifo.vhd
-- Author : kulmala3
-- Created : 16.12.2005
-- Last update: 16.08.2006
-- Description: Synchronous multi-clock FIFO. Note that clock frequencies MUST
-- be related (synchronized) in order to avoid metastability.
-- Clocks that are asynchronous wrt. each other do not work.
--
-- Note! data must be ready in the data in wrt. faster clock when writing!
-- same applies for re and we
--
-- This one uses slow full and empty for the corresponding slower clock (i.e.
-- reader is slower -> empty is delayed). eg. empty transition from 1->0 is
-- delayed.
--
-- In this implementation we really utilize both clocks, whch can be a problem
-- in some systems (routing the another clock).
-------------------------------------------------------------------------------
-- Copyright (c) 2005
-------------------------------------------------------------------------------
-- Revisions :
-- Date Version Author Description
-- 16.12.2005 1.0 AK Created
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
 
entity threeclk_fifo is
 
generic (
re_freq_g : integer := 1; -- integer multiple of clk_we
we_freq_g : integer := 1; -- or vice versa
tmp_freq_g : integer := 1; -- integer multiple of both clk_re and clk_we
depth_g : integer := 1;
data_width_g : integer := 1
);
port (
clk_re : in std_logic;
clk_we : in std_logic;
clk_tmp : in std_logic;
rst_n : in std_logic;
 
data_in : in std_logic_vector (data_width_g-1 downto 0);
we_in : in std_logic;
full_out : out std_logic;
one_p_out : out std_logic;
 
re_in : in std_logic;
data_out : out std_logic_vector (data_width_g-1 downto 0);
empty_out : out std_logic;
one_d_out : out std_logic
);
end threeclk_fifo;
 
architecture structural of threeclk_fifo is
 
-- component multiclk_fifo
-- generic (
-- re_freq_g : integer := 0; -- integer multiple of clk_we
-- we_freq_g : integer := 0; -- or vice versa
-- depth_g : integer := 0;
-- data_width_g : integer := 0
-- );
-- port (
-- clk_re : in std_logic;
-- clk_we : in std_logic;
-- rst_n : in std_logic;
 
-- data_in : in std_logic_vector (data_width_g-1 downto 0);
-- we_in : in std_logic;
-- full_out : out std_logic;
-- one_p_out : out std_logic;
 
-- re_in : in std_logic;
-- data_out : out std_logic_vector (data_width_g-1 downto 0);
-- empty_out : out std_logic;
-- one_d_out : out std_logic
-- );
-- end component;
 
signal data_wef_ref : std_logic_vector (data_width_g-1 downto 0);
signal we_to_ref : std_logic;
signal full_from_ref : std_logic;
signal one_p_from_ref : std_logic;
signal re_to_wef : std_logic;
signal empty_from_wef : std_logic;
 
 
begin -- structural
 
 
 
we_fifo : entity work.multiclk_fifo
generic map (
re_freq_g => tmp_freq_g,
we_freq_g => we_freq_g,
data_width_g => data_width_g,
depth_g => depth_g
)
port map(
clk_we => clk_we,
clk_re => clk_tmp,
rst_n => rst_n,
 
data_in => data_in,
we_in => we_in,
full_out => full_out,
one_p_out => one_p_out,
 
data_out => data_wef_ref,
re_in => re_to_wef,
empty_out => empty_from_wef
--one_d_out
);
 
 
re_to_wef <= not full_from_ref;
we_to_ref <= not empty_from_wef;
 
re_fifo : entity work.multiclk_fifo
generic map (
re_freq_g => re_freq_g,
we_freq_g => tmp_freq_g,
data_width_g => data_width_g,
depth_g => depth_g/2
)
port map(
clk_we => clk_tmp,
clk_re => clk_re,
rst_n => rst_n,
 
data_in => data_wef_ref,
we_in => we_to_ref,
full_out => full_from_ref,
one_p_out => one_p_from_ref,
 
data_out => data_out,
re_in => re_in,
empty_out => empty_out,
one_d_out => one_d_out
);
 
 
 
 
end structural;
/trunk/TUT/ip.hwp.storage/fifos/multi_clk/Vhdl/mixed_clk_fifo_v3.vhd
0,0 → 1,207
-------------------------------------------------------------------------------
-- Title : Mixed clock FIFO
-- Project :
-------------------------------------------------------------------------------
-- File :
-- Author : kulmala3
-- Created : 16.12.2005
-- Last update: 18.12.2006
-- Description: This aims to include possibility to have the
-- synchronization interface on both sides instead of fixed re faster scheme.
--
-- NOTE! one_p may be high when full is also high
-- one_d is high when empty is '0'.
-------------------------------------------------------------------------------
-- Copyright (c) 2005
-- Works in fpga testbench.
-------------------------------------------------------------------------------
-- Revisions :
-- Date Version Author Description
-- 16.12.2005 1.0 AK Created
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
 
entity mixed_clk_fifo is
generic (
re_faster_g : integer := 1; -- 0 we faster, 1 re faster.
depth_g : integer := 0;
data_width_g : integer := 0
);
port (
clk_re : in std_logic;
clk_ps_re : in std_logic; -- phase shifted pulse
clk_we : in std_logic;
clk_ps_we : in std_logic; -- phase shifted pulse
rst_n : in std_logic;
 
data_in : in std_logic_vector (data_width_g-1 downto 0);
we_in : in std_logic;
full_out : out std_logic;
one_p_out : out std_logic;
 
re_in : in std_logic;
data_out : out std_logic_vector (data_width_g-1 downto 0);
empty_out : out std_logic;
one_d_out : out std_logic
);
end mixed_clk_fifo;
 
architecture rtl of mixed_clk_fifo is
 
component fifo
generic (
data_width_g : integer;
depth_g : integer);
port (
clk : in std_logic;
rst_n : in std_logic;
data_in : in std_logic_vector (data_width_g-1 downto 0);
we_in : in std_logic;
full_out : out std_logic;
one_p_out : out std_logic;
re_in : in std_logic;
data_out : out std_logic_vector (data_width_g-1 downto 0);
empty_out : out std_logic;
one_d_out : out std_logic);
end component;
 
component we_pulse_synchronizer
generic (
data_width_g : integer);
port (
clk_re : in std_logic;
clk_ps_re : in std_logic;
clk_we : in std_logic;
clk_ps_we : in std_logic;
rst_n : in std_logic;
data_in : in std_logic_vector (data_width_g-1 downto 0);
we_in : in std_logic;
full_out : out std_logic;
one_p_out : out std_logic;
data_out : out std_logic_vector (data_width_g-1 downto 0);
we_out : out std_logic;
full_in : in std_logic;
one_p_in : in std_logic);
end component;
 
component re_pulse_synchronizer
generic (
data_width_g : integer);
port (
clk_re : in std_logic;
clk_ps_re : in std_logic;
clk_we : in std_logic;
clk_ps_we : in std_logic;
rst_n : in std_logic;
data_in : in std_logic_vector (data_width_g-1 downto 0);
empty_in : in std_logic;
re_out : out std_logic;
data_out : out std_logic_vector (data_width_g-1 downto 0);
re_in : in std_logic;
empty_out : out std_logic);
end component;
signal data_to_fifo : std_logic_vector (data_width_g-1 downto 0);
signal we_to_fifo : std_logic;
 
signal full_from_fifo : std_logic;
signal one_p_from_fifo : std_logic;
signal re_to_fifo : std_logic;
signal data_from_fifo : std_logic_vector (data_width_g-1 downto 0);
signal empty_from_fifo : std_logic;
signal one_d_from_fifo : std_logic;
 
signal full_out_from_synch : std_logic;
signal empty_out_from_synch : std_logic;
signal one_p_from_synch : std_logic;
 
signal clk_fifo : std_logic;
begin -- rtl
 
 
regular_fifo : fifo
generic map (
data_width_g => data_width_g,
depth_g => depth_g)
port map (
clk => clk_fifo,
rst_n => rst_n,
data_in => data_to_fifo,
we_in => we_to_fifo,
full_out => full_from_fifo,
one_p_out => one_p_from_fifo,
re_in => re_to_fifo,
data_out => data_from_fifo,
empty_out => empty_from_fifo,
one_d_out => one_d_from_fifo
);
refaster: if re_faster_g > 0 generate
we_pulse_synchronizer_1: we_pulse_synchronizer
generic map (
data_width_g => data_width_g)
port map (
clk_re => clk_re,
clk_ps_re => clk_ps_re,
clk_we => clk_we,
clk_ps_we => clk_ps_we,
rst_n => rst_n,
-- to/from we domain
data_in => data_in,
we_in => we_in,
full_out => full_out_from_synch,
one_p_out => one_p_from_synch,
-- to/from re domain
data_out => data_to_fifo,
we_out => we_to_fifo,
full_in => full_from_fifo,
one_p_in => one_p_from_fifo);
 
re_to_fifo <= re_in;
data_out <= data_from_fifo;
empty_out <= empty_from_fifo;
-- NOTE! this is for stupid HIBI which does not start when one_p is '1' and
-- addres is coming
one_p_out <= one_p_from_synch;--'0'; --not full_out_from_synch;
full_out <= full_out_from_synch;
one_d_out <= one_d_from_fifo;
 
clk_fifo <= clk_re;
end generate refaster;
 
wefaster: if re_faster_g = 0 generate
re_pulse_synchronizer_1: re_pulse_synchronizer
generic map (
data_width_g => data_width_g)
port map (
clk_re => clk_re,
clk_ps_re => clk_ps_re,
clk_we => clk_we,
clk_ps_we => clk_ps_we,
rst_n => rst_n,
data_in => data_from_fifo,
empty_in => empty_from_fifo,
re_out => re_to_fifo,
data_out => data_out,
re_in => re_in,
empty_out => empty_out_from_synch
);
 
we_to_fifo <= we_in;
full_out <= full_from_fifo;
one_p_out <= one_p_from_fifo;
data_to_fifo <= data_in;
empty_out <= empty_out_from_synch;
one_d_out <= not empty_out_from_synch;
clk_fifo <= clk_we;
end generate wefaster;
end rtl;
/trunk/TUT/ip.hwp.storage/fifos/multi_clk/Vhdl/re_pulse_synchronizer.vhd
0,0 → 1,170
-------------------------------------------------------------------------------
-- Title : Read pulse synchronizer for Mixed clock FIFO
-- WE faster than re
-- Project :
-------------------------------------------------------------------------------
-- File :
-- Author : kulmala3
-- Created : 16.12.2005
-- Last update: 15.12.2006
-- Description: An extra FIFO slot that synchronizes the data between different
-- clock domains
-------------------------------------------------------------------------------
-- Copyright (c) 2005
--
-------------------------------------------------------------------------------
-- Revisions :
-- Date Version Author Description
-- 16.12.2005 1.0 AK Created
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
 
entity re_pulse_synchronizer is
generic (
data_width_g : integer := 0
);
port (
clk_re : in std_logic; -- THIS IS ALWAYS THE SLOWER CLOCK!!!
clk_ps_re : in std_logic; -- phase shifted pulse
clk_we : in std_logic;
clk_ps_we : in std_logic; -- phase shifted pulse
rst_n : in std_logic;
 
-- from/to we domain
data_in : in std_logic_vector (data_width_g-1 downto 0);
empty_in : in std_logic;
re_out : out std_logic;
 
-- from/to re domain
data_out : out std_logic_vector (data_width_g-1 downto 0);
re_in : in std_logic;
empty_out : out std_logic
 
-- From clk_re domain FIFO
-- full_in : in std_logic;
-- one_p_in : in std_logic
 
 
 
);
end re_pulse_synchronizer;
 
architecture rtl of re_pulse_synchronizer is
 
signal clk_re_was_r : std_logic;
signal clk_re_period_r : std_logic;
 
signal derived_clk : std_logic;
 
signal re_to_fifo : std_logic;
-- signal re_between_r : std_logic;
 
-- signal data_between_r : std_logic_vector(data_width_g-1 downto 0);
signal data_out_r : std_logic_vector(data_width_g-1 downto 0);
signal valid_r : std_logic;
-- signal valid_between_r : std_logic;
signal clk_was_r : std_logic;
signal re_valid_r : std_logic;
signal re_was_r : std_logic;
begin -- rtl
 
derived_clk <= (clk_ps_re nand clk_ps_we) and clk_re;
 
-- read the fifo signals and read to the slot
derclk : process (derived_clk, rst_n)
begin -- process derclk
if rst_n = '0' then -- asynchronous reset (active low)
data_out_r <= (others => '0');
re_to_fifo <= '0';
valid_r <= '0';
clk_re_period_r <= '0';
elsif derived_clk'event and derived_clk = '1' then -- rising clock edge
if re_valid_r = '1' or (re_was_r = '1') then
-- by default, read invalidates data. next if will set again
-- if new one is read instead.
valid_r <= '0';
end if;
if empty_in = '0' and (valid_r = '0' or
(valid_r = '1' and
(re_valid_r = '1' or
(re_was_r = '1' and re_in = '1')))) then
-- read data to output from fifo
re_to_fifo <= '1';
data_out_r <= data_in;
valid_r <= '1';
else
re_to_fifo <= '0';
data_out_r <= data_out_r;
end if;
 
clk_re_period_r <= not clk_re_period_r;
end if;
end process derclk;
 
empty_out <= not valid_r;
data_out <= data_out_r;
re_out <= re_to_fifo and (clk_re_was_r xor clk_re_period_r);
 
re_valid_r <= (clk_was_r xnor clk_re_period_r) and re_in;
 
process (clk_re, rst_n)
begin -- process
if rst_n = '0' then -- asynchronous reset (active low)
clk_was_r <= '0';
re_was_r <= '0';
elsif clk_re'event and clk_re = '1' then -- rising clock edge
clk_was_r <= not clk_was_r;
re_was_r <= re_in;
 
end if;
end process;
 
-- refaster : process (clk_re, rst_n)
-- begin -- process refaster
-- if rst_n = '0' then -- asynchronous reset (active low)
-- re_between_r <= '0';
-- valid_r <= '0';
-- data_out_r <= (others => '0');
 
-- elsif clk_re'event and clk_re = '1' then -- rising clock edge
-- if re_in = '1' then
-- -- by default, read invalidates data. next if will set again
-- -- if new one is read instead.
-- valid_r <= '0';
-- end if;
-- if valid_between_r = '0' and (valid_r = '0' or
-- (valid_r = '1' and re_in = '1')) then
-- -- read data to output from fifo
-- re_between_r <= '1';
-- data_out_r <= data_in;
-- valid_r <= '1';
-- else
-- re_between_r <= '0';
-- data_out_r <= data_between_r;
-- end if;
-- end if;
-- end process refaster;
 
 
-- we faster, make the pulse length equal
process (clk_we, rst_n)
begin -- process
if rst_n = '0' then -- asynchronous reset (active low)
clk_re_was_r <= '0';
elsif clk_we'event and clk_we = '1' then -- rising clock edge
clk_re_was_r <= clk_re_period_r;
end if;
end process;
 
 
end rtl;
/trunk/TUT/ip.hwp.storage/fifos/fifo.vhd
0,0 → 1,310
-------------------------------------------------------------------------------
-- File : fifo.vhdl
-- Description : General fifo buffer
-- Author : Erno Salminen
-- e-mail : erno.salminen@tut.fi
-- Project :
-- Design :
-- Date : 29.04.2002
-- Modified : 30.04.2002 Vesa Lahtinen Optimized for synthesis
--
-- 15.12.04 ES: names changed
-------------------------------------------------------------------------------
-------------------------------------------------------------------------------
-- This file is part of Transaction Generator.
--
-- Transaction Generator is free software: you can redistribute it and/or modify
-- it under the terms of the Lesser GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.
--
-- Transaction Generator is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- Lesser GNU General Public License for more details.
--
-- You should have received a copy of the Lesser GNU General Public License
-- along with Transaction Generator. If not, see <http://www.gnu.org/licenses/>.
-------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
 
entity fifo is
 
generic (
data_width_g : integer := 32;
depth_g : integer := 5
);
port (
clk : in std_logic;
rst_n : in std_logic;
 
data_in : in std_logic_vector (data_width_g-1 downto 0);
we_in : in std_logic;
full_out : out std_logic;
one_p_out : out std_logic;
 
re_in : in std_logic;
data_out : out std_logic_vector (data_width_g-1 downto 0);
empty_out : out std_logic;
one_d_out : out std_logic
);
 
end fifo;
 
architecture behavioral of fifo is
 
 
-- Registers
signal full_r : std_logic;
signal empty_r : std_logic;
signal one_d_r : std_logic;
signal one_p_r : std_logic;
--signal data_amount_r : std_logic_vector (depth_g-1 downto 0);
signal data_amount_r : std_logic_vector (16-1 downto 0);
 
signal in_ptr_r : integer range 0 to depth_g-1;
signal out_ptr_r : integer range 0 to depth_g-1;
 
type data_arr_type is array (depth_g-1 downto 0) of std_logic_vector (data_width_g-1 downto 0);
signal fifo_buffer_r : data_arr_type;
 
 
begin -- behavioral
 
-- Continuous assignments
-- Assigns register values to outputs
full_out <= full_r;
empty_out <= empty_r;
one_d_out <= one_d_r;
one_p_out <= one_p_r;
data_out <= fifo_buffer_r (out_ptr_r); -- mux at output!
-- Note! There is some old value in data output when fifo is empty.
 
Main : process (clk, rst_n)
begin -- process Main
if rst_n = '0' then -- asynchronous reset (active low)
 
-- Reset all registers
-- Fifo is empty at first
full_r <= '0';
empty_r <= '1';
one_d_r <= '0';
in_ptr_r <= 0;
out_ptr_r <= 0;
data_amount_r <= (others => '0');
 
if depth_g =1 then -- 30.07
one_p_r <= '1';
else
one_p_r <= '0';
end if;
 
for i in 0 to depth_g-1 loop
fifo_buffer_r (i) <= (others => '0');
end loop; -- i
 
elsif clk'event and clk = '1' then -- rising clock edge
 
 
-- 1) Write data to fifo
if we_in = '1' and re_in = '0' then
 
if full_r = '0' then
empty_r <= '0';
if (in_ptr_r = (depth_g-1)) then
in_ptr_r <= 0;
else
in_ptr_r <= in_ptr_r + 1;
end if;
out_ptr_r <= out_ptr_r;
data_amount_r <= data_amount_r +1;
fifo_buffer_r (in_ptr_r) <= data_in;
 
-- Check if the fifo is getting full
if data_amount_r + 2 = depth_g then
full_r <= '0';
one_p_r <= '1';
elsif data_amount_r +1 = depth_g then
full_r <= '1';
one_p_r <= '0';
else
full_r <= '0';
one_p_r <= '0';
end if;
 
-- If fifo was empty, it has now one data
if empty_r = '1' then
one_d_r <= '1';
else
one_d_r <= '0';
end if;
 
else
-- in_ptr_r <= in_ptr_r;
-- out_ptr_r <= out_ptr_r;
-- full_r <= full_r;
-- empty_r <= empty_r;
-- fifo_buffer_r <= fifo_buffer_r;
-- data_amount_r <= data_amount_r;
-- one_d_r <= one_d_r;
-- one_p_r <= one_p_r;
end if;
 
-- 2) Read data from fifo
elsif we_in = '0' and re_in = '1' then
 
if empty_r = '0' then
in_ptr_r <= in_ptr_r;
if (out_ptr_r = (depth_g-1)) then
out_ptr_r <= 0;
else
out_ptr_r <= out_ptr_r + 1;
end if;
full_r <= '0';
data_amount_r <= data_amount_r -1;
 
-- Debug
-- fifo_buffer_r (out_ptr_r) <= (others => '1');
 
-- Check if the fifo is getting empty
if data_amount_r = 2 then
empty_r <= '0';
one_d_r <= '1';
elsif data_amount_r = 1 then
empty_r <= '1';
one_d_r <= '0';
else
empty_r <= '0';
one_d_r <= '0';
end if;
 
-- If fifo was full, it is no more
if full_r = '1' then
one_p_r <= '1';
else
one_p_r <= '0';
end if;
 
else
-- in_ptr_r <= in_ptr_r;
-- out_ptr_r <= out_ptr_r;
-- full_r <= full_r;
-- empty_r <= empty_r;
-- fifo_buffer_r <= fifo_buffer_r;
-- data_amount_r <= data_amount_r;
-- one_d_r <= one_d_r;
-- one_p_r <= one_p_r;
end if;
 
 
-- 3) Write and read at the same time
elsif we_in = '1' and re_in = '1' then
 
if full_r = '0' and empty_r = '0' then
if (in_ptr_r = (depth_g-1)) then
in_ptr_r <= 0;
else
in_ptr_r <= in_ptr_r + 1;
end if;
if (out_ptr_r = (depth_g-1)) then
out_ptr_r <= 0;
else
out_ptr_r <= out_ptr_r + 1;
end if;
full_r <= '0';
empty_r <= '0';
data_amount_r <= data_amount_r;
one_d_r <= one_d_r;
one_p_r <= one_p_r;
 
fifo_buffer_r (in_ptr_r) <= data_in;
-- fifo_buffer_r (out_ptr_r) <= (others => '1'); --debug
 
 
elsif full_r = '1' and empty_r = '0' then
-- Fifo is full, only reading is possible
in_ptr_r <= in_ptr_r;
if (out_ptr_r = (depth_g-1)) then
out_ptr_r <= 0;
else
out_ptr_r <= out_ptr_r + 1;
end if;
full_r <= '0';
one_p_r <= '1';
--fifo_buffer_r (out_ptr_r) <= (others => '1'); -- Debug
data_amount_r <= data_amount_r -1;
 
-- Check if the fifo is getting empty
if data_amount_r = 2 then
empty_r <= '0';
one_d_r <= '1';
elsif data_amount_r = 1 then
empty_r <= '1';
one_d_r <= '0';
else
empty_r <= '0';
one_d_r <= '0';
end if;
 
 
elsif full_r = '0' and empty_r = '1' then
-- Fifo is empty, only writing is possible
if (in_ptr_r = (depth_g-1)) then
in_ptr_r <= 0;
else
in_ptr_r <= in_ptr_r + 1;
end if;
out_ptr_r <= out_ptr_r;
empty_r <= '0';
one_d_r <= '1';
fifo_buffer_r (in_ptr_r) <= data_in;
data_amount_r <= data_amount_r +1;
 
-- Check if the fifo is getting full
if data_amount_r + 2 = depth_g then
full_r <= '0';
one_p_r <= '1';
elsif data_amount_r +1 = depth_g then
full_r <= '1';
one_p_r <= '0';
else
full_r <= '0';
one_p_r <= '0';
end if;
 
 
-- 4) Do nothing, fifo remains idle
else
 
-- in_ptr_r <= in_ptr_r;
-- out_ptr_r <= out_ptr_r;
-- full_r <= full_r;
-- empty_r <= empty_r;
-- fifo_buffer_r <= fifo_buffer_r;
-- data_amount_r <= data_amount_r;
-- one_d_r <= one_d_r;
-- one_p_r <= one_p_r;
end if;
 
else
-- Fifo is idle
-- in_ptr_r <= in_ptr_r;
-- out_ptr_r <= out_ptr_r;
-- full_r <= full_r;
-- empty_r <= empty_r;
-- fifo_buffer_r <= fifo_buffer_r;
-- data_amount_r <= data_amount_r;
-- one_d_r <= one_d_r;
-- one_p_r <= one_p_r;
end if;
 
end if;
end process Main;
 
end behavioral;
/trunk/TUT/ip.hwp.storage/fifos/gray_fifo/Testbench/tb_cdc_fifo_tester.vhd
0,0 → 1,113
-------------------------------------------------------------------------------
-- Title : Testbench for design "cdc_fifo_tester"
-- Project :
-------------------------------------------------------------------------------
-- File : tb_cdc_fifo_tester.vhd
-- Author :
-- Created : 19.12.2006
-- Last update: 19.12.2006
-- Description:
-------------------------------------------------------------------------------
-- Copyright (c) 2006
-------------------------------------------------------------------------------
-- Revisions :
-- Date Version Author Description
-- 19.12.2006 1.0 AK Created
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;use ieee.std_logic_1164.all;
 
-------------------------------------------------------------------------------
 
entity tb_cdc_fifo_tester is
 
end tb_cdc_fifo_tester;
 
-------------------------------------------------------------------------------
 
architecture struct of tb_cdc_fifo_tester is
 
component cdc_fifo_tester
generic (
depth_log2_g : integer;
dataw_g : integer);
port (
rd_clk, wr_clk : in std_logic;
rst_n : in std_logic;
pass_out, error_out : out std_logic;
pass_count_out : out std_logic_vector(31 downto 0));
end component;
 
-- component generics
constant depth_log2_g : integer := 3;
constant dataw_g : integer := 30;
 
-- component ports
signal Clk1, Clk2 : std_logic;
signal rst_n : std_logic;
signal pass_out, error_out : std_logic;
signal pass_count_out : std_logic_vector(31 downto 0);
 
-- clock and reset
constant Period1 : time := 100 ns;
constant Period2 : time := 10 ns;
 
begin -- struct
 
assertion: process (Clk1, rst_n)
begin -- process assertion
if rst_n = '0' then -- asynchronous reset (active low)
elsif Clk1'event and Clk1 = '1' then -- rising clock edge
assert error_out = '0' report "Error!" severity error;
end if;
end process assertion;
-- component instantiation
DUT: cdc_fifo_tester
generic map (
depth_log2_g => depth_log2_g,
dataw_g => dataw_g)
port map (
rd_clk => Clk1,
wr_clk => Clk2,
rst_n => rst_n,
pass_out => pass_out,
error_out => error_out,
pass_count_out => pass_count_out);
 
-- clock generation
-- PROC
CLOCK1: process -- generate clock signal for design
variable clktmp: std_logic := '0';
begin
wait for PERIOD1/2;
clktmp := not clktmp;
Clk1 <= clktmp;
end process CLOCK1;
 
-- clock generation
-- PROC
CLOCK2: process -- generate clock signal for design
variable clktmp: std_logic := '0';
begin
wait for PERIOD2/2;
clktmp := not clktmp;
Clk2 <= clktmp;
end process CLOCK2;
-- PROC
RESET: process
begin
Rst_n <= '0'; -- Reset the testsystem
wait for 6*PERIOD1; -- Wait
Rst_n <= '1'; -- de-assert reset
wait;
end process RESET;
 
end struct;
 
-------------------------------------------------------------------------------
/trunk/TUT/ip.hwp.storage/fifos/gray_fifo/Vhdl/cdc_fifo_ctrl.vhd
0,0 → 1,206
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
 
use work.gray_code.all;
 
entity cdc_fifo_ctrl is
generic (
READ_AHEAD_g : integer := 0;
SYNC_CLOCKS_g : integer := 0;
depth_log2_g : integer := 0);
 
port (
rst_n : in std_logic;
 
rd_clk : in std_logic;
rd_en_in : in std_logic;
rd_empty_out : out std_logic;
rd_one_d_out : out std_logic;
rd_addr_out : out std_logic_vector (depth_log2_g-1 downto 0);
 
wr_clk : in std_logic;
wr_en_in : in std_logic;
wr_full_out : out std_logic;
wr_one_p_out : out std_logic;
wr_addr_out : out std_logic_vector (depth_log2_g-1 downto 0)
);
 
end entity cdc_fifo_ctrl;
 
architecture rtl of cdc_fifo_ctrl is
 
 
-- signal wr_counter_synchronized_r : unsigned (depth_log2_g-1 downto 0);
 
 
-- (rd_clk) registers
signal rd_counter_r : unsigned (depth_log2_g-1 downto 0);
signal rd_counter_gray_r : std_logic_vector(depth_log2_g-1 downto 0);
signal wr_counter_gray_sync1_r : std_logic_vector (depth_log2_g-1 downto 0);
signal wr_counter_gray_sync2_r : std_logic_vector (depth_log2_g-1 downto 0);
signal wr_counter_gray_sync3_r : std_logic_vector (depth_log2_g-1 downto 0);
signal rd_empty : std_logic;
-- (wr_clk) registers
signal wr_counter_r : unsigned (depth_log2_g-1 downto 0);
signal wr_counter_gray_r : std_logic_vector(depth_log2_g-1 downto 0);
signal rd_counter_gray_sync1_r : std_logic_vector (depth_log2_g-1 downto 0);
signal rd_counter_gray_sync2_r : std_logic_vector (depth_log2_g-1 downto 0);
signal rd_counter_gray_sync3_r : std_logic_vector (depth_log2_g-1 downto 0);
 
signal rd_counter_next : unsigned (depth_log2_g-1 downto 0);
signal wr_counter_next : unsigned (depth_log2_g-1 downto 0);
 
signal wr_counter_gray_syncd : std_logic_vector(depth_log2_g-1 downto 0);
signal rd_counter_gray_syncd : std_logic_vector(depth_log2_g-1 downto 0);
begin -- architecture rtl
 
-- concurrent assignments
wr_addr_out <= std_logic_vector(wr_counter_r);
 
--AK TESTE CAHNGED
-- data is available at the same clock cylce as the rd_en_in = '1'
readahead : if READ_AHEAD_g /= 0 generate
rd_addr_out <= std_logic_vector(rd_counter_next) when (rd_en_in = '1' and rd_empty = '0') else
std_logic_vector(rd_counter_r);
end generate readahead;
 
-- data is available at the next clock cycle
no_readahead : if READ_AHEAD_g = 0 generate
rd_addr_out <= std_logic_vector(rd_counter_r);
end generate no_readahead;
 
 
-- purpose: counter logic for write address (binary counter + gray counter)
-- type : sequential
-- inputs : wr_clk, rst_n
-- outputs:
wr_counter_next <= wr_counter_r + 1;
write_counter : process (rst_n, wr_clk) is
begin -- process write_counter
if (rst_n = '0') then -- asynchronous reset (active low)
wr_counter_r <= (others => '0');
wr_counter_gray_r <= (others => '0');
wr_counter_gray_sync1_r <= (others => '0');
elsif rising_edge(wr_clk) then -- rising clock edge
-- check also if becoming full
if (wr_en_in = '1') then
wr_counter_r <= wr_counter_next;
wr_counter_gray_r <= gray_encode(wr_counter_next);
end if;
wr_counter_gray_sync1_r <= wr_counter_gray_r;
end if;
end process write_counter;
 
-- purpose: counter logic for read address (binary counter & gray counter)
-- type : sequential
-- inputs : rd_clk, rst_n
-- outputs:
rd_counter_next <= rd_counter_r + 1;
read_counter : process (rd_clk, rst_n) is
begin -- process read_counter
if (rst_n = '0') then -- asynchronous reset (active low)
rd_counter_r <= (others => '0');
rd_counter_gray_r <= (others => '0');
elsif rising_edge(rd_clk) then -- rising clock edge
-- check also if becoming empty
if (rd_en_in = '1') then -- and (not rd_counter_gray_r = wr_counter_gray_syncd)
rd_counter_r <= rd_counter_next;
rd_counter_gray_r <= gray_encode(rd_counter_next);
end if;
end if;
end process read_counter;
 
 
syncd_clocks : if SYNC_CLOCKS_g /= 0 generate
-- use only 1 synchronization register
wr_counter_gray_syncd <= wr_counter_gray_sync1_r;
rd_counter_gray_syncd <= rd_counter_gray_sync1_r;
end generate syncd_clocks;
 
no_syncd_clocks : if SYNC_CLOCKS_g = 0 generate
-- use 2 synchronization registers
-- wr_counter_gray_syncd <= wr_counter_gray_sync2_r;
rd_counter_gray_syncd <= rd_counter_gray_sync2_r;
wr_counter_gray_syncd <= wr_counter_gray_sync3_r;
-- rd_counter_gray_syncd <= rd_counter_gray_sync3_r;
end generate no_syncd_clocks;
 
 
rd_empty_out <= rd_empty;
 
-- purpose: determines whether the fifo is empty or not
-- combinational inputs : rd_counter_r, wr_counter_sync2_r outputs:
-- empty
empty_logic : process (rd_counter_gray_r, wr_counter_gray_syncd,
rd_counter_r) is
begin -- process empty_logic
if (rd_counter_gray_r = wr_counter_gray_syncd) then
rd_empty <= '1';
else
rd_empty <= '0';
end if;
 
if (gray_encode(rd_counter_r+1) = wr_counter_gray_syncd) then
rd_one_d_out <= '1';
else
rd_one_d_out <= '0';
end if;
end process empty_logic;
 
 
 
full_logic : process (rd_counter_gray_syncd, wr_counter_next) is
begin -- process full_logic
if (rd_counter_gray_syncd = gray_encode(wr_counter_next)) then
wr_full_out <= '1';
else
wr_full_out <= '0';
end if;
 
if rd_counter_gray_syncd = gray_encode(wr_counter_next+1) then
wr_one_p_out <= '1';
else
wr_one_p_out <= '0';
end if;
end process full_logic;
 
-- purpose: Synchronizes write counter value to read -side clock domain.
-- type : sequential (avoids meta-stability)
-- inputs : rd_clk, rst_n
-- outputs:
rd_synchronizer : process (rd_clk, rst_n) is
begin -- process rd_synchronizer
if rst_n = '0' then -- asynchronous reset (active low)
-- wr_counter_gray_sync1_r <= (others => '0');
wr_counter_gray_sync2_r <= (others => '0');
wr_counter_gray_sync3_r <= (others => '0');
elsif rising_edge(rd_clk) then -- rising clock edge
-- wr_counter_gray_sync1_r <= wr_counter_gray_r;
wr_counter_gray_sync2_r <= wr_counter_gray_sync1_r;
wr_counter_gray_sync3_r <= wr_counter_gray_sync2_r;
end if;
end process rd_synchronizer;
 
-- purpose: Synchronizes read counter value to write -side clock domain.
-- type : sequential (avoids meta-stability)
-- inputs : wr_clk, rst_n
-- outputs:
wr_synchronizer : process (rst_n, wr_clk) is
begin -- process rd_synchronizer
if rst_n = '0' then -- asynchronous reset (active low)
rd_counter_gray_sync1_r <= (others => '0');
rd_counter_gray_sync2_r <= (others => '0');
rd_counter_gray_sync3_r <= (others => '0');
elsif rising_edge(wr_clk) then -- rising clock edge
rd_counter_gray_sync1_r <= rd_counter_gray_r;
rd_counter_gray_sync2_r <= rd_counter_gray_sync1_r;
rd_counter_gray_sync3_r <= rd_counter_gray_sync2_r;
end if;
end process wr_synchronizer;
 
end architecture rtl;
/trunk/TUT/ip.hwp.storage/fifos/gray_fifo/Vhdl/async_dpram.vhd
0,0 → 1,18
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
 
entity async_dpram is
generic (
addrw_g : integer := 0;
dataw_g : integer := 0);
 
port (
rd_clk, wr_clk : in std_logic;
wr_en_in : in std_logic;
data_in : in std_logic_vector(dataw_g-1 downto 0);
data_out : out std_logic_vector(dataw_g-1 downto 0);
rd_addr_in, wr_addr_in : in std_logic_vector (addrw_g-1 downto 0));
 
end entity async_dpram;
/trunk/TUT/ip.hwp.storage/fifos/gray_fifo/Vhdl/gray.vhd
0,0 → 1,39
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
 
package gray_code is
 
function gray_encode (B : unsigned) -- binary input
return std_logic_vector; -- gray coded output
 
function gray_decode (G : std_logic_vector) -- gray coded input
return unsigned; -- binary output
 
end package gray_code;
 
package body gray_code is
 
function gray_encode (B : unsigned)
return std_logic_vector is
variable G : std_logic_vector(B'range);
begin
G(B'left) := B(B'left);
for i in B'left - 1 downto B'right loop
G(i) := B(i+1) xor B(i);
end loop; -- i
return G;
end gray_encode;
 
function gray_decode (G : std_logic_vector)
return unsigned is
variable B : unsigned(G'range);
begin
B(G'left) := G(G'left);
for i in G'left - 1 downto G'right loop
B(i) := B(i+1) xor G(i);
end loop; -- i
return B;
end gray_decode;
 
end package body gray_code;
/trunk/TUT/ip.hwp.storage/fifos/gray_fifo/Vhdl/cdc_fifo_tester.vhd
0,0 → 1,165
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
 
entity cdc_fifo_tester is
 
generic (
depth_log2_g : integer := 2;
dataw_g : integer := 30
);
 
port (
rd_clk, wr_clk : in std_logic;
rst_n : in std_logic;
pass_out, error_out : out std_logic;
pass_count_out : out std_logic_vector(31 downto 0));
 
end entity cdc_fifo_tester;
 
architecture rtl of cdc_fifo_tester is
 
signal input_ctr_r : unsigned(dataw_g-1 downto 0);
signal expected_ctr_r : unsigned(dataw_g-1 downto 0);
signal check_r : std_logic;
signal wr_state : integer range 0 to 3 := 0;
 
constant READ_AHEAD_co : integer := 0;
 
signal wr_data_in : std_logic_vector(dataw_g-1 downto 0);
signal rd_data_out : std_logic_vector(dataw_g-1 downto 0);
signal rd_empty_out, wr_full_out : std_logic;
signal wr_en, rd_en : std_logic;
 
signal pass_count_r : unsigned(31 downto 0);
 
signal wr_empty_r : std_logic;
signal rd_full_r : std_logic;
signal wr_empty2_r : std_logic;
signal rd_full2_r : std_logic;
 
signal re_to_fifo : std_logic;
constant wr_wait_c : integer := 10;
signal wr_wait_r : integer range 0 to wr_wait_c-1;
signal we_wait_r : std_logic;
begin -- architecture rtl
 
cdc_fifo_inst : entity work.cdc_fifo
generic map (
READ_AHEAD_g => READ_AHEAD_co,
SYNC_CLOCKS_g => 0,
depth_log2_g => depth_log2_g,
dataw_g => dataw_g)
port map (
rst_n => rst_n,
rd_clk => rd_clk,
rd_en_in => re_to_fifo, --rd_en,
rd_empty_out => rd_empty_out,
rd_data_out => rd_data_out,
wr_clk => wr_clk,
wr_en_in => wr_en,
wr_full_out => wr_full_out,
wr_data_in => wr_data_in);
 
re_to_fifo <= '1';
wr_data_in <= std_logic_vector(input_ctr_r);
pass_count_out <= std_logic_vector(pass_count_r);
 
x : process (wr_state, wr_full_out, rd_empty_out)
begin
if (wr_state < 2) then
-- write inputs as fast as possible.
-- (i.e. write when fifo is not full)
-- read as fast as possible.
-- (i.e. read when fifo is not empty)
wr_en <= not wr_full_out;
rd_en <= not rd_empty_out;
elsif (wr_state = 2) then
-- write inputs "as slow as possible"!
-- (i.e. write only when fifo is empty)
-- read whne fifo is not empty.
-- wr_en <= wr_empty2_r;
-- wr_en <= not wr_full_out;
wr_en <= we_wait_r;
rd_en <= not rd_empty_out;
else
-- write inputs as fast as possible.
-- (i.e. write when fifo is not full)
-- read only when fifo is full
wr_en <= not wr_full_out;
rd_en <= not rd_empty_out;
--rd_en <= rd_full2_r;
end if;
end process x;
 
inproc : process (wr_clk, rst_n) is
begin -- process inproc
if rst_n = '0' then -- asynchronous reset (active low)
input_ctr_r <= (others => '0');
wr_state <= 0;
pass_out <= '0';
pass_count_r <= (others => '0');
wr_empty_r <= '0';
wr_empty2_r <= '0';
wr_wait_r <= 0;
we_wait_r <= '0';
elsif rising_edge(wr_clk) then -- rising clock edge
wr_empty_r <= rd_empty_out;
wr_empty2_r <= wr_empty_r;
 
if (wr_en = '1') then
input_ctr_r <= input_ctr_r + 1;
 
pass_out <= '0';
-- change state when pass/round done
if (input_ctr_r = 2**dataw_g - 1) then
wr_state <= (wr_state + 1) mod 4;
pass_out <= '1';
pass_count_r <= pass_count_r + 1;
input_ctr_r <= (others => '0');
end if;
end if;
 
if wr_state = 2 then
if wr_wait_r < wr_wait_c-1 then
wr_wait_r <= wr_wait_r+1;
we_wait_r <= '0';
else
we_wait_r <= '1' and (not wr_full_out);
end if;
else
wr_wait_r <= 0;
end if;
end if;
end process inproc;
 
 
 
outchecker : process (rd_clk, rst_n) is
begin -- process outcheker
if rst_n = '0' then -- asynchronous reset (active low)
expected_ctr_r <= (others => '0');
check_r <= '0';
error_out <= '0';
rd_full_r <= '0';
rd_full2_r <= '0';
elsif rising_edge(rd_clk) then -- rising clock edge
check_r <= rd_en;
rd_full_r <= wr_full_out;
rd_full2_r <= rd_full_r;
if ((check_r = '1' and READ_AHEAD_co = 0) or
(rd_en = '1' and READ_AHEAD_co /= 0)) then
if (std_logic_vector(expected_ctr_r) /= rd_data_out) then
assert (false) report "test failed!" severity failure;
error_out <= '1';
end if;
expected_ctr_r <= expected_ctr_r + 1;
end if;
end if;
end process outchecker;
 
end architecture rtl;
/trunk/TUT/ip.hwp.storage/fifos/gray_fifo/Vhdl/Test_codes/async_dpram_generic_v2.vhd
0,0 → 1,34
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
 
architecture rtl of async_dpram is
 
type mem_t is array (0 to 2**addrw_g - 1) of std_logic_vector(dataw_g-1 downto 0);
 
signal memory : mem_t;
signal wr_addr, rd_addr : integer;
signal data_out_r : std_logic_vector(dataw_g-1 downto 0);
begin -- architecture rtl
 
wr_addr <= to_integer (unsigned(wr_addr_in));
rd_addr <= to_integer (unsigned(rd_addr_in));
data_out <= data_out_r;
 
wr : process (wr_en_in, data_in) is
begin -- process write
-- if rising_edge(wr_clk) then -- rising clock edge
if (wr_en_in = '1') then
memory(wr_addr) <= data_in;
end if;
-- end if;
end process wr;
-- data_out_r <= memory(rd_addr);
-- rd : process (rd_clk) is
-- begin -- process rd
-- if rising_edge(rd_clk) then
data_out_r <= memory(rd_addr);
-- end if;
-- end process rd;
 
end architecture rtl;
/trunk/TUT/ip.hwp.storage/fifos/gray_fifo/Vhdl/Test_codes/async_dpram_altsyncram_v2.vhd
0,0 → 1,45
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
 
architecture rtl of async_dpram is
component ram2p_altsyncram_hh41
port (
address_a : in std_logic_vector (3 downto 0);
address_b : in std_logic_vector (3 downto 0) := (others => '1');
clock0 : in std_logic := '1';
clock1 : in std_logic := '1';
data_a : in std_logic_vector (35 downto 0) := (others => '1');
q_b : out std_logic_vector (35 downto 0);
wren_a : in std_logic := '0');
end component;
 
signal ONE : std_logic;
begin -- architecture rtl
ONE <= '1';
--
ram2p_altsyncram_hh41_1: ram2p_altsyncram_hh41
port map (
address_a => '0' & wr_addr_in,
address_b => '0' & rd_addr_in,
clock0 => wr_clk,
clock1 => rd_clk,
data_a => data_in,
q_b => data_out,
wren_a => wr_en_in
);
 
-- generic (
-- addrw_g : integer := 0;
-- dataw_g : integer := 0);
 
-- port (
-- rd_clk, wr_clk : in std_logic;
-- wr_en_in : in std_logic;
-- data_in : in std_logic_vector(dataw_g-1 downto 0);
-- data_out : out std_logic_vector(dataw_g-1 downto 0);
-- rd_addr_in, wr_addr_in : in std_logic_vector (addrw_g-1 downto 0));
 
end architecture rtl;
/trunk/TUT/ip.hwp.storage/fifos/gray_fifo/Vhdl/Test_codes/cdc_fifo_ctrl_v2.vhd
0,0 → 1,202
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
 
use work.gray_code.all;
 
entity cdc_fifo_ctrl is
generic (
READ_AHEAD_g : integer := 0;
SYNC_CLOCKS_g : integer := 0;
depth_log2_g : integer := 0);
 
port (
rst_n : in std_logic;
 
rd_clk : in std_logic;
rd_en_in : in std_logic;
rd_empty_out : out std_logic;
rd_one_d_out : out std_logic;
rd_addr_out : out std_logic_vector (depth_log2_g-1 downto 0);
 
wr_clk : in std_logic;
wr_en_in : in std_logic;
wr_full_out : out std_logic;
wr_one_p_out : out std_logic;
wr_addr_out : out std_logic_vector (depth_log2_g-1 downto 0)
);
 
end entity cdc_fifo_ctrl;
 
architecture rtl of cdc_fifo_ctrl is
 
 
-- signal wr_counter_synchronized_r : unsigned (depth_log2_g-1 downto 0);
 
 
-- (rd_clk) registers
signal rd_counter_r : unsigned (depth_log2_g-1 downto 0);
signal rd_counter_gray_r : std_logic_vector(depth_log2_g-1 downto 0);
signal wr_counter_gray_sync1_r : std_logic_vector (depth_log2_g-1 downto 0);
signal wr_counter_gray_sync2_r : std_logic_vector (depth_log2_g-1 downto 0);
signal wr_counter_gray_sync3_r : std_logic_vector (depth_log2_g-1 downto 0);
signal rd_empty : std_logic;
-- (wr_clk) registers
signal wr_counter_r : unsigned (depth_log2_g-1 downto 0);
signal wr_counter_gray_r : std_logic_vector(depth_log2_g-1 downto 0);
signal rd_counter_gray_sync1_r : std_logic_vector (depth_log2_g-1 downto 0);
signal rd_counter_gray_sync2_r : std_logic_vector (depth_log2_g-1 downto 0);
signal rd_counter_gray_sync3_r : std_logic_vector (depth_log2_g-1 downto 0);
 
signal rd_counter_next : unsigned (depth_log2_g-1 downto 0);
signal wr_counter_next : unsigned (depth_log2_g-1 downto 0);
 
signal wr_counter_gray_syncd : std_logic_vector(depth_log2_g-1 downto 0);
signal rd_counter_gray_syncd : std_logic_vector(depth_log2_g-1 downto 0);
begin -- architecture rtl
 
-- concurrent assignments
wr_addr_out <= std_logic_vector(wr_counter_r);
 
-- data is available at the same clock cylce as the rd_en_in = '1'
readahead : if READ_AHEAD_g /= 0 generate
rd_addr_out <= std_logic_vector(rd_counter_next) when (rd_en_in = '1' and rd_empty = '0') else
std_logic_vector(rd_counter_r);
end generate readahead;
 
-- data is available at the next clock cycle
no_readahead : if READ_AHEAD_g = 0 generate
rd_addr_out <= std_logic_vector(rd_counter_r);
end generate no_readahead;
 
 
-- purpose: counter logic for write address (binary counter + gray counter)
-- type : sequential
-- inputs : wr_clk, rst_n
-- outputs:
wr_counter_next <= wr_counter_r + 1;
write_counter : process (rst_n, wr_clk) is
begin -- process write_counter
if (rst_n = '0') then -- asynchronous reset (active low)
wr_counter_r <= (others => '0');
wr_counter_gray_r <= (others => '0');
elsif rising_edge(wr_clk) then -- rising clock edge
-- check also if becoming full
if (wr_en_in = '1') then
wr_counter_r <= wr_counter_next;
wr_counter_gray_r <= gray_encode(wr_counter_next);
end if;
end if;
end process write_counter;
 
-- purpose: counter logic for read address (binary counter & gray counter)
-- type : sequential
-- inputs : rd_clk, rst_n
-- outputs:
rd_counter_next <= rd_counter_r + 1;
read_counter : process (rd_clk, rst_n) is
begin -- process read_counter
if (rst_n = '0') then -- asynchronous reset (active low)
rd_counter_r <= (others => '0');
rd_counter_gray_r <= (others => '0');
elsif rising_edge(rd_clk) then -- rising clock edge
-- check also if becoming empty
if (rd_en_in = '1') then -- and (not rd_counter_gray_r = wr_counter_gray_syncd)
rd_counter_r <= rd_counter_next;
rd_counter_gray_r <= gray_encode(rd_counter_next);
end if;
end if;
end process read_counter;
 
 
syncd_clocks : if SYNC_CLOCKS_g /= 0 generate
-- use only 1 synchronization register
wr_counter_gray_syncd <= wr_counter_gray_sync1_r;
rd_counter_gray_syncd <= rd_counter_gray_sync1_r;
end generate syncd_clocks;
 
no_syncd_clocks : if SYNC_CLOCKS_g = 0 generate
-- use 2 synchronization registers
---- wr_counter_gray_syncd <= wr_counter_gray_sync2_r;
rd_counter_gray_syncd <= rd_counter_gray_sync2_r;
wr_counter_gray_syncd <= wr_counter_gray_sync3_r;
-- rd_counter_gray_syncd <= rd_counter_gray_sync3_r;
end generate no_syncd_clocks;
 
 
rd_empty_out <= rd_empty;
 
-- purpose: determines whether the fifo is empty or not
-- combinational inputs : rd_counter_r, wr_counter_sync2_r outputs:
-- empty
empty_logic : process (rd_counter_gray_r, wr_counter_gray_syncd) is
begin -- process empty_logic
if (rd_counter_gray_r = wr_counter_gray_syncd) then
rd_empty <= '1';
else
rd_empty <= '0';
end if;
 
if (gray_encode(rd_counter_r+1) = wr_counter_gray_syncd) then
rd_one_d_out <= '1';
else
rd_one_d_out <= '0';
end if;
end process empty_logic;
 
 
 
full_logic : process (rd_counter_gray_syncd, wr_counter_next) is
begin -- process full_logic
if (rd_counter_gray_syncd = gray_encode(wr_counter_next)) then
wr_full_out <= '1';
else
wr_full_out <= '0';
end if;
 
if rd_counter_gray_syncd = gray_encode(wr_counter_next+1) then
wr_one_p_out <= '1';
else
wr_one_p_out <= '0';
end if;
end process full_logic;
 
-- purpose: Synchronizes write counter value to read -side clock domain.
-- type : sequential (avoids meta-stability)
-- inputs : rd_clk, rst_n
-- outputs:
rd_synchronizer : process (rd_clk, rst_n) is
begin -- process rd_synchronizer
if rst_n = '0' then -- asynchronous reset (active low)
wr_counter_gray_sync1_r <= (others => '0');
wr_counter_gray_sync2_r <= (others => '0');
wr_counter_gray_sync3_r <= (others => '0');
elsif rising_edge(rd_clk) then -- rising clock edge
wr_counter_gray_sync1_r <= wr_counter_gray_r;
wr_counter_gray_sync2_r <= wr_counter_gray_sync1_r;
wr_counter_gray_sync3_r <= wr_counter_gray_sync2_r;
end if;
end process rd_synchronizer;
 
-- purpose: Synchronizes read counter value to write -side clock domain.
-- type : sequential (avoids meta-stability)
-- inputs : wr_clk, rst_n
-- outputs:
wr_synchronizer : process (rst_n, wr_clk) is
begin -- process rd_synchronizer
if rst_n = '0' then -- asynchronous reset (active low)
rd_counter_gray_sync1_r <= (others => '0');
rd_counter_gray_sync2_r <= (others => '0');
rd_counter_gray_sync3_r <= (others => '0');
elsif rising_edge(wr_clk) then -- rising clock edge
rd_counter_gray_sync1_r <= rd_counter_gray_r;
rd_counter_gray_sync2_r <= rd_counter_gray_sync1_r;
rd_counter_gray_sync3_r <= rd_counter_gray_sync2_r;
end if;
end process wr_synchronizer;
 
end architecture rtl;
/trunk/TUT/ip.hwp.storage/fifos/gray_fifo/Vhdl/Test_codes/async_dpram_altsyncram.vhd
0,0 → 1,177
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
 
architecture rtl of async_dpram is
component altsyncram
generic
(
ADDRESS_ACLR_A : string := "UNUSED";
ADDRESS_ACLR_B : string := "NONE";
ADDRESS_REG_B : string := "CLOCK1";
BYTE_SIZE : natural := 8;
BYTEENA_ACLR_A : string := "UNUSED";
BYTEENA_ACLR_B : string := "NONE";
BYTEENA_REG_B : string := "CLOCK1";
CLOCK_ENABLE_INPUT_A : string := "NORMAL";
CLOCK_ENABLE_INPUT_B : string := "NORMAL";
CLOCK_ENABLE_OUTPUT_A : string := "NORMAL";
CLOCK_ENABLE_OUTPUT_B : string := "NORMAL";
INTENDED_DEVICE_FAMILY : string := "UNUSED";
IMPLEMENT_IN_LES : string := "OFF";
INDATA_ACLR_A : string := "UNUSED";
INDATA_ACLR_B : string := "NONE";
INDATA_REG_B : string := "CLOCK1";
INIT_FILE : string := "UNUSED";
INIT_FILE_LAYOUT : string := "PORT_A";
MAXIMUM_DEPTH : natural := 0;
NUMWORDS_A : natural := 0;
NUMWORDS_B : natural := 0;
OPERATION_MODE : string := "BIDIR_DUAL_PORT";
OUTDATA_ACLR_A : string := "NONE";
OUTDATA_ACLR_B : string := "NONE";
OUTDATA_REG_A : string := "UNREGISTERED";
OUTDATA_REG_B : string := "UNREGISTERED";
RAM_BLOCK_TYPE : string := "AUTO";
RDCONTROL_ACLR_B : string := "NONE";
RDCONTROL_REG_B : string := "CLOCK1";
READ_DURING_WRITE_MODE_MIXED_PORTS : string := "DONT_CARE";
WIDTH_A : natural;
WIDTH_B : natural := 1;
WIDTH_BYTEENA_A : natural := 1;
WIDTH_BYTEENA_B : natural := 1;
WIDTHAD_A : natural;
WIDTHAD_B : natural := 1;
WRCONTROL_ACLR_A : string := "UNUSED";
WRCONTROL_ACLR_B : string := "NONE";
WRCONTROL_WRADDRESS_REG_B : string := "CLOCK1";
LPM_HINT : string := "UNUSED";
LPM_TYPE : string := "ALTSYNCRAM"
);
 
port (
wren_a : in std_logic;
address_a : in std_logic_vector(WIDTHAD_A-1 downto 0);
address_b : in std_logic_vector(WIDTHAD_B-1 downto 0);
clock0, clock1, rden_b : in std_logic;
data_a : in std_logic_vector(WIDTH_A-1 downto 0);
data_b : in std_logic_vector(WIDTH_B-1 downto 0);
q_a : out std_logic_vector(WIDTH_A-1 downto 0);
q_b : out std_logic_vector(WIDTH_B-1 downto 0)
);
 
end component;
constant ADDRESS_ACLR_A : STRING := "UNUSED";
constant ADDRESS_ACLR_B : STRING := "NONE";
constant ADDRESS_REG_B : STRING := "CLOCK1";
constant BYTE_SIZE : NATURAL := 8;
constant BYTEENA_ACLR_A : STRING := "UNUSED";
constant BYTEENA_ACLR_B : STRING := "NONE";
constant BYTEENA_REG_B : STRING := "CLOCK1";
constant CLOCK_ENABLE_INPUT_A : STRING := "NORMAL"; -- normal...
constant CLOCK_ENABLE_INPUT_B : STRING := "NORMAL";
constant CLOCK_ENABLE_OUTPUT_A : STRING := "NORMAL";
constant CLOCK_ENABLE_OUTPUT_B : STRING := "NORMAL";
constant INTENDED_DEVICE_FAMILY : STRING := "UNUSED";
constant IMPLEMENT_IN_LES : STRING := "OFF";
constant INDATA_ACLR_A : STRING := "UNUSED";
constant INDATA_ACLR_B : STRING := "NONE";
constant INDATA_REG_B : STRING := "CLOCK1";
constant INIT_FILE : STRING := "UNUSED";
constant INIT_FILE_LAYOUT : STRING := "PORT_A";
constant MAXIMUM_DEPTH : NATURAL := 0;
constant NUMWORDS_A : NATURAL := 2**addrw_g;
constant NUMWORDS_B : NATURAL := 2**addrw_g;
constant OPERATION_MODE : STRING := "DUAL_PORT";
constant OUTDATA_ACLR_A : STRING := "NONE";
constant OUTDATA_ACLR_B : STRING := "NONE";
constant OUTDATA_REG_A : STRING := "UNREGISTERED";
constant OUTDATA_REG_B : STRING := "UNREGISTERED";
constant RAM_BLOCK_TYPE : STRING := "AUTO";
constant RDCONTROL_ACLR_B : STRING := "NONE";
constant RDCONTROL_REG_B : STRING := "CLOCK1";
constant READ_DURING_WRITE_MODE_MIXED_PORTS : STRING := "DONT_CARE";
constant WIDTH_A : NATURAL := dataw_g;
constant WIDTH_B : NATURAL := dataw_g;
constant WIDTH_BYTEENA_A : NATURAL := 1;
constant WIDTH_BYTEENA_B : NATURAL := 1;
constant WIDTHAD_A : NATURAL := addrw_g;
constant WIDTHAD_B : NATURAL := addrw_g;
constant WRCONTROL_ACLR_A : STRING := "UNUSED";
constant WRCONTROL_ACLR_B : STRING := "NONE";
constant WRCONTROL_WRADDRESS_REG_B : STRING := "CLOCK1";
constant LPM_HINT : STRING := "UNUSED";
constant LPM_TYPE : STRING := "ALTSYNCRAM";
 
signal ONE : std_logic;
begin -- architecture rtl
ONE <= '1';
 
altsyncram_1 : altsyncram
generic map (
ADDRESS_ACLR_A => ADDRESS_ACLR_A,
ADDRESS_ACLR_B => ADDRESS_ACLR_B,
ADDRESS_REG_B => ADDRESS_REG_B,
BYTE_SIZE => BYTE_SIZE,
BYTEENA_ACLR_A => BYTEENA_ACLR_A,
BYTEENA_ACLR_B => BYTEENA_ACLR_B,
BYTEENA_REG_B => BYTEENA_REG_B,
CLOCK_ENABLE_INPUT_A => CLOCK_ENABLE_INPUT_A,
CLOCK_ENABLE_INPUT_B => CLOCK_ENABLE_INPUT_B,
CLOCK_ENABLE_OUTPUT_A => CLOCK_ENABLE_OUTPUT_A,
CLOCK_ENABLE_OUTPUT_B => CLOCK_ENABLE_OUTPUT_B,
INTENDED_DEVICE_FAMILY => INTENDED_DEVICE_FAMILY,
IMPLEMENT_IN_LES => IMPLEMENT_IN_LES,
INDATA_ACLR_A => INDATA_ACLR_A,
INDATA_ACLR_B => INDATA_ACLR_B,
INDATA_REG_B => INDATA_REG_B,
INIT_FILE => INIT_FILE,
INIT_FILE_LAYOUT => INIT_FILE_LAYOUT,
MAXIMUM_DEPTH => MAXIMUM_DEPTH,
NUMWORDS_A => NUMWORDS_A,
NUMWORDS_B => NUMWORDS_B,
OPERATION_MODE => OPERATION_MODE,
OUTDATA_ACLR_A => OUTDATA_ACLR_A,
OUTDATA_ACLR_B => OUTDATA_ACLR_B,
OUTDATA_REG_A => OUTDATA_REG_A,
OUTDATA_REG_B => OUTDATA_REG_B,
RAM_BLOCK_TYPE => RAM_BLOCK_TYPE,
RDCONTROL_ACLR_B => RDCONTROL_ACLR_B,
RDCONTROL_REG_B => RDCONTROL_REG_B,
READ_DURING_WRITE_MODE_MIXED_PORTS => READ_DURING_WRITE_MODE_MIXED_PORTS,
WIDTH_A => WIDTH_A,
WIDTH_B => WIDTH_B,
WIDTH_BYTEENA_A => WIDTH_BYTEENA_A,
WIDTH_BYTEENA_B => WIDTH_BYTEENA_B,
WIDTHAD_A => WIDTHAD_A,
WIDTHAD_B => WIDTHAD_B,
WRCONTROL_ACLR_A => WRCONTROL_ACLR_A,
WRCONTROL_ACLR_B => WRCONTROL_ACLR_B,
WRCONTROL_WRADDRESS_REG_B => WRCONTROL_WRADDRESS_REG_B,
LPM_HINT => LPM_HINT,
LPM_TYPE => LPM_TYPE)
port map (
wren_a => wr_en_in,
address_a => wr_addr_in,
address_b => rd_addr_in,
clock0 => wr_clk,
clock1 => rd_clk,
rden_b => ONE,
data_a => data_in,
q_b => data_out
);
 
--
-- generic (
-- addrw_g : integer := 0;
-- dataw_g : integer := 0);
 
-- port (
-- rd_clk, wr_clk : in std_logic;
-- wr_en_in : in std_logic;
-- data_in : in std_logic_vector(dataw_g-1 downto 0);
-- data_out : out std_logic_vector(dataw_g-1 downto 0);
-- rd_addr_in, wr_addr_in : in std_logic_vector (addrw_g-1 downto 0));
 
end architecture rtl;
/trunk/TUT/ip.hwp.storage/fifos/gray_fifo/Vhdl/cdc_fifo.vhd
0,0 → 1,100
-------------------------------------------------------------------------------
-- Title : Gray counter based mixed clock FIFO
-- Project :
-------------------------------------------------------------------------------
-- File : cdc_fifo.vhd
-- Author :
-- Created : 19.12.2006
-- Last update: 19.12.2006
-- Description:
-------------------------------------------------------------------------------
-- Copyright (c) 2006
-------------------------------------------------------------------------------
-- Revisions :
-- Date Version Author Description
-- 2006 1.0 Timo Alho Created
-- 19.12.2006 Ari Kulmala Comments. header. one p and one d
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
 
entity cdc_fifo is
generic (
READ_AHEAD_g : integer := 0;
SYNC_CLOCKS_g : integer := 0; -- 0 two flop synch, otherwise 1 flop synch
depth_log2_g : integer := 5;
dataw_g : integer := 32);
 
port (
rst_n : in std_logic;
rd_clk : in std_logic;
rd_en_in : in std_logic;
rd_empty_out : out std_logic;
rd_one_d_out : out std_logic;
rd_data_out : out std_logic_vector(dataw_g-1 downto 0);
 
wr_clk : in std_logic;
wr_en_in : in std_logic;
wr_full_out : out std_logic;
wr_one_p_out : out std_logic;
wr_data_in : in std_logic_vector(dataw_g-1 downto 0)
);
 
end entity cdc_fifo;
 
architecture rtl of cdc_fifo is
 
signal wr_en, rd_en : std_logic;
signal rd_addr, wr_addr : std_logic_vector(depth_log2_g-1 downto 0);
 
signal wr_full, rd_empty : std_logic;
begin -- architecture rtl
 
wr_full_out <= wr_full;
rd_empty_out <= rd_empty;
-- write cannot be '1' when full,
wr_en <= wr_en_in and (not wr_full);
-- read cannot be asserted wen empty
rd_en <= rd_en_in and (not rd_empty);
 
fifo_ram_storage : entity work.async_dpram
generic map (
addrw_g => depth_log2_g,
dataw_g => dataw_g)
port map (
rd_clk => rd_clk,
wr_clk => wr_clk,
wr_en_in => wr_en,
data_in => wr_data_in,
data_out => rd_data_out,
rd_addr_in => rd_addr,
wr_addr_in => wr_addr);
 
cdc_fifo_ctrl_2 : entity work.cdc_fifo_ctrl
generic map (
READ_AHEAD_g => READ_AHEAD_g,
SYNC_CLOCKS_g => SYNC_CLOCKS_g,
depth_log2_g => depth_log2_g)
port map (
rst_n => rst_n,
rd_clk => rd_clk,
rd_en_in => rd_en,
rd_empty_out => rd_empty,
rd_addr_out => rd_addr,
rd_one_d_out => rd_one_d_out,
wr_clk => wr_clk,
wr_en_in => wr_en,
wr_full_out => wr_full,
wr_one_p_out => wr_one_p_out,
wr_addr_out => wr_addr
);
 
end architecture rtl;
/trunk/TUT/ip.hwp.storage/fifos/gray_fifo/Vhdl/async_dpram_generic.vhd
0,0 → 1,34
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
 
architecture rtl of async_dpram is
 
type mem_t is array (0 to 2**addrw_g - 1) of std_logic_vector(dataw_g-1 downto 0);
 
signal memory : mem_t;
signal wr_addr, rd_addr : integer;
signal data_out_r : std_logic_vector(dataw_g-1 downto 0);
begin -- architecture rtl
 
wr_addr <= to_integer (unsigned(wr_addr_in));
rd_addr <= to_integer (unsigned(rd_addr_in));
data_out <= data_out_r;
 
wr : process (wr_clk) is
begin -- process write
if rising_edge(wr_clk) then -- rising clock edge
if (wr_en_in = '1') then
memory(wr_addr) <= data_in;
end if;
end if;
end process wr;
-- data_out_r <= memory(rd_addr);
rd : process (rd_clk) is
begin -- process rd
if rising_edge(rd_clk) then
data_out_r <= memory(rd_addr);
end if;
end process rd;
 
end architecture rtl;
/trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Testbench/tb_fifo1.vhdl
0,0 → 1,316
-------------------------------------------------------------------------------
-- File : tb_fifo1.vhdl
-- Description : Test bench for Fifo buffer, fifo length = 1!
-- Author : Erno Salminen
-- Date : 29.04.2002
-- Modified : 02.05.2002 Vesa Lahtinen Tests added
--
--
-------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
 
entity tb_fifo1 is
end tb_fifo1;
 
architecture behavioral of tb_fifo1 is
 
 
component fifo
 
generic (
width : integer := 0;
depth : integer := 0
);
 
port (
Clk : in std_logic;
Rst_n : std_logic;
Data_In : in std_logic_vector (width-1 downto 0);
Write_Enable : in std_logic;
One_Place_Left : out std_logic;
Full : out std_logic;
Data_Out : out std_logic_vector (width-1 downto 0);
Read_Enable : in std_logic;
Empty : out std_logic;
One_Data_Left : out std_logic
);
end component;
 
constant width : integer := 16;
constant depth : integer := 1; -- !!!
constant PERIOD : time := 10 ns;
 
signal Clk : std_logic;
signal Rst_n : std_logic;
signal Data_In : std_logic_vector (width-1 downto 0);
signal Data_Out : std_logic_vector (width-1 downto 0);
signal Write_Enable : std_logic;
signal Read_Enable : std_logic;
signal Full : std_logic;
signal One_Place_Left : std_logic;
signal Empty : std_logic;
signal One_Data_Left : std_logic;
 
signal Read_Data : std_logic_vector (width-1 downto 0);
 
signal Test_Phase : integer range 0 to 20;
 
begin -- behavioral
 
 
DUT : fifo
generic map (
width => width,
depth => depth)
port map (
Clk => Clk,
Rst_n => Rst_n,
Data_In => Data_In,
Write_Enable => Write_Enable,
Full => Full,
One_Place_Left => One_Place_Left,
Data_Out => Data_Out,
Read_Enable => Read_Enable,
Empty => Empty,
One_Data_Left => One_Data_Left );
 
Generate_input : process
 
-----------------------------------------------------------------------------
-- Two procedures for writing to and for reading the fifo
-----------------------------------------------------------------------------
procedure WriteToFifo (
Data_To_Fifo : in integer;
wait_time : in integer) is
begin --procedure
Read_Enable <= '0'; -- 24.05 es
Data_In <= conv_std_logic_vector (Data_To_Fifo, width);
Write_Enable <= '1';
if Full = '1' then
assert false report "Fifo full. Cannot write" severity note;
end if;
wait for PERIOD;
Write_Enable <= '0';
Data_In <= (others => 'Z');
wait for (wait_time)* PERIOD;
end WriteToFifo;
 
 
procedure ReadFifo (
wait_time : in integer) is
begin --procedure
Write_Enable <= '0'; -- 24.05 es
Read_Enable <= '1';
if Empty = '1' then
assert false report "Fifo empty. Cannot read." severity note;
end if;
wait for PERIOD;
Read_Enable <= '0';
wait for (wait_time)* PERIOD;
 
end ReadFifo;
 
procedure WriteAndReadFifo (
Data_To_Fifo : in integer;
wait_time : in integer) is
begin --procedure
Read_Enable <= '1';
if Empty = '1' then
assert false report "Fifo empty. Cannot read. Writing possible." severity note;
end if;
Data_In <= conv_std_logic_vector (Data_To_Fifo, width);
Write_Enable <= '1';
if Full = '1' then
assert false report "Fifo full. Cannot write. Reading possible." severity note;
end if;
 
 
wait for PERIOD;
Read_Enable <= '0';
Write_Enable <= '0';
Data_In <= (others => 'Z'); -- 24.05 es
wait for (wait_time)* PERIOD;
 
end WriteAndReadFifo;
-----------------------------------------------------------------------------
 
 
 
begin -- process Generate_input
-- test sequence
-- 0 wait for reset
-- 1 write to empty fifo and read so that it is empty again
-- 2 write to fifo until there is only one place left
-- 3 write to fifo so that it becomes full
-- 4 read from full fifo and continue until there is only one data left
-- 5 read the last data
-- write and read the empty fifo at the same time, only write is succesful!
-- 6 write to fifo, write and read at the same time, both should be succesful!
-- 7 write until fifo is full
-- 8 write and read full fifo, only reading succesful!
-- read until fifo is empty
-- 9 make sure fifo is empty
 
 
-- 0 Wait for reset
Write_Enable <= '0';
Read_Enable <= '0';
Data_In <= (others => 'Z');
Test_Phase <= 0;
wait for (6+2)*PERIOD;
wait for PERIOD/2;
wait for PERIOD/3;
 
 
-- At the beginning
-- Full = 0
-- Empty = 1
-- One_Place_Left = 1
-- One_Data_Left = 0
-- NOTE! Empty = One_Place_Left and Full = One_Data_Left
assert Full = '0' report "0: Full not correct" severity error;
assert Empty = '1' report "0: Empty not correct" severity error;
assert One_Data_Left = '0' report "0: One_Data_Left not correct" severity error;
assert One_Place_Left = '1' report "0: One_Place_Left not correct" severity error;
 
-- 1) Write to empty fifo
Test_Phase <= Test_Phase +1;
WriteToFifo (5, 1);
assert Full = '1' report "1: Full not correct" severity error;
assert Empty = '0' report "1: Empty not correct" severity error;
assert One_Data_Left = '1' report "1: One_Data_Left not correct" severity error;
assert One_Place_Left = '0' report "1: One_Place_Left not correct" severity error;
assert Data_Out = conv_std_logic_vector (5, width) report "1: data not stored correctly" severity error;
 
-- 2 )write to full fifo
Test_Phase <=Test_Phase +1;
WriteToFifo (10, 1);
WriteToFifo (11, 1);
WriteToFifo (12, 1);
WriteToFifo (13, 1);
assert Full = '1' report "2: Full not correct" severity error;
assert Empty = '0' report "2: Empty not correct" severity error;
assert One_Data_Left = '1' report "2: One_Data_Left not correct" severity error;
assert One_Place_Left = '0' report "2: One_Place_Left not correct" severity error;
assert Data_Out = conv_std_logic_vector (5, width) report "2: data not stored correctly" severity error;
-- 3) write and read full fifo
-- only read succesful
Test_Phase <= Test_Phase +1;
WriteAndReadFifo (14,2);
assert Full = '0' report "3: Full not correct" severity error;
assert Empty = '1' report "3: Empty not correct" severity error;
assert One_Data_Left = '0' report "3: One_Data_Left not correct" severity error;
assert One_Place_Left = '1' report "3: One_Place_Left not correct" severity error;
 
 
-- 4 read empty fifo
Test_Phase <= Test_Phase +1;
ReadFifo (1);
ReadFifo (1);
ReadFifo (1);
assert Full = '0' report "4: Full not correct" severity error;
assert Empty = '1' report "4: Empty not correct" severity error;
assert One_Data_Left = '0' report "4: One_Data_Left not correct" severity error;
assert One_Place_Left = '1' report "4: One_Place_Left not correct" severity error;
-- 5 write and read empty fifo
Test_Phase <= Test_Phase +1;
WriteAndReadFifo (15,2);
assert Full = '1' report "5: Full not correct" severity error;
assert Empty = '0' report "5: Empty not correct" severity error;
assert One_Data_Left = '1' report "5: One_Data_Left not correct" severity error;
assert One_Place_Left = '0' report "5: One_Place_Left not correct" severity error;
assert Data_Out = conv_std_logic_vector (15, width) report "5: data not stored correctly" severity error;
-- 6 read full fifo
Test_Phase <= Test_Phase +1;
ReadFifo (2);
assert Full = '0' report "6: Full not correct" severity error;
assert Empty = '1' report "6: Empty not correct" severity error;
assert One_Data_Left = '0' report "6: One_Data_Left not correct" severity error;
assert One_Place_Left = '1' report "6: One_Place_Left not correct" severity error;
 
-- 7 other shit
-- ReadFifo (2);
-- WriteToFifo (52, 1);
-- ReadFifo (2);
 
-- WriteToFifo (14, 1);
-- WriteToFifo (15, 1);
-- WriteToFifo (16, 1);
 
-- WriteToFifo (17, 1);
-- ReadFifo (1);
-- ReadFifo (1);
-- ReadFifo (4);
 
-- WriteAndReadFifo (67,2);
-- wait for 5*PERIOD;
-- ReadFifo (1);
-- Test completed
Test_Phase <= 0;
wait;
end process Generate_input;
 
 
 
Read_Data_from_fifo : process (Clk, Rst_n)
begin -- process Read_Data_from_fifo
if Rst_n = '0' then -- asynchronous reset (active low)
Read_Data <= (others => '0');
elsif Clk'event and Clk = '1' then -- rising clock edge
if Read_Enable = '1' then
Read_Data <= Data_Out;
else
Read_Data <= Read_Data;
end if;
end if;
end process Read_Data_from_fifo;
 
 
CLOCK1: process -- generate clock signal for design
variable clktmp: std_logic := '0';
begin
wait for PERIOD/2;
clktmp := not clktmp;
Clk <= clktmp;
end process CLOCK1;
 
RESET: process
begin
Rst_n <= '0'; -- Reset the testsystem
wait for 6*PERIOD; -- Wait
Rst_n <= '1'; -- de-assert reset
wait;
end process RESET;
 
 
end behavioral;
 
 
 
 
 
configuration basic_cfg of tb_fifo1 is
for behavioral
for all : fifo
--use entity work.fifo (inout_mux);
use entity work.fifo (in_mux);
--use entity work.fifo (shift_reg);
end for;
 
end for;
 
 
end basic_cfg;
/trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Testbench/tb_fifo_stratix.vhd
0,0 → 1,188
-------------------------------------------------------------------------------
-- title : tb_fifo_stratix
-- project :
-------------------------------------------------------------------------------
-- file : tb_fifo_stratix.vhdl
-- author : kulmala3
-- created : 08.09.2004
-- last update: 31.05.2005
-- description: tests that fifo_stratix works in fpga. synthesizable test bench
-------------------------------------------------------------------------------
-- revisions :
-- date version author description
-- 08.09.2004 1.0 ak created
-------------------------------------------------------------------------------
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
 
entity tb_fifo_stratix is
port (
clk : in std_logic;
rst_n : in std_logic;
led_state_out : out std_logic_vector(3 downto 0);
led_error_out : out std_logic_vector(3 downto 0)
);
 
end tb_fifo_stratix;
 
architecture rtl of tb_fifo_stratix is
 
component fifo
generic (
data_width_g : integer;
depth_g : integer);
port (
clk : in std_logic;
rst_n : in std_logic;
data_in : in std_logic_vector (data_width_g-1 downto 0);
we_in : in std_logic;
one_p_out : out std_logic;
full_out : out std_logic;
data_out : out std_logic_vector (data_width_g-1 downto 0);
re_in : in std_logic;
empty_out : out std_logic;
one_d_out : out std_logic);
end component;
 
type ctrl_state is (initial, write_fifo, read_fifo);
 
signal control_r : ctrl_state;
signal write_counter_r : integer range 0 to 2**16-1;
signal read_counter_r : integer range 0 to 2**16-1;
signal read_data_r : integer range 0 to 2**16-1;
signal error_counter_r : integer range 0 to 2**16-1;
 
constant initial_c : std_logic_vector := "0001";
constant write_c : std_logic_vector := "0010";
constant read_c : std_logic_vector := "0100";
 
 
constant width : integer := 16;
constant depth : integer := 5;
 
signal data_to_fifo : std_logic_vector (width-1 downto 0);
signal write_enable : std_logic;
signal one_place_left_r : std_logic;
signal full_r : std_logic;
signal data_from_fifo : std_logic_vector (width-1 downto 0);
signal read_enable : std_logic;
signal empty_r : std_logic;
signal one_data_left_r : std_logic;
 
signal ef_r : std_logic_vector(1 downto 0);
signal temp : std_logic;
begin -- rtl
 
data_to_fifo <= conv_std_logic_vector(write_counter_r, width);
read_data_r <= conv_integer(data_from_fifo);
ef_r <= empty_r & full_r;
led_error_out <= conv_std_logic_vector(error_counter_r, 4);
temp <= one_data_left_r and one_place_left_r;
 
fifo_1 : fifo
generic map (
data_width_g => width,
depth_g => depth)
port map (
clk => clk,
rst_n => rst_n,
data_in => data_to_fifo,
we_in => write_enable,
one_p_out => one_place_left_r,
full_out => full_r,
data_out => data_from_fifo,
re_in => read_enable,
empty_out => empty_r,
one_d_out => one_data_left_r);
 
process (clk, rst_n)
begin -- process
if rst_n = '0' then -- asynchronous reset (active low)
control_r <= initial;
write_enable <= '0';
read_enable <= '0';
write_counter_r <= 0;
read_counter_r <= 1;
-- just to use one_data_left_r and one_place_left_r
led_state_out <= temp & temp & temp & temp;
error_counter_r <= 0;
elsif clk'event and clk = '1' then -- rising clock edge
 
case control_r is
when initial =>
case ef_r is
when "00" | "01" => -- not empty, not full or full-> read
control_r <= read_fifo;
write_enable <= '0';
read_enable <= '0';
when "10" => -- empty, write
control_r <= write_fifo;
write_enable <= '0';
read_enable <= '0';
when others => null; --empty and full, not possible...
end case;
led_state_out <= initial_c;
when write_fifo =>
read_enable <= '0';
if full_r = '0' then -- not yet full
write_enable <= '1';
write_counter_r <= write_counter_r+1;
control_r <= write_fifo;
else
-- fifo full
write_enable <= '0';
-- write_counter_r+1 always written, so we do -1 here.
write_counter_r <= write_counter_r-1;
control_r <= read_fifo;
end if;
led_state_out <= write_c;
when read_fifo =>
write_enable <= '0';
if empty_r = '0' then
read_enable <= '1';
if read_enable = '1' then
if read_data_r /= read_counter_r then
-- error!
assert false report "fifo read error, wrong data" severity error;
if error_counter_r >= 2**4-1 then
error_counter_r <= 0;
else
error_counter_r <= error_counter_r +1;
end if;
-- if something was missing, start from the new data value
read_counter_r <= read_data_r+1;
else
error_counter_r <= error_counter_r;
read_counter_r <= read_counter_r+1;
end if;
control_r <= read_fifo;
end if;
else
-- empty
read_enable <= '0';
read_counter_r <= read_counter_r;
error_counter_r <= error_counter_r;
control_r <= initial;
end if;
 
led_state_out <= read_c;
 
when others => null;
 
end case;
 
end if;
end process;
 
end rtl;
/trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Testbench/tb_fifo2.vhdl
0,0 → 1,338
-------------------------------------------------------------------------------
-- File : tb_fifo2.vhdl
-- Description : Testbench for a Fifo buffer
-- Author : Erno Salminen
-- Date : 29.04.2002
-- Modified : 02.05.2002 Vesa Lahtinen More tests added
-- 18.06.2003 AK - direction for Rst_n signal
--
-------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
 
entity tb_fifo2 is
end tb_fifo2;
 
architecture behavioral of tb_fifo2 is
 
component fifo
 
generic (
width : integer := 0;
depth : integer := 0
);
 
port (
Clk : in std_logic;
Rst_n : in std_logic;
Data_In : in std_logic_vector (width-1 downto 0);
Write_Enable : in std_logic;
One_Place_Left : out std_logic;
Full : out std_logic;
Data_Out : out std_logic_vector (width-1 downto 0);
Read_Enable : in std_logic;
Empty : out std_logic;
One_Data_Left : out std_logic
);
 
 
end component;
 
 
constant width : integer := 16;
constant depth : integer := 5;
constant PERIOD : time := 10 ns;
 
signal Clk : std_logic;
signal Rst_n : std_logic;
signal Data_In : std_logic_vector (width-1 downto 0);
signal Data_Out : std_logic_vector (width-1 downto 0);
signal Write_Enable : std_logic;
signal Read_Enable : std_logic;
signal Full : std_logic;
signal One_Place_Left : std_logic;
signal Empty : std_logic;
signal One_Data_Left : std_logic;
 
signal Read_Data : std_logic_vector (width-1 downto 0);
signal Test_Phase : integer range 0 to 20;
 
begin -- behavioral
 
 
DUT : fifo
generic map (
width => width,
depth => depth)
port map (
Clk => Clk,
Rst_n => Rst_n,
Data_In => Data_In,
Write_Enable => Write_Enable,
Full => Full,
One_Place_Left => One_Place_Left,
Data_Out => Data_Out,
Read_Enable => Read_Enable,
Empty => Empty,
One_Data_Left => One_Data_Left );
 
Generate_input : process
 
-----------------------------------------------------------------------------
-- Two procedures for writing to and for reading the fifo
-----------------------------------------------------------------------------
procedure WriteToFifo (
Data_To_Fifo : in integer;
wait_time : in integer) is
begin --procedure
Data_In <= conv_std_logic_vector (Data_To_Fifo, width);
Write_Enable <= '1';
if Full = '1' then
--assert false report "Fifo full. Cannot write" severity note;
end if;
wait for PERIOD;
--if wait_time > 0 then
Write_Enable <= '0';
Data_In <= (others => 'Z');
wait for (wait_time)* PERIOD;
--end if;
 
end WriteToFifo;
 
 
procedure ReadFifo (
wait_time : in integer) is
begin --procedure
Read_Enable <= '1';
if Empty = '1' then
--assert false report "Fifo empty. Cannot read" severity note;
end if;
wait for PERIOD;
--if wait_time > 0 then
Read_Enable <= '0';
wait for (wait_time)* PERIOD;
--end if;
 
 
end ReadFifo;
 
procedure WriteAndReadFifo (
Data_To_Fifo : in integer;
wait_time : in integer) is
begin --procedure
Read_Enable <= '1';
if Empty = '1' then
--assert false report "Fifo empty. Cannot read" severity note;
end if;
Data_In <= conv_std_logic_vector (Data_To_Fifo, width);
Write_Enable <= '1';
if Full = '0' then
--assert false report "Fifo full. Cannot write" severity note;
end if;
 
 
wait for PERIOD;
--if wait_time > 0 then
Read_Enable <= '0';
Write_Enable <= '0';
Data_In <= (others => 'Z');
wait for (wait_time)* PERIOD;
--end if;
 
 
end WriteAndReadFifo;
-----------------------------------------------------------------------------
 
 
 
begin -- process Generate_input
 
-- test sequence
-- 0 wait for reset
-- 1 write to empty fifo and read so that it is empty again
-- 2 write to fifo until there is only one place left
-- 3 write to fifo so that it becomes full
-- 4 read from full fifo and continue until there is only one data left
-- 5 read the last data
-- write and read the empty fifo at the same time, only write is succesful!
-- 6 write to fifo, write and read at the same time, both should be succesful!
-- 7 write until fifo is full
-- 8 write and read full fifo, only reading succesful!
-- read until fifo is empty
-- 9 make sure fifo is empty
 
-- Wait for reset
Write_Enable <= '0';
Read_Enable <= '0';
Data_In <= (others => 'Z');
Test_Phase <= 0;
wait for (6+2)*PERIOD;
wait for PERIOD/2;
wait for PERIOD/3;
 
-- 0) At the beginning
-- One_Place_Left = 0
-- Empty = 1
-- Full = 0
-- One_Data_Left = 0
assert One_Data_Left = '0' report "0: One_Place_Left does not work" severity error;
assert Empty = '1' report "0: Empty does not work" severity error;
assert Full = '0' report "0: Full does not work" severity error;
assert One_Data_Left = '0' report "0: One_Place_Left does not work" severity error;
 
-- 1) Write one data to empty fifo
-- Data_Out = 5
-- One_Data_Left = 1
-- Empty = 0
Test_Phase <= Test_Phase +1;
WriteToFifo (5, 1);
assert Data_Out = conv_std_logic_vector (5, width) report "1: data not stored correctly" severity error;
assert One_Data_Left = '1' report "1: One_Place_Left does not work" severity error;
assert Empty = '0' report "1: Empty does not work" severity error;
 
ReadFifo (2);
WriteToFifo (52, 1);
ReadFifo (2);
 
-- 2) Fill up the empty fifo until there is only one place left
-- One_Place_Left = 1
-- Full = 0
Test_Phase <= Test_Phase +1;
WriteToFifo (10, 1); --to empty fifo
assert Data_Out = conv_std_logic_vector (10, width) report "2: data not stored correctly" severity error;
WriteToFifo (11, 0);
WriteToFifo (12, 0);
WriteToFifo (13, 0);
assert One_Place_Left = '1' report "2: One_Place_Left does not work" severity error;
assert Full = '0' report "2: Full does not work" severity error;
 
--3) One data more => fifo becomes full
-- Try to write two data (15 & 16) to full fifo
-- One_Place_Left = 0
-- Full = 1
Test_Phase <= Test_Phase +1;
WriteToFifo (14, 0);
assert One_Place_Left = '0' report "3: One_Place_Left does not work" severity error;
assert Full = '1' report "3: Full does not work" severity error;
 
WriteToFifo (15, 0);
WriteToFifo (16, 0);
Write_Enable <= '0';
Data_In <= (others => 'Z');
 
-- 4) Read one data from full fifo
Test_Phase <= Test_Phase +1;
ReadFifo (1); -- fifo out: 10 => 11
assert One_Place_Left = '1' report "4: One_Place_Left does not work" severity error;
assert Full = '0' report "4: Full does not work" severity error;
assert Data_Out = conv_std_logic_vector (11, width) report "4: data not stored correctly" severity error;
ReadFifo (1); -- fifo out: 11 => 12
ReadFifo (1); -- fifo out: 12 => 13
WriteToFifo (17, 1);
ReadFifo (1); -- fifo out: 13 => 14
ReadFifo (1); -- fifo out: 14 => 17
 
-- 5) Read the last data
-- write one to empty fifo and read empty fifo at the same time
Test_Phase <= Test_Phase +1;
assert Data_Out = conv_std_logic_vector (17, width) report "5: data not stored correctly" severity error;
ReadFifo (4); -- fifo out: 14 => empty (11)
WriteAndReadFifo (67,2);
wait for 5*PERIOD;
ReadFifo (1);-- fifo out: 67 => empty
 
-- 6) Fill up the fifo with two (1 & 2) data
-- Start reading fifo at the same as the latter data (2) is written
Test_Phase <= Test_Phase +1;
WriteToFifo (1, 0);
WriteAndReadFifo (2,0);
assert Data_Out = conv_std_logic_vector (2, width) report "6: data not stored correctly" severity error;
 
-- 7) Fill up the fifo
Test_Phase <= Test_Phase +1;
WriteToFifo (3, 0);
WriteToFifo (4, 0);
WriteToFifo (5, 0);
WriteToFifo (6, 0);
Write_Enable <= '0';
Data_In <= (others => 'Z');
-- Fifo now full
assert Full = '1' report "8: Full does not work" severity error;
-- 8) Empty the fifo
-- At first try to write one data (88) to full fifo and read fifo at the same
-- time. Data 88 should not go to fifo
Test_Phase <= Test_Phase +1;
WriteAndReadFifo(88,0);
ReadFifo(0);
ReadFifo(0);
ReadFifo(0);
ReadFifo(0);
assert Data_Out /= conv_std_logic_vector (88, width) report "8: data not stored correctly" severity error;
 
-- 9) Fifo should be empty
Test_Phase <= 9;
assert Empty = '1' report "9: Empty does not work" severity error;
 
-- Test completd
Test_Phase <= 0;
wait;
end process Generate_input;
 
 
 
Read_Data_from_fifo : process (Clk, Rst_n)
begin -- process Read_Data_from_fifo
if Rst_n = '0' then -- asynchronous reset (active low)
Read_Data <= (others => '0');
elsif Clk'event and Clk = '1' then -- rising clock edge
if Read_Enable = '1' and Empty = '0'then
Read_Data <= Data_Out;
else
Read_Data <= Read_Data;
end if;
end if;
end process Read_Data_from_fifo;
 
 
 
 
 
CLOCK1: process -- generate clock signal for design
variable clktmp: std_logic := '0';
begin
wait for PERIOD/2;
clktmp := not clktmp;
Clk <= clktmp;
end process CLOCK1;
 
 
 
RESET: process
begin
Rst_n <= '0'; -- Reset the testsystem
wait for 6*PERIOD; -- Wait
Rst_n <= '1'; -- de-assert reset
wait;
end process RESET;
 
 
end behavioral;
 
 
configuration basic_cfg of tb_fifo2 is
for behavioral
for all : fifo
--use entity work.fifo (inout_mux);
--use entity work.fifo (in_mux);
use entity work.fifo (shift_reg);
end for;
 
end for;
 
end basic_cfg;
/trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Testbench/tb_fifo_mixed_clocks2.vhdl
0,0 → 1,354
-------------------------------------------------------------------------------
-- File : tb_fifo_mixed_clocks2.vhdl
-- Description : Testbench for a mixed clock Fifo buffer
-- Author : Ari Kulmala
-- Date : 19.06.2003
-- Modified :
--
--
-------------------------------------------------------------------------------
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
 
entity tb_fifo_mixed_clocks2 is
end tb_fifo_mixed_clocks2;
 
architecture behavioral of tb_fifo_mixed_clocks2 is
 
component mixed_clocks_fifo
 
generic (
width : integer := 0;
depth : integer := 0);
 
port (
Clk_In : in std_logic;
Clk_Out : in std_logic;
Rst_n : in std_logic; -- Active low
Data_In : in std_logic_vector (width-1 downto 0);
Write_Enable : in std_logic;
-- One_Place_Left : out std_logic;
Full : out std_logic;
Data_Out : out std_logic_vector (width-1 downto 0);
Read_Enable : in std_logic;
Empty : out std_logic
-- One_Data_Left : out std_logic
);
 
end component;
 
 
constant width : integer := 16;
constant depth : integer := 5;
constant PERIOD_IN : time := 10 ns;
constant PERIOD_OUT : time := 4 ns;
 
signal Clk_In : std_logic;
signal Clk_Out : std_logic;
signal Rst_n : std_logic;
signal Data_In : std_logic_vector (width-1 downto 0);
signal Data_Out : std_logic_vector (width-1 downto 0);
signal Write_Enable : std_logic;
signal Read_Enable : std_logic;
signal Full : std_logic;
--signal One_Place_Left : std_logic;
signal Empty : std_logic;
--signal One_Data_Left : std_logic;
 
signal Read_Data : std_logic_vector (width-1 downto 0);
signal Test_Phase : integer range 0 to 20;
 
begin -- behavioral
 
 
DUT : mixed_clocks_fifo
generic map (
width => width,
depth => depth)
port map (
Clk_In => Clk_In,
Clk_Out => Clk_Out,
Rst_n => Rst_n,
Data_In => Data_In,
Write_Enable => Write_Enable,
Full => Full,
-- One_Place_Left => One_Place_Left,
Data_Out => Data_Out,
Read_Enable => Read_Enable,
Empty => Empty);
-- One_Data_Left => One_Data_Left );
 
Generate_input : process
 
-----------------------------------------------------------------------------
-- Two procedures for writing to and for reading the fifo
-----------------------------------------------------------------------------
procedure WriteToFifo (
Data_To_Fifo : in integer;
wait_time : in integer) is
begin --procedure
Data_In <= conv_std_logic_vector (Data_To_Fifo, width);
Write_Enable <= '1';
if Full = '1' then
--assert false report "Fifo full. Cannot write" severity note;
end if;
wait for PERIOD_IN;
--if wait_time > 0 then
Write_Enable <= '0';
Data_In <= (others => 'Z');
wait for (wait_time)* PERIOD_IN;
--end if;
 
end WriteToFifo;
 
 
procedure ReadFifo (
wait_time : in integer) is
begin --procedure
Read_Enable <= '1';
if Empty = '1' then
--assert false report "Fifo empty. Cannot read" severity note;
end if;
wait for PERIOD_OUT+1ns;
--if wait_time > 0 then
Read_Enable <= '0';
wait for (wait_time)* PERIOD_OUT;
--end if;
 
 
end ReadFifo;
 
 
procedure WriteAndReadFifo (
Data_To_Fifo : in integer;
wait_time : in integer) is
begin --procedure
Read_Enable <= '1';
if Empty = '1' then
--assert false report "Fifo empty. Cannot read" severity note;
end if;
Data_In <= conv_std_logic_vector (Data_To_Fifo, width);
Write_Enable <= '1';
if Full = '0' then
--assert false report "Fifo full. Cannot write" severity note;
end if;
 
 
wait for PERIOD_IN;
--if wait_time > 0 then
Read_Enable <= '0';
Write_Enable <= '0';
Data_In <= (others => 'Z');
wait for (wait_time)* (PERIOD_IN);
--end if;
 
 
end WriteAndReadFifo;
-----------------------------------------------------------------------------
 
 
 
begin -- process Generate_input
 
-- test sequence
-- 0 wait for reset
-- 1 write to empty fifo and read so that it is empty again
-- 2 write to fifo until there is only one place left
-- 3 write to fifo so that it becomes full
-- 4 read from full fifo and continue until there is only one data left
-- 5 read the last data
-- write and read the empty fifo at the same time, only write is succesful!
-- 6 write to fifo, write and read at the same time, both should be succesful!
-- 7 write until fifo is full
-- 8 write and read full fifo, only reading succesful!
-- read until fifo is empty
-- 9 make sure fifo is empty
 
-- Wait for reset
Write_Enable <= '0';
Read_Enable <= '0';
Data_In <= (others => 'Z');
Test_Phase <= 0;
wait for (6+2)*PERIOD_IN;
wait for PERIOD_IN/2;
wait for PERIOD_IN/3;
 
-- 0) At the beginning
-- One_Place_Left = 0
-- Empty = 1
-- Full = 0
-- One_Data_Left = 0
-- assert One_Data_Left = '0' report "0: One_Place_Left does not work" severity error;
assert Empty = '1' report "0 : Empty does not work" severity error;
assert Full = '0' report "0 : Full does not work" severity error;
-- assert One_Data_Left = '0' report "0: One_Place_Left does not work" severity error;
 
-- 1) Write one data to empty fifo
-- Data_Out = 5
-- One_Data_Left = 1
-- Empty = 0
Test_Phase <= Test_Phase +1;
WriteToFifo (5, 1);
assert Data_Out = conv_std_logic_vector (5, width) report "1 : data not stored correctly" severity error;
-- assert One_Data_Left = '1' report "1: One_Place_Left does not work" severity error;
assert Empty = '0' report "1 : Empty does not work" severity error;
 
ReadFifo (2);
WriteToFifo (52, 1);
ReadFifo (2);
 
-- 2) Fill up the empty fifo until there is only one place left
-- One_Place_Left = 1
-- Full = 0
Test_Phase <= Test_Phase +1;
WriteToFifo (10, 1); --to empty fifo
assert Data_Out = conv_std_logic_vector (10, width) report "2 : data not stored correctly" severity error;
WriteToFifo (11, 0);
WriteToFifo (12, 0);
WriteToFifo (13, 0);
-- assert One_Place_Left = '1' report "2: One_Place_Left does not work" severity error;
assert Full = '0' report "2 : Full does not work" severity error;
 
--3) One data more => fifo becomes full
-- Try to write two data (15 & 16) to full fifo
-- One_Place_Left = 0
-- Full = 1
Test_Phase <= Test_Phase +1;
WriteToFifo (14, 0);
-- assert One_Place_Left = '0' report "3: One_Place_Left does not work" severity error;
assert Full = '1' report "3 : Full does not work" severity error;
 
WriteToFifo (15, 0);
WriteToFifo (16, 0);
Write_Enable <= '0';
Data_In <= (others => 'Z');
 
-- 4) Read one data from full fifo
Test_Phase <= Test_Phase +1;
ReadFifo (1); -- fifo out: 10 => 11
-- assert One_Place_Left = '1' report "4: One_Place_Left does not work" severity error;
assert Full = '0' report "4 : Full does not work" severity error;
assert Data_Out = conv_std_logic_vector (11, width) report "4 : data not stored correctly" severity error;
 
ReadFifo (1); -- fifo out: 11 => 12
ReadFifo (1); -- fifo out: 12 => 13
WriteToFifo (17, 1);
ReadFifo (1); -- fifo out: 13 => 14
ReadFifo (1); -- fifo out: 14 => 17
 
-- 5) Read the last data
-- write one to empty fifo and read empty fifo at the same time
Test_Phase <= Test_Phase +1;
assert Data_Out = conv_std_logic_vector (17, width) report "5 : data not stored correctly" severity error;
ReadFifo (4); -- fifo out: 14 => empty (11)
WriteAndReadFifo (67, 2);
wait for 5*PERIOD_IN;
ReadFifo (1); -- fifo out: 67 => empty
 
-- 6) Fill up the fifo with two (1 & 2) data
-- Start reading fifo at the same as the latter data (2) is written
Test_Phase <= Test_Phase +1;
WriteToFifo (1, 0);
WriteAndReadFifo (2, 0);
assert Data_Out = conv_std_logic_vector (2, width) report "6 : data not stored correctly" severity error;
 
-- 7) Fill up the fifo
Test_Phase <= Test_Phase +1;
WriteToFifo (3, 0);
WriteToFifo (4, 0);
WriteToFifo (5, 0);
WriteToFifo (6, 0);
Write_Enable <= '0';
Data_In <= (others => 'Z');
-- Fifo now full
assert Full = '1' report "8 : Full does not work" severity error;
 
-- 8) Empty the fifo
-- At first try to write one data (88) to full fifo and read fifo at the same
-- time. Data 88 should not go to fifo
Test_Phase <= Test_Phase +1;
WriteAndReadFifo(88, 0);
ReadFifo(0);
ReadFifo(0);
ReadFifo(0);
ReadFifo(0);
assert Data_Out /= conv_std_logic_vector (88, width) report "8 : data not stored correctly" severity error;
 
-- 9) Fifo should be empty
Test_Phase <= 9;
assert Empty = '1' report "9 : Empty does not work" severity error;
 
-- Test completed
Test_Phase <= 0;
wait;
end process Generate_input;
 
 
 
Read_Data_from_fifo : process (Clk_In, Rst_n)
begin -- process Read_Data_from_fifo
if Rst_n = '0' then -- asynchronous reset (active low)
Read_Data <= (others => '0');
elsif Clk_In'event and Clk_In = '1' then -- rising clock edge
if Read_Enable = '1' and Empty = '0'then
Read_Data <= Data_Out;
else
Read_Data <= Read_Data;
end if;
end if;
end process Read_Data_from_fifo;
 
 
 
 
 
CLOCK_IN : process -- generate clock signal for design
variable clktmp : std_logic := '0';
begin
wait for PERIOD_IN/2;
clktmp := not clktmp;
Clk_In <= clktmp;
end process CLOCK_IN;
 
CLOCK_OUT : process -- generate clock signal for design
variable clktmp : std_logic := '0';
begin
wait for PERIOD_OUT/2;
clktmp := not clktmp;
Clk_Out <= clktmp;
end process CLOCK_OUT;
 
 
 
RESET : process
begin
Rst_n <= '0'; -- Reset the testsystem
wait for 6*(PERIOD_IN); -- Wait
Rst_n <= '1'; -- de-assert reset
wait;
end process RESET;
 
 
 
end behavioral;
 
 
configuration basic_cfg of tb_fifo_mixed_clocks2 is
 
for behavioral
for all : mixed_clocks_fifo
--use entity work.fifo (inout_mux);
--use entity work.fifo (in_mux);
--use entity work.fifo (shift_reg);
use entity work.mixed_clocks_fifo (mixed_clocks);
end for;
 
end for;
 
end basic_cfg;
 
 
 
 
 
/trunk/TUT/ip.hwp.storage/fifos/synch_fifos/mixed_fifos_wave.do
0,0 → 1,29
onerror {resume}
quietly WaveActivateNextPane {} 0
add wave -noupdate -format Logic -radix decimal /tb_fifo_mixed_clocks2/dut/clk_in
add wave -noupdate -format Logic -radix decimal /tb_fifo_mixed_clocks2/dut/clk_out
add wave -noupdate -format Logic -radix decimal /tb_fifo_mixed_clocks2/dut/rst_n
add wave -noupdate -format Literal -radix decimal /tb_fifo_mixed_clocks2/dut/data_in
add wave -noupdate -format Logic -radix decimal /tb_fifo_mixed_clocks2/dut/write_enable
add wave -noupdate -format Logic -radix decimal /tb_fifo_mixed_clocks2/dut/full
add wave -noupdate -format Literal -radix decimal /tb_fifo_mixed_clocks2/dut/data_out
add wave -noupdate -format Logic -radix decimal /tb_fifo_mixed_clocks2/dut/read_enable
add wave -noupdate -format Logic -radix decimal /tb_fifo_mixed_clocks2/dut/empty
add wave -noupdate -format Literal -radix decimal /tb_fifo_mixed_clocks2/dut/input_buffer
add wave -noupdate -format Logic -radix decimal /tb_fifo_mixed_clocks2/dut/full_reg
add wave -noupdate -format Logic -radix decimal /tb_fifo_mixed_clocks2/dut/empty_reg
add wave -noupdate -format Literal -radix decimal /tb_fifo_mixed_clocks2/dut/write_token
add wave -noupdate -format Literal -radix decimal /tb_fifo_mixed_clocks2/dut/read_token
add wave -noupdate -format Logic -radix decimal /tb_fifo_mixed_clocks2/dut/write_turned
TreeUpdate [SetDefaultTree]
WaveRestoreCursors {92 ns}
WaveRestoreZoom {0 ns} {257 ns}
configure wave -namecolwidth 211
configure wave -valuecolwidth 39
configure wave -justifyvalue left
configure wave -signalnamewidth 0
configure wave -snapdistance 10
configure wave -datasetprefix 0
configure wave -rowmargin 4
configure wave -childrowmargin 2
run 700
/trunk/TUT/ip.hwp.storage/fifos/synch_fifos/create_makefile
0,0 → 1,51
#
# Skripti kaantaa kaikki vhdl-tiedostot ja tekee niista makefilen
# Ymparistomuuttjat
# CODEC_DATA_DIR kertoo mihin hakemistoon kaannetyt fiilut laitetaan.
# CODEC_WORK_DIR kertoo tyohakemiston (mm. Makefile.vhdl on siella)
#
 
clear
#Poistetaan vanha codelib ja tehdaan ja mapataan uusi
echo "Removing old vhdl library"
rm -rf $CODEC_DATA_DIR/codelib
echo; echo "Creating a new library at"
echo $CODEC_DATA_DIR; echo
 
vlib $CODEC_DATA_DIR/codelib
vmap work $CODEC_DATA_DIR/codelib
 
# Hibi-koodit v2
echo; echo "Compiling vhdl codes"; echo
 
vcom Vhdl/shift_slot.vhdl
 
vcom Vhdl/fifo_iom.vhdl
vcom Vhdl/fifo_im.vhdl
vcom Vhdl/fifo_shift.vhdl
vcom Vhdl/fifo_shift_slotted.vhdl
#vcom Vhdl/fifo_casev3.vhdl
#vcom Vhdl/fifo_im_case.vhdl
vcom Vhdl/fifo_casev5.vhdl
vcom Vhdl/fifo_casev4.vhdl
vcom Vhdl/fifo_mixed_clocks.vhdl
 
# Testipenkit
echo; echo "Compiling vhdl testbenches";echo
 
vcom Testbench/tb_fifo1.vhdl
vcom Testbench/tb_fifo2.vhdl
vcom Testbench/tb_fifo_mixed_clocks2.vhdl
 
 
 
 
# Poistetaan vanha makefile ja tehdaan uusi
echo;echo "Creating a new makefile"
rm -f $CODEC_WORK_DIR/Makefile.vhdl
vmake $CODEC_DATA_DIR/codelib > $CODEC_WORK_DIR/Makefile
 
echo " --------Create_Makefile done-------------"
 
 
 
/trunk/TUT/ip.hwp.storage/fifos/synch_fifos/wave.do
0,0 → 1,26
onerror {resume}
quietly WaveActivateNextPane {} 0
add wave -noupdate -format Logic /tb_fifo2/clk
add wave -noupdate -format Logic /tb_fifo2/rst_n
add wave -noupdate -format Literal -radix unsigned /tb_fifo2/data_in
add wave -noupdate -format Literal -radix unsigned /tb_fifo2/data_out
add wave -noupdate -format Logic /tb_fifo2/write_enable
add wave -noupdate -format Logic /tb_fifo2/read_enable
add wave -noupdate -format Logic /tb_fifo2/full
add wave -noupdate -format Logic /tb_fifo2/one_place_left
add wave -noupdate -format Logic /tb_fifo2/empty
add wave -noupdate -format Logic /tb_fifo2/one_data_left
add wave -noupdate -format Literal -radix unsigned /tb_fifo2/read_data
add wave -noupdate -format Literal /tb_fifo2/test_phase
add wave -noupdate -format Literal -radix unsigned /tb_fifo2/dut/fifo_buffer
TreeUpdate [SetDefaultTree]
WaveRestoreCursors {0 ns}
WaveRestoreZoom {0 ns} {1 us}
configure wave -namecolwidth 150
configure wave -valuecolwidth 100
configure wave -justifyvalue left
configure wave -signalnamewidth 0
configure wave -snapdistance 10
configure wave -datasetprefix 0
configure wave -rowmargin 4
configure wave -childrowmargin 2
/trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Doc/fifo_Comparison.ppt Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream
trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Doc/fifo_Comparison.ppt Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Doc/plot_comparison_fpga.m =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Doc/plot_comparison_fpga.m (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Doc/plot_comparison_fpga.m (revision 18) @@ -0,0 +1,91 @@ +% SYNTHESIS FOR FPGA +% used Mentor Graphics Precision RTL Synthesis 2003a.29 +% Synthesized for Altera Excalibur ARM, frequency 20 MHz +% +% Uses double_fifo_muxed_read components +% which include two FIFOs and a read multiplexer +% FIFOs are 3b wide + +close all +clear all + +% Vertailussa kaytetyt fifojen pituudet +length = [3 30 80] + + +% Max clock frequency +% (library set up time 0.17 ns is left out of these results) +delay_casev3 = [113.3 62.4 46.3] +delay_casev4 = [113.3 59.0 40.7] +delay_im_case = [ 88.0 81.1 71.0] +delay_im = [ 84.4 71.2 59.7] + +% Areas [IOs] +%io_casev3 = [ 32 32 32] +%io_casev4 = [ 32 32 32] +%io_im_case = [ 32 32 32] + +% Areas [LCs] +area_casev3 = [ 90 858 2370] +area_casev4 = [ 90 864 2394] +area_im_case = [ 94 1098 2744] +area_im = [ 126 1090 2730] + +% Areas total +%area_casev3 = io_casev3 +lc_casev3 +%area_casev4 = io_casev4 +lc_casev4 +%area_im_case = io_im_case +lc_im_case + + + +% Plot figures +% Delay figure +%figure +%plot ( length, delay_im, 'r-o') +%hold on +%plot ( length, delay_iom, '-<') +%hold on +%plot ( length, delay_shift, 'k-*') +%hold on +%plot ( length, delay_slotted_shift, 'bo-') +%hold on +plot ( length, delay_casev3, 'k-o') +hold on +plot ( length, delay_casev4, 'r-*') +hold on +plot ( length, delay_im_case, '-<') +hold on +plot ( length, delay_im, '-*') +hold on + +legend ('casev3', 'casev4', 'in-mux-case', 'in-mux', 0) +title (['Max frequency (MHz) of 3-bit double-FIFO']) +xlabel ('Depth of FIFOs') +ylabel ('Max Frequency [MHz]') +axis ([0 82 0 120]) + +% Area figure +figure +%plot ( length, area_im, 'r-o') +%hold on +%plot ( length, area_iom, '-<') +%hold on +%plot ( length, area_shift, 'k-*') +%hold on +%plot ( length, area_slotted_shift, 'bs-') +%hold on +plot ( length, area_casev3, 'k-o') +hold on +plot ( length, area_casev4, 'r-*') +hold on +plot ( length, area_im_case, '-<') +hold on +plot ( length, area_im_case, '-*') +hold on +legend ('casev3', 'casev4', 'in-mux-case', 'in-mux', 0) + +title (['Area (LC) of 3-bit double-FIFO']) +xlabel ('Depth of FIFOs') +ylabel ('Area [LC]') +axis ([0 82 0 3000]) + Index: trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Doc/plot_comparison.m =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Doc/plot_comparison.m (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Doc/plot_comparison.m (revision 18) @@ -0,0 +1,108 @@ +% Prints the synthesis results of FIFO comparison @ 0.18 um +% Uses double_fifo_muxed_read components +% which include two FIFOs and a read multiplexer +% FIFOs are 3b wide +% _im = in-mux (triagle in figures) +% _iom = inout-mux (circle in figures) +% shift = shift register (star in figures) + +close all +clear all + +% Vertailussa kaytetyt fifojen pituudet +length = [3 30 80] + + +% Delay [ns] = data arrival time +% (library set up time 0.17 ns is left out of these results) +delay_im = [1.99 3.06 3.82] +delay_iom = [2.25 3.63 4.62] +delay_shift = [1.33 2.15 2.81] +delay_slotted_shift = [1.56 1.99 1.81] +% delay_casev3 = [1.05 2.16 3.43] +delay_casev4 = [1.48 2.36 3.64] +delay_casev4a = [1.69 2.52 3.34] +delay_casev5 = [1.72 2.52 3.75] +delay_casev6 = [1.86 2.66 3.55] +delay_im_case = [1.57 2.54 3.92] + + +% Areas [um2] +area_im = [11214 55672 161906] +area_iom = [12955 62296 140750] +area_slotted_shift = [ 7688 43724 110645] +area_shift = [ 7696 45350 114765] +% area_casev3 = [ 6602 50802 129232] +area_casev4 = [10014 54546 133443] +area_casev4a = [11051 63721 159215] +area_casev5 = [10264 55255 132984] +area_casev6 = [10088 64253 158724] +area_im_case = [ 8978 53493 160079] + +% Plot figures +% Delay figure +figure +%plot ( length, delay_shift, 'k-*') +%hold on +%plot ( length, delay_slotted_shift, 'bo-') +%hold on +plot ( length, delay_im, 'k-o') +hold on +plot ( length, delay_iom, '-<') +hold on +plot ( length, delay_casev4, 'r-o') +hold on +plot ( length, delay_casev4a, 'r-*') +hold on +plot ( length, delay_casev5, 'r-+') +hold on +plot ( length, delay_casev6, 'c-+') +hold on +plot ( length, delay_im_case, 'k-<') +hold on + +%title (['Delay of 3-bit double-FIFO (blue triangle=inout-mux, red' ... +% ' o= in-mux, black *=shift, black square= slotted shift, red * = +%casev4, red triangle = im-case, black o= casev3)']) + +title ('Delay of 3-bit double-FIFO') +legend('in-mux', 'inout-mux', 'casev4', 'casev4a','casev5','casev6', 'in-mux-case',0) + +xlabel ('Depth of FIFOs') +ylabel ('Delay [ns]') +axis ([0 82 0 5]) + +% Area figure +figure +%plot ( length, area_shift, 'k-*') +%hold on +%plot ( length, area_slotted_shift, 'bs-') +%hold on +plot ( length, area_im, 'k-o') +hold on +plot ( length, area_iom, '-<') +hold on +plot ( length, area_casev4, 'r-o') +hold on +plot ( length, area_casev4a, 'r-*') +hold on +plot ( length, area_casev5, 'r-+') +hold on +plot ( length, area_casev6, 'c-+') +hold on +plot ( length, area_im_case, 'k-<') +hold on + + +%title (['Area of 3-bit double-FIFO (blue triangle=inout-mux, red' ... +% ' o= in-mux, black *=shift, black square= slotted shift, red * = +%casev4, red triangle = im-case, black o = casev3)']) + +title ('Area of 3-bit double-FIFO') +legend('in-mux', 'inout-mux', 'casev4', 'casev4a', 'casev5','casev6','in-mux-case',0) + +xlabel ('Depth of FIFOs') +ylabel ('Area [um2]') +axis ([0 82 0 18e4]) + + Index: trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Doc/fifo_Comparison.pdf =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Doc/fifo_Comparison.pdf (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Doc/fifo_Comparison.pdf (revision 18) @@ -0,0 +1,2469 @@ +%PDF-1.3 +%âãÏÓ +33 0 obj +<< +/Linearized 1 +/O 35 +/H [ 1120 353 ] +/L 243892 +/E 63664 +/N 7 +/T 243114 +>> +endobj + xref +33 34 +0000000016 00000 n +0000001027 00000 n +0000001473 00000 n +0000001680 00000 n +0000001839 00000 n +0000002065 00000 n +0000002623 00000 n +0000002845 00000 n +0000003297 00000 n +0000003336 00000 n +0000003357 00000 n +0000004012 00000 n +0000004033 00000 n +0000004504 00000 n +0000004525 00000 n +0000004989 00000 n +0000005010 00000 n +0000005554 00000 n +0000005575 00000 n +0000006119 00000 n +0000006140 00000 n +0000006728 00000 n +0000007123 00000 n +0000007336 00000 n +0000007357 00000 n +0000007833 00000 n +0000007854 00000 n +0000008430 00000 n +0000008508 00000 n +0000033608 00000 n +0000051442 00000 n +0000060836 00000 n +0000001120 00000 n +0000001452 00000 n +trailer +<< +/Size 67 +/Info 31 0 R +/Root 34 0 R +/Prev 243104 +/ID[<5ab2ce6d23797f07660c2e8ad696cfc3><5b35cbeb57638c642f899e30b20e117a>] +>> +startxref +0 +%%EOF + +34 0 obj +<< +/Type /Catalog +/Pages 30 0 R +/Metadata 32 0 R +/PageLabels 29 0 R +>> +endobj +65 0 obj +<< /S 168 /L 265 /Filter /FlateDecode /Length 66 0 R >> +stream +H‰b```f``I``e``ߊĀB@16Ž@VË´'00pÊ2¼m8´ÃÐ"™gʉpµ†M¢.7K—Ý0œ•zሄblæ´Ã ­¥Ë¢xÜçwº<ì]v'õ"³ä²X¶ŒŽ ÉÑÁÀ¤ÑÑÀ d300Še@‚èÖåĘ}%´«€meàg,aÒ`ËPœ ©}€èÎ/ | æ Œ¬ + ,b ‚;Ä$€Š¹a Ïù÷D†L^4ƒ!±±†±aÁ6k×0OÈ00¯ý¤™€Ø À‰›A +endstream +endobj +66 0 obj +240 +endobj +35 0 obj +<< +/Type /Page +/Parent 30 0 R +/Resources 36 0 R +/Contents [ 43 0 R 45 0 R 47 0 R 49 0 R 51 0 R 53 0 R 57 0 R 59 0 R ] +/MediaBox [ 0 0 612 792 ] +/CropBox [ 0 0 612 792 ] +/Rotate 0 +>> +endobj +36 0 obj +<< +/ProcSet [ /PDF /Text ] +/Font << /TT2 38 0 R /TT4 40 0 R /TT6 54 0 R >> +/ExtGState << /GS1 60 0 R >> +/ColorSpace << /Cs6 41 0 R >> +>> +endobj +37 0 obj +<< +/Type /FontDescriptor +/Ascent 905 +/CapHeight 0 +/Descent -211 +/Flags 32 +/FontBBox [ -628 -376 2034 1010 ] +/FontName /EIDOEC+Arial,Bold +/ItalicAngle 0 +/StemV 144 +/XHeight 515 +/FontFile2 62 0 R +>> +endobj +38 0 obj +<< +/Type /Font +/Subtype /TrueType +/FirstChar 32 +/LastChar 150 +/Widths [ 278 278 355 0 0 0 0 191 333 333 389 584 278 333 278 278 556 556 556 +556 556 556 556 556 556 556 278 0 0 0 0 0 0 667 667 722 722 667 +611 778 722 278 0 0 556 833 722 778 667 0 722 667 611 722 0 0 0 +0 0 0 0 0 0 556 0 556 556 500 556 556 278 556 556 222 0 500 222 +833 556 556 556 556 333 500 278 556 500 722 500 500 500 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 350 556 ] +/Encoding /WinAnsiEncoding +/BaseFont /EIDOCC+Arial +/FontDescriptor 39 0 R +>> +endobj +39 0 obj +<< +/Type /FontDescriptor +/Ascent 905 +/CapHeight 718 +/Descent -211 +/Flags 32 +/FontBBox [ -665 -325 2028 1006 ] +/FontName /EIDOCC+Arial +/ItalicAngle 0 +/StemV 94 +/XHeight 515 +/FontFile2 61 0 R +>> +endobj +40 0 obj +<< +/Type /Font +/Subtype /TrueType +/FirstChar 32 +/LastChar 122 +/Widths [ 278 0 0 0 0 0 0 0 0 0 389 584 0 0 278 0 0 0 556 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 722 0 722 722 0 611 778 722 278 0 0 611 833 0 0 667 0 +0 667 0 0 0 0 0 0 0 333 0 333 0 556 0 556 611 556 611 556 333 611 +611 278 0 0 278 889 611 611 0 611 389 556 333 611 556 778 556 556 +500 ] +/Encoding /WinAnsiEncoding +/BaseFont /EIDOEC+Arial,Bold +/FontDescriptor 37 0 R +>> +endobj +41 0 obj +[ +/ICCBased 64 0 R +] +endobj +42 0 obj +577 +endobj +43 0 obj +<< /Filter /FlateDecode /Length 42 0 R >> +stream +H‰tTËnÛ0¼ë+öH´á›òµnS4@[ƒ‘ƒ!S±¿*)õ—´ßÛ%i«NëBµ‚É™á¬ï惃f™ž¡Ùwž‡BVà½ë”Þ:èCÑïêâ®®m­ÛBj +=¹²~†R2èÔ»B¤ß"¦€º‰Ë©`’×/ŇºøC(•7³hh' T^LdÒM©RÆ`Ün+•oYJBPÛ‘+V2Þºÿ +Íaw\õÝpØGzjwV]§JZ‡ªfÄxØE˜Œ8‹8Kö“—N6ç +=KxÖ]Û†>ìGH4Ýî¸ +;ú\Ýa?ð§úäe&2Í›H#šL£+]MÎ,Ù¯וe=­+Ò×*-¶P¿Oí ÏÑ^j6p–CXgÒ› +­³³D5)× +5:Vs†mú`Õ7›n ÍøÚ‡Û‚¬ñèÍ5^Jö_ɳ¬Ü£O=J~„~µZ‡èö0v·ˆ²h5ç6õm¯  +Ž¼T¤ÿt¸ÂmaØtíHYzî†1ôÐí^’lË%ÎØëúl¥ñ;屃E£¦(ž“ø4qNæ Èi[̿Ъ^@Æ\ž@ +ø Ë'눂¦" Š¬MY¥P.½nQ|û+ýÚÅÛù'ü4i&Oš¿LA*”$­‘^â<TÑŽ«5YeÔUÂyE6áE¶´tÛŽt*œ•ÒqrKiã+uqõ·ð_DÜýÖ€ä¥Õ H»‹¸@ü-À¬ã +endstream +endobj +44 0 obj +393 +endobj +45 0 obj +<< /Filter /FlateDecode /Length 44 0 R >> +stream +H‰œ”=OÃ0†wÿŠÛJ=|vœµÀÒ…lˆ…ÒNm‘øü|ÎNSÒ’E‘b_üÞùü¼VÜlâf«Ð3x{Ê„‰0Dà(Ø4çËêËbëîFˆã„a„ãûfî.š†Á$+§Š(쫬Œêw0ä=zï\Í£÷bë 7µ)©@ón[l§¯OS‚ÍÛGÙäºH¿½¼qÚ†ÕJ°q”"²Kãµcµ>úq¥=ýÚ=LA~J/¥ý¶¬^kŒ¥d@Î)ÞÂ\Q°ê…•ì”¥˜¡<Ä`â\JP@r˜qÔH ÍUKL¾ˆ…–åZ[x\Ž‰1~%בHÔ’ëHÕ¾%Ó‘ÜÇ;Ò­þ$¹Â#q!סª©àé@vaf\”ÃäÉ.åh:ævÎYs†PÀh»UŒµqikjmx^ºUï$&ɺ2X`ë³oÝITÌ,5þt»Ï·E%Ø¢>Ø"vsû¶Õ±E%ìmQú¶ˆV}[¤P?e‹Ø/á?¶ÀüS€­ªê> +endstream +endobj +46 0 obj +386 +endobj +47 0 obj +<< /Filter /FlateDecode /Length 46 0 R >> +stream +H‰Œ“=k1 †wÿ +¹ F–ü¹ºdím¥K¡-—.)äïW¶Î÷Å¥”£G~eûµÎÚê/­£ÆH&è«Ä>q<(¢<çK<æ†)_ã1ÿ¢¬>i0ôW +¤1D©NÙ ŽX„%a™½ Xæ3M“m*Œ—£zê•3€ø«Ed)[¶ê¯ + @ôº?+Ðý]½nµÆ>;oÒáÒYº·þ¤ž{Vû²Øb¼¿ÙH,K££²(#Xð0±wƧÊa—g}Þ0UætÕ³/«ËW6n—ʽÕuÎPª×› ÞKȯãIÄãÊ  ªÞœSg9ŠsŠ´à¡1A’“SÌ{<ënêåf2í8§Àžr·Ü×C‚,ÿDL«x%»¬à{Èîo·ÈÇ.§A/n‘”™‡‰¹õ´hã.Oz„M½¶;nøua·h¡Á @òІu<‹òøÍ þÏmëms×z3òÔËÑÝ–g=¦Þ=îmu;ööW€ ÉÞ¸ +endstream +endobj +48 0 obj +466 +endobj +49 0 obj +<< /Filter /FlateDecode /Length 48 0 R >> +stream +H‰tSËnÜ0 ¼ë+x´¬@Rïk€šk|k{h‚,’À›ÍÉç—”´¶7ØÀ€Áœ‘ —l]†Ù(pXl¬u<«7¢²N€¯ª»+ƒpÏ€61¼ƒ¡€““áC«C®RJiåµî„ÌŽ“pwmÎv½u5™ ‡:ЗþM7æÛdHlAëbµ$ˆcÔZô¡ôz6ÕãTy­ÉZGaû×^« "‹ÉÄNÝØ5Sþ=˜½lª_µe›HPuK™"•j¯×à$¥,kæžXîZI,ãÊkÝyŽiákÝùÛ³¦刑›Ê¡eî°ö·ä§Crèˆ6rUúEvò6°Àý•ÞoÕùjÑœT_dS½rRÐÛ€í¼>ŽDÖORö#ÉÿxÊè+—“.MÉë¢j nð¼àlÈÇ‹xÕ—OØ5ŒM/}}ÎÍç%·ôÕÉ)äÞt07cKIÞØY½ˆ4Ê莴<Ú‹³„ª's¡uÎ2aÅó‚}l'ç”.â®ÿ/Àaã +endstream +endobj +50 0 obj +466 +endobj +51 0 obj +<< /Filter /FlateDecode /Length 50 0 R >> +stream +H‰\”KoÛ0 Çïú:Z¬J¤öuÀ.»Ö·­‡-Kú@ÓM†îã"%Ë $|ågñ/2 +&ghÑbÒo +rßÛ8‘ºS^—çrxW2e’ÅIŸ©Ò5çMœ­ ÒÞîEóÖAr€«~Ý©/‹JÚÑCõ1QØôrVŽãåýtTç“^l9²>Õ÷áðÃè‡çãÑNÃÉŒÞÙ4\õÇñÉdŠ¼˜¿\æqù¦¾.ÔЫv¥ÝO­|œ5‹^x®v–ó=›­›8×,ò}rvn))ûÎa»sÒ¼ãp¶r2ÜpŠÄ#öÊ·É +ÒtÃ!=ï—%ÐÅ-§UY(ÒpUU–T`=‹”ƒµÖ,¯,Qi–ú­ñ­ßËB\³ž*»,œê²4ÛSeiÎVN•¥s¸ÙÊ{å4Y*G²Âi²tÎf̪lf16Ý#ôË{½ô»Ë”¬\Âíe"bç°Ý9´`[g+à +'@R±WN€ÝJV8o‡tÓ=fØB랆dhýªÔ–o¤•œi˜²³!9/³ébûÙ6yCG^Ö +êÇëŸñýÞøPVÑŒhýpýY6ÖOGù¾èßÕ:ÿýgÿ 0¥óí +endstream +endobj +52 0 obj +510 +endobj +53 0 obj +<< /Filter /FlateDecode /Length 52 0 R >> +stream +H‰tSKoÛ0 ¾ëWèh +³&Šz^[ rØ%¾m;d©“¶p: öÐýü‘’í8à +Ié#ÙíÄçNí•Ûÿþþ«0ò™´h囃&3„¨}’áLÐÑIˆõA KÚnuÈü ~~ ù/”˜?.áÐ&éPRz.1’Ê£¶ÒŒ,Éî:á´/yøDïuf0h— Èî2árßh§_íË'N§fT-jh¦ƒ>Ï}=Gù0K—ßÔîb8!FS—P#ß#nôaÕ³›Éˆù¿úŠOöŸøJ6Á +þtC½;‚!S„Ó˜Ê +ì¢ UɾÒÓ­¼‚l#¨ +ÉlÈ +…½ ,Y­±Lï +«D±YvGѲh¢ìÞˆê‡ïJQ/ù…hžÊ¿W„ÉÍ«v•£¢ÔÍcÅØ+`(69Vãc5>qhNªÍ›IÖ,½ÊÍYåµà8õÕñQ¢§ÃY;ûqi,”Ù&¶™IKT_†°ÊXiÙ×1NÅâ¯Ï•MK·Z\¥Gï ÐÐ +‹¼0´FÔʨ¿öât³×}+ãîPsÅ2ôŽ*Èä› DCÖDîK• ”—Æ^í,Ïö=•ÙmL›Š±¢¼)kVT^;Ì.ºzM™éVØâ¢Øúø²üð²‘$ "ñ:šœ¿ éæ1 +endstream +endobj +54 0 obj +<< +/Type /Font +/Subtype /TrueType +/FirstChar 32 +/LastChar 118 +/Widths [ 278 0 0 0 0 0 0 0 0 0 0 0 0 0 278 0 0 556 556 0 556 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 611 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 556 0 556 0 500 0 556 0 556 0 222 0 0 0 833 0 0 0 0 333 +500 0 556 500 ] +/Encoding /WinAnsiEncoding +/BaseFont /EIDOIA+Arial,Italic +/FontDescriptor 55 0 R +>> +endobj +55 0 obj +<< +/Type /FontDescriptor +/Ascent 905 +/CapHeight 0 +/Descent -211 +/Flags 96 +/FontBBox [ -517 -325 1082 998 ] +/FontName /EIDOIA+Arial,Italic +/ItalicAngle -15 +/StemV 0 +/FontFile2 63 0 R +>> +endobj +56 0 obj +398 +endobj +57 0 obj +<< /Filter /FlateDecode /Length 56 0 R >> +stream +H‰œS;O1 Þó+2ö*a%±óZ‹X:°ô6ÄBEÕEêßÇνZz”‡"åüÙŸc_>G0&z]o•ÑõQ=,/•µ@‹×ÊCZì*ËûGõX¯Õ]­©6xºímLºQ†&¢>3³a;@BÚ-•oœ>ÝÛ7æ9Ó"DÒ :}c½|ÞŸÕNY-K˜Fï9ýG-YÚ‚dp®PW\A¯™»çp"ö&·]¨ÜT“_ìÞ¿á2k>œ+‡sß ‹ s=¢Ñ²¤ qoè\a¦‘6„2 ë~~U+ùq^ÅÀùž,ZˆA×íO"Ë£=Š@.žŠP¢½„æW" ÿ³®‰@ÜßpÙÅî/›¼™übÏŠ@è&˜ý:!L´!tE"ûæ/ïÒ»¹½?ŸÖ¥šõTFoÀly+Üé¦(ª4#ÿ{9OÞšép†,øiy¦˜,i ‹Ä¾›þb#ØTêÅ/€„„vB÷’‚LOWWnöf>ÄBá( +endstream +endobj +58 0 obj +498 +endobj +59 0 obj +<< /Filter /FlateDecode /Length 58 0 R >> +stream +H‰l’ÉnÛ0†ï|Š9ŠÄr¸I¼v ÐÐC’ƒ«Ø‰9n%FÞ¾CŽªØI €âGÎöGhåµóuõù‡pmÑ;åì_Ø( 0‡æ]v +…gû7ìs¼ÌŽ9ª˜ù÷¿©òÇehÊA>¥„¼· +Û’_kU(Í.!(NiÉE«ÈéÞêΩç:1f]”Ô»3¶zÖô»¼ØûÊ¿ažû°½Ð­\ ' #ªÚè,.W`ÿÃÀ`‘õøx¹_Œ‚9÷”;@ª?u"”îÒi0ŠVz˜h ÛÏ]ç:´F ]_v:Bw7Uon¥tÊV°z”òÕn+k¤~V F‰ùf#kC|--­SÚŒì•Øk@¢®ÖŽìD®ÚÃõ|¶ë%â Ã33L;‰9ö’‚{Ž=»Jê6Á]÷]`„IüRä˜"¬.Ê•¥Ã)×_ü‘~£ô”çža‚ƒl¹ÔŒé‘«Ž‰£‡üš¹o¼34_¬)¯M=-ipé¤å|Wß®®aJã±OÇqC¢C5•p»Ž^º­ˆ%hÓ¶Ê8@Mcã–ˆt2‡ta)kGØIº7Õ…T%æ×NühÄ@ÏmƒÓh7â<‰2ì4qtŸg/6 +Xߪ؂ åG–+ñSü`û™Þa +endstream +endobj +60 0 obj +<< +/Type /ExtGState +/SA false +/SM 0.02 +/TR2 /Default +>> +endobj +61 0 obj +<< /Filter /FlateDecode /Length 25009 /Length1 42776 >> +stream +H‰\T xTÕþϽïÍ„l $™ ¼É#©dPdKC ™€…@Ð %ÉB$dXM4l"„«|JDÙ‚T|Á@…­-„P´*Ö²‰~,i¿±*ózf úÎ÷Þ;÷ܳþ÷܆EÈ—ß'¥ØãZ +ì\ËÒ±%UnÏ¥¹…‹mÇZ_2oŽÖà9=÷¾,}§zÊ«NÔ4ÖP^Ï(Ÿ^;õLyÆ7@r:à>[Qæ.m »±™ýg›'+XеªË›°Ž×½*ªæÔüåÙ¬¶ˆÜ2½ºÄM'Gk4^o¯r×x:]¢ +lïa}m†»ªlþ;á×€5¼þÞS={çÍÏ—ß3«Ì“ç;vˆcŸÁ¦z1üÚÔ]ˆQ +˜—ù½âÿû*Í+þ}ÿ_|ËÖ­÷^  oQ%ÞÂñu°ÕÛ8ˆ|„(dbê°õ°`"K~<&•åë)ÆlAlå|¶¢uŸÁBwŠ6¯b!–ÊÙj)#‡áÈA5VÑs.&ᜲ13à¡E¦Ë\m®3·cÊÌ; +%Lmæ +õsóK$³ÅlÄ9Z×i?Ò9Ê"Ö| +³Ð( 2ËÍ8;žãd£Ž +{/ÃeŠ¦:™Á^¶™†yŒµz hÄ!@#…]df›mèÎ1jØëFìæVÁªv˜ÛÍÄ Oq=-8IG¥ïÎbß0FLe”zc0ïTãøN‘NïŠj5TMQÓÕçÍO‰~˜ÀÙîbËoè¶XÀ´P~¨d™#θ¼ìGàÙ¨£§EoQ-6ËYâˆý˜JQÉx¿ÂÞÏ’ƒˆPÑ.·){”-úΛá|" x¯á] +ãJ5šM/Ò§ô•ÈSÄ«â¢\¯ìVN[Ý\õdTaöà6u¥A”K¿¢ +ª£zz™6R¢+b¸/ž7e…œ)(#˜ò•ÙÊu™ºÂrÅçòóýÕwÛL1—!—ûa1g¿›¹²ƒhǦs¸H*…P8“Fvš@/0- Uô5Ñnjá(§è"]¥Ñ-úQ€É"b…]Ä1éb–xN¬›D;Ó)qMü[FÉ8édª,ÕœU½\Ë´_^PlJ»b2Î)jƒúºÚ¤îQßS;,¡Öƒtâ§mwïœõÁ·Ü×àÛçk1/ Ÿ¡Qè‰TÎÞÍ4Ï»;îm|L¡Œ)Æ02ShͤFò%j¤Ü÷ÒaFé3ºÉ9‡‰œŸÄ1Ži²(3ÅZ±N´ˆOÅÒ*CdgÙM&Ê‘²P–É9²V6HCžÿåwò'&S Vz*qJ‚âPF*S”¹Êfå²rY¤W¿¶[ª,Ë,­–ZŸ´¦Ys¬¹ÖBëëë'AEÜïc?~‡:/K§ÜÕ¢¿#NŠ“ÜÏSP*³wªh¢åb>µˆ^je¨JcÑ¡$0ÖŠ×Åwb¨Ì¦Ñ”i¢ß]o–H…§R•÷q]9̵dÏ5–PZ nZB± sÌd_Å!ã yŽ¬ÊVü] ¦(º.vÉî‚#Jšê‚]nÂ^9“æc¿pòtú1h%÷ñXz“çÂxJ¡ï¥ )Ær +”_a žŸã:ßãåø +•*åXþT‡ËØÉ·¢·:Ã’héF•ŠWO$'9{?þ³„ø^zœ]ëùØ£=bm1ÑQÝ»E>ÒµKDçð°ÐàNAV‹ªHAHrêYEš‘Pd( ú¨QÉþµîfûA‘¡±(ëaC+ +¨ik¦³æÔÿÓL¿«™~_“"´T¤&'iN]3Ú2u­•&溘_•©hÆõŸà×ø0æív6МљšAEšÓÈšWáue²»æà =£,89 ÍÁ!̆0gDéžfŠJ£#¢œCš‚Â8)æg:=ÓŸ!ãîR#'×åÌŒµÛ ’“ Ê(Ñ‹ +è#ŒÎŽ€ +2a K†a +„Ñ*ýÕ`…ÖœtÔ»²5ÅEŽÐR½Ô=ÉeHw?FÇÍ4¢ž¿ý¿%;ïšáªp7VzÑ•šéõÖkÆ–\׃»vÿ· €}°­ˆÏ*òfqè• âè|£‰¥.ƒ–rHÍ_‰¿ª»õ•éN¿¤hšftÒGèÞiE|46¯¼Zû>›-ý y6§æïÒíÆ°X½ÀÙ£9Þ¼ÚwbÒµ˜‡w’“š#ºÜ¶9¼ó=&4ìA¦ìþ^€ ¨û¹Ñy÷‘%FúS܆V¢q&.käÿ” +‚·d«ñS@le”ò‰T2Š¼Cür¿½¡ÆGèš÷¸ôë×–¸ïI,ñ·àgý}r¿Õxÿ¿¼áp‰‰þ±fð™rŽiõ€ä¤y­B×=ÿ>ä0¶î‚!}~»ÝÀ+ZÓQÌ cQ®ëîZCq츯úਪ+~Þ{÷½]J ]*d„€‚døJ¡,"‚†d“ÍJKø¨E"•Jµ´£²LøKÒ±¶0&)”4¡ÃcM[3šbG˜: +¶•~ø‘™j:­:èŒ`òú;÷Ý·lŒ¡ÚþÓÌþò»çܯsÏ=÷ÜûNQpÚ䲸^Î5nM Ä5Q·&ѽ<‘ÜJü” +Äý·'~ÃRF¦.Ù˜×F~Jõ7œú‚¢Ì‚ÂH8}I¬\ù¶ ¸ŸäÔÏIÔ©R<5/l¤éª¤§²A¹:ј…𸘀Ÿ%ƒzC›Ï¨”-=?žR¾Ôù_68#ã&;µÙïq/I׺)3㹓ûË_î'÷3oHÌ€Á¸ Š#±Øà~u5gÂeŠñTÎHÏ‹S's~mvÇFYZ<—åqÄŸ£Rb¿†iª\†?ŽÎ¬)ùHt±X~fz~¬<¶¶ÍŽ®ËLOÉŒµëgõ³±-KÊÝÀi³OïK‹çW—ÁWµ\ +µdjU…-A­ª(nÇÇCzUqø”®éyå‹ÊZÆ£.܎ω Ôê¬e% é,P†EžÒý²}Z;¾¢²VH…”×·i$u~W§Ñú6ÝÑ¥¸::áè‚RÇœcòŠÃÉÑ#dY_eørúJßJÊK¡+'ûrRreŒ&ý™-¥âw†B\¾.¶RXæCß5K(¬í¡ˆÞD2Œ1'è!´m‚¼|šû¢}ø+0(F+Ý +`-PÄ2Ú¶s_Œ±…Ç‘¼•"þ±ô Yb÷b¾f'ÝA¹A¼EÖ\Ú ù(ú½ ˆfsô9`5Q-ô‡Q¿º#à0äz”W£_¶*òÕà[ + XÐOÂ8ûÔzï0ÎÐ,±Õ~k)ØËݘãp>P€6©àEÀ­“ª´N»õ`ªÄü{X,V¼ãìBýô¹åÑ°Ã2€‰ú š«‘žOÃúKu´‘לXìW6]ÇÆ‚d`Î_™ú\»<(É6/*=XfäP\¤…ú+´Y|•4øë)³› †Ÿˆýô`¾Ø@+!k°³Èl¥ƒ,+$¶Ú½â0Õ—iê¾oÀ:6ÀßxùêÑ4ý”eM íˆ¯Åpcþ]ÆÃ*ÆüSÁ9¢[ÆÐn sýËõûòìë*Ìõ‰Ÿc¸‰Š€»°/Qà¶óOcŸó¾k%}sÑöm´YÍ€þKX;Ç$÷áþk‚ŠÃ†kL +hS¿þ +,€ÛàBÆ™ê^Â8£ Lº Èž&bn¼†ŒWÄ Ç¦ŒĆ٠Â6³ÎŽÈýtÎL½‹çÉ°NP…BÉç…c¶´¸có™â˜qYÆwǽö>¯“c*Á8{¢‡îbäDl¹Ìç6óy8 ‡¨ +|q\É1Ëö¹Ì~áX“>Á™PNti¦Ùl¿c’vÎlÖ—åëØ ­Ã©cf$×ý§úÏý¢ÙŒœÙl¿kvÙ6Öó$Ÿ _– +¤» ý) +Ü韬Õú+´6_ˆR,¢ËÀƒ"H¹ff‹ìOygúù½`ÔÐ^ÑeÿQ‹RTï¢Ý¾­Å÷Ó0žK¿H• ¼%)ŽúÅœ7–\vãÕËœóUL[8çÞVøøqôSÍ™c6çgy? G»xµ¯$âóïsãÓ§žøâK/Ë»ùÝ=§°c¯»~Îœã8Gržã<ã¶÷rRÿ˜Þ„8æ<ü +EÔ¹§°6¾©Î>ò0ö»Ô¶­|û¸Õj7#ìFkÊLû8Ö½-q§†í>uŸNrïRGO·¸÷¨™C›U>;*óÍôcy–HûY'i»yûŽ(í­Sgþ„Ý¢>?HÕXÇ(cÎ#ôÀjö‰Ü ¢[ù^à;ÑØ?ó]TC•Æëx/pß.ï‹T +ÛÏIîTfÖ™¥Ô`õÐ B®í  +¼W¼¶‡÷Þÿ0 +õ'ºhºø9Úh0ÚÕI鸌 î[×|á[O>ÄìJ´áñêeŸ Pþ8*}!ûã-ÂñžÀ˜V€VÉ÷DýÄ Q)ÎP½/JõVg.@ãú…Øô-ïëýt/ÎWrSrÉøØWf¬gò:`Dá£fºÕŒÂ‡rí‹…“c÷ðù1šèvŽk?ò0¿'öSLL¦%VÕ@Wc"ObÞ}ÐíÄùÍÆÙÝ‹þcUÞ&̽zß2üFàóâ Rª•ï’6ð;óïP½±œªÇ ýûá‡]”…ûBCìÝLw åǪH]ŠÃZ†‘BI}½ª7· nùm;è~QB3Œé4J §,ñ;œÕé1ŒÖˆ—éh£j–E*M4ðJ7Zñ¶dýº‡õú«k)"æ¡}K¬¡­F bï÷4X܇½F?óˆ“ñèÿÆUÐÞ¢ˆQ‚³µåíÜNÎÑj—2ÄRÊ’ý’ muá±Y/€ß–cOa/—ûÙ [vº6ÞÀ>¹Ný¸8DóˆìKÀ‡û +õjêô?Qž±‚¾§5"Á¦|­8¬ð Z*¹(Ä?S{˜*fÒsÀ”§€ +œtd¼ÝfÒëÀ.Œ}ü 0ôE4‹º#@-ð[·.<×ôÉ0Ó¨¿ü,EÚe»—ám?ÏÂ|³Ä|ø@,>Á°¶SÄ÷öïèoØóÌÏÒ¦ìÚÊ–>tL^£»à‘7KIœÎ¬î†Ïeßgöw;ð5éßR@Åд‹4\.1¦m ÈYË\j—kŒFú‘Ô'öÏÑ#Vï¸ù^½Wöîë@²þ K†‰xx’v2Ä´¼²ÿídX/¢îÅëeq|DèNã ´‰dŒydënÜ™€>¶Ž–}ª ùÎ2Àmeÿ¡TÃgÐ[é~F¢~&ò7ä×YìWÌ)ëÝýq÷Å»?°/(ÎÜç)\^èr"¾U¾èó…N¼'dÎ%Ýž6×Îĵ³qïšùÿœ—Nà¥ÿõ\œe8G¤pž¸„wȼ#»ð>¹—*‰z‘K>™ü y¨üt¸½û&CQÝ7ÁO]ý几ïr`ë"êÔ»rt¿T}ýj¼"§ÿÕß]AD]9éô¿ÚlBù}à1”ÿ >®EûwÑo'ø¬Sß»ò#Àó{ ?„Q~ORè€Áï‘ë¾Cÿë|ãï›e¼YÖÃαàÓàG½ß7Íî~ÀÞo +wÿbS}K\ÏŽðÍô&Þ}ñäoŸOûÆqûÙ— ²{ñ¦òoÆ«?¶‰ëŽ¿÷Î?Î Áv€$4ŽïœÄfÄ@–_n|öBk±HYœ~Db &'DšTzHC*êJP7±Â¤…vÒ6­ª¸ØUæ$HÉ”­[CÕƘԖí¢nüj*E#xŸ÷ìÀИ´;¾Ÿï{ßϽ÷½wÏïÞñ}4ßËòý³Ø?æX|¿‰},ú%dù"#ß¿ò½3ß¿‚ß¿b1‹|^@^}<¯ÑN{¸\*&ó@ˆ[ +´½À00Xˆ=Wsx˜&'__¯¥A¯ +Jí?Å]ÙbÏQL}+žåÍ[²y.+kÊÊjë²ÕëZ³¼jM– ½s^A`:\$‘FÁRö[b§”(䬴‚“,¹M*LUú#S’‰P‰I”ì%JfZ¢Ég œÇ2lžb®Ýf·²v+µÔ ?Ï>#ç€)@bŸáü”}Šû +¬Ø0L—€yÀÂn༎ó»Fìì*©B@/0Ló€•]…u°Oø +$,÷CcŸÀ:ØǸ­aí؆Röû©ý9Yߎ¿:ç(ÞœS\šs +‹iö§äýÕJšý-¥ú•³áv™Cg—Ñøe¢@p°À»ï +Ñ“ÀYÀðyëT6 |\!5€t2û0‰nÒìRÒת„‹ØÙïI1õ"ûƒàØ{‚/°ß ~ìϲ÷’n…„ó'¸Æv€«7³ß¤* •LØɦ0< +l5Ú^`°°)VžÜ«¢‘I2‹ÅUaIrSðÏÉ[2Ñö+šo#æ˜Ê¯éYx0#êˆi¾S§QäÆwâuxÜø¾ÿxÜø¾w7¾‡áqãÛ»7¾î^xÜøÚ;áÁ¤ÙO]¹J©o‘ªa;Â( +a”†0JCÄĆøIî›xn?IVUaÄÎhþÕUŠ>AõóTßJõ·¨ÞOõ#T?Jõ ÕwRÝOuÕÝTר>I0:ÕÞ}¢Ø¨•P}–êïP=AuÕ½T¯¤ºJëµ4ó$Ÿ[/(*(æÿ+ð³-;rô`D=˜Öüí§`/QÒ R˳â•nÎ婪P¶¼®)p0¼‰ÍàÂ<†r0áÍ`Í ‘4`‡ +½À40d ÔåH|XX;l5z—yÀ"Ò™9˜KñœH¬:—t;/±œå8=Ì£•9\¿c“4ì¢v7mwgܬžᣀ:egšŒÝ+øê^±…mì&ex's<œ¼_¦¤éIߤ^ALÜ&Ì:ÚH|Ô nÀþ’—7—̹Ž¸ØÛà@Òµ—Ù“¾5Ê]ʯSî»æ”›®4ƒûפòW5m¢Iå/¨y{L¹ì:®¼_–QsÞ—¦  UHÇ] +Ê;³Bz3Iå§1å%W›ò¢Kú³ ”4»²Õ×­lB{×nEK Í1%äÚ©³ª +üš1¥)ø³n’]íV¸Eƒ/Ô§é>mõ”µËÚnýº5`]cõXk™µÔº\.”òRy‰œ'˲E6ÉL&òòtæ†æÇ6˜,·88ñ—¾t„ï`܈uÊŒNâ(ÑKËãå%¢‡›büéî?V/ëß²)N$†c™Eýø.¶\¿÷§Úí{ú>ÈäfÂ_ñÿcCN¦Sb•)F+‹@>Àa¸vÇØã¶ÔÄínJI +tîvÛífg¸[ÓÌÎ-Ã.ˤÆn˵ÛQÇýÝÿ'Ngé¥ùQ8J<^›’ñ-ñ©sò›·ô/«þ8³_Åÿè?³gû²¿Ü¿<’ùWÆQÜ +òWˆÒ‡¶ó¬È98Gæe«j³S]L|·Ë)!ž³xš$‰‚¬;:µkªââ%΂eQP¢av…ïQå˜Â» +M8„ ÝYŠüþu;²$©eUO&*‹o%ü„æ•]fÍDIg¹Ç S¥x¹W”<^)š/Jùñò¨Qxàa'~ƒs=õJáææ9k7Î^8¿bÃúâ-ü±=ßY±»tÆίÛÊÚj¶½>¿fW¡ŸqéY”ægó§€ñF.Zc%_X¸5‚$Z×À,¿ðš*²âW—,3CLV&Ò :œH ¢Q ð謙Óô¼²<¨­3Ì›é̈?$<$ö gÅ>é‚åbPúžZ«.¶5¨+mÍŽfç«Ž~ǵÀµœÛõ¬rÚIrhN¡!*~8qI@~ \­€V $S‹(®`0` @-, §…hŠ<¹PÇz +ûzØ ™;&ªÜä‚l3®ã>²…ņª÷T‘:²–l&<é%_C¹x׉,ÙAWÆbL^Ì-]Uz<9¬O.;­¶Â˜ +¤&«´h²*P'Ÿ­­æ΋–âñxY)Pßa¨ c؈/ý§œx§ýêíÏï{në~|Æy÷ÏCcÿú÷ï-;67±âÜ ç¯­jøùþíÎÿvóØÒ#ýÛžœLylâ:ï¦Äpí}à¿Ï`ù÷fT©ðDdÍ®ÚC²\àùPAP(Ð"šêóÃ6"LùÃR”¡È1õ,brTVUÁ"’üÒÑ•ô|¬˜ ¿é‚æÑæiÛ4~ž¾DßÃ=êy†Ö»Vz~ªmrmÓ¶»^Í9¤ÉB˜3y£¨š—0øÅ &Ї}¨i¸¬[Uݼ¯—D~²Úȇ(Ss4Յ׆IØǘ~QjŠšÚÅ(J£"=ÍîDÛ¿áKáŠ.ÿîÅ°œ3”/ÕjF +¿ybR°L™fÆ’YÝfä„u’á™…J„jŵ°`še'•?èNbÈ@”X‹"S£uçînØ|ü½çK¸JSj[ýÓ;\Ýy7ßß8аjåÖöÌK¿›À/ùöµþvkË»®_’ϯØúòËáž Ou­¬Û_ú`ç¹Ìët4€ÂÎU†äD¸c©ºZ}[íT/ªÂnö žsÇ‘*r’ +œ„T(öŽwqÏiˆ¨ì§úH²ÀgL‡!#ž‡GЀ̧Ȫӂ SrKåI%”³ “Ù1W(9…Ë +M2¦FJ¥óʤv;atR4W)"”„ GØËìè Ÿbï[ +ï03} ÔÏÂQ&/ zš:ŸDc ý¿tW p×}owµ+Y+í®d}íµlüƒ1FÔ ›)C‡8`—oD£bS ÅÆÐ4j æc‚JHÂS¾j Ø”Ð:Ð6õ¤) +¡ 픡…Ž:š,zï“dL§ÕìjŸö­ö}î=çž3µÝZ2Š¢Àv3çgƒšïå\2¬%a>wD˜²²Êñz_&º—È0=EtÐN7ž±PK7Wk¨¡FÅðvJUá”nºõÄhoãQžòÐß9´Ñ5`i\†‹sµ°4÷û÷”K®-ʇE+‰ÆsÑ¥ +¤!¡Á`阤œK)wœéƒÐ2:taý¢›gÎÞ®[ܺ9þàÊ•øƒ­¯­«[°vCMíúñ“Û§¿s¨cuÓA>£`çÂ=_]ßSó“‚á½ëO?!”žÝrŽÎXв¦úõÖ–ÇO¦´Wh^}äPÊËbNêÀŠ'ãm͆0Lƒð€+c'/Zœ|Œ¨Wc!Õ˜ÓѼÚð5_WìÙöJ;o·§“*J™Œ´©à*(Vš\Ѹ+½¡èhF"£ÙÆ@´1ýTdÑkŸ8‰A“xZ;BV<5–ÅÿgÔgÇú¯¡FÈ3Þ÷’Û|Ï=;PÃ/r/öÕVøVém¾Mú.÷aßißm÷Mÿ¿ó9÷nw‡›_0_äò°î ™¼9~ÑŸ¯WÚ«±ÈfâôbU‚’»pÙ§h˜X‘µgËjûpäé.¤im —4Cã´öÐ…ÁjS)6¸v¦h—Dh4’¬”Ïs¥còmáJ ™šÊa¡¤,e\,—ê;Ü+çM_U5–ŽýÅâ©t~Kìíw÷}ô÷Ùþe?ê<¼rÕ^:]]ñƒ—š¾¬—½³ê¨ùËëTÝÿ[üëøßãÇ>>ÃyÿDïm@¹3=`Ö A`4‰Œa"¢dáÄr/§¢Æ•ƒ®!œöb¯yïNX ùÜ‹ƒƒ³´ÄÅÃÙÓ××ÇGúúìë#Ü“~BLЯ±ÓÚÔ®¨L(~Ý•l|ÑCf‹0Rbcbß#ÕbµÖ¼À2W]Ï·«¿5ϪwT«Ù¡³¸*uõ¨zO¾g»g·²`ì¼5ÍbpfQ’dh›EY¢„À0†‚9Fü’œ]Ïã=Þãý‚œÿ²è&“Yy±›«7,Ä,ß28Êq§¨g5²Ÿ¼!ñÓª„Ï…ëß.P¡›RÃZ%Ÿ•®Ë|»Leü­*Òç×$5Kœ´M¹ü§Än +/ì˜oˆ +YàPî‹M¸Q®Æàh5…B Z‹¼ìÊ6Ôq«ÚÛkïím5%®-G­Ó+Žêßór— ðfé_òäL¢]Šz ?ZB|ïÌáƒy¢Äs%_p/_ûYÿû{¯Ð»ïMÊÍ,1z8‰žŽOäæÐ=onÞ„ÕlTÞ[))*g &ß±ZÅ™‚0)0+Ph´´XÄïû–›ê-Ö5¦5V1Ïmá½y…º;Ëbq:ô‚’™¥Ã¾eëºFÌÞ (c ÁW%{ÑEÜyÑŒoY¬ÅtÌqÆ° œ‰ÿÓð9óÂ…OɾáYºŸbú±Ÿ$È,ÙÀg¡ñ°‹9ѱqÇHÃ÷’hè[¯$D~¢Pù§²Sb÷·BÐpO€f9Ø”ðH-Œ>0aA…J´œA>ÏÎhÎè²±HæÁ˜ŽÑeˆ]lïà‚‡>k¬©]»evó¹¶ø6úÜ;ã^¬˜´zwü*]üjðÛsÆÏØÞï0Šô¼ñê’¼Ó͵?Ÿ;ŠŸ¦¹k¦L^Rðh$«›4í­QLRóä?¤Wkl×¾÷ÎÌÎÝ™ÙÙ÷z×»žÅöâ°PüÂΧŒJB›7j Ælpbõ¡¦´<"Ú´JX$¢F8i) +ˆB0"/ã`ÓêF…¤ <5IƒZ ¡j J, ØžôÜ;»Æ?T]{YÏ9÷œï|ß?¤åÒ;°+ïì$ßKìßÇÖBf™¨VëD‹Ñ“‰ÝŸð%Â$W•oR©Yö5­587ÔZò]é‰ÄOý/ø7 +ô¥Ýx;éö½§PÅŒ ¡3ÿº¿*ËÁJUÖð",ÆIOŠn#í}¥M@éXY$mRL=ÌZ’ì\À9W&×̬ÆéãÉ„È-„fðRq‰å* qþŠºZ1"§Ì‘PÐÏ€Nì¼Çþã…Ûg^Þƒg~€'O?R7øÒ®¿/Xtñ¹ßüšO†ÿ€ðöüȾs'¦l}q›ýI×aûÒÏ~Ëpm3`Ï|¨h/äî‚5Õ,Ã3©S>#éE\vã2‹s1^Tn…U”;ÊïðÒã+Kw\z׊¥w½XzÉ[K¯`çn–\Mõ̧¬!.S•¨HEWI4%.U>PW( ‚+.DRدÃ¥¥)V|)YÌd&Ág%α +„#a ìê³2UÛà(°ùÔfüŸÝóŸi{rÙC?ézëY{Îví¨¹¯ùWߨÇ~S%|Ü>ùúNÛÞõXmOCÍ}—^¹xmR¢ÞÈð1äQE¿´B.)I©,#Ad‰TÜIQ™UGÂð×Ëß0S#JLÝÿG»z¦·;THZ3oØ\óÐùÌ­}ZS +Q‡R…c›X1²YÈŒ¼'¬’zì¯ÚZë" GⳃýÜÊðÖÈx, a“IL•˜z~[*wÜShBû6÷•é ƹ?ÎÿóŽì`ÓÿVß»…G.½£-Ìï/÷Œ~|X½ß½_‰V,Œ‡HÇDü( +`¿PQRþ©DI›Ód>`ìŠ$ux°ãôÄÊ +S ®‰ ‘Š_˜¾,0þÂw€Oß8û{²4?OL¤M+œ +*%éÎö±Vn6rW ñ€óL:Ž Œ&~Íð&¨  ïË㥱ҒRÁåI•¡tYšVŠéòʨ–H¡°7‚/¦ W¤Ê.U¡²ƒ>X’îT +U° .Jç5M™â‡Õ:Êái•¾/ G8"‰|¸d J~¤Ñ'Øí€(x'œíGd=Õ‹BÒ­lUN)D‘Q)t°)Ë0ò.ó|ƒñ©¥ò©gð©Ç¤K”O>Ì'_.¯a¨NÕ±­Tà¥wP~´P~ã'\èSæ֢uh‹5qz[4“[RÄŸ9û˜a5ý4£ ” +‡! CJŽrX·’ƒƒ£.i`ô2ÿÆ,r`´|< +µ²  7²Þ!x}àî{êù¹®Þ9O©vÎUw9çòJçœH:çhŒŸAõ¦´VÚ#A­Y[ƒ¶¢½HœŠ,Ô‚>BWä7áæZ$ð¯óLóv²ó¯bv.³sÕ2¦Ç³³M<Ý6|g.˜·?t.׶diÓh®˜ÈÁ ÖŠu¾#ƒŒAŒŒ +M‚%´Èò`{,!j2ÒGvZ^™w nWo®ÛÂÅœƒjŽ©ÐºAò68òYü‹õ¹¼à‰AÎ;RªQˆ’×Õ5ï_ HÐe«ŠY?{,y=‚aBݪŽ¨›(ª‹ù«ÌG|ìcßR +pîbo!’ëÅHFœH˜˜{‹/¤£GS§Žú€e2|ŽgPÜ™V™Ì3îâ«ÀW‘¯_)ë‚rf› oô›œ_á«\””%¬ŒYi {LÅ_ïå‹äÖaèP˜>,pö6nð—&­È¹jµ´>»Šéç¯E˜Å24 ™~“LΉ†8âdâÖ +D¼4HâT\îyÎsRé¹ßs¿W¸K¬Ô&ëó„vq¹öc}µFU"Ѭ֠Ï!³…{e‹6k_Õ•õdƒ°N^G»…²ËO¼º^-‘ $êÑ´j‰‚I={ƈ JÝŠ +•­ëÛ§ÞOü¤i¸f¿dÒC¸ÆRÿëq—’}Û‹¹+z®Î‚E¯•k‹æšåÕòZݳ|·°M¿]x•; ô 7ù/ª]‘I°˜L‚I0êÌ…¤×)éY³I䌌]§“lN‡Û†¨Ä&Ýf#¼>¼žv» ðZ·Â¿Á"hç\ev©°ôacÉ¢³©¢@G`s€ +øìÿï³ÿ“ü“ù_A&·ƒv`‘`äÖ: +ŸU%ãPPÉ–|e6ŠçÑòGý!rNLÕkU!)ˆ“LæIˆ6@+ÙÇéHš ?™áÁ«rRôYàáÇá (“$«…ÕÀ¼k+ðSãI'?†–߻Üqþ£ +þ¹>ÜT7z÷\Sûܘ÷ÉOÁ¾m{f¿º?S 4|ÐýÆW00»+“¥Ï¿8Ñ é¢Ê+»g¬èA™±yô ú+˜¾JH«z†z†î¤ÖÑt0TA%å©Ô,M«Æ3-0=4‡š¯ivÍ +÷ð~®Ð|òE0_(ù"”/üx)²³E0_(ù"„ítT…9%@¨Pp‚ðO ÖÄ=åo +®2´q+ùe–¥önÃnƒ°Qì +t{¨†^n‡ð’¸-°5¸›Û#챺sN-æUÌ…ŠS§D€B§™.+Uˆ¥psq±îÂÞB²0(q1w(‚ŒÄ îÀÎŒqÇtn·Da΋”—Ê>tId£âCÙO¡ xÎÀxe—»P«aiŠdA0àƒ÷XÆ]sªv»  +ID ÇW¬²"( t€W úÁQµ †ºD]Ã7®Õ)DD…ó<ÙA¯Æ¡¿‹8Ëà˜€bFò™ó 7#, x—íGi.Φê!Š†DÈçÿÄT~7Kæ"LƒètÂØ„ä–PP‰Tú!Š!çTºÉò,ÚBJ ¤(‰ Ê!*mR>Ì 6‰¶a²P”æ÷¸§?ظæàœÆæÉ™Ußi]þÃ;?Þ¯‡8º/9\·yCσ7Ÿùæ5ð±ý¥¹OtN«Yî·-ŠVî_ºæwKZ?ÚÂï|yˆòò•áÉ'×w]ê\÷%Bj ԆȊ¢WåÒ +'œ€óÎк~²ó8Ž-¼Ç2N +Ö'A.mÞT +˜´9n¸“-7ò$1œ'…LÖ@£ÿ¨í{íѧº“ÁÔçˆ ²Ô_Zâ5y+¼V¯‰,ȸè™B†;|øþ7èm÷Aõ÷Á·µWU½"Ì£çi/hi Á@‚*AOÖN§kµë…w™›‚ÆH¦~òÔ VgQȼ?#Çü‰ã‰XPÆñ"U$"©Q"[¤i³DIœR¤ú¼Ôc:ÔçéPŸGŠ~Œõt.RdéP?F‡ú”Ù³‡tM +Õ‹P÷ñDdÝV»(‘妜 ¨€VÈ"I(&ºåܒ̃ÿ˜¹ßqnÆáWú˜ác×3Ãû_Ü—TÃð¯Ïœ\|Xà~ši…“öAp³€j‚t2„ƒžú8ê~Püœˆ×CßAÁ öÐ2­Ï=‡´±vô&-Óa¢’Œ©ãtœ®ØÁ9‹#\q1Œ'ÖÊÂIųŠS\ª¸k-n)ÙÁõD^—ö:pÖ0’4êBVŸwÃ}ŽSáóŽKá?Y¯‡µÓ$àF;΄&ÅlÆ”€‰¡Í}ª<6=:®8‘¤“ãfÑ3Ç=¥]¦m®7¾`¼`¼ÇÝ‹š*< Åx a+óZìOGÖDȈç«ù]ü[ü(ϼÅá¿æ)Þˆ‡G[-:¶Š"ÛÄÑJð¬ À3/S¶~ò`Ÿý'YÖ¨‘ƒµ&¤/“)Cd‘¸ˆ`1ŽƒÞÂNŽšoe± ÑzÃïƒp𸸋gCûV¸£@~úÉ…*R ETŠ”åˆÂ$‘Ã@œ)ûJ.J“8¸ý‰’äÙ$ùv$mèÝGÿÑ´ûâ3ì%–ô°Õ,ÉòXÎXËíXÇèeXl¼Xkºˆ:gK'>t[iHXQ +¢ˆ½†ÆY5ýì3„ÃÁhõÐÈ  ©r®}:K×ILÕˆÌ0‹¥á…HAaúªÄŸŠD˜&ô‰ùL²Z-’ͯP¬†‡6¢ª–ü¦íÈé3+V^[Êk¶oêvµ·_îÝ~°QÔÙ|§eÛâókšËV·®ø™âÚÚ4ýWÛfo™má9g ¨oM™Ÿ¶§w>©.ªÿìíÛ¦L×ò®ÏlYØ0åûÑ=Ñ(щ„ lV÷Æ(˜ +¦†aª=G=¤Çã“Ëå'äÏ+vRA•T嬓êœ)mŠ›'¤¤ï9Û´«¸B»Ôî<ë¹j¼f»æ¸QpËvËñw×'žQ£ˆ‰ qK S-¨LÐÈ,c®¹¾¥ï‹FÑÊÓ,Iʬè­2o°.€hPaêÛl =*Z-ƨÁŽkD#9WycÛKX|‚Áƒî¨q´ž†u0t6 bR-§‚$y@Ý{·íÕ PÑ.-,†U‚ÀP˜ö€A`¨Àÿ:†›J¨k`Gý ê8Ü3*ÿƒ¼*ÖVÕ‹#𔼇71‘Á_ B +ÔºµDÚë‡Lõ +šx‘ðûB”·rìã!T@ì'Ö[|$­fîüöôJ2Ñô£õ‡~Þµþ30òí®†]vf¾Î\yì9Ó´óâ.¿ê@ãèMjò•,8Fbk’à7 @0•h$: ÷ÑfÙ ±Ë´ðV^ƒG¯1â0'¢Ñk0Â/~ü~V¿Ï§ÊÐQZR¨ÎÐGžZ0Õ6§`Ž­¥ Å¶—ÜK½Î½#¾ã4j9‡¾l¥Ú˜.c÷o®«?8ŠêŽ¿·ûv÷ÞÞííîeo7w¹ärIŽî +B.!anÌ"ªáW€a8 +EB[HÔhТ“qÆŽ¶¶ eЪˆŠÔ)iaø£C'Ø‚3? chA'±4j ¤ß÷Ž@ÆIîöíÞ&÷öûù~>ßϧM;è{¾¯¾çóÙ¾]¾/Ñ_ô¨¾QVu ãn¿±M5Á¶ÚQ'º„EºîE÷ö­—ø=\ŸŠòàùJ¼‰(Æcìr€\ŽÎ9&aŽÉC‘`I¯‚£J"(~žKUv“ÂåU™š—:}gÎ*YògZê×Õ¯§ŒG{ªZn$Zø³ÙÍê)F¦~¹[ܱø +)4À¬É]gÂÓGò¯¿ÛwûÛ–«/¼óYôpèÙ{Þ:°sýËøyçƒ^œÕ·±°ãð¾¼ +?;õOþÂgL-`vi#ܪ@´¸–ÒÔ¤ +«"²LX¢.²G“ÖÐÕVS¤'z^ºóyèrÎeëºóuè2gž&ÂŒ®uaÆ]e²P¢M¶gZ0[«µŠ,S—jk—åÿØÃø†ßÀAÑï5t`¤W1PRôæ–c7õ¸aœ3±aºf“Ùf5YOd jsL>´UM™uÉ krÁ*núYÅáüg©ÉÆý ss ä¤Ò«\TF Z ˆJo9®ÓJA¶9l|,)|ú(¡‚ÔÂqLË4ÏOº´63ÝÏí{ÝãYshVÁ´Ä8 p[÷x&V­9ýì…-ëÏ?×ô«)ÇF +ßÞ²õ÷‡žÚ¶o×ïöÞÜßÅëg +þáZ!pö¯>Ówö4ìT´xÌ»NE‚Bƒ˜‘2´Á»FÜ m¤k¼ž ›‚ü±aá.b«ü{/ +üS¶†Âdj`Fhjdf`^xf¤>°2´(²*ðóðªÈ6y[pHÊ5uÍqÚÌy‰vDo7: +Á0H^DUÐ á-Ö±cjÖl€ºÀŽWs€=Ž«ÁÔåVLcX°¯ÖØüg%ÕØý´tRªKÃZ8 +gÇâRìèÎdc6Š£v¹Q¢¸%“RcHŽC*‘Ê,Â1²9^€ÔxMÌ$æôÏ7Àå5ßµtýœ\™ôHs³ÊàÂ>BqsËÅ T> +™–ãnÇ&ð!*>r"yíë·¯cë³ Øo]Q>¿zïHŸPï«ZúÂÓoâ¥Îþn±÷á²Û_ÜþÞ(<|b~u׬uAErÂ6H¡ÖÜ‹b=4%t_È +m +ýÆ÷†ö¦æ keZW¨'DB¬eáh*ߣ‰>=¢â °rˆ(#µÃÂÖhŽKœ8A¢ð +fÞ¿çØÔª;º‰H4ÕŽpÈe4 ¹ÐY<”ñ\PĈƒ’wÁ7YŸŒ,VO”õh|ño>ð`1ü·aûsCá(††°Šr‰¡Ä8€Y1n@^€ 6a¡! +±¡f Ú„ÚÎÚîZ†)SEö€C2h ™²ž‡81iÇœž´”›Åå©é,r¬1U –‹Í£9áç¶Î]™W5mу½½â¯÷6oHÕ. üV­múÉÞ[kÜ®¿F Ix£ÛäõJVÒ·æzg[2Íå'½¬dqµ·ÒzØ[k-U–{×y‡Õÿý“‹“¥÷ß_:·´=Ù™T*c•k’µÞÚØì‰KbK&þTY[=±)Ù–ì+½»V|½Ôtl9x\8Ò]ÉQø$1 +!®±9Ò†zÐ9ˆlÇ…Vwš‰èê좈Oµƒåñr5ž›{ÎÁ†ã:MN›C’Pr¡!ÉeÍá²æÜ•5‡ËšcóϬ¬±»dvž•5‡™‚‡YÓ;›uGEÑ’“z¯~QÕIT¯ÑÀ ãŒÑà [½ˆý7'*k›ÎµM%’›cLÞóÇÉÛã +7Ò?Ip Ÿñ§Ÿy0j†¡ä8¶“5¥À!«sN„$nBsƉÝÚÃÞi³6·îÉõã­]Ÿþâã—>zòàšO;ÿôÕë[Ÿ>ôΓÛ-×ǧ=¶bz×/qúó×0ÞûZÛ­õßõnûƒ8éãž“gO9Åçn„Ä+,qâU"?è¤D[¸½Ž“ +q¶xB#üÒ '”r<¦Ï´D #=")–WõÅ©[^™¥¸‡b›ÏÛe0Ð2þn1( &+åÞŽ†Ù}pu( µ$” +/û^ª2º°Ïßgµ¥ómÆE'U™ê²ma“ÝiwÙ£6±+Îùê°‡AxTs F5.¨lá:œ¥Y[éa_Ȇgý 8-n9çç,¼c.î é!Í"Å8‡È/ƒ +¦³v°²ìôË~%î—}yXó/3±©q¢<ëm;h›F9hîî~¦gë»uÝ[6,|) +–ð›W2ÞyTØ·û©Å/·Žü8¹€‚Àõ)èoî#´’=ÁÚN;ií¡é UÒM´vܹt‰ŽR5JÁc)D©,>ƒ‘,ÉD••¸„Hé$]¤‡\"r$"…䜒õÊB¹[7ÂëFTö­„+S6ÂL8«a$RY +É|Ï«×Õc2V3ÀG{±–oiNäT”E¨ÊžîînòuoïÍ ™p³õ%<³ø<³WXåæÉY!/•WPQ×þ+ +É"õ±]Ê,K°í©c :¶€–½âìÄ'T! æÄR!Ç¥)Ê¿ãÜpE&D"òt:‡HqùGêrõ q‹Ú'~)+e\,OPâžj¹ŠÖh ´FÒ(/Wi+Ù.½NÏÈ'ŸÈýòUå[ù{O0 ª’(A–J=pB=ž¸"[Š"‹„Ä%Õ’$U`ˆCù%Yñ@g"•ǺK%Âj)yØY¬»`u•p; zo qÈD× Ð!ƒ;•÷¸Á'@ˆ#†¼Ó¹mFÜ‚£OûWlÎÚqJÅ„ix¯ñC‰ Èom~¶´éTï–&'H«qŽ¹ ?,Óö¤Eþ~DæE«£8JwŠÍÕÌô|s#àî—ê¸ü@îD2ò‹K1Í`¡á¼Â ‹[ÁßævÏ"¼j¼_…Åÿ:¬ç§£ÌRbQ ê$¼DµEŸDtàz®½ûqn÷ÙwÞA‡r²­tðû¹f8—[ðeáâµ£,!" vaÆדdLNËÕSóc8FF#†eÕÁÙ·Øa–YŒ/7YS]Ãv³,ƒU‹§My!ƒˆ yp‹Bƒ¸¢KUíË{ªVV¢jy¬ó¾ÃR0yjâ`‚:ê.G©&æ~ŽI‰{¬WF2C:•t%P5Ò™¸áGÊÀh/üP™&ý‰Hú\½/v)·Ž2†¨Æzu¤“íô»Ûéd;|ÿ…!Ãv:©:i0uà)Bºãû;dcöS(º6CC‚^—RÀ?á_ÙCü &J¡ÒÜ)zÁ[†›”œ<ö<%£±chã‘òù¥þ¡ žØyK%OÆJŠP&Û4weÃh'îr±IÄKHŒé +B[,H¢Ûw‹²Žœ6O± ,:Æ×34SpÉ—%âK Ôîš}ív_>ûÛG"éÙk~9ð\ëã¯Ô3ñMËWñ«Ÿg?,z‹Q|^´Ùp±&ÎEÿN:&]3ýÓuÓ4îâÜYøÀ¼$¡7¥!õª:¡2!‹ÛîVœØ[ N±ñ6»hªÄO¨Ä[ÄUÄUw]…@H „É È0qqøþ?y@â*pDb\„ÿ…&H燡ÞTé5ê.õ:¨2ª‰®õ(„›ã²œgÞÿ6üÆB.1L‰ƒ†óA£Òä•Æ3÷0Å,¼EÌÆ}OñßVcð©±{nCád+oáͼ‰“â2gבƒw@®zl%>BeðÞû îÙ³þJËî'$~ jÕ‚uû™ø΃s×,ªÙœ]G¿öÝŽon?Ÿ}7XTÃÄgLFÑFihÕQ +¿Ä…™HHæJ®ƒH#8ͼ&ÎçXžå–Z¾ÍµY,I©ÞY¯LSçJÎFe®šfÓÖ§¤Œ3£<¥v°ÖV©ÃÙ¡´ªßC+ÇÚšMO³OóÍâjÓJv%¿Zä½~Æ,cÉpGuâñur Ìàæ‰Ç7«¤ƒ• +OoVâ H@ +(€àŠÆ’ÕfD™%sÈl2OÆÏ D’Õ8¶G)Ñí“ÐY$øú ¾v‚ožµD(… là-Ahjª/9Ä5s9©3‘ÏdJ°Ä@j K-î×:¡lY—°K¬+ØVjLqI30h”‡˜ªÔü7ôýäôGHÙtãõáÜØñþž×úlíé§]¨bÛ†Ü'Ù 7^Ed;îüßNŸ;‹_¨'×Æ”cT­0¶‰ÒפoH“ + +ÑÁÐ$1RVã©)›S¶&Ô²Ô{ëõ…Þ…úRK³˜ö¦õvË*±Mêð®ÒCÝWÔ+¾‹÷Hàjh"¤D˜„”ðLcê¥yÌBi™ô©p£,' ²Ý¤øý òŠß.Pv-:Ä#‰7ø¾›gBÂû¶QC yµp»hè¾ XgòpÖ"l¾ ¹jéZgŒ¢± B»Ð!t1A”B‹‘ A#jŒˆ#¢Æˆœ$–È Ø‘©¤@"lŒ%㊴àü*J4I±”½5r¯Ëtb1ŒÀG #•ÂIuºŠ¢ªxÜ44n²©½ž¾úíßùñPûúáMËÞ˜"ïÛ°ñíý]ëçÚØ“?}òÉŸM¼¹7÷Õë×g¿2õ]8uîò¹³.ȵ™®b %ʦÛ:AW©3éFú%‘KyRZ£ÖØ`“®¤ž +4¸ô%®%ú ®ô–@wàwÙ9Ê]?W¥ItXLxêèiâcôke®òdI•Ìt.Ë&Jpš…Qšõ00T'’ “ä$€ã†=_ *¦ÉU;Ÿ9™û÷‹_>ݹ'[þ‡ëöÜ°~o®¶ÌlBSyWn˾m·5ýñÂ…¿œ¹ôÁ¨p[14ŨÈÔ{ÆÌG\HbP„I22K˜o1] g•-V‹Õæ’­6ÊdA¡Å[+{-ȹ‹Ëÿ¿ƒ½ëõ¾4ä’BÃ!ºÏQä›X®Ää79çŸz¨‰‘2·ÖŽàä@jpÓJ|B%½×cß| +µeŠžÀk†¼˜q¡Øºgv[ªùùÙsæÌ|Þ`â»;ÔﯘŸjY›½YHM|f:Œ³Pmò›˜°;\o]hmˆ>^þu›õGÑ}®·'ÿÙd³z}ª·ºqò^V§Ÿ¡i©ñjÚ’¶¦ù´Ó¶vK»µoÚÅvÛ@| ÂQVD'M.ã— +­ñÖÊ®HW´;ú þ×âöÊ“wT÷ñ¿÷VôU‰ŸŽ+•E'.‘b-•ùî°0‚H1ˆƒ2ÜWÎ@Ý2KELä_(îa„)e¾cô#¬M†äµ”¶X[®ÔÞ×8‡Ô^Ô†5&¨½¡ÑÚIŒŸ‹¨ºaº„ DKh7zHB4ŸïV’ˆÀn—“MI—­.£Ëü3¯‹p0J†ÀpÀŒŠô!_T3\j²–?´ÓÔüØ¢)pF´¬ÔB°J#£¦*}Œnî7G«ðÒ?ù놪P| ¬¨zÂ6UEžâàó£°¨ÊG¾ª¼¢*ÙR3XC§jºkè !¥Ô¼ß%G.”Ï2–và 04x‰PÔAØA^Ï*(Äm#DtÃN„A$¢.¶µÿ%»Êc£:Îø̼sæóvÙµw¯mÖ^ü&õãê‡Hć£¶¢GŒH(Wª!¶Šb%¤i¤=DšJ%HQkƒmÒ´–JQŽZ¡ЄÉRIŠ¢XJ#—?JûÍìâ’v÷½™y³û®o¾ïw”ß+˜`Š¼Åã°ûÐíY-%’˜Ú®ºKƒjß4× +€¶ì ÙaƒœOÕST{Ïìj->¯†ûó½ÊɤÍi¬ÝÍì8VºÕiTUíØæ\–ƹZÊôPM£ +–ÐY¡ª¬ØÖ…ÝÝÝè.8Â…=» ±¦Djjkjç“Æü¦"A@I-O‚6KÎ&E²¯i9í=ûTç¾ÆìËŽ·-]T÷Òºomâ½ö“Û:O$êÓ‡~{tö Þÿ/™ùÄžÇXR]–ýÒÊîÕË÷ç*ÂOm-[»ymSõÌY16§aiçæM'yCÔ霩ÏIv%ÑÈAV×ä©XÙ¥0è*ÇÛà +Jø4ôP·by~ªÂNµñ”a>HÜbì2ºŒ*åôªÑkŒ +Ýd-°Ê(’µ|Þ/0Ë(ú±Ò@¢zQA5™à~é%iVT•Æ9ò8*à û:þǤýŽƒ>ö¯ „o¡@xÞÐà¿#lkf“"~5¼ð½ ¬šÇE艟úÊâolŸwèЙX˜›ý³þ—{|óyll¿ýÂó“/¯š—1ú>`Ù˜ZwoF)ˆ +‘Ì“L,‘÷ÄÓ6ñ|ÃsÌXÂƱ„`Î!L¨!‘-K +;‘’^%)]J2HJÛ)"”ðœö'IéO’Þ¥?IJÙþÄñ˜Jâ‘$N®N‰5š!¬Iê³Ù•z5Õ›šJ©);K§‰ƒbD3ô"£*½Ctš8¨¼3eâ®T\_ò•Þ„qoºº\xÏéhCqÿ¿ qoY\dYD)ÕwÏ!ºaê¦f‚Qí4rLžF†ÔÕuÿ¹•rijaq8$¼(ˆ…b¬´t^þÚÏÛ|«ßâ;Ö¬9rÿOúW|»­ñIòÃÉ3/Ü»|ͺ“æ[Wau`‰”°: ÒGȲõ£¤f"fêXgH£¦†‰6G¤ŸV^õ¯Bj¶šlÔ0ªâÍLà»Ã›)Ø̼)Hwz\êáDtveå ‘º“Veó( +]ææçQÏž‹r´†5£F¶-gðÒnn¤¸ƒl3·Ñ}h/ÞKö›ûè^Öƒ{È3ʳÆaó9úStŒ¾ÄÞ@¯±·Ð ÑÇÞA¿gWÑeö)ú»…&ØŠ)qc¦™¶fƒÍufèæQ£qŸy¿û€²\ŒUf«µÌ[Î +õÖOß2·ûõïß1‡õsÞÙàŸú-š³xåœZ7çÕõñE¨)Øk>cSŽÚ'ñëäuëö:«ŸsßV¯èÒê +ïïÁ„þ/:ÓÒÅÛ²õeëÊÖ“mPJÛ4s=5@Ü4̬áe]aã\Cq°u†¦®DM¥Ⱦ:éÕéÌâ5,äëÕµl3ßÎ;ùsœq¦B.Šå(.ÌC]²¶>œ€Mû×Å·Èþ°¥£¸¢iX†F3Á£0ŸsÀ÷Ö3 +@³¬Œ:˜çf~Ç +3cð 5#®i† ëœuܸã¸&Ø™q8iÓ•‚6Õô¸í:òñÀqÓ4 Q:ç¹.bñ›¾ƒ·8»œ.Gq†ðɈeÚÞÉžf„ +‘¯F´ãüiN¸8²| +oÑvAq)P\'ðÍØÍ)‰ÊWM +e k`EV(ûxº²üÒ^—ªŽË¶gÕÝ÷Ų²ÇõÏ®¿Xìb,öÖÞŠuûŒ!¿žM;†Ü©‹ýh— Gñ¢Ò§½µ7¿*ÎœºØg,Àr¢r]koÚMrv¬ÏÈg˜-gáBgA +µ­.ž6ˆ+žF‹È¹â¦/>}^RžÇ§ÆΰŒšA†+¼l³¼Ú¥³A3š;x_¬Þ¨½Df{”­VPŠÄ“XR€JµR«àÖÛož;Õ¢6œ>Ѹäì¯n÷¿yjîŸ`~|¿KvL{o”tܺJ:þý> <ô@ÿµÄC3”IÉ“’¼{UåÍºàŸ‡Ë›7y¯¨¯˜ÇÝy#Úˆ>b¼çQ/J4§”á¤üF|ŸÕXf}ðˆÚn´[Ý£ø;f +’!ûmë]÷þUå2ý£óÿ#Ü).ËF÷ʺ@7WŒ<1F FðB& ‰.uèºb˜”b]§šª€äó€ÏìyŽo¨ Ž¥Ø>Ó=â1ÿº@‰ŸE4ŽUˆsÁÁNÖVⶭ0J…èàl±¶+ƒvó¾®ÓƒfŒô‡õ.]чȲÈÍ(IUÄr%ï”Fµ0Q$ à +ÿ#büãÂòYpE¡”­…þy$ßózÌÿ°_­±qTWø»wÖëÙ™Ù™ÙÙÙõ¾v;^³kâcL=qž!vcâ€܉§QB’6NÔRŠ€ühP‘!4…ª’Uòr›ª´Q´”Fü@Bª”Ó¦W…VînÏ]¯“–ÊJ+õO¤½£oî¹sïܹ÷;gÎ9·d¥3wª„évÊe£8©GjUð­Ö:ZºÆ‘¢ýFÊ1…WBK§Ÿ›pf#ÎàÐNd)‘¡PÀi®¡§$2f°ƒ…c¼r{bAý‰÷ +‡Ù³~ÛQø#Ï°ÂÕåMÝÍŸ´üy¶r°0DûJÖH%‰±¿—m¤V± +I•QÃòªÞ kIÕÕ’e[‰æ²± ±ÈobQSTÂp¦Ka#~ÂH0Clb{ÂÉØÆ„"¹~—’Ì4µ˜âV­ù¬°?b5¨ +Zƒ¿Mkó·êÇjÆÊW„­Áà`hÄ Ž„öy÷ú÷Æì±Ð“þg‡¬CÁ§íç•×ÔŸ˜g?¶ÿ¤üÁþÄŸ7¯ÚÅļY‹ +ÕDÜc,1’½¶üÒúHCe;j7 Í$_I™CÔë-Ŧ†¡‘3¬W[U• eišê a&x.ñf‚'&y×)ƒ¸píIÞïª]–kñÖ›·&Y÷iƒ¥±4®ˆ®[nRkÒz5©O+j\£'rqûNÆ“È1yùt\$#"q:b^™ŠšSC;§csº$!"³%“%QÉêe“zªd?äõtò6ò6g¡/C-^fÿêkìâÅÓ펒nwtúËN…œ@:ä”­‡< +å0d>Á‘㶋ëz +C¡Šòà¯Ûw-è\Q˜_¥¶Ÿ»Mß’½t²0º¨®éÀ@Kaóëf¦.¾Í¨õdòÇö|ãÀ^¾í³_Nt®YN†|Ï»dW:›pýÖ$ÿ•Ì-¶Ðªi!zÞõ‘À¾@Y+µÎ¹+Ihä_Ît˜£ô°e|™Üãë5dý¼_Þàë3GÙ&¾IÞêÛÏvËû}ϲ'å§}WÙÊóY£œõ9òwå÷Xµø[Θ¡Nî•’wÝ[-‡ñŸÂeE©gœÂg½|¸*K[T†ýð‹ÔWŠæY]á“Ì8IÁ°Ê{–? š:â³:íIgÐ]ý!ýqý#½JïÕ‰.}7”¯16Ö‹(BBD AB¹º|&îøäpün‘œ½Q㔎]JØá6!¾îXš[™÷ÖTk*ĪۚS¡ õ±õ…^éáüÏwìÛÊþüœ${ŸûJþ‹û}ßzÞÎÞá[¤_CÅ-?‚ÄÖ¹ºÏûvMàØ£Ýÿ½’ËœFnúŽ¦`K[óÂpÈç«íã[FÆÇG¶Œóó#GŽŒLsÿÁÞòì Ö%Ìs +Ö +«JÒ'¢žc"™˜2ܽ4•D«óxco>ŒkeôßÁ"„Ÿý'(º€“¬sàÑ» ¡œ|!áË„‹¤ôoò^@y ÐÆ?%îÆ °°Â€ý} Lãj:æFd +ˆâ§D¨=Ìû*””Nøø:Ò4®þ8ÐÐdÏÌ û7àvZCn5дë¿Äñ4Ó·Z€v¸ó§@}ã®w€»‰ƒ®‡wý º?Óþ—%€å¿z^îÙ¬¢5¯ök~¬¥÷ú‰›CÀZÓp7Ò·†7Ü$8~“àbTPATPATPATPA7+ÀÁ Š +IH,Fðâ†EòT‰JQ5¿n˜+h‡Â5‘h,ž¨PW?¿!Óx[vkºca3ZÛÚï¼öz7–,]¶|EÏÊ{Vauoßšµëúï¸ýà†šû£OýðÆ û§{ &ñ¢ ô ÷a#F0†qM“éb‘Æ$Ñ€EX…µÔ7Œm×ûŠ—>w}Œøû/¾ÿH™ñ¹ŠtõÉx´<‡b®ÙKRDhÔã£'Ô•eeY¢ç+˲‡ä/•e/ÉcK{–ô.^œ]´kdxt.K‰“%èÅbº²ÄÁ.âf£ÄÄ#ØŒ=$ +Ó³¹Fý¯ÏigUºuaªh'&r mûI µiì[Ô#{H­Ùr‹HºV>Og¸¤Ç£²˜æmY“ž/³Ê?ýà¡£+^Øht~"ÇåÒè—/5Ü&êÉÀ©O'ò›ÍYè@ð\šùŸâ¹x +endstream +endobj +62 0 obj +<< /Filter /FlateDecode /Length 17743 /Length1 31948 >> +stream +H‰|U +tŒg~îû½ßLDAH& ý&CjeB“6~ƒHfBVEˆ’øéÎÈDDÒJ-©6lv[*µÝ¥– ÔO÷ ÙRŠhU?Í¡ªVÛ¥~*gSjY•ùöÎPËž³}ßó%÷½ï}ï}îâU(È•Û;yÊÙ¼—€yæf”¸ËFÚsÇs5€ê f—kÿÜZs”ïÎæSËž+ º¼§¨_<7cîÔ”¥¦õÀ“Ý€¤qE…nϧ1c}5ü¦O3:|Ôþ0lás·¢’ò9%¯Ž?„Ekg”¸ñCí5À3ÏJÜsÊB¬TÍïY´™î’Âa +ÕŠOï²ÒY匛WÅ)ÿ}Ù …eC­æÄÕá¥êľMˆ•ñˆŒ ?¾bã‚ÿÎÿ_\em]î}÷×lÃÔƒ4ì¤;ˆÄm²P² q‹-þ +­x‹•ÔÝÐÏ ‹$Ë$` ­2fW0¯£ÖØEUƾ +ã6#øZú"›åŸA!®(‘oüA¨F[ Äê 7Nó¾ÉV ûižq›­F Šõ¥b(†»è‰%r™z¦Íß±{ÉdÅèŠ8xE‚qÚøñÈÇzlcL Ô ‡ÃŠéX„7É¢|ÌÔØ…ˆÉJ†z€-eafâ·ðb ŽPÊQϨ-ÆKÆ%˜Ð=S1®P +eˆ1Ø8‹‰x‡Ù_ÿnå&u¢oˆñ–ñ!:aÓtPMVÿØ:ßXg¼‹Æ“ÄÉf;S°ñ ~ÀuQiTb8rÙò!êBÅsÄO ‹xE¼¢œD/öv2£}…ÎÙƒ½ØDZùšp‘"(†~MSh9]!Â#N(«”zå”$ùÇÛ†î£rlÄ{8Šc8A*ë‚rh•ÒŸè-jº¸&nÉ ¹@þ$[Õx_“ï'#Û¸‰(DãiT ’c»;Qãø×qÿ¢pêGE´Žtj¢k¢ˆ£D™X)6ŠíJ¶²\9(Sdºœ.ɳêïÔÅf·Ùw÷mß +ßv_£±ËhäÚ cýñÈäˆÎçªØˆ8ÉÚ¿ÄW8ï¯Ö?&гleýžjh;¢FºÊ^"°ãÄ@á`«¥âŽS•X!jØú ÞŸ‰³â+ñ½¸©¨JœÒGy^Y§èÊnå3å;.ãe/™$GÉ ÒàÌ$«ÃÔ\u³ºUýPm1¥š<¦2Óes•yaÐÑÖž­_ûà+òé¾\»A\I‰5¨åº¯çáˆgÄMø‘³MVzœq÷§LA#i”+¯( 9²Ë•-Ê å¤rI¹¬4sÖ"eWù¢¬–›d½lTŸVKxתÔµQ½«Þ5 S´)ÖÔÛ4Í´ÙtÞl2÷1ç˜ÿ`>e¾TF±Ô“‘kxh ÷`W±EDÈJjfF’hÇž'pr¹+n`ˆâ㼄ùï['a‘ý/MiRç÷å´)t•&¡ðT•MØAçD“üH Âçä"‹Ü¤ÌT+¶ò4Z&>{)õ"UŒ«ÐEÚŒ‹\ïsPCÓi¶R3 + —©/Uâ”è¬äÒB¤µBRÊ¢0Ì—<‹_\ÔŸ§õß*çñ|Ú•œÑmø†ÞÁRk<ÝžFnž2K¸ÞÁ?õ&sŸUr?Zx‚Ì0@=™xâ÷5 +–hÁ¿qEÝÕΓô’¯X®‘ß}Dî0î2læ¾+Â0\%ûøì?MâNæY’Ì]ƒ ðàežzË +ÝXm,0æ¥ø”ßÞ!;Ý¡µÜ»ùE*ó~ +_ÒbîÃa¿ìçÿ[>p•¢¨;%s?4«³Õeêµ^ݯ3%q´bWôy®æ`ö ¸Š[űÀŽ§o?Æž‡"_Ù‡ ŠF÷lžãé÷=™ÅZª8z«¹Ÿ÷qo´ðœ˜„ý8C‚"Ù£¶ÄzFpœÃÒosÐNæxxj÷Ä÷ìwõål/5­ä©ÕÀ˜Îá;Ž¶Àeç¹à q¬ëÆÃÃú ‡êi¼Ç“*å(Ç»…#âh¿sq‡†¡ ú«ß’€Ý—môÅÊ>þ1˜¿–½b0ˆžgíØVt¢QHña '´¡cÓ† ”:p@ÿ~}Sžz29é‰Þ½í =ÕãñøîÝlqVí±®]bc¢-Q‘;EtìÐ>¼]XhHÛà6Af“*A°;m™.Mwé2Þ6|x¢ÿls3ÃýÃ¥kÌÊ|TF×\1íQÉ4–œú?’i÷$ÓHR¸–ŠÔD»æ´iú1‡MÛMFç1½ÔaË×ôæ=2@/ СL[­ü@sF94\šSÏœ]äuº¬®®mp†-£08ÑŽºà¶L¶eJ´•ÕQä` +"Ò9 N (”AéÑ6‡S·Ø~ºÒÝéöè9£óœŽ«5?Ñ®SFmŠ[ºÞ.! ‚Œ€Ý”¡›f´b¿7X¬ÕÙ¼Kv‡cŠ+!Äcó¸'åéŠ;ßo£}Ûuè‘¢þ{då2òª¾Q¼Î¨bÍôz«5½atÞ÷Vÿßü|ÖÁoE÷L—7“M/á ŽÈÕØšX”Ÿ§Ó"6©ù=ñ{uÏ¿B›ÓÏqMÓô6¶t[‘wš‹SíÕ1f®uGttÚûF¢šwlžÍª‰±å»±uðŽ™»Ó’¦Y½I´×…·¿غ°v÷‰Ð‡‰Âw* î§FŒyYò#²eqAèZöî«>8ªêŠŸ÷Þ}ï-‘ê¶4)$#,Ý& +$4€|+ ™DljL ›Àè>¨…š!#!¤Œ•¸!-ß(Õ*š`Ý ,†¶KíÁ¦:£±u ¥:Bµ äõwî{oÙ¬PªþÓürî=÷ž{Ï=÷wϽžýXÓ4þ·t…OC7üªXE–`G–G†„ÂÞ|Ö³}DÏôú}á+ø/]¬YähŒLïâ"ó$N5´»åHNNdìX¦ˆY€=…÷Èúäq¹uQuŠµ×ðQ)b»¨*?á=š7¸) T" +eA»î£šŒCÈË©Š¨!n‰¹-©ÜÒà¶ÄÍC~0ù0ñ£>5âÉŠÿÝáMVøH~DIû7ÍKíöâyþâ²ê ¯0rb[\>¨f·O‹·9¥È°‚ –¡:%5C“­ åÂxg®‡FD&þ Iê% +¤” +ÅWñ†æØÿ«RF¾©MÔô$E­¿³•×Í/#ù9ƒë3Õy74¬Á_‘¥—W‡Ã)ƒÚŠ€Âá"¿¯( +/ŠZ +5~Ÿ×>¢P„W†Ü +Z¯4eDŠ6Ua(ù «J³;ýJcYg@iœW<âÅ—Jcy𪨡ÙU_C[ðž"©UãZ®ù¸FÅ +ˆ~HõȦŒ#¢Ù*¤BÖG’:«ShqTµu^©ÃoñÞ›÷ ”P—úúʼ…’ + ?=ÛpTêtíÕ^§Õ¢–¾™wR•~œª•¿ÒB´­ +´;ñu*Ð +êµÛÔéÖ5ô¯žîî²€À|ó€Y°9´cŒ‡x)ÏÐ +³›¾‰¹Ø ,¶ë•´m»ŒéTÃz̵ cøQÞ +ý^£¶ Ü‚ö*î+%ÛWҷО‹ò6½Ò²Ìf2¡#”¯AŸ†ù·²ÏY˜¿VÔZ—P‹±ïCûFÈ +ÈrÇßá²|†mäZyOqñ©‡~ 0h >l?v£PoFù6ø5r(p»ÀG+úÜ·bræ/pÖMrÝXG|Mð_útcpLg%>ñºÎÝÀ› ¾%£yjñª¸Kî¯ù À µ›f#.¼.ý¬õ1ÃCô.ÖÕèxNðÕ?gꇩõ‰Àݵ¤ˆ6Z¥]Ʀï;é§Ð“:øeª)ÝȤ©ˆ_ãÏ–bÌW%–°ÖEÈQâ,¥c¬°sŸpãıA}ö5ˆ¾WQÆ£–ž–#-ÀcìæÏã˜cß?V*^@ß0O1sŽ’ÀÚí}¥5°ÿÆRä<ö>Ø@û +ÄôçÀ¯€cìƒ É3r¬vÒÔvë#Èa@:Ð +la¾!`?÷Áü)èŸ"ù +Î07™Ì +ý¸äê<öÝ^ƒ< MΙyö €@¶q:ÈF_ŽO +s–Ï‹;6s‹yíJÉé•Ì{寓9• ·ë1*cä¼à–+ùÜaܵ,ñ]Â>íÑzh3s–ùæJŽ sÏ#Ÿ G–&¬5×9#¹°)¹.ºÒE\¾A{0f¥±<í¥qŠJð.Ñ×BnÅúŽ@‡õ|Qh9ô€'Fc°—Àvw’la˜=Ê +ÌõcÑXôÐ^×õ«¢GÑõë¼NÊ ½C­—åOÉd(1»%#±í³ê?ÔwôZ†ò½Ç²°ž­|&Ì^e<às%ô‡€`¬'Giñ¬T¢fyñÉwX%”¯hªˆÑL‘JÄ)ú +ã^™w7cüãJ/5c¿ž4SɯGnÄ\ê;¸òþ +â\2—\éò5Y2g8ïBê#pî^º€Sþœ¿+Ï/îÎÏò~@Žšm¾Z—âüÝÓ@{M‡OÓч5Ç°ÆãR¶J>±íËV¯ÏœA_Ñ5¬ûl£ï%Ÿ21£’Èi¼-ߤ¿‹þ?¡užÚãù:òÓJ7‘Kä\4ßqò¾þ磫 FýËÖ?%ÿZ–Ö‡3Ô‹óÅÀÓNO¥z/µâ,5Êøز‰ÏÖK©Ì¬¯\¾'zÁñgé1£ƒ61ð®wAö­kYIÓPÞ":¬~ô-ÄÄsC_&ß'|O¬7ù¼˜1n0?ú°òý‡yµ³ðw5"—ÌòôÒ3†ß5Šî&Øõõ@=°É†Ôym©ŒÆë¤~)½¦¶k*øÍí'Ä 8{­4K;@)bÞhƒšGµðîî +v¨‹\ÊÖ.Q±ö‰¼6ê)4UöKÃ=~ŽJEìc´D¢%š…òp`ø;=JÕúb¼³Ä8Ô)°B¥FÊyÖAî'çøÄJcˆµ4QÚ%@úê‚}~:ÁçˆíÀöåDÙ׸ŸŽ7òO®“Ç…ìóGšEd½dÚr Lm¦`¿z +ïðÕ+;ñXi£"å,ÐæàEš#e'PFE¢^iJ!êiä8È @Ðþ&&Ó1ö1È—ù»€¡þ¹ íÏ¿ÞwÛÁsÝHŸñT×'Òz†š‹7a.}ºÿ>š$GxZ•2ŒÛi•é¡Uêiè9'%ÕõlÚ%VÑÈ[ùs+(oÐxCÄ5ºû™öà½éc‰ó5ŽïçÿÖÇÏ +ìïzàaÿýô +É¡sˆ¿IC”£ô òø×Fßf8õŒç>œ{gŸ o”ú¤ýW¦hs)¬Gyí'ïë­ê÷¥D¸èÿ"t\íG>áúÿõÿpþø¬Ž¿Ò{Näûñ3Ägö[óù)þñ³Æ­ùÿ4¿u–ø7¯Žö|o*Ýqöù¯gœ[ŽùügUïC73ëbOiè}4ö²zÏ­öU×ûí·õ~’ê=eÕ1ž*zµwVûWøáÓ5×Ï1òeäu@åõK2Ì@<”±^äßÏy›¢Vž?ŸólŒZq/¿ÏFlþR„9Ê¿M&!†ð„ ß-¨J®®!êEü9bBS'Y”T_[Š?—ÛØ¢šÿ–ôlÐÜ)é©Tr^_4oâß ”ò§H;|¾~Þ?ÌŸ n§•óx£Sè¯á}¼™tâq{À(|€o&­:l\6Tú—¡h¼Ž?À}:ÄÃݤî↌ +s…[ÈÔâgsµw©üÎJosô2ŸæiBÔ¢6 Ïe^Gº!õ&ùZwt>^χñšÃ)YХş’hý +ò-¤ϾŽco3|/ß*›Eq»uöÕ +úë•®û•åÜ +Ñb¼–÷â©Íç0âsº·ù\`W”ļƒD †ADm5/ŸEmÓ4‹©™ÅÔÌ"‹Y|ߟÁ“Ätó“$ÃOyhušl–Á‚®ìèˆøÝ܇‘ð®`ì(înÎÕ6¨Ì|²q£óåê¢}—ù121$?–Ûä‹]á!ý*÷ä|­ +ÈÈÚz ݦÊ\lQsp™oá[õH´é°ã×GXA({“•Ôè°?°·Õü²k¸Vþ›ª¿UõßV|½ÈJ9ôbåÙï•—ã[Ø_ÑØcìÏd5ÆVØUð'–WY°wXôÁ×pý¼¿þ ¹í +‘gù ¹¿ Ý-êeÙUÙÕ]­µ²©µZil‰ÆýìWì5²Mü¾þ+’íð+p¼ÈÆÈð‹l'ÙÿyÕÍVÕšf¯²Kd<'T +¶4”-I§²W$©\%»Å*{…] ›ú² lÆÝ—r³‚ö(û “m¢1^Ç~DSô}eÉšrÒÈ~,cª‘y¹jŠ›gó–/fù­°µÈ#þH8²ÈM¿6cæ¢÷²9RƒÁÃXveŒ˜ «² y6#1;þ!ÞI½#S(³º–F™Ñ5‚ÒûÑÓ÷t­M“!ˆ¡ hš‚NÊ“Ð)èiè}g ‡Nàó‘‘‘‘ÑDDDDFÝû8¤ˆ4ˆ4ˆ4ˆ´&Ò Ò Ò ÒšPù¦A¤5‘‘‘‘ÔDDDDRIIIMX ,K „ÂÒ„Âai""""¢‰ˆˆˆˆ&" " "š0A˜ L¦&L&„© „ ÂÔ„„„„W^^^^MxõüŒCŠ(ƒ(ƒ(ƒ(k¢ ¢ ¢ ¢¬‰2ˆ2ˆ2;±ÌKñ×”€”€”4RRRRÒH H H©úêcz0–Í4 MAŠ-‚-‚-‚-j¶¨—×8¤X„ +ÂakÂaƒ°AØš°AØ lMdAdAdAd5‘‘‘‘ÕDV/ÜqHŸQ~î©a§iÊ…W6E;µO’Ú'ÈšögȲö§É¢öSäŒö“$¦ý hG{ÚLjpQ)bžx >CÐcÐQhZ‚®@†®]ƒþ­³Öv‡Ç2Œ%ãŠQ³d” +æq9œKÎ+Κ%gÙÉÌx+sëï(>-äY]N¢¼ áGeŸ®õ±ôÛƒïìNüëa=Ö†wÍ›!z-D¯„èRˆ>¢ñZö uè/Ib ‰Ó”UèkP,ìÅ—iîÒMB¾ òtµbVü´ -Bg …Âú^ñ)k{µÉU(mƒLÕiiÁ®¾qƒË*07]̽î&µªŸ`¸ŒÀò28{U‹x-½D‚jD/bæ.À—¤¸ŽÇ/WìgR¬À^’¢vHï…”Á·DÜM!¡ÐáªïÇ{+ß'Å„=,E'¬K*:„ŽüxÚISä:Ü_¥vTzj—bl»»U´‹ÕÄS' ëôj å<‡„nhÊA­»Ä»â»âð¿c`±<Þ1óØ5ž°êÄjøEÇ…Œ×©xü>,WÝV~Q,úgÄ h‹ú/‰çŽb.œwáöyä=£»âŒ™g¬bJDÄXøº8&‹}â÷¥xT¬ª4ÉM± —D +~ oá—âA^§¸W|SX"(v›«j|É®J»±ðª­ô~Æ7äÏ«5þH,O7X!ã=cÞ8hô{Œvc»±Õh3š\.¯«ÁUïªs¹\N—ÃÅ\ÄÕ”_/[]˶ÉéUæt¨Ò¡ë^¦JêØǨ‹‘‡ˆ½‘'Xb?MØÅ#$qØ´ÿ±¿=Oëþª]ÓÞOíÆI ÷Û»ºyc}ŸëJØFò`j™Ò¹ܵÙÙ<%é<]W·¦[íÆðLŸo-Jïž>?2B|-Çû|}½vïø„"]-»nÿùÙßKìOÙ?m±£ª²Þ6’°Oï7M˜‡¹ +¬AÙHªàÈ0Ïà>uß‘AØu†ÕÜ€0T†0W?1U¾'ý* sT‰ GÜ6eˆ«s“€Ž Ô¹uœƒª¸å5sp`Ù4u Ž±k:fÍOîˆÁŠ;°è¨v“¦TMµ›:±NÝ B±¯Ó + ª;³»o‡ø«!;? +Ù©ûâôvŒ¨Ä4uÜŠiê@L×ÿø7ÚßEs÷O\mL·ŽBiûÜñ'}öÔaÓ\žWL›Ò‡<©üñQ{¼}tÀžh0—ÿÅvÕÇ6u]ñ{ïû¶ýlÇö{¶±Iœ¯§'qâdxñËWaÍL ³™°EÕºöQ>*mh¥ehHMÛ +¡hÚ’¸°­¥Õ&$XÅÔMå0"j'¥Ñ¶Æ/;×IP§å}Üsß=÷ÝsÏ9¿sî½Õ×—`_§ìꢶQt½ýù®ÑëFOÛXµQÝ^´½-M&ºšÿGÖ‰§²ºK – ƒuQYÉæ%ØÍ”¤²š©¬f*+i$ó²Ú_ ¸_×5*¢–të·æi–X-€ámpºÅ+·‰úòª°r00Á"|Yõôˆ­¨ed¼”UÙ\ÙLYg”e‡fÇK9¸*˜ÀX24;‹ZТiíÔ1R·¾c$¼as…ʈ±}iŸõÑ+ÏVPû mðÀwþ…ûË=Qß’WÿR×ÀÀ@-ô>„:F*6tŒÔ¯‡™ˆÚÖ–†¶•‹m “o•¤öñ¹«ÀÔa¸ŸŠ£5ë`Aç. ñC¡G…þ¬_«yé]XÁÁ ç8²¬ª:ŠØŸ]¡ç—þlUÝ<…ó)¥cþp +HÈÆáWJ#óÔpVBåTäTå©øPd¨r(ÎCë¥óÐXxž.¥cUçÔ¯÷-ªýi06L‹Ê{s,¨åÑŠ®§õ>œ·×ÿ/ý©aûFíËß¿èùö>4ßyž©,þ4°ðKž9ÿ%/R/¤`nØM ¨å‚M^'IÃ8ÖdE`MŒT‘çLÂü— `)º<“È%ÖÊÓ‰T.’P—g¡¨Ž†ag +Hôh6Ä\58ô +±Wi¦2 +ù'w6"‘n¼QÛ´œ´kÏ,'šÍÊ)œÃnµYNƒãjàXPGÇð8.1 +$ïôÀðè#l9î°#O“—º¡ÔéŽy›{CAÃŒu·I°ÉñÀ°ç?í[íÄÞ„ö†0í뾸ÉÒäpR:)I-|ëeE +2½jjR™Öýjn:£û•œJIZÔI¤$Ó™IÿyJ•g¦•iuÒéò5:1¥ÕQ”ÉdÜ¥õñzØE•”ƽ¾’ºÚ~ûxÁçõ ¥üçgÖ¬-Õ}«ŽìRÆ-›¿^÷ÒO¿Wì9;øUFXÿìr‘Õ<–‘:ãí]_».–kUe°ÜßóÉ‹`³è»‰½‹¬h¡ŠŒD¸î(c0„‰“î$ê„5Tìæ-ãä-Cæpw'9I†CT[ªu^»Ô4øeUe¦s™I9!ƒ"ÎðÓÿÙ<Œc„_1ÝÁ°€˜GÌ›G¨¿^…âWXlÒ€,¤Ä{ƒŠ‚wUv×¾9”LMUGka¼W±ŠUó!ý»!ÖÆ]EN[/*—ü—·Ø”ÛÊmõ¶_l +´[µMêÏÙ×”aö|Päý!TÆÇýkØV¥Umõ‹ÅJ±Zìg¼% ÿqå\à\ðœ6ÖDÒd-¤Ukû´£Ú)í#MÔ¨‹½ž˜Fd›C“aŠ„ÎÒ€©ÓÀuychœ¼™%Øæ {°¢B[•Ø h·wsÒ=¯w”ý…Ž{ò~¢.¿s-¯Zjzj­<Ó›H¤ä)”Ì齓u=Ó›pºµz†F4Ò殎9éÆybØåFV”9Ñ ÔÙ8„éQž´>ßeX¥€ 7fÝÁ@ðdÒÕQœéXßõ. +ÌÝGAxµ¹û + + +iÜ ÃÎp½ 0U_+)ZÁ ‘úâÚ¯§€x–XÛl©<ôä=ý+=é®Ý¢ùHÅâÍ¿ükuªÖœYíÅœùÅi,}<šüÆÆ-={~|tëñ¯wd»›§×• ü qW¸ ˆ~ n¾Œ„¹{†oŒñePT©¬.ÆPÀ×=c]¸xP”£ +¶‚+³TÙPœKÚö =¤‡ÙÉíwY1ŽgyLD 3Ib ã +x‰eC_Àq¼h1üZ“…Š°úµ˜%B†gé±À°óáXØ‹6ŸÏžÛVGª 'ņT(á¨ty‚#zH!sªuËŽEPª3™^ˆn%·¶½§íï¤üÉDj +ì]^ÔƒÜJ}ðÀÁ• +%‚œH Þ¸1ï¤w¤˜´,†tê—Ž+¬<Ëa幌˜9sLd-s&Xjv”g¼4ïãp˜‡Ý Ã]1ß;œ»ô}ó&Y…+nÝÄ)3ËMÌþˆ„r÷i|lŸ{ÈmlèGkI' +Nxß@?ã?î2w­Ÿ3RD*³•-+/(÷pÒ1NÜ‚ÏçöùÊIá„2î,wFúó¾•KâNLðs2Â÷ÑgàTŠy§ËS è1Ž7>¥’í†Ý³wluàNv%ñPf¬pUZǧöMèS”Ê +â §tHÀ¡Pˆ + , +?ÉnXH™)ˆ‹ÌL&55MãbBbR§”V24-b +[Žg‹BÈ)£pr!WBÁ딽µ5õl¶˜|bþÕ<Ž€cxÙ…oטû¹ïí?´o˜¾ùÙ?ðI¼¿öÆ–‘gö}lþÇ|üäuŠÙÓ€Ùí€Y’Ñ!£¶ `¸Ú×Ãöظ +_£o7íÝíå}õÁÀYîu+WèŒÀaÃíŠ8dQ-ý€)°³’5Fµ2܇Ã8Ž†IØé +¡•‰@)ªä¶\‚á òùÜοgþKvµ7qœñÛ½½ÓÝêN>IÖÛBòI¶òÛgÀ<âc`\Œ›bÊÓɸxcmA á‘0 +¦¡-ÐIúG’1Ó$´Ð¯jL:CJþ¡¥.dx˜ÉTÐaB¡’úíI$0µ|»ÚÕÍî~ûý~ß÷ûøtf"^’y_|œýøqf7;Û"Àï)Ào”»b¶ŒÕ6jžm´NySÚ¦¼éÛ’EŸrù\¡„3áO£¤éöWÉùû +ò#òºmð¸ã¸ö™zV»¬h¾DŒ2¼š‘`SV“·¤J”] ²®¶™näfxu3¼ŽñVñPÔE aºÂ5G¢QLÖku¬*öRTD#´–ò”á¶tsß ¸eÆkÓ)+äñ ðM;Y\H%Yp/@5–:ÃzÜ ¸!J +(öh.@ñ¸F¾oîÌö»“=ð‡¡Ÿ_DNÔP™ý{ä÷½ŸÞ¾{²óÄTú*ÓÿÊ[gPÏ_o£% [o>îû›=È>Í>m5ÁN´04Ëd"PË´Œ¸ñˆç9QÀ•6I²s’ EÅó »ømS7ÕvµKåW«½*Žªµê^uH%*¶ç=Äò¸[©{íE¯yÔYPlV0„†ùÜÊb<¤¯pϲXÐꎸYâêx†‡gøúó.Jài(‘½’9) fNã)OZðÖÌ°i'Àã`Ï­à Z½aŒr±2«7›‹}'˜B»Ð+Ü„ˆÐ%¬þ-^bæ9 óWA™ænpü‹h̨ 0"ÜIÝ3g®)˜Ò<‰eÏÔ8-;ßN”Ÿ´À9>ö|,y;Ù ¶ÛØÚ"''!hÃüóÄëž'F–­ûr¦°´eµç°÷†pðiëW ý@16*ØoÚí|¹Tnç ø¬?×kÊ% 0Ñûs7>)ôæG%Õ0 (Kô¦ü/JˆL©—MŽÐ®$Q¹†öàe¤[^A×ã +ä#ù=&ÒGòêí#»ä>zV>G/ã+ä’|•Žà»ä¶ü%U×Ëèx'yCÞIwaÛ{7^AzäetÞHlÓp™&·ÑùÒ|yµùiÃÀˆ!O¤Í"Ê2õà ñɶ‚F‰ÀEQYPl¶zÑ¡ÔCy ñXj—TÃÎËJ‡]5$ÓQaØYSï›ûb—xPÿ€ZÊI hÍ“˜VÎçÇNT“Öþ–f¡þÜD³ +v‰I–ëyRÌó*^ZÏcøŠa^!+4„MŠ8£©ŸØD ‚e°zµ3'ßì9†Po3m[$$Ú^8eÚÜÇ›.À‘ /r&¼ÄÕG¤°eTÆ ía*Lj“îi“‚-“ʤ&ýH˜Ðn¥àðšE8í‹Z¡  ܳ7RîÆ{”‰€NëÏÂ!Ôr)„,‘ +Ia7:(Èë“Ùtv8{3ûO~þî“ò“§›Ù@|ðú0UÄ…¸õf™( øùo ¨G¸$`—³Lu8¸Æ¢}'yÿ/“y#áÚpWxu¸7,„µ¢çñ]òb2û:—Âþ7ù  +Éš‰K–Íb qŽéNÈeï kÈñÝÍýú;+ÎùÍ¡uS¿7½q¯0è->´£¹Ó“¹L>ÍvU/šÒ¾L¥À‘¹;ädˆJtÁœ<àìOœ­$ c< c<þd·ÐX+nP×&®*—bJ똫wÄ–)K]=¥Ë=•ëÃÛÃï–*®ãѨˆÁz³;4fé³bgô31’ÒS±­úÖØú11IǨq=kRXmS§éSc+ÔîØFõuý-õgú>ú[õwº[¦²*êb,@ªW·é1ªä›ç7Qc•­ò÷ù±wƒ2HG!ª*æ¹éV%ÙŒµÈDí¨ íB{Ña4„$t˜Á& R5FößÏùÏtû _›­¢CüÎA7^C Î4Ñ>ùE-\sÃèÒ…>t݇fúúVùx_ aù”gJX•Jw2í—Ìn1åÁ? !¾Å5Kþ&ó8ZF©Žt~0ÀÅsC +…9ñ%qÜ™ì`Õ¨DÞ¸a +!ÕÉHQ¨ÐóÅ^_)c…(Æt‹ã@*L7"U=Å@˜ÛˆºsÉ‹çÿGvÕÇ6qžñ{ï˾³}ç;ûÎgÇ1v“øb\f_!äJh‹0ÌMèF¨× ’VP‰åC]ùXÙZhAƒÁÚN¥a ”ÐÚˆilªÔµëhQJ#¢)¢iIÌž÷ì”IKt~îã½{Ÿ÷yÏïù=ï·P%ù/nµìTöÔåö×ñÞŠ¶Í-«Ñ“ó¾,¯]Ó¸¢)évŸ}ïØ‘Ìþ ù៿¸"Xë·77ì[ûrK°"\ÙTŸ¿!Wkzª¾½:Z[¾B¾ÐpĪ&Aâø!?˜4«uµ%KKH¹mçÛÕv-üÚÆÖÐõ®zOMIÝâjñ4•±åx§r‰À& 06/Þ Ã!¼/bt‡PÈ#©(41@g7Ñ‹9­4]ˆwOêñ±éÔO@•)Ô˜1øÇõ¥4uÃÓÑÅvñ]j—– 2Ù ‘µT„N†N¦+`¹@Èö"ÿÎkùüôȺwLÙxl[v×îö€ä?’¿ÿ&?žÿh]¦œ}ºµûÄ›C'ã,ý¬= +™à'þe®\#fdh ÅœœS·kÛü¯’¯:ßw¿¯ýÝ}SeGí£žQe’õÌ÷ÌW–ËËÕf-ãÌ9m äZµV£¶0[ĽÌq¿ÿ¬|F‘‡TN°Zb`;({ +!éÂwü!ò¢d¸."šà!f²ä LJ˜0ŽHœ^î¢áQØgCø.Š >qEZAãJl¯?°¦JܯÜË>>Ÿ‹ãFú”8îWâ` L 1-¶$Uój :" P¤«òw„µæ¶ïx¦­KAÞøÄ_Fów:vísò«êU«¿q¹oÝæį¡(¢A›TœÁ,²b·¾ˆ›Cæ9ÃføŒ\@ËkIŽëõ†È”á\ þåT£s¹Òè?Êq^ .Œ‡6A„­à}1ÁE)¢HbìDìþÒ5©ïVØs¯€K`´XíWÆŠ+Çæøœ\@ ›ÍD"5ÅBæõ¿P¡×çï/~gíè®® +ìDþi9Ñøüú}»7þxoߺ Ò¡N È„tOu¿±bÓéSNž€õ.†õê€/D¿!Ü'ÍŽº£Ü1ׯÜg™3ü%î’k8`·{Ñ2r)ÛÌ·†Îº†Ø¡ÀüŸ7ù8'm_»\A1¨˜ÀŠ)H†¨\Q>T(ÅBC(mYÁ–|ÙtŠ‚Ü&t +¤ ÉXO ùK ”” <¦4lXö‘XÁÆ笴¬)öCH 7¸Ý!Ëæó´CÖp¸Ë6"‚JD‰PGhsèDˆ‰»é +x‘ +ã8âY ª HÎ1¦W3+½iÍ ‰ð¬a®¶Ô@zÚ’28#dì ’‹TíÀÌP YKAX/ð@®ÃNø°9wžãY—‹#iÇ0þfЬ5½`B”<©€§La}„i<¢'…¤¤Õä[ ñ0HŒq‚ŠXBÄSÐ>ò[¤Í};çÅòþu Éì´Ií\¿d­Nmmÿa*…Ð÷ÇNþ°Ï¿¼ý¥eè§Ïïhhxó† ð(V•6«çÑh6v‡¥ Ý«1vúŠF*ªDzeU<"á<ˆp“^Î.:P‡ãƒtààY$‰*z "_†ÜðÝqø4ëñò\2mo…6Š²WºR‡DJÈ6]‚'Jz;ˆ~õªJªœÓPý¾­#dŽ(ìPêȇ©lj"ë¿Eh&ÙžÔ4 YzêªEø+Ö!OÒÒbÕ>›Å +JtLD*ÓúêŽþlësцE knÜÈßm{v¯*ÿ“»neËÇS¨Ç¬Üϯ¤;-‘@O˜Om)Ý[JÊNWwÕWoFed5%É$e¢²Z'f¼™ŠöX;lÕ3â¤4é‘ë]Iµ¾2ù(Èoµ¥²ñÑqç´?5Ûát9f;]º ú”9.'D­gÀ •ÐÉÉy‡³`+g ¬¢`«ŒB"pJ‰Uø;L8³DŸƒîPlšŸsD&ÎïV¡*  a“'’åÙ?÷;ö™(ò{Ì=}k¦XMO<[Ã3õŸ°œ³&€Í±à‹pKˆëða³»gJ\Å[bΛ«ØëŠç,®r>FõÍÔý °"€}5É+ea +ïC.Û†ÛK+Û7ÕVx\/\½¹ý)„®¼×‹l‹º/Ìÿ糩]ì{zîf}¾Š¨UeO¾þÖàÁ¿! +üþ—SKß½ø“ÔÈÜõ»ã'}ºÿ8VËÐ]f€×UbÀŒ‹hªÃé^‚–HÿDß ÎƨL9¹FzZb"=^IöP^‰8¨¥”ãy¯Â«áà£vÎ —osè‡83l‰úH¹qHë×Ènm\#ïjH#¼QU±h Æö+h\AŠß—.:܉ÁÙ½â•Åÿ ÓcSŸ%¯ìX^ª!R(V¹cñ)zsßåõ}­¥ùÛá• ›7%ó  §??±¬{ßÁéÃdÕ™µ5û÷L‹l¿‰øœR Ý·Œx––ø´Éµqd/wŽ»Ê]çîrÌ,®“ÛÁõà +†bmCSPÅLâ:ñ)¼™MÄ2¬æIÔL ‹‘rƒöÛ‹ëz¸Ž´•žcµ‘øl܃†ãäÏßF~zÑù©ûËéèý`‡z¸j„`àÛ1ìÓƽÌ9æ*s¹Ë0³˜NfÓ7p†™AE1ã ôÿçIqîda^æâ·Í0× Á¾™®£ú"oga.`V§ÂªNƒ2ì†f”5’Mö&­±Ì¦±U\g¬7v"vŠ=cû­stž‹]}ˆX"Ö®Ä>‰±134ÒpÝk=dlÚ(ÅT8ÀÛ"#Ò6·$é%Á`Tç!œ¢;*KæÚšN m†à “ͦ(‰–áÞæ ê ¢ ÜûCE4ªc1@ºUX¹4¶æ<ð[‡¡º¹Ž庡›  ýCýõYz¯NzXŸ«?ÐiÝ_ùïÔLcPl{ ùŸº5 hö^Oö¿|W +lçþ¾ï~ìûs|ç³Ï¾ü8>'¶'$46Áᣠ+&$¥ ? õ’2HÉè(é–•uSK·¬èÆ@ËMĪ6EÕHna?R¶Vc]7­Z[ic“†&º°©¨AbPMÅÙ{ç–M•|ß}Êù”÷¹ç}Þ籶;ttÛ”L_ƒ†·ûð|,nI-Ž{B^Ëók¶ó×|6=£óôü„©ObêàTÏP}æÔƒý§bÀ×Ò蚥;ä§ËÒ‹–ï¨ÍOÓ‘Ã/¯ïì\ßõ`óÈí,éz~ASËÁ¡„¨F@ÀÆÍØ0ƒ9^Çô0ý U§lrípíVhž+ƒ"9$Ί$-¶‹Dœ$›U°œ",Cœ›«çvs4§?¥Œ*¤KyJ9£¼­ÐŠE0eÕ/²A´ +Èé ¸Ý ¬ó¤¾™ ¬.,8žº§0€úPÛ„¶®m"¹fó¦Wù{B6³ç­+ã1‹×÷ílîÎn\ù¹¥këèÈðÎæä¿,?¿5Ö«ÝPc5ù¥9ÅÊlØÕd-<¢Œ¨ÃÑÁjΡfT¢üTºàºz?ü‘tÓ`«¤Ni»4( +/DÇò°YÑyØØÙ§ìSŸ1¾UÁ5FV°¡Uj/Ê„î5FE4Ò(&CI#NV8Xž‘¹_ŠŠ†a„†Yóeqú5ïW«ú«ŸõTóVŸ7·¥½øöœÿhõËÕ5¬ò™¡pÂg–Aþ+˜Ùg¨£òP%©4ý¥‰J½ÆÒ +´·£××àº\Sªr5@ Óg{‡[ +Ó‰“`:Å÷LZ š Þ«ïÚœŽÄû¬¨ñ5T°\f’ŘÅ>1…2¡õ8«mýÚMÌcÐzÈ 1$’˜ÞEc::t¬g<pÃðc³;¿¹¾â Ș}Ëò’¡ÉÂnLÎ^>WVa/Ÿ VÎÝ>›Åp±S‹ŒŒ1"}ßxÃx×`C†(Ñ´ŽæÜ*j°|ë9­6ç¢}6*Ön–ÂD¸›¸ÓÝx/žÁÞwànLÛwz|p'ÆæjDã.z†&V >íkÐLx®fÂC53Ù˜ÐÌøX*«`çiA­K{T£µNÝ +/Òq‡>«“¹âûâ7r…‰v%noÄçfœ•¶,0 +̲B|r9;°U̾ir‚’.ŠÁ8|ð#)%ªbʺ<+¦¡¾*¤ìP†áû ŠžJŸmg“0ð¢@:H– 0… æUÁßÃ@TA,"õXWv}áK•ªwUþ•-O^zÿÒ»±ü-¹kÓ£õå%ü‹ì¦þé6®‹¯íŒ•Ô•{U¹mÙ†£~ö݃ —Ýô…˼%=­mÏùÃtQpö*9Ìœ„Éð;³ªA(á«Š–¸Z]Ù"GÀ‹ü”Ï‹4Å£bM!*öSœƒwˆ~ î"¤iÕ +Û”Fi¾Îz± +zyyY‡¥›.Qàêø:ù§ TŠg1?Ñ”NoZUϨT·ºWýžú¶:£2Hu«åj½J«}ÏØKÑ6Ñ:±tâRg§g ÙíF®É}ÃÎn ° ¹pë0rÃ\vËajª©fHåp²!Y)“'¦„hI´Õ¿õ÷?‘¸§ŸÆ:¹œ_ÿÍxIñ¥ê†5+âß_~ç…ü~Àç; 2ë踄¦¶Q~Xb(Ž +°M¤In#mò4qØž^¦â½*ÄRȦ¯YéòÙ^¡`ÿWàœó&Á‰gœØùÙÖ¾0dþË#äBIÖ.3 Á.{Ñ"ë’z`ÉÏ{wž¾‚kÓ-UãÀhçÖÏŸ"cyÿåíKÛû¯à)0ËP§nh3Ô)àbÓËÄôº„ÃZXkqZ 59ûÇs°Û6½\_’8Fc–œN^ ‹…Ò97P­pQ¡·gL_iy‚GŒ ¢€P‰ª…Z"ìC\A’ÎóXíg œ– 1â0‹x”N7Ák´Ò`*Ul*âiç8B0 ×\J²¾á/‰%)(ÕK¦DKš¦»ù4ßÎSü$©7š¤:M·ÓýR6m¯Y$&. ¡p@|¸°È÷¯¾–ƒI• <°b{óßí³íR-‹ª¤0ü vkÇa`Y} +Ÿy4ÈœžÆ?ίÇÑ_/ÑX—û78”ônÿíµ¾ÚZRVÀ”ƒT°0IÔ\Èòˆ%¼ƒáŠ‘”Ñ2£;T®Œ—EQ‰Sq6,¤¨ÛBµ°#Ô˹¬J÷Ô¬šfhNài±é´Q¹ïÅ0ŠÑQ¦–‹ñQq!jd–q´’¬dZ«¸ÇÑžÿ°_­±qWøÌܹ¯¹½»ëuv)k'Ù¯ñ:ìƉ]·¾‰ã¼ˆójB²À–$M@¤©]"¢´Èüi´¨P !KHú£ùA%À1Ø ü@QùA[‘ÔR#aU%R„%Æ¡Ù]ÎÜ{óUX­ªþº³ûÇÌÜ»;çœ9s†=.ÖóÇÍ!8ʆä£úQ>dž…³lBžÐÏò ó\`Sò”~O™Wá*›‘gÕý*Ÿ1ï’Ç«uõÛ: ,ƒD¯žó4.4óúM8Õ)Âãí1䆋$p±F°nãzƒ7î&P0\¡ +&q#HN7‘QE>ô•*“dAE/ÿ™¬­Œ‰ÜaW6³-èÕ8)ŒÆšdKOš‘‚VkE +ª Š r-öQ±¹îÀœ,+ +³ [q(ħ £ˆ€߉¥ä8yjÄÊÙMN´%v&¤iLÜ^­•)îÆê¿SHàÖa’›L…CÈ"W§žF ZŒt€[ß^V¤ª9œÕÙ¾r +©È«eo/¡µúœËSx÷+åü +…95*,ço(Õvº„¥ümTºçUúN<êG˜§ªè­êôk’C–a+z…•\ý§k[Ñî¸O!‰%»ef¨>‚ºÿ®¢¿‰T[ÂÛÕ"q.µI¶2KæWŽõ,ìÙ>¸ió†ÔŠ%»˜Â +eÓK×èÉÒîï5F'­Ÿ…õñþô1Zß!}£±3Œ`Yu;Ñ'HT¢qú™åt©±š¯6wtÙGcÚßÙGæçì¼ÉxŽ½¤¾I +8ÙŠõ:&+’3_òŠ…ˆãš½€¥j:ÓŠ‘C²£:Ï;‘ ÔÜ](jýˆIGÚ"nd0¢DêÐöoã +ŒÆT-OšÏˆK†…ŽïPÍyB#Ùtø¿¿1˜xcˆþÙõƒ¸¦•²Îe,.úfJ¢çr×Åì€Hå+SH/ +Núý(?‰îøȵõdD€·!çª&|™(;̆ýž«(VÜè0ayy®ù%¤}©¢ÊKDmÏ7$Éovçoª“~\yäéCõäÄßÈ™Ÿä$B?{¿Òò¼úÜhûÿshý-¸ïë`ðßC>âCPçCëПà[“7a,°žº û›pÞúvDÛ øÐGKŒšjcó(@ʨCÜv qûS·`àŽ?¤Ÿhø¥Æ£óÑF™€Eh:ЌϷ<кKöß"Dˆ!B„"Dˆ!B„"D @@´„Dê +ÌÙ¤’eD‘'¾>adÁÍÙ€\@ =ù>¸°Vö®Z½fíº{ÖlÜ´y lÝvïöÅûî 4÷ÿ?ƒ‘6B%Š4 ­p7,‡•°ú`üî‡<ûà ©Vqnšƒ9=° +Öß2gì‡þjµúé·OÌÕ¤9ghðPð.És + VÅ/+(5 +3{Ñ=¾LÁ†m,aÿ™¡ü‹@VP>Þ»våÆÞžìò}»ö·¬8¸ÏÜЋ¦[ ‘÷ 9—ÃO˜¦Ãá ò=°öÂÃpå]8:÷üÿÅ a¹ .A®VF 8C€²½*¡Ž‹'ÏàˆÆPÚuÑ>~£}Ó +ÝØ0ÖÓpD¯ùPK0xƒþãá+ß­y0ÒuEKiÞìßÚu»à¯Ÿùï¾üòZÙéÕÄ–þñÞüÕwW¿š +endstream +endobj +63 0 obj +<< /Filter /FlateDecode /Length 9304 /Length1 17980 >> +stream +H‰ŒV{pTåÿï»»›d y¡Üå’ÙD,JáÈîN0&<ì&œÝÀbLTvÐ%åQm§RP„êÀÈ]4 m±¥0ŠN ¢ øB 0”iÙÛs7!ÿpz¿½÷žós¾ó;¯; Ð+ Qúã™#GU¼swï–ÌmðÄËŽ00å%€Úæ65ªãn:N²ìÀRR¨k˜u´!°f3ÿAÝ–ڤií¥€c=0@Ô×ø«]ßø0àQØ&·ž7ââ£X?ö¿Ì«ohlŽ›dÍâT ÿõ…‹çú1ñð—Àã¯2«Áß°¾J­Œ‡y¨‹ü +5›œ;¸¦1w`ñÒFãKàÊ6å%5uó¼t;czÎr©‘»iJ&RãŸ|_5ßáyÆ5S^l|.>gë}=w÷uGÑŠ½hç‚T£kx½‡/ÄVl ,Å2´1ýTp“ÀñIã4vá9ê+à/èÂSØ`¬£ˆE* +±äqùwãyhÒá ì—×p–1Á’bYjäÀ‚hü ]bãN@Æ`*JPɘv0Ö÷qž²,…Æ8P€™ì¹k± +'h¨ψ6yÜ2ÛØh°>) +™ð`k-ųØÈq|K14Þ£Ë2EÙ¾¾k´qäÃñ&Ãg8šc8‰s¸ŒÓlªN1K‹Rg 2:óC…'yMÇlø°/pÆ6#$¶ÉÖð±ð÷”D£ƒ|Ž¿‚sÕ…)R)ƒ†Sͤy´…þ#lb¬X)ÚÄi‘Y¼rå6¹O~*/ÈJ‘Ò¬\±ÆYF±Qo4oGÏ8§C…i|f%ž†Ÿ£z+± +/qµ6ñÚŒ7°ûщ8ˆqŸá&îPEãh<ÕÒBj¦·iýžNÑ1GøÅVÑ%5YÁ¾Û(.¥TYªœ #œn +‡Âý=ÆŸ¯{œÍ!œó Îh¼¨aÏ?ǼÆwb7t^qžgä Î\4/;%R2 +£G(‡FR.•RUP5R ½Hki=½F›H§½Œæ½OÓUºN793œf+âÅ1Td‹ñ¨(ubµX/v‰}â¯Óâ#qVœ—Å +qW&ÈD^Ce¦,’OÊJ¹X6Ëù¼ÜÉù<)/* +×/^ÉR²•Ÿ)Û•ÝÊ)å+å®%Ö²ÖòŠå7–Ë–ËVXíÖ ÖRk½õWÖNë9›´•ÙjmÏÛ^°½hÛ…(-jöðt„8Ò.Q‰7ñ!Á?¨]&ŠT*vЯ©¿LÁù[ú«¥/‹ñB§ébü5Q’ä[t ·°_(â,9•´‡x’ZÅѬÄÓO”·”{Ô¨œQ¤¸„vqÍôcMTv°·&žÿšÈTðºHÄIÑÆUø)þ€×­Ñb=×}2EFÓT³6â[|ÅÓ‘@“0Ÿçäm³4Š7i™¼*âðÝhœ¥µV;VÒ^Q"OÒ%ž¼CÜ/ÅT/ÆRîá +m¥+b6¦‹UئÔY>¢OÉI%–zî?(åTY+Šwðýk7:xº0MG%ý’§¿K81U,Æfy˜¾@-Wêd=£l +­âYØ…½²H‰ÅtÈ¡ßÉ¿‘»•fZD¯î{spÛÚ®¼-C–\e°q"ü m§ÓÆAqcŒrv¸Ž6)©<—Ëyz—p†b±“í7ñ£QLeð<®å~Mâo[4O¹‡¿\Óð4Ýä‰YÅYÊ¥,”ˆ¡X &ÛTk"`LžU0iâ„ñãòÇæýÄã£~ôØÈGs²#Éž™1LêP‡<üÐàô´Ô”äAI‰$Øãû÷‹‹‰Ž²Y-\EB¶[óøT=Ó§+™ZQQŽÉk~Þð?°áÓUÞòôÕÑU_DMí«YÀšµßÓ,èÖ,èÕ$»:ãs²U·¦ê].Mí¤Š2/Ó¿piåªþM„ž¡•ÌÓ‡ƒ-TwJ½KÕɧºuOS}Ðísñy¡Ø˜B­°&&'¡˜X&c™Ò“µ@ˆ’'R„Éîü@T?F¥§i.·žª¹LºÌpû«õÒ2¯Û•îp”çdëT8W«Ò¡MÑãFÜèÖBÝq£Î3ÃÁ5”ýn°µÓŽ*Ÿ3®Z«öWzué/7}$8Ù¯KO^v)å;–Pè]ý 4]Ý)óT“ +W«ú–2ïƒR‡ù,/ç3ØVdx|A»n5³˜2’˜ðÍPºƒªÑÜæŽo¾ªGkS´úà|$-¨cF‹cOZZÁã"ÒÜjp–Wsè“Òµr¿kp(Á-{S ÔÔ¾’œì=¡;›¡þñ=D\¿‰š^Y„Š¨›TñŒÞt’‰H›Êm «sUFâÕ8<óQ“‡àÜ­;úˆf_Ø +¹Œqb„“ÝÔ)rµ€]姥^6+ÏÉ9w8̪®é,@3úŠ2o7¯¢*} +F:Ëuá3%ïÞ—$Í6%+îKzÍ}·oÌ¿wIzTfï/Þ>h »>_§A? ®é–ÏÔŠË*¼ª;èëÉmñ¬>\·<¯WÖCé ½2]ôP"]F¤Ü‰•½Ê&ãÓ• þY#\Ýi‹âVŒìêÑí¾¢îgyŒÃñu×M«Èë;³˜z¾³/?®ß^\P2`%SϪcúÈ<üÝ =šê ú‚þNcE•¦Úµà±]lܾûí4þõj®²¸Âgÿ×½1bÈÃRf/(M‰ÈSr‘$D0˜¤yÈ#…y$”¶IKA•°¥BªC‚77B%tª)ŒÔÁ`F´$$¨ƒ +áïwö¿ÿåra”všÌ·ßîÙݳg÷?{ÎÞU]vüõdlb† oÕèñ=ßeã÷øEÙ„œì¼R}e³šÐFL{|òžîèË®Á[د¤ZXÊ-·hŒ€§4¯êêRã'*Q½†¨v~P’y]™ ü æÈâ• Iøòøúža7ÇÑoíõOZÇx_Ç«Æ™¸ôƒ–räÙAaj'E¬QH¹Àóž®TgfÒ«¢ïÖJzC«´7è]©ÙØIAŒíY.x‘6ÈÞ„ñëŒBÑ\̦k€*à*Pü +ãò\ÖF¡0¼’æš™öI¬7Ù¬£·gPŸbœ¡©Ö ØQG™<?6Ò ºž¶*)òô€,ü'´§¡¾ólÔßCý¦gµ è>„z äÉÐÓxv—é‡1¶Ð^®UŠèÌÒ°F!x60ãxýY.êè1Qg{Ñ?õG±þ5¾ + £‰Ï gÂóÇñY¢]‚ú6Ø±Õ »•(½ð˜…WÍAm§=û¯pö +ÔÑAÞsxO°?dÓplœ ¬¹,·l»%Qx[OmÁ›?0L;FsŒ±ø~gh´yŽ&0¼$:ãœr°Ç‹F-õ’ýì|ÓÜ‹yh‡QHcŒWè~ý2 +Dß‹ÖFúrÒúÿ¢×µfzÉêAà_YÐ_ì„ÎEÊ +h"æ÷VzÎá·]!½ +ðÚ=Ýsâ³ñUxVÓ +œû +/ûp%Nˆ:áóK°~Ÿ9w‘ÙÚ=ã1æ9 äs +)gUƒïúüût•…üpÊ-¦)!¿ +ƒmp¡ü,uö•xVR-pøg¶…úSÀnc„kw†õTþ +ŸÁ9ôTþß`ÿço¥|ÖÙC¶ò1ug„‰ù g°ÃÚIK€*`Æ4ð}aŸe;]Ý|§Øg\Vþ=‹ÞÒ*µö¼Oö©0óÝ#š¾ƒð-—ùÞ±ï3k~ÎÔShû,û›Ë|.Ê~ÜG¾a¾µWö=§¸žæ„|½Äe¾§|a^KYê¼´õéÆÊÓFéÆß©@»I»Íø–³ìå¼7­‰~â­¥‡ð-3Ð.âM O½˜iÖÒ%užõô;ð|£^{ب¦Ye_0I1«´åª~GCÔ:}̌ȾÿVþ¿@;aVÑtÔÍzÛÆ~Öóð4‰¾€ÏeÈ@ àý¾Øä%‚žIo]¶ø.øi°é§F-¥ˆz@>Éü”ê«iˆÑD?%Èõ"ÖÓ9`#=Äki'h%ƒõƒçEøÑm>íK.»þÍóC>¥8t÷–Ý…Á'çŽÏ*? F+(µ_ûçÊ?éúçí~j×Eøg3ôvŽöËhV¹ñݽ§|7Üýs|äÇ1’ã~iörÇGó­ù"÷¤\Åác”ºÛ¿6ùèë ;ÿ‰û¿„cÖúÈÊ |ë]š¡›ò¬¬×LÓ¬ê‚}_ +çÔgíæP>Mvs)Ÿú›ÝfäÙ +œõ +*/Ûgõ³ð=žû¬=Çü^±†PAX³Œí·Þ¡óöhîP9­ùÛ{KíFÏiìÿ03öcLW:oå½à ú«=MVs·ÙŬ˓iï7.P¾Y æ,µ›Bç‘yʇù, Óš¢rö!ó8úòécÏTÊòäaÝùtÞÓ 2^k5¾oðí£*_— ¿%Qþ%|k¶òÅ™æ +û]=HÒÍÃzîÝJû”¹ü#€÷®q÷G½7à#Ö.¼Ïø=±9¾;ýÖª ÅִظJ‹Í3ߟRõÜ#õ‘vC(n§ëäWsáßÎ[ÆyÏxFÙ§¬­j½te¿S +i™þ9eiû)±d¼·¾2EåéUð¿—ПÔžt Ý¾ãðÑÑުNjÇPߨ¥Ðß´J£#dqœsô¼‘IÉz?Ä‘¶xS§mâmÑãÈ6ŽÒ#H'Å5äÉöô•¾›&è{醒@s1.Mû†›¿‡â ˨ÁÈ¥b}]×?¦#Öcž¹†.™Ý) ç¾EÿRxâ 5ê™Ôhý‚¶ðz<8ýy c%©yP¶ºˆ²YCEúhú9ìý õòÛì…­a;Ëè3eã]ìSv°^Ìã1ÆZIdŸz8|s|w¼œŽ`3¾içk9bÞ Ä¾Éx³´£è¼LÔ:ØqÙàfȆ Þˆz d‹ÀÕà€écŒýÈÒŒ.¸+NœZÙLô!? +þ+Úø5ÒZGtã"ð€ƒÖÁ뀥Àz`$@_ÿıÇþx9dÐwãe̹‚v +êåÀ5 Ø +¬ÂœOÑŸŒA»˜Á¾}Ç»æÿÎwÏg÷Ê·ØNð@ÜÆèœtÏì~ÏoàèÜå~ÿoâˆ7h;çàî#"—~mÎt*úF±ybÔPŽË9«xbõpâb#çp)âàeŽÅ‹ßC<\^æ7èaŒYäÚµgbñð¶Úk´ 8´õE™ä:ùµ×/¥øƒ \EÕãÆ'—0}*Yµý£¾¯Ã1ƒî›Âã*ªÓ‹¸]Q<Øi'ôsÚÝ{$×*H`a.ãPöRbÀÀâÕº:ÓbäiÛ«¿Õ%9î¶#¶cÞveâvÿ}èn—aex´–áD´mUe±*sU™ªÊ>ªŒ õ6òêª<¤Ê]ªì£ÊTUf¨r®*ÕxqÿÍøo£hô·£DARÄ'Šx)ü‰Â/Eˆ±G亠ˆõxDööÉ@Šï ™–À’„Q2 è–&襡‘—:u·o×ÖëŠûo–¶i-mC1A‘H+‡ÇˆÁÈ»¼Ü£ÀfÀ$,ï`¶O5‰|ZU@^O +ŠÌ€ü· zE@^“AMøÛË«ò¬¼"ȯähy$¡JÖ`Ôæ€ Ê QHjUþ8¹J> +ãÎÊ"9[¾àS]³»ü±2“rrd¶/È«Œó©UžP³O¦£3-!(Ä>é—¿”)Ijj2OÝ'ûɲ·TË%:Ë}ϱ­Ó>ù],ö°Z%]NjóÆ«=¶©ëŒŸsß÷úÚ¾vÛ±Û7717Ä!ƒMHX/¼ÂÌ›tê + + (ƒUPH¥uÇÔiQ&•Çè’9„‡cª)”níÔ…?öÓ¤i¢SĺU‘˜±iàdß¹1JûcçúžÇw~¾ç|ß÷û¾{®YlÉü‰Ï\â3øÌ>³„Ï,ä3a>ÓÌgêùLˆÏè|¦šÏTðÁ.(‚EIN`J@‚#7s/®Ãñ98…4ð1ú +EjŠœ.¢°@¡”-¡T¢«'²c[QbK û°KËaiÕú,«µâ¬=kZÝÙz"ÇϬζè‰,¿rCrã·R ÍRý9ŒÖ$s¸ŒˆŽ{³ö¥ÉQðjÙñÓ^ÒÎ?J!çþ˜;f_l‹,kûUw±ÖŸ·þ•’Xyp¼œáý‹xvÁ0C†2tWdßMt%³—+RÙÒ™©H%²gº“£xÿ¢½m’&•¥kñPûj"§kÛR©¸ÆÀí‡nˆ4€î¢ÁÁ±ç®cð,N3p@»Yœ3€4§9_Áùð ÁÍ% +à\÷ÏÀù\÷žÃ +çµö¶aM{ò¬¼ÉÏ>+5 ~?@T¿Pñ?¦ ȲgyEHÝSH±Ÿaü³sà ÆLVÒÿ¯²½U×Û{WV&‡ÔšZºq¶u*»~7—->ïÍ£ßÓ_"“žÊJZkÖ¤µ¢XÌ­+Qâä,"n‚^¨ºxá‹_2Ð2ˆÍÅ©yKæ-!SÀ^2e±µ8å>²Põæñ¥â”b¬ñÜ>÷îݹÛ{Úžþz‹e_±Ý‹Ù¹]‰llÕúä0Ï·gãÝm)Õ?‘™Lí¹™±Ya£DHÓOOe¢X‚5®¯¨Å+ü¸¶Ò{a+°ÐóÜÛ ±Ib¼5á‚,ΣŽa +ߧqðEÕr±L×]¥‘Ä“Î5ŒÊŽ%ó¢ñÒqïÀ˜£…ère*ÚYˆ¢ô•ÇPͯWmª­*ˆxô8@=Ž³è +0c$äá܆¿ƒÆaͲë¸IT;Îá©æ…ûðÀ©I›œ_ßØÒÈï×ÇkÇÇŒC°Á»ì2¡þ¸/AÆT +ãˆô"þ†´†JJ¬d2å†3†­>Š[h©FdM5H–$Ñd‚¼— ¹cq%I89*uÍ,b¹ò¸ÏE$£XMùv‡ÒÐ +û¤‹bzÔ¸C“}l~Xùx~=N£=iµ„c[ÂU-á–Fx#}ñîôƒÊ>Ì·ÖTõL3]û¿þ~xhIMä?qXÎÌ÷`÷*:wc¹uyy‡¶äf~ï´ØšäTs¬Užêò¶FìñŠV_ŠzÙ´«d‡§ÛÛ]¾µb‹ïuˆ è3Þó\Žvù¨ÂkSXš+÷p ‘ã`ÚÑuɇš’-mø“¸ •UJ1·G;9äÖ—+;'ÁUS“Ê}ÃW±I›+âŠ`›=B”Òu”n\LFp57µJŽŸ768¥žc9ŽWùå[ßÿû[M‰J×Û»vþXö<ºyø³»âÓŸž8¦RíØð{7÷„—'£ÛO¿}Ösûó]nû~ßš½Ô½|Ci°Å:6$dÆñE¬Œ/ÊÍ7äßÈS2ËÈ2âcüQö +ù'æAóMógfÃûDæ̼Ċ” ±&3dÙ,#sÏÄ4ã i¬$å‘ i³L^û"[Ã0f>F y|¨>~UFð9 +¼.`!‡ÿxEd˜ÅÀá…e%Š$¹"Ë"z\—£Ö_±Š4ü'n²R˜*³ÈÀ›“£OiMwNa¤‹ŒyŽˆ‡ýØÏxº‘s3Ô#Žan“Ĉ¢o6X8VžG4£Ö€rb +øÞ7¢p˜Ë᮳¬ÂÐQлFíÅ+VG.“ ‚–}Û­‡ŠVУiÜY€25¡f¢¨q,ªPÔ EAs¶Ï"¹eÓXåUšÜiÜ@jÓfšÖN±ù‹Óó.v"<óùt30ý%ä O\Ƈåaá{÷oƒ„×ÀçP'$ +ºY-õ3?Ÿî9z”pmýÌL˜YŒæ ft+¾jÃ<\-U›4¹ºö|.$D„uêN•iªkbB5A3mEÕ>­F§KÌRƒ§F×k%³C’ÌÎ*¿ »V—ø=|PjðÓ&WÒêÄξ÷…\0l +øPRÑvk”6ã‹ÛìMȧø^ñѾ©¨¡&½ŸÖ;¦'# ЃT‹MÒ}–:ÝvAÄ.ä&²Ù]ø '®æ8­2ØÜi§¹iγu‘¥¹R‡K –@œZ¨R‡³±!¦•MC[Ï\]ubó"¼¶£´.vðÕwÔ þ9úëÞdÙÂrç +ë¢àºg¶öl^¡ûU‰Á¾ÔÉ.»l©è˜«jØžVÎ^Ú´l÷ÚÝÓÿ>²¢aS¾oUD‹¾)òÍ-ߺL× 6v‚½è͸¡{;½?ä79ý­UlMé”ÚèíQ¾+T~$°œÃéøš¸'©¤ÀY«,]&\UºQ‹»ßÄ—ùJp=¦ð‹3ÀË­IdQ,”%Q± aä±ôl"›Ö&œr¥!®& :¥!aWÑZö*È_¥|تhZ½ÖöèÜà0>ÿÁ§Wp聯Ïm8Lþ +ùäÖ½ßá•¿¼õž¼ýÕé¿íï?Lz ´\Z–¡J46ŠTÐNíü¨œD×$dq‘«©<å>õ_ö«66ŠëŠ¾73;;3û5;;ÞÙ1سö~xí]XƒlWŽwÀŽù¶Äkc'$„XL0ŒH•¨œ5È$M(ÐØ&QbBBJ)NUE¥ª\ª’¢JXµùSj»÷Í(ªü‰øµ³ºóÞ<Ïìzλ÷œsUƧ.Ê¥¬hP=§Òa:fÛ’»;—Aä^4#Ñv»òPPÄmà¡°ˆ—Ã<3#7æ~M:,Q’Äø5»U$¤!ê€>Cösá@žß¥+þr‰®®¿¸Wu0\mÂ5ñ˜¸z ¢ÄéÌU£Î ‡¾Œh:2@òQÀ†lî€#[ X\0Íûôò“áÉ~Òyîé·0êýôoÎß`ö¶§&ƒÔ#xϺMÃx­ôÂõõ#=Çñ¢¾ë¿mX©©½‡ºp×Lûžý‡¯y“2/^…¨ çFá©+ýðös†Ìq.A, ˆ1sä9ã«ä›Â«ÃÝó,¡hé<*$…r’¨Jc@vbŠ"jÄñ©j@P DH„Ÿ¢^ÕËqM¶ú" +Ñ«å¹|>^U›ÇÞëå• +Ö”¸Ò­\R˜V#¨â!*4Àü"—ô™”_.8'†“FE!!„[ßÅ* ø¨x&Á‡jýFœˆvÝH§3XZ?CX¾K1ƒòaI#ÙƒøÆ`oŒÒ¶@iGÉVìvŠŸq`! C3i²ŠÂzÀ4·|:cI=——ÑNÊÜ$¬xÉæHÆÖ8©¢ +CsÞYH¯ô½uùýëÛ¿Ê|è¸ÐÓ}ºåZNþ†ÚU'×ï_·ð§ëÊÛÜÕÕnoSåpjßØå~;øùñ[SÇ>yfáΕ*õðúòúÛ1»å…_.Úÿ˜À)únÇuá=úsúý-Íð`,õeñŠD#ßÍð´ÆÇù>þ?ÌOñ,EÓ¬’™ŽPVk€Á2Yi§"ÐöYXk„(Š·ZŸcxóÈ.|¡¾°›a@m®³™SÆ(©êÛ†¬Af¢,ÚAF¯Ÿ4ã“á$£W‡Œ«þ‡ÂæªsA¬Ê8IóOy¥æ83nŽÊô­¼LnÍ+2®>P ’÷4«ˆr§£]õÿã‰h£Û&l¦ÕRUeM +ËD3+ö”ÑøÁè@t²vtp”»xñ–‡ ßúaÊ„Øn¨‰¼D Îc:/$úb†c—”/×(ö r0pÜ{¼ðDìc…}Й⚜Jkœ;c, ¹Bç<®ÌYDZ1ò1A—PTIIÄûÅJgø¼üü€æ—ýdÁ5Íï’¤€G–e² cGi¬ªÙí°aÌ–hùžbCø÷ºCvñR³,"è¡#à5Yô­3¦-¸í +Èô¿gŸE ÐÂ1°Òê‚h!Ì|÷Nafu€GÓ„çÓež2«áPãLD0à™æ0öÞyÍè`hu_º½'gE{O²oð€gaÕŠ£éÀ_$ê=[¸– ŸÈ¤Ö>þTûŽŽ9™‰G¨OS¡DÕ“}ïNLP—h ýÉoO +°—µÐ´À^ºÐM}O¿ÄÿœÛÏ3¬Ãë8Â}Áüƒù͆©SçS‹ñV¼[.Š¶Q.WÀt^<ÈŸM3·ÀøC}¸@æt§˜0 E¥DëÚÐF4‚Æku¥D£¹pWÝm_n +äÕr!ÈwHsdä»SI"Ýá5®úg)ÆøA¾”¼›ïðxô6…ùî6=„ɦ3I@^Fó“Î܆]±bA׎žµòÐÊùKã­ç+c—·u-üÃäØdŠä~è' +xÅÐA[‰ ”shêë~i"*Lzo¼YHwÒ]êë¶^;c#}‘ŸŒä®Z˜ôÐ?ó½c;â`êè­¶=6ºÄ,( TØ¿ÝFçAÀÈ`%è]éAAŒ‹s5Õ¢ÛòüºˆÅM8Fä”ÇÍ~UMܽ¬‹³ˆ·çü($†¨Ð¸— æ'WôRWÀæ:kêl&Z3=q5 +ÓŽ±«âÍÌ÷Ȧ›´R¦aC&¹cãì)— +'Ž-XD(ÝÈXÓ“€eó’OŽL KQ¸i°tWêù烡ɿFjjÏœÿŠù5Ó½ùñgfåo™Ÿzâ‹ÝC»váu¶†çêÚÄKJ¶©Åï8ý†½mcjîÜpîüÇoiüEKK ¼`7àÞÉ„Á·Lê›UNå{mZ?®å|ã³òÏ¿hÉ×kíÞ§±\‘Pîë´v +›ì›}l ÇÅJ÷7“£ú%àUe¯.Vî8¼*tG 's¥be‡-qª—ç@…]eS}‚%7âU9‹¨4ƒGþHwùš“*ÕFµUÝ 2êµ½TÀ>¥Ï´ûK-xÄrÅ2n¡ã–¤…²¨ŠE±ä +g§¸$uýØMb÷20À¢HT™PòX4IèÃM’“ðZB >’² µ†Ò¦‰y6´µøyÚë.®´:|~Û…݃¯JK-Û¿¶À›×68úÞ™?¾²¦æWÔê‰UMñªš¥;Rå/ã @ä½ +Fu+`* CúCRí·× º}¹}¯ußmNa +¥—)*i,Ë8‹Ìqx7Ž*ÃH¢æ9Ž¢0+ oFœÈQ€FŽî¦ ç;Žé +xà)ÛG¸ÞhHÊM|Kìnð$|HY’–Ñè·“7G¥?À ’’ÀÑUt™xzHŒ—?Ùâò&Vàöá‰ÃLxâTÛåÌj'¦écÓGî~ +œÄF3èßý0Á½ñg3XÝ kØ .e†à4Ãöì½á˜ÿÝp®AÈ5j†{.B•ld#ÙÈF6²‘ld#Ù¸ß(„¾WF4™á\}ïAßså†çsò»Šÿßã Q-ªC‹ÑR´ ®–“¥¦j^õý?|¿½ç|$«:‘ÍFsQþçVôjG«ÑÓh-Z~‚:§þ³ÿ@u yC,òE ¥ÿÿÿŒBCõÿxUp0¤AÍaf’ŒP!„Íd©b˜…(¢Æ` e3ýe3Ås¡l {2”Ídïtõtñ÷tÔv,ÊLÌÑñ,IÌÉL&NˆÁ•ÁÙþ@Ò‘Aˆ‹€“Èà)³2²R /¨‚8=ÔT 5æ=@ž!Š2 ú ¡À ¢Œaf (Œ€2,@ˆ£Ò˜„€Úá=zì€Á˜FÊ8@ÆœaÿÍ<KLÏÒCy¦ÇóÛ|åä«^\th?ˆÞzrÙôßwÿ¦s,gÿ +ä‚â +l2­M¡/ +endstream +endobj +64 0 obj +<< /N 3 /Alternate /DeviceRGB /Length 2575 /Filter /FlateDecode >> +stream +H‰œ–yTSwÇoÉž•°Ãc +[€°5la‘QIBHØADED„ª•2ÖmtFOE.®c­Ö}êÒõ0êè8´׎8GNg¦Óïï÷9÷wïïÝß½÷ó '¥ªµÕ0 Ö ÏJŒÅb¤  + 2y­.-;!à’ÆK°ZÜ ü‹ž^i½"LÊÀ0ðÿ‰-×é +@8(”µrœ;q®ª7èLöœy¥•&†Qëñq¶4±jž½ç|æ9ÚÄ +V³)gB£0ñiœWו8#©8wÕ©•õ8_Å٥ʨQãüÜ«QÊj@é&»A)/ÇÙgº>'K‚óÈtÕ;\ú” +Ó¥$ÕºF½ZUnÀÜå˜(4TŒ%)ë«”ƒ0C&¯”阤Z£“i˜¿óœ8¦Úbx‘ƒE¡ÁÁBÑ;…ú¯›¿P¦ÞÎӓ̹žAü om?çW= +€x¯Íú·¶Ò-Œ¯Àòæ[›Ëû0ñ¾¾øÎ}ø¦y)7ta¾¾õõõ>j¥ÜÇTÐ7úŸ¿@ï¼ÏÇtÜ›ò`qÊ2™±Ê€™ê&¯®ª6ê±ZL®Ä„?â_øóyxg)Ë”z¥ÈçL­UáíÖ*ÔuµSkÿSeØO4?׸¸c¯¯Ø°.òò· åÒR´ +ßÞô-•’2ð5ßáÞüÜÏ ú÷Sá>Ó£V­š‹“då`r£¾n~ÏôY &à+`œ;ÂA4ˆÉ 䀰ÈA9Ð=¨- t°lÃ`;»Á~pŒƒÁ ðGp| ®[`Lƒ‡`<¯ "A ˆ YA+äùCb(Š‡R¡,¨*T2B-Ð +¨ꇆ¡Ðnè÷ÐQètº}MA ï —0Óal»Á¾°ŽSàx ¬‚kà&¸^Á£ð>ø0|>_ƒ'á‡ð,ÂG!"F$H:Rˆ”!z¤éF‘Qd?r 9‹\A&‘GÈ ”ˆrQ ¢áhš‹ÊÑ´íE‡Ñ]èaô4zBgÐ×Á–àE#H ‹*B=¡‹0HØIøˆp†p0MxJ$ùD1„˜D, V›‰½Ä­ÄÄãÄKÄ»ÄY‰dEò"EÒI2’ÔEÚBÚGúŒt™4MzN¦‘Èþär!YKî ’÷?%_&ß#¿¢°(®”0J:EAi¤ôQÆ(Ç()Ó”WT6U@ æP+¨íÔ!ê~êêmêæD ¥eÒÔ´å´!ÚïhŸÓ¦h/èº']B/¢éëèÒÓ¿¢?a0nŒhF!ÃÀXÇØÍ8ÅøšñÜŒkæc&5S˜µ™˜6»lö˜Iaº2c˜K™MÌAæ!æEæ#…åÆ’°d¬VÖë(ëk–Íe‹Øél +»—½‡}Ž}ŸCâ¸qâ9 +N'çÎ)Î].ÂuæJ¸rî +î÷ wšGä xR^¯‡÷[ÞoÆœchžgÞ`>bþ‰ù$á»ñ¥ü*~ÿ ÿ:ÿ¥…EŒ…ÒbÅ~‹ËÏ,m,£-•–Ý–,¯Y¾´Â¬â­*­6X[ݱF­=­3­ë­·YŸ±~dó ·‘ÛtÛ´¹i ÛzÚfÙ6Û~`{ÁvÖÎÞ.ÑNg·Åî”Ý#{¾}´}…ý€ý§ö¸‘j‡‡ÏþŠ™c1X6„Æfm“Ž;'_9 œr:œ8Ýq¦:‹ËœœO:ϸ8¸¤¹´¸ìu¹éJq»–»nv=ëúÌMà–ï¶ÊmÜí¾ÀR 4 ö +n»3Ü£ÜkÜGݯz=Ä•[=¾ô„=ƒ<Ë=GTB(É/ÙSòƒ,]6*›-•–¾W:#—È7Ë*¢ŠÊe¿ò^YDYÙ}U„j£êAyTù`ù#µD=¬þ¶"©b{ųÊôÊ+¬Ê¯: !kJ4Gµm¥ötµ}uCõ%—®K7YV³©fFŸ¢ßY Õ.©=bàá?SŒîÆ•Æ©ºÈº‘ºçõyõ‡Ø +Ú† žkï5%4ý¦m–7Ÿlqlio™Z³lG+ÔZÚz²Í¹­³mzyâò]íÔöÊö?uøuôw|¿"űN»ÎåwW&®ÜÛe֥ﺱ*|ÕöÕèjõê‰5k¶¬yÝ­èþ¢Ç¯g°ç‡^yïkEk‡Öþ¸®lÝD_p߶õÄõÚõ×7DmØÕÏîoê¿»1mãál {àûMśΠ+nßLÝlÜ<9”úO¤[þ˜¸™$™™üšhšÕ›B›¯œœ‰œ÷dÒž@ž®ŸŸ‹Ÿú i Ø¡G¡¶¢&¢–££v£æ¤V¤Ç¥8¥©¦¦‹¦ý§n§à¨R¨Ä©7©©ªª««u«é¬\¬Ð­D­¸®-®¡¯¯‹°°u°ê±`±Ö²K²Â³8³®´%´œµµŠ¶¶y¶ð·h·à¸Y¸Ñ¹J¹Âº;ºµ».»§¼!¼›½½¾ +¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäüå„æ +æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿ ÷„óû +endstream +endobj +1 0 obj +<< +/Type /Page +/Parent 30 0 R +/Resources 2 0 R +/Contents 3 0 R +/MediaBox [ 0 0 612 792 ] +/CropBox [ 0 0 612 792 ] +/Rotate 0 +>> +endobj +2 0 obj +<< +/ProcSet [ /PDF /Text ] +/Font << /TT2 38 0 R /TT4 40 0 R /TT6 54 0 R >> +/ExtGState << /GS1 60 0 R >> +/ColorSpace << /Cs6 41 0 R >> +>> +endobj +3 0 obj +<< /Length 2292 /Filter /FlateDecode >> +stream +H‰„WÛŽÛ8}÷Wy‰”…’))“l/`&Ø}HjY¶•õ¥Ç’ÓɇÌ~ïž*’íÉô¦˜¥"OÖäë·ƒí ÿ +íqñúŸ”Ø U‰²,„)­X–ÆŠs·Ø,~Z-^¯VSW›…Ê3©…ÄŸ™²Î”ºÈJ-V‡…daJ±j鿧E¢ÓÕ—ÅßW‹Ù ÒVØÚdF‹ÜJ±Ô¥œŒ);™à‘®Ê „¬©2YIume)3)uN¶’»÷wÉ’ò«­t†•Zc%­ãÙf4²DïsòGº,K“|L—:Ë“ËøxEs\‹÷G;‘þºú°PØ©KüÔF¬Þy4ÐtÁ›möOÍ÷AŒ»N ÍKÁHÒ*Mk"<ûÜmûaìÎM[NŠ<²`& eÌ7+’w©ÊʤÑbØõ(ðaìÖ¢?2…kâzµú9éy‹—ͦ;‹§]wOg±I?úÕ«WŽu>³>µíåYÊ“‹)4‘‹&«äòM´»ÓièØìÛÝ_Ó,b dí7{8}Å&Ç“ÛdpñU`nÜ–œ|`7p7’­Yû¬|Måðö“pIõéí/Àú€<ý"$%õ“PRü,>ÿ*ÅÜ‹…Ε°RSòX0V’°hŠBí5³à5u>¯™ÑbÍ'˜û¹‰…*P˜•ró”-2­ƒÌSñEq9š‚'T³Öëª<Æ~±y…/X\:ºd°º`ô êÒñ¶‚Öé¬T?ca¦%g7.´§’‹µ‚òDÅ3Ï}³ùŸ¿uõüóeò».øG›[ÿЗÈ?Ì%h½.öO­#0YDsIpŠ<—ßzNÅžËcÏ´½`&B>ÄÈ|o©WÞ­¨IVè…¬µY> uËv1É:+,z¨Ì* If5„<ãþ.©i·œ60oSoåè9³!m)sˆV©²º +®©¢<$ÁqÚ;ÁÚ™° ¢25†“¥‘Lk.¦©Ø“àN49G,iÆš” +åÌM}M1[ÄÊSD´cŠNd.FŠFF‹*¦XØ™"Æ7‹"¢X˜+ŠEyMÑíà³Ú»Ô›:…,£BBUþ_Oʪ¼IÊÊDI´AW_ç~ ¦Ñü&O³0B0£nÌL%ÆfÔµ™¹ÄâÎ@Î*ªÐ¬ýsu«J:ß²¿¼+XÓ“§}D€à•Èf;+ËyUÐx„<£¾èM4oÊ)™ƒ[5sk¯½ÜD\!D\s¡;aæ”弪 hžk^Ä\óÂêøæçtÑ'#vB•›ßrö È|Ó%9”ü ú{y½ZÁ©bµAGvOÙJà4%ª MÈxñþÍ?a4F‡]±Wã,EmèkQÚ¡àr¾ƒ÷_^Â#ª‚²°¦+=!©Ð´¼¯"ãnÉÌ©] ä+l˺mÕ¼+ºE!7 /Äž–sÓë9Üwé²ÈjTÓ’*t{9wBg!ž¿/”¶¢ÐœG¹•B—’nÿG¾ap—£ûvWà’Alj¹á*Ó–ø²ñO\7èoh ™[Ú!.=äÆïAûÐðÁÄÑá‘Îq…9rW¹ `Áñ¾Ô´/鞣ïzÊËî8Š»÷wqŸ¨û”â©<ªæ‚#ñ&À-^M.º}Ù~NþH—eI­m“.Q‘I¿9ýÖŸoÄeèq¸|ýQ°ËЊÊÚ·¶©M¶Sï$°q×aú#Úes\‹²‰»Dáÿ>¹ëÓ2Ùª\]§t€ÔQs3£Ú µº¢hÅÊQ¼a8Yvæ*˜£ÉF·êÁ[Trò;Þ=p.çòÊIsÏÖ¾gÿ7]Òaˆ†j4dÇà·¶º7è×*ýáqß»ujÑ bƒ™b²è¾AU&m÷èæ€rÕÈ€â‚á.s>¦¡w< +¦$?áig'G©j>Z|¾¿h)᫼^Àƒ“ÆTÂ]ƒˆlÄ‹~ó"ô±§rª5×*ÎáÙå‰zŠ„5vÀa•4ÿÿûQ´§c{!S&9sVž„ãÌä¯G·Ç¡ûýÒù/cß쟋 ª¿”QLT5‚®"Ø®7É®ÃAY&¨ë~©Mñè>PðëäĬy‚øˆ§~ܹ ‚ÂrŸ<œÆ‹È^%žœÜ!­R\øÚ÷þ¸ãI<û±{64®Ìqïºu36Ä°ûJ°d bzUrÙîDàT%´‘Íe¿wm궠êÀVq®Úèt› +å.%Q–"Eá1 +ÿ@•A±£BÜêûôÍ3þGÓp‰..¡ÌU=¸ô5ùJÓ­ßÐקŽoKÑ^ŽýH +ªRüPc` +]øL^})_ºEä~w×¢ÿnŠØ7C°ûÔ">ƒ¾ž»†g¯ÝìLÌ{‘+uÓ²ÜVôÕVªä_®atÃe?FÛPnŠ¶±k¾v‚Ã8ôÛc¿éÛéÞ@Ç$MË OGt¿ïã®w˶×çMΆçO›oÞâLJÍÿ¸ +{ +endstream +endobj +4 0 obj +<< +/Type /Page +/Parent 30 0 R +/Resources 5 0 R +/Contents 6 0 R +/MediaBox [ 0 0 612 792 ] +/CropBox [ 0 0 612 792 ] +/Rotate 0 +>> +endobj +5 0 obj +<< +/ProcSet [ /PDF /Text ] +/Font << /TT2 38 0 R >> +/ExtGState << /GS1 60 0 R >> +/ColorSpace << /Cs6 41 0 R >> +>> +endobj +6 0 obj +<< /Length 1619 /Filter /FlateDecode >> +stream +H‰¤WÛnÛF}×WLŸ²DC†»¼,™·ÔŽÓu›F*úM®,©ð"Ùùö{;3KS”c8…s¼—™Ùsææg] y’º¼^¼x³”pÓ-dZ‡é\ÅКÅzñËjñbµRxtµ^ÈÀóøøc¥H§žT BO+Xm>ï‘NV9ý:,Dା,^¯GƒRŧ‘)b\¥ýɘŒ',© õBˆ£Äó_žq}Ï÷eȦPò5Û;/×kÓšº‡‹·tðI¨Où G½ø˜(öÐx*!•¬ŠTHŠ>ŠWëÈ“âÂñ½X”ëæ*Ï:Ç<% êͪ +ö¦íʦWÑÐçÕ»…ô§G°$uHöüOæ2Ç¢’ÖÞ¿¨$N½T”h/õnè!«HÐ øéÁUþº­¹);+›Ê²êÝuÐoð¬']¶5°K³ôIh¦´/2W¥X÷Æ ÑnKwI0°.Û®'EÖg€VÄñÓØ+UÕÊúh›¯d²oZS@ßØÅŒ×6%Ýì­'x[EšÜñ“ !wŽdŠ˜‚^æh/DmƉÑZko> _àe<£þ”8wܵŒ‘—¦ƒkÓŒ©ñGVa FŒi±w\¢`$÷å¬FäŠ~rBYNXP'9ÀK2ˆëáƉðP”]Þ`þ³ Ä\:¢=- +ò#FÐi«~FlG†ÎÌIÕL*§Üd.&s"¡Ý4iÑáÛ3Ø;)qO m™]WL-ZhÆ58Ï£Ϯ¬°m†Ú® µäá°CæùŽ¼©­Ø6|¦úŽh­w]ySgG +&Ðë-²«ÅÎj¾{CU=Óçëûäx¬)eÔS©"Ä•ïEGÚõD{:ÑG„Z‹¡*8I(?j$WU¤9D G!0°n›-ì3bLn»?Ïkz-9S¤Ñ̤ě{ÊÄ=cà“µtv S²ö!\cZéêg–!mMgØo¦m(å]ª:w¸~cE*)eCëAS³— î[˜m*½› F@ˆŸ¶©àgzæìéˆÐ+$¶"¼ÃM©#Ú³øNâ[ãÛ:ÁK –2«Æ²@K Ï bÞðŸh}ÆâºÂ½?§¤‡ÄzrCNµ:O–%â{BK€  E&*"îéˆ':®*ö<U£ëÍÐSYnÇ°rÜ•uOc(&¶qMÐ…'ÐÅâ/4CžrÕ6e¿1œd?4ü'4-ì#+6e¾±"^Ùd{|ìÆ[UÍnÔAû­•ñY?=†mˆUåØ™~ÞtÆl;Ø6 ÕMÂýë7MÑؘ½eKØø¿bˆ–À]?TS×›þ߀$gK°}yö;^x‡Ò„ãñ„KøøÙ‡‚´xa‚Šp:ˆ!À¹ M@ÅüAuËÅŸ ¦Vñã9#´ž)¬þñ#cÆ,ðÑ.£²¼«-Q˜ãåí(Uß=Ú®TŠu8‡˜ÓcÖ¯p–Âp°ÑÐa°:_q—Ú·¦¸[!Î_*¿ïžì0YÅx»kjC>LÛ3³Ç ?AÔ}g è¸+µ—êˆÊ‰L£ãµiÀRãÃË:'ŠCQ!í‰ +ý¡Ç-LŒÄ–\Ù"å®2·Æ:írG ýaxT/§ù-ž·mº´°:[Á5ÊbÖ÷Â`æc<›ƶ‰WË·gOd¦B®Éˆ<¢ijô¤>´t¨¯`[æØâb” +:‰Êä½CùÛ65 +,‰È¹ÚùžC•D&|þlç®kyJÝãÃ’ãà®nvÎuçv@ â +gv"ØîÊÊ<>É4™Gé÷%¨Ÿ*&‡1@8yr¤f³n¸öQI¿ ¢-Åû7¯xƒ'0•TNÕi„»óØßÚyÓÅfM—V¨û†¿\ú$·7¸ß/d;ÞÆ íàý˜r9m%è;Îjðaõ/‚MÏ®DŸêt”Ï›>£džJç¬Hù êÝYvŽ#3a–Ž˜•ßìÜ\Ø™x>·ðªºŸª3x}›gUy=àê‡Ëçô¨uk¾¦æù(tËêÁýË_¿=R?ÓûZöÿªgª=üGàÑâùßšž_) +endstream +endobj +7 0 obj +<< +/Type /Page +/Parent 30 0 R +/Resources 8 0 R +/Contents 9 0 R +/MediaBox [ 0 0 612 792 ] +/CropBox [ 0 0 612 792 ] +/Rotate 0 +>> +endobj +8 0 obj +<< +/ProcSet [ /PDF /Text ] +/Font << /TT2 38 0 R /TT4 40 0 R >> +/ExtGState << /GS1 60 0 R >> +/ColorSpace << /Cs6 41 0 R >> +>> +endobj +9 0 obj +<< /Length 3940 /Filter /FlateDecode >> +stream +H‰¬WÛnÛH}×Wô#¹Û}¿<&ÎÌbl€̃YrÈVRäCf¿wOu7IIú"ÛÕgAÈS-àBCºò«&7Õ›é×ìÝr3ÿÁ—µåª +µä¦b_ïë³÷° «À¹¬ã°F)ÀxÆ‘É|¼©‚øOÝxo«)PbµÝ–·l¾Xlw·ë‡;vزŒ +gXÖà-›½;6/a¹äÛd×vÅ‚`_Ö‡=ÛlB^ô±¢Oi¿”½WëÕ–v4Žn[6¶ÓÕYkx¨5Î_Í÷Ëo†­æûÃr` ŠÌG¦¦¯}k©´'8ªZ׊Î}Ïö›í÷)ºûJoû³VQ`´þ”±7±@ÿ¯n¬—ÜVèêžì«5‡ÚáÿË;|ž?°õ6_ÙIi¸Äµ\‡A¤8®Nae‰Û+ +óë)ËÁ2½þ€ã¾ÇÛD„pì;Ìeÿa7»îšeHfLà1$Dà˜Â€SøÅ[ÍŽ“!Zr˜C>à%G5R[®³ÿM;ðOC²²Ao þ‹u$ŠÝOŒÒܨv½â?{+,—f…䈲¥¬ÏQd$ £@ŽZУäõ9ŠVÜ>±;:PYŸƒK8Œb™Ú£äõ9ŠtÿÃ(Û#´<ÇðŠ>Œ9,íAòú%8z £@ŽÏ“×g(Nrø +Éu’—çˆHûÈ%—ˆíAòºE- b„éjl:ÙØñï@¤xîµQO¥È¨‘ÃÅFÓ‡‹ c;û8E–Â2’ë@±S%dÀýèQ®®‚4§FéÒÛFLwî^SAA‰Ù)jɶ/cþH=‘ (ä,°tË,$²\hÛij¿û‰Ø¶“ª´&b«5 »õ°¼ÄN'³NÞÍX§3W/o§§Óiª—·ƒÑé ÔËÛ‘çtêåe˜9™mzi;¦œŽ-½¼@N’NÞŽ'“F/=óm74œú²Ÿb{ß9µ˜K¾GÚ™#qY¶R*¯GÒ²,ÒNWŸëžNÞÎ&W³F6[MŒÎª‹D̈ +ƒMÒá`“e³DHKùo@iˆÎl1¡7ãìûä¦zS7 ¨šÖÚT\³ßk Äj]c¿®Vu£=—Õ¶n”“ݖ—eÝDQmæ5>VÕVÃ{ªº)ÛÊ®}Úõ±þ8{OV«luCÙ…0j8¢öf’YdQ%êÙ26Hd™¢„W´ƒÌ—¨1ØwS ž¬¶•MÐýfcUWÉS$K…ëIŽBR#lRCHesFÒ#ô’5:öHf’e“%$ƒ2‹»hPe0éRÀ]£—Å&]Û($îXԘªÐ/Ëå–$pâ©*BR‚g ÁmÔÁSàý^Kƒi ™ªZmkCS±M^#À EàÃ]þÿás‘ßÔà¶úŽ“ ÏCU¾Û!ôþ›—9溴hºLѤG¥Je”#)3|l3Ãß!ˆQ)` ½FBVóì&©ñáZWû¬æ·Ybïyì3ˆj‰Z„ LÑàëÑ]o¢†«$/²BSÞ*Ç$M|k:’ýfE}sñx5!ó™à ¯nˆv%— +5T6 Ú9J'f *7'uƒî,Ä.?oàa›/È ùÃ3èÔªšçÕOxVûMísÕÀâP[‚r¨q>}Õ"佟éw? rïasqë£þxܨœ +½s† öØÃ> ä¹wÎgÛž†½tŸÖ#ˆ‚bà*‡wš[5ÖþÅ<¢ìøfh5mþéàÑ>Ýr0KùLÃݨp9¶ÜDϵÌŸaÓ‘ÆN‰çZoÆY>Î]°5‡øþ“í×èáÏ4ÞŽ3ÞcH8þ:ŠMpO?€²TlK)ïºß-zˆÌç·™—ź)Õ§Iœe]ÓðTݼ… SÒ…ƒx –ê‘$×]K¢JœÎQ'Ãs2TkæxÅ9Ò|"¦&©BRöUŸE8ß——哃¬f.”6(óôã¡á‡ÞÓGïîJ êµ°‰GtG#“Q—fKíTbœ1Ø£`Ê ’üÅp,ÌY’vâd’¦?Px•Æmžré‘€þ‘žß±ahV›Ü:.[V$DLä÷ÍüÍn9‡ÿÁ¿Þ5“ÝÛ’Z…Êcî":V¯ +«ÿ§n¼· õ’\¶;,oÙ|±Øîn×wì°eɶYŠmKu–K&Ý.7à=Û ‚}}Xöl³–HŽ'¤ìIüj +>Gü´ÓÑmªSpd+xRµ¨SµÙ/¿Y¶¿Ÿo6Ëý%¤ÌåzK/~d®Ö÷ìïõÝ>ë¿èõÚV¯ô'ŠMõ¡FWÛîq¿<‹þþºZ-w5šiuÙW¢;D:Eµ[Þ­÷‡ånÏÖ Üß~¹gs<É 'ôPƒ´"]èût–⮑Þr]"ÅeÚ…™R¡ iR0í*y¹¤jäå%êhº n×H•æÓ^6HO|ˆæKmˆ–õ¦“‡”½<¯{yŒ”½<¯;¹BÆê£ï˺—#ÑŽ>ÏË^ +¦ˆG/Îë^ž¨B/NË^ê<9«çõæÌ9½<¯7…}T‹¶6JéÁÒ8½þ€ký‚¦2Ôé’hªÅ€àèòdätB +ŒRµ…äQ%§ ÿ>pe)Á2i8©F ®¢ïŠï3± +ÊTŒ„mQ¨Ð·2¶2œæ¿—‚{Ôh }½RQpU©í(ð!`ø{ì´²ñ‚5¨™RýŸõ2éÛ¢ðÝ¿bŽd2ì•ÝÇ$H€œ5@‚a± °" V’¿Ÿ¯z!‡£YH)[ìê©®~]Ë{Œ€h(`ňïrŒ¸™ÙIµx?æx¥´Õ*U&¯“jXbáp)AS+†ÁZ@îµZÆEßÖ1µ%îQ–bŽ›$×Ö¼ÛwàúßZ’-Ö¬†vúÅzç'‰½K`ÈPýroßåÖÆÞ¨‚EàBÙ¯T¼ +ïr"“Àg \g ¬ÙX‚'œ+y2¸‹‹ž=ÕˆgòØØ q° +‹Îá9v0`¢„ +©÷(Ìj]ãx¥™– xf–{k†\qî ~ å„Ë(å‚/¸¸¸ªh®¸ Ì(ÈæãX³~àõÊ^ràLxõ°èë†ÞqàËã+†Ã{;¯6ÜûЙþ¢¤$|ï\Å0ê”ë0<¡Ö–W‡B&f"×U%\×nm†];ÁÛ;€H]ûšR×ÿÏ n°½w©sP‚Ñ—;D%dgk¦M¢o‰RèÍz©*½Iî0®oMWO@j1Â%áL•#aÇÛKý䩨•À¤ üc(—€ü­§#T"ßGD±’^ø@¡¡º×º~Ÿ·W’½$ݳ½’ì%éží•d/I÷dŸHö’tÏöB²œ{¶V’½$ݳ½ìçž­•d/I÷l?Ân"ÙK¬f1cWì#ø¶ÞÃÃìõ»Ø-=ƒb˜ìÓwµ×óªýèü›?î?|¿ß³´Û£—úH6J’ÁSœ¦¸FÕC¡²(J¶$ºW:´ŒÈ3°ãO[eæí蚛ָæ×–›Ÿda×*‡pý¥§šÇÖ1Žš‡–fšçÖ±ã“dmîïv·Ùð·žôǤI S×0½"üç„£Q³¢Aäž9JÑ«Iª¢I;¸s”‡¡Ü†¤h%æ!ȶFs·´kÿ݇ÆÖÍ£6²·ñ‡‹ÕCê*¾œQNlš"ÅvÛ¨–;6CÚ#áþt2ë…¹7YíåûÉLàÓj˜VicÎÒe¤QzZ¿ +½Ó$&·¾mŒiƒC +i 26w˜ +à%/@9"ehB‘~"Ž@Ï gêã“séñy_¥ñôØj^÷™×ÆÛî«|Ý·ôÓæÏ?òêË—b½ý—wGÜè¦ì',S¯ùœ??ÊSwÓëyïw- WzJ‘0ÙÒÓóW¬ùȨè=^Ñ79·:ªÀ‘\cÐ7O‡Œjt;”³~ÞÓUÑ4¢GŽ¡d¸%¿€nŒ#mô!ÛéfŒ¸ f½Ã¨Ò,ºÙ""§Î­ئÎÍM šgä ®2K„\µgËÁ‚Ÿ‘¦†I×íœùCFè.'ŽÀ>¤òûô­í¨OÕ|m…ÊȻȆÞIóùÒBsÿyÚöå±%åÜEž„ +ÅCmh‘­ŒkmGbÚ)éí\*ßéá2PÇÀ µpLæÇ7—óhðÊa Å¥»Ÿ½Ôí÷*t©3ŽC¯oz>v$×`óKž +ú÷ôÝ·”Ô®¹ÿ§¬Ø»õqŸ‹Y%±9f=Êlܱ_ð±ŽztA7nZAÍü›€^ö±Ìy8‚Ïû7>•Ü¶[öˆ¸;ü÷tè°YmÞ:'‡ó˜?æ.ô´àúáD¤Š2ô›#…Cg½g”qò)Û'ä™.µµÜoM•‰â¿¾ DÕê7Ü$Àž¯\äyBÜ c¢W,©ˆ]'^êœSIÝñ•qõßvDŒÄ V-Q³G†$l’ùh\ }ú¯ôïÿî²žÍ +endstream +endobj +10 0 obj +<< +/Type /Page +/Parent 30 0 R +/Resources 11 0 R +/Contents 12 0 R +/MediaBox [ 0 0 612 792 ] +/CropBox [ 0 0 612 792 ] +/Rotate 0 +>> +endobj +11 0 obj +<< +/ProcSet [ /PDF /Text ] +/Font << /TT2 38 0 R /TT4 40 0 R >> +/ExtGState << /GS1 60 0 R >> +/ColorSpace << /Cs6 41 0 R >> +>> +endobj +12 0 obj +<< /Length 2552 /Filter /FlateDecode >> +stream +H‰´WÛn[¹}×Wð‘g€sÂûåÑ“iR šA + èƒaª,9Èb9“¤ÿÑÿíÚ¼œ‹,+ÎŒ –(’{s_¸¸Ö«×Ç–&Óßa¹›½z{)Ùía&óÞ0ëk½uì~5[Ï~žÏ^Íç +Kçë™ÔPLà/³>vR1e:¯Øün&ÒÙl¾¤_fÜ6óßg›Ï‡R9æ¢í¬bÚ Ö*/zgÒõ.Ò7ådgs6t"9õÒŠN“/ú¦’Ã7ïß^°_VÛÅ7ò,‹5„`]ÇJÁÙÉ»eÝ­4í¾âÿmZï-¿ldùþþauÃËåþþf³»e{Ö\ÏIÄmY‹hÙü—bËô¶\:É +‚í×,öy·y8°íFèX‚6+ÚJë¥òµÞ¬÷´¢í}¨ÁCZá&§]6˜—|qX±onoW÷ìáãbÇî>ÅñOžø)·“Jiá;´„Ó¡ H s4°<•ìµÓëK–‹rùú7˜ûß~gpàØ&{Ç®®»Ý +K&]`•É"ì’½@ö.q,o5ÿOçP–69)¨'$ºÏ I¥’ùŸê+Bçú5‚ú þÅvãˆénft¤pÊx çÿ™QÎtÆ Ä‘•4<6bð£9gÄDÊÒ`%͸ع³f°ÀÍäñ±™)Ð3f° ŒÍäñ‘'""}ÚJ)Ro¥Œ«Ñ¡]êjmclú¾Ä½î,]ýÑj'‰v’©Œ´è§™¶SQ³ÖDx(µÉM}gµÏmô£ž,=ò„¥&O*v6xôr§}huQ§°þé…<9ä(FxÒª‹HZñdD§l|IO×ÏàÒÀSèôÈj÷|O!°ñÿÓ1)ÝYt€KR¡¯ŒÅÅ/á!]ÊÖxÕiœ¿øcp1ô>ê¾GàQÆ&‚¾-Ʀs®ŽŸœïÁ} +öÃ|Aí ˆ³Ž§ð<ÌWœâî0_t +¨ýüqt=4N£é¡s]™÷Ä]NDït§Ýh¾ŽË¼`QÃtÖÙê­Ny¿,,ÐdhÀJ'€DÀ–ö@`0«P˜Õˆ">0° â/VŽõ¦‘áïmÁ²Þ6øEaˆ³w +Hšâ‹¯¬‘–ß4¸_ž¯Á·Eçò¾~kÜÈÙUƒ­Žïò¢»Nlg଺s^„t Ê™6L+YcMgí)ÈÄ °e|â\™»âäVã"¿S,ùÇN.Ó®ùOøfë~§´_=6©l]¯Ó¤ë¼6@ID$.8ÖD ´HÖ¯¸ÖMLŠÓ¶<à\[‡J¤¥.Ž2Ñ3pU9žBە짯9û¸ÿžoƒÇ†¯÷l Ó0¸jÚ”ÄÝíÃGdÞ!ÓWM›>¿4m¤‚íï›Ö1¾Éyî“ÚöyÖÒs²xÉlJ0<«áä|ˆ{r¯áœæŸàyæ]ƒ×ÕRY[¼¾‘¿£Užÿ=ç?M‹“^ª<᪆¢&Aë£X*Q¦&DšÆ]´Ú 4íéŸq™/üøË: UHëÁTQ·À3Vúç&2êqKÒV¨k}‡Ñ#c”é»ô +÷o‹@€oiø­i]¡åçÍ]8—ý!Re|(ëW5‘?þ:žÈ€#Ò[õD +žÖey÷üŸuòé;uêÌЃÔ0õÌfDΞYû*{;AøîëMƒPZ!6ð*y‘üö!ÿº,—j‘‡‡UžþÃÔˆ¾£‘>AÔÜ‘«@FS^TNÊKÒ£‚%ݘÁ^1 +kxy•K…%ׇLj¸rÉb[L®)8,µ>þò7å,§Æý!œ;îV!b¯RUÖ7ïß^°‹ûÕ‚OSˆÉ’;py˜Éµ?¹JODîeCȳ¿€¦],—ûû›Íî–=ìO ÜlËô¶øñ›Õvñí×,öy·y8°íF2LSóÜRÃz³Þ§— ÷Ñ/ªw0:+¡è²ô†Vìp·ØnW÷ìáãbwú¬üîóWUýLpšª¥"Ùå ¨-vFE„"UH$þD«Tø4yFXäU.5ºsü?Ù¦—%sÄ4-­ðªlùS] }R{iA˜Š¾aÍÜÁQ{•q/˪hië3X ÌÈL™Q`áúœZ`FfÊøØŒŽçƒ¢ã ÊøØŒ“烢ã ÊøØ jp>¨\¤ÁLoµ«@¯*Jïž~¿._ÿ6+lxF‚@À¹&4ôxE%¸œO’àÏf \ü˜›, ÆnðÄ«Ôa +ݪ"C¢gÇ‘²ù >,àÄÒåXšÁ<)ýb>"ˆ/¤ž[∂Í=×ÉI½9I‰‹HÉB-´)(Mí_Ì…#€øk¹úž‹†vx-+8Êä\ĈçÖüXjŽ#À¤uÌ¥ƒ-ŽŸ[‡sÆ!]iXô̪ڮÛÏÍÏóDYzÊ ®…s¥À¯}*,¸!@EKˆ¡„Z/B?=_Az +ÚÃ|Eß)÷ó=¬Nav˜¯x9ÅÏa¾á‡ù£øz„›Æ3¼C|yÞDzOÄïæ˸Î=4Ú_Çý|ñ×Ïù¿,üÞT~%.n¦ŒA ÄÚ'T× +3&+M±¾Pž7ïÁsI½Md1ò ˆ3BÁE¥A‰I 1CDYÒouÚÍfí +ÿþmz]ö_WÕXÄnôª÷Œ”•2" ÇûˆB|D@F€¯BeWÆgÒkEö˜)¦,z‹½ÊôæŠK1Y"È’"U“&íãÉâ披Ç;³êÄÎÞ¬žîôh1£¦¡/ŽÖ€^J1h +®+*Æa÷P]dX“àERª%!«Ž-2–h4É$Iò` +=˜€~µ!ÓòôQ˜îÿê b^ +endstream +endobj +13 0 obj +<< +/Type /Page +/Parent 30 0 R +/Resources 14 0 R +/Contents 15 0 R +/MediaBox [ 0 0 612 792 ] +/CropBox [ 0 0 612 792 ] +/Rotate 0 +>> +endobj +14 0 obj +<< +/ProcSet [ /PDF /Text /ImageB ] +/Font << /TT2 38 0 R /TT4 40 0 R /TT6 54 0 R /TT8 22 0 R /TT10 23 0 R >> +/XObject << /Im1 16 0 R >> +/ExtGState << /GS1 60 0 R >> +/ColorSpace << /Cs6 41 0 R >> +>> +endobj +15 0 obj +<< /Length 4383 /Filter /FlateDecode >> +stream +H‰´WYOÇ~Ÿ_QUHÝÔ¾<:&¹r¤)b¤û€,4‚ÁÆ[[þ÷ùN-½ Ó¤ +2H3]sªÏúíôí£gWLåÿÇ«Ï›Óÿœ+öáq£" Á2<ë‚óìa¿¹Ùü²Ýœn·W·7ez©™Äyr!õJ3mû Ùö~#3xJ¶½¢oîÅöÓæ×íf¨´g>¹Þif¼dr¦ü "?i¯z‰ë.ö2J5—ÒÉ^J¥²,ñö/'º'ÀÚ`‰w%ëÊt­ ,Š}jï:O1-DÈ‹‘M?s8½ƒ8K(2Äâbc§RÑ&„‰87è7’8¼îÜø¾ì= +õÊǬ>¬‹ƒqnE‚!Ý«"jÔ]kY¢éIRy‰0‘tªÁS’yƒGô„©ÔazB–S¡Y]§Õ(Ù<šÓê tT½+c=.RkÆÌh¤ÖŒ™%ЄšæÔ4£¶Œ™gÐ@2fžA#½eÌ<ƒFúÙCÆÌ vbw>* +ÑS·DS ÒÈí\ȵl •C%4)6—z^Û‚-m1Õ.äì£G‹*3@JcÔG«¶¶TµéQ™@eû‚¿]è-?ÔOø;ø[Ñ8‰³J}À<Ï÷ø²ùNVœ‰N!™ù‰Ð¦×œ t¦D—êŠßá–³ïì«.Oí…ö}!:cøßøTr_jÍuæ^¹~®ÔÇ*ú½x¿ýÜ‹`²v.›Iäg{—½h‹ †¦(©1!‹å+ª”Ž‰mÏ(Š®]p 0pIY¼…ŸÔä>×… +fÛ“ +7ÃIâ’~èŽý:¼êf¯úÙ) §„XY…Œ†×Ta˜zxW%5\•Õ4Í€Qv‡¡ŽÜÜ‘R"Tä"l¼WæTŸ\ÅÁo ¿(8‘ß|]2œÝ•#BªS†’b? †ÿõQÄø‹o‚¨å¡ +¿†Žb +ÆÿordÕ0XÕÊCwu¿9}w¯ØÙ—ÍŸ"E…dF ËtªmÉ–>½žÏ0h+idrè7‘Zñê`¯­,‰.©råiÍ=ÛõZÇÔVM +OοI•žÍq@¥”-amµ-o>™ãzi¤p{ÁwÂHxx¿»¦µ;çûdB…™‡ÊÐy”ó!Ì#iÙ«5´#“r˜àLÆ3š\R1?^Ý/,BÀwȨ¼$šBç1¥&(¾Ä +IÄý ûVÇTM¤ÊØÑ5Û«Tj†Õ†mùËØbIˆ’ô…ùôjá‹„FF¿‚/mjbýCÛp¶éQÒ*ÆG}`Zpö”*O$m´/f‰Skr«Æriuå‰QU¯³ÿ¨í˜x`eç¬dšžØ§¢^¥¨*},»vn?¦9o |4œ_åÓE¾ð¼S,J¯íµ}cÑDƒšÐÆŸh\^ÏøÀ 5*¼Ö °áɳ +* puT)^ÈSKRRÀG„­ÁyìÝ:¼Œ4ƒ²¥Š¬&Ìzdƒê +zókøRSDcA.̻ڳKŒ±wôY_lT!øª¯¥y[­ã;)¹®@EP/†Â3ŒcDùÎ)!ÑŸraˆq«»ÌZ#¯¢¤ò@M2jRØ>¬_3åÀ˜b}²n°>®Ô°²I@Þ~)öG»ìFƒO@dekQ¨Y6­ +ó‘•b´iïüõÅÚÕ¨–;æãàc‰·”G¼eÒ¯g¯ ŸŽ|08»*Z·ì§Àd‰l]ŒDR⢦A¤ÙÊþ,ï„ž(¬ƒjp…$P^Ï^k¸8P6`1®±G×øÎlm¨õ·1³)T;œ—émŸç#½MÚóÉ{¤·!z>Tô6ÏÆå µŽ¾óQx¤·±v>æŽô뇉uní8âÖWº§êˆw’¤j¤·s¥k‹w+}87z“×èòÏiw<Ýn-¥íÍËŽ +e‹4=ª†ÃX˜h@§D«ìt‘ìò&h“Ä“SØ)¿a§|s.:TÍßáõž¿’3Ñ¡jþæè¹|o |'ºp‹ˆÎ 9;hw•C»ó]tØ£|SÈ(—–Ê!¨h¿V×ùàüEû!Uyå@ÚHŒpÈ@8‘ðfŽKÙXL%íryö´¨è§e£æŒ,îÚU Q ù«žw×í Œƒ‡:Gº¬¤Çz®W¾äÃÕí{}xó#¸Ü–Û7 +·«ßt¡ƒ1b-9kÙEØE(ý( Ò`)É™²† +Þƒ¨Å2Ÿv"ë]¾êw" ”ï—å·Çå|K´*Ç« \Ü#]Y—^`$òl|­eWõüXcº/ǯ¶ñYmå’…èsaóÏX(©OþDýˆ.­yƒ}ԃ훮cÏÙç–ŽŸÂ5ö-®n£…X•ä 0ê0Z…Ÿi [e`À;ý’AÄî•—¼(Ú6Ї$(™²ÈT**ü!é÷öÌì…¢" N°¸œåìÎíÌ™ n÷ºI÷£iûýœ•Ì×àOögRZùKƒºÆc +¬2hQÂ9:4”ªÈ#ë)ÆÈT0 h`;0+(pr460!þe²Â;„µŠ°’6`›¤ÿ¬épòpüÆ +/j5M¡¡Ÿš ó_ì0ÂVŠõb†bÿés’W4¡Y¬™°¦ 诨ITÖ'T@¾«— +gáqÛ¼ÜUढO* ¹)G +a=QâYŸRy³«Â¯'*45ã nôŽ¿žh Œ>¡Á‡rÔà×QÔ5Ú§9j@Ê0¬£Ëó?ðÖ UPHƸ˜™ÓÈÎ +…$© 0½"ëTã“ìGOð•O°p +óo‡*7ª˜ +++*õ)úAã%š×ŒÓÓ5Q?f´¦ùX`Ic +üT(D¦* ª™ÐÑ™ÇpÊ“‡0‚àqfKøÒè!«mÀIý¨:k)ú<Ц**¸sF­Ë_q€UŽ@I$5U’¿¿ÅŒ‰Áöqú÷9X¼ºsÀ—Æ'"|¤Sk*5Š*zUÍiIšáU=ñÒóªñ›9øÅiü&Q—cÂìv¼’ë{…µ"ŒëãòÒSÐå'€81³ƒÎ-"Z•‘ÖK“Z$_èŒG4Ç·ÊÄs¿×ÈÉIüÈV,| ”˜Jœ^RÊðö>¬Úö!‘ÞDk­A«$À@Ö“‚Lúµö”ä”@ ÄÈQŸ$®=áxJ·fºQS·¦® +¾_PÞ!#e=™ N¤7ȶ V&ëïË7$±ôΤ¦ †˜NCƒQšŠ–þÅ]ÞÀ4ƉHš†~¾VcÂŒ”¬Vvo:`«m\aÈÔGô¨k鮵e"òcw­kê¸lò5MM1ëîÃïz¶ÂtJ¥©‰Õ•Œ´\ŠODa5¤ˆ:C +~ÆÕ4_ê’+ƒTr‡`³ rAö¢€)§ñçŸ'èÆF7…*¿OÄ0´fçë~¾ú2,×=Á™âá–uð“rt”¹Rª4ïÚ„ +¦¾å³ÝDg—¹ÁÿÛåb‹{Ý,‡m·w_æ·b¸kW+,ÚþZ,Z~¿½m{áá}ß1Êz|IÃÅ›‹?¹7Œ{.u€Îp%ÿ•Ù»ÓßiÓµƒ¸^wƒè×[1ÇÙ7¿Ú×åöVÌ××ËþæØuøˆ±r³aû°êØaÁãˆ? ¸JW±mÓUtt”öwúW ß«\Sâ­Ú±à \¥]ö¸E?ï6=ßâH,dSØXÈêH,šììòÍ9ûûâíë38ý~½×ËÅ¢ÛtýVCО +ŠZ–öGøTIg(»cµ>㥱¿•©¿ÑÕS íèºy;t÷–|· ¡\Z̢/Eø.º£w¿›€ëòîŸ9( u=”°‚Ó»=bBÝR:ŸJe®ˆÿ¦gHj.;Wó$Ä[!ŽšÁ[UŠ¾b3–=|¿A¦Ò@ê‘Š,"~˜¾á”A/¿o7Ëöãª{Úm7EQ¯TeÑíCè¼»¿…+Úd +¥vº#¥÷| ]’Ü6tb躻A|ì†íÔȦhªzÇJU*Öð>ûÜmnÛÏà ñy³þˆ»Ó¥ß礇QŸ@¬‰v›ŠˆÀAPüªí‹ +endstream +endobj +16 0 obj +<< /Type /XObject /Subtype /Image /Width 10 /Height 56 /BitsPerComponent 1 +/ImageMask true /Length 59 /Filter /CCITTFaxDecode /DecodeParms << /K -1 /Columns 10 >> >> +stream +›°÷¢ÎUÁÿQrñœ@‚¯ŽÔeËà ŽÔ|¿ü|å\õœ@‚¯ŽÔfÖÆ{…„†<` +endstream +endobj +17 0 obj +<< +/Type /Page +/Parent 30 0 R +/Resources 18 0 R +/Contents 19 0 R +/MediaBox [ 0 0 612 792 ] +/CropBox [ 0 0 612 792 ] +/Rotate 0 +>> +endobj +18 0 obj +<< +/ProcSet [ /PDF /Text /ImageC ] +/Font << /TT2 38 0 R >> +/XObject << /Im2 20 0 R /Im3 21 0 R >> +/ExtGState << /GS1 60 0 R >> +/ColorSpace << /Cs6 41 0 R >> +>> +endobj +19 0 obj +<< /Length 314 /Filter /FlateDecode >> +stream +H‰¤‘=O1 †÷ü +0ÔgçÃIÆr@U$è"1 ¦ƒ"*7ôïã\KK Yr,%öûúIÓý<Æп˜fÖ1< +†Äè!DI ïfaNŠiJ±ú´, ;$ ¤±©BÌȬÇh¡¬ wu&AékZ›£x\–欘½ [Ƀ'i'Ʋ“+›"ÚR">T™‘¯ZGÓnÞn•ÞŒ ³ÓEÆAÁ£÷ÀVÍ&ð¢M ú•iæ+ §¯æFžaôåíÎ×ÖÖ-(¢ +­í`#ݵWÚp¡Õ¸š\\ÂÝ=ÁC‚^uô §Æs+ã¡ã:Õ;DáDPþBÂ#뻺†|£½Çp~=›~Á Èš¶³èÏêwrFñÊsÃÁýà?=ýBŽÈþw »¡†A +endstream +endobj +20 0 obj +<< /Type /XObject /Subtype /Image /Width 736 /Height 322 /BitsPerComponent 8 +/ColorSpace 41 0 R /Length 71678 /Filter /FlateDecode >> +stream +H‰ìÖyP“gÀñî´»î¶kíÖ£î¶kW­WµÖ»^ˆ*à} ž¢‚ŠU¹ï3@¸!Ü—@„#@Ž@n’jë-¢œW{Ìîîï}ƒáy^4;ëÔîøÏdÞgxß'Ûðò{ù’èÅóg=O:ÕOûßzë­·ôÏþÞ'Yém +i_÷CÐßÓ9š¾žÎÞ'þk=T÷õðøÍÒMuO]oœ'Tw©GoœÇTwôÐùÆ颺ýK=|ý:oà +¿w÷f||ƒÁ`±XHäxò’xΨû_<üñ‡g?ý¿øñµzñº +þFýð?ñü7Dý«{ñ«‚Ïëî[ÎNç„‚Ú6…H*jTµŠq"å«c¥\(j®5óÉWRËXÄãh&¤’è¡#ÂHõÓ„“éG€‘`äzh¦’kÕO F†QŒC8*9F9ÑXZ1ª±ˆ©£j‡£Ö®)F…éÐ Ó†¹®9q‰J78áF»|´Ÿ‚í­×ÛÇÞA;|CÙ¡’¸¸\tss‹¥ÓéѯšOÔ}}Ý7Ú$ìN^a%³ˆ‡*(âå/¹…e¤ò!¬ræ¨8Ì"NáŠ9¬â +ŠØ¨JLIe1UÕ°Ò*6wX·D‡jB9¡”‚£Åe¨P®UIÅ!Ôªt«ÐàÖ¡*QÕZ|*U¯Áըѡº¦aHíHÕu¼1ðkøMºÕj ª†!uÚ‡5ø:´šZêG#š‡46‹thÒ4DLR ´D’‘šµÄÒ‘Z´$2”PCŠ’‘–L±¬uˆ\É…¤• –JÒªcœ U(ÇßA¡ìèPÔ×p¬­­…M¼œì Ë)S¦"¦L›úÉŒIÓ>&—sæÎuuus÷ðpss×pw÷@yxx¢<=½P^^Þ(oo-_ +__?”Ÿ¿¿–@* 0„Œ‚† + £¡h´p­ððTDD$*2’Ž¢Ó£PQQѨè˜TLl,*6.N+~D H‰xII ƒ‘ŒJNNA¥¤¤¢RSÓPiié¨ôô ­ŒŒLTfV*+;•“ƒÊÅ»†—‡—Ÿ_ UPÀD1™………,-«UTTŒ*.f£ØìTIi©ViYEYy9ŠƒTW‰WUÅEq¹Õ¨êjŠÇ«AÕÔÔ¢jkë´êêø|~½$‘H•J•RÕF¥TIe2xëV…²­½££ã:J¥jkko‡_ 6”Éå:.' …"¸ 2)Œ‹-ö&&&Vd+^¥OÔ=7;dV6a ן]jhZl`»`ƒÝÍÒÈi¹™×rSåfž`…¹çŠ-^+ÁVïUŸoÀ6’…Ïj ßÕ–¾k,ýÖXù­%ø¯Û;Öƒ; +vnØ wî6ÜCظ„lÚG0Új´?Ì4ãƒ4pˆ¶™n +G˜# ÒÌ:ÒÜšnnCßBÚ +ŽFmÇ¢ Çc,±–'V'I§âÀvÛx°Ø%ìö‰`—étâîÓI`ÏiÆGÆ^Çä½g’÷³)„s)û ©ûRç´ƒÎi‡Î§.d€Ã¤#A¦µK¦õ¥,ð-È&å½L8v%ç8¸š{¸^Ó8éšwÒ-ïpÏ;å‘o <óí< HL{/PèàM8íCpôa|‹ýgü‹ÁÙ68§Èv +,q +*q*u.=\v>„p!¤üB()¬übç"ãB«p ¯¸D¨üDTË‘$zÕ:÷J÷jT5pæb@[,Á=®Æ#®x‚ø:ÏÀ÷Lä{¤zo’`4ø‚dÐè›Òè—ÒäŸ + ¤ Az3!£%(“œ)!Y"šMÊâ0+¡kÒp'ù@"óå‘r:`¶FB¥ˆ&Å°”1EÊØ"Ul±*ŽÝF(íñ¤„Òö„²ŽDP~= pÀ +À7“AåÍPõ]*à‚ïA÷VZõ­ôêÛé¼Û æv&¨½Cº›UGÈæß9õ÷AnƒÆƒÜÆ×@ÓÃ< èÌÍ +´Z1[º˜Â®BáãBÑcáIw$ÝÅ@ÚÍ–ö°e=%²^¦¸‡)îÕ‰­P³[Õ£À’õsÚžÁ&£î é-U–(Eíwu6660Ÿ0 ®¿Céƒ ›ÿðÎïÈÉ'ÂÃÄ«yƒœ2ÈñB“/žž¿®`¾ _`²ÀBg íz”+ †Ž‰GGŠÂ‹Æ‹Á‹Å‹Ãcä LI#b %ã¥à¥â¥á¥ãeàeâe!eãåàé9`à6~Œœ@(CÈ8HI) +¦:~ÀüAÿ²Q0…hUáqñªñxx5xµxux|¤ú5 Á²«ëÑ@__/ÅÀ@_SS|²jõÓçÿ|öïýŒz6¨¾ïüµÁÛõCp~ŸúéymÏÓ¡c¸IðMoSµªä-¶¶§àK{ +‚=¯ÒÌ'?ÿô\=ÐýÝuùB#ŸwÞEyºLžú¾ù{¯ütÂlçwgؽ÷¹=˜0Ëá÷3þô…ãûsÎ~æžû3˜wnâ<§‰ó>œïüáçI ÎOúòüG`á…¿€E?_¹L^ìòÑ"b9eɥɋ/MùúÒ´¥—Á'Ë®€éËÁÕ¿®$üm•ëô•W§¯¸úéj·ÏV»¶Æýï`­Ç °Îós°ÞëÀÀk¦÷Ì +Þ³6øÌ2ô™mè;{£ï`“ß`ä?Ì3ó7˜/Í‚ÁBó…[B­¡_ma`± +|mI[b¾Ä*|©UÄÒí˶G.Û¹줯»¢V‚ÝÑ+÷D¯{c¾Ù³f_,X»?¬;â× ‡ 'nG@’¡5`l´!l:šlŽ¥ƒã©&àDêæi›O¦™žL7=•nj›aì2Ìí2Íí3·ØgmuÙÛN,s€å™Üÿ°_§AMæwÇq­»[ï:+Š€à…x±«‹+hWÜJ÷P̨{Èõã™ áqhœÈM9M“9Í“¹ÍS¹-Sy-Óy²i&h}’ÚfX ý)ÈŸräÏØògÜëÏïN½›|>:×ØÔìèÔ,WXÉ/«òbæÅßfÿúFÓ£™rå@)î=>ójtòÙÃéŸaåÛÛáÜŸx–‘w +ÇS¶=j©ûgŸX[[ÏÙ>þð…É“¿ :"gÚÚÚP# +9-•–‘ž–”„OM¡áp‰¿&Šf™höÉ{A¢n’8‰H¥&Ã=P$"ñ½2I|7pžNOËËÉ‚ï…‹-HÞk’$ï5 ãƒùøAò^“ü/ƒdÎð4†?wŠ?Æ”ÌáÜÍñÜ)Õ˜²F2wÊ5æÿ°O`?PôvÉú”­šnªèHüŠ_ÎN……ø¯××]§³fÎZµk6®/.b xŽŽ2™ jd°¿³¶JÌf2஑¡îÆZ ‡Éè‘ûùzóB¯úÄÕÕ¥»»ûm„¾ø×øøø0ÒS_¿|}bb£õ™ñœíEÇð¤õÖW¨V"gŸ,Þ°rG°ù1ìQêON)Æh« Ék¾ +ú|$Š÷b#Ÿe[¡O|–û­Øî¿Lýºb›ÿÊ«v¬ÚÐ$_˜¯Fš$ÈÜoúªæË#qFH”Õ»Cµ÷\Y·7\÷€ÒÛ‡Ò7CÁ;¦?á,í©zfûÑІàW7€o1ÁÁ¨MÀ"j³EôæCÑ[Ålù.Æè»X£?Ån‡ãŒeü6ðç„íGv‡b§u"ØuL¾Ç›ü€ÿü˜ô@š„°iâžãį“¾¶!™ÚMO÷ž ì=IùœJÞNSÍÀšÙYÈš¹-dIŠºIRÕM’ö­= <Ò-.¤C“Žê&Qg‰â°s–%@š$[Ý$9GÜr¬Ür­Üs­Ý¡IòÔMÂ<êÅD²äR¾ºIXê&Aó,á‡&ñ-°Ašq"²„ M‚dIP8\t&˜w&„w6„6”oZl{a&° œ /9‡*±G í#„ç#Dç#EZì€;^-1eˆ¨2§(‰S´Ä9¦¸ÄV×8PépO¨òHz`¥ž ±ÚWí…«ñÂ×\Iµ—¡Îë}©Þ—ÔàKnð#7úS@“rS 6ZKH‘§"BÒZA(½ +\Ioía y8Èì@¤L:#²;#!Nr®£!Nrê2é¦2 +äwG¤LzbØ=±'œÞ8$NúÔeÒŸÀØB J,R%ònàR&ƒøâAu™ @ÉMu™Ü"¤L†ÉâaŠâd$¹âä6µ ‰(¿›*ÊûiU:ĉôA:ÄIõhÄIÍ£‰“LP?žeƒÆÇ9 éqnÓDnóD^ód^Ë$³eŠ)›Ê­Ó,Ðö„ +Úg8@>S€$ÊSžòÅøÔ•²¹O)Ó¤êníïn»äé ÏŠ3“÷ímOêé®…íEÙa´wl3jm¬L¥à}ÑÕ#o&©ºe¢bN 52¨¼=¤”ˆ +…¹uCÙßÝ9¡ixP?ÛW/ž¸:;`Ða»€•-\s¼`—F#•— +œœ[ZZ Onªºä²:³}{OŸ´aæfèêê ØÛ7{ƒƒáYá×>Q(oû$àݨTªÖÖÖ¶Ö¦ÙgSöÉ‚U«î·ô?¸ö +MË}•úOט_•usEÉYµ–v¤XªÄÐ,\k­ë=w-]·E†^Ÿx|¶ñò²m¾ ô=¿Å{¡×盽—oó[²Õ÷Ó—m¼¼r{€öî%F~éìÆ¢2ÅâMÞžáœc.ôßmð^jì¿Ô®†êíû¥OtLàCX9OÒµÆ4l½yä|ŸÌ÷É|Ÿüæ>™Q×H»&²ÃtøúøÀVützÌÜlïíÕúzºzºëÖëë-]ºDZ^’IOvò’¿™˜ìÂ'Æì7ߧìl†ÍÊò°ªêípqvú}be…<È,\¸\WúDß`K„¶ÖßiÍ|¯µIKk™ºOò&I©IBRuUi +-™•Ÿ+­×UKÄ%<^!§TÈo¨­€¨¨•JJE|8ÈdЫ*ÄU"‹ }‚ÁDrÙ7ú:òf±ÇÎÏÍËɪ•–ÁzX ·¿íhÈè +zZ*ì«ó}2ß'ó}ò_ì“—?O»»^ò f&ïÞ½1;3I£$iö ¬¿;Ü_ÂçìÚ¹c«Ñf/ˆ“¡EpÐèø3þƒý:j*»ã~kë^êé¨àÞA†ŽârÜ÷dphEÜFGE´î¨E²’Ä,dI ‹a û.{La7aGâ8NÝf€þ -Ìô{ZOÿx¿óÍÍ{÷Ý÷òÏãÇçˆÄnCÇw½]÷ÉXkh/ãÆŸli‰ììl§Î X…ž¢j+ô{¸ð›¹ 7‘úúú}‰«ì‰›¾deÕÚ9xÁ9a1ªBMÁ?9,Fó‹[ú9EYòà„wDžª^Q´û„è964Z•’sïÀ¹3Û ž“%j_¾z[¦k Vï;Lá§G%•fÔîpM]â5ì0IaÉ]}ÛôåW0Ÿ`>Á|ò^>©«.Ñ[êîikï•zœ?­øIÛïöï)Õv>þÚK¯¡ºG¢B, ûD_©ji¬ à³­.°¶^@%ãÛÕ•k•îÇÜFø$Z&ý“‹ËŒcÇÜø|2—»nÆ­eLAmhÀGhâ4s<?—‘š ðy\NE©2F¡¯Ô°Ù,¹Lª,ÈÎHK™0ªËU ªrÌ3YÌ +­²0/`S”Ÿ¨Àã QP "NþèÁ=8®.S‰EAá·Bt•ÅTL¦‰Q2i‰*ŸÇãR©4ôDÌ'˜O0ŸŒÎ' +µu:-4c=ÐWFø$*"´µ©¦^_ÖÑzß×ç2ôŠÿŠO4MQQø¤·çÉ OìIc&/kõñ2gg§ÌfÌØŒb@Ý«µÑ'I}ù6#OÏ Hwó¼õúͧ¯Ev¾ÛFò°Ù H¯¨®}$-\¿“9ÐßOæ¥ÂÏ[Ž_–64vÆ¥WÀuùÃÉ6fŸxÜ.„æÿÔ××Ùý܃ÝöäÙY|´¦¢1>³r²í…+®‚O殹6ÉæÂm…¦¦¡ó æÌ'ÿOjïi¡uS§+5õIg{ãþ½_æe4ÖWÁÕÖ¦Zw·¯“â£L}¢«¸ í¶QæcÇŽ­*½ ]Œñ‹>qܱcþ¡C¾‰¯Pè¸ví1„*Ç¡^4à‡äYL3÷!*µJ¹,‡ó¢QiКL|öÈJOÊÏI'“Éà“˜!Ÿø|_¡ºBšÇåq€4H$)b£À' */>. +Ö}R]®æóyB¸+o +‹ïæJÃÃ~ó æÌ'£÷ÉÃûÕeš™4ĘԤ˜z]©©O cÄEK +ÍßêŸZˆø«.ÓÔ' œUÞšÕ+]wï¼&ž={&—M¢àpÿÆ'ÆÓ§=O»;À'‹¶àÇÌ\·çA•H<™LËù8„Zl}Ò¿ц|bµ‰·8"´k³+ûû^Sx©oÞþ8ÁêtvQ<©´ª¶•”m·üâÅ+"7åù‹Wf¶ 7ùÂ]WhñË·Ó–9Q§-ÁMùãŹÊö3ÒFWÿG­=ôÀ¬¾¾þùð²D­¾¡}¹3}ÓÎÌÞà“‰6¤ %5÷Û§,ÆýaæÌ'˜OÞÃ' +z­ª0{¸½äf%7Ô”›údßžÝðÿ½½¹Ú‹¡£ vC +™©OjJÓ’cXYzyz0éäysçÄÊÃõU%?÷IL´ÌÉÑú„™¹ùtsósåX ¾ èÖMdeŽ¶"ä0}Ð'¹wÒ@>>>t­0/üpûVHJRœZ™«Væøû³³3’ÒS”Ù·Â$¹B'„…Jr³SS’ñqr€ø$B>KA7ÂBƒá!° 7;-X"–GIáÉ€??¿”Ä8xTrb\FZb€P@§Ó1Ÿ`>Á|2ŸºžÚïd&ZÍ·4æà½íÍ÷[›j¨~dxOzýœL¸æºÛåèá¯Úïvä óŸ''È3ÓŒ>yÖÛÝüP¯VÞQÄHaûÓÞr_«Î‹‘‚O.{áÞË'vö$4ÁÖÜÆjïÉ“ö®®_™ˆÐ{ô¸ É7 ɤ_ϵÚB†[öœ£ñ{páøŒOd{ç³=§ÄU5- + +#=OïIŽoЄé}ýýsVyÏ]éÝÙýüVÒº]¬µ.Ì©Kp¿³½‘P²Æ…‰æüå¦LIä¦>îè=‹ÖT4†ÇkÂb‹#´S]"ŠOIeSOïK·Óg­¼†ùó æ“Ñû¤­Q' +ä*Œ¹âu¡íQ}®Ìè“ž®æ/œ¶:nß #nKì?Ûœš"}b0ŸÇ`\'ˆd2Y(àQ(‡'/Qççd¥úúâaò¦8,Áb1…BþõëtX Ò‹n€=`xP(~“ ó°ŒÍfÁ2¸*¹)‚«\ÐŒ†ž"áp8þ0‰ùó æ“Ñø¤§ÛPU^œ›È7F& +…¿Órmï /XûãƸh)ןÁbPÙLŒö‘Ò0ð‰Z­î}Úûmq¾Z 7ª‹rªÊÕº +F•éÒÅÑøäÕËï{ íƒ>q £ñŸ{Ë8„"Ñ€©bЌك3“²˜d9åSÜúŒY˽&~|Êb©çfWÖxËSv d‹²zz_°ÅÙh–»Ó!‹û»Y6›ñ›]ý-–yýÖúܼÕWwÚ{ZâxP0Õ7Í·l;uÞêk-ö\ì@™·ÆÇf qßÙg·Ùá6íá@'O(»OJ\Ž‹WïdÍ^åƒùó æ“ÑøDQý²«÷y©:'#E! +äYV\P¢Ê?îljJrcƒ>ò¶„â±~l&•Åð +àjîæòýéG=¹M]]ʼô +m‘®RóÅÊ]eñ½ruAnºû±£ yÉŸØÛÛûdÕFÄ¿‰¦Lž@“Í̉D‚‘8Tð +ÇLC 䓆Š!X2ø!a(0å÷Ï¢B +4|CÀ'Ô¡‘>Tƒ§CǃŸëƒÅx·> WøïÖ‡áŠøgõ¯¬òÁ¸"}·þ—\‰Å4 ”¡ „bŠi@(¦¡˜€2ʈPL@Îÿ¡OT*¼§‡qs;vüÄ cÜÿ»õÅÀq|Oc”Ä9cWbKb¯ñ’œšÄõLˆlH‘*eYQÄ]ì U:Ë»Ëöβ4kr*Ñsw¹wïÞ½w¿aÈðgØîÞ%ïû>oÞÎÎÎvþ;;ûŪ«››«««···‡‡'¹•†­7n +J¥ø‰nØ°‘Ú¥%7·-ëÖ¯ÇZfÔÙê‹Å¢T*õ:ÕË +¿ôÉæfrí0ïo +¼õ[šo/ÝF¼>҇縹Ûpw‡1^ÝßÙÉ{Û­Ëàmë¼P&iùÆÙ+b»Ûñ»!Û»P˯òì2Ô½³o¿Iþ=F{usòxm¤gÏÑÞŽSûO |cÜ.Çɦõ™àÿÖä€ÞüÆú8Œõíÿ^Pog¿ÞÎþCfñ‡Ì +4#ôMgÿ^Îþf„ ŸÞÙ'}ÒÙ'möÉ +õ)Æ¿fç ù»}¢öðÅî£Eï +„FB\Ö¬>r(îH|Ìþ½‚¸èÈØ_<°ïßîºÖu— ¯æÉI‰!»"‚#!á¡»!BÐô|õŠ¥TŸÔ60}ríêå¥K—õëçH>ÂqÎ2ˆb…ÉBB¯0+$ ÁBB°,$ô + ½BB¯0+,d«ˆÅL2¾Z|iä7HÃw…ïÕÖVl¤¢w°•ºZ¿¡1cq¦ZµÂVŸ¸¸¸899ùùxýëŸ?£Oœæðy¼‰<^/Z÷>½úêŬR^ÏàÎ{{ oÀVÊÀ­¼AÛxƒ·ó]y½7Q¢LÜ» ÝÙeØήÃ<º÷xe¸ç+#<_'ô‰W·‘Þ¯Á¨]Ýaô®£}zŒñé9Æ·çX_‡±~ãüÞïoN€€^ΔÞ{O +꓃úNî;%ø-x7¤L +u„iüßÃt~ÿéaýg„ +˜!0S0pføÀYáƒ`öžÁ0'bÌ:ö›O¾ +F¼¿œF;}ý|x`$|£þ £ÅŽ]7vqܸÅÇ-98~Iüøã'À'‡œáÓÃa鑉ˎL‚åG'/?:eÅWðîÊcðÞ*8>u5œ˜ö§ÓÖœœŸÃ©™_ÀéY.”Ù_ž™kÏÎ…uçæÁúsóןŸ¿áü‚ + 6&,Ø|á}p½°ÐõâB·‹p»ôÁ¸üáVÊGÛ®À¢í×`ñŽë‹Ý)KvÞ€=nÂ'ž‰ð©WâR¯[K½o-óNZæ“´Üç›å¾”~É+ü“?óOù, ee@êÊÀÔUi«v§­† ô5AéŸgÀ!™”ÐL—Ð,~Ö—aÙ°Vëö@îúʆȼ‘ù÷æo‚¨‚Mû +6ïnÞ/t…èB78 Ú +1EÛ ¶h{lñö¸âq%îAâ/Ù ‡¥p¤ÔŽÊ¼¾¢x“îã +ðùZé '”¾'U~pJ§5pF³ûŒv÷YmÐY]Ð9]ð9}p‚>.Bᢑ—ÊÂàr™à²YpÅ~¥<üjùžkˆ¸‘7 2êfeTbÕ>¸U½’ª£“j¢“k@ʘ”Ú˜ÔÚXH«‹ƒôºƒéõ3êã3îÆß¾{èöýC™÷CÖƒ#ýð(ä<:–K9ž÷-|ÿœþN>>)z| +Šžœ†â§g ¤á,ˆΉ¿?'ùþ¼äÙyé³éó„Òç@öâ"ȼ Š—W@ùòªò§«ê¿\U½Œ¹¥¹©ŒMT·Ÿ¬;pS ±·¬lExœ.¨¿¤ø!úºÂêîÔßèd/JËÒ}")ÊÕ«¥r©H§–Ò´*©J.eVA£””Š JK +¨¥uB2 ·B[ä,R‘ý,¥,EvRʸsP±È¹•Ø¢fQpsа(9H8hYTܤ¶èXÔÜJ9èY4dÜ $-‹Ü~F‹Â~&} e•Ù¨6Uí§6TÁÌ5‚Ú¤WZÊ4M©Õ>¡WÿþóOO‹>¹™—”šŸœ.¢%¥Šn¥ˆ˜ÕFÂäÔìäÔ¶4ZnŠU鹩ÍòØ2òÒZÈov›’Î’I+ e°d1„p›%»…ÌìÂf9,"È¢åZ‘M)¢äY‘CË/fÉe0Jy !‹˜R(η­@$±©ˆ",’ZWL)lRÚBIQ3Y3q“¢fò&’&Å­I´«JA bY ™ª™œMÚD-UXQÊPjZ“ÑT -IjC=C Z+TZEgÞ ¦­35ÍLlF“ÖhÒ••wœÉÜæc™ÅbB™ OÄ¢œ;•†Š2µU•fM¥MܨÍÙñ·§ö_í×?£ßÕ¯ÀÔA–ÿWUåZî>yñCÃÓÇß¡OîÕèÕ›=jéaу½j[x`/½uw¬¸ßAºû56Ýë˜j-ËÝv©j[}•¦*íU×LmSEûÔÚ¤jbi·;Ê[SÚ£Æ*³VU·VÖarZ‹é¤¶B+.Ê£û¤¦BÏÜvX¸ aÙæÍŠy?qûBŸhèMÜ;’#tà>ÙÞÛü<­Ï…õ̉ýG¡Ÿp hç sÏhÌBM¦±S§vi³Ož?{Òð„ê“r£’Ü‹Öø;ÒÔW›ì<³ýJ]µ‰^å¾Ú™[P‡ôq훟‡ÐêÛ0QØTWm$gŒû¼è ¡Ï®õmá]_c²½gÍ|¼Æa›?^]•±Ú¢móãuêôª©Ðµî\Šri¡¨ TòbBœ–’¨WKq'áþ•I¨½ + ²t* .é;ú¼ìôÂüL¬Ç½F)6€'8¢Ù d~t­—V•Š…%¢\“NVEüBÉA*[þ•ã@¶†ª4«Õòâ"avqa†e… +}GÅl¤&'r7 uE –F¬qBÔXbdZBÏ$óÙª-ºô´$lbfØγ¦ç +§†‘ZYeãiÖXtÂüÌÂü,|¡î½NìÑ>ÁáA½å~mù½Úò;•¬ +sÓ¹‚}™½Ïñ +.ì¼ \ÿÈ›³_¦MQ¥WþEIÍÇT&±œ¸ ¢‚²ï‹[\Q4Êè¸"²uCÓû¾ïÐ + + +4;- ‹ì²¨#ÉĪT>Lª’Oyº;ãLÑíLœ)Ë*««Nݺ}û}Ïvï9çyW~jš3¹ReðÌòüÄϵM0´±:·±:û®§Ò#ß ìA,áG»Mtô +—ëç 'd…í(¡Òg§B´¶²0IáþÇ+i§]¡D½Nu$Š°ÃOß:CƒõûÜcÃþø (.Z¢ù$2Δ +©B&VÊ%ð rqp¤/\O¨‹h=ìâ3f½B.‘ËÄŒuàd}yÆfÑ#ƒÃj¹cúÀwn5ëƒa†á¦ÇçžžfÈb+ Á_ߥA¯U +M“ãÕň“¡ÚÁâ÷JÆ#òÄjÒͽã˜ÃàDÔ"@¡ÃfZœ +â Í-2ëÑCȆLÚÆöÈ_ïJ¯Å¨%-}n§euamžvÛÈ@7ôD Ÿ•žª”²á€oea"ägØág?\ƒ1#’·‰Ñ~4·;­¿w%ü‚Ðæ°›œóÚòÌ[+q‰Ë‡÷åð ßß±/awnvF~^–\"hn¨MKMŽ0IJ«$©¸žNgÂÞ]ìÊÌHéît¼\Ÿßz¹R˜ŸóðþW +u_ß¹uýõ‹åè¨åÌRrþ4Eª’‹®U]–‰E˜Žf¨¯Èä\áœh +tƒ©àÀ¡Ä}G’rÿj}ž½hc=ÐÆ¥éðà ¸¹:G!W\*}ñüY̲¥nÖTïÞµ“$àyºÖ–§YLrÈÀÖËe¹DX˜ŸýÍæP„oÑ CSê÷{.–ž#k +0OEyIãã}=h³ßD8«à\0ùp"Gª­ÕÙHÃù!ꥧH·é3’¿¬ä,¦iã„Óíu¾X žõb©¨ ßüu#B˜ý#ŒË§*1ù<ˆ[ý¾vëP¿Ïå0k5 +n¬fZ%ëó{¢Çz¸ IÅ"v +÷R>žv;¬ÒÔØ`·¼í¶a“J!¥Ò£÷R/f£¦ßïEÌF-£|tÐÏJ>èvX +TJhƒ8€•èª§]…Ãf„ê[…ÉçuM=” +ÉØßã¶A\ÝnÀC«–]â¶d|¤/&¢¬ÎOÂT6‹þ3<ÐÍ^JÆb¸ ,1êÕdC§QŒ ö¨•2ƒNÅÙ$Ú+ž´*¬wy&ƒffb8ÃÒá¶É¥mèqÙÍ<Äm~65Öcˆ¥Q 7Ä3cC½n§98ÚÕpžŠ™7¸Ñe7z½r©˜Ð:;¸ÚÓÕŽ l‘¬ ?rØüè[\>=y_>YY˜tÙ +Lg³AeÔÉ6½ ±67'“VËE*y+](ú[ÌåžÝ²UÆôÄPO—SÚÖ|(qKs]Ýû{v}aÒ)æ¾?^½~rfÙŸ°‡¹ÌìÎÏÍ2ê˜@‰N-áÆçµ0Wî£Msƒ(²3ÓŽç‡{ÙØ*¬Ÿ™†(4Š6‘°ωH,j"À‘ß@¯W§–~±s‡\,@gôiŽŒyÜ–äË +r½,¶ +¤1:ØM8ð›I¯8}êQ·µ6´òè#§¿ÎÛáƒûÿñífUEÙ½Û5¯7“% +µ;LJY+zІN›YKàd€¢SIÚZhÎÀ^(j/Qù¡ÐZ„Í M•RÚá²jÕ +£Ac5ëo‡=ZOøœ2 VÊž/N­¯Ì0O!Š—ëÏÜNsdˆsÅVL &ÆŒQFêÄxÀ c KìÃ@_à´™Ön‡%&ƒzz"áÀ'Dá´›¸2š×–ŸÂEƒý>æ2ÃçUrÉèß×é&üçP —Šç¦F£ ÿi™{ÒÝé2µ47È>3>Ò©•RöBA<9t‹ZÈØ|”WðÉÈ Û€¾‘œþjÕá|’%bT)$p ‰Â1x¬ËëX_™f%Æ8íf³ACfžŒno ‘¼¡ŠÔm®Î¸ìf^“J!„i·¡Jt¾Ú˜' +Ÿ×IŠ>úÇ—OO~Ÿt¸ÌûvËÄBµ¢­¡îëÂülÈ!éУ0?VY[žÞf>±[´öíeËpÀ×ÜððbéÙÿüëMYÉ@¥¸0ïÒÅ o¶Öcz¸ù|N!mIKI*.ÊóûÜÅ…¹ÀCvfj^n&“¼¹zåRVfjUåÅ‚üìŸàAÓ£šÕQÓÆÊlnv:Qˆ3lÜñÇÏÁªcEùLí»_ÝŽôæådlm.Ålw…•—ËêÞ¡*“%þíÕªHP' óßßý[¸rdf¤~y½º·Û³M½ÞX|pÿàqòxѩŨSI øäîíßýsëÔ‰¢”#‡[õè?y¢(õh’Ënà„˜‘växQ>nge¤V_)‡7bò QpAc­\,ÌH?Ê«Ù¹ã„Iñ-?/ûέx éŽ+ 1ò—¸üJyŸÈ¤"¾ä¥gÁ±!?3T§QXŒ: !ÐÛÉDŽÖÙ%jvwº߀N« ôz! +æ&£œ)É_èŒY³Œr†¸ÍbÍ\¥ŒÁÚî²â˜Ïë‚R”rñÌÔˆQ¯q;-ôÃèí”9].Ãf“îùÒÔÙ¯Ò榮3Ü¿Ðþ‡Ìð Úo™N?tš6]3¤ãºNa1[´ +¡ !lãU‹macc[²l˲díû¾ëÞ«}—Ìb¦I§™~ï£{‰b¤+[@Aµ{fžÑûž÷¼ï{ïyÞç@_ÙLèq‘@±´ —ÎAYiÕ +éBÕ Hjg}mƒ7ècG¸B0H«á"z½f{aŠËï¶(WE‚Q^}ÏÔ…Fµìuš8E¤RÊ”HX6? Å…ÊXŒëb¡\vO¾8gÔ­!6§MtÀüg¨|œ P+H&¼ \2,—ÞC‘—dOÒ„Hƒ>™º3a1­#¼Þº¼ žCŸ,ÉfÑï +ºœ£Ý£Ã~÷Ïç>8Ù÷Õ5áèíáÛ7EB6Y\˜þÙO_‡>™™‰ƒG¼³pïTMOwgïñ÷{™›™¤ÙCW·–ë¼:t`l¸ÏbTu¼ý‡sgO +Üꛚ ܺUñ;:Þ~kB<œŽ‡–{0y°cÿéSÇ.œ;=Øÿ%&ÿÛ_kÕK#ƒ·~ùÆÏ/]üËß>¾€ðð·»ëÀ´D 8º»NŠ†A/XÞX´r>væô‰/¯]Á%åð;Ýã¢á ž†d1?+9{æĩޣǶ™×¡ ö¿õ»t,È[yH<•ÎMMŠG:ì‡7¨;†‹{´‘A0gOŸøëù³ðÿæ¯~-®\úèæÏÎp +eD¾Ñ€ã½ž.Ì@þ5ÍeÓ¡¼`ìb†îé>tæäqdʦy*J¬«³5Gý­FúHÛ?E‚½‡F}€IÐOñËDÜø>¡®½Uí±[t Í4½f6!Ÿ +-[·®€s4ñ Ï +º Ú¦úÍ,à)¶Æ逺€žy +ïýKÈÇ/'Èìˀ׊P±)7:5‚ÇéƼFµd£b +¼ +ˆ§™CLâœÀõu*8çZ<ô ÒļÏmvT ¢ˆœ¼Îœ€¦0f󪦉`XÏ^ŸÛ‚ì!â„D‰W9A1jÅÕaËðXŸBIñ”s·\šTÈ +•ádÐ)aCÄ ÁK³ê|ÒE¿¾‚ïð8µ« Éø(ú,òj ¢™)±`¤ˆœ­zcaVbÒ)Á v³ki>}‰-ün3”ƒ^£ÀuF,š’2ñX¤_E`>èµòm +*°MO +îÝ7hn‡“ØT!ŸŽ¸íˆ%é ¢‚sÜÈà0ͺ ›éÄc1¨Vm*Ä*¬E߇·]¤4ª%Ô +ÏL‹¡ßࡽ`Õƒp +ofÃfl¦õDõ†µŒ–dÕØ!D +(»G 7ä ­ˆD¼N#/?€Xà‘`ëjeq®TÈoÿâ³Ë¿yó +èÃâ“O/^}B?}Ì1æþÖÍÀÔlj™Ÿ¡Ù®Š^‰¿@‚öaŒ†§¼ù4Äùz1×%‹YºÀÚT=ÄCà/ .´È\*Ú,H,Ï$BœòÁv°~¢ø‹fÝ£UÌ7½e24ìa {Ìp1à öÅÓ\2‚1ra +ª™bá5;z0€"BØlüX›KE`œŠ° +¡r®²Ép!SuK5¯?"€Aä@Q@r`€Ý©'ù²llE˧¢pˆIîàÄeT{5uY#€ïª÷½+ØoÓaßÏ?ÈqBðò°UŸpg`o”¤ýmƒ`oݪE}B?u‰ ØÍ»Ñ, ZÈ;%x©€bçô‰Õ¨rÛ +Õ²V½B@@@°#@N›>ì··¢O ˜´`/€òáb›d´?‚½‹t¼¦OÔ&£V*]Ë vè¤ׄýŽíõÉãGU}¢\]‘I¥m™€€`W@º°à²›l& +ô‰I§¬S¥ ~Kùăr¶œO<¬ä6ŠéÊî"gÓIïÞž$Rªb$B°Ç€Ï²”K<ÖmôÉ7_on>¬Ä)CG†Ž±ˆÇ˜'¿|`h*§Ìzô‰Y¿– ýTÐI‡Ý™d4赧ãŸË +:©ÐnE,âŽìmãA‡]LÄ +8Ú AbQoÐkãÕ'^¯W£Ñ8í–oþ±£|Ñ €}*ùøõºLtÈÕöžˆœÙôt" 0 ^Mûƒ! x Úg6¨9}’døJóæñæƒE™l£R’Lˆ¨ Še7ÊJ¹º\Ì¥¨j‹êQ,âa"ž¶GØ +Àçn»A¯Ó–òPõ‰p`ÂnÜO·è“³o{v»øŠšé“þþþÞÞ^Áèп¿ý'«Oœ‘€½˜K”Šy‹ÙX,ä–åóø©ªDÙe€8‰~5NùY"mHÏ™HØôZÃ~èL_Ûƒ! ¨C’ñ7ê“r1+“.ä2IÉ„°FDhè\S{¦V¸ua3IPç¹Å]WÕƒççæ6ÊÅ:}‚¬Óñ @=‹ôâzú«W5Ø×nÖ(•k*P"oðâ +i*Ÿ¦2ñÐŽïYd“çRÑĶáQMÉ´þº þ¯°>‰F£¡PèÛ}½ùpú„ªötûýJŽŽúÕjñÏLM$h?ç§ö¥ý×é%ö\ôROøt; ËËK6ŠHjëB¤™M„q$Ÿ‰^Úu_HÒ~µRn±X+…ïõY§bAÐ €Áöˆ§  è$§¶{‰OÑË.¹-¼bðê“J)·(“泩;“"Î ŸÕ¤ n ÞF‡n©Veøwô…a¿]8: é·™Ô¥,Swrñ +{†ÙéÉ©Il°dÇ…CÓáêÒ±`Ш]ÝzÆqÜ ²*¥|>ÁÙ¹~íÓϯ^Ú($ZÔ`Ñ5…ôÞÝq¿ÛÜ + Á\*RÎÇ82T+»`6‚=~k%Bú‹V¥RÝ/çõ Ãã0Þ¸~õ`Çþç?<¥XšË&üÜXU24š‚øèûïvuvôtw¢Î°äͯ Û9­ºÙéñ±áþÕåùr>NT +A¶Ñ'.—Ëb±<Þ¼ÿøÑý­ú„¡‚ëëj:Ä©çô œhÖäø9zÁÀbTeáwOÅN«–ã€ÇRÌ2qv£­áY *l$ûŽ^0˜€^të+?–g!‰p¤Ÿ£—±á¾ Ѱ˦«£ŸzœF…bå~%_§OÀŠçΞ„ä% +æâÂݹ™IPV‹ŒTÈÐ5zÉ%#­lÐì·žb‚FµlµZËùd>á„–Q§¼réãC0À_LònÇUïÄz9vô=Ph¤1#ö†ò»-`6vŒ}Ý¥\ìÕßþþÇÑ¢>)çb§z^¾ü©^oVVûöíø +¹ñ£b"îlšNÅBW/_êüýÊ'G÷à°C!ÔŒK9f°ÿÖôƒŸüø5ɸ#c»×þÃ~™ÀDy¦q|¼“U²]­»©€È¡€¸»^AëA‹r8€ÜàÀ r‚€ˆœÃ1U¡°"‡Ü·€ ( ( (ŠÃp ƒ`éàÕv›55qö_œŒ3òAº›mùò„¼ó¼×ó½Ïÿý=*ëôõõ°B‰ñèí­7™î®‰‰IAÁÁAAAIÉÉ¡,VHÐ1q˜ŽO°—Ð` +…âêÌî ªà¦3ä°d½ºÚâÅ‹±T3F>v¶–òò²jªë44Ô©†ˆù厜ågª¨(!D³ð Ĺ¹ñºµ¥YIav{k=¾`[S-ÓÍét\,THz|„ÚÇÛ#,4‘Œâs'œ9Åp°Ã8R§¢³¦º\aµüüùóÏÄÅæe —­euU)~úÝíœýqŒ„Oˆ×çÏ&ãä|‚Óîë}ØÚÊ’A·‡ÙØXÑím‘øÓ6L +#*6*ÜÖÚÂÒÂ4õB"²¸.žh„¸ì-›Õuöhá‘,0; =Ý=º{µY!Ã’éŒîXj4;̃é~Äë0ÌÍÕÅĘ +áy/\$|y14ÐÓÚ½+èízxo†b:T[»wíX¿^­«½IZî>j¥EÙP ManÆõ«—gS4!Í»»ZósÒïu4‹BDÂ'³»«åØQ/'Gûâ‚Lxíæ´|t:l63ý¼…™ ô³D†ÛX™_­(IoåŠ)o/&ÝÁŽfgèï[UQ44;К³OÇfÉ'£C|½=nÞl 4çÍ›7;wîÒÝ«“Ÿ“ +pŠºûîW\¾œ|.©½µ…?Èm¨½616ô¯Wßã6œ7o^DXÐØH¯ÈŸ?Ô“”pVUrÐV{bl +{>1\˜—© °Ò@_#±f̘›•Å®¯¯‰‰a³£Ð8}:¾±®jPŒíIø$2,|"#³ eÎØÁ'ªëT(ïôåõtðÉ»‚¢‹÷Ù„qAÖlø]ÒR=» +ßüx"6ROWçõÏHÖa¦‹ô"H(XÚYAÃ_MòÇù<ÁøêMšumu¹¤A(°euµuªªkïÜ®<}Ìik ð÷ñóñ'À9›³ÿ Ÿ möüÑQ¢K_¿Æ† +L©õ5•Òåœs3³“Ïï}ØÅëéjj¸ñâþËÉÑ£>žÈœ¬ÔËnP€÷Úµ” Ï—‚QB^Ð8õ +[aõJWg: ]büÇ}÷¿=}15µ¸¸òyûvK4;Ú(â%r>a%ÊŠŠ€|èù‹àšþû†õÛ5·ZY€?yÀ ÑÚµCEY‰=_aR’.XbÒrë EVKã +3ð âÍfÅF±„oq>äC¯‘aÁøIb +|&ÈÄ’a¼¼šmk®Å ;qgÈKàq_EÅ5ØÚOGû뮹8Ñ63nÎ>)›=ŸøùzVU]%äíÛ·ù榃¼øa¸ÿÁwIIìÈ-uuôà`M7W}W]G†¾“£KMu ÷£8~ã@&ŸKPS§ØXi ö•ÑØ73=CcÅÂ|[_O÷‡ îDº÷÷kjnŽˆˆ€€äää”––*++êh…ñEBÂ'¬@Êûård:xÀ- +"w¶in=!»ê‹Úë3Ö8ÜwŸM Lj’‘‘Y±b¹ºº* Ÿ`;/¤ìo])// ÊB EšFÂ'Äü`e~`Ù²¥`?yy¹¶æ:7GÄABC ƒ±Qa'c# rÓådWÉÉÉÊÉ­b‡‡æex¸;‰ë¦Æ¤qtÁÿ‰rrª˜êlÉʸÐÚ\;›bmÎ>›‘O^¾̆O9:ðúúˆ.|>ßÒÊjûöíìˆ †c]“©Ç }&>6íBjúÅ´´”\¾€ge%Åk•%â'|裪J9~Ì÷ !/OGû‘ _¬¢¸»•ºÙ{»¼<™µµµñññ!!! eeåúût+Ë 0û£w>ä|bkmAh‹•¥ÔCÒ†˜LŒ +€Ä6mü‡¾žÎÖ-›¾ÒOÎ3D¯škeßžŠY¸p!f12Ü!ñDz‡8Òip>îçW‘MÇ'pè¼{ Lê%®]« C¯NŽöøIBÍÀ?1lVÜÉhèC^vZnÖEJw=‚JTm‰ÖSVœ 7ü%¾ÈÄØ`ê…sgâ¿‘ÆÅ9û”í·ñ ñ&'tZ?·S|@¤gXHXf¦¾PxšÇcttÐ9FCƒ1UâÉðO/žŽðÄý >Y§J±±Ô<}ÂâÂ^FósòUÕÀ'Û%øäÉ07:2”N§geg‡„†²Xa§ââÂÃYF†zZ»wÐìpÚ=³æ“ \ü.Aº"xŸÎŽ¶Æի壣XÈ2Ô,þ>ä?ŹՕ%Ÿ¯X¾eóFˆº“ð äk€{ÏÂÌ‹AY76ÜK¬Ÿ°ÿ?Ÿ €-M5ׯ^è½'B‘©¬ÿAANú•²½³OÍHø¤§§§­­­“sçųfÃ'¸\qy¹s箧‡«D®qwÛiBaLWƒÃqäpåæš:ÐhÿþéÙÏÇG{Äïw‚O”•)þÞ¯žò‚ÆÉØeŠ§ +¯"gäîY¦«“Ÿß±ÔÔ´)ua…%&&ùx{Qôw|¹-ÀßwøÝU;K>Á#/'[YV8Ðûñ”AeTY^´|ù_J +²›®£–¹”z¥yÌÇFx)çÏB¸Ì£nÒÚ½s:>A(÷uwµ7mÚøÏ%K– ÆFzÅHø¤µ©ÆÒÜ´»³S,^¼†^­,Lñ“„š!Έ $Â2%/²«J +²b¢Â ;âÔ/~óÆ\7ò‚P¤œO¸uó¤òw?Õsö±ÿ†O‡†¤ùžÑ‘Qiiû„ÂdÇÈÄDÞÔTJý\Ccž®†¦¦² uÿ}ÎmÑ!„þ$žMÐÒ¢0è2ÔýF†ê°ýFêÆTyBÝÿ¥8Ÿ@=ÂYf¦Tä‚͆á`G··wsvÒß·÷ ­eDX¡.hdF> +ö‡t,]ú§5k®\Î/.Èš5%…Ù‹-üì³?+)®A/Sc#¨Ítþ˜úÉpolt8<(Ž¢"Bµ¿Öê}Ø.ÝY‰ò°©¾z‚Ưª(B"KTO$|‚Ò¬0ï’¿Ÿ·ð×W'b#õtu^ÿ,@Ùr˜é‚Ï*9Ä8™éîÜÞÖðr’?Îç ƇøChvÖ¨‰ˆk‚°)>¹U +‡ˆ/B——:Ç's&n$|bcc£¤¤äëíùëë_~Ÿ444ñt—àþà#w×[M…³Ba`w·Gw÷Ñ¢"½½ZEù%ù9™Eù—ÄO>îÍ Ÿ)®Îæ¥EEY04|¼œ6o¡0Ý>à`ey¡Á>]GÝï¨OPàqXÀØ/󠦲,Œ¿¢´­Aí{q×*[{¥!²Ù¸ ˆ€ û&‹ˆè4¸·ÝàFD”}‘$€$ ÂŽÙ·¶°Š"NO÷,=3ÿΗ„y>^­®šš©2©S©äåäž{ï{ßwç\8–pîÌ)+KsðÀ¸ŒÔó‰³ãQ9œ,Y²x³žî­ë×F»”îhŠÃÎDfâ}&fŽãnì +ZG +)o v55TémÚ¸`Á‚ªòb“½FÛ¶m¥ö´»ƒ + òC ¼£íôWÃ'mMµèt*øÜÊòâ +Ö!P^áåኟhngŽúþRìí(a½ÄÊJ†µ¼¨  IMŠ‘AOX' ¹`JÉãë+È®GšPÃ'"‘¨±±±­õÅO?Nÿ +>©¨¨TÊ'~mí¾SS>s­¬kkÂƆ8vŒÀç5kfL U›ÐTxX¨­­ÔLôõgìEW—øÚ”°³#|¼fñ štÉìÅSf/{÷ìƧ$Å{. 9¢÷ñÉ~k KsÚ(c#Ãɱ>…R{'`uû_ÿö“OÖ¬A«´ê‹Ï?ûjë—¼*‰a´ìÌ$´K»vtÁ«‡ºŸróžò8Šù¨8Ô×&{Œ´´´Ò’â'•a*>ALOJÐgY[™W J`AA×ÙéècV:h„V ÛÒú¢Æx·,e@Ü6ýJÒÙÖ«9D빤öÒÛVZœßÞ\GÚ¼mH¦£¥^U막0>œONŸ:YYYM57ÓoÝNWä“›Ñ7ƒVy{K‘ãâE"2’¸p!¬,¿(ÈËžPhÜ»„½=A¾ŽÚ‹þþæF]ÂÞ΀Ê'ô~õR·07—õ(/7¡¶fKMÕ^á#CC(<‰Až¬ŠO ePzgkØc×N}8 – TavfòüùóBýÓËߌ +ëÊ/ZÄ05‘ôwÐ_aÌØë˜?DÝßÓ:Ô׎•ªr8s}u0I[{~þã,P“Ò¤ŠOÆ%¢ÑW¥{ew81 Susu>{&„÷$wx “fplÔZ¿~í’Å‹Á§‚ý];z¸Çñ«âôú{ZW%Eye\üÖ ­%.’Ä¢ MˆÔò‰üë¿þù·é©Éá“þª½TW×(å“ÐÀ¡ÓíÛË&Ο'""¤sù²”7ÂÃÜz;©Z–óÉ‘#ÄÄŠ3al´l÷îeD€ß,>–ÛÙL¸SðøQ.+‹“{¯„çÿ¬821áÞ>†©§‡KA^6ÎV‘Z>ÁI~:8—•^ÈÉÖÖÖ†'T´?ðÛç5e:‹tØX#[Èöñ<E£Ý€“Ð’e¼Ñ&™€O@)`\ìF(Ž/ƒŸÞ g1 ‡› HF©r•ò FS55TmûÃWz›6††œääf"à½áaÁ]­ +4ÇÀWÜ&‹tt`G̘ëìì´«—#ìžr9ØUZQØKÌÍÐRá'¹‹‚a`ÝììTÔýŸ?Òšøÿ‰ä4ðŠ+W¾CSCFFfÖÛCÔnEžyûFô¼ùäo{„°9 ö„™qùâÙ‘ÁÞ¾žY$€'3öV ƒ!í€È×…È?ÖWUoÜD±ÝIå“1IÏ…ˆð­[6ûùxúz{úù¸œÕ;{fûáƒÖ†»¬,÷•póÈîIŸÈ•ÀhQ×.Í;WPV$™½Š™µŒö]ÿAʜܬ±¡`Œd ÓÌt/#Ðø"…1®[»fá¼Â\üW©)QŽv ƒ‡…Bݪ:&¥|2$nç²—/G¿õ)š ¨ãa³JPòrT¬81üƒZç#Â_O °Þg²²’`¸é=ô¢˜9Ì +ié) õ +uåà4;S•Ójâ£÷òÉÏ?½}ûæ•z>ìv8j—”œBµ—¨èëþ¾ž µ0ÞÏÇcáBÂÄDf/6R{±•Ú‹v½»ãÃý½]³¦]öî}g/vvfZÒú +ÄIg*Ÿ`.Ά;ü½}¼¼üýìÃNë†6²07762°=dÓÒXÓ/Ó©>Á2a‰8y¥£99¬\¹¼«M¨TݯÆûæÍ›'¬/‡ÿ@Ô°,ˆMÓäX?-~UWU:gÎœMºA8ÇÕ+–‚ c±wco€dhž@†R>A­‡÷vèoÃä;[Ÿ£‘A´¾¨%»?2p…u‚݆»´´´’ÄM½de¥À^Š +ràE4·§ÜqZJ“|Vµ ¤åEMüÝ[ø02ðžEiâc ¥|òzr¬° |TBò ôUW]š’‡æ‚ŒÄ„;¥ÅùŠ,ý(=3-=#õ]p Fº'€¸£¥!Àßa±®žÞL0LM´Ñß®ëîæ0(žÕJàHÍH}àáî˜÷D¸»ûzyí·¶Àù‹s2'ŸpU|B-ÝÖT Ôomª¥ö\Ôµ@zyìŒîöF¹À!ÆÊòâ¢üE½ã +J#î!éëx¯Ð0xyi·€­¾ePÅ'0×ãŽèe@JòÑ䀤´P{s›«SJbü¤Œš&ÏWSiý¢4ƒUåÅ|)aí÷Ð-ÔðIss3ŸÏ>¯ýùÏoI>™z5*uðùe½=$Ÿ`þÓBœ€T{r×V>U´—ꊒ{©({¦ôtC~} +ßñÃ`×;{ùÆÚÒÚÊ|ûvÝó߆¡I!“!a Eì­(/7™·œ€½x{zX˜›žôíjo€CÊ3Õð µôó¾Ì=„Jñ 0œÑ¤l±%EK‹ µ‰¨f…ÑÈi¨¿/ha¥EêIFŸÜŒþpùcJ˜¼Ü.”®Bf‰<'GûgÅùØLÔRãEd +«@!œ Ø%RŸ¯‰3h|"êˆ;š›„i©©Ïëk“Èg’|J©¡ô¡Rš© +¤åt™ªå1>Ü PŸ£Qæ !Œ +͈ÍÞiòÜØ9,5|BNUUsA&P¯ÈwUùÒ=Q=-ÔEæ@¿<oJê„3|Ò#+„ÍQ3s…î¾ý +À@‰¯¢‰-Ôð “É + +J|ÿ¿ÿå?|R?=5>Øß#”ôõ°²Òä|‚ŸÀ2-w“)p>¾â¢Ì"fÅ°²ÞGžž¥(Ÿ“™þ˜5iÉ÷€œŠ2U€Òiôw6Ö @ò©I3‘’ÿ(#‡/ÎP2SÎ'\n‘>Áhƒâö‰‘^U['›[¼‹zåßì—éOTI‡ÿý`\b¢ÄOÆ4HwAp‹Š ¸aD\PTDEqAÜAEYh¶n膆•a¤Geâ83oÞOïC×;7FzÀ…^¬“ÊÍí꺧NÝ[çWÏá%|‘(DYÁÂñ9œ,fŒé56[ŸæßW©Tæ|ÂDzm¥™y¹ge">"LJ ™áï¡“ˆ’P`)2² +n|òÌPËμq=3åÒ…Œô´Yi£ƒµâ¤þ6þ±<èI·Ò§OÞõüjh¨¶ù{þêÆbk«K5Mϯ¯>Q^ÚˆÞ°TÙ¾{³Â'ƒA¯×ÿñé£ñÝ[Á'lBMMyzZê•Ô”´«©rn >… ¿Q^,F2F§QUUUõ¾íŠO¢µêT¥…|©îWí +ŸˆŽT^l¾Ùœ¯YðIËÀÎÔ´·h駎zü¸ÖõòYÇ ÌÑÚ€ªw¿n0Ç^ˆlNجðIllìÁC‡~3ö|ø­Wᦼ¤(¯ìI~IáC­ºÜq™Ù W¿}óK÷ë‡.$¥Ikìë}ÑÖhÎ'²ÉfÍ‚OZá“®ýkª=Úšõ5Í +56ã;, +Ô;ÃBds²f…OÄÏïßß½|‚àPþ(òÂ}‹­ãÿ–FV6;~VR™KmóHd“Í¢™óIk³¾¾^Û ›l²É6Œ†\47Õ“O +ƒ¾Ö©ÚÀŠœbQÎ÷idsŠÖnÆ'-}N§•M6ÙdFC. ÿÂ'ý‚OêuZ›,›l²9JC^Z›Ìù„NiÒ¤IŽi‡Á'ÿõ©¯÷à[Ç+Mš4‡1­äiÒ¤}­Yç??¿±cÇîÚ¹ý¿ÿùSò‰4iÒFd’O¤I“öÕfOZZZÔju½Nóñ}ŸäiҤȜŒOôz}kk«­£&íg1ë|"~þýק¾Þ7’O¤I“6"s&>©¯¯oll,((Ðjwò††ûíNÀ9ó{åçàY¸áçP®êM6ü€­¸Ò›™2Ò¢s¨€¥¾ +‡Oú?ïÞJ>±gSꋹù¯ nÅ­âð‹þÍZŸÅŠhŒÈýŠ˜]WóNó€¥ÈØÐœ†OØEMMMAAA...PÊ·ßöi WssóãÇkjj¾:q„“âââ‹/rßÒÒ’›››”””’’¢¼:’”Y***„ÂTVVfggó†l„«ÒÒÒ¡„………*•Jè‘?zôh𢧮®.==HÎ;—––ÆÏüü|®™™™¢355•ŸÏž=Ã=ÄoNYÒF߆Ã'~þ½¯÷ä»5!ííímmm­­­ƒÿ%ñ +ÃHë>2šTEjxPÜ ÿ湯üdL£É†B "´Ž( P\ +°˜åùóçm&c êA„\•N‹€¹:ëibÿæ4|®»|ùrppðÒ¥K¹·u8?ÊÈÐÚÚÚ°°0ŽfrP÷O…"’z0ü[<®Ø¡C‡üýý¹xo~~~¾¾¾wïÞnÉʈˆˆëׯ“¡¼Ï¢¢¢Ó§O35Ðbî–I;::bbbΟ?Ô˜O*"a"##a ᪠ €“‹Y,¦çÉ“'îîî>>>Ë—/ß¾};tR^^îéééííMg`` O1’~^¶lYVVnGªœÒ¾—Yç’/•šráó§~É'vkdPhh(Y¶råÊM›6i4!"‘¾cll,7¢PJ)ÁÍo%©¹VWW 3ÅÚµk…2Z8!mIsj¦ƒ +ªž*++3¼ñ/Û 'ŒTDF™ZD²cÇ<3!B;f°Î$kW¯^3gΊ+Г¸¸¸œœœ#GŽÜ¿ßÕÕUt}š˜˜XXX( +K—.¥¤¤ ÏR,\¹rÀɉ'ÜÜÜð@gII O½ÿž4\°`™(& + + +JHHHOOPTUU=kÖ,äKèÎ^ÂaWWWFFR&Æ4Bx:“tœ={W<’——‡P­  ð0¹O$ÙÙÙëÖ­3ÝÝÝH+bdnnîš5kzzzè„…ðŒÐÝ»wïÕ«WüDµâãã‘~”ŸÙ¬óI~~>[®¦ZÕÿÁ(ùÄnd„víÚ!„‡‡S‰à¤*ºJf‘‰‡Þ½{77BoEÈ=iË02W9»ù‹ü…OtxÛ¶m>DL@åæÍ›”B'OždŒà///€„DæAò]­V'''_¸pG”ððÖÙÙ‰¶S=ˆŠÇyD`ƒP<´ ì0ÙñãÇ!%`[b¥(5,JÅ,ÔJˆ$B—šš +ž‰Î;wî°|¢Tèá¥û‡‚¤¦9Ÿ°-Ùl쫺º:öçgHÌe_:ujÚ´id„²!ÌX&êA±Câ¤ÞÎ;)Inß¾Ã9N6‘¶üädGs¨ Ä« `  @€HÞqãÆq|àüŘk×®=zâ­’žäøÖ­[^,s8p`Ë–-<ÅËG‘D¡Ä ‡à%Hm.‘7nÀ†ªfïÞ½+M†@ñ8nñÀ_)à„¥"óæÍC+P T µÃïáánÑYQQÁ,‹-‚RDA9÷íÛÇD¶þ2?©YçXzàÔ»võó§’OìÖà*àè'…‹ŠŠ²²²|}}7nÜH=‚¶þÜÅœé¤'jðòåˤ¤$`:SÁBòz{{oÞ¼¹´´”ZfæÌ™';Ù]SS“––B©'¿ôST2ºÁ¿ìàaîܹ³gÏÖ™xcR”„yçÏŸO-ƒ§RÀ\HÂ#`O¸B"˜Ía +„Ž€)ÊP~"HëBî85Ð:&Å?¥ÐB'?É +²Æê€ëêÕ«y9ÎZóÚ³Ù-Ÿpfqüqz²½¹ +v¥‡íÊæŸ:uªàsŽfŽ¿ˆˆˆ={öÐÃÎ\±uø?ÄHVçââBfñ.\HîpX“õTîîîœïnnnT¬T"?@. é@yȲìì쪪*„#—éä=‹w‹OÎú°°0€b‡žÀÀ@z \¿~ýƒè$ÇEÝ„Ÿ×¯_CÀçŠA?ÄHž‚#Ä+úÆShAnØ°H"$ÔS<S±:VŠ@ee¥àD‰18¡³¬¬Œ +€þ%l"!BL|zi£oÖù„­Hbf¤_‘|bÏ&ø„3š#˜CœÌ%Á„ø?sæL||<‰FÎFGG#,Ð +C•ÁÅ*ð@>’àø!Uùôqqq8ˆ†¨eàê#Ò6 hêììä´bÆŒ”Z°SPy…‡‡óiÊ,"Mš4 7ˆ‡ñ`dWWhs¤#((øINNFpÐ4ØaZÐ1äÁ]¦L™‚ª*ÆpˆLž<™N°„UPa¹PN®Ž ` ¶þP?Ù-Ÿ€"%%%lH6ç ´Ìþg«³9š½¼¼ÄÙ´ÿþþþ~ŽT¶‰-í¬”KÖP) &L`±žžžãÇ6È#^NNNÎĉ9÷=<<ЖââbrœÚ~Bt¦,#IyQåååä à +Ò_á@0ƒ§ÈÈH€—|ëÖ-ê„I!(Ü + µóòòðßÓÓ!œDTü…Á'\»»»CCCA®$8A'LÂÔ<‹à0”•˜˜ˆ “Nö!‘íBýˆ‡¯O|nÑ ™€d¸BHáöÊ¿6þëJ|¨êêêb ‡‰’››‹á98Ó˜7o©b2Žl6›šÛ›7ožzD{ +ãJJJR…<ãÓ˜á¡øçdÇ˱êÎ2•5•ùÄn·“5Š¨òH­s²€•ÆBb³7± ²xtܵª@ˆ«W¯B&@ÉËÖ\\\ -°³c&lâ\“¿d%Z×aaa`Œâ^€ÉpØ!NI2lCFsz¢/Ç(ˆ7ɇ%AærZážÁ˜À‚ xÿ|𠪪Š,&僂‚°Z2V†ù€tç¨~dgg3B\\Á§dª„¾uë—a zûömL€¸Œ¿ñ¤NÏ`ìža|nÕ{`0 `e uuuz­h’5>Ÿ`û|  ¶<á“©,cýR.à·X uöìYR ¯À4Ôë9æÎ{ÿþ}‡ÃAú“Œ*a•?“Ô`ùž™™ÉaŠó#fЗ + ñÆt»Ýø]°†(gð#GŽ`\tá°‰A‘æŠæÏŸÏáƒÂg€^¦TTT¤Wq(Ãë0ŽB4`4쎾Ìäòåˇb4Ûäš•©ø£c¶ÑÑÑ999Û¶mS…ÌŠÿ””&ŒƒñϬôrÑdjÊò ‚W[`ž]L¥€Ó³HØŸ°’YÿÝÝÝ/^dþÖæœã(¢öbÒs KbÞ»wt®¬¬ä¾ϻxu\S¨§(rîÜ9ò‘-ö££²ÚÃééét¡##;=x@÷,¸†IMD,«ººZÍqêëë JG /B:cDT1½Šé1 +Æ!4Õ´iÞЀi0¦A\ZR¥& ? ¡õB%%Lod@5>Ÿ°*Ø’ÊJ¯}|? |2e…s²­³¿C)lÓ°¹œ——¹Hò²é$@ »ùÖ­[1ÎÎN\z!—Õ8þ€9Ó€ä<†¢œ„fÔø8^„ÕPN fûDÁ=HêåË—Ó]I™ ôÂL±”K—.­Y³†¸wîÜÁ4TÕ’%K™*U›7oæši=zÓ€gÁ4ˆED$T1+§Ç¦XŸ ¨ÃAI*KĈ¡ŒÿššåQf~¤i©)Ë',p—5 ŠÛª\ñ ë•F-|244DŽ°õ6–/„˜„ÒÓ„WÑæ‘"2ˆw¢Ÿe¸VµÞí]©Ä÷®âZUé{½JR^©*Tíùç£p«wÄgh@!¹Ï- Î-×4Ыhϵ>¦¡B«:yêO¤ßª–>…Jêa½',2EãóIDDÄœ9söîNú÷ð/Â'SV$#)¦2øW%j7W[6›;Ùêô$øÈM›ÍÆö]^^®ª”|z!å´Wæ úêíU¡w{äãäÊ(¤#ù®Ú«A¼«¼‡bjV„£1õ'UÏ¢f¥3aXñÐ{¢ɔ¹|ÂâQ{kFm7úRçâÚµk)))ÐûÞ½{¡eµ²[AÑqqq\ƒÜñññ¡¡¡7n$MôE(‰&Gãó §†Ù³g'%Ä›Ë'j_S˜mʦ¾x3>¯HiêZíѪ*ܲeËT_}œ1{)ù ô¸z{5Â_µÑÇùsÕŸ‡Ò ½§á3+®i£þ}ÞɃ?ôw_¦è[ÉD>W«««kkk¹°Ûíéé鰇 VLRQQñüùs؃r}ý8Ž7nðÞ\¿~ýÔ©SyyyÞ /‰&Gãó‰ºþô±¯çµY|‚“TVVfggc/‚(ßJOŸ>ź͞…ÈÊ2‹O€üüü™3gæææ®áááYYYgÎœ «ªªzøð¡ó²uzØ›x^ÄîƒÖ"‘h25>ìïï}cŸ´··>|800pÆ +‰‰‰8™ˆü®+°'2T¦ð‰ÔÔÔ€€˜¤¡¡aÅŠ¯^½êíí + +*--mmmuzÖ¿H$ú½O„O~ýå}_ÏkSøDmâââÊËË`•ææÿÍÁì/#ýßËèü5…O”:;;ããã333].WrròÚµk9àìÚµËáp(W)**ú—ÁÊÉÉaeâÊÎζR”Ó§O[8JVVVmm­¡62>ŸË÷ë†Þõ›Â'œtÊÊÊ–.]ÊÛà(ô“G +ÿ°ÊSƒõìÙ3ÌM¢HKF!ƒT6—¿&òÉ‹/vìØ©òŒÛ·oÏÈÈÀN£¢¢ª««=zÄS¯[·.<<üFjñâÅÁÁÁ††°X”ÀÀÀ   ËDYµj•5¢,Y²dåÊ•>…Ë–-#§pã²x|>yòä‰Ýn¿g7“OJJJ"""Ξ=›––‰ÛP5ñrŒþ( . 1:Ê¢E‹8ÙI”ieýúõ¦DaÇ)--}üø±qùk"Ÿ€d111ðIcc#›¸ÒÙÙ¹zõjÎ;áX—’’rþüùöööôôôµk×BhÇàQmm-§žÏŸ?úÚ9U555åçç[& +[yÛ×m +Ÿ|04„Å¢ôôô¼ÿÞ2Q†††¬¥··wppЧÐt>Q·ïzû{ߘÂ'_­¨¨À[233›››±Å'ñññF·Û=22bt”W¯^ +K”饫«ëÓ§O¦DÙ·oŸ…ùÁ!---\ðÿÀ#u;i|"YXÂ'J‰Ë£‡ªÛÉá‘Ȳ<Ÿü•„OD¢¯×á“áOûz^›È'>>‰¾^Â'Â'"‘ß2OÚÚÚšššZœ÷ú„OD"+IøDøD$ò[¦óIhhè¬Y³þ¹ó?#¿ +ŸˆDV’ð‰ð‰Hä·L瓶¶¶¦¦¦çýÁ>á‘ÈJ>>‰ü–é|¢n‡ûû{ߟˆDV’ð‰ð‰Hä·¦Ÿ¼è>‰,&áá‘Èo ŸŒ)á‘èë%|"|"ù-á“1%|"ù¡înmxøË­ð‰ð‰Hä·„OÆ”ð‰HôwUS£%$h}}_J„O„OD"¿%|2¦„OD¢‰«´T‹ŽÖÊÊ´ÍíþR.|"|"ù-á“1%|"MD¿ý¦•—k?ü ÕÔŒÞ~÷öóÏ_j…O„OD"¿%|2¦„OD¢‰(2RKJÒŠŠ4‡cô6.N{ùòK­ð‰ð‰Hä·¦-Ÿ` ---ú-×<¢Ü)|"«wï´Š +íÖ-mÝ:mÏmþ|íÇGËÉá§ð‰Hô-4 +ù¤¹¹¹µµµªªª¡¡AÑXRYY™žž^PP@¡ð‰Hä­®®Q ¹ySKLÔ¢£µÔÔÑ[~¿ÿ>ZÛܬ}ÿ½V\¬…„hn÷—^–çý˜£pÔ­ð‰H4A + ”––ÆÄÄìÞ½»¾¾~ddD¯š†|âr¹®\¹2cÆŒ’’œ\éè舌Œ´ÙlÂ'"r¹þË~¹Æ4•¦q|ç“1ñãlÌ~Ú`61ÃîΨÉ$Þ™ÄuW] @”1절ȭ t*`¡Œ(rY.‚”Ë”B°•{;‚…R„á´¥‹Â",#0#èâÈÙç¥,šYv¼µ8}~y?œ§çœ·/çðþû{ˆ~TV2DHÒÓI©VÿÒ-ÍÍLh(óàÁ‹O¸í'MMMà!p Õj333¡ÁÒ`0 Ÿ Èë6’””” í +ÃÐzý¶mÛà'xù¬ +ú ¤e||ü† +”Jeoo¯¹ +V©T r&“ ŒÅì'ËËC~NÁC`ÄÅ-áó™ÚZR~ÿýkÝ>>ÎÓÓKB"!9sf©œšzû9a£™7Ž§§gaa!÷ü üÚ'''‰DÒÖÖæââ2<< a[SS¥ÙO¼½½-öž„‹LNNÂo±»Ï;»©ÑÑøÌ̽{ö,Ÿ…Íe;~BQü¥QQQR©488¸¼¼ü¤§§§ªª +:hô¡!‚ä?Q©TŽŽŽ§äaáÍ!ˆ5™›#"•-qå +))Ê3§§§›7ŽƒƒtÜó37nÜ + +ÊÎÎÖjµGU*•YYY:"F£Ñ?~ÜOA¸ ¸þoíìö}øáßoݺóôiª¯oÞåËËg¡»‰ŽŽ¶?Ü€žnçÎÎÎΛ7o†üìïïEimmU«Õ ! 0„„?\åóù,¼0±I„D$"Ç}}VüƘ˜耸ê'wïÞ + ?ŽfË–-§OŸ–Éd^^^&5»víòóóƒœioo·âSFµIË͛އÿáƒ✶ääôž?/ݺU_V¦R©Ì +ÎîÝ»ãããmÄOhšniiÀ,((ؾ}{BB´9Ðõ@$òòò}|| mÀO +ÅòòdMÓÚJT$7—h …‚”4mõï +…°­¸ê'›f?éììܳgF£uuu…Hikksqq©­­…žhllÌêÏAÖCCC<^ev¶ï'ŸüúèÑ_ùûËBCÃ>ÿ\æ_¿HHHHll¬ø B–ÝM]]48Z­¶¼¼¼··Å¥K—Äb1EQpÙOx<{oAÞž†b ))ÄF‚ƒ™êjR ¼ïeDFFrØONœ8‘‘‘©òå—_Bz€«xyy©ÕjH˜ææfooï÷ýÄdÕ322"‘Hò¤Ò–®®¢ðð2__—ÁÁM““¿¹paÃgŸåwv._ —‰D"Ûñ“¥%Q8Iww7 $ ” $ý‹èõz¸ýY‹ôõ©¨`ˆ™df’²±‘µõpÛOŒFcLLŒL&3™LÐݸ¹¹yxx¤¤¤Ð‹€Ÿ€´<{öŒµ§ «§OŸ¦¥¥………uôöFøûGüqá7ßÔ>|x†aRõú„3gŒÃòŹ¹¹6è'¯ýYP1âbb#0¤RRjµl/ë¿pÛOÌ} +t4p`0Ì +ô;p +zôù + + +)©©·nß¾¦T +íí ‚ÜÇÍ:¢`˜æÿ¹ýdEÐOÕÉì,1"¹œww³½¬ÿ·ýä@?A—yôèQbRR“FÓRYqê/ ëÁêUw¡Ÿ¬ú ²Úèè *rù2Ñ……¤\å¿~è'è'b4ÅbqIY™ž¢.îÚxölÔÄÄÄk܈~²"è'ë´´ÉÎ^’ÒRR l/ëM@?A?Alœ«W¯^ÊÌÔµ¶æ;;ÿÉÕõo4=þÚ÷¢Ÿ¬ú ÂCCÄCT*Ø#DK’’H ca핽9è'è'ˆ-Óßß!!aþñcYUÕŸwîÌ1uor;úÉŠ Ÿ ïÞ^¢å匿?±˜” +Û˲è'è'ˆm266Æ )ÈÏ¿•Ÿ¿ÿ~gŠºõæ“ Ÿ¬ú bmæ戇Àˆ%Z"0ׯ“rb‚í•YôôÄyþü¹X,V\¹ÒÝÙyÜËë/7ßjô“A?A¬M‰Œ$B"-ùÉ?°½,«~‚~‚Ø`&’¼¼ @ßÑñWàw))WúiêmgC?YôÄ‚€˜U$:š˜‰BAŽÁU8ú ú bSÜlo¿xñbGNÎù¬¬Mß~qÿþ»Ì†~²"è'È»01A äúuF B»ä'ssl¯ìý‚~‚~‚Øÿ0™N}õ•*11G*uÞ»—g2½ûœè'+‚~‚¼÷îýP*ø—!IN&eCÛËbôô„óüsh(;?¿°²òÇ¢¢{û#:Ý¿-43úÉŠ Ÿ ¯ÃÂñIIDKàßù»ïH94ÄöÊVè'è'·™{ò$)-Ú\Zšû駩© ?ô“— ¥iš¢(ôdEfg—„$&†IxøR99ÉöÊV%è'è'‡©S«SÏž¥u:Å‘#i|~÷½{–ýdi‘ÕÓÓÓÔÔÔÚÚ +Ù‚~‚üŒÎNâ!—/-Pvt°½¬Õ +ú ú ÂUÚ)*ä믛}|Âù|ŸÀÀ +4iè'f B¯]»¶nݺââb£Ñˆ~‚LOI„¤´” l/kM~‚~‚pyYYmHHrAÁ1¯¹®ŽYX°Æ· Ÿ˜MOO_¿~½\.‡c³Ÿ,/±)´Z¢"R)Ñ%%¤|þœíe­A„B!ú Û/A,ÉssU¥¥qaaE;&kl´Þw¡Ÿz½¾¦¦ÆßßßÏÏO&“™ý¤¢¢ÂÝݽ~‘™™ë½„u`‡dd `**HÙ×Çö²Ö ãããóóó]]]æãééYXXÈa?? +Òƒ¢–¾rÃ`0@‰~‚p’»wîĉ""~ïë›\Rò¯ÁA NÞÕÅ„‡34ýâôþüsçÎeee…™ýD¥R9::žZdxxØ‚oY% ©®f‚ƒ‰™¤¥‘²¡íe­Y4 +ì ©©)±XlÞ8r¹œ«~)ÑÔÔ6%˜‰V«U«Õ4M£Ÿ ÜCGÓù_|áãîþG‰Ä+!áÉì¬'¿qƒ‰˜­[™ÖÖ¢Ÿ@ª@®:99:tÈÞÞRÎì'«|>ß‚Ïa0s0…‚ØŒÜ\R¾¼·£ººlD©T>|øþýûËŸÇÄÄH$Nú äFAA]vv¶ÉdÒëõEmܸ1**j``ýá Sâçwlß¾ + +Üâãu--œ&KNfJK™ùy&5•ˆÊ2è'@WW$ÌÈÈÄiyyùE +dzà[@Þ?ííÄ@d²%!)*"¥NÇö²8Dccchhh}}ýôô4”°e—Ïþ‡ýr}jêÚø_á÷Ží Ó¹ãíèxýà‡Öq +ƒh[gj©: åÆ<à"1FA „ +#B1 aÊcäM†„Ïð +  +0(‚NLEXwmÆÇÕš^Saÿæ ³÷Ù³Ã>gíߊ‹‹“Ëå^é'ˆZ­ŽŒŒÌÉÉÂzòäI__ß´´4,£Ÿ`ÖPÜšI™@°'"⥥ÿ.,,/,·*wYÄÄ€J““¤*½æ' +…"!!a“û ÒÓÓc±XT*•Á`ÀØBýd£ƒÒØ'N-IN&Z‚ׂ§—åuäåå?~\©T2ŸvTTÔæñ›Í†!ýdttÔh4r¹\üùN?ÁHrðàÁ††”·I&øR( +u{ûWûö…(û‹‹¹|þœ»ßd«vï†O?…¤$RMMÆƬ×VˆŽŽNII¡~€Q¥«« ÔO6z=1¹œ ^J%©Rþ&fgg1zœ;w.66Öd2íÝ»÷ôéÓãããB¡ðæÍ›ÎnÞí'6y<^nn.ŠJXXXpp0*Jxx8f:˜ïP?¡lhúÍæ _|q´²ò˜É”ôóÏ££îl d2àr¡© L&((€’`± µ•úÉ{ ~²Q°Û‰‡ÔןO´D,&U¼=½2/åÉ“'7d2›Í–J¥mmmè*111Á+ØqK^àõ~ÂápÐO†‡‡ýýýwíÚµgϳÙÜ×××ÜÜŒ®âÁ¢Pþ?ÅƆ…„œ1löµ«WÝ;½Ã"ÄÄ€Z½zgfâãaûvÐé^vS( ÔOÞ€úɺex˜èGu5DF!ÉÎ&UÆÓËòvÐIJKKÑI’’’°lµZ™û‡ƒÏç«T*,›ÚÚ°Cç‹o¼ÝO†††Îœ9STT„?ebb"//uÿ9ÝÝÝ7nÜ + +]¤¢LÙX<~|!99ñĉ$Žÿ믕ÅÅî¾½$àp`jê-­³³ðèÑËêÅ‹©Ÿ¼õ“õ†yô¼Äb¢%|>ÔדªÝîé•y;xì2f‚²f‚ŸÆ«­‰DßÒ2‘À ×‹q‡^àÝ~ÒÓÓƒb†‚6‚e‹ÅÒ´–©ŸP6(O+*8.„jµB‘H;77çÆÉÕj<ú!) ŒF—úS?y+ÔO<Z4#$ DHNZ­>|èé•mæççQEP-x<^FF†Édr6-,,\[¡ªª +[ƒƒƒwîÜy¥¶ön|<Ü»×ÒÞ¾yüAéêêrV»V`îS?¡l,¯^Í®©áö÷ÖÕåK¥ffÜ8¹V R)”•ÁÓ§ïè¡ÓAGÇ÷ÖØOz{û˜ç;Ã\L•ú Á× +¤¤„‰H´*$‡§—µiÐjµååå|>Ÿq’ÉÉÉÛ·oëõzF“Í^!99™ñƒÁÀŒÊQ*#’“G##•bq@XØÂò²sB¯÷“wAý„²‘Ðh~Q*ÿc³éíö¼´4UCÃÒ+_ñ‡0>r9= +07÷ŽNõõðãÑÑðí·02âlY;?1ëY,–¼@6Њ²Éã2³ ê'›™VU$.Ž˜Ib")zzY›‰û÷ï×ÔÔ…´´´üüü³gÏ¢Ÿ ™ˆD"‡Z‚~Âh‰Åbymäóçw®\‘s8[¶ÈvìhMJZîïw6R?¡~BY×,/ÏŒæõôèò²³ëkkÝ5·É))pì\¿þîN˜ff‚L +44@r2Q™¥%¦q-ý„Ãa§Š’ë¯Ö,qØG™‹Yõ“MÅ;Ä@êê &†‰Tºê'ÏŸ{ze›‰gÏžF‰D²uëV__ß}ûö¡Ÿ™L¦Ñh™ŸŸÿ³)pÏ + +à“Oà»ïàÈ()ÁD ¨ŸP?¡lUååçnÜhPÈå<Ëf³¹ef³™HG~>ܽû¾®Øㇳžèh’švvÂ×_Ã0kì'q±Âêß*ð¹ÔO¼•ÉIçËõÔjr¦?O´$* +jjHutt +×GôÀçèYYY>>>è'þþþ*•J«Õ¢™LOO¿güà Ù¶ª*`± 6ÚÛÁn‘þg õê'”uŠÍ–cµú¶´ÜÆÚ`¦¥µ´´¸eb ò˜xbüÀ91æã •‚Vëò†˜‰èt­àóÏIŽƒ‡„Ãáìâ?©B?ê'ÞFߺ:ˆ‰«îÞ%Ôöíeeäëìôôú6‡ãÚ +µµµÑÑÑQQQ|>_©Tâ_<µƒ‚‚rssM&ÓÄÄ„«3ÎÏ“ý“ˉ“ ~`Ùn{O ,ØûON’jK ˆÅÎFê'ÔO(ë‡Öîî½I˜VÛ10p.=cÅ4f†Ñ©© +jµkFF >¶n€”`ÖóJjÃ@ýä­P?q|¡ÒÓáÔ)ò–J$˜ßOäušòwƒ±…Ñ’Ë—/³Ùl.—+Ôj5ªZÁ¥K—„Bazz:”ÃÃîNŠç)ÚˆBAÌMËããÖ_¯jjV'T ðpg#õê'”uÁÔÔ­'O¾Üù`jJ§Õffd˜1¹ø0®_<$ÑOÚÚ\€OÜ¿ŸÈÉ—_Âìì{»{ÀO~C?Yò Ÿ { ¯ÐÓÓ³ºB³Ùb±X­V¼900ÐIýä¯ÐÔ~~ðñÇ“Cª|>Ü¿ïé5yv»ýÚ Äb1{…ŒŒ ¬jµZ|i™nF£±¨¨(***33Ë®În±Á¤]˽½ï‚ÉRe%°X’€P˜0†'$ÚÛ½¨ŸP?¡x˜{÷îÌÌ +ÿ344K*565e?_ƒ Ň¡Ñ€T +ðì™kÐ`¾ù†˜Ia!.Éŧ¬¹Ÿœ¬®ªÄçzÄOPH0µÄóðáÇR*•}}}xÍ$55ÕÏÏ/00ÏçãMê'®€ÑÙ/Ó§¦®>Žÿ}Õ‘y^´ÓW¾ë ±ÑqtTÀ±èLÇ–Ñ„Md¯E†€ ˆòx @! û’°ˆ a ”ÅȪÈN:•E-#ø{¾'WZZ"& +÷3™Ì¹'çwι7çþÎç$&’Tún¹a—»x‘¾ù†æç<±O¦¦&NE"##9¹}ûö†ŸÌÿõùÂO + + +Ðæúõëø‹Ùª1ž=cËœ$;›•WV,„@xÊÊÈLJ<= ùM«}W?6FYY!EEO±ôzzûv#‚÷ÞOxÆì¬iròÇññ#·n¥ß¹óæåK¹\.‘H†‡‡mîrhÎ@©T´¸hE«h 䊲Cìî'AŪ"¢·ñ“ÞÞÞòòrø‰L&‰D—.]êîî6 ###žžžîîî¨ÏÉÉAnáýÄ"&y{3…Þ¼­Õ×S@-,8nZŸ2‚QUUÀiIvv6ç$[ÛÏÌÌäåå¡Yxx8Ú`y[5ÌÔ³˜%ÌFòË—B::X3üµP¥’6ÿØ‚™¿zå206:ª&z´é'ÞOx?áqíÃÃi:K}½«—WGccYYYBBÂÒÒ’Í./Sd$KuuVÇøùÑôÕW,‡ìø‰~²æ?ŠtuuÁ= !±±±Ðø ²ziiéÑ£GÅbqzzúofÐgRl6<Ò=Ïì,ùûÓ¯¿²åÊcÏž=ãÄ#33“S‘ÀÀÀššÔÔÖÖn¸¼¼Œ6ØôÇnjj²j<­– N>p’¤$Vžž¶ÒßÏšáoFH^+¿}»ñ#*"!:Oô¢¢sDiæÊÍ~wŠ÷{ÒIt—è²Á &ÆDZßÕãôh+­­Í¤33Ö +Qx8?N!!48hó¸v÷“à•ã:ÄO:Ìy‚cǎݺu r‚ä)—ËœœßNŸ>kOOüD©Tºººr›È‹/l~Â{ŒÇI,¦ädpôT>A ÇÜŠJLLä´$::š«innÞ>veeÍd2¢bbbP±<¤^O¥¥ì͉˜fŒYA·hÃBd2V^Ya0ë>¥H}DB¢"¸T«9(œèézxѸ›rssÄy?áá±ÏÍ/£ïô´¿OÎݻВ„ÄćÚÜ¡FC¾¾ÌOÚÚ¬ èè 'Èɉ¤Rš›³y\Úg~b07àOž<Ñét'OžÄ%¶ ½^¯ÕjGGGÑàøñãííí¼Ÿlex˜RS))‰zz=•Oµµ5nñTTTøùùq6’››ËUNOO[ÙZæåå!644ÝÝÝ–cºº˜T‘@@……,¿X¤®Ž…À;á$ +ÏÏϯ I¸ÙFÂ×/ÿ1Ó‰±BÖ˼Ÿð~Âcwæ‰JeØððÿäò‚´´¥¥¥ÿJ¥™™™&“ɶ³³ÉÃÊ˹ŠÀ`œß™Éï¿Û6èfìî'AÅÊ"$o‡ø T2YYY9>>!9qâjŒF#Êuuuó“‚‚‚€€€÷Â{ƒ×¯)*Š._¦?þpôT>nfgg¹­¹°°sŸ’’®òÕ«WÖwµ°°€±Xìíí°å˜Ç™Z\»Æ4£ €•-ÒÐ@J%y{³اZ=b2q’aÖ|òÍ—Û?A´õÞ"""ÒÓÓ÷°ŸÀC:;;QÀw—î’÷{38XôçŸÞþI°—WKss®\žššºººjCgHTùù$±ô`-55ôý÷ôÝwì°³¶fà[q€Ÿ¨é'---W¯^ýá‡\]]ïß¿ÿàÁƒøøx$“°°°³gÏ:;;ggg÷ôôÀOîÝ»wûñ¾«ûæMòô¤éiGOå#§Î:òóó…ëÄÆÆr•m8Jìlgˆ•Édè*** +å§OŸZˆcÏ#3“•-ZæVUEW®@@*Uoc#ô£ÈÃl#³àÓoà +ü•ÐÐÐŒŒŒ½ê'È + + +ðt:ö‚””v@x?á±Ož”¿x!˜˜WT¤'$ öõýÖÕ%‰šššlèL¯Ç±‚üü˜eXK` 8@aa44dÈÛ`w? .Q)0®CüÄ`0 “TVV"¤¥¥AWš›› +…ÑhÄF€J‰D‚6¨çý„Ãd¢Œ JH –GO壡¿¿Ÿ3¬ÎIÂÃÃÕë ØÜó†êà•DÛº…€ÚZf#IIÌLîÞeå… !¬YPÌD_T¤®­…‡Dšµ$ ³–˜l¾-ìa?ÀCÜÝÝsss±$nÞ¼éââræÌ™ÄÄÄ.3¼ŸðØ,¯’ŠŠÔÉÉ;33Ba¹B1?7‡SRoo¯ +½MM±\Gƒuss”•ENNtäˆåä³sìî'AŪ"¢5‡ø  —@6.ñÝÙÙÉU¢Ða>ís?Áº“É(>ž´ZGOÅ¡ÔÕÕqâÌÙ6\®fddäýû_XX@WÉÉÉ^^^ÕÕÕííí𔔇aqVU1Ù@NÙ£‘5»q£^(TËåÉjµpuÕ“Hi¶|^¾ÿm€ädš˜ø[Ý^õd ä +ì‡F +Å^ R©`)XÎÎÎ¥¥¥H ð“ .ìÊ£åáùGjjkûúZ‰*UŽT +3¹víZHHÈüüüN»ÒhèÊŠ‰¡•ëôzrqaZ"•Òóç;ÎJÒÓÓ÷›ŸXÃ~ö“åeºwD"jhpôTìËÔÔ'¹¹¹œŠøûûWVVr•kkk»5ºB‡999"** +åáááí::˜`ÐÅ‹¤PÀ™,12Òþü9lD-4…jµßâb…ÙFÆvë66ƒYýü3EEÑààæê½ê'£££H©©©0è +’†V«ussƒÓÂXšššN:UUU…ÿwÊ¢Còðì„z­6Á`ÐàÖj}/]âr„yvvvGýôõ‘DBB!•–Òë×ÖÅdeÑçŸÓ™3dñ0e+ÜùúúÞ¸qÃŽ~\¢R`¼Ÿ|´³­Æ`pô<ì…ÑhäÞ…äädNK`ì\N§ÛõáÆÇÇ9ÿÁIC`ïÞ®uo/3“ÐP–AîßgeKÌš%D]SÚ×3¹¦×«Í5Ú]»ƒ-<|HôÙgôí·”“Cmü²·ýVéååµá'XH‘‘‘"‘¨ËLkkëÁƒþëæææ÷øyöÓÓ=ãã''ËM¦¤¸8­NWVV†•ÖÖÖ¶£ž––è—_Ø»[_o]Îh +}ý5}ùåæ×|×)**âRñ¡C‡ ]vô“ bUî“÷“êjúé'jltô<>$VP]]ȽYYYœŒ} A‘HпT*Åpqqqz½þ_›¾yÃ$D&cB‚Ov6»\Yù·ækœÅ÷ôÛÚ„D±ë5«äVÌÀ©0+•Š¼¼èüyúâ :wnú Ò¦‡‡GJJÊÿÙ/Û¦¦®-Ž_öôE§Ô:Ž3k§úÂ*Z Œ–§ŒaàR4D@H#h” #&áª<#*¡ÈPn/¥$A°îŸsèU9†< žÿœÉì³²÷^ë$û¬õ[”œ¨ššð'¾®tttDô%I +žÆˆ~š™)Ÿ™ñÎÍ©RRP»ív{aaá;w>jd ÌLB}›·`x˜Í>tˆ”J + òÀTVV†>.ì|²&ñÉ®ÒÚá€k4쌼Çär¹x©¯¯$à³®®Ž7Bçzii .€@pŠd‚ñÄÄÄ–³Qô«ª–dd°1®……M'úÖ!Äè÷ÇÙlqÝÝÅ¿ýfËÍ…e$DO=|(Duñ" 2)‰¬Vjm%‡ƒqjñ… ôûïo¯ØÛ|2::zæÌT‡ñññÔÔÔ¨¨¨ëׯ—””€UîÝ»wòäÉÐý’>7¡«¹LTIä%*¿ySý:ÎXbbbvvöëׯEn‚TßÒB +Ëö==âÖÌÍÑwßÑþý¬oòzŽ?ݸq####Œ|¢´˜êàWâ“Ý£¶6ÊΦúzZ^Žt(;–Ïçã©Ãh4Æq’Ëåf³™7þmCX4==]YY ïiiið‹ã´åÔöv2™(&†éî]êîÞtÖG#è‘’ˆâˆÔmm6ðULLWJ +†-V®W¯Al ŒFp‚q~~“%Z-MMm°ím>„477;Œ +ƒ^¯×étøü‡ONœ8ñæÍ› ÿ5’>?áõÎ#*!ú/‘¥¦&.6¶³³ÝV~~þ+¼ª¢…f©¾®ŽVWÅ-¸Ÿ~ü‘¾ù†nß,ò +À^>I5××ù%>Ù%êï§Ó§Ù‰ý¤566ƪ!%J¥’·´¿Â(Ç§È +…ƒ¾¾¾-§º\d±P|<ÉåÔÐ@›±Ó‡%¸ +9,‘™œN›Åâ–ɇ³©‰<òtu1)/˜$)‰¬VKÐz}@ÏŸÓ{MÜÞæ“žž$ŠÁÁA Ün7²(>‡‡‡ñ§÷÷÷K|")(š!Ri¸ñØÐP¶FÓÑÑQQQ,‡#'r´è@ccE§z ÒË×_38ÙöÝ™$>ÙTŸŸ¸Ýtæ  ‘Žãã…Ž•g´´4žFŠ‹‹y +DøãY^^†kƒÁ€H4 +Æããã›Ìóx„BŸšÊ2Em-ëgÞUG#åà2ð|ÒÛ;…U@…Ÿ~bù%Xĵ¸(Äc63FâÄhd–G‚âaoóÉ$ñ‰¤ËC”H”I„3䞎—Éð6ù|¾œœœ¢§“ÒÒ(%…ìvq €"--ôŤRѦy,Œ +;Ÿ(-&pŸDV8´99 NP3? !ÏóÒØØxîÜ9Kªªªxãììl¤ƒ÷ÊÊJ“™™‰ñÈÈÈ&“^¾dE_¯ ºšÝ¾%;Ï!DJKþµ~»04Äfž?ÏVÕÔlX¸º»ÙV·n ñ$&Ò;«øýÁqÁIâ‰O$¦§DD¿MâfuU§Õ¢êèè¸víÞ©5P„MNRL ååÑÀ€8¯ÿÍÒÔôÃ4?xôARØù$Õlª%‰O"'pwn.ݼI33‘ek¡ÊóàóÉ£ˆJ¥â-xC#¡…A$ùùùr¹˜M&¡Ð£ÜWT0ÈÊbãutY]Ç +G#?5­[ gÁdµš-Ab¼¼x¬KKxX,¤P@rû6³ˆÍYKâ‰O$}¬ž鈮=&Ö˜étñññÇjµ"çôõõ‰Ù¤¥…P¾._ÚˆóêrÑáÃôí·TZJ^oàÑUà“zð‰_â“ð ç ]\Ì zWÉn·óìrÆÓˆ^¯ç-£££‘ŽN + +â)++Cxjµãq€Äûjm¥ÚZÖ´¤¤0à’‰“c=G#¸Î¯ÓˆçŸUv;›¬Õ2x¸z•}¾mogËu:EÒÓ>q:Üp’øDâIâ5…ŠL”‡\ÍÝÎ{‘øD’H-å£2ýÉÝ?}ªÕjÍf³×ë½té+ÛÇË—të]ºDâ\âpZ­E_}EÃÃ; ?$ +;Ÿ¤šMµ´ûø¤¯¯o€½{‹OæçI©d׋¡r166f0P¾³²²>|¸áÛ……ž:êëë0M&“ÕÕÕñF§Óª°v¦ùùy„WPP —ËïÞ½ÛÝݽq@PXÈx ¸˜=¤ÃüÈàh—–£ûû[wu±´ŒÌNÄf“uŽxö¸z•¹Æ•ž.XŽŸ64’øDâIbÔBtèéúmee%ऽ½]¥R¡@¿Ø.w»\,$'³vG”ü~–|¢Œ Ö[íVE€OêÁ'þÝÆ'7§ÁÁÁÞ=Ä'##¤ÕRA=~B//^Œ‰‰immÕëõGåSSS<ðè%''[­VXZZZBÍŽµ¸¸ˆ KJJ³F£qáåß ŸïÿxPXø³gg +ëXr‹Ã\ÿyë¶05•%‡ÚZjmýˆ°–—Q«,ÉÍ,ýý;xÜJâ‰O$m«¢h" 7ö//£ËÉÉñz½F£Q§Ó ‰o-œ/$€„º|Ytøë/ª¨ ¨(`P»Ö`(ì|¢4›êàw÷ð 2IWW0õرcGŽA1}ôèÑà“?þ ¢"ÊÏyíêììDÇàÙ³g‡ãøñãDe/,,äùdhh(´I“““åååˆ<==a£ª¾ó5ŸÊÊÜqq6µÚd³%Œó@bähdˇe ³²Q”—³ñêêöѸÝ{ 4’–&X@GŸˆ$>‘øDÒä&:MT¾~‹¤V«ÛÛÛN'©õÃË›› ©×b¡µ5qþ°á‘#ŒLªªvvØv>I5›j‰ÖvŸ€Fš››“““KKKsss£££‘[>u>YY¡ìl’Ëif&ä¾ + +úúú²²²äry^^ÞáÇQߧ¦¦Bî;Hš››CÀHgÏžÅ```௻º@oª«m “Œ µÍçv'Y9,Áµen˜œd8tQZÊÆ‹‹Û„Âùb—Z-`INŽ`éí +£†WŸH|"i+9‰rˆÊˆ|ÜmOw7’'òÇã‘Édz½Þï÷oµÖã!£‘bb¨¡A´?—‹¾ü’ »]4ÐDXà“zð‰÷ðI/—LB+**p<x>©®®NJJŠì¿˜t:Š¥éépøš˜˜(**Ú·oŸJ¥ZátêÔ©'Ož„Ã÷δ´´„T(‹‹ËÎÎn³Ùþ|þ?öËô§©­ ãÿÉ›ÈMüp“÷½_îp'#™ÄÄX…Â¥ÈehBDDÊP™Š2•A®"-T†–©Š\("(2)" ÖûœD¯8µ…Vû¤iv÷9{¯³wÏ~Öo¿¹l25--12™>/Œ,‘‘Á¢Ej*ÛžýàÍ&Ó{\¼¸A#0®gáqìB§OŸÎÎÎvð‰C½­6"QÑfù(—Ë$Ž”––ö2yú”$ + £ÆF~ÁP¬ÖÖ²Þ‚ÄpïÞ×?üvjÛùDR©,C\›âƒÁ`4E"‘³³³T*E|R^^îêêʘõï„=¹Q¡ „jmÝŽpííí111xâÚššpÄ°‡9\¶ <þSà(ûlttÌܽ»yõ¾BªÊÊ=™$–t}rÞ¥%–+.]b­@&cÛ￳³sB¤Ò +,‰‹Ûè±í­ã)œ)îàxzz8øÄ!‡65IäG”HôÊüsaa¡°°055 +¤c??¿‰ùŒ*-RRèÎ~Á¦¦Ø*iß>ºvÍKŸèÍf Béµ³³Óîødq‘._f³œFcõX8G¥¥¥>>>¹¹¹£££\çòò26j``Àêá¿Tsssx™,( Lr×hD'h HE©Õ +ûû…DéfáYšÐú: Øz0FTÛÞZ¡ÀS8öàП+W6z”ߢôöÌ'ï“Éd‚'tuñÛÁ'mÕ QÑY¢•×=ƒA*•¶˜‹“ò¡±p ŠÇ~Á9……ôÇTTD6Ÿ¿>¤mçqEù5¤Ûá£ÑXWW’““/8\¹råJ``àÎþ;|ôò%‹Æ “†«Ç‚冇‡K$’ÆF¾ |gõbu(R¬P …Ri½Zýð¡Î $aB†‰ÎÏg„B¦¸xU«¥þ~¾óªÕTVFÞÞ$³ûÞÓóæRSÓ{„‡oÐÈÅ‹=&“5ÖhËŠˆˆÀ±²>ÁÁïèèØ»w¯‹‹ j—×rwwß³g^{P +ÿ©|âЦž……={݃Ê%^QQÑüü|RRÒÍóçÏß;6=üü¨¶–ÖÖøkm¥à`:}šmع¶O$•Ê2ĵ>áL i×ÃÃãСC +…ÄÂñI@@ÀŽþ9ŸÖØåç“@@:u½|ù²¦¦Æ××799ûcÝ`Ñú:Ȥ´¸X,žŠJV©R‡‡%!Dþz½_MMYh(Ȥ/:š%‡¾>¾Ó67Se%‰DDuuÔÛ»Ñ?:ÊBËõë„w†Ã’¿ÿÞÀ’ÙY+-ÑöuêÔ)ûâ­V{øðጌŒ¬¬,|§¥¥¥§§ggg£~‹Å>qè „²$•(…èŸ×=ËËË0RÀ‰F£Ák–——÷Þ ¤PPB[ôðÒÊ +ëN¿üÂÖDwïZäáwVߟtuuÁáÿzúûûqõ“3H¸!===ÜOç“©)ÊÉ!™Ìêdx‹ÅV0Hµ6¯¥……6†‘œ?¿[$ +R©BŒF1Q0QÁà J¥ÒFF¾!þêŠˆ ª¯g«’¶6vßщ"…£¹œ“¯|/²/>ŒfÉåòÌÌÌ––ˆN§Ã›ß××OØê$àƒÁ€¾»Íâ~:øÄ!h˜(“è¼RyûÁ®g}}ýæÍ›R©tvvöúõë)))È8[ÂHÂÃI"!†_¤/¨ªŠ\\è̺ßRÏ¿ãÚv>W”_#Z³,ŸÀ***`)\½Ã m iii)®~r†wìÅöùùÐÛ›ÆƬ¥¾¾>000::Zgm új­.-!‘Äää8ùúþG&ûo{;È$ž¨atT­V?9{–¥ˆÂB–"^½â;i? !çΑXLÅÅLj5ݺłŠ¿?ùúRI ;!>[sqö*{äX¢‹‹‹››Û¹s熆†”J¥X,F™äØz?–†ünÁ@®ÀéííÕ;øÄ! ^ ÿùù©ÁAZ\ä:½@«ÕNOOŸ9sß[‚/Nœ äd2ùEšœ$…‚||¨¢‚ž=³Ü +v^;À'JËó \ÂÛÛ;***++ L8‘›wôèQÈçNhË|‚7ñøq°b¸1¶Q(‚ðWVV¬éëô +˜’Ë—…¾¾.11ÿkl¼11ÑF4¥Õ² &Éž<á;é£GÔÖÆŽýé':r„‚‚X8Á'*ŠeLÅ·¤qÈÎøPÑØظÿ~<ððð°B¡ + +ÊÎÎFBxl½L‚KEEE&“ ÕG5III\¥ãà“ïVëD)##™™‰¡!šŸç:ñ¶\¸p¡¼¼|nnE_bbâêêê;á."%%ÑÚ¿H0«}ûè×_©¼Ü¢+°m;ŸH*•eˆkY>1 ÕÕÕpŒa³Põqvv6š÷ˆ‰‰ñôôôòò¼s3nÈÏÏßµk×¥K—0ÑQ¡>BA¤V«1ÖÁ'ߧfˆò‰F{çÎfçüü¼X,ŽŽŽF#ˬ±±±·GMO³ÞÓ*( ñq~‘nߦÄDúí7ºuË’ °%m;Ÿˆ+”׈Ö,Ë'z³·ÀrssJJJ8c„‡ ÿ f³5>yñ‚d‰Zm­ º‚‚¤{ìÞ4N‹- ‹Öå ž?wb§Ü\§?ÿôJLìÁ …z{©¦†É×—…“ææϘ7_½J?þÈ–!?ü@¿ÿÎv@ŽNg¥|_²/>Ñ›©#999##–800011ü@fyïT*•¿¿¿\.×ét®®®ÝÝÝ}}}îî` æرc;ý8´}Z$ºLßÜ|«³s³syy¹´´T&“L`­ÞÞÞ###oZX à`Šˆ@aÈ/ÌÊ +UW³eTf&™L]Í ))22rÛùdÝâ|¢7{‹@ ÈËËóóó©Âººº ÃLek|R[K^^ÔÒb­ù±QR©T$1 c­Ÿ¯>¢z¢J¢"ïW¯3̉‚É©´­µõáÌ +RC‰Åtâ püé +ø¡R±Çü¯¿Øݽ›22X,éï·æ‚¾;ÙŸôôô´´´ÔÕÕµµµ¥¥¥=¸oÔ>[o…Ep|âææ¦7[‡‡Guu5 ¤µµõàÁƒ5558Sàœþ+²º®NN +ÆÇãã49¹ÙyãÆãÇß»w¯D\\\Ó¿)~sáûù ãIIa‹)¥’-÷ì¶%“ÉĘuòäI¤òmäI¥² `%>ñù?ûåöÔÔµÇñNúWô©3}<ž™3>œÎ8Ž£mñœQè Œˆ !ˆ"†àD`Àp‘Kä*‚Iä" ‘€%”E$HT @ÑRAÂ]¹(|Ïoí'Þz³ÌwödvÖúå·öÚYë»>¿ÀÀ¸¸¸€€€’’ò«À'Ä$t~Ÿ8BóóóJ¥’^‰´ƒ2†Ý¢-MlD +B€P@IõÈÔT¬V›Ÿž#·èõ¿RéAVO/%!ÁÁ(-ÕúúÿIM4B?©ªÂîÝøê+|ÿ=¾þr9c·)—ã“{¢477{{{_¾|™Ø#??_­Vwuu½I¶lá“ÇSŒÉdòòòÒh4n>ù¤TóüùÑÁÁv‚«q HšššÌf³@ “áXµºŠúz…HKCw·}cPf™ ¬››ã{-mŸˆ«••Àš#øäÁƒ„( +…‚Ì0µ‹ÓÖRýøÄ`€Ÿ;T!z?QQQ"‘H·Mgô2G#t©9@3ÐA]/_êµÚJ…"ôäÉ‹¹¹Zípa!4„„0&¡{b’ÅÅç™a½ + +¬¾ ƒXŒýûÙÍž=Ø»uuäÎœæ'.Wä2 +âªq,|BR©T-ïG øûû_ºt‰œ‡FÏÎÎ&˜ñññill4---¾¾¾Ûý¸åXÝ’ÚçÏA¥“Uëëë´håOLLÜÒ½íOjk!‘ ¦Æî1¨¶ + +E|<«³>1]¹r%&&Æ©|¢">YwŸ”””K·”––Þ¿k©¶Ošš”„òr,,ðœyuuµ¾¾^(¦¥¥Ñã9»2pXRÂ1 ]§[AÒsê[[k×jËËÊBBB$RiCSÓ@N«4NŸFt4ºˆ@Þ×ãǽEE c(þÂZÜŒLöíc_ WZ[YÝâ–åŠ|B›¢³³S,{yyâ”””d2™Þìíí=þ¼\.§r/++‹"===i[Y*#â“#GŽ¼zõj»ÿ·¥qàÇ'K6“““2™L*•.,,Ó&&&ŽŽ>µváúu0D±Wؽ›e6üóéˆÎqçòI„ZUEã:‚O¨Æ‰„ ‹ªžââbWä:ESR P`zšÿäuuuô~j6Áî›P0ô^ãcŽFè*°Éuîk—M̬٬ÓéÒ33OFFjïÜéÊÊb|Ϊï&Ý ‘Š + +b(ÒÒ½~ã*.f?ÏÍ…Nç÷è–}rE>!´ ÕxôèQº&{$bùÀÐÙÝPeÔÇÉh4Þã ÇÍ';Xf ¬·7fyùÅÛíz½þÂ… tîLMMцì l47#"‘‘Ì¥ìÒË—P«™¹åçã?ø~|—‘ÓùD\­¬ÖÁ'ä íííãããä*ƒƒƒäµ]|24„ãÇ‘—Çf³Ù|ãÆ€€€ÚM°ûæDì1`½_·bIŠK$Ö[¿~¹°Ð¨Ó]V(bqr^ÞŒ ´µ!:ÁÁ ˆº}û­¨‚°`IQÛ¹tÑž'¡Í¿¼ÌˆLÊÊ‚ÌLVwŒŽ:h¦nÙ)Wä²úôòò¢bG&“Q¥£R©B>l)‚賋“å«›Ov°™À¥òòþ™Ûö¹¹¹„„Z=JOOW*«,í¿ýPÕõð¡}À? ã#ÁOÇÇK92‰âÈä×ðpDE!7¸{—E˜ÍDTŒ:®^ÝÀ’’’ +,+ÅTU±bê54A·¶,×å“ÒÒR:hd2YYYY]]›OÜZâNÎÎNö÷cqѶ‹h633“þq¥R™’’¼¼<73ƒââ +÷³o2@‰AAvÿ`çËé|"®VU‚o>!<~üxlllAAAžU4µ¤¤$ŸîîîÍ&tŸôô #ƒöÀŸi;::N:ÕÐÐÀg^MZ@ +2®²8GuíâÑQ#ÛÈÅ¥%­NWPY) Kòðh‹ŽFl,cÂ2Ú’z=nßF|óÚè>p p|BdæO +î\XØâü¼%lemÈD®Ñ""$?ü ŒüñGää@&CJ +#“Š +FÁÁ¬Ø°`ÉÇj +®­ý#Ä0*ZZ45·x”+òÉ=Î +žÙ1 +‹·néûúÞéKLLÔjZ[É̼x÷nãÐ+°üý7:’’pý:––ø}ò §óIDµªŠÆå—O y`ßÛ¢2ê}FàQWW—•••ŸŸÿ€µ–ЙN-Ô~íÚ5jt4Ÿ¼x˜„…Álæ-'=3=PPF£YYYá-¯UO- á°„6ì;{µ¢¶Öã»ïêkjŽô + +U´¶ +<=ÿ»w¯6&ÆøÅص‹qØþý‹!!7ŒFL¦?Ÿ‹‰Š‚@€òrvï–KÉù¤»»[¯×S½c©q¼½½oÞ¼I5ŽÅ+ì”›Ov€¦©àRtºÖ®®wº&''Ïœ9?55)“åÊdOé¸J™iÙ¥ÁA"0••˜žæûÙwˆœÎ'âjU%°Î/Ÿ¼‘ÆŸØ™ Ý"‘H&“÷ +ò"‚–ÁÁA¡PxìØ1…Báh>!p X>qããü$\]]­­­%,‘J¥===ü$µÑ}KB¨‚ànÞá)²ßúŸ>#µˆD†S§®=»ëË/Ï}þyÛgŸáÛoñÍ7øÛÿØ/Û˜¦Î6ŽÏeɾì»öÁ„dÉ’åYöâËÝÌ–Íeâ0Š +N\6*´uÖQ^‡")”Ê„ +èS m +¥¥PÅhy±•RÁÂ*­Ånd€ ¾¸žë´3SD[é-œNšÓsß÷u®û>çþŸßõP«Áh$Ê„<߯·—à.—`‘ˆ8¿wôIQZùŸ˜L&ÜMXÚ8Ûí---jµíÅË8ŸøµÆ¤éF£kVÓø¸T*ÍÈȸsgÜb9ŸšÊáó¯äæBM×ÑûûáóÏ!- +L&rÓ^|z |RŽ|2ý"øIÃjµ¢>Rðz}}}uuuooocccPPP»Kmmm,«ªªêÖ­[6› +ã¸ù„Íf“»Ú¸àpü8i/&š'²N—ÉdÃÃÞ<¬. I`ã½æêƒt”“ŸŸÈá(cc®X‘þÖ[;^{­í72‰‡ÖVâðRZ-A#¸:H&q~û6y³¡ô”˜˜èG|‚V`0BBBrrrN<"@€EMLL šƒ÷¡(>ñ_)FFhN§ýÇU^^qíšýÆ®àà=ß}W:סÍf¢øúì3ônrs^”Zp>‰­T*ð¾/‚O:;;£££ñc]XXˆÅÎÕ«W±šUò´¹„×% F³X,hžEEEèo[¶l‹ÅÈ'ønÛ¶MãÒØؘë<4"dd€Áàë#sK«Õ">¥¤¤Ÿ |… ª\Lò?ŸÜ{zÏìÐÐÀüä“ýË–m~óͲ·ß†­[lÚtóÊoo¦×ƒR ‘‘€(ˆ2É1 J/S¸ÑÜgçθÑü…O.ºüÝ ÷qñù|¤´”Yfò Q|⧪™˜ø±³³9+ œÎYMÈ®ii\,lÇÆúsrø~(ÁZÊÛòk|Éèt¢ò²ÛIO{±jÁù$¦B)˜~|‚î!—Ë“’’QâââN:…®‚†ƒ^ñh7Ä“ÉÄb±Ð9EðoEE: z<¡û#ŸTUU­ZµŠáÒõë×}\g¡öì!çÅ)++Ã9b‡ƒ„ˆePˆÄ +oôÌÎŽŽI$Ì +d«VÝŒ‰iON>& +ÚñÁCÞÜ AM¥‚}ûˆOš›É˜¥WBÙÙÙî³råÊ’’?âT÷\²Ùlè f³·±)>ñ;aµU +ÀU(ª+*f®^Õ:00Àd2óóOLL FD8ÄçÿÝ×ç]èÞ^8y ¨¬„ÉIÒ3_ÄzI| À'"‘(55u÷îÝ‹åŸLÌf¤‘ššš¨¨(„a»ÝŽôbµZ›ššêêêB°Ã¦M›Z[[Ñ‹ÐW£££}_a™ h4èèð= ã%$$ÄÆÆêt:Â=T-@ @ã©sÓ©Ñjc“““›qÓ +þÛöë¯õ*Uôáã##s¾t 4ˆ‹#¶jYhµ$Í€Ò+ª#GŽ`™à_|â:Ã¥‡šUàx#ŠOüKuéÕÕ奥÷{zžlU«ÕAöää¸N÷[HHjJÊ·+Öðé§PWGnÂKD Ì'‰ ± +¹Ìá¸F ÿÑ}¸Ó …O=<¸wïÞÓ§Ok4§Ói4###ÑjÜÐj=‚ƒƒCCCÅb1vP©Tµµµ‡ +…<F£¡· Ÿ”––²Ùl_Ööî]Ë!=êë}}LSSS¸Gà³²²:Ha—”Ȉ8O5€G'mhnæ„…1ÂÃ…b±M¯‡ééÇšÇÆðçÆ­[÷ïߟ=òòe‚L’’2‘J‰sJK@‰‰‰¸­ü‘Op—Ùl¶—Ð +°ry®áŸø‘Ú§¦hW®(°Újo²µ¶V›™ÉmoÿK¡Ð3™4¹üüíÛÞÅ5!%~þš›ÉMxéhùä—ĸҒâsçjÂÂv¹w¤ð rHWW—D"),,DW,**B—xÔ‘OÁÉ“'ù|¾T*E>Q(V«y¯äåå¡a77Ÿìß¿~«Šž¤R—‹àíëÂ|¸\.‹ÅÒôMŸÀ@b–(tôôô54ˆtz‰\>8ç^³ÛA,†Ÿ~3þçb?Á!ÇŽL‚EžON’2Jþ¢øøx¿ã´t€ììì   uëÖ­Y³&##ãy§@ñ‰_¨{f†ÖÓ#.,„óçŸlÉÏç–”TJ$ +3UZªò*èÄ”–Â_€H}}$g¼Ä´À|’S©Ä¯"ìe2܇; +RøK„Šõëׯ^½šÉdvvv¢Qü›‰ÙŒq²Xuww#„ a¼ŽçÝ.Y,ìé#ŸÔ×Ã?€VëëÓÑjµQQQÉÉɃÁ×X. +à¢'`po˜Í¦ÀÀ´/¿Ü¿yó³ ±„N'¦²{7ôö4’MɉÄùè()ùSò/ù#Ÿ œètºðð𤤤µk×"¥ðx<ŠOŸšŽ¡p¸§¦§gµÚl—OŸÎær‹òóÿÞº5:**ufÆ»ò*- +¾ù""àÁò“^bZx>©PÊñ¾LÝ}¸Ó …OÐX6nܨ×ëwíÚ¥T*i4Zkk+ÈîÝ#ø¤¤¾ý–Àd’þ~3§äïò_>ÁhÅÅÅt:Ãá°ÙlÜ’Ï„â“WY÷²,a~þM$“¹йsÅ‘‘9;v8˜LÓ¾}iSSžƒ: eÚÙ³„R"C Î'±•J¼>AC@”H$™™™2™,88¸   ££c~ÑæÁ'V+ÐhP\ìÓãp8H&YYYh’>èwaI2@¬ë¤Û》A&³¿û®±ä½÷Ê««õ^æ—Ë——KðI_˜Í™écò”‡ü‘OPèƒáÂ… ---b±Ø›üqH·K)>yU5ð_‡ƒ144`·ÃÝ»O´OŸ=ûÛŠ´¯¿¶=Úà@dyùÏA¯_‡¯¾‚uëk^@ÊKZ Î'1J9¾äò‰ÙlF¢ÀY “Ô××Ûl64 +üÊÏ/g/ùdx&\dÝØ<œ9££óF£1%%…Åb +Î? +À H²9mܹ +|ô‘aùòä×_gj‘1¼"Fl6,[ééÄ•ÉIøþ{øýw_ò§´hä¿|b2™Z­®««óXæ¸y&77—Ïç755á_ŠO^A¡1Š24ÃS ª¿ÿÁÚµ'Þ_/•Ž9’©PHFGG<mi6l ¾”ÈÖÂóI¥R÷%—O¬VëÑ£Gƒƒƒ·oßòöËþ§©³ãû+öÓ~Ú2“%[–\LØ´N£K‡àK`TZp¦àVÙƒQ¡ài KA‡Ø–·R)¶hy)¯…@@(& eÅë¹Îé“çQžR-<Àù¦!‡sîû>×}îsÏç{äþ +G>immu`@J>)/‡ØXpu…´4HO‡¬,p˜)&&&òòòØl¶L&{ò䉃£ôX C˜);˜Í ‚›Û3W×¼ï¿çìÚ•sçŽùùsê;éõÏ°Ù“Cð j|n݇x(õõOÖÓfä4 +½^6"‹¹\nww÷jíEªªªüýýÓÒÒ233ýüüi0Ñ|òÿ#L·-–Ë•MM+6˜˜.—ÚÚ7"Qâï¿sŸ=·5âÜ(•‚É䔢imŸD*îæ..¼`‡[Ö2>OŒF£\.Çð‚!#…Ù'77×18i¡â“æf +‚²2ÀëÞÞø aiÉÁçQK „††Þ»woqqѱAI ‰àÜ$A…BccEDD¼`0´Ÿ|"üé',@ÓÒòš²ãü<CXœ> +j5,,¼s Y¥‡úæ´¶6#Ÿà–T©T>>>H˜JKK½¼¼z{{WkœOZÈàƒy§sàÀìì쀀Ä`«{¬U«ñIn.üò ˜LÐÖF³ÙP[»æ‡o2™¤R)–ªP(¦§§X¾NHÎp°$€ÊüÕÕà鉻qiÿþ²¨¨0&óºLÖÚÕE}3ƒpws8DÆ°+hÑzW›”Oðo~~~FFFVVVNNNWW—ö˜Œjjjp; …´´´àà`½^ßÙÙÙØ؈xƒç9N}}ýF/ŶÓ+„€„»wµj5 ,oðð!ìÛ×ýÙgÁ¹ssæÄD~AA&ÇUGlièh"£ÕÔ8±nZJ¥’CjÏž= ëÍ'³“,–¿õg­ç#òI||¼››RJ``àGç~ç##!6Þ¼äd(/_Ãc×ét8f\\z—«†»¢˜d’L’O(; ~`ص ¾ùBBZ‚Ë<Þ¯11ZÜ™”Â6¸K²³áñcª¥Ek3ò ÚˆF£Ù¹s'ò ò†D"),,4«µoooÇ çááÑßßÑãðáÃ*• + +¤¢¢-h£W`› +í1¡¸X•Ÿÿª¯ï½K££PPîîÝ|ùr&?_yùò•™™™•Çzþþüöï&“èLk…éàüùó[ƒO0³Èåò£G2 OOO©TŠVãØP6øÕÞN ¾³ÁÁPYi×sžššÂÚŸd2šØZ—É `àŽ¡ìÐÛ + +À`à>D>é +ÒJ$<>?úÊ•ZÊ(7?*A& hµ`#PТeS›‘O7ª««<èãããëëëïï/ÐVkßÖÖ†íñîB¡0==Û?x𽨲²’Åbmô +lGÕ[,½½*‘ˆh蝹RRà·ßæàs¹33ãJ¥"((¸kYËÿ c’IXØòÑh9[™™™.\Ø|b +,b± ;;Í'ÕÜìøh6øÄ*|Õ## V±-¬êRx°ÖÕÑ(8¹d" V[¨ÕðÕWðå—ðõ×–¼<µB%’É´ååó6d6ÃíÛ–DEN·ÖRiÑZ®ÍÈ'(D”¡¡¡ÁÁÁ«W¯Úàæ ºº:ä“ÔÔTdü¡-( àÕ«W½ÛHKK'ûúä¬ †÷.¡5²Ùø½ÃÔ¥‹ã'&ží UUU+5< qqpø0”•Áâ¢ÓK§µ’$Éà4¹\Ž8ÓA—@K + +žŸ;v€›nÅFƒ!N,æòxºòrŠ¾ÝÝ Õb¢€˜¨«³¿NZ´(µéøÄh4Ö××ãÎåóùL&ÓÅÅOöôôP&ÖÖÖvRx€ÿÒ|²Îzôèfv6TW¿}Þb![X(•0;;™œÌ×hîÍÎÎ!Iâ›966¶ÂXÂÁƒÀ`@a!ØÎtÎ×ââ"¢¯v« ÷×ÒÒÒòéo +>éêê + ‹ÅyÐL0øøûû㬭v±V} Ÿ466ÆÅÅawNg¯7Z€l6@@…}w‚Û· 2ùâ pu%£«Kg0pÏžKLÄ2(ºëõpñ"p8•ö—J‹–=Ú\|beŒ”””'Nðx¼K—.?~¼¿¿ß¡ùd=…±êjg§L"™è냷>sCC •öVR"Q²B!ŸœœDþ¼qãÆëׯW«¨öí//¨±+:[f³ÙÛÛ›³Õåçç733³|ú[†OŽ;VZZ:44„|‚ÓAÀeÅ(d§· ôÂÕâ(ŸLOO+ +6›-•JM&“½¦H,I8M´QvXX€†ˆ'°L&tt¼èè(ª¬ ãrO‡‡«Õj ƆՄû·¬ "" $„ÿmg´"¢——×Fï~ç*88˜Ëå®8}šOh>qªš®ŽJ8œ‘”xËôž>…ÌL¸~ÚH?½s'G$J®©©IHH¨Ã÷žææ /~ü~þÆÇ×qÂw/**j£«pºðS‹ßîåç·Ÿtww{xx ât„B¡H$ºvíÚÞ½{ +ƒ=ÞÒÙÙ©ÕjSSS±css3z”|‚&Œ#„††RàÁ[zAI  Öž>f3$%ý‡L~ø 雜”äåqN*,BH©´Õ}dnÝ"…\:=7¤õ!ÊÏÏg±XÚ--drÌKoåÖÿjsñ +ã †™LÆçó™L¦‹‹ žÄØ‚¶°¦qþÍ~™ÿ4•µqü™Œ¿Ì/êü 32c4:“’Ñà$Ä1ñVª‚ ˆˆ,²£²È"‹,‘"­²* ¼ L[¶*¢²/BK¡Óð¼ßÛ«‹½-XA}ï7„œ{ι§÷Þóœïóyx>Y +£¦ki ŽŠZøûoÆÙÞëÉŠˆ gg†RˆæŠ‹ ÂÃÃggg‘‚ƒƒáöÆ )•À îyöl=_Á¬Œ¼½½7ú)>»„Bá‹/Vö|‚M,++KHH!ĽW~~>\Âì½UUU0Ò°°0ÜÅÁ'“““ø-pÈùóçÁḬ®®ÆeLL –²d/õXr™ÈKßP˜½alŒüxKþú‹Z[ib#b‰ä”»;/µŽdb"ƒ%¡¡Ô`ñ²ŠîܹsãÆ~ŠÏ«·oߺºº~|¡¢Ÿtuu!‘egg=zI +—«Z„ç“Ï*xßÙööKÑѪøxêïg;gf¨¸˜A ÐJOÓÓ××$•J¢¹¹¹3˜´\2íÙC{÷RE}‘;…PD¢á˜€H‹ŽŽHyÏ8ájhh¨è‹Ô©S§¾a>AuT(òeɽ¬“”——÷÷÷·´´ØØØà?Ë'"‘håCÁhkk &AÃÎÎdŽiyyyc sÑÉu"’V›%;‡”žN?ÿLßÏÀId$ +£n aµúV~>Â2++ëõë×&oÇá‹É×—ùC•¯uøäÚµkÜsûKZ­–{ÚÈÈÈóçÏ­ödÖÓÄÄøü£|âëëûÕñ +PJGGG__V€öªnçùäóé¢k7ΞU\ºD*•¡??Ÿd`µš¹\\ÔFEEÁ¨Ñ™ jk£C‡hÿ~jjZ¿§_¥ÌòÉñãÇCCC%‰ŸŸŸP(䘩Ñh¬ý€ÖÑ·Í'Ÿ¨6½d2YAA,Þ>Af~ˆõ~³ÏùæÍ•J$ðôô“£¼2ûñåz,ñ$º¢o Z²a8;ÁÁ´y3}÷8@÷îÑô4ºÿQ*“RR€%¨éjkkMÞ¾¸ÈЈ›!9¢¡¿—×ú‹›Oà`Ý´´4Ø‹““SLL ÇRSSS?ë?â'k%ŸàL±ÇÞÞ>33ókäƒ `«½‹ç“Ϥܩ©ŸNOOƒ§½|ÉpK”ñï¿Ú¸¸8WW×ááaðɉ'š››—–ÀŒ©þñÕׯû¬NF|¢P(ÄËäããƒ|ôàÁHMM››[`` atúCÛGu“œœ DñòòºpáÚj–äˆÀè¼xñbbbbii©££#€|tt422£999---X!ÝÛÛ›ššjõ×äù„[@‘H”’’‚6øäîÝ»;wîèeøt¨§GÐ@<àÓ!_à,,,˜úìJ= ˆ°©Ý–lÈD*¥mÛè÷ßiëVJJ¢ÆFväaCƒÏÅ‹-ÄâÄä +’¼<XôEf´ÿqó L™}0ITQQ‹Ðét¦&ÏÎ΂“gffÆÇÇa¸4 ]ÐYWWÃA›WLfyfpp „ÐE[«Õ² ++j%Ÿ\¿~=8;vìÈËËûªùdmâùÄê‚ÉÞ! +ÊÎÆwv²--B§OSuõÒLdÒÐÐPØø«W¯PÇÁ-?XÈߟ±Ö3gH&[ÇÇ_£Œø¤°°P°L›7o>r䈻»;ÚgÎœ±±±Ù¾}»aT©T._ +I +0ƒ\¿eËø’···\.g‡€=è,((@rÁY.** + Áí'OžÄhPP²!’ P!<<£VMžO8ôôéS„4ö ŠMimmÅVÂWÏ;gô¹€"(r±_ì%{ºÜ™Y=Ñc‰(Zߘ²d‡@ÿˆÃ~ [[úñGª¬DÊŽ  +efe!ÞðHccc&Wxú”bcÉÅ…îÞ]ª%xm¨ŒøĸYmÚ´ |‹ªm¸Ð®]»öíÛÇÁIË—‚5ÅÇÇWUU›+++1¬Â•””lÛ¶ +Cð“Ë—/§¥¥edd ?úùùa?ÿ¹ÿ>L£OÞÇ•µ´’O ò÷÷ðó|ÂëS„Àª$ºZTTYRB}ïê²övŠŽ¦øxZž„Á$ŽŽŽeee###0ç°°0Íüü»1̃oáÖß »ƒK³|‚*Áñ!ò'rÆ! ºoÉ6 SY +Zúí7Ú¿Ÿöì¡ü|êî6Œ#„!ÎÎÎ………(>¾Èä$0§4#ƒÁ’ÅEK~™×†ˆ›OXÁ%`/Z­–{Zmm-8¤±±‘­_ÂÂÂ& zorrrÐ¥€ +Œ¦ + ‚½ØÙÙÁ»nݺ%“É-ÅÅÅÖx³%ñ|²R<Ÿ¬Aoˆ %–œÈA*Í +¤V†+^ +!UQTµ¶~p ¢®¼¼<$$d||XŽÆ#vÆì,ef2{ø0=z´¾ïaMYÂ'߀x>Y•Lñ ¼æ!‘˜ÈÈ‘h«¾!¶dp^$y‚IΞ¥_~a袾žÔjÔ¦¦¦+W®ˆD¢êêê/¢Ñ0@’”D.. çÌÍYò˼6P–ð‰…¯3¦§§Q$âr``À€4•¡¡!C§Z­ÄåË—/A>ˆ+N××ׇŒ² ++Šç“•âùd +J×W|PQ¸\žéð?öË5¨©3ãýÒ™~é×mgöƒ3NgÛ±ÓŽ¶ëìt*œ­2€C­k[Àr©,® E€¡ˆAX@.ca1eå*ñBT‚îr‘ ÷[ !ÜtxöNºBÉ.R…óŸ óžsÞórÎyž÷ÿüžã:ÉOD‹u(.Žñ¼¡!ó[ínnnJ¥rddmÝ%±˜éÖº»)<œ¾ø‚`àoð[¬¯8>áød¥Öä">ˆ‚¨Þúwïí%…‚NŸ¦ýû™Írà••1 ²D7oÞ”J¥Ø\999((–ש®&>Ÿ‚‚>ik³1èœ~s­#Ÿ¼´âød¥8>±[ííIóó™DµZrâ{(çT-äqœ.^¤•L/œ “É0...NIOgȤ«‹vì ]»¨¢‚,%ä+'ŽO8>Y©ÕøĤt¢rë_|p*+);›ÜÝé³ÏèóÏ):š9óì™iŠN§Cý™øûû—––¢·µ°NCÃ$x´uu¶ÄšÓË#ŽO8>Ùøˆ¼Zš#R) } +†ß¹Þ»ÓX(¡©‘J%‰'‰„fgÍoÑh4|>bb¢B.$$ôétÔÔD‡Ó¶m”“³ñoñ‚dŸô÷[»:==ÝÑѱÏôÄñ‰]Z“O$D•/´¶Ò;$PHyyÑW_QR)•f³ªªª"##ƒƒƒoß¾mù(¨mäíÍì5ðɦ趠lçDHkE£££===ëòTë+ŽO •JÕÀ +ƒGŸØ¥©©üàà?ý®¥Eä•÷eÐßÿœv‚G2iµ¦×ÕÕ ‚gÏžMét±™™ÿ–JÄbrt$WWª®Þ𧱲…Oà +W®Ð7ß³³µi³³³½½½¶ÿë´´´Aë–´~âøÄ.­É'###Ú•›d’˜HGŽ§'Ã'11ÌËÁÆår¹¯¯¯P(„‰YXÝBQùú2? ;CÍé%’|¢Ñ`'RF†µ9ÍÍÍ«Ò¬%õõõÙ>ùÿÇ'PSSS;+„éÇ'vJZWöÉy?‰ }ò¶%ó>yxc•L¿{÷nll,¾p{gg’H”Ÿ’ÂXî{ïQh(uvnìSo„Öä“ÅEJH °0¦=~ÜÚRóóóÆ`0àoMMÍÀÀ€ñüVLOOO¢º8píÚ5Óíccc8o´ ìèV¶® + + +MNNë6333jµÚ8sxxØ®×äøÄ.­É'tö,“ÐÇtã>Mû÷G”šJ••´œ<D`Ibb"Á"²ÊL££$—Ó?’¿?³ §M¡5ùD§c¼Ù”•EÖ–ÒëõSShu°ø q]$Ò &†ñ8+ Ðõ :::L·ŽŽÂ”J%ÆÕÕÕF#B?×BcŸÁâýýýÆ“ÛþŽ[œOT*Ucccjjª««ë¡C‡P=qáøÄåë&Ýss³¾L¬O}ýp¸àÁ€À£OÕjaæÜÜü37/O«×‹ËËS"":¾ý–>ø€1Ìöö +ð +’Ÿ`C£J˜~?ü@~HW®Ðýû”ŸOÎÎË®²àð\ð„àà`Ôú;vÀ—°7»ººÒÒÒĬ@uuu˜€™AAAp•£G›n@z㼋‹Kvv¶@ €œ;w®¤¤WÝÜÜ`#IIIˆVæøä…jU>ÛÀá(*´w/ùøbŠq^- +³; +EXXØÉ“'ÙîînóÛÚ˜L + +¢˜f°œj8½ê2ã“G–ÈÑ£´gÉdTUE˜…CÓ%¤ØÜܲ¥®^½ +3©¨¨Ø½{wYYLPÍ‹¼ +…èt + + +Ο?™^^^÷îÝsvv^Ê'ŽŽŽ0:‰Dâää$•JîÏAN¢ò÷÷“`58Ltt4Ç'¶ ÄhÚ0XPB4ò LÛÎ|ÙB*ž™ùN&mÉ8ó䟕=BÛÿ@¼¿tÓô/q‰ÌvX*#™œ8qbtb¢¬¤ä»wß­ýuúôS¦[Ùèm.­É'}D!!T^Î؈u>ikk‹ŒŒljjÂ'vobŒÂÔÇ +ƒúúzLÀ¥ððpT@>Ÿ†%++ËÇlj‡„ËbFFR=33ó¢@„èÀzzz|}}¯_¿nïk®Æ'"‘ˆã“•Z•OP3bc‰Ç£wÞ¡·Þ¢×^#OO&K~þ™´Z³¹ ¥¥¥°îäääææf QABª€p²³©³ÓÞ˜rzùeÆ'ÉÉL´M¿7Þ 7ߤ¨(òóc¼åãŸ_óš1^½ÏCúæø-<‘~D0 +  ´8DÊ¡A+ôôéÓªª*TÏùùyÔJ$ö“'O<ˆ9p˜,Æ…Ž‰X‚EEEv½#Ç'°h4›ønéééhB±ÙU*ûÒeËÜ,(.VúyLUÕ†Ÿ%á9zð€D9ô/ éjj–MFÎÇŸ9ƒOªž˜ˆÝµë\ö ÏÜ2ã3¡æ”•Q` 562‡0 ++Â6Ä~“?p†1dŠd6^‚9466‚Uz{{1€èõú˜˜˜šššééi æÀpÊËËSRR*QÅXÏÁ_9š#@‹½¯¹ŸˆÅb<Ç'fZ›O°GðÛ³‡V~UÄQ àv#[.€h+“·7I¥+©†Óf’Ÿ˜ ;27—˜,ÀX °¶”‘OŒ= ± +‹Ÿ^ºt ‡~~~ ÿ¥|‚lÔjµµµµÆÉèN`˜ññqtOÁ¬µq|ò?yçΰúË—/;vìÖ­[@˜ÀÞ½{½½½A’÷ïß·ë“nb +ùvv¦_—þR^sž‚þüy~µ¶–)²ÿzˆÏëáåUVY9¤×_,(8¿}ûüáÿã­!ë|bRy9}ý5ÓãXìÖÑÕÕ¯ 0P÷þÆJ­V ìV¤+Z˜±±1”°øøxÓí0dõÌÌŒñ¤L&Cžc˜·]Àç0“ÜÜ\ή×4ã‘«}ûöÅÅÅq|b¦UùäéS0" …ôöÛôþûTRB--K¯#‚(‚kÁ”)/||Ph%ºpÚt²Î'^Ïd„HD€ŽˆkKaÏÂRÆÝÝÝûûû£¢¢oB¡ô‚*C''§ááaggçÖÖVÓí@ä¤E¢õõõð‰Drá +Z¤S§N%%%a‘©©)Ûß‘ã´ +…noGŒ` è%]\\Ðc""èOmÿž›X‹Déý}Ù—’•/¦Í&¦Q}ƒùœñqfS@ZmÜÙ³2¹\ÛÐ|êÔ÷Û·žéèè³âñx111Ÿ˜iU>ùo¨(;[Åç‡zz6±%AGï‰D"|UDjÙüöv’Ë)$„¢¢¼á´e´&Ÿ56F.PF†µ9ŒÉÉIlÂ%ÿÃ~¹Ç4•åq¼fæŸÉf2˜Éü7“˜1ÌÍnâ¸Ñ ë:¸…€ +±>€¢¼´¶–Ð奈(‚Ð)/qaZ`x•ÐRP@¤BWEÊK +hzö[.[¥Z`×n-r¿¹¹ùÝžsOÏ=ïùü`Xo¡ö5À1îpÃë¨ÿêÕ+ä8FîTQQQ\\ ÔùàNÕ¤ùdáÂ8WVVîß¿ôïæ憼y +<ŸÉd.|?y%kú¼ïË«ù1bá˘X¢PWTU)ŒñøüãQQC2Y¹­í™Õ«ÀŠ[Z>B§?¶È'‹]F|bÎS$M4Ÿi>!¤øÈ‘Ý»ÿ¼iŒH­V …BOOOFï1ö²2rú4a±Hr2io7ß”ÒZZ Ÿ@:{£–8Ÿ lhhˆÝ½{·““Sttô½iO-`BËψµi„¬×¯.‹…òaÈ¿¼ýɳ®Yú4šßŠŠ¼\\‚OœPÔÖ¦df +®]k‰î3™W­Êƒsöö~¤¾d-q>ILL\j|¢T* oÿ‚ܳµµµ¹¹¹nN>A®yóÎ)Œª Ö„fUÂa#‘  âáA²³IÿÿaJi--œO¯–8ŸPjlllœwïÞ¥ù„R3!1ùâËqE ¼oò¨Ã¸ÂøÔTèñã~þ™ØÛW®Xñ'£ÀÕõ‰­íeãZ|üÇè²É +ù¤««kþJÿ¥h>1NRSS#‘H0õÔ/¤RiBBHC$Á[Lñ Þõóó˹~ý¹F“WP°qãF@ÐÝÝ=«ÅbÂb‘Œ =¥ÐZ¢ùd‰ðI}}ý½i!¨£ùä?’§ª+ +þå¼Gש0R^ñž:ªþþc«W¿ + löQã/Ë–5}ûmÄ_îß?01añ.[—Ä'4úÓÐÐ`0{³4ŸPÂð®_¿ÞÛÛ[¥R黧TvvvâñСCiiióó ›}57÷÷ÔÔúÄÄsAYeåLYs3IHÐcIx8©ª2û ÒZŒZŸ`åÀ^¦¦,П¼¼<@¸yÛ¤ùä]Ñ|"'Dø¸9íJ\³•ë3Õ?lºêÈHÓ—_þ¶nÝÑ5k~·±ùƒáúý÷ýcc–ë«k~>a2ID)-%ÁÁÄ×wîÖ†††$‰d2Yqq1c£èñãÇÔcuuuII ü¢ÓéÆÆÆzzzpwqqÙ¼yó‡}Ó{Dó %Lwiiixxx`` õÕMMMùùùÛ¶mÃ9’””twZà“ÌÌLÔyÏPÖÔÜ[¿þ"‡“áìì±reyz:¹rE%¸74˜}âh-jÍÃ'Z-Ù±ƒ¤¤èíÅÃÄÄÌÝ@288ˆ<€X¡P¼]ÿ¡¼¨ÕjÜûûûñJ×­[wìرü(#ÍÁ'!!!ØS4Ÿ,5‰z;®Å Ž»7³?˜«fùýû{™L×Ï>}÷]òeÿá‡å+WvìÛg©žZ»Œù¤­MŸË..—‘²2½'||Hhè›ÒáYP‹ + +‚3ÄR©_AAAtttGG‡ŸŸ_MMP(€ +222Ptîܹàà`ìß[·náGÜQ›ÚìŸIóÉLg”JL +RH¸4õÕ|±X¼jÕ*ø›ƒƒCjjjcc#ø'‹£££dZ/^¼˜¯ÉI‚ô36¶otô—kË`TnØ@ô‹aúÔ EëmÍÃ'Z//¢Óéã‚Âf“ׯMÕ] )‹%‰È Áp8œÞÞÞááaxŽ¯¯ozzúøøx}}½öuKK P|ºídC81÷íÛfÞo|—O°­¨³gÏž´´4šO–Ž`‚9„p²¤×¶e ã‰üžÉš“„Ü–ÉŽmÙ²…Ág0rw~þ¹Ë?´³«Ë͵X‡­\Æ|’“CX¬7— +qr"È8ûû{{bkû¦´³óí¦p¨Á"ôôôÀ1º»»á!·oßvwwÇ™>‘Ë壣£8SRRPÄd2+++£¢¢Îž=ÛÜÜŒ;,eVÌ$ëá“Ü›9£ƒ¸QÕ +‹ñ ÔÖÖváÂà"õÕX˜&ÌÆôboo_[[k’O=Òç¹Ðg@¡Þ»×ì“Eë“‘1Ÿ³ìeÅ +âí­Ïzc×oÜH¶n)BZdXuÓÊÉÉ9þ<µZ +Q©Tð“K—.EDD @šƒ;óÄĨ뙟χÉ`µGFFðºB¡ ˆÅŒ¢ùä]-A>yIH>yÍ»tÄG~1‘Tך¬ 29›œì·vmƒA6lhg±ÖnÞ¼fíÚ ¯¿&<^Ô‘#UJ¥;nÕ2æ# + wwÒÕ¥<ÐûÆË—¦êñ |);;žàââ255…E 9yòdSSîB¡RXX· ¢dddlß¾KÚÆÆ6bÞÏ´>árØi©Éí­MÎ.NÔ53Ì–åX7_ +b"]ñIff&æÅx¼º»õÇè¨~I`Œà`29iÞÉ¢õÉȘOêêˆDòæ‚·DE‘òrRZJ + ‰›‰‹›)OL¼ÝÔÍ›7±n +X¢AAA$5Hy°‘ýýý‹ŠŠ&''wíÚåíí}øðá;wî`m{zzž>}ñÎ;“““ñÊ‹Ùäóz—O + IJJ¢ùd)è–vÈOU°!úä?Ÿ=R›¬öld$1==ÆÁáÞ7ßM›d<^tddayy\žšÅåðô”Ëå–ë·uk>˜L¡7œDÓøaJp d +qlllVVVhh¨££ãàà |‚ÿjll„KˆÅâââbx¼„€Çöööªª*PÊÖ­[»qšUÖÁ'^Áÿ—¯¾ªc0ºH;sÆ“Ç»ž—708h¨£¨«ÃŠc‰~/ÍÏ'PW—þTÒhæmmhhb ðâçÏŸ#Öh4(zúô)UT]]]RRBŨ0<aq9ì쬌 혧‡;uQÝ°$ŸÀ:àÛ˜ pˆL&»qã¬àɸ¸8¥R‰%1Ÿ`7åç//¨OrqÄТeBóð‰NGd2BX,òë¯D­ž£)x šb±X"‘hll¬¾¾ÞßߟÏ秧§ƒ€Ù¾¾¾ø;­V‹"ìw6›­žn8œ¢£v*tìàe´"‰Á”!F¨"! A,G|øÕ’ÄÛÛ;..næ°j¤bé´Äs¤~bŽƒùÉ™>ªhúüÂèoéÍ#½ó xÑÛ›œ–vÙÃã_~HvïNýùç èhii©ÉæKu0æú R‚ÅzçL¾úŠ¸¸o¾!xa½Ý¥Ñ¼=^jŒZèt:$FWW2äÁƒ†ËåVUUUWW§§§£ËÇǧ¢¢"!!!66AoD +³Äv—Ëå{÷îZâiÚŸ„æç"‡§©ŸPœ¹~R_O¤Òw>·oWW²v-ár¡ÿÛ^VFÆÆÞžêéÓ§áááR©*ÒÛÛ{ïÞ=¼oÞ¼‰šH¡P  ñ‚ǹ¯¯O `0&)) ÛQé$''CQP]œ³ÝŸ¡  €Ñ•¥@ýÄó“Óš ¿ã¢¨‹“dž‹Lä*UÇ]½Ú¸cÇd`àèè„äd™Baóe: sý¤¥en€ˆÅdÏòñÇÄÛ›ää¼Ó¥×¿=C”$³?;;;###QÈà.“H$èÍÈÈ@ƒ†——d&11ñÕ«WÇŽ;yò$BfûöíYYY»wïFþ Â[°ÝÝÝ}ìݤú Ø‘ŸäÁOLÔO(΀ý$//Q Ü¢<ïàÁƒ(jPòàAFª£¢a³Ùþþþ=BùÈçóÑöôô„Ï`—‘‘$ Ò ^i‰çHýd\”†††ºº:‡ñ“kmmÇuº +™œïôäùs¿ƒEß~«_»ÖtøpÄ™3aññå6_¦Ã2×OÌ"ÍÍ„Ã! +1¨ÑhLƒ6j¼ãbbböïßßßßAƒcáFJܹs§¸¸™ƒl!àç‹/d2™H$Ú±cÒ¢‚dCÉãêê:::ºÄÓ´3?!ÔO(ÎÀ\?1G­&11Ä×—dg/´ZKfƒTH¥Òþþ~ægYYYwwwOOÚ/_¾D—Á``ºÐ®­­eÚ(”f £ÑØÕÕÅ´e2Y[[³ûR ~R?“YYY«V­BE‰8eüÄÇÇg‰ÿí{¡‚XBžvt¼6çw1NLˆîßþø£ìÓOÉ¡CŠŸ~òŒÌ‹;ßÜTëâä~rýúuÛúI˜$/‡P?¡8ùÉ +‡ú ^" +…‚Ífs8œ¸¸8ÆOär¹§§gaa!\±³³Óæ—åÿgš¨šHâ¹AH·Yç˜Ésé÷‡*>ùDïæ–xòd~QÑ{X§3áœ~ÒÒÒ"!88˜ÏçÛÐOBós³ñ$Ø¡Ÿ(•J¤ +Ó¦~B± +ÔOÞO8Aooo(Š¯¯ï³gÏðZYY~ÒÔLŒÄ­‰´MÍíªkh8Ÿ‘Áþì3Ã×__߬3gâ“’Je²÷±L§Ã"?™š"x¹›L˽??¿ÀÀ@‹USScÝ™íÆOÂòór°{󓺺:¤ +´zê'+a?~299©P(˜§Þ`0Xqf'÷¦¨9pàÀ®]»6oÞ¼mÛ6dHCCCyy9\ÅŠÿóòÑGÈwÿ$¢4ë*©© ãÿ½rÍšŽC‡nòù~§NÕ©Tïa•N‰E~24Dâã_[Ê2ãááQTTTRRÒÕÕeÝ™çøÉ,·oߎŒŒ´¥ŸHìÒO lqªV«ë©ŸP¬„E~ÒÚJ–ßa´Z­»»{iiiqq1õ«ƒÜèèèHMMMIIA˜@ZžpŽèt:¥Uˆ? >1þ›[ÉD»²¥ýµÙüKW‡Í.ûì3â﯋ŠÊøùçó Æéi7Ô{åÈ'OŸbo;~ärrô(ijrl_\´O‹uÀÄb1byõõõÙÙÙ£££\.·§§G"‘Œƒ +€+èÊÌÌLLLÄþU©T»ví:uêvzJJÊìì,³Óô >‘{"Ÿ´µµá5á_²ýàø9Çcö-Py›ù¤¯o{¹y“°XŽJ%±XìSuttÄÇÇÛìþ€õ‰°¨¨5Ñ£GÐ{Ávž››KMMÅÍÅÅÅ999hG5„x÷îÝl6ÕÓ7–––œã;ø$))©  ÀøĦ~«x8ŸÌȵ‡äÏ׉ÔLì^¡¼¥E¨Ü·øù +…‡Ÿ‹—”•ŒŽºm¬Þ-ùÛ022rórrrìŠUj±XêêêÐ{ëÖ­••>>>áááYYY(pàˆ +ƒíA©T*‰˜¦ÇðIl\†ßõ(>A¥9<<ŒB/88x“Op²°X¬f«˜õs*ï‘#ŸˆÅ„Ãqüœ>MöïwläóÉÖU[€] €cÀC°b$¹¹¹B¡¬ßp3X¯¯ogg'x;99¹¡¡frõêU¸\MM +s\\îdpŽÎ|‚dÛ8ÉíÛ·½‡O6åÑ|²F¢Å䈊¦¶4¿˜ž.}ð ðÈ‘GŸN~ü±+::#=½¢¶‹ÍM¥râ“m…­öÞT8Ô€¦¦¦áK(m`)@‘µµ5,ZØÌA§Óá["‘ÀCšššà6<O  °åù¿æ“˜Z¹¨Gñ 444„ºÕ%å*åÈ'Û +Åi\Ü{S9ðIBB‚B¡ + +JIIyùòeUQQQþþþX´ðF£V«aJ999F£Ñ–VhùÃ3û]”Oœå±|"¸FþL¢ +[ç––Jª«³Y,Í—_’3g¸\vr²´¾þ?&“›†Iõ›\â“åe"’õõwße6›$8ã`#àƒÁÀçóSSSq‰®’’ÁååexºBBB´Z-,//G0>>{Áã0œÙÙY¦&hå“w |’ŸŸÏf³7ù¤²²ÜÈì[ ò6¹Ä':+åOGGG||<}±X °ñ‰ŸŸ_RRÒóçÏ Á'ð–´´4tÉåòööv“ÉxP©TR«ð8Š#ÜÉÌô¬ræ“Mal”Oùôå1|S+—òÆÓøD«Õ KôQ>¡bH.ñÉ'.Ê'Îò>Y_' +÷È©“šcÉ( ÍÖF ©Y­ + +Í÷ñ!.<ãpr““ccGôz7•j[Q>¡|bS?\ÅS>¡bD”O(Ÿìü±ibœÈ*Éß8äÀ]cýÒÄf»B­üþûÊo¾™?xð‘P{)#ãaW—»ÆIõyŸh4šææfNÇxfá“Ø:9@žx ŸØ‹ò #ò(>ioo‡½Œ3›–ò‰³ÜË'SFRUNbÒVÃb*îß0??_ÝÚÊþá‡&6›õFEe]¾|«¦faaaçGHå¢\á“eB„„¬ä‘”••ååå)Š‚‚‚ÎÎNf“{ ŸÄÔÊ¥„¼¡|Bå +r…OV1|ü‘`I‡„„p8‘H„£ŠÁÌ”Oœå^>¹•»ÁýëPä3s‚ñÉæ›.¬ª:ÿÝw÷÷ïyü¸2==ŒÇ»vû6ÙØØùáQ¹.ù$Àµl`QT(›$ R©Z[[m1v±}ñÒÝÝÝÖÖ†-‹åÌ™3hY__ñâŇLæíò >¹Kù„Ê[ä +Ÿè°=]Ë6661™LˆÁˆ{{{í»à?¶KÄZ­^¯'Vó9vì˜Ùl¶ÅЇLæ-¢|â,wñIE9 ;O¢žn\ššÜXGˈ^ÿO©ôÜÑ£Ïx<âç×#LO¯{ð€rÉ'!>yŠ­íô‘r”&§öÅ­©`|>Î ‹·´´Ô××766fggŽŽr¹Üžž‰D TTT +33311û·³³sÏž=)))(pÁÜܳÓô>‰­“Ëð»”O¨¼A®ðÉ(!q.¤{ ü¡´´ôõë×(p@€™™™ÅÅExNxxxyyùÊÊJhh(öõÐÐPzz:±âÊÞ½{aJ +…b~~ž‰™ý.Ê'ÎÚy>Y~Mªe¤(ÌQ5™EˆÆÚ¨îëKÊÊâûm×¾} Î]€ÍãÕ·´į̀þ¸øDJÇés–¿ìÔ>¶55X‚©©)8†Ñh„‡444Á¢¢¢À'jµúÕ«WÅÅÅè +™ddd\¿~ýäÉ“þþþp’´´4™LÆì4=‡Oj)ŸPyøD¼½œ&d¿S#Ÿ¥­©¤RiVN¢×ë!ÃÃÃð“ÜÜ\¡Pˆe¾áf‹Å××®‚²(99&#‰>|8::ö‡;œ#ågí$ŸXÖHm)äN]«g +u 3hìÌ.//:thñÀrölõ¥KWE¢v•êc†ŠY9ðɶÂÆ s!•ŸÀ—ª««a)>>>kkkX´°˜ƒN§Ã·D"‡455Ámx<<$22ˆÕˆpÉÀÜìä1|S{ ø†ò •7ÈOúivúÜ$„åԨĹ³5•\.fl^b‰òù| È•+WPò`#Ã@îß¿¿ººzâĉÀÀÀ{÷îÁd‚ƒƒ±ÇCCC;::ð @ ´08GÊ'ÎÚI>iV—ˆþÑWò¯ö+Ö¶«ÕÜèèôãÇ gøé§Â””sÑуOž|ì‘P1.Wød™RÁ1P¡ˆÅbÄyyy8ã._¾Ìb±L& |‚ß,**ºsçNkk+<Þ÷Éd%%%ùùùx<-- +—ŒÌnSÄ'rðÉå*oŸl+kåè">>Þf/³³³ +…ÂÏÏ/é¿ì—YOTÙ†ý%çª;^t_£}£­I +q@Œ­4DQ *”€ ¢2 +Í< œj)ŠA1€ÐP( QXç9ì¤N´,íTö{QY{k{íUk½ëù‚ƒÛÛÛÁìÅÛÛ»··!„·h4œx¨©©mòóóyœâˆžVù:I2ŸÌ×ÂðÉ_Záåþæ¶[QvÝõ‹BŒ ¡Õ颓“Õ66bëÖQW×ýþþQIIŒæóAÖg•%|òFŽö ²ŽŽâFÐjµ´i + +ÒëõRÇ(//—Út£¡ÓéèÃáø‰ó~}a|"d>‘µd ŸL ¡·,UþrH—•••XÇÓ§Oiwvv2 Rˆv}}½ÔÆs¦§§i€+¦d-É|2_Ÿ›OšÄþ}⚪=GLû +üý!®ÝºµûöË?ýdøõ×;‘‘‡|}æ_¾üo—µ`²„O¾}A|r >y+󉬥 Køäk—Ì'¨©©éþ¬h4~f>©ÔU¢¨8ÝsS—&Dµ×5šè¨¨¿¾ÿ^8:6»»»;ög^Þã®.«¿ZÖKæ“…æ5|"d>‘µ$óÉRà“ææf­VWUUÕÒÒò™ø¤J+TgÄõؾªSg=mšÊ¤3g|¶lÑ,_>þûï×ÂÃ=Š¼’+¾QÖâê£øD¯×›‰NNN>zôȃ²¾¾0>™‘ùDÖRÌ'ß<Ÿ455A#§NÚ¾}ûŽ;bbbîÏÊê|Òó·Øÿo‘™/jÚt9W Òž +yžf'&%%™éÓÚÚZQQa½¡YM2ŸÔÖÖâümmm]]]Û¶m»|ù2Ÿ8;;[e†ûŸˆÞ"!E¼¸RZ¯õÖéþP*#6mááÃÁÁyÇ»øùiu:«¼KÖ¥òÉÌÌŒJ¥:räVãââb¦çôô4>óüùs~ëêêúúúŒ!n + +544èõz.ËÊÊø­{zzÄ,ØLLLÀdಽ½Ý4-[ ´´TâðññqÚ¦¡7oÞÐ&íÎÎÎwŽí}|’ššº°|â_¬.⽋È'XGÛ¬ŒˆÂÿ‚ù?zôˆ›>ÉÊÊ:~üøBòIÉâñɽ{÷@&mçÎöööùùù---܇LÂÂÂ6nÜèààÀÁM™OdYEæù„-ÉÌÈÈ`›wuu±ͤªªªb³\©•X¥W¯^• +T]]½àcøCzz:>@BM2e˜«ýáÇ$Q«ÕÆœ¬| äÀ„°”„„žÍÉÉÁj¸CÛÛÛsÀÇÀ .óòòŒžf”Ì'³ÞBi£T*###ïÏŠuíÚµûöíýïÞ½kñ’ù¿ZZDl¼8?ÝP§ÏÍN´MNúE¡ÈÛ¹SDF¶ +HÈÌìêîþ„̲¾Íá“ÂÂB-_¾|Ù²e!!!tttüñÇM£XŠi*¶!gûšcŽKž¤KKK9ïÚÛÛájüäĉ‰‰‰DÙÑlyÚÑÑÑô¤Ì™ç´¶¶òàØØXxx8dBˆÎ@TS[[KŸ7nàñññ\’œÂŠú‹¶‹‹ ëüÏœÃ'ÆÏ\·n]DDÄòÉáâK…B¼]>Á@˜'''&–Ïg>!þG,š©ã~vv6V#ó‰,«hŸ°KM´{÷îÕ«WiµZºqi UVV²ßMS±gá‡[·n­Zµêúõë¸Öøø¸*..¶±±!äêêŠí€(™™™”-”DYÛpÈíÛ·9:qÆ`̉ó°à/\¸ùôööž?ÁÄpl´PÐÍ›7±£   B ‘T©™Jæ<„¾xñ"SÍ,aøxиeËŒšóÉ“'»r4áT/ªª#²þczÛÖvôçŸkBCýŠÀ˜˜ÉÉÉM+ëëÒ>a™™ûkÅŠ~~~,3lÄÎÎÎ4 +?˜¦‚L0'Íehh(FÁ!È/qìØ1é¦N§Ãy(L0é<}ú4þ@tÁFFF¤97cccy‘”ÿõëט̡C‡6lØ€Aa ÐàÁ±ËH0:BX\£‰ÿ5‡OŒŸÉ0H² |¢^4>áÂÝÝÝ)'ùv{{{lïmmm9 RSSïÍ +>Á´}||¬»Ød-5}OÖ¬Yƒ3ܹsçܹsæù„UÊYÏÆÏÈÈàÒ××777—€C@Jn² +Ô}òäÉ»wïòËMü +Bà,] lD‚óÑÑQ’tttHù'&&(y +C¯úúúÈƳCCC숕+Wb/{öì™Ôšápˆ=õmóISSÂD­_¿{IKKÃá9Vø_œ?aÍTW‹h•ÈÍ“÷»ï߯^çý‡[PPg@€ « + T…„dŽ ŸYÖW§9|òN]»víìٳో‹‹™njìw²‘¹1 +÷ॠÈ'þ%êÿ}ÝbñIJJ +|òøñc€ÓÁÁAâêD'''Ì?**Š¿X∑BÕcVïœ:Y²>¨9|2_° +“““Íô,,,„. )!+rBùùùaaa4\]]ûûûHÅÂÆ°ŽÍ›7³à)m"##†F“ú·ÉÎÎÅYíב#GÊÊÊlll¨_JJJhƒ@qqql\{ÁŽ,áÜRÚ8P +É¿y>©¯¯gfð(‘_#ŸðAƒ–¯–ÚZ¡R‰?³ÄH]ϽæzÅ™ØyyGŽÍõóó8|8¿¨hðéSËÊúÚe Ÿ /^àJ¥Ò|8ajjŠ_.ù¥f‘BÜÔëõ4pññqö²täÑÆ@¨ž¨•¸3==ÍMŠÓ´³5—´Î)Žè<<<<22Â%FDhffFÌmc54Gïã€aùäpñ¥B!Þ.Ÿð½ðIOOseooŠ°jjj€=æ‡ùÜ´inŸp²ÐA*f +rµ"ë“ôA>‘Äéfgg§P(Ìôaãà ¬U©~¥%@”<€ +•J-@ÐæÏ ,cH†aý³ÎÕjµ1'====)ÑŸ§p(¥··¨ ĺ»» Aï^^^éééXÖœÍç“ÆYËB»víÊÊÊú¶ùDR[[.Ê/3 ±`,Ë'‧ø/ûåöÓtÇqwãàÍ.v·‹mÏòd‰Ëb¢>ÏŒ'G-$F6b„BvR9ùX9<àe”“€Ú>œ"PŽé8Ó¡,(Chˆz1£Ù††¤þö^Y£…02~'|^M[ÈïÝï÷óý~¾¯oÑ-†yóEcÁ!‡ÃÔÙ¹–™ÉdfÞIIIÈÎîîëÛá£Ù°C?aaãKDB~bÍOæç盚šÐ4Ð3 +šªËåÂ…WË´´4t`ôüèèhôø þ3))IØ*rc‡~pËX[[ãû÷ðÁf?ñ£×ë±­ö‚Ÿ°?yþ’ ·dÞ¾e’’™ã}³þòÅ‚©®öî?,õÕ¢NWœ’£Õ.¯¬ðY@BºÀuÓÓÓÅþ¼“˜˜ˆ{Ðæï÷ÝúŸÛŸ(~‚¦111žŽKåÇ + + +ð=Ö¾ + +ÅMvnnŽõLš5"äü¤¸¸Xì_Á/ïÞ½‹‹‹ÛÒO®^½J~²å¤1·o3§N1:S]Í”V0[c¼ƒòúêÚÚ޽˜=«ÓhÒóó‡FFx. !]p…„„tË   ÕÕÕÍÃÜO´6«…a¼¢ø ÜcÁÇÌÌ ìÔívCZü_ÎÎβÿC~Bìž–––ÈÈH±w?¿477+ +ò“OÙÆOff˜ÊJærâŸZ_‹™T3:ñöMO[_Öµ\•êeXØœ^Ÿ•œ¬1þþæ ‹”.£££boqÞÁ¼eÙƒ~‚Ö1ãÃÿ¯öK¼™$?!8Âår…††ÆÊš˜˜µZ½åðÉOüÄãaÕÿ +¾‘ü‡ôóæŸüÜÓÑμþ“Á¨Ugg$&¾V*ã´ÚïM¦éÙY!(AHÁýDg·¶ WD?Ù ä'±{ÈOüdÕÃœ:6®;˜Þx­².WSR¤úmyVCyGuõ F“ªÑ|ïÞÆƆXõ"I!¸Ÿhm­†ñ’Ÿ„ì!? ðð»_F¼üU˜Víü™:>÷ÀOÏ„Ä4[kJJÔêꆆ•ÕUQ*E„üdKÈOb÷Ÿlö“G qÎßüúð‰#û:;÷ÕÖ¤üh_efÖ Ó)JBÊî':»µ¹ä'!{ÈOüdÙã9–‘¡;~üÇ>­öÇÇg~ý5óáƒX")#¸Ÿhm­†ñ’Ÿ„ì!? ð“^§3öÛo§¿ùæFAÁ/”Ê”C‡š¾ûŽñzÅ*AHò“-!?!ˆÝC~à'ÍŨV‡¤¤´vw%'—UU‰R‚>‚û‰ÎnmA.ù AÈò“Í~<¯^Ý5› ³³ +z}ÅýûÂ×… ¾÷­ÍjaÈOb@~²¥Ÿ°,--åØív!+B_"øI+üÄK~B²‡üd?ëëë¯_¿¬ñe!‚ŸXá' ù AÈò“íý„ ˆmÉO>’Ÿ„ì!?!?!ˆÿü¤~â%?!Ù³wüdnnnÁ‡Ûíž$?!.ÜOt6k r¥æ'¶½ÌÎÎN’Ÿì?™ššBÓ0 +…B©TÍøÆO0½ccc¼F³Ù,›”ššš‘‘y¤Ô×× + +É#¥±±±¿¿?àKÁýDk³Zæ£tüdbb6ÒÛÛ‹SZZŠè-‚ùÉÊÊʇøNY]]}ÿþ=¥ìÍdz¾¾.JÊ^ð“éééááa¤—”””——GDD8·Û-ŒŸ¤§§wttð222d“’““c·Ûå‘rãÆ +‹Å"”¼¼<(JÀ—"øI+Fê•ŽŸ “Øl6´—ªªªüüüèèh4ÁüD¥R={öŒï”K—.-,,È&Õá;%66V6)qqqPnQRö‚Ÿ`Ըݜ;woæççÃÂÂÚÛÛQÖÈÈH¾§-ËétòRXX(›”Û·o£4òH1===òH1™L]]]_ÖÔÔ\»vM@?ÑÙ­-È•ŽŸ yšÍfÜzÖÖÖ\.Wppðøø8ë'III|%!!áÅ‹|§¨Õꥥ%Ù¤`¹ò¢Ñhd“’ššŠE.JŠ^¯ß#~¢T*ñ~nn.<<¼££ +Gí‰'º»»|rþüyƒÁÀk¸pá‚lR°Nrrrä‘•™™)•J…vðe|||FFÆââ"ûWâ~‚+O]]n:8)úûûqš˜˜@{inn†«ð]”“'OBùN9}ú4L6)8òøN + +’MÊ™3gÊËËEIQ(UUUOŸ>åoÿJÄOÐ7ðÍ$,,¬½½¢255ÕÐÐp‡g***JKK)eç`•Ê)¥¬¬LÆ)&“ipp;‹¿ýû¹Ÿhm­†ñJÜOÜn7.>‡ßóÌ‘#Gpáâ;åèÑ£h›”²gS”J¥()ÇŽ³Ûí°}þö¯ü½âìÙ³ KKK¡¡¡mmmðü ß<噿ú J‘e +¾ÁV‰Ìßþ +ô«´üäÉ“'f³9""bmmÍårãî3==-@Q E41J¡QR°ƒ°øn/âú zÅìì¬ÑhT(0´¢¢" MuÁn†ùD".Vxƒ,Ì3‚ÐÇðK8LÁÆ‚'ó”âŸ(^SX0c¬7ò‘Â…Ýx²¿.x`Æ8OaËOƈ O)Ûó¹ŸèìÖ‰tüÛÐf³¡¹UUUåççGGG³r‚ņ?áu†ðXT„}ƒ41ö#‡àx¬¼¦^SüYÂŒÏ …¿±àÉù/¢…ïý+ºŸLúÚìèèhII ,exx˜5‡ÒÒR|ìííÅœpkhèNxíêêB§BV]]]qqqSSÚ;WAÑàà ~?…¡áœâ)ehhhsJCC‡)þ,§Óép8pÖ××sž‚¥Ž±Ü»wÃÁ+ŠþàÁ¤à•]œ¤`###%>‡ã<‹j||¼²²©¨¨0›ÍÅ\ñ1ÿ®AiÙT‡Ã”ÿÉç~¢µY- ã•ŽŸ`°–ÐF0Kh)øˆÉÁtùw +«Ü‚Žuww³]kEiooçª(ìˆ:;;1„òòröàÀ–á/Åd2¡gò‘òiV__ö&fïþýûHikkã0³ôèÑ# ÃÁAç)ì(zzzQVVÆ~dSìv;W­…À,±‡#Ž-º Ûp›°k&}—S6¶Ïùá²Ý/‘€ŸLúº:ëc˜¼Ç5—\yð«0!˜+®‚Ð4p0:uÊãñddd¤¤¤ Ê ¸{î>‚=jÓÒÒ°JÑ/_¾¬ÕjñÑŸ‚#~÷)˜(´Y<= +û.666ÍRsss9IaÁxüøñîøHNNæ<åùóçyyy!!!µµµÙÙÙ)IIIƒ“ÔÒé¤åääèõz¤ ŽÃ¿ŸÔÔÔ„‡‡«Tª[·naÆØ”ëׯsU}¬1v,85P}NÇÖ¯\¥ì„­üä£tü„Åß^püÁ±ÙyÃÞD{Á…ˆ½°pž‹ÏÁƒãââVVVðŠZ`IGEEa= ±ï>›†šš +õÅ¢Å6ĺÂ~ÁÝ„<­øÊ•+Ÿ¦ š“VÉ‚Gµ´´ìß¿¶€–••…¸xñ"W)8L———q¦`›TWW[,ìÎSpHµ¶¶bEaÆ°åoÞ¼éOA4')¬Ÿ`é"åðáÃlÃ)Æm +ÆbµZ±M°t ããã1–ÌÌL¤ÄÄÄ ápXý푈ŸøA'ÁrRü›ý2ëirßÂøð[hŒÆko/Ô81Ä€ +"!(E ÎÈ 2ƒ@ +•‚Še6Õ“c˜AĨaˆ|7ç—÷àl•söªéº my»ž®éYÏòô„~ÇÇǃ‚‚H‘ÈÄ)CŸ Ô9j˜²éééS§N¡">~üÈ 2ŒÃÃÃ"(DA‰áCêàãã¢-PXCµµµ-*‹\±vA¡£h')Ê144ÄÏÞ·oQÄÅÅ!ªeQHZËÙÙ™¡¦ùÑê!Zä ,‚B鹡(4HÑ +2¼uëÖ§OŸQ”Q}":zô( dɊ¤‹ (uJ÷*}‚Ê‚iA!cTG +e-¶RŸÄê$ö¦O¬†~ úîîîèafÇÍÍ­½½ö“òOë2#t2ó255Édšå0a^h¹Á¯…ÁZ[[Ù¹¤——l‰(š››³ +} ÏÈrxL°Á wnÚ´ 8F]4??H¡(ýÉP0þü~êB,â(P=ò€µ²°°011A_)ÞBÎ0›TÆgdd8ÆŸˆP²(*¨rqq¥ê¡YSS(ÜAHî_I/v¨OºÇ“v.Š]PŸà^B’|ô Š-úþýû´´4N'˜v%Q:::BCCiZ¢-Ph¤„„Ï `VV(×®]£W¥P”x ã†BÿÄÇÇß¹sG…­nÛ¶ +v".v:ú.8DJŸ€rèÐ!®Z__ߢ¢"–;}ffFE¥gÀ!>DEEá_¡Àí"(t9H—··÷åË—ùý7nÜ cTG +e-¶RŸèëõKK_íYŸ´´´p/Ð ¼%uL¨ >^ØMHDŠŽ~ Í`u>¡"ÔæAy®ÞJKKL6„œ,Ê Í–#GŽQ`` …NQA­"ƒ†¥®®™­×ë‘ô³ +$É°oÞ¼™سt¬q–TEEÅÁƒ!|¦’XÊ»wïàIØR*c-¢äääÄÄDXά®®–Ea:à|ŠŸŸŸ««+‡+L¡°¿Ø5‚±üØìSŸP_NƒññqJ\VV&¨O,Úî ÕJŸ0(®NT4ÛJŠÕ W´+³L)###Qâ(JAG£££”Öåv…Šý.µI¾¿¿?… ‰‰‰a + +q”)Ptø–XT] +²'¥O:;;÷ìÙc6›4•1Ô)¢ ŠESt½½½$Íd2ÁçxÆ¿BaäEP€à@sss#c@Pba7‘1ª#…²[­OÐ'mX}‚qÛ"zY|¶Ó'Wíàà nïß¿¿\9Ȫ ôIIIÉ•+WØJËU >!]ìÙüü|Æ¡b }I*M‚J¹zõ*¿ŸXÐâú„µ²cÇD—‚E\ŸP:YBk‘=™¸>!cÍÍÍþ½{÷ÒÓÓ¡}ز¦¦Æ¡OHþ³gÏœYXÜž”¸¸¸¹(AòjÖÇ&²þåË*ËÉC¹E `¿¾¾>†‰[XXG!Q,ÁÆÆÆQÍèRww÷ÂÂBP ÇˆˆŠrà™»`çÎèÆÓ§OçääÈ¢KÿÇ•>¡Ù¼*c\ˆ"(¥­­ॱ±1XbY\\DÁXˆ+ø–mHDxÆ¿BA‹ (}Âi£ô‰ŠeBÆ€–BY‹­Ô'±††:‰=눗~¦(I#²úêf=1æÔ 4êìì,Û +=/ÂêÜ>ˆ£ÑÈupdBcÏÍÍ ¢“Gµ¶¶â*CÈ18Vî,L9ЇNNN...Û·oGWÃc<˜ŸŸG9H¡@b\»œ?ÄÂZQ± SeQXRìtÜÂfVøŸE€Æ“:èÛ„„„ÔÔT ±dQp‹–cù~þü™~S± ‡@‰MIIù•ç]é‹Ö´ˆvÎœääd‹Ö`‚þ™n +J5)4ì„DáÌÒ»ººD˜ +'œ6‡Þ»w/*ˆ…Îæ=yò¤,Šºn8Tó°g@ rèÉ“'‚¬K¢fffnß¾œfô¸qdQT,…—fYYYxVã/<)…‚DáÀT(lsjA²(-]„À•Á ÅóÖX:;;c!J¯báFP¨ŽÊZl¥>Ñ5Öë—–¾Ú­>!i$âe^233!=³Ù,K/P7''¢”c3<<2/++c0KKKY(ÿÜ?•åd îÔžÔëõh!x²¼¼\’D'DGG³§ØzˆmVùÅ‹ŠÔÍHæÉ?k@víÚEÞt:]RRREEm,…ÂBAhÅÄÄ „‰¾BÚ‰£pöÖ××s)P‚U( >—£ +ÆIBßÂ0tÚ«W¯¨Ë… dQˆ… +ƒ–¹CÏ;—˜˜ +$“ŸŸ/ËOÍõ ˆf#ÿ°.êš\ñVÐ?ÜÎÝAÇò‚ú2q¶ÕÕÕ̵nQéT–:ÓGTVÅ¢Í[ ˜–ˆhWKUU• ŠE«|ÅžE6°sU,²(ÄÒÝÝ©YOO±(”ÊÊJj$ˆ‚s…ÜÈÈþÅQHZÑd2©NƳ-Pˆ…¢ + b¡" 7A”ŸÚúÒ'–ofÞÊúgç2&>h! //¢°ë¥Š‚O¦nÉÍÍ% +Š½@2²(8Á-$ ZŽ `@eQ,[*z1}}}”CÅÒÜÜ,ˆB,ø'–ììl­DQcêÿÅ`0R%éâà¥( +(d Y"‹¢baù ‹˜OÈ’BA·È.—ŸüûÓ'–oM‹ñÂFþ­G“’½¡¬n•ÙeU¢l„bŲ)ÊßÆ¢²·Q–·î¯‰…ŠØåǶRŸÄê$ö¬O,šDy«™¸8±hÜŽ2QWµP@л  +€Â3@¼GQ†såYÍ»P,ZP¸}¡ÙºŽå (ñ@)‘°®cù©Ù§>q˜Ã¶.l¥>Ñ56èí_Ÿ8Ìa[æÐ'ÄÞ~³—/_þøÉçÏŸ£–W©ôïÞðÉWÔóê¦S’ûßßÌú!¯mtT:ìwÙj}R>ùêÐ'Ê  ëŒÃ?~ø¹f¼`üùâæ™×¯_óÞà……/Â6üååœÃcü€5Ãìßúä7¦BðòòòðððññINNf´K0ÑŠ"^h¦ÞöööÆáááøøøÊÊJ&}•ÃiÆס‚ôôtÿžžž‘‘<8pOOÏšššœœœüüüÌÌÌýû÷«ùdrrR¯×{{{ûùù9so8YþK¶¾l¥>‰54Ô!HúdãÃ;88XRRr÷î]†½¿¿Ÿ3ä{£ø¯R---<¬´Êß>‰öà™ÂÂBEMƒ!;;[¡˜Íf“ÉÔ×××ÚÚjý°³³“¯ ðšOÔ[[…í°_b}òÇÓÍÌ:99ݼy³   22Õ¡XíV +øË,ó–#¥©© e233CKðüôô4ä`õŸ¼yóF}ñéÓ§AAA<366SÁˆœ .¤¥¥ñ÷ĉ¥¥¥|ØÖÖÆ/‰ŽŽæsã4‚>áÇ(èï‘•ÃìÖVê]cƒ~ié/‡>Ù8Ô××ïÞ½®`œ¡DC­øDi•WšÁCCCÐD]¸¸¸´··óbùaÕ¼ÕŒ‡Ž?Î¥-ðugg礤$¾“ð$ÌÆÅÅñaWW¢…«'##ƒU^^¾œè~[ŽöÿšCŸüñÆø£¼¼¼ÐL½ÑhôôôdfSSSΟ?ÏäòuáëëË=¶uëV´ÇÙ³gýýýýüü”ž±hìÁUiࡶ¶611qË–-ÕÕÕ°ÇððpDDìT\\\UU5>>™\¿~=%%%445Wðá¥K—t:Ýää$® 1WW×îîîÜÜ\P‚ƒƒ;::øðw'Ìaÿƒ­Ö'õ蓯}²q ö€ +Ž;655511Á€#pƒÁ€N0›ÍP²«@0æîîî0_á.«r@‡0þyyy¨‹ÑÑÑÿ°_æOMeiþ{,ðg×ÒÒv¯rE›v4â¨à­,²*âÒ²„€HH@ AvHÄm-ª©q,kz¬©ÒÌCnÁ$,Ú¸L |o½¦î=÷œs1ßëó±ÏŠ+h[H06!"¥Þòøñcºr‰l©®®dŠ‹‹;qâÄ3€ÞÕÕÕq¨IéÅüûu‰&%á“)/…O +>©Ðòòr’J¡À¹Þ±cÑAíÓž¤¦¦ÆÄĘL¦%K– ‘‘‘Ë—/7 *•JáÚxcÿþýiii»wïÎÈÈX¸p¡$Ëüù󜃒ð [AA³gÏft!´Z-|Âd²Èét/›7o¶X,ÉÉÉ°´9%_>9Tæ(H„O¦(X›ÍF “´?ôô5ô,QQQ‡cëÖ­õõõsæÌ$Ž9Bù8p 88– [xJÃ8 •­èq ¢ƒŽ‰èX¹r%DA/ĵk×.[¶lÓ¦MÄ,{\¹r…ø"¬Ø0!!áÅ‹¼ôܹsÄyE«EÿÅ'áÆIØ £/ó÷&š„„O¦¼>Ù¸qc{{;e™„……UTTÌœ9“|XºtiUU•Z­† -[¶”””lÛ¶íåË—ðIaaaSSk‰¶"UH€óçÏ$›Pû\+ –¬¬¬¾¾>’Š[BÆh4ÒΤ§§³}XBøÀ'´WlÈÂ5kÖ°?XB¾0ÍÍÍœÖß_˜hòå“ØR‡Ííþ |2}4–OhOˆB*˜;wneeåêÕ«aÊtÉÌÌŒ‹‹ƒ%´Z­¬¥]".”­Ö¯__[[Ë"¨¸¸\yòä ˆÂæô2À ûPt:ðÉå˗ɨÇ_¼xVyúôé¸|ÂÙxš››+ñp>™ò¢$)Ì +6Àô $`·Û/^LÙÒ¤444€%f³™NG©e¡¿¿Ÿ Rnݺ5Â'@D$ ™¥Œ  C8'¼‘[ÂÄ`0(”Bž(Mk™F€<{ö Râu­­­/ŽŽ¦3â‘¿¿0Ñ$4šOìðÉ{á“é# ‚ú…1ÈŠšD«Õž={–Ð`<%%…ðYµjY!ìÛ·nåرct(ð“——·}ûöG¹Æð ôB)º»»ƒƒƒËÊÊÈâ…AVìÚµ«¨¨ˆ[‰ȇ†è™GÙÙÙ„ãùùù +½˜Åb¡Kò÷&š„„O¦¼¨ÐÎÎNâ‚Ú'(RF ú‹˜˜j?""‚„ + +-//¯®®^°`AMMMbb"Jcc#<£ô0éAt@;¤G]]P¡<"7@xFInO:E_súôi˜„[郸 c"šx—F£aÔafHHˆJ¥"¯ÚŠ|ùäP™£ >™>*hvHŒÌÌL؃¬ ŠÉ¨¨(ÆÉE‹Q݇6™LûºuëH > f’<´3ÊV{öìpH’øøxÑ7)È(æƒ\¸<Ý«²ˆO%sè¿hyH•3gÎp¢‰ø¢½:zôhii)ÿÁÁBJ‰EÂ'ÓA ]M +róæMr€2'(dZz +š‘ .Ðàtuuµ··gee2ׯ_ojjr:Ìg\À'¶âÖû\Ø444x“ ›(ŸÊ rbD‰2º!‚…Û––n9!·¼Âß“hÒ>™æ¢ü;::ˆJ˜Xhkk£¢I ª›x!ˆšBÃb±€å´TUU±„*”|`+ÖÒÔ0Œ¢3ò~DÔ°JIyÔÜÜLæð9/J|)AGò° #JÐñ:N%ñX>™&º3,¥À]ž’ç–Ò† +bccéMFš eš"—' +Æn¥\{?âzdseïMÆî0²vä$_ó/,ú¿È—ObKí6·û½ðÉtÓØx¡œ•¢ 4 +X*¸†‹Ý5ÜN/£š¦¤Í¨ÌÙÜ ûêkÑ·–ð‰ˆ¡³ „¥¹MV¾|r¨ÌQŸˆ¼UYYÙÑÑ1¶O‰>.á‘k¸ñ÷)D'áÑ'E¼øû¢€”ð‰H$úlùòIl©Ýæv¿>‰D_.á‘HôÙÍ'øäƒð‰H$úr ŸˆD¢Ï–/Ÿ*s”$Â'"‘èË5–OœžA±X,þ¤>|[j·¹Ýï?Â'~?°X,;½ø¤µñÆïOzzÜ‹Åâ?駽Ý=w;¢¢ÔC|â€O>Œå“Áþ‡=®»·»sÛ%‹ÅÆ·o»Þ¿ÓPW^QVìl»¥ˆ¿׶5Õ¶4ÞhñÿIÄâ¹½¥®¡®F¥RÁ'eŽ€dŸ¼y=ø¤÷AscmsÃõ±8@Ü:œÀDq[óÍ¡‹æ›Cƒ-¡šj‡<¼ŠÒZÛtÓ×µíÍuC;û,—¨ß­õÕUWCBB7oþ1""rçαvìØESªRí’ÿO%Oà‘‘ühSN&ÚmÅn÷ûQ|âìèP«ÕÍÞ½ÑÑü‹ÂáááP·Z­ + Y·nZ½kÃúõá?ý4Ñ|uTÔEDìÔìټ䇂‚6mÜäã  åË—³³÷ZF¥VSFþ®åïÎ;<&@ÚÚÚ{{ßùYz{{í¶¢ÌŒ‹üëíëÁ¿Ýïéò÷‘D¢Oèé_{ ­¹…ùÉ(>èììì‰G]]Ýf³ñFMU}íµŸãŽnÙ~«ö×]ÛN§¥M´¤¾þ–A¯Åeö"—³íÈ¡˜Y³fEGïÓøjïÞ½óæÍ«©©ñ^ÛÙéjäå{‰?âÛ=®¬(¿sçvϽ¡±}ï^÷ýû÷ôzýÙôô×ÿøû«þÝ]~?•X<®ïyÌEï£øärá8|"¢Š.ô½x:ðòÙ™ÓFµ*òÕË'ÿ²§Øf›hþÀÀ+«%Ûj¹ÔÓåüÏ»·]ÊŒ3Ž?~ÌWqqqsæÌyþü¹÷Úwïþ]{ýZ~Þ%Kn–5/Ûšw‰kå3?/k”=²• ž9YÞÞK¬Ãs”=­ãíæåñ_÷8/'#/û›Wädú:Ã’›™ŸËÛ3-9ÊÅ·?Æ÷m~EYÏ™LÆGî;lE9—~ñû‘¦”=?B‹·s³øá)¿Ã¡ ~–~?d@8'ƒ@.ÈÏá[hÍI8gÉÍv»?l߶Uñ·ÿ?D$ú&úðÁýkeyÿËtˆùyÙ 'Žöÿ®×&]»vm¢%¯^ +^-³_--yü°ëÝo ñÕ«W§§§ŸöUZZZXXX__Ÿ÷Ú7oþ™yéƒAÊlJÖ%ê Z³Ù”¤KÐSO2yÛl6&¥&$hMz­!Å`Ò1È’TC +£Žÿ8F&+ã &¦&$ë’Rô'GíæmÞe2?2aÊÛl2šŒz³Ñð?› :69)ÑhÐ º“ÉIü»øýœþ¶9>>ÞjµvuÝ=›~F¾¯l3¬7R +ú!s‘šr2åd’^§=™œÈOQ¯×ùÿ`¢2îØÑؘƒ'Nüœœœx(6¦âj)ÑΠâÿ +0±MlÌ +endstream +endobj +21 0 obj +<< /Type /XObject /Subtype /Image /Width 741 /Height 327 /BitsPerComponent 8 +/ColorSpace 41 0 R /Length 63457 /Filter /FlateDecode >> +stream +H‰ì×wTS÷ðtؾV[åYq'­{kûª]ŽöUíP«{ˆ({Èž"[ö’°IB„$@˜Ê^ad +*ÚWì;Ïãû†ÄðËeFOµ§‡ïùüñûÝû=¿Ü{ó»ßó½Ïž={òdàñ£‡¿=îŸ4é5êx¿§[(¶'ãYÌ<~G“ £¥ïž˜™Æb¼öË›4®ÿ<îîîzúôé“ß'Kʤ±õÝëêó{º#èŠmp»²,1!–×\K"dL¿·¸Øh}]cC?_ï*9›D$b‰HèÐ'õìÙ3Ø3B>opŸð'Mz]`B¯eª¾¶ªµ¹NÈo…mÙ%êh¬»ÓÚ\ÿÚ/oÒxMõÕÁAÝâN± m²¤L¼ÚbA;¼ò#ñÛ ¡×TWS Ÿ-õÕ“Eàï­¶º²ˆÍ(æ0«*¸Í +5PLšj +è9^î½wÅRÒv¥¯·§ƒWß×Í»ßÓ>¦¶ûó\ß„´Ž£ «Wi-CÄ#¸÷2DRÍÃÝ}Â14e &¤[¦q|%t£A¦Si²ÅÇâçSñàXܪŸ ÑÚÇV7áˆÚ^@-J€Á{Y|^Í+ àÕˆ:›ÒRð:::Юôöˆúîu·µÔ‰ø­]B^—°m4bA«ˆßò§è|qBå4¿ +/N œ¦¿ɽÃ@úíM€¯œÆW¤íu¾”†? ïUƒg(ÛÏÿ5(ÑQzzz½wERЮH?‚¸œ| +!)•‚OËA%¥æ$ɧ©ä¤ä¬¤d‚D +E”J©£!¥€´Ñ¥“RÓ³G!‘6„<$sHúŠL–LÆp**ƒ(•#•…A49*{1;WYI&O†¢ [Ž +èÑA*_Ž"EÃ(£æŽ†AÍcäŒÎ Ñ™#Êùr…yr,,‹ŽÅ–`Êä¨#U0K®00بb&ŠƒU(Q"S„Å’+æ¢Ø%R¥R .ª¬Hªt¸rP ÊÆPQR>8>nEUñè %å•ÜŠÊqW(©¨¬«©À'D_ÔÕ•´+wÅ]ÂŽÒ¢|Ìåä— ¸ƒ¤c6“ÆÈ#Cš‹2$_ …XT¬‚‰baå(`Œ…ESÀœ(Îr‡*¡+OK ÅXtì‰*ÁÊÇâL«@A‘J± +Š•P¦€© D åX… +¸c©Àb)(¨Jé`„e*Ë؃kŽr¶”-IoHk¬-  222‚z"%mW?ìÊÌ"ãÔtp¸…8ÜtE*Cã÷6áæêâæþŠ›{§6hžŽÄüó .¼^xsáÅ7]|k‘î[êºo«ë½­¡7,Ö,5x,3üÐ4|_ÓèýåFS—O]a< +¬4™¦eò–釫€ÙôÕ3Ö\3×^*ë,À¬õ³´¯ÌŸ\ª,Á?7«9›€õÜÍÖj›mÔ¶ØÌ[mçƒmv Àv»;ì‚‹À.Gu°ÛQc·“ƧÅ{œïs^²Ïeɧ.KÁg®ËÀ¿Ü4Áçî+À~÷•û=VðÐ:à©õ…çª/½Àꯀ÷š¯ÏÚo$Öôëù­?â§}äºö·×?ßùþ°|¸ +Ü|4hó± -Ç‚·Þz€Ä÷Ù‚ë€,ð' ý)Bªè ‰hâÀÜ.”ºƒé!ù= ´à.cÜ cJÜ,ìá¬>Á~"9àatÑØ¢þ˜âþØâG±ÜG1ÜÇøŠß(õPÿ‹Õð­ù±…‚̪~˜æ¶âààhii%gee²¶¶‘³±µEÙÚÙaØÙÛËÙ;8 ‡…×®9£œ]P..®(WW7”››;ÊÝÝåáá‰òôôByy{£¼}|ä||}Q¾~~בðWŒ7P¨ÀÀ TPP0*88Š + + +C……ÝDÝ G…GDÈEDFbDFEÉE+FÌ°ˆ“‹‹‹GÅÇ' Q‰‰·P·n%¡’’ð(<>•œ’‚JIME¥¦¥¡ÒÒÓå2†E&YY@Ä Ir$R6*;›Œ"“)( +…Š¢RsP94Š–›‹ÊÍËCåÑé¨|$`Âáp*+«ªªncTVݾs§~º´´ †ÕÕ5(89 ÜHQqñ¨+T×À­Á54ÔTDE„ oW=è"©Ó4õqSfáÐxgêÑ‹âÖ㦼!™MQÑ~w‰1Nõî£3¸ygßÑ€.åì4M½V|VNZ†3´Œf¬2š¹Êxæjc•Õ&*kLfµ¦³Á:3U°þÒmó©+ ß[f0çcs•5¦*kMÕ6XÌ-Ô6^™· \¿YbáKUmóé«Ml±Z´Í¨o·Vßa£vÚ‚Å»ìÀ’ÝÀ~éà°l¯ƒæ^GÍ}ŽËÿÏ~™5uçœvÕu‘®Ú¨m×]¹TÀ +j=ªQD¼AnäF9<8!BrB$ „!ÈM@îKŽ Dˆ‚nw»3þ³e¿ ¶ÍÓ©kÿèùÌgÞ¼—÷~¿™Ç7À£÷@ëDcðX¢ññ¤íà‰;@›äàÉd““)&¶)¦¶(S;”™ÚìzhŸú +x:m7ènžI·8ƒ±8‹Ùs6cϹŒ½ç±à¾ îÛ‹ ~ÿ%….g‚¯:9]%~:‘ƒÎä#à5Ê÷  ÅÒ…jéJµrͲrË:ê–}Ô=Ûô =sŽƒ^ô 7ÝÆ;×Æ'×æ:ã$èË°õͳõ˳óË?udÚû+<ÀÙà™ …ÁgC +Ás¡ð|Xxá&X|ñXr)¼är8÷r„Â+‘¥W¢J£xŽ·yWÁ;eNà]¾3x¯ü]î-p‰¸Æ]c…n±nqî`|¥˜På Þy‰"ïÄjï¤jŸ$±Ïñõ5דk|S‚~(°öZ¡jV^˜Þˆi3ƒAl‚kCñÍaø–°Ì–›™’›É-Bë-bk8Hj‹É"AJ{$µ=ŠÚ•ÕqÌî¼Ò:ïÒºîætÝË鎦ƒ=1¹J½±`^_˜ß2û˜ ¬ûìA0±à1˜T=à€ÃÉE +SŠGRJFQ wÍ•¢K¥© o, +,{’òÇ1`ùxFùD†`+a…2œð)®â)¬œÌ«¦ HN«å¤êg$ñ3RÍ4|8MyøœZ;fÕ³Ùõ +i +s`Nã Þ4OoV˜Û²2$/Á¼ÖE0¿ +\b>Zb=zÅjÅnÍîxÍh{Ý9õæ_‹ÓòñiÙªsriOGS ¿ßóÉqùø`µ[QÆY±’Ï‘4ˆf&G¢#CѬ…eØaêÉÀÒÜSÖ­^Êçd½ž^ÞÑDŸtò\i¨­ŒŠŠÒÒÒBŒÍ¿øÚmÁ鿽²³³…oü•J (‰Wá·CÙï²²jMTvÆ/$«w›)»$E + I*’4$éH0H2`‘à “á=ˆ*‘PP‘d!ÉFBC’ƒ„Ž$Éÿ+_a"a½[…$…H8HŠ#)AÂERŠ„‡äƒAò.„H*Þ£R…*$"$ÕHÄHjþzqfan²¹¡ÖÓÓ~ØNûp®lBÌ–¯ã¯ly ¡÷'ÅÕ*m³ÏÍ¢K±sÅÛ\Ã} »agðÚm74õý5 +´ ׬7‚h ÖRµ!] ZB Zà䳡›L¹²Ñ$l¯}ò~”¦~ÀŽ£ñÛ­â%óMøç»Ãu-¹¢cihgëF„Jùjÿ]u®¨sE+¿+W:&ß@™ôu6öJT•>¸»»?—ËZê+wèéþõ ÝÍzº›·èé\8k?6Üàçu SÔ¿° ;ôw7±Ôzq¹LÚ;>ÒÍaÒj«ËjE¼ËŽÎäš©ßÊmmmÄHù‡i–ûæ 7uÊ+[[[ &=¥pLE£™¸„„ø¸Ÿy?ZÞO—•V<›žžkà˜ŠF'ýŒj®¬œS)dzN6<—ê\QçŠ:W>>Wàá)@6ÒßÙ<ØÛªªt¨“O÷»áÿêå\y)këß¾ÖÕy¢£)[ô|}ÜG»ÜÜ\á…››“ËFáŸ$i¬žöI‡ºòéI£ˆ[Ärrr†Ÿr%7‡´¸0³â»¹²jãÛ©¢¥µÚÊê Óƒç>Yfk„ªüp•‘õU,ñ +ÏÛm·ß!ù^*V‰>ãIÕèû˜(ýÃ÷¾Ú¥kqÚƒhçF€\Ù`¶zëRQ/låƈæøß+Ü`ró¢_öYŠ®E¤ŽyÄJ®è˜GBœHº&þûÓO;Ž%èî¹­Îu®¨såwåJ;äʳ'=’¡þvUdž{ª«øÞÞ>3ÓS^á);n“Oã°èb†ƒƒÝPGh°xFqßü2ì06ÜÇ¢õôt©dœ‹³£™éÎÖ&qcm…“‹û‡reýú·#eãÆ?ÛØl50{k,5\”ŸY;^ÀΗwSɤÔT4 ›Éˆ‰Å¤§QƒC¡RpXLJr2ˆÇeÀ3Ø …‚A¥¤dSÉDBæJ¼@Ú´4ŠeÒ~‘À)`Â-È’lLLT)>¯HX^Êfå +ö¶eâqŠ­Ô¹¢Îu®|t®LNNÊŸJ{Zß)OFzŠ ™Aÿ|µ@£à/ž?Ãç²a¤”pòÒQIW/A®x{{Á ;;;ûlr %.æö—_n)`æØŸ:ùÝ¡ýÝ’r^±««ÛGåÊ'ŸÁ ÑÔÒZ«¯ÿ©™Ù·ë6ña¶È4J×h¬‚«-/ãa‰ÇMÆnËèÓ„ʺAH*«9‡#iéHâò;üïì³ÐøhÌ'’Y'%3Ïy“ƒb8ô¢Ö2q¿kh®–Qðš¿ûSÙÍÿþñTö‚Ênñ ÏŠ-*®ì©jr cl4»µ’+z{¢6›G™Í?þçÍvku®¨sE+H®ðJX¾>K/¦¦'GfŸ +ô´:]½4ÐÓ¦š+ûÚdcýA¾ÛŒ ™yYðdMUÙ‡se½¦&LŽuÚÚk +ט™Y®ÕnˆÕXîÐ )sÅêØqȆ¡vèˆZ6UTQ'UB^¥ ò#/—ö°ZH&@8ÉgäÔÕTðyž¨Y)äÕˆÐ5ñJÄ"4US½XÀçfQÉÅÜ­ )TÊJ®@·PÈD¨ \zöã¾Gê\QçŠ:Wþˆ\¡3"ÃC~Xš†‘òrVÖ\/rwuèø%W`‡‘véPë5GCƒm»v™ùE3r)÷ì×iTSéÀñתE7Äz¤0" +È"0ˆ ˆXApÀ7PAê &,RšI „¶„EVÙIÙ#°dAP).¨ƒT§ }-µ<DZý˜{þçž›{ïû~ÊyÎïæf-r%…ÇÆ`0Òy2ß"Wø‚ +ÅoÝWX˜ L¦§©¬ìаš›F¯´‘Þ#et¸§²¬ÈÕåüÿ‹+A…‚ú9Ý}öäP +‡ã†ÃY­U +Ghæ šûú«1º<ÏKÇXX¢m‰GKœ1ɯ^Ï,r¥¥ëqJŽxøñó›4¾©}øôÌlHtéô̇uºXÍý7`ŽZldK‚6ìôWØ~-1]´ûUßš84ò<"¾r‘+/_Ϙ£tdª˜Wµ±ÞøÜ÷³5öãe\‘qEÆ•¯ã +`ƒ_àAÙÉ’6ÑÃÁ{‹\)ÊÏtûá⋉‘±yÒt¶589žêélþ”+C“¦¢²))1Æå‚“¾n“¨ª¾¶ìs\¹[Sàç§biy@”äŒÁجg!ô påúYY!´ÇÊ:;ëVï½bX˜Ÿÿõ¬Œ4€Ê"WÚš„À•®öFNR"\)ÈË–´Ôã¸Ø˜¡~IZ +/€I'ÎeüB +•Ççl¹ÒÒXoÅÆÆ€UHd2—Ãn ¹I‰x<#㊌+2®üZ®<ꑈ s3FJ^vZ·DüèÁ½E®°ã~>Þo^ŒÁH™|:$¬.»è|îS®ÀðÅ‚RSS…‰dogkn¶6áå-r%59 ƒ¹6õrb¡ÿp¥´RqÛU„Ö eK•TUõXËPÿvô>¹x ­+Ðq„ÖÉí0¶§wöŽë$üFÉÙÎ5VÜþPÇÍ­‰âT¿ùé}R†ÈʉQ^Û›Ão¯m¼”)jÞ²§¸Õ G-É-•°3E!ŒRe?E- Ü1?‰TÝO{p½x>¡ùyåwîöwc“ã*êšl0 Øh iAÈHºúŸ`Ãò• +d\‘qEÆ•_Å•¶±¯Ÿ>î>qÜNc‹:ß2ÂjÁ‹‰‡u5åÀ•É‰'-µvG»ºœs¹à9çxÚý²ëèÃ^_ìUàJ÷Ë9Øax@R˜—ÑÜP_@ÏFï—dWÄõ•ŸåJmy``à*yù%rrëTUwË­àÊ¡ÇFh* ÙŸEšËÑa„¬'§ðê…•ádr—ÌKª©*¥Ñ¨‚â¼’ÂÜû=m€€Ju¥ ºBPU^’q+¥¶ªŒDÝ„dªîðË…™é©ð¸’—“ ~¸‰Ç§¦pÙ‰ñy·³`UmUi\,«”_PY^B$‚VÈp³¾¶BP’_.(d2£Á02®È¸"ãÊ—sellìÕäØ@w«¥…ùÂH116”´Ö?:\”Ÿ\™™žº#ȳµ±r½()ΞqðÃŒ õº»»ÁvrròÅÄè`o{nVjg›FÊøH~έζúrAÑ—re¹2š?6!$¾€æø(…äVJï(!´~òÎ 3Êz=¬¼º‡šÉusÚ²oÜäWÞNÏÞ • U·#.¬£—âÍNж¸iq*r£‘?쬺+ðøå„3žgpe½¾ïN¢úÞ`%=_mË +ó›wãN{rO¸³7^7±8t>FÅ$Ò0Ç`ì/%tbþ~NÆWd\ùr®¤6½ézö÷ñGw+2R9‰qÑ;ž)¬)“´ŠŠ s<= á-ÖÀn±a·ÚD´ÚF´ÙF¶ÙE¶ÛEµÛCt‡Äp!¶Ó â:㺜ã»\â»]ºY \V"×5©Ž$CïÑŠ[*ÜÓúÜÓû<ÒùÇùžÑï™ð΂-"ßl‘_¶Ø/G|,Gr,WâyÒÈ—B<ÅR¨F±PÑ¢ *ZTa(–b5Š…]2€b¡”i"¡\ƒÑ@EËP U,ÃWstÑrÅ’P{Å¢‹–‘¤³£É@EË¥ -ciÐx9š®*ZÆ3ZQ,W3ÛP,ײکb9Ññ#Š%›sÅ’ÓyÅ’Û…b™ÈëžÈãÞD±ä÷ XnöNB~:ÙG9Å¿Åý?C‰àn‰R*úÊÄ÷ \ò+THá·JÙoU²ûUòûÕòÕŠušÿ´jœÜ|9zعúØñÕ³qñ²vö´eyã gÛô)=·ay[Ù±Rk%%Üê +NÖxÉÙÓÆÙÝÞ=°¸ÿ¶fôša®-X°€þþHÌ2³vœñòåÎ芈ˆÈ(ÝDRƒÇhDKaA.â§P281Ó;=ØÔïÅMO¼n¨„ݵ›0=ú\ÁFüôv’n’gΓP/Ù3'Ç`fK—'³^Ê +f¶t1¬FÀÔ̜Ǭ—³$ ÁBB°,$ ÁBC°0 Whèz…½B{sE,cœ]..,–Ž ËÑÉÉ?Nή®®¾¾~ŽS§¦á%8kgg‡÷k¡¿‚££ƒ½½ƒ—·7n:vÑx®üçÁíæŽÙ2–™Ù +Ý?=”—/|vÑBz—ò×MfKÝÍ–:›-u1[¦³œeö’«ÙG³Eö”å®Zyô©nO­t{z¥ûÓ«ÜŸYåñÌj?ÃÏðª×³ðš÷_`­÷sk}ž{Ýçù×}ŸÃ÷Xç÷Âz¿¿­?ö÷7Áá[”EoÀ‹ïÁ?Þ +†Å‚o Yï…‚ùûaðÏ ü_›€½t3{Ùæˆe["–ÃÖÈ—àè—ᣨ—?Ž^ŸÄ¬„m±«àÓØÕŸÆ­Þ·f{š ¯ìH|åóÄWዤ×àËäµ°3å +Ø•²nWêºÝ©ëw§­ÿ*íͯÓá­oàøÛßBÆ;ßQÞÝ“ öfmØŸµqÿ‰ßŸø7È~~È}æ}y›-ò7[æo±,ØbU°Õªpë¡ÂápÑG`}òc°9õ ØžÚf[¼Í®x›CɧàX²Ý±t»SégNe;œ¡üsʬ +ØéZ»ŽTSŽVïv«¯ÜOÃ×µð'Ô}ëg¾ó9³Ççì_Ê^¿ú½Çê÷;·ÏÿÜ~hø@PÓAn²n¶i¶ iµ mµ +m³ +k;áí‡Ýa +‘ˆâØFuÚFwÚEwÙÅtÙÇtÛÇv;ÄqÁ1zœ(.‰½ÀJâ±’y®É}®)}G •Òàv\îB ‘G¦È3Sì™%öÊ’xxC¶Ôrd¾+÷Í“ûå)üòþP  €Be`¡*°HT¤> !Å:%šP(Õ†AÙP8”±Ë‡ÙÕç!²êDUÃÅè‰=M‰««»g.%œK¨K„s—“ áJ24Ž§@ÓxjÓÕÔæ«iÍ×ÒZ®¥·\Oo½~Únd@ûD&tÜ<œ›Ùœ[Ù·²»&s€;™Ëý)¯ç6ä÷Â¥°ïg(âß…“ý¿œPN ïA±èW(߇R <(—>¨þ^!û½Rö°Rñ°Fýß|îø*qr2¹VÁT§L;«Ž¯–$לÒI©S”ŠîôÞší +IµòŒÆÁ2ùCõÅ+Œ\áqÛüýV­Z½d‰9,^b¾i‹ùê5æ‹™ëÀ¾}ûÑaaá´ðp6‡„…‡°Ùìˆê7"#I膨èhâ†k0qÄ hHh¢†„º!¡nH¨ꆄº!!nHˆʆ„²a0Ù6¹$ä 9CBÎ3$ä 9CBÎP3$Ô +)Àš¡™(™éž©¢!^Hèú…„~!¡_Hè3fêëIèú…„~¡5L31hò…CC»Ð/$ô ýBB¿/$ä ùBB¾Èt…øë±ÜX7ré¥Äzá£`ô,V‹‰›áýší +xV†Ïï=?PVRäãã}ï>WîÞ¹©’‹ê:ê¹õM½zg(ô.¥±»¾¡zC£çœQMœ†G:™š;™º¦´Pš µB7­™ÔFãB C;CO+­ÃPocD;‡Gé4®º Cë¦ñi4.C?¥§¿kvݽ‚Yñ(\žÐ¸>JÏÑ ü)½3ˆ§ôOá="yD0¥IÚ'¤ðéÉ Ÿ$žA@‘?"aNQ¥Fˆh2¥!±žœ¦"I@aH­'%ÃM*£4rP§ÐÓ¡¡(œAKQ +©‡ÎÏ›J;¦Ÿ£ÔŽhëk+é\¹3yC­ˆøÝ*¹@­ê)¤B¥LHï‚LÄò»Eý&pg#6$0¡Ç ƒ¡wî¤ "ÞÉĨo6r‰i| RÓúg£4$3A`‚ŠAnšÐ5ƒÂ4‘ $¥ibÓ4$ƒdî´ jéÜ +Ì0¤‘ +kÃZù¼(d&¯ ÖÈq—Ë#šÒâBÃ\¹=9qaP61®½yu6¡Ã<2®5F3WWf¸ñŒ¸lÜõyR_›ÕópÉŠtíqþ±«£ÊÇ02Wã3(fuñ1\1EN¹0—M8oH6cF +Ï‘Ô¨K††æMB%ýŸý2{jóºøßÓfš6}h›´Iêìv¼¯ŒM¼av 8ãÄvœ&©„$´KI@+ha V³ÙØNl7N›>dú·þ$µŠ„Lhf2š9óÍÇåܳé»çünø§“ÅÙP›FÇ•Ç_Ý›£áŒ.ͧÅÛcè¬Wf6.óO‘ÐæÈôÆe.•7G¦6(·Ÿ.#› “”Ù§H`sdbã2³Bs‹À•"úILb¸ò·Gè-ÓáᘠÿNxçû§±LÅ’ʪ]±Å¥¹0Ÿ1ò3¥ØûoL-µf + +ý®G?…òÊ\’*P +jBj©ËO<žÔZ ²xg.¼±Ä3"ªÅÛ„zꯖ–´ü(N¬Â•‰Ñ• +ñ.4ýŸÓº®c¾rWLbÇ|ÕbÒ+-l £ºñ©ÊO +{=lfbxf} ÆšØÆOšÑj°iIËÿ)ëÁàpd°¯UÜÔÜX+— +úž—ªÊã›þ36âESÐX+lªêãΖª e*y‹ËÖéq÷°’t/GÀÑÓAs +÷;zÍÖ®ö‰ÑÁ¸¯ÈþïP^‹dˆÙئ”K›¼vrdc\?ÞÜV.2ÇÝŽ.Üñ’ÄÚT00à5דN‹ 5îAñ£ïàÝ…ÉšêÊ6Œ—µN1Q +ùœ/Î^óxÐ76âãÅÒ©'YîGñÊã²”—ÎEã‰O§Lœ½üjöž˜,<1 Ë‹SׯÖ(dÂûwf"‰§›LZž±¤À>T¾|·Ãâèíòöõ†^§­ËÒiˆ]dÖš€¬‡C}N+Ê<ùÔ£@>lj×xô(l®Õ8(ð2ôópO¯ë‰Ï¤âë·ã7òß^q˜‰^6£/ÃÑ[çpÜòÈP?~×"‡Ñ¯ËÞA$z`«xƒsj2hGÝ)lÄNÀ‹©ˆ»h‚”¿Ãÿ› B{ò;Í&}¼®3qêŒÁØ;.&džâáuÛ°‰å4´¤å'õà +óW£¿ùÆ–ì#çΞäý£+—rŽf=¸3soiŠÿrÐ-/Í[;õo¼þç쬌Ãûû]–wg=X`ã'_©ÿâÓkW.=z0Ÿ4*ºAiѹÀ »«CWy¾B Ñá áŒ0ÊiJñgÒ“rg.|¾´ð•—ÿh³š¾~¸Ä°^¼=*Ì;Râ… £¤1ñÕ½¹ËÕ•¸cšÓ:VY[˜sÙ;÷ïÝõòŸ^ÊÊ<èï·‘ Û1‚w¶ß[œzx>çhf‹ðæã/c.í,/LJ[¯_«yüåBÅùb€Äíè®(+4ÕQí/—gïE6F êÑýù~g7 ˜¬—A ‘•‰ß™'f=KwIÑ9\㫲¢„ô1K +½†ƒ¹™ :P0’`¤>¡Xðwæǹ»©­t³X‘ד8F‚CýFƒ6¦ƒ ˜p!*¿¯B.õ{lwçÂñj¤%-ÏN8’p¥ðïOÆ$Wî/MC™‡öwÔ tAcmyiaIažÙ¨=~, €q;º8«,3ÄÕŠ–];¶™ô*NÜôD ²¼äHæ¡—^ü=´óáå‹/üæùü¼S±+Òª½œÁ³§sMí*aSÃ÷úÕK§>ïÌ{Dz³XUYæq[/T”rRÊË +1žh™n6jˆ»Ûk[^1 £Ðpÿåê ĬS·Š…·Îœ:qõƒêv­üXvfí¿œÈ9²åÕ—•2Q" Ð8øá ?3ãÀõª¬¤ óðÆ›ŸsM#°ŒƒûôZyqÁYaSýÇ×.cP-o!†UvØ+“Š ÏŽ}G³·©[•òþüë'×Þ¯,}wÛÛ‡ì%6æxΑÛ·Ü¿§§Ûp`ßn·˜õ•åŃ>x3èµ—ç'þš´”àPßÛo¾ÞØp£UÜ´õ7Û4²š‹•§ÞËÑ(%—.V€p˜¥ Ót´mú˜–Ÿ«¤À•…™ÑN“ž1=àq ¸½ímjˆÅï±+åŒf<èOœÎÌD{O'pâ÷80ň×ëTL|¡ ±Çbb{]í<oO1\ѨeÁaš’µÛ4äwÄÀ‹É  úYçiЫ/Ó, õƒ:¦6®Q@F«´ÅÞc‡Ø%kcÄn5ð€Tà°uÉ9„·À’¤$À"I¥l¥ ãZ“J„ÐÔhÀ«VÊ°ÉFFáu÷ÂW¸ò¹¸³¬®IWÌ&ýxÈ÷‘Á>ü½–£^#4)åÒá{U +)Áè4ÊA¯S*áŽÅcÛhÀGR¡€ÈIlÑPŸHÔìrXœ¶.ªMT”³p‘¡]CéÄ",RΤ@•–´üX²N\Q~û¯sŽf•ç34ÇÌë3§ŽÉ:´më[—ª*î-M­² ®´ëäÏÿê9”Uò¦9CS§–2‘y9™›ÃÖª¤t†Ä|ñö¸¨¹¾¬$¿¤(O£ã—é¼w÷ŽŒƒ{sOÍÎÊP¶Š Fð}»<.kb7Œz%8dÔ«^íU"ÉÏ;ͼ~ç­7ôZYOWûîÛÁ zÅùâç~ù µBœöäùÒ__o"zMG›Õ°ß…ÓåÅI‰ÔÉÕ*%د®ª€Ä¢[Åy…çNæ½»õ-Xe(YâæE†O>¨y?÷xvuU90†k +rèÀžÂüÓ‚¦º¢Â<¸¸‚a²,/-¸ñÙGW>¨¢òÀ0CÝt*é¾=;ƒÄãxÐ÷â~‡dÖT_ع}+ö3í';œîÙ½ƒjÀlÖ.=uÞô/0-?WI+ÝfÃ͆:¦³’ÁÊ€†RÔ*SUØÜÈžO8†àŠÓÖ]_W+—I€—½»]§r;,r™˜±®QÉ™× Ó¤C“£Á7µkå€ZÙÊÞV©H*2¸¡ _¿BàÉâZ¸Òç´-OI‹{^§4uXŸÔº:ôxg#v¼}6*<H¯ÕLa©0±LQià:C›5¯ÛƯb)dÒÄ–ELC}Ö@&‘ ‘ +HÄBJM +±LŽ +¹Ä)©l4àI߀Òòì„“"+Eô“˜$Å•Ï?»^UYöÏ'÷ÿñõòõ«5Gd0©wíÜ&Þ57È$ÍØYe\a½¨àÌ÷ß=ùîÛ‡Ÿ~|¥¼´ðû}STpö½Ç ‚s§¿y¼œ4ª…Ù1›ÕÄH…(|}='síß»ëÃËUÌÙæ[µ5+ –³_æOMeYÿÛº¦¥kÆqÔVÛRۥǭ[uÚ­‡vìÒql—n ;ȲBH d!ûKY‹ ®Óm×ÔÌü0?Ì罧)ŠÄi¬¾ªo½º¹¹÷Üsî»÷œÏ+ûêü‘?<~ôW>÷Ž€+]ºÖ¢/Žê5÷™þÃÓÙ£‡Þ-¿ ¨PÊéÿýï>êÒ¶V|w0€1^<ŸÛ¿o70ðp6‘7Yq‘ÉHÌJ -»páËÓÿ~ñø³CŸnݲ¹ªâöã¹4,Wª{wú šÍ¿ýˆx§ÓÑ\;™d¤ìÒ—ûö|Â7ð +@·=»wÔUW°Ê¾½ŸlߺÅlÔ“…Æð"pR:÷çÒƒö~ý—óì^驢ܨ™î¶0’ +Ä%¸h×ÎmïéRWVÜ*ýSèxéÂÙÿþçìmsCÎü*Ú¨ZWºtjS_'Yb2¤MíêjUö~ +ëÈy<çxƒ+ ‡¡Kó`*>`c~:UœƒL2”׮ƈÝL]f–Ï=D™K˜N™ôÚ6z d„û +ZuK^ à +ƒáž:M ‰cëÇl}­ +`h¨«v ôºô"oZc} +káv^ƒÜ_¾€¨õ$OºÅlêžœ57ÖcÇ鈅<2°„ÓaQUUZú&¢KqB¶ƒ?’ÿö¼ñ{ülnªsXýÞaiÍ;jcšky5@—¼êÖf&²n·^W<#/™Š@°OPP +.YÍú>›À{œÍDé'W½=­Wf'cׯ^>yâ؃Õœ:»óã­ÁÒ’àÊí›×êT©ñàËS©HS}Õ¦_|ÐÚTÓÒX +f;r€¨¶_?®´4‰—(÷“3OrøüøaÀ€»vn?UrâÚ7eðOù¿c‚ÆÂ×_KOs-dáë×.oúðÖ=¸ÏóÇÓ‡ìýþöu +7,q¦ôdIññn}Û[#œ#Ÿíº¹xþ ýv+9!OzÓÝP?s‰´VU~ôð¡¶æZ˜í¹3gNרÊKŠ>‡.Ê¿»Á¿ùÕ¦«ß”åÅ@B×Ѽ훽£ƒgKKΞ.IÄüûöîÞ±}˽Š[ عcÛ©“'®\¾ð0ìô©¢ׯàdÙ¥sw¿ÿöÀ§{x/° +ø’å: ®°ÃŒ2îß[\tì¹ÓŽAGPÊî]w´5Ðè3tä¾5EŠÖJ+ãJ§¶½§[Ë dE“ª +®Píƒ&c¯~\É)”KH¦®Få†Ì  h1hé­«©¢:S:aÊhn6@bgÐMmµö÷ð! °–ÙØe5÷bÁjîá/R +xÀãBžš‹?ºöúºjª³¦£ʈ}Ðè°™jªïuéÕÚ±ˆ›ÝÀü0™i;Z dª¼.‘å\à +õÕ쀑X:ZÌ=šövÚÁ + Â`lˆc¨ÿ^e~æÅ㯦†:!8 +NÀ`\˜DÁŸ1?1…AqŸêXÈÒo M }{ŒÂHpQ.lÈL…“,M˜Õª[{º4D +˜©ÛšZšûÀÓï±+¸¢èí \©­WŠž=™—•‹+|æŒ:,Ôqî…\µL]Ã6§·êîmª6%8×2ç6àu4ÖÝ£ +#!äfVeùMuK½m ×ç±;ífê~^\‰Šß2c\®s<â1;©é÷«YŽ¿HzS‹Úû›ÖdŸuêfð†¹xÎt[Dnñ Å×™{d€¶©G º¬ýÝxK愯L½º¼¸‚“¬‹5¶e2î3h˜îqÎfâZu“`Ðåt˜_.¡#›…éYÎŽEŠhxÈ4bïǾSØÓÊù¯æ•ªòÎØià_^Π¥?qØçΓ0Ž{8ÉÒük1uò4t¶Ã6¼‹äÖ·WýË›êª6#vòz¨HÑšh\á ú=°†Üs +Ɔ9fS·Ó‘ÿR32äsÚú(”h©Ü[Á±(»íÌõº†ìVcÞ|"Osá#Y.ö`ÊfíÃô@) `‰å,QCV#«ø½òwÐ3jÞ©x€Ÿ ™ê/]OO,".A{9ƒÜV¬E%ä +‹©[¸È?ŽA%„I\b"ßžÈq±¢èÄËZ!ßüÄrØ?J~#(ÆØ,â¾1€Á•»9õñ +X‚`p$?dDÞQqÁŠ“AÿrÁc ÜЀ‘}SXEÑ[Õjp…ÛMe$ +DMO„øÉ›N ™d„œk™‘ ˜™ŒN¥ÄINOiL§ +%á +æ.çÓÉ|OѦR“I¦’–Ã&¦èy5ÀŸ·æÒÉ×ÍÌdŒUXŽX¤ï¸da./¹”6.ÁE<åúNÏr£RZÀ¦Ü¦!¦3“ vðgñË…&ÛwR/.‡l©ŒIéEÁ·]¯Óê´OEŠ)Zµ4ê Ï©ioÎâÊㇳî«FÓQpß)R´Î‡h5BÐ]_[•‹+ ó3±°gn&5?›šJÌÏ$iÌÍ$æ&é\¿šŸM܇µ +Dz#©ùB{¢HQ®8œS)¡½¥1‹+LÅÂ^ú¥”2!çž ””òNHL)r£Ðž(R´Dó’2ÉHµên.®‘µW¢!wÄïüéǧ£Îa¯Çãq9µ-ɘŸþõ¨xÄkèÖ%qKþŠ…=¹ï¬&¢>‹Éàõº3IA~M¹"¢qa ÑXÍñˆW_ðèm %ãþ\\¡Ÿû¯¾°˜¢QaÀÒßkÐ&b¾‚{ûÿÊÕcÐg&4–üŽ[åÕ{DJ1öè#á€H’Á¥±d#z³”" +_?yUÑ;.p¥æu¸òÃóG6k¿Çí²Û,zMkWÆ…—îÎptÇ>; W+@Eî¬%ƒq¸­õþd:Icq?דÛ:™¿ÑÖÉËr1¿¡³ÃårÏdÆóâ +¾%ãé”0•h¼ÖIÉ$ Î$#Ò{Y)ê¸6^%)ZYËá +_I?ýø¬¯§3 ñ4õvfqeÉý]}J‰G^“R²Ö6¥@)ím­³3™%¸BJá’¦'Bÿc¿LƒšÎÏ8Î:â‹îÌvœñØVªŽÚ±UWÛ¾Ñq•ŠÚ©+‚H \¹¹+§r +!G¸î3Ü7„;@¸ÁVt™©}Q»Ò/ü• “ˆ¾qg̾Ãd“ÿïzžÏïû|ÔŽ“ü\Hädôöö¢’kW0+\@¨‚+@ùÑû˜¬ e¸Wyô)8 •TB&paWœæçɵ+0*°+ +uUy‚L® ¯òéñ±áq1 N|t[SÕèP÷GÄZ*Yq‘¬¸(qkÝÌø¬‚l i›ê+ÒSù‰¬•0fÔŠâ"8±)IìBa–Ü[åÖÕ^ÏŠ‹à0£8«ñ˜Ri‘@¶RpÉædgŒ“ì +ŒJvF²ãu|Àd6²oxmKƒ(#•WYš·‘Ÿ`øÉÓÉÁ5au1$K{°K¤ÅZ[[§ÆIvïD|ueÑ}_/ª‰ÍÔèžÏíŠÒ¼ñaùM +lµ­jlI§±™ÑÄlßÆJ1\s}eNFr|l„ +efbPª”E*}±RnWÊJ +`Wð—°+¸³ œÌdæ*O ûqwG̶òQú»W V#*"Jù9=&A“R+*R’xññÜ8 ¥¬ø‰ÜlÇШñ•×¾EJ—S]Q¸>¸%7'kzjœdW&GúØÌ(O÷›3¼‚Q\õÕ¥@J]UÉ‘‚0Y¤@ªD#½ScÙo€”ÅÈàšÁॽ¹ºµ±J6?'GQéÑÇëœ>õŠ‘¡‘¡>D16¸ §«{ö ’_ÁÚ0+.û±-ÃÆÙɺnÇ QMìpø2soWP¹ Öo¿ùe5;5´‘}›—¤&±÷îÝíêâ475ôAJ`-µ(Éô^VZ"ÔX[¦¼é¬‚bl¨»­©:+= DZÖÑ(±+xg¯¸Éí–“•-;=)7“Ï°¦ãh@~¹Ã!Ù)8 (3-!ìa€þe~"ßË]uLdŽÀÉA3U"•Tú(»‚BŠ"÷ÌÍhR.]Ô»çã £®(»¤@Ýâ/wSʵ«ú—Q_­MU¨5Ù_Mõ?¼wü˜ÎÙN™¿E +>œÿëYÝsgÜ]oÈR‚¸¨ˆ„@Š­±ñ5 „·ÉDÊ·+O'QJ;wî(Îφcù €k:<,hïžÝ!Á~³@ÊjÇT)‹,œD6¹Á{4Ô”¢×Xã‰D©]‘J:Ú›k®ÛZÙÛY sÒ0ÈïuÛµ¿§Eîp@GrGù($HX€@æ}¤ ¬²7Èß׎aeË° š99Øfg$}Уªôe +)ÄãÀ®ÜOmЮtµÕ™ÑLÿûúõòê#‰êèPŒ +[Eï_‹£CÝüÄ並TÒ-•tÕW—¿x>ýóÂŒ‡Û +555´Q¨èµ`|~ä¿¿ÃFñŸ3S£ýЋM¥$q´µ·_Ð;36ÔCz?Ò[Í¿ëãS_ßèïï_RRÂd2óé“°+“£ý¹Y|µÕ綇 .eåF¥ÝÕ^ðÀ>ƒ«?jjjd¤%Àb)ßgð0ÿIƞݿÓÒÔ òõñ|:©Ì­l¨àIæ×_ÿF[{ŽcmVŠì +ÎeLÚsß×+Èÿîò›W ÝÜdùÍ¿#‚}î¸ãd%!ˆ×(2¥öt4¼˜Ÿš›–þôlkù+KóH-(—À‰=|H«¨(.>Ÿìélô»çÅ°6GŸõÙ3Y¥_›>Ê® ë«K¬­-—ß=|>ÿСÃæTüŠT°ƒ}mÒþN“Ícñ&F$}]­ÍõUK ³ósct3W¡0sb¸w-~fbÐÃÍaß>µ;žŽ/çß"ååütTøCí]Û©¦†Sc¤É£Ž¸¬˜²²r ÅÏϯ¦¦6<<¬VT„É\èòí +\V|l$f²E]·6 +Y¹¥GÕˆŠwíÒ262øî;ÍŠ’<Œ¢|{A­DNìÍŽÛ ¤0‡Ë‚T®f§¤ð›¾úêO'¿—‚"»‚ÐÕ妛µüzIÿÊßÝ\œ–—_Á¶……Œ“' hT#`dþÙ8°/€LË{WÎ(ôÿýû~X§£¹ñ-5p®7×{B•TZÑ'Û•îözs3êÒÒÁ±X¬¯¯ìرÇQa¤»[*é¬*ØÚœ£›ŸŽ 汸 Ín¬-Gf¢Üò#²l 8xPÍÚêÊìä0Ñ@ÍM +ñØ,--µ¿]:96´îý(.4#¸ýù)),ËÛÛx©­­½tñbTøƒ¾îÀˆÜˆ]ùvçN4³“ƒJ6 +õÛÙV·yóæ›Îöêêê,fÔS¥ñ’À¶‹[kK +rÖtb ÿxƒ¢Šâ±(´_|AOÁ •e‹\»‚Q01+ ˆQ]Q¨spÿžÝÚ•ey !¾li ã'ýè®—(‘™šÆçd¤ðö0è~ ß]l‹l0¶QT–Ÿ’ÄÎHåÁ­aøys}…‹³ýz€«¤ÒŠ>Ö®4Ô”ZYY¬Ù•òòr åGŽd¦%LŒ¬+ùá®aÝü”µÕ¹˜È.‹¤$q¹ÈFK:H©v­Å£Ð<ÝPóp³6ó)Ïf¤B‚44ÔÌh—§ÇÖU"’r½å$æEGÇ)¡¡¡ÕÕ5çÏë&rc%«>ÿ]°B»Â|ATúÁû«Ê Ð)©”Ry‰Án7ñ·@˜Eª¾÷…9´6Uåg_Õ¿L ÄaFaEñö•{âû£ V"7N¶ËPdWð}]U±µ¥YSmyIAî¶mÛN?ÚPSVœŸÍ°¢>¤Ó:B#é)< `^ †t5¬p,?1ÙÉx¬@ZR˜{Çã–òíRéËîÄ.ìŠóÂü¡Û3šéâââ²Ì# +ïxÞ"9|t.ts“¾>úòr@g'],¶‹-ÓÒ~451yµ´°´8GÊL® ²²¼öâ9þ;½œšÄKp ®þydp]Î#ÃC‚ý(JjjšÏ]<¾AÁx‚.êéžýáô5ƒQ¡^6bWˆÇÕÅ?QÔE4ªñÉÇ€>{;+´Ø’ •ˆ~ÁŽa¹iÓ&'Û­[·zßvSdWVh9>PQš·sÇv +oÁº™õ[¤È®` 6–ÜÛÙŒîiËôvêGÿx¤GÜH1ºŠ÷`¤­óör‡ÃLâ1µ45´´4ñ7(à^Ÿ‹uÉN[þ”æÂ5a”5F÷æ?ÉÌLKD§öÙ“Y¥_•>Á®XZÒùå,RXlNè?Ò-<<ÐC1¾øÓ‚óò²O[«èh=‡ëŽÿûÏÏK‹³°7둲bWöîUû?ûeÔä™Çñ×ñ®²K­­­uV@TP»ŠV¹An¹I‚\rc8äRQŽRå>  +„@(Q¤ A[EWëø÷ö÷K‚1¼$vÛufw¦Éü† o~ïó<ï“ü>Ïçw22øíëy¤¼}=›q1]Yœ±žÿðSx,=œJ¥•””ÆÆ*§/¦§Ÿ>gnf¤§«ãáî"V¿­+óíÉ™8À–t¸ÏÏ8È õÍÍL^=Ÿ´¶2ÿ‡î÷“$& cHÐ4MŒ 89Ú¢ÆÑ2¬\¹2';ý#º‚žŽQYŒ´Ýj;yÝtˆ$¤HÔÔõÍ:†§»K?¯SUeûÒ¥KW¯Ze H±³±ZI‹ÄVŒÊ"`dÓ¦y¤/€ P#ÞÖa;9·ÐXa +<çœjì §ázõ˜˜pÊBüO­+ÕÕÕ±Ñ$]™çÓ(^<žû»w™ïÞô c2M + +0*¯U•—à·ÍÔ¬0·ŸOMVW'Ž¹¬©f–!X F\ÌIMMÂÖz®àüíæ²¹8::Ø…‡…DÓ£±1ôàÀˆ°>^n{ÔÕz»Ú„Çô¦+K”,ÍMúx\Òá. Ô‹§ã‡ê¢ê»Ú›½<]×®]ƒ%&‹bvf´¤0Åþ½ŽÖ‘ˆ +z:="a|ˆÆþl/hšPõH#‰“4]AÚ}—Fñle×·µÜPUÙ¦¤¸ùvs]{k#¶¾Ar*4;?f_J8EGûSU^ˆ6§ª¬içSÏ Eïï0#»±6;óÂÄB-T¯U—â^ñNM²à"]ÉÎþ!=-y±®¸»ÙNMû .@Jxn®®…™E-“UU^Ìb–‰— ÎШˆÀ={ÅŽÅ|&#<Ôoï^ÂÓc®<â÷µ6×ÛÚXº;*BJLtTHp@dxÐQg--‡x¿©+y9B ,_¾lËEg{Ü"­z:õpû¶­‡ +õÜi15>¬°ùoO¦¤Š_@KèGzZ*Æ·³µj¿}o2.#±W@ÖÄèþ‚Ð.åçfG¤iº‚ëܶ&_ªW·¥©áÚúõë5ö~w§½¹±žIóñ|Hºh¤&Ÿ¾t1©,+RàÀË©˜¨œ¬tG” Ka1˯^ÎÆÚÄG@TZ”W½ZÖÉ‚Е‚+Е`ðDÿ®TTTHÔ_ª÷Çþ³³ÞööËLLSS‚pr"LL EE"íÜ9v⺒š”ŒØ·ÐИ‹»--ÂÕ•°´Ð×èºÿqŠ±‘AP€/ÕǃêãéãåçK +²²0ÓÑÖ¬(¹äOƒiiº23Á/+ÎßðÕ—ô¨Ð +¾bT½~>%­µy<Á¯e–ËËËoQRDï°Uy‹œÜÚØèÈgGÅË\£ü{€í‰@_ð$ÀŠ÷X Žxt$yà À‚ññ‘ÂæÍòò½YÏi+MW/g'’bMMƒ`=-]\6çö +7Wg<àãÉaÒ\8PƆûõé%ÆÇ ö¾z6‰Õf¤ŸõòpÅG¤€DaÌ;͘]xÛˆ¨ ÿ‡Ž¶&Üø?ÿ1Ëâÿ*>‰®dffIÔO»_ÞDõ÷Û[ZææsH±²"œœ BYyÕ•¼\q¯F…ÚÙnn¢ºƒÐÕ# W—º‚2q°³¶>bŽj ÅËÇËH1>lpØàPEéÕ¾¨ë +ôãâùdXGDXÐÆß´±o¼˜“¸K +É—Ìø‹œœ²²Ò¦o7â/’“up“ˆàÔ£Aw×£@ +x oÐôýÔÕJ"ÛüøÓ# +µÕrk×*oQBs731$)uùòÙèêè` ˜M˜¥±áš³£è456Hš ²Ñ×Ûq@G A¤`gãcýû³â# øÓßr«NÔNòíg_/÷J^ÖâÞJ²øúÒÏãBWþõë¯âla±j£O†‘tefb8(€B§orv&"#‰ØX"&†ˆ‹#¨T∕§… +åÿãö”Ä$ø BôrsuOŒOQQ%ìí´ÄuÉ~¾>¨ÙuŒêŠfU~G££]ÝXl o¨¤¨ h%F„ÉÒt-J¦§óö›—3àånGb±ŒÝèëRUÙþíÆo° ¯žO¾~1mme¾fÍš:V%©xù‚êãõpôÞ75Pš÷+¹·X‡p +EvÆ…%K–@!„ÿJãÕb]ÁCM>€b»ÂBÑฺ8¹sŠ£ƒ øˆÄŠé±ìÆëxÄÕüì@?*¬ÆÛÓ-?7 Ÿ.~|_²®àqº:Øw{Úða×ΨS‰e‚#»›Û²~ý{öì~:5 7¯´45Ö­û¼£µq\Lº„ÚG×°s‡ÊêÕ«j¥³Ó#Â'•†ä'œŠÆó:9Ú¢+Ä—"ñË’¨+(ùGüûö¶G€¯Ä„س) p$—£)I§á-„lKuEÑgŸ­Þ­¶«ðJÅÛHñ¥z•]Æò€YÒ¤¸Èn¬½YÇlc7LŒ ðH¯D# Yˆâë +®›™š°jk[[ÛDI +ES >ÜÞÃÍYNŽ8x°±“ KÂƆÐ×_•qéñä©Êp{©x3³¹vIô:›r¦õV3Øbk³_\WÐ)$‰SÛµ“Fñ¤Q¼iT÷ÐõÈu{3Íýû P>Ð!a²4]A¡¡:€8tdõµUË–-OOK#Ò‡À³óºÛæôÉÅiz|5_Bg„+°’§!OðÓÎ&âSoOש±ÀòG¾ /bû¶­+V¬‚HZæb]º +:²åË—uƒ÷{ UXê…†‘4ž÷~/×ÒÂkKMŠÿçÓ±Zfy^NFUy¶ãýLžT€£¡[7jv÷§vn[‹Y^\˜Kúºe! aü^]éél111niiG +…BKOK^Üé®û‚04$¬mæ‘bmåK ŸL‘ ò?Nup ôô> ¥²¬¨º²|ëVÂËÓŠ¤+A¾ÿNý8Í›êãíKs UßwÄÊT[KÓÄØÆŽƒõ}¾d]A± ˆp £ê .gcºâÂ<ˆÄÚ# tA£7‡”Éá3§cp¥¡¶ +·“ò‘rÂOÐ’Àâ>Þ)`´¾ÞŽÏåå¿þzLàÉ$_bûפ+BÕIJˆÃ\æ&À ¯›#@J&¾Gìy~:>mMAk–¤T•€,FtqTÒ:1>B|÷"ðF˜/m²ø3t¥ð*tåÄëWÏ„±XWÞ¾yÙÙÑz—×ÛÕÉê +®C•ëY•yÿf¿Ì~¢Ú²0þæ³ÿƒñAtG“›µÅY'5qÂy¢8ç™F™ŠIA&A‘Af©b((æÛ¦ísÓé×þq–UE +2ô^Y©œ³ÏÚ{¯uê|ßþVÈíÁ·t7…——æÙ!ˆÛ¢¼ClTtŒé«ççd½é¨wü,‰¯¶¼Ú±}Õ¢…s~ûí‹/ùã÷Õ+ÝÌŸã³Ý³«µÎlˆðÙæí»cëNÜݲ‹ƒxÝÚU¨tð®o1œ\Ñ]„SJbì«¢l§<0¨ÓjÍ)‰q´NÀ{°U¿NJˆ®49mh…R“¡…{§»Ó»™ËòáC€N®\ +„cß´×£Fýãt_Ìe›½=ãã"…H^â]dHliqÎˬ4Ô&l±(wâ.äÊŸŸÿ›ó¢±±ž_‘+|¥8Ð{hà<*"mlXnùüâãì)¥´¨ 9~|í|±ž~ÿë_¾RŠÛò¥nË—ÍŸ?çÈ¡½=ß¾= +¸_øD£”ݾ¾n[â½iCù«¼o±é\®è¬¨š¦‰³Ø)¸4)KJˆA H€F€ÅŒÔV•:¥jÏHK„¢\áó3—æfåeæeÖV•MÝJéêhøØ?b§0É}°#k¬øØÞ\k”+Ê•ON®@ e%¹…ŸågÕY˧0¥Ôš{ÞthlY>áÉüT!6K[sÝ¿>¶4TOuzT>]¹‰\ñû4Ð/n”+ÍZLs=¢¥RœëÁ‘)ëM6scmù„§1…ÔY4†´Lx&Ê•;u§r¥yÚQJ£¢åʉ»–+ +¶ÊiçšOxcáµÓ¥åÓÑÊ• Ïj|ÚPJ…¢å“Ù‡äÊ!øD\äÊ?ÿñ®¾Æ\mµ*W®\ùx[³-91î«\ék³*JQ®\ùz{‹Í…\±*S¦LÙ™S¹2ÑI)S¦lªÚ\ñû4Ð/®äŠ2eÊ~Þ”\Q¦LÙš’+Ê”)SrE™2echJ®(S¦lÀÆÆƦ¦¦úúz=Inëêêȇßjͱ«‚Y.ÄU´´´Ã¶àšÒxÆêXSn‰a)‰vKñ”u$§{Ù°+—X[[[«f¤Ä^’ƒ¤'ÆtÖ‘ÿ“¬”hJ®Lrb:â¾×€ã׈AÁk +^\#…0à¯_ ¸t±ƒ0I² Õ™Ò €ì2q0\Õ’N„¤Ä¯>()1(·<ÍëR6&6$Wü> +ô‹+¹2†&âÜ××7)) ¼ð‘WTTìر#--M€ ðo54ü‚‹«W¯nÙ²Åb±ðò^odôÀ:„ec£·ÆYú¦ÆYblôìÙ³K—.9räîÝ»"'ÈA{ãÆ +“ÉÄQÎøÉ“')J¤WfÉÉÉÂ*zù’ OKKK·oßÔÞÞÎÔåååµgÏž’’=½ƒ ²Thh(µU«AgÎœ‰‹‹ÉdìÑäñ÷÷ôè‘l››Kþò®Œ +×f³yÕªUîîî¤÷úõë£G’ƒ··÷ºuëôôôÌÏÏïìì¼rå +·DÞ¼yS§Ye.LÉ•ÉlàâéÓ§àBð%D!ÐpÊ3úD®+++¡ˆÀÀ@@X‡zœ .j??? |ïÞ½#è+Ëj'NœØ¿?0ÃÞ½{½4#%á:–ã@X4 I^¿~}³³³l@zsæ̇‚Í;wî0Hzdd¤0ƒ>|öл¶L@üÀ™™™Îõùó矢k“~‡HzŸøøx8p <ö¶mÛ@Ü»wïX„¶ñ€V9uêÓ óáô +Üo°[ˆà‘u¨¢··ÕAÒßß/ò žÉÉÉ!@òÑ3¤ü+V º`6Î.;wî„‚H•¢¢¢¢¤y™!:H’Ú:’”•· +É•Cð‰¸’+ch5šyzzr‚M²k×.ŽBК––Æ8 +‡#H„:è2ž?¦Ý:çþýû@†q ˆ7"ìY‡Ÿ¹à4ƒ–``·X,²<‚Iªªªhpˆá–f™L&xÄ1‚Tàè?pà‹ƒk?~Ì. ˜éË—/'Œƒô%K–DDD$ã‘š-[¶Œ*hy¨bÑ¢EgÏž•Yl! À‚( +žBb4G ,` +ƒ<‚UÊËË)„•aK¨I:õë×S,JƒôÈ$((:7oÁ‚hªsçÎQÍÓYÕÄ,äüÃjH)BÐ Uó”k^/׬@½P(܈áuÁNEEEd%r…ÕHƒ7 +²/tÄ›ÌÊÊ"=+¶@5q +»#’O™ SreÒX«¬¬˜þþþ´'|Ø|ç€y€pƉ,++“¦V€yyy ÂVM6@q¢@äÆ"!00Zèîî™ËšsçÎ¥%‘V‹•á1 é,nQAûöíóÒ,!!lB>¤1kÖ¬ôôt‘"L„÷XNûûuú›ÓºÆqüOñ^x!!æ˜ÄmIÌSˆj*1&¥bJ„”ís¨y¨!†Ò½õ˜¥‚˜C%ÿÀùä¹be婇£O{]iVV׺‡ë¾ŸõûÞ¿ ü« à –·rs5,!S7EãÜꟿr3~üxƒGè*CeÖ9rDÕ3iÒ$lÊ”) Áœ`øÓ§OyÉMø(•Â*è”E³FfWš5ÍÔÍ¢ÐΪU«Xºy +^ÂC+ÓEYY™WNR¡Gor£P穳›`ý«%­!\´iÓfíÚµ¤ê-0`À€S§N„ÀÝz­X±¢mÛ¶Zj¯—Wæ¥]»v‘°¬­¨¨gœÔÀBéÆW°ð0à@¤LÍ…³[GΤ(­[·fWŽ=JÅûÄØèf ,>HCÂ5ĺ®èDp><†©mB÷îÝÍΛÙ Š´ N‚‰ÆcÆŒ1ÖÙC ·'«qjTRFÐ×'Íb!Õ´iÓ ˜bZä€Bh,+U›JGă/é™NËž={¢—²yófÔ‚Äp›2磌–Ù•oFfW~Ù 7Ÿ1D8pé…Æ;ÖªU«4gÈ$ +¨ýû÷S"nøæÉÐíè§V…FÚ®ð De™ð`2yòd7hOþNyÂ'£â¸uëi#z+à (êë륇 *Æ762æÈ¡GŒ“.‘ E{رcGƒ¿â+d>zôhŽH’æ•$À*¯ÚµkƒñŠœ•$òÑuÙ$Ü0©öïß¿oß¾Ö‚*ÏŸ?·9°à +MÈÀÝyÈS­\¹ÒºäpéÒ%ôfW +_ìÊŒ†÷¯ã/³+?1Í$éÔsÒÈàÁƒ•œ€+Õ0öJoŸ={¶{÷î!C†P\Ô + {ðàA’|÷î2tíÚÕA¥ãõÕ«W¼Ayyù²eËAäFP^uèÐAñBû•••+sa|³¼^”Ehx¢½ñM +PNd“R«ƒž6åtÍ…€€3njeZÌûòåK4“-¶¬Í…„ ++ÉŠŠ +Åž0Ná"=ÆÉÜl¦Y¦EÐøëÂL[DõÊfaL‡Ÿ®A<9sYkhh0‘ÙõÝ·o|é([«–›¾Û¶mƒb[jÿ퉅ëÅ´pwnp’á±!ª¤óçÏsM9Ë-ÚŠo4¯TÙ$ýÚÈŸMÒ&³+ߌ̮üšοsçÎ]ºt5jTûöíHÁ¢Hs† jE +àð(áã×÷úõë0b"¢5è`9 e¡k½ˆÑMžŸÑK C°dË°Aƒ¨Î€ñˆ‘Y +Âä‘H¸¦¦†ÜzA$Y…ôdR]]¨Œ +_Ä®€!Ô'Xeÿ ŒŠÒæíÛ·*X¢xéÖ­›¥­¯}j †˜Pª#ËSθ‡ÚXˤ®Ñ1³+ˆÌ®4k„]¡Sê b¬ªª"šuž:ÙBàuâ„„‰…BiçÀ¢Óïž={@(š^HØ +ÝÙ~ês(÷ìÙsÇŽžÓ,ýª˜ +9ø—º8È@ŒóæÍS³°îksvŽô¸S;——,YBÅØb’W‰ >Ü}€‚®ÑR>Œa!¡Æø&’$ÎL:U +Ë÷ +Ç,Ñ@Jã©2»R€øbWþÀ“øËìÊOŒ°+qß3N2ä{÷ºwu,†jÂDz‘ª.®t3jcÒH/V›¦}òʽŽñ*V9Äž'£%¯Ò?VìyzÒ¤¯”eñÍÈìʯ”BD!äø×' ú*g¢ï'øê¤ÿÍ{ØxÞ,¾…±+é)ýý4õ*ûùjq&„ÜgL%}kjjTIGes;Ü>4mÙ²%MƒÚ”ZÓX«môÃ}õa´ÏûóT]Ò™çÑà«0Ì›´ñFåmWz-A‘EóÅ»2£áýëø+˜]ñ[ß¼yóäÉ“nœ’;wîܸqãÞ½{ëëë/^¼¸iӦ͛7_»v-+f›Š(g’ªç{ûF§ÖÚœB¬dˆä:fñ[FsÛ•8)¶nÝŠUUUOž<9~ü¸{O|‡¤±}ûvÿ²ß^>}R ñåÿÄ4þ™boŠ< š +œU¿w´ ]yôèÑêÕ«g͚ş:t¨¤¤¤¸¸xÊ”)W®\©¨¨>|øСC᥮®.+ˆšŠ(~¸oSÜþ±’!+4²HGsÛ§aee%J•••)m.\8bĈaÆíÛ·K)ÊEii©WË–-ójÈ!þùgvŒþïAìÿ™<ßlEß_ìÊx…±+÷îÝà +`?~<»røðá7n¼{÷nýúõƒ +òðÙ³g<8p ²(NÕÛYd‘ÅψÂËæ¶+âÀHòùóçyóæ +0`öìÙ>|¨®®Žb§ªªêãÇ‹-#GŽ¼{÷®å6Œ]af®_¿þoöË-&ªkã¾ô­/}n4mŸúdÔ˜&j´^¨â%(h@k±qpD. T”È.rPà€ x¸”i tDÀ€áv„É”h`£È:ÿ²ÛÈ:¢Ýks†~¿ìµ×Ú{³Xk}ë·pD:ÁWW×]»vñŽ‚ä¹mÛ6ÞQÀöíÛ=Ê;ŠË¼£ #èï(CƒâÓ “w”ÇïرcI%þ“2™ é…ëên•DWª««³²²qæBö@§§'rHII N@.\@ºÒß߯×ë‘R +xÇ¥o¿ý–÷ìÝ»W‚(GŽ‘fulݺUšÕqàÀÞQ°¡ìܹ“wÌ=üÓ0!yÂJ‡ŠóŽ²ÿþÝ»w/©DÜÐÐPaçÊ +ê +ŽxÈ3‚® {@NRòóóq\BF…Ì´µµáÿ]º ÏìÙ³åó$22òÔ©S\C€¢¢"Œ8ï(`ß¾}™™™¼£ø-À; +:‚îðŽ04 ÞQ0Í0ÙxG¹zõ*6²%•999Ě⺺[¥Ò¤‘ÑÑQ¥R‰ž›ÍfNwüøqìªwïÞŠˆˆ@¹epp°¡¡)º‚î—––B$xÁ¹sç R¼£¤¥¥Á~yG Vv@µZÍ;Jbb¢»»;ï(¢ªª*Þp6INNæ%<<üôéÓK*>ÖÓÓ#îê~?uÅùD¸$ÓIFF DÅÅÅ[¶l‰ŠŠÊÍͽuë’yzzú70o +’DbÃ8ƒüÇ;ʳgÏ$è 8{ö,Tw”ŒxGAGÐÞQ†Ä; +¦&ï(!!!K*±Ü°¬:::¸®îVþºÒÞÞ~ñâÅ„„$ +Ÿ°°0üÍËË‹…œøûû#ŸÜ¾}ÓMgÎœÑjµxØÛÛïBWîܹ#—ËyF£ÉÎÎæ^Ä; +@f–`uÄÄÄ`—祮®N¥RñŽ233sòäI›ÍÆ;¬¸¥¥…wìÔм%•>„Ã`Cqu¿‘ÔdŒÂÂÂÐÐPœzF6nÜuÁ '%%œƒ°Ø;€®`¥¼|ù’ëXàð…üÆ5˜˜˜@yG×®]ÃÞÄ;Ê¿àAwxG ï(˜f˜l¼£`ᤥ¥-©ìëë[ºòøñ㬬,d ì;ÍÍÍ8ú¹»»»¹¹!©–——{, P(ФV«Ñ„(¤/b‡®H ÀeeeUUU¼£ô÷÷_¿~w/Áê€655ñŽòèÑ# ÎYV«õÒ¥K³³³¼a¯Ä–Ê;Š^¯Ç®½¤òþýûÒêÊù‰1‹p1©tJ†óQWW—ÑhDöèííí^‰ùD(£€'ñ˜4ºB«žU£+™AHHÔ­ ' áõmmmBƾ Gæ‘LWbÕówЕåCºBˆH~~¾‡‡‡lµsèÐ!¤‘×»¿štåƒ!]!± ]±‡t…‘èèèððpÝjÇËË«¤¤äõî“®´’®„xH®+~È'ÂÅHWˆUMBBBeeåJÿ +î$%%•––¾^OºÒJºBâAºbé +!"Е{÷î­ô¯ø£Ñ¨Óé ¢ùÊ•+¤+oƒt… ÄBr]9?1f.愺òŸööž††9I‡ˆpVëÊ‹/T*•L&+**â÷Kêêêrrrjkk/_¾œŸŸ/îÇIW@ºBbAºb]±ÍÎþl4j}}︹åVWŒŒ¬ÀhN…c]uqq),,„Exyyeff:þšÙlÖétãããÂ-Þjllʘhn +ü“É4??oµZëëëŸ?Žššššèèè¿Ü³W ]qé +Aˆ…äºâ‡|"\Ìyt9¿H¯ÿaóæY•Š)•š”±±¿MM­Ì˜N‚½®` +Á.tv`+OMM…W@<***Ž;vóæM¡ •‚]ü¦¦&•J…¦äädxNII Ê +…¢¥¥%==Ýb±¤¤¤`,//OLLŒˆˆxòä ~ƒF£Á[2™L.—c·›¤+ ]!± ]±Ç®ä)ƒQQlãF¶vílDDöwßýÚ×·2cF8 öº277)³cݺuØÈP + +Ý°aƒ‹‹‹Ð¤T*­V«ý§ ±±±(˜L&4 +677kµÚ   ®®®àà`èŠÑhœ™™ñññÆ`‹ôöö6 –˜˜˜ÞÞ^¼ÃIJJ*++·›¤+ ]!±\WÎOŒY„‹9­®L_¸öý÷¿ö÷¯Ì˜N‚½®¼Ž^¯ÊŒ(Ì®·³DWÔjuUU\E.—CQ>.ÜÖÕÕ +C]PB“PƒAÿçäDåää$ +F£Ï@>¬/ ]qé +A|0V+[¼%]±Ç®¼¤¤¾øøe£G81ËÒ•©)64$ÉÏaaaa¤+RBºBËçÇÙš5ì“OØGý^ض>ü{Ž\WüO„‹­ +]/~ù%míÚæåq=‰y·® 3<€óƒÉôί™ÍfN7>>.ÜÖÖÖ666 +å‘‘4 + ·ƒ¡®®“É9±Z­hÂ_OOÏM›6ý…½Ò®Ä{qãûê+öùç,:š>Í + +›HWìù0]#juÔ—_>1›E7¹y·®´·³°0æíÍÊËjrrR£ÑÈd²¬¬¬ééiÌU¹\®P(q›™™éë뛚š:55500€…ÖÝÝ?77‡ÞêííÅJǾù¾sû®8€t… – 2SUKMe²ÄDÀNœ`99‹H®+ç'Æ,ÂÅV‘®€ÙŸ~JþôÓÒâbÑpr^Ñ•¹9Éd²W®  öñÇlÍæåÅ||ë•JfµÚª¼¼<66“ÉdµZa)ÍÍÍZ­6((¨««+88¸¥¥Åh4ÎÌÌøøø`‹ôöö6 ‰‰‰x±³³3..Þ"z7IW@ºBËA§c—.±²2f³ý—ýríi*Ûãð|ŒÉ¼˜à›™øÆ“I̼"Š(êHÀŽ´PZ´@¹iC‹(N s, +'å@©Z+÷ÒƒBÊMZ -ŠH.ëüÊÎ`E¬ ìV(ëÉN³/kÿw÷j×o=Ëy87Gž>^«ÕJ$’‰‰‰´´4F'áp8f³Y&“AH4&??¿¼¼-+++ggg“““•Jecc#ÎCZ¨®xª+Š FÊË7Õ˜êŠ+Û×ÐûóÏ×~øÁ<1±å +ßà󺺺ˆLöÙRÓÓÓyyy¹\ éî‰´¼{÷—x<žB¡p8&“ —¸\®A@HII T‡)²´´”••µí×ZÕ7P]¡P>Åô4‹‘QdffSí½®+Qv«™Ùˆê +xwé’øòåG­­Û)BÙílJWv?TWÜ@u…Bù˜ÙY’˜Hb·ÿƒ»¨®¸Â–®¹9’›«äp~U©¶[Š²k¡ºBu…ê +…âŠÃAÒÓ G¬Ö|/ÕWXÓÐÛûF$Êš †í–¢ìN¨®P]¡ºB¡¸¢V“ÌLÒÖ¶•{½®+ÑÈf#¾­+`ffåöm‡óïÊJªQv›×•ÅEb±¸kÐÝÝ­ÕjÙùZlCuÅ +TW(Ž\¸@~ÿ}먮¸Â²®€ÎN{llêÕ«ÏŒFv +Rv›Ô³™H$¤¸Ø]›ééi3ÚíH¨®¸ê +…°Ø‹‰ZM¶^Äëºe·š™ì]!ΙfI,.¸|¹T£a­&e7ðY]±ÙŸO¤RòË/αì†ææf(Á`ˆ‹‹ +…˜þö]]]W¯^MHHP(*•*""Âh4Âm²²²pU©T¶µµéõzNg2™ + ×jNNN¦¤¤p8œêêjLôµµµ<gìvûëׯoÞ¼‰ÃŠŠ +\BJp¹\<Âb±|üݨ®¸ê +e£Ó‘›7‰JEææ¶[jèJGG¢žÙÿß*Ì!Î3‡Øa.±¯+àéÓq>?%.Î80ÀfYÊÎƽ®ôõ…:AÞ¼!Y•‹ORYY ý€rìß¿_£ÑÀOÆÇÇ™KMMMûöíÃbbbø|~yyyfff__¼W322ªªªFFF’’’p¾¤¤d­&¦Ñ7nhµÚ‚‚‚©©)ØNkkë;wPJOOÇ!ôö’ššÚØØx÷î]¹\þñwÛ#ºâšøt=Üð)TW({$[X)/g§š×u%yÂlÄ[º‚èÀ³®®I‚¥hqq±T*-++ëïïòäInn."º¥¥åùóçžÒ`·/ddHx¼ÿhµ,W¦ìT\u寿Hr2ápÞo_}E¾ýÖy’Ë%~~äÀ÷—D"âp|Pª¦¦&//Q ŠD¢{÷îq8µZÿ6œ'0§§§tc +'³³³¡+Ø‘Édñññ6›M©TâF´„Ÿ”»ä†„' ??ff&''‡z½~aaáÈ‘#‘‘‘ŠÒÒÒ_Óçu…ñôÑKˆt""‡KPÊüF8«½½yBu…²7ùã"•’Ö7[g/èJoo/&d8ò³¶¶644488‰#Â<((èĉˆ—ÎU<¥+ ¹y86öZB‚ix˜ý┇«®¬¬ÆFW]ÛŽ%?þèÔ•úzrãùé§÷—ôz²¸øA)FƒIS!,‡|>¦ChISSSRRNÆÅÅál·ÛñWÇ” +ÁÀIfÅNjj*ÇÃ0¸Í`é*• +—0ÉBr®\¹ÒÐÐpêÔ)<‡ÍÍÍ­­­(e6›OŸ>qá‡Ò|üš>¯+XÈÈår¤r¢ˆ„úùùt‘…º‘òôéSܨR©{îÿŠoPQÅùDTlŒ&/ꊌË4¿21ñŠ®¼B¡€¨ mð²¬L±>=sæ ’=g dtËØC‡qVAÚ°ßãþ¹,•þ7*ê_JåâÒûõ);†Íè +¤Åbñô×ñët¥¯¯>˜»ŒF£GG÷3¯èŠó)½½yyyp¬wÂÂÂðyýúuÈIhhhEE111‘‚3ýýý?D +£+555`úó) +ÅsètäÂòð!û•1Ž˜áƒ<ÁÐà b}t¯ºR$/ä\ +Ÿ03ñ–® 0¡(Œ®à93>>ŽŒEœ†‡‡Cf –BŒ®èõúcÇŽÕÕÕa9iñÐb2Í&&Š££µ¶z¤>eg°y]ÙÕ¬Ó•©©)í*X#¿xñ££û™çuËd’©Ñhp‹,yˆµZ=66“Á>tehh¨¾¾—]©¬¬DÌ2}‚Îù‚¿…â!´Z"µÚ¹òbLÄÌð‘H$ЕžžG÷†¬éÊ›©If#ÞÒIaaaHHt%>>^$•––òù|ì#d2Ynnî¹sç>ˆVH ”†ý_‡ÃA¤R%‡ó«Jµ¼¼ìñÇQ¾,êŠÍfd¥ë¬Ó•5ð…1¬:;;=:ºŸy^W R©ôàÁƒÙÙÙÅÅÅJåÿÙ/·Ÿ¦².€ó8¯ó6ƒ™d_Ì‹“y›™ø2C21QK´\§Å „8€ÐÚRZ Ü¤1¹S˵ÈU¹(APŠQn­––Ki ë[Ø|P¢”žsZ¾õËI³ÏÞçìµNw»öï‹D"|ëINNF9ÁJrëÖ-ì ‹½rå +^ƒKuÕ}oEEExx8ûëB,ÐÚ + ”—ÃÚã±ðÅ!$$7tþ»¿ÈŽ®X–æÜ°¥+ƒƒƒ¨" + + +CCCX=°˜`ñ)--5è**•ª§§gxx/@]¹xñ"K +¡Óõ††&J¥–åe6Âìr]±Ûavö੬Vë»wï|“–¯ÙOW&&&N†®`yðàA~~> +,OŸ>mllÄFnn.V |ÇÁ!,)Z­vrrßq(++ K«{uM†ýu!F±ZA,l6–"â_ïÄ늻nŒŽŽb+>ìøøøË—/PQÆ? +¼’m]±Ù¶RSïñùêêj6Âìr]¼¼ƒ§ZYYAc±Ùlf³ÝûÇ;CîÎÞÞÞ……—Ë…?`ìÜØؘ™™ÁÆÜÜœÝn7™L‡>)ÄÖÖÖqêsN¼®`ÝÀêñúõkw­À‚o=î6V å0ºb·Ã'×`HW¾é +䶂Dåå°¶Æ|0— wÀWþ©àóïüöäçÛÆ«11ø¶å']ñ„c]qS[ Zmv~¾Óéä, +âØ ®ÔÕÕq㤥¥‘®ìé + |üb1h4`³1 7\µzS ÈüçŸà+WÎë+*š4šßÿø£¾¾~ç*ÒOüBWÐb33íõõ⬬––ÎÒ ŽX,Öëõ\gÁ8¸#ÞOºb ]!“±1HO‡ÂBV‚™ÍP^þ^$*ˆŒTæä´´·w´·Çܼ*hkjÌ8ú?HW<ñ ]qƒ¯«juqeåÝ¢"î“!¼B£ÑóO:çÎÃ2òùã“®HWˆ@Ãh• + +xþœù`ËËP[k‰/Šˆ*•{{¿~9éŠ'~¤+ÈФ¥õµµ%J¥Ã$ˆ€€tÅ@ºB•• “A?ó‘Öס±Ñšpý§ŸDqqÝ݇¹‰tÅÿÒäÁ(/¿wÿ¾úþ}®S!ˆ£Aºb ]!— jk!) L&惽y¥¥c¿ü’qá‚R£;ä}¤+žø® ÐÛÛ9<œ’’bµZ¹Î†  éŠt…ôz‹¡¦œN†#ÍÌ@q±ñêÕ¬¨(EQÑà‹Gº›[]YœŸ%]9€H6ÍæÜ‚‚’’®³!ˆÃBºb ]!üžž¸t >d>ÊPn®C H +#oÝZ´XŽ:‡ºb1ÏÏLM,-Ìœ®llÀÜœ÷‹vdÌfHL„ÉÉæîné;+++,Æ&/!]1®~Ìà ðxPVÆ|$ÜOÕj§@  +CãâÞÏÏ{7 +‡ºòѲ83=±8ÿ6°tÅd…JJ¼\7/éì™lÃbIÏÉ©ªªb76AxéŠt…ðW>~±x{#³ÙŽd6Cyù{‘(?22U¥êyöÌë™8Ôã«á‰ñçæÅw¢+ïßVœHMÝ>Øfn0 Ý£GJ…+3ëÄ ]1®þ‡Ýqqpõê¶G0Ëò2TW/ݼY!U*»ž>=æ|êÊäëh,¢+ TBAÁöZ£ÊåÇüâ½¢¹“X³XR32êëë¹È€  éŠt…ð3ŒFP©@¡€çÏ™VSAAttˆHôzròøóq¨+o&FEWZ[᯿ © VW!"~ý°üèõ»ÇÄÄñ—âpLOCBjq…N—•åt:Ù +LGƒtÅ@ºBø•• “A?ó‘A(ÔDGóbb†GG}5+éŠ'ûé +:‚HR鶙tvBZœ9|þî!‘ìªKs3lmùj}¾„NYYv‹EœšÚÒÒÂd$‚ðÒé +á¸\P[ II`21Éဆ†Õÿ- +—ܹÓÖÕåùIW<ÙOWܼ} ùù Vo{‹JµgÈlÞÕ•¦&ˆ‰Ù#3xËÎè³g¾X¶ñq‹Áb).)¹{÷î³%n!]1®~î;¸]ÔÔ€ÓÉdT¢ŽgrreX˜8%¥¹³Óç8Ô•ÿGKW +èí…ôt()9—üâÅ®®”—ï1™¿ÿ†‡wG§¦=iw÷¶ô ‰‰‰‹å ó®HWNii‰d{ÓY[c8RW—S.—=Öüøñ~è1áPWÞN½z31Xº28¥¥Û¹9/¿pœxGNðÐé@ ص¹|Ïèððþ­XA!‡¶6lÞ»wO­V{™A0éŠt…àÜ­x<(+c>ÒðÙ/Ó¦&².×ü‹ùóiªÆò“eùÁª©©ÒWd'%Ž"h™2ˆ–!!Å6„€@QB€DßvÂ&HDâ(xÞÓ„HDʦ'ØOuÁíôrn÷í{ÎsU“ŽŽ¹nn)|¾¢³“¼8ê +—Ë‘IkÞ¼š±]Áq__‹ÉŽÉI])(Ø0Ü + 7•ÀÌ,ÀCÜÍF êQ5§¥%,,¼"«g44_ ­+´®ÐPÁà ¤§ŸO~¤áa½›[ž“Srvöãöv²£Q¨+q±1bQå›Y›Ð•¶6bôþ~ü®_‡ÖV²G†`qÑÄ^¢£Mì%3êJ_ÕM•”¼×ChH¶X\ða7zFCó%h]é u…f×YX€«W!$fgIŽ¤T÷÷±c¾¿ÿ><>Nr0c@Êtåý»Å© íŒn܆tå—_]ùáøé'_³ƒaj 4¨“@]Ô±uçîÜ)ƒÿÓüúëЙ3†‹A(4Qùyj:IóÝBëJ­+4»V¢øx +‚™’#‰DVäêêÃ`¨Ôj’ƒm@¡®¼œ|®ÖOOØ„® ðçŸàëKüU( ¨üüˆ-?Ÿðü…2æ'€7'ïjTBppÍ… r9ÑIc÷Œ[^Þ†º´¶R×UšïZW:h]¡ÙEÊËáÆ +ho'3Æ»w /°Ù%þþI7oÊZZÈ f…ºÂårdÒš7¯flEW`ÕX°î›ÑÛK8~*L&*çšî·f,/CN‹±)®©ÊÈHXÚ|¼¿CW„B“Að`ãèè¨%ñe2ø㘞¶ÊÃÐìh]é u…fW¨¯//JÉŒ%F*]Š‹«@QIL”46’lk(Ô•¿þŠ¯©~°ðfÖ2]éêêêÞ +ü}û 7ŸÖÙÙiÜņñÐöº2?““Ÿ}™XëKJÖ 3“Ø•ËIµ­™š‚˜xòäíÊJJJJmmõçNć[—ܪª 8xÃ^RRLŽªT_‹ï¤²`ß>xñÂÊÏDc»ì1]Ùœ7Ö“Ï6‡Œ)…Ö²‹!1î߇÷ïÉ ÓÜ !!"ëlHH³RIf¤ÏB¡®¼U÷ë§',ÐÌ÷îÝãñx\.7Ô’’’mŒ¥¯¯/??ŸÃáàijµº¡¡Áx…B¡R©¾¨+;G£!jýÇk&”DìjµV²íøçàp@$Â&&I|´÷_ÿët&ºRP°a2¸nB¿Æ¿(f­­Ä…W®ÐºB³ÁžÑc>ÉÊʼ!‰4Muu5¶ñÌ($¹¹¹¸[YY‰‡êêêpÞajjoo7¥u…†$="*KY¼}Kf˜Ž «g±¼X,IC™‘¾…º¢Õ h†{gg^X +žžžvvv Ãõÿ¸¹¹9999;;¯/mÌÀÌ)‹=<<ÜÝÝýüüš››SSSwÀôÒ³ŠµtecMÏÎ&jýÍ›D["­uûOxúðÿ‚Á””ô?èocqÑÄ^¢£×¼Å׎;;HHÀ¯d2ptJ¿eš{FWp!Ãçó1K`ÞˆˆˆÀ¥Mddä‰'0á…B´÷UBBBðPll,rqqÁe^Hë + +Itu”–’¦¥nܨõ÷OŒ½_[ûþÃ’ãm…ºòt¤O=¤²LWÐFªªªPKž?Ž+š¡UÆÆÆúûûñw\×lyžƒ™3Ìòò2®€Ž?îãã£ÕjññpYÔ×ׇºâííMÒÛžœ$*~m-„‡ŸÍ^s€ùy«†©©´4x÷› ''ÇŠöµ™¦&8~˜L(,¹N‚¸¸5™Yßx<ÛÁÜ…Í¿†ÑÑѽ¡+HEE>ˆN§»|ù2®‰BCCõz½\.7.vD"ÑÜÜ\TT®•§¦¦0¯ÚÛÛã_L)¨+«+«08ééÀç“W¡<ÞßÇŽ]ðòªª¯»´Dr¼/ƒ•*]™×h5úé téêêÂÂd2[[[qÅãÇ·I¸ÒÁ%®‰<<<<==9¦SÌ'øðGlc +rtt¬©©A{™D½ “Åŵ +n¬ò¡¡ 2k††Çf[[[\\¦SkÜw š›!5ÊÊÀÝt:ó£££æºmâ3˜È+*ÌÏÁ«hlüÒêV¹}û¶»»;NºoH;btŘmT*ÕÅ‹ýýýY,ʘX,>}úô©S§ÊËËŸ={võêUl©Õj™L†)ó¦”ÊÊJã;!oÒ|¨Õ‘·nAO™aZ[!+«ÀÞÞ‡ÁPaHªÁBlœ>ééé>>>Ož<±îìþ”Ouå^ù]åå¯_N[¦+¦‚Ç9r„ËåbVtpphllÄÄò¹óbbb"##®’¼½½Ít…çСC~«`¶Ùáèï'j4Vm&ÂÂÖJöÌÌ·Ý‚Ë…åelbá@O³JW·ûþ<ìÛ;ñ»în3ACCOÛ,0¸¥¤˜ æm…ááaãô9yò$–iœt–挲 ºBDâñxl6;-- +eçºR]]}àÀã;Á—CõøÐØ*ÄÇCPÐ7—†íÑéNŸ.9r$‰Ë•µ´i§à<2NÌ'¨+8‰¬>»Í CWÐLQQîܹcgg·ÿ~¥R¹®`ÂÁ|RTTd00ç899á³kµÚÁÁAT”7Ì-‰äܹsÍÊÊZNN& +7~œ»##_¯Þ^ˆ5~Üø–^¿~mõ¯ƒ®²´d[ét溒˜h®4ÅÅ&'ÈdÖ Mc-pMäééÙÓÓciÎØ)dë +¦•Jº277‡‹£óçÏëõz¹\Î`0\]]E"þåìì855…‰ÈÞÞÿbJ +…—.]¢z4hl˜ˆ*€®26Ff˜¹¹%oïŠß~KºuK¢PÉBp6ùúúb½¶âìÞ’Ouer\£Õ è§',Óca±XMMMøÞÞÞ---Ûè +>fDDDxxxqqqpp0¶Qز³³1ÿœ9sïÓÛÛ+•Jñ>T FCTáª*&ªsR±«Õ~å]ÈÉÁÿË?feeდÐÓÝ`hÈ\`"#Mì½®²Ò䥒êNߌŽŽâ´Úº‚é…ÃáÌÍq;GD„!((^")28‹´ð¨+E…šú:–º‚uË£GŠŠŠŽ;æt:½²Ê$׿®0xòd©É^¼H5_•Š74¼i)¶áÄD˜˜À¡^¯—J¥XÛ}›ìz¤¿Ÿ©+¸‘ §)Mt4sM{;ßyo6®¬¢+`Žµú]ûÐÕ`6ci« +’ÄÅi +†9•hÍàQWF‡Îž¶‘áÇ,tÁ2èp8° ®tuu¡½455­2É +§+Ë´´Pmô×_©öµÔU‡†^_òœê»FŽðÉD])++ã)ÙõŽÉD““Ü\š½à•„!0.ßI¯?ˆ®X‰®>œ‡!%nÜà2†Ã}Âöï¾ÊÛ8€G]‘ÉRM•·§&Ü,tk F£ÉÈȉD[·nU(2™,++«qÖIn\]yÌÝÛC©Þ:TUÌ\ =­Þeùø£y<~³ÝˆŒ1u%)‰©499´|'ísˆ®X‰®>„ÎNÉ 9<à,ÆÐÐÌwßéwïýùge~>ga8G]¹t)îvYÉÌÔ( ]iii‰=tèÐÞ½{ÁáǾSó jkiº¢ÓÁ©S4¥ÁãÚ5¦öÌÏó7[ˆ®X‰®Þ•+W¨Íà g1l6Èʺ²k×½û÷9 Ã-<êŠL–jª¼=5áf¡+v»=333 @ DGG«T*…B‘ݸë$7·®¼âã Hú;¶¬¢Ò¯MýuûÎÝ +ÕçæøÎÍ¿éìdêʹs4ŸùñG(.¦-¨¯ç;é·@tÅJt…ð.ÊË!.Î45ANŽñÈ‘ãÛ·WÔÕqÆð¨+—.ÅÝ.+™™e¡+è$¨¹¹¹aaa"‘H«ÕVWW÷÷÷¯2IѤ§®ÆÀd¿@«Ú»7)2r,, T*ª64ðá%V+MNnÝ‚3ghwîÐÖ47óô"DW¬DW+‚úz=g¦§!"Â/‘ œEò<êÊcgGÃ>2ü˜…®X¥©©ippP§Ó …Âýû÷£º4.Â:I?Òdf$0Uâp|b41ñ¢Ãamk£úV»Ô +årjj2ñ*áí¼x4]Q*i>ƒGr2m““kŸ‰Ç.׫)Ñ+ÑÂ[°Ù@(„¼<΃-[à£à“Oয় >žÖάVŽ3'ø–Þ^Úý‹£ný§ŸÂPgÿú‹è +¢+X|qÒÒ ) ,n`Ã’Ëk¯ŠD™EECÃÃÜ„áu%--½Êh`§+¨%'Nœ‹Å +…"í%éééW¯^=zô(.hlld‘¤Ÿê +26/.ë…^¯—J¥XüW¾]¾º¢¢àãá‹/ '22 4ôÕqݽËý!øÙYØ·H¨©ÑHt… ÑÖÑ+WÁAn +Aaá@ddh``Rzú&n]<êŠR™Ug®šf¡+è:N.—§¦¦Êèh4›ÍÆ.IÿÕäùsHOµÚ;Ã^Ó××·òEø;9 Q*22Â<;?OÓ•âb§ùŒVK|fÃ÷]©„k×@*±øÕÿ‰®X‰®ø=åå7Ÿ>9 7oVìÚuZ K¥óXÃ75<êJii1Ö™± ]±X,­­­ííímÿb5ßůuAû¿pš›½3,³hƒ ï¼î·ßÀåz¯&ÍO¢¢höræ ”–Òøç}Øp`™LKƒ;©Çg™õ¯+÷ßžZ“܈®ø3uuz=gtººÏ?~óÍ’’îÞ^ά|¯+ã£CÞ£öž©Çau°Ð•e°°Øl¶µJÒßu™Ÿ‡ÔT(,ôΰØÆÆƺÝnŸÅ_Ùg²²hg‰Ï¬+<šµ®s]Á—½ªª*==\ö8ÍÈȨ­­]“ÂBtÅ?±Ù@(„¼½£?Ú¶m›000¯²’›ëëJØ©Ð~g—÷X½®`ÁQ*•X +‡ÝnÇò²ÊmÑ•%p? •ÂÓ§8œ˜˜‹Åf³™ïœ(ìv¦®¬ì3ÿg¿ÜšÈú8üoìŸà¯»Ùdý¥«fˆQ1* +Œ.D AD­a‘IÁEnÊ¥Ú +¬\´‹@Y°ÐZxQj‹Ü´È­¥‚pÞWߎkX,L§-óä„Ìœ9=óí”ùœçŒŒ°]ñ6ÆÍuÅh4fee………I$JTòóóñ®X^^n06_§+Û +ƒä䉄™Ù‡†È;ƈˆ°]»Š<`æî‹+u¥L. +:~ü|l Õÿª=ør3º‚(ˆ‹‹ãóùR©´®®Ò‚B<êt:ç&ätå,,¬éJ]u¦Õj…B¡Ífc·¨¯ÒÙIó¡f/È +Ç«°—áæºB½ìðp³Ùl´3<<üÊŽJ¥R«ÕØþl¾6NW¶ssD qqdjŠÙ——IF†šÇËJ”JÛÌ ÷pk\©+ÅRñé3gZš©V\,{ÚÖ<ónÒi]–ŒŽŽÞ¿[¤   Ã‡C]zzzœ›Ó••D,^S‚·o +Æoa»¦ocd„¦+2Mf8Ÿa7פ‡Éd’ËåIII +ÈIBBBUU•Á`ÐÛÙ’Ú8]Ù&|üH’“It4±Z˜ëQNN;w5>^Z]=19ÉÀ=<WêŠôVaLLÌ´m‚jMf§-Në +ìQ˜˜Èçó5‘HŒKÎ¥ +§+4°UˆŒ$Ôö›iii3ž¬ôïßÓä +ºâh/B!íjGÛ{2n®+xÙ[[[‘H‰R=Nnnn||<"ê²Uµqº²&$3“èt Ì>6FîÝ{{þ|8—YX¸W&×ë +ò„jEEE-MªÍè +R¥¬¬ìÁƒƾ¾¾ÞÞ^t*•J웜›Ó•/1Hj*±X¨3‹ÅråÊ$0»E1Ç>s÷.Mf8Ÿù&Ü\Wúûû±Ç¹|ùòÈÈH—ÑÑшˆˆ«W¯"L¶ª6NW¼žÚZ’žN4¦¶ZIMÍøï¿Gñx¢œœ¥•îáI°¨+………›×¤Á£G *µµµíííØ"QÒ✮|…Û·‰XL>=•J%‰æççÙ-Ê5¬®ÒäM&£ÙKBíê“'lWìN¸¹®Æœœœ¨¨¨>;¨ÑZRRb0¶ª6NW¼›úz’’Búû™™]¡ÐÿüsfTT~EÅð›7ÌÜÓp¹®DOYF©v¯ênÇSõÌ»I§uIˆx‘H$Ø(UWWk48ŒÓErºòu´Z"›:3›ÍIIIˆwv‹r¾ðì³bci>£Pl_Ÿqs]Ñét0–ŠŠŠ€€€£G;v,((6uÑjµ[U§+ÞJc#‰He%YX``öÚڞݻ³øü¼òòW ÜÀ#aQWZÕÿéêx75î´®èõú½{÷ªÕê¡¡!lˆüüüš››9]a©”>S*•×®]ÃêÀbEîIk+ÍO._¦ÙËÙ³¤¦†6`i‰íŠÃÍu…zßX,γ#—Ë›ššZ[[7“!_ÀéŠWòì # L½¸ˆŒh:z4a×.ÁÌ2"CžŠËu%yBµ?ÿÌT=®{?cuZWzzz +Eì$É&³‘Ó•õP«IZ™™¡Î°%%%Y,–ÕÕÕÇã_ˆÝê<…õ}¦¨ˆvÕ£}Æýu…¢ûƒƒƒÃììl“É´Uµqºâe $'‡Èd L½¼LjkÕÇŽeìÛWR^>ýá÷ðlXÔ•þþþW¦Þ)˨Ӻ‚MŒ¥´´T*•Êd2$§+ ²²BÄb¢P|ªÂcøð!Ò899¹½½êÂbž¶iŽr"Ñì +ÏÛqÀÔÛo÷×½^ßít%222//Ïh4nUmœ®xssD qqÄfc`vf`ÏžÓ?ýTPYÉÀìÞ€Ëu%~B5ÜÙ29nvZWà* +…"ÈN``àÙ³gõvœ.’Ó•G¥Z[Sççq¸ðáŸÏß³gÏâââÊÊJXX˜V«e»>oc}ŸÉÈ ]íîf»\Ü\WP^öë`×ãç燓ɴUµqºâ|üH’“It4±Z˜½«ëí¯¿†ÿøcvY·ð¬‹ºb6›»õ6ë˜Óº3ñ÷÷úôéÄÄfú×tuuáËb÷d0ðqÑp•Ó• +a6“”29©¸w/77)))Ø–fggïß¿ÿ±ååe¶«ÜX,4])-¥ÉÌ?}¦«Ëuµ¹¹®àeoii¹uëV~~~ÀX4 +Wu:ãx*:èïíí…Ò`Ø‹/ÐOe:1 =Ô)¾8Frºâé@TÒÓ ~Àñqfùr|ÿþ¨ï¿ݼ¹´ºÊÀ +¼ +u¥µµUYSõ~Æê´® |||°VÞ¼yi#—ËõvÖù¤¸¸‹lyyy__ò*//û)8Œ…Ó•"“‘ââ–®®ÔÔTœ +ªÕêS§Nùúú†ÛÁ㥼Ï“íZ· 49A+( ÙKb"íj[ƒÅ¸¹®@3šššp066fþÄÛ·o±ëQ©TøÆÇñˆŽ††&¾Q}}=Ñ¡P(ÐüA¤ÔÔÔ àý7nÜ€« O8]ñtjk×tE£a`jFæLæîÝðäበnàm¸\Wb'TÃÝßMMLŒ½qZW'ˆˆ’’ì‰ÄbqYY:×Ñ|ÍK—.]¼x‹irrrFFÆéÓ§‹ŠŠ/ÈUè²…Ó• +17Gòò°Ú¥Þ¸q&<ü¯öö[2Ù‘#GVVV¨ëÈjJWìqqq”ÃÄÆÆ>|øê_^^f÷lOiºrÿ>‰ŠÚŸ1IQÑ—n®+F£/>Ç <âNwîÜYUUe0¨‘È­V›°cÇh ¬æĉÑÑÑØø`2-)) á'|>ýéééaaaÏì’Ã銇ò÷ßä·ßˆRÉÀÔÕÕ=>>Y¿ü’—ýjd„x'ìêŠurtrÜì´®ÀL9r¹\©T>yò{™õ³Ñd2…„„ܹsgvv#¯_¿ŽhÆ×÷÷÷ÇŠl®„††²ý³x$-m@£)¾};|ß¾d@ÓÑñÕmmm”¢À-ò”ºÀ©NîÍÜÉÊ"ÝÝ$=èõdzzãÅ3§t¥¾¾þÂ… ”ÃÄÆÆ"ù©þÎÎNÆêæø}¦¡ÄÇÓ|¦´”H¥ä‡Èwß‘K—Ö›Í6ê”J¥AAAÏŸ?w636Šsºò_öËí©©« +ãýzß+/¼j§Ó»êŒØqFed¾@ `‚˜ºCæd‹:;ßÓ ® ŸO¾ü’|ññó#±±¤¥¥?4t~Qà˜ÖétÖzÆÇÊj\±¦ñ!P±4@.P«ÕJ¥211Ëå e\©­­Ý´i³ªaAŽž@N«I§#2Q*íº³s`çNù‘#©*Uo_Ÿ:pYa1Û~‚#›ˆ’s|P‹¸ ?a.ÛqE«Õ–––¢‚Û¶m^Õ\ooï*íAeð”BÓÓÓiiižžžxw£ÑøàÁƒ}ûöád„·444œ>}ÚÑóã$Ÿ„‡OÏù³jÃâî>bá ²=÷ìì,ƒ+uuu|>ŸY®<¯ººš‰ß¹sÇö^8Ù.­–ˆDääIòÛoÿŠ£&Bu°ú–¤"[p¥ +€ª¬¬,'''77W¡P ð´,kVAK˜Lccc[[Ê"“ÉÔÚÚúÓ‚jjj&&&âããüñÇ3gÎŒŽŽbqîÝ»a)åååð=‡L +§×À‘ËIj*éí¥Z£y¼cGð÷ßKóòzègÿŒ„ÝtêÔ)œ×´-d¹Vâ +z9þìÙÓGVã +JŒ¼¨¨¨¤¤¤°°ï²Òg– +Ï-õQTTnp¦222Ž= +ó¹ÿþíÛ·Oœ8áèiq½|InÝš'–¯¾";w’;ˆ› &ÉÉóЂëî]*ýttt0ˆRYY‰ê•A@ðû¢0ïT:âd…FGIm-‰'ÃÃÿŠ + +a[­s\ÁÊŸ€1ÜÝÝ7oތ |`Y3WvïÞÝÜÜ `Ž‰‰Q*•‰‰‰Xp’óçÏÃ…BCC…BaPPPAAT*E)„aJ¨ÂÂÂ37œ>NÿMHD£º¥¥ûøñ”íÛsòòžLLÐÎþy {ðÓâJÄø‹'Ì…ÞŸšžŽX+p ‡¯¯ïÖ­[µZ-Œe•Gà0“ôôôÒÒRƒÁó«ÈåòÎÎN< ï®ÌÎÎ:zfœDøP‘˜ìJ2=ÍŸ=cqE­ž§\0‚ÊJ6h6Séynn΂+*•*xQb±˜ ¢¶¥Ò§5…™üxyp```ýã +L¬’™™yéÒ%Xxþ Óéþ³1@‹ª¯¯¯¦¦³³³áp¡ÜÜ\X +Xzpp ?!!¬•ù¸’qÄ´pZ[p#©”`~@Ý”uçνÀÀ”mÛ®^½j„%r²YØ}΋+pƒ’’’¬¬,T:þþþx‘5qE£Ñàeõz= -Ñ^¿ Ü0 9\±FiiäéÓÿˆ¿}Ë"Ju5áñXtQ©Ø ÉD«³ÙlA…BÁp‹@ °1³´úâô‘r +\ÁÞ—J¥ñññÉÉÉqqq!!!«à +cwªÆ7°®`)Ì=0féOxq ‡+ë\UUó¸ÒÕE;ï_8õÝw 2ÙÌ?ÿÐÎþ™ê“ãJ$ü„¹=\A™‚=räHgg'ÜÃêAr¸ò)r`pE&cæçŸÙHk+Å~æææ,¸¢R©‚%‹-q=dâ´LN+ +VBYYY}}=¨AZcãpeݪ­ÚZÚyGF&ýüb¾ýV(ÿõU¥§§ã˜ vuyzz †•¯ïÔ¸+ +…>‹ºvíœÈaõ 9\ù¤*0”¢R±ÜÂã‘êj6Hµ$1›ÍDQ(–}!“ɘ ¦žbwœˆóà +ܯ²²277·©©©¹¹ÂáŠËë?ˆDB~ý•¼yC5¯F£‹Œ”mÝšöË/:£‘jêyáMIIùÝÕ\éèèXùúŸW"Æ_ê½™L&fƒ¨T* ÈÅbËÆAê~&r +\Ñëõ—/_Ž‰‰9|ø°T*ÅqpýúuNGkl®¬7MN’¤$¢V“©)ªyµÚØX¹›[jRR¯Á@5õ{ …B°´’¯‰D¢ööö•q§Æ•¾¾>øÌþýûA,þþþ0œììlW\MCC,®(•,Àðù¤®Ž +Úa¦&&&,¸"“É,“““Ã>|H½SדSà +¬åª@ €{„.àÊáŠK +|‚èìYlpªyûúŒ"Q–›[JBB^O5õrWpd¯Þ¦­­ +e×a@XØááápE@þå:ÿš®‡+  þæÍ›“““­­­À ­VkË»p¸²®õú5‹(7n°0]ÊËÙ í-ÃÈd2YÐE"‘0Ü"‹-A4°G¿. §À”6]]]<oûöíðÉîîn«ë•âpeh`€Èå$5•ôöRÍûúõ»¨(É×_‡FDŒÂ ì¬Õqeff¦±±1:::$$¤ªªj||Ü~#A~µZî.\¸P__O7ùºÁ•Hø s›qpR\\ìëëëãããíí­P(lôFWœOÝÝ,®ˆÅ,Àà†‰¬U†X-T\‘ÉdÁ‹ÊÉɱÄavêÝYä¸ëCyXPP€’äi4Á*===´ÆÆáŠÃe4’«WIJ +éé¡šwffîܹ´o¾ + +züêÕÔÔê¸RVVÏܧ§§ÃšVI566†² ®…õi6›aaa"‘èùóç¯^½ºråJxx8ŽWøŽEðºÖëõIIIx¶¹¹OMOOã)$Á_ê¯éz¸c±åççƒUð/>¬-ƒäpʼnõð!K) +Ë-¹}Û~Ý⌳ ŠD"± Kaa!Dûõ¾žå¸b0¢¢¢<ˆùÊÎÎp¶´´Øh#KÅáŠce6©”œ9CFG©æ5Ç$¥›ÛåØØöÞ^ª©WÓR\yóæ +8Áb>·nÝ:tè–qSSâ7nÜÀªV«Õ̯sssKS¡}BB~’Ë娿ð [ ¢¢¢­­ +ØÓÕÕ…íª¢444¨T*0L\\ÜÈÈHnnnyyùàà ŒŽÏçcQÍõ+ã/ž0±WÀ*˜///ŸÔÔÔÌÌL½‘׶'ƒ+uu„ÏgF©dƒCCví‹“1 +Ô8†Áö·Ø Ê»Àár +\Á–‡½Ã~QòÀ@üýýkjjÀ´ÆÆኣ„Ý}ñ"¡|–ŽŒLúùÝ°Axüxó½{TS¯-Š¸‚5Ÿ——gùk5::H¥Ò©©©¬¬,W__ÿöíÛ–––vwwã„¿4OAAõ×t=\â3^¼xÑÝÝ_ìرcBFcõ 9\qYut°”ÿb¸%9™ôôصg“Éd±‰DòöËþ§©ë +àþº¿`?.#Ë×Å_öÛÀ3‰º¡fµ!ddP@”Âx‘¢´0¨”w,Á¢ƒò" +#åÍ~4-ýÚµŒB!PZTJAJˆgœK#lOKaç“rïs/OŸssÏs>Ç¡.ÐXñ=ù½í +]éííÕétãããPgnnn``àãÇ©®ìärôãèñc¢IÕ꾈ˆìƒ³oÝê3™ˆ¦ÞïëÊ?yðàAbb">ÏÉÉÒ&©@H°® ÃÖ)66¶££&ljjªÍfëîî†ÅÆh4 +mJ.—Ã|áp8CCC8Oqq1¨>¹!®à5ºýˆ„®\¾|^¯¯¯/HËÅ‹©®P¶ËË—Œ®H$ŒÀp8¨®Ž ÎÏ»û÷5CW¸\.v˜¢¢"GpÞý5¸/×¥R©Õjkkk¡iCf±XÐFGG¡ À-RµQ]ñ<* +FÕÕD“j4ƒ11"?¿,>ÿ™Á@4õ°¹®@ÇhmmÇ€e±¾¾Þjµn’jrrR @Ïï&èATTTrrrUUÕÔÔl¬ÂÃÃkjjàÌø€¯^½jXx~~þÈÈœÃðïéééð<ñaî=]†/•JÏž=ëççPRRâbo¤ºò_di‰Q”GPT£.b1ôÈJ¡P`E.²†X,v¨Ënü ½\W °öövèH—.]ÊÊÊb³Ùyyy°g„ý#ÁÚ¨®x˜W¯ŸîßGv;¹¤33¯/_æ±Xœ˜˜É¹9ry?˜Íu#—Ë¡cl'›^¯‡'í«ojyy¹­­Íb±LLLÀ%ØܲÙløÉ–––žž|n6›àŒžpz8ÿ†×è +ÇjÇrYW ±€ªÕjxÃ&“ Þ›‹Û"ª+†Ñ•ìlF`’’˜Hg§§JÐ8t…Ëåb‡M]]ÂfÊ3•8ÕÕ«î/¿ èh45E.éììbddÚ_„r8/fgÉåu’íèÊ`Oê +4œC‡¥¤¤””””——«VÆé"©®PþŽÉÄXJEã-‘‘èÑ#&øö­gªP(XQAѱºˆÅb‡Ïxáëåº[­V[[[[ZZÊápX,¨Ëèè(4w=ïCuÅ3 "‘ee¡gÏÈ%íï7óx%~~„„­–\^硺âY]‰€~‚äš®èt:Ø~ÖÔÔ€¨äææŠD¢²²²ÞUœ.’ê +e[´µ1ºÏ8 ôJÑ騱±1::Z«Õ)’ê +ÅUfgE‘JÑÏ?3êÝ­V—#“É°¥H$ì-áááµµµ8¸aO ÅîÒÕª±@€¿k£ºâ&Þ½[Ù +¤¤ ƒ\ÒÅE$ˆf³uccäòck]1™Py9 +‘Ѹe6½^MÀn·ÃùÒҜËo + + +Áå«W¯ðeKK þÝØ—!4===999;;{øðá“'Oº2¢ +ñ]áX-ãø@®éʹsç:::@W@ðŒF#l‹úúú\,’ê +Å-ÀöëJZ#0Ùr¯äär9Ö©T†5ZÄïkÀürýWv®¸ª+î@&[™I¿ý†Þ¼!–s04´ø“O‚øAIR€³NW`ð­­Lq……è³ÏÐÇ£ôôuñ®®Ã{††“]$MMM‰Åb0„ÂÂÂêêj艉‰===EEE %|>t¥¢¢âÖ­[ñññccc¥¥¥UUU> +…7nÜpÇ0÷’®ètº'N¤¤¤À¸|}}KJJà—••õ®ât‘TW(îepéÅÅŒ·p¹¨¹y%ÒÒ²#Éd2¬(‰$d +ÜÇ€ +›Æ?I¿[ß©®¨¨®¸• +£êjr­Ö×<Ÿ¨ï¿—íÄöaû¬Ó› +]¹Â´Çöí[9þ©X¿¨€uÀÉðð0L½^~’™™™‘‘³þúõëp â›7o.\¸Ëb^^Þµkךšš@ZA?hŒF£qÇ0½CW" Ÿà¹ +ðëêêàæççÃ;ÏÍÍ¥ºBÙ•À¢ºÒÔ„®^ezË;ŒÕ +íHQsssXW¤RiXXv˜¸¸¸ß×€U?iµZ*++!Èf³‹AÃÖ º¢¢ºB”¾>”ÊÊÈeœ™y[U•æãzäÈ‹™ryÝÅ:]Ùž…~úiËíÏûº2??ÛÑÑ655Õf³uwwƒ®\¹rÅh4566—Ëå°¼r8XmïÞ½{üøñóçϳX,NGpŒhÏéŠR©ìëëÓ¯200п +D\,’ê +e'éêb,åæMÆ[~ý•‰(•;U”L&ÊRUU²ÇÃAðü$t?hzv»_R]QQ]!‡Í«ŠŽFSSÄrš“’Š>ýTxíZÏŸKêN¶Ö“ •—#¡›§jhhÀ³Ü6\.tåÌ™37oÞ„%õÎ; +°^ƒ®¤¥¥555Õ××·´´ÌÌÌ@°¹¹ܧOŸ=ztrr’ä ½HW8VË8> ºâ@­VoxîTW(Þ…ÅÂèŠDÂLx8ª«c‚óó;U×ÜÜÖ•cǎݾ};!!O™¸¸8Ðü ÕÕ×€µXX@<ŠŒDÄVEƒÁ"ÜõñÉ éÒé%õ[ë +0=&&¶“M¯×ÃÆû‹åå嶶6‹Å2±ú¿ƒnÙÀWQ{Áçf³y~­ó,..Â¥SCÙŒ½ª+Z­úaoo/˜œ»X$ÕŠ—²´Ä(Jc#ŠŠbÔE,f‚[í¤ÜŸÏ‡¶†[(ô®øøx˜DøÕÕgDMM+–2:ŠŠŠPˆz{ ¥~ý%%ù奯¿Â>´{Ø–®ì~¼FW" Ÿà¹¬+Г““333ÛÛÛ + +`g§P(@]œ.’ê +e7¡Ñ0º’“ÃLRéìôL ÏŸ?÷÷÷¯¬¬ia³ÙÅÅÅŽ[TWTTWœ¢¢}õºwíß>Œ +Byß¾EøÀ`6[76F(©G¡º²{uE£Ñ”——%$$Àß¼¼<ð +ª+”ÿã㌥@£ÇÞ‰˜ ti·±´´ÔÙÙ í%$$D"‘˜ÍfÇ-ª+*ª+ˆÝ¾òÁ^¿Ž¾ûnåï矣/¥6™ì99÷¿ù&-4´M©$”ÔÓP]ñ¬®p¬–q| ª+Šûhogt%>žq‘ˆ‰üñ‡~ŸêŠŠêʇ0?¾ýíÛ‡^ùûÑGhÿþév•—/òÿb¿\Ÿš:ú8Þ?£/ìT­ÓñNûutí8v° 8: ( P ­ W¡@Gnð! … WI r ©d‚€AD $€$¡ Eöù†“Z I„ÏwΜٳ'»Ùݳ¿ï~~ÿ)°°ˆvu­ÚâgýÚqer’(•º~ ‰ž|@y||å®®.êUKK ß¿òôô4ʉäߦiz¸‚éwttÜ»w/---==Ãáè9HWh}BêE!Ja!a0´è’Ÿ¯­T« +ò'4®4Ѹò‰ÊËÓ\B¡Tnß&Ç“™™õ÷¦ +Íúæן®ni1Ü7S«âŠ\N~ýUCz¡¡š»•••ÕÔÔTWW£O>ŸÿñÔ¨øûûççç³Ùlƒ100ÐÞÞž’’‚·ÉÉÉí¢¢¢ÆÆFœ˜YYYûÄÏÐÊÍÍ +ü¤As//¯ØØX ÑððpHHA)`•ªª*”™L¦R©\qšÆ+>ðê"zã +œÐÝÝ=22ÒÜÜÜÚÚåÖÖÖææfÝ­ž>}ŠEç 3é\â+´¾\‰ÅZ\‰ŽÖ “©­Y-¡ÓðÏBæµX&†+HŽà“”½Àº)߀c ž*#U\ü +§†Æ•µ¨®N³Ý>žQ¤¢‚wïÖÓ›266}ûöX?$rÓµW¦§Iuµ6@©Ë‚ØØ>_³˜×¯Ÿ^=yBæçÿ¯«´´4à`#,, À°„\.Šà•NNNÞÞÞÀÀ@ìí   T‚d°±kÒ€Cð + +'&&BCC)ÌJ¥`„€H$ºzõjii)¢ !! +µZmccƒòõë×ãããWœ¦âŠjx@\uXZZb= + ]\\à«6„Ép¹\8 02111)) +A,4®Ð¢ÎÐz\Zš–[nÜШ®¨/Hjê²nL +WÀ!<‹LîïE² Ç€°X,<Ã¥áÛ°d TZDãÊZ$•WWÂb‘%¾+—“ÙÙOì §8—ûßï¿¿lf&E{ÓÒb\yó†\»¦ +Pêúê+òÃ$8˜xzjÐÅÜüŸW‘‘K×6==;3;;û×®]ËÉÉ¥…ÂGao£çõÈÈð <<û9$$•ÁÁÁ›ÙÙÙ¸¸¸¨¨(P +6?*Šèèè: Ò‚fffp˜‚UŽ?^RR2::éåå…Pšœœ‰‰š-¦¯@6UUY{÷ºìÝ+yùÒ#3>-Æ•åjo'wîhp+Q^N²²tuu÷î]ð  g(qŽS¯°·(€ +pL#„ýýý ¸ƒÆO:ÕÚÚŠ½¨@"ó·ÒÒÒ€. ŒŒ Ð X§êáÇAD + + +< ùùù + €yPƒPB@­8McÃL¤´˜3>¦Z®€:à2™ #¯®®~ùò%Ök¸ª7"ßÁýèÑ£ÀªÚÛÛ÷öö¢kkk|ô \qvv^ËΡEëKTCƒ†Rpýþ»ZÌÌȉäÐ!òõ×$0À»¦¦¨"/0 +\±ðù|`ɱcÇà®0d0‰J¥ª­­…ØÚÚÂI„"÷´±±a0CCCðU+++Ü)\ñDºKk™ffHI‰fõ÷ ·‰û÷s¿ý6Úή¦©ÉÝ¥tã +Ô×GRR$4”ddèꪴ´´ªªŠÇãáàÃcTTÔÄÄõ +» B\\œR©”J¥IIISSS à +x£¨¨±€ó4k¡Hãææ†Ð˜žžÆoùAAA`ÐK`` ———@ À+ü5Êáááh²â4WÄœû‹+>ðê¿ÿ¥~ýzðÏuà +ŒmÛ¶ÍÒÒtqæÌ™sçÎaúÍ ÒÑ°££Kç«””” ü‹`ggPAë|òäIê#®¶}hÑú²ÕÝMrsÉ?jq…Ï‘Ë+„ÄíìÙ³mmmzØÆšô¹q‚-Ã'H ‘–´c\.×ÑÑÑÁÁÃáôõõ!aDÙÛÛ»»»»¦¦–"‹Ñ +©åéÓ§©5Õlö3Q"#5¸2;«oWo9œ‚íÛ£ù¥J,6ÄÐŒW«â +¥W¯“IÊÊ6`DŸEKp1>ñññ...†îåZWTÃÃCýëÀ‰D3ܱc‡……¦vÿþ}‹•™™©WZZZð­Á~ÈwpGN;]‚+X¥ƒz,Hlꛟ-¨½RT„§.™Œ +ä8¦‘ èç«kpÖcK¬WÊËË÷íÛG­IWW×f-£ÐÜIL$Ž!ú‰J¼´s§P(4DwF­5â +49I”ÊÏ=œÏ¥%¸‚8¢Â~\A6º—ëo\ñV+¨ ÃøKýúõàŸëÀò™LVZZ~åÊ•€€€ÜÜ\ݸòâÅ‹[·n:tèĉ»víºyó&ܦ··õÖÖÖ€7x ŸÏ¿|ùòæ}(Z´¶ :;Ijê’:äDNNNÏŸ?×Ï9V×à +\ž·‰D îîî*•ª¶¶ÖÞÞÞÖÖ‰ÏÈÈHHHˆ +ƒÁ™bee…;,%??iÚf|cÔ‡$%…Àb¥R½û‰ø?ýtqçÎêÇ +0²­ µãÊ–Ö\ù(D“««+ÎkÃF÷r-Ç•þþþgÍâÕà:p¥iÁ@Z[[á ……… .8 ŒB7®À9‹‹‹ÙlvDDÄþýûsrr.]º”ššš˜˜xáÂ…úúú¶¶¶Ç;;;oü¢Ek ¹œB±¤®§§aeJ¸‚4G(æååò²²˜L¦···¯¯oXXXvv6’&Ø,HSBClAA§§ç¦|#”@@˜LÍ]/Ís8Üヒ:|¸D$š5Ìж€ ˆ+ +…B.—¤+ƒëßp1¸±¸â?¡.}pîñìÙ3øÅÏÏùK]]Õ†---ðÏÆÆÆòòr‰D"À*III + + +€ô \ÃÌÍÍmü7¢EË”ôêÕ+“ÁJeee8,:::¸\nBBBJJ +9‹ÅÂ#R!©TZYY KINN†µRo+ ™Íþ›¯Žrça³õë`üàA••Uô™3ïæç +3¸ÿ±_®1Moçþîó’ÅDmŒ¶lÉ\²}XœŽ¹dd‘Á¢ìËXþ™UxCP¹FA.rQ°baˆ`+ H DÆ¥E.])½!Za†çÿàÙ\ÙTZ8-ôôùåIsÎ{;Ï{Ú>çwœktertºå—2 :kÆ­¯ÓÜûZé +^Ý Óè´c+ÐLw´aÃ???Ÿ½{÷¢ºt¼ÀšÐ[˜¿µag‘®WðOWØ¢Á°uƒ=eÙÞ—]lI!]a).†ÔTèî^ÅssPYYçí}ö»ï$ׯ›Ÿ=ã,9çaY]Q«…P$‚ÑÑe–B÷®¯¯¯««Ã5ñ¹,—Ë_>õÃÃÃ?.•JÅb1>X5MOOú9ö¢Šã_»¼¼¼½½ç………mîÖ§®è´ê•é +Þ¥«W¯æçç_¸pï¾ÎdffX¯+¯[–t… 8º²HWû÷!& †U-ò¤  âÝw…;vÖÔp”—󱬮´µÁáÃðÓO —/³Tvv¶D"¹téÒŽ;nÞ¼†¶ -eÛ¶m2™ Ý ** +%//¯­­íرcØ{øðaö·wëÖ-Ž6÷ëFW‚z +° +]a,Þb,Ye’¤+Á¤+ŒËëÊð0deÁùó07gãÌññ—‡3¥¥×6m:ëéyûÞ=nÓs:,uåñc8r„Â%qô(¸¹-Æ¿ÚÏœ=Óòóóñ—Y\\\QQ§GŽ¹|ù²P(lnn®ªªÊÉÉÁÆ“É„zpúôi…B‰íííóóóÉÉÉñññf³ÙÛä™®ØÒ‚à +ÒƵuef!(ÈR=¬B;5Õøp``ñ¤­í×Ï>Û'´¶¶Ú#IçÂRWž=ƒº:É–ZÆ–-ðÎ;‹wÞ²½¥–,•——'•J‹ŠŠJJJð400…D&“©Õê²²²sçÎacPPÐøø8þ†cbbðºxulŒŠŠB]ÁÿZxxxhh¨N§³Ç6ׇ®„`=aHW‚¿®0.¬+££ +J¥Íc#"Úû=>·>ùÄÿý÷ën߶C‚N‰¥®¼µÄb‰ïÿ›©¬¬¬­­­©©AEÁÓ„„³ÙÌvÉåò+W®àArr²^¯W©T™™™ÓÓÓh8B¡ÐËËK£Ñ”——£´à³°°›½Y@ºb +¤+Á¤+Œ«êŠB?ÿ ee¶Ï4™âwíÒy{Ö-ðöÛynnòÒÒyîtV–ÕäÎJ—_Ê`0LNNF“É„§###óóÝil™˜˜€Eç™™ÃS­V‹nÓÜÜŒ#‡††àÅß|u{zëFW‚z +@ºBü…t…q=]yþrs!3”Ê•LW\½:úå—Z77í[oÁ¾}ƒiiÙaa\çèÄX£+<€tÅHW‚+HW×Ó•ÆFˆ³y…Ó»¢¢®oÜØêîÞõé§PV&ÍÊååqš sƒÏq…B±ÖY؈ˆˆõ¡+!XOØÒ‚à/¤+Œ+éʃEE+œþ¸ @²qcú¾}^û÷G%%Õýøcrtô^__Nstzð*‰d|ÇËË«¥¥å¿Û']±„t… ¸‚t…q]yô]V‚\~壶n½ßÛ;02’{ñâÁ={ÎÆŵwtp›§³“žžîëë+ä;¨+J¥ò¿Ûw¸®õ6Ôj5ÖÒ‚à%¤+Œ èÊÌ \»qq Ó­dúphhÖæÍ7”ƒƒ\§Fð +ÒKHW‚+HW¾ë +*Æ™3P]mûL¥R•+ˆBCïõõqŸÁGÖPWðêãc¤+ÁKHW^ëÊì,ˆDPUeû̧Oß~›(¿ø⣑ûÌžâp] ÁzÂ^]§U“®/!]axª+(*)) ‚ZmãÌéé.ŸT óÂ…A­Ö.Éü…tÅÒ‚à +Ò†§º"—C|<´´Ø8mlL“pT ˆ0S%lÇáºlÔkØÒ‚à/¤+ ït¥« RR@"±qÚèhÃǧlݪ(/4;k—Ì€tÅÒ‚à +Ò†_ºb4ÂÑ£SS¶Lûí·^ÿÿmÚ”›”D¦B¬‡ëJÖ6€t… ø é +Ã#]io‡ØXxôȆ)³55¿ +¹îî¿76.Ø+/Â… ]±„t… ¸‚t…á‹®44@\ܽkËœÆÆš;ý™\n¯´ÃáºlÔkØÒ‚à/¤+ŒóëŠÙ "€^oõœ¦¦›Ÿ^òÃýÝÝvÌŒp=HW,!]!® ]aœ_W¤RÈÈ€…ëFÿù'TW÷ïÜ™³kWçȈ}3#\‡ëJÖ6€t… ø é +ã̺rû6øùA}½u£Ÿ?^U•ÿÞ{~Ø58hßÌW…tÅÒ‚à +ÒÆ9u‹_Z”–Z;zðàÁŒÍ›«cbTÃÃvMŒpqHW,!]!® ]aœPW&& ?RRàéS+F¦œœà——Úl¶{r„kãp] 6ê5lé +AðÒÆÙt¥±ââ?—ÇdzüË/iÁ]±X;5e÷Ì‚te)¤+Á¤+ŒSéŠÑ±±ÐÑaÅÐácÇš¿ù&-4ô‰Ýó"ˆ¿p¸®„`=aHW‚¿®0N¢+Ož€D `2-7T¥ + KýàƒîÚÚÉ…G$GCºb é +Apé +ã$º"•B@tv.7®­­ïû﫾úªH,vDZ±‡ëJ°Q¯aÖBW:;;q³}}}½½½ÝÝÝ}/Àì%]!®à«®(Šô÷÷cÝèééÁ’ÂÖlÄ^laOqã8rëÊô4$$@mír㊻žžù_Ý×ÖF•‘X+\MWPK + + +ÒÓÓKJJ”JeCCCFFFfffkk+v‘®WðUW°JTWWgggcéH$è'/^Ä’RQQ¡R©d2¶Ÿ?]G®g]‚¬,ÈΆ¹¹7ŽS©ÜÝ ·o¿£P8(3‚xו¬'l€Ãu KJJJLLLqqñ¡C‡Nœ8! +sss±¼`]mjjÂÚBºBœÀK]A òõõ +‹Å¥¥¥XÓ¢££±¤ “œ`!éèèØ¿ÿÆu:]kk«ÑhäÕºº:Ž”üüüµkת¿ ÿ8îíN?étd0Ã1É7?9wμxqâ²e–¾>©'ÀÛ౺}Nœ8Ál‹Å"hwÿ´Íg†®px²œp¤œ={¶´´tݺu¬jüÆäëë ]`úx·®pVTVVVUUuuuUTTpn¬_¿>//¯»»ûÀ|ÌÙÒÞÞn2™xi¦éŠÉD11ì#“,ŒŒçæ~3wîÕøøÖÞ^©gÀäÌZ]1›Í ƒ¡³³³  €c„³…eåÊ•ükp¶°ÃlݺÕÝýÀãá + +jjj½©%ëJ¹“׺²‡°®¬Y³&""¢···¶¶vÅŠü—#%''G¯×»»d4’Á@Š2éºbcoøøć… +ÐW +htEq‡®ž²²ÞX¨©éßµ+{Õ*Kmí¨„ó@ ÒuEÏy¢‚®à½@WYºòò%>M tûöÏæûÏœi\²ä¿kÖЃBO @W\® ÐE–®ÔÔÐáÃôð¡ËŒÑؼqcáîÝ·­V¡Õƒt]ÑÙlê è +Þ tE¯+l"aa”žN?K¬’Ë–-Eáá‚Šà +®@WÐ +èŠ"XWrr(9™^¾üi¦ã«¯zýý©¨ˆž=Q7]qº€V@Waºòô)ååQt4Ùl¯¦††X_®úø(IIÚÖ`† ]Wôœ'ê è +Þ tE£+d0PA={îü<2rgõjÇŽd4jX€™tÅè +Z]QèÊø88A.¼úÜÞN§Nÿì³ÞÊJ­J03‘®+:û€M]À{®(ZëJi) d¶8?´µQzúÅ :Š‹5ùçÌp +®@WÐ +芢©®ÔÕQHå8?47Ñáä×[++Mÿ_à H×=ç‰:º€÷]Q´Ó•ô4ÊÌr5Ö==r$káÂñÎÎé÷ºâ +t­€®(ZèÊð0=KGâ葃¨®’vîxqèùæÍç¶ +O@º®èì6utﺢL[WššÈKW«ˆ*Ýúˆ\Ó¶Mx +ÐW +htE™ž®ŒŒÒ‘cTÖ@dk¦¿‡§¤XÛÚ4ož‚t]Ñsž¨ƒ +x/Ðå}uetŒbŽSĶÑÞŒÒÿƒÒÒõºâ +t­€®(ï¥+ƒtèà˶ä‹tê•‹kžtÅè +Z]Q~¹®Ô™éßÑýßoÈ¢¡tíªÐàYH×}À¦‚®à½@W”wЕ––;&Åý‹ŒÕ”õŸ¾ÓK²Òÿø·»ç3dv +ºâ +t­€®(SêÊèè#“)Ñ¢ _¿ñßýþ^øž—)óRÆ·n³ß¸jþL~¿˜áH×=ç‰:º€÷]Q¦Ô•´´ò9sö¬§ÿ|ð—ß„ýzÝ©’ß&<èŠ+дº¢L®+V+Í›7¸dÉЂÅôño\ù«ÂsâGŸ¹£QxÒuEg°©ƒ +x/ÐeJ]ùôÓÁ… ‡>ø€>ù­ô§?Í¿äp ¹£QxÐW +htE™\W˜ôôò?ÜûÉÇ9þç¿Z¿þÚúüù˜ü6à)H×=ç‰:hè +‡‰ÅIss3„® ³SWnݺ¥F +_x}}ýºâp<ª­Í×é2|}Ç?úÈ’-¿Ex³YW8IL&SbbbRRRuu5‹4]êííZ‚yúôéýû÷EWa:;;ùI!ºÊNDWá áË]…áÖpƒDWáÛŒo6ÑU?~ÜÝÝ=ar¶é +Ë »Jii)GJrr2ä<™BWTnÞ¼c2Q\•”L«v»}Zÿâíêê]…$Š®2<-((HÔù¤§§C|½Q’““³²²ôFádff¦¤¤èrE;z£áè¡4HoÚŒfÓ%555##ã·ÉdyyùóçÏõæòâ±+x]ìJSS’‚]A[:;;óòòô.Á;þÆiiiz£ñWvˆF9IãSo ¾ëòG$¸UUUó )‹Ð®”””°¡-8V†ÚÚZ•‡7oÞüKçÓ­½Q¤§§Go(KIû_Ïÿ}Òø‘ ÞÕÕ¥7—‰]!d¦’»»ûÀÀ@GG‡­­-ŸOµ3%XbÇß8ó–´y+Í<$mKîëׯçARfìÊñ‘á¯êoaí +ÂâçààÀ„Æ«¼|ùòv03z€‚HÎÕwÒ®°d½"q©²òÉwý"zõê•ùýÄ¥¾”, +‡æK½Ÿñ§BQB +‹/ÌIã‹ ŠiVÑy?yS߉NÂÜJUø§9i|2¿_ÝÜ$PåOÎ"±+Ô”^ + + +utt4 yyy/µ£S/©C¨¯I«»NìPª¥Ì§I[ôt*ô<°c6–zÿlµ¼ŸÌ’B,:±ã7vs¹jÏÍêZ$¸Ùý ˜4¸c~¿*ºN#òOÎb³+&wMMM)))©©©mmm$çÉ“'|ç—ºº:2&îâ@¬®®fç¢ÐÉÉÉ™™™jÜ Bܸqƒ›oÞ¼Iwµ¶¶ªˆš››¥Sù£ÑȵW®\áñü3++ лwïšlÞèáöööÚÚZú¶¤¤”ÜÜ\A>*ƨD566’+ÕàJÉ 9!3åå弟\Q òFöøgUU•ÔÊ@,ô0MÅûùT³°°4“j ÁÍ÷îÝ{÷î]MM + ééé2Ïò²HìŠâŃÈëÿ$áf¶´´ˆ;ÊMªéÕ]ÅÅÅz° +äääpsiiiooo}}½b:&ÈrUVVJvv6iv„`J±Ã|('$^ˆ³CÑö¥h‡á¢º‚ˆLwDPTÑ‹ŠŠx?X|§"ªÙ葤ñÚÇÃk®E¸HÕ¡Ç¥ßÕžNæ*ˆj¤˜Õ’6“5“ÿõÌØ•è‰úî ~û´€vÅ4Ãweh0ww÷¸¸8øâââÂäd½ºÿøñã«V­âÚüüüýû÷ã+ÂÂÂŽ9"ãh×àà`šêÔ©SgÎœñòòâhBDx0yáµL(???¢ˆ‰‰9vì˜êééÉÃ{ÏEJƒ¶¬\¹2008ÂÁ†€®v½¹r‚vmØ°,QúëׯÓD‘˜˜èææ†ÔˆÈ 9áÎ`HZtt4y»páAÂ"á˜í +×îܹóðá×/_¦:ܯj„>Ï…ƒdQ‹ˆˆn¦©XhæÅ‹‰‘ŒÍ§¼,»¢Ž2rªo™ð–% :@0GœœœÖ¯_ß××—@!(µð÷÷—â …¾té…F¬¼½½U¡¡ }M¤Øpñrô +vÓ¥Œ °`;nß¾-è%/<äòåËF8/nݺÅçùóç¥ØÁk+++-,,°y×®]cà¢öÄBD(¤;(qll,2Âû###Q•C‡Q5¿x€ÈXQv…F---ÑáððpÚ@Ÿ®é4•²Äü¥Óˆ£G2SBCC‰‘>œ;ÊŸŸ¿Ú•ÏŸ?ó¹°vÅ|( +=lkkKÞxØÞ½{1RѤùyÖò¿yóf¥'Oža3Ú¾}»ÔÚ…‚a$dpp…ܶmd‡ƒ8UƒÁPQQ! +Âk4‡††Hïß±cÇýû÷ÇÆÆÐIXÿöíÛ¹£¨C®xöŠ+¢¢¢…0e||¦ìÙ³GJÉ â$¿~ýJÞX!wíÚõáÃÈnggÇÄ!Þ¹£ôôôùÇÝÝÝ,T§¥¥…ÂM–~œ;ŠI#>ÿþ=XèüéÓ§¹|bb‚ýÈÃÃCª4$ÇÚÚº±±ñçÏŸç΃8P{``eã{ggç?Ö®˜})ìíí)=„&RTj”••íÛ·ì +å†#šfF¾¤Ú‰ægq£ Pƒi våÓ§Oø.Å»ÂmÈ#ª‚†ÔÖÖr³££#씦¥u¥Œ„Ió ÄeË–á%Øé¸|rr’σ +²ƒ•;¬ŒŒ <<±¡™f¦ó¯…tŒ’ééiå÷è12IuvïÞñ“š_¼¶G;øZšŠ€E§ÑotHÒ€èèèزe ©›ššÂŸ¨ÑÑQ|ÃkìÊñ‘á¯êo±Ù”–±ÛÜÜ 5\]]iiAKoÒ(É';/ +€«Ç®ô÷÷#8´– ˆQwb¡µXRpG¨™‚†þtš /…9kcc“’’žURRòñãGº7::t)”®®.¢ÀKÄi§ +ÙS@”²+Ð +j°8 ò¾¾¾ùùùTŸÒ···S¬G‰ØÆG||<@T;ÄprrB™ñè?ÞRP‘)ä—ê`À4.¸–””D&¥Jƒzp!òHÒ1¶ŒÖF¾c&Ú®œ@OÔvehàóâ±+­­­øa’F!ð«$ +K) A/ ´‹áKŒŒ h¬¨‚"F¯Âîàà྾¾¦¦&Ì*RC[QQ!„°ÔÕÕFœC[[Äæ!Åcccè = 探v:8beeeaa±iÓ&fbTTÔøøxaa! +,¥`Q°¾ÿYìíí±+І²è544ˆØHMf àÔÔp”ƒùÕÒÒ244ĺŠCHçŽbÒ& Ú ßy?SŒE’Ë'&&°I"¥1iòEk!¿”Í'iP{``€‡DÌ%»× ™¡ôšKÐ|Pz öq?›ì Ð°ù’j'2ˆãeóýöí³ƒõ +â­Ø!bW¸­¦¦¯K UVVšÙ188HÓÒº"îK-ŒôíÖ­[׬Y„Ú&''ÀI±ƒæ§.¸…ááaŒ=€v ‘4“œ]t ÓÓÓ˜IPœœœÈ$Õ¡FìªRó‹ä‡‡‡‡……}EwÑctýF׉$„tttØØØ°é ÃxÂaŠŽŽª~X²+¿”„AªÐÆ&m ÞÏm w<<”AÏÙIµSTT$%bô'³iíÚµ´+."S;¨{P||»—Èsssl6GRýêŸh{Ú›À¸_Q€½½½ª#—W[”ׇØ]F£Qõê`ÿ×ÖÖ²cµZ-OA%Z,Q°EÅê`sÖÕÕqÿ¼©ê Q[[›ŠÕas …éîîæEL]lDupÿØ9"dªƒ´gUÉ"þtº²àŽx…öŒgT)&“‰åwNdöIÙo*Ò^ðJl3Ò±h +-Ùfêúü5å°+šß—Åg»Ù›£!R½ r–²WðU»V<ÅÆ=ÑŠûcµ*q…ă¸&UQÎ÷ï,—s–^4åÑ6,¶mlWl)ëJ$~nR6¹:TÏâyãþšß"e#Àµ9‹¶¦Ü®HII¹¶³]‘’’r;9ìJ4<iWÒ®üõ¢œ©ñ½{÷RÝ/_¾ŒŠŠª¬¬QÚ¾)s~òÝÒÒûõë×ÐÐÐŒŒ ÎÝ(Ào0S´9ááá/^¼À¨ÌÏϧ¤¤øúú–––æææ655A³W¯^ùøø”””p¤*55õîÝ»yòä ‰àEs´f›&µm%íŠç\༽½E'¢Ñh¨wa@Ê„]쪨¨xøðá—/_Ξ= >}ú:”h E”?aûûûƒ‚‚°(`annîæÍ›—.]â’œœ¬ 8ºuëS8C[D¨„„„øøxŽ…±0HSv9'’r/I»â¢rÛÛÛÏœ9Cñ...‚—ˆˆˆÙÙY< ýH[[¬èèè`”`NZZÚîÝ»¹ +V0ÆW + +‰ª‡xAÆÍÍÍ^^^t=œ™™INNNLLüõë8½èõú+W®ÀëׯÿüùóóçÏ?~4™LçÎö†«ð3………ŒÉ…†‡‡W鼤¶³¤]ñá+p .\XZZZXXHJJŠ‰‰a€i)ÝÝÝL ÒáCAA¨áìÁƒáLXX˜V«¥‘ù¿]"®Æ`0PþcccœÚµk|Àó€Ì FE …øtFt:¤P8C𺺺€€pÄœãÚÚZ8–——GwFnírI­O» +OÄGÚ•¿^Ðqúôi› ´Eô/$88§a`Œ…8|øð³gÏ°(´07nÜØ¿?ˆ`&4 ð¬À„q!aàlIOOß¹s'¡hˆ@g###kjjvìØáççGce6›[[[1NÌçfp/QQQ …ž(..ßòèÑ#‰7•´+ž#ÜHee¥¿¿?< ”°F£1ááá´B>>>L ´¥ÌW~rV|¯¸Á8+~J¹¤]ñ4¹"E!&· Ý +m‘Í1á·HqŽ³:Rœ¹ôÛ›YqDÝG–ÚLI»"å*øÐÚÚJïãê+¤¤þPÒ®H)ÂN477[­VW_!%õ‡rØÍïËâ#튔ͩ둒ZŸ¤]‘r–ì}¤þ£¤]‘’’ÚI»"%%¥¢v%žˆ´+RRRÿ]Ò®HII©(iW¤¤¤6BÒ®HIýÃ~™>5u…a¼ßúoô«Ö™j§´‹­_”) !”°%(²±Šì.`d-‹@ ZöE*‹R–°$$!$@Â&©  „b Q«í›{+“!ˆS'6ˆç™ß0çÜsî{Þ\îyïsl¨7v%\§UãXÚ©L†@ ïÁŽvÅîY!ˆ”·Ù­Fõ@.–Ëâ=˜™¹]_µeW–à„J +xON`v%ê Øð*“ãcüžva_ æwIú{Dü.s—ß9 è„}øèÎ`Ó$ØLß<bï #ìü+ß…¸Ÿ'tmïÚ=sÄ®HD=¿qÁ®lnn.Ãñgtˆßó‡Ý³Bì]°Ý-²Â¼å]°ëÍ£XÃüÉ "°ÏèçA +„Ýæ@À“Iø%ŜȨHVv¥²ºâ¤§SxxÁßí€óÏÓ^Ц³ß¾uÿŽÆÚš`M(“æ@tøÊõða‘ Z\ùÎýû_=ðQß`òçƒ?Sœñî)ª?1ÀÝ:ˆ×oX×õÏá Ë—Á‘t  3»¬¾ +VX˜³ŸËî #ì“É¢Óᛶ  FinD"™ìJ + +¥2™L2™bÃ"£¢"""íþ(ö ƒÍfCI)+-¥R©vϱ—Áw}HpPHH°%°ñ}||ÜÝÝÃÂXæH$ÛÄ^ÃÕÕõèÑ€'Nzyy“Hžà«×ip ¶TtW¤Ô¦Ž½Qîï¹ÇØǸ÷¹Ð +xæ{R +(2¹lìí +¼¯z»d»¸þêÚ.l‡+¥°¹­í¬ýñÊO—ëÙx·±§ñÚÝkÖAn¶Ý„u³ïdã9O;^ÔRD-¡B"™h—Õ·ihdèÊ­+»'Œd/‰EÂ^GoO×ð:$¯³BöMM9¿¹¡íÞ]‘°/448õòeæ0333®PØ0 ®ÑÑQ¥R %ezzZ.—Û;¤=-|×7Þ®¹{§Ö’{Í·“ãN +ÉJŠ9$’Ç[ÕL&ݶEi¯‰H$~ŽéÈ‘¯cbbÂ0Q©¡ùy¹zÝ"Ô–9ÃÜßHHÿ‹LÆU­F¥Ó.X³¬Q=Û0.ªçt·´ðÑôèœr¸º’˜Ëårm˜CooïÒÒ’ +"!!ýWá»~|d`blÐ’?§G +®æEE„ýõb½½­åÌéÀrñŠɶ-H{M +å3LYYY)˜’’’ÊJKV–pì#Ò§¥Uƒ~Q=¿´øÄzÞd4¨+é´Ð²Îì¤\93nÐkâÏ•••á·‹Åâîînh¼|ùR(êõzèÂ_¸"“Éx<>mmm +ÚJ¥rÛê¯_¿îëë»qãÆêê*D€öðð°Z­^__·Nujjª½½}ppÚ¯^½‚€r¹‚ÈЕH$ºƒT*ý i¿ +ßõcÃ"p,–<œ¾–ŸÎzþl­í^ÓéÀ€Ñ!á…óIÈ®ìoùùùmÙ•ÌÌÌK˜1»²ˆcï‘>-ž®,¨æ4 ­YTÍ™ŒOŸÌÏÂyª¸0oF14;5öteéltDqq1ÜÛØØH§Ói4Z||<˜   GGGp`W8¼íá˜VVVà=ŽŽ&‰0j¹:nWœœœ +D€hnnn03..Î`0X΄µ’““áv&“ ‹ŠŠ¢¢¢|}}«ªª&&& ¸ËËËK£ÑÄÆÆ2 8ääälû±åå员>ôƒEBú¸„ïúY?8K¦²œìLúüÙjks#Ù×G.å'&ÄeddªTª'HûQpftvvÆíÊ¡C‡Ølv"¦˜˜˜¢¢BVcïwéÓ’qÍ ÕÀ‹·`ͲF½nZ[\˜ONJ¬«­œŸUÌ?š^3¬de¦×ÕÕÁ½R©4!!¾þT*ºµµµxØôôtx·Y,–ÉdŸ.ÂÅÅ¥µµÕ:‡¬¬,°ÐhjjJKKËËËKIIÏc9lI}}=4`+mll´´´€¥!“É:.77âCF£\¤bmWúûû«««!dþž%ÒG,|×OÍLÈ-™›/¿ÉM½tñŦ©·»ó\ÌÙɲBNR*++Ë‘ö£jjj˜àyýúõ|LP«ëëê z-Î? [.”{ +endstream +endobj +22 0 obj +<< +/Type /Font +/Subtype /TrueType +/FirstChar 48 +/LastChar 55 +/Widths [ 500 500 500 500 500 500 500 500 ] +/Encoding /WinAnsiEncoding +/BaseFont /EIEADA+TimesNewRoman +/FontDescriptor 24 0 R +>> +endobj +23 0 obj +<< +/Type /Font +/Subtype /TrueType +/FirstChar 32 +/LastChar 119 +/Widths [ 250 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 611 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 333 0 333 +0 0 0 0 0 0 556 444 333 500 556 278 0 0 278 0 556 500 0 0 444 0 +333 0 0 722 ] +/Encoding /WinAnsiEncoding +/BaseFont /EIEAID+TimesNewRoman,Bold +/FontDescriptor 26 0 R +>> +endobj +24 0 obj +<< +/Type /FontDescriptor +/Ascent 891 +/CapHeight 0 +/Descent -216 +/Flags 34 +/FontBBox [ -568 -307 2028 1007 ] +/FontName /EIEADA+TimesNewRoman +/ItalicAngle 0 +/StemV 0 +/FontFile2 25 0 R +>> +endobj +25 0 obj +<< /Filter /FlateDecode /Length 10229 /Length1 22000 >> +stream +H‰\U T”×þî{ÿ?ƒWÄ!.ðð)ƒ,Á +Q‰08Š Š(˜E•MQ«QC\¸$–¸ô(Ñ‚ Ö ¦4¶Amq‹ŠKè‰Æ¥ÕZcrìæõBÚž¤óÎ}ïÝ÷Þwï»ï{ ±é2¢ãr_ÊŠ2 ¸wüŒ§«ÿolKIÛJœ±`¾ñ}ÙÕ¼‚×û€)6¿xQ^Èž»M@œðqÌrÎ<=EöáõxÎÀîðíÛµèt™Û!%ó–”ǵr»è¾£¸t†C=†=åöû%Î….Ÿjú5Ïw°¿1ÇY2+ tPÁã”î*7Ÿyó/£m=ÃU6Ëukps±2ßξúz@‹@þzË*ôÔMþnñw×3Fµè³aõ©Ò—gÿî?ŠMx!xD±8ŠFŒÁxé¨Â(œÁÇè„Et¬HÁn„R Ra![q/£ ·qHÃuêÆëØáB Q÷ø? +kÔAöòF2öâS¢ÙvEòÎT#,ˆP§ÔenmÇm +Qõp°õº"Ëðº¡_ª–¶ "µ´„î!9¨Ôâµ +5C±)­qX¤_î°Å=\ÄBr5‡Šp-†p¤Éb”˜ &1òE)Ã%ÊÄ>¡Zñ‰8(š¤¯ •QÒ)çÊ­r¯<*/ÈiB³iÑZ¢6EË×ʵ3Ú9í²öLÔíz^­5õ2Å›2ME¦-¦MwM-f“9Ýœk^b¾`V^¡¬Væ¸÷ãç¿hÓš§w׊f¾þÒ¥¯¦LΘIL–År½üZÏ£GÒ «T! ålµK¦Š§²”¦ˆÏ)Xê 2k¡¨NÜOÄÍ&‹{¡½CŸŠR™,Lm›èç5?­\¿ ˆKHK©Q“å²\ý z55ëÕâ í†ðE3ßêÕb3O:- +E%²´xý +9ïê 9ßÃÅê'/hÕ¸-­â{zD›X5NÑ-D¼*†P+n+àÍ…‹ÞE}FßPˆvËZ+žãÓr‹Ž4ˆ¡S2ˆ.Hod·q¤0áGéâ‘È”‡Mgå"V‰¯±˜$Åpíü÷çÁ¾U"œ5ÍÎjržâàͬ÷O<‡Û[¿¬Wrí”6LB ^'‘Àwã6# «‡C\ƒk#¶`‰ZN3Y÷DZ~ +4P¢É‡ÕÒÂÜ–ñ{ÑC³Nç]Ÿ²þɪŸFñ:|³¡µ¬Õì¬L9¬¿•Œ™x…[Û°Ñ´_? d4ÃSÍU~ +¯ò›ó-ï߉Ìovj6fm°2ÏåÛ<$1Vá$ ,eÎÃùž§kVÞMªˆ#,ä7j,¿‰'P¨6#™Ïn’*W•˜®vª—‘ µ›õwÚ‡X­g‹)z¤Ï{‚¾à÷è¯TɺíÀUÖ£PòÇ}Æ^f4\ÿ Ú%ÖÎj­º?ÎG0g(—_Ñ[(ÁCΛC6âÏxQ¯R¥‹_¨fLTµ*¼Q ŠYy£Æ¬³ö,G€^õ‹¤‘™““F –84aÈàAÄ¿Ý?ÊÙ¯oDxXhˆ58È èÓ»WÏçý-=ºûvëÚ¥s§ŽÏùxwð2›tM +‚ÍnMÍ1Üa9n-ÌêpDµµ­Nîpþ¬#ÇmpWê/}ÜFN»›ñKÏ$öÌû?ϤŸ<“þçI]ŒD$FÙ »ÕpŸJ± +4mbÛëR¬Ù†ûA»=®Ý~»ÝîÈvPO0ìþ)†›r »;uAA…='…—«÷ñN¶&ÏòŽ²¡ÞÛ‡M¶Ü««ž,éÝ{B½€WG&åîiM±»Ÿ·¦´1pËP»s¦;}b–=¥WPPv”ÍMÉ3¬¹nXGº;G¶» ù߬W pTWþï9w¥ Ù„wèn.L6!<ä‘ °’ì6l›a7¦ºÐ¢-ŠvJ˜6@ÐRµCÊ0Œv¢å&´šè Æé0ê`uœÀô¡VZT´…Î@Ç\¿ÿܽËf‹‚Ž™|ûŸóÿçñŸÿ|çüçªiLw­éQÓø7ðjh¯¿¯b(¹oÀGk¡œN£³£=fÊŽ8Ï‘¼uæ¤o|0ùvƒÔÆvgZ‹d22yƒŸ«Éän¿y´1–i +ðo<Ž1LŒ&’QL¼!lhöc.Ñ™Z&ôó:xMöêÖÖ$6úÍûŒeÆúäÆ6¦0iRÓö@aaxÐz +#þdK̘K‹ŒxG]qßxJ6m?5%ìŸ2ÚRYÑçË·ÃÚ76/UÈÉÍ,¬KÛTI5çRCS:®{d,LÿZ?<‰XÓBþY·’k¢þâz™Ø +æ}µ‰¤¯z÷7]AŸáOÞ ì¿ñч£5);è»A\d–¤‰»S6C!³¼œ â©ÅŽÂÇ%ª>¯²bÛ€0M>?ÂG ¶ñš*?àíÝ;¦5¨˜Ý1»î§5Eý® +ÅM‘`Ëc™°Š-ÝŽ%Ý=a€Ç¯_L0½¥éÿ<ßÄq‘õ5¦6ñ?˜×Ùö†f£¡±-æ$©Ø6´ŒªÙö…i[ª¤ÙÜÔƒˆÔrÔkj‹±ÿ®`ÔˆlHÔã¨ÁGs\mL‰¸]ER +þ¶§GæJ,‡ÇÒƒnÅÿÎVÍ5}‰zû7>&¸ÇNÖÇÜK‰ÛÝRk2kB£ë‹FÕG¹—“”pX/ +-mÉä˜Q¶(.«d2jø£ÉD²cÀê^cø}FrPÆd,¹)’p¶ÀúéÞ"3º/ŽE¬×j@mAËú mOc_XÛÓÜôákOK¬_h¢6±,Þ7¶Ø ÷³Ò +Ö²’+~® ¿áTô ¯j_4&êVV])T}í€FJçut­¶Îçètº­ +ÿñMQÛËä€:XñJõÀj`$B«}ôÉ–‘&_¢ZÆŸë3îj­˜KÂ^زŽzt|_qŸ zw5Vñ5j„­˜ ýý +¢ýã¨7CÕ$¡_| TÍ€XÄ€•ÀS@#ÚšÀ·x r?µ{¾D®³äsµR °eCŸÊõÍ@¹žë˜o®œJå(—ÀV晊¶g­KlG»Õ®ý6S7ìKP¿(ðì§"È<`ô…ç8û Ù ÏðZ­«(oƒËQþ2 +_ë WBÿ0Ê‹\ôùœ¨¶Ö¢œòbÄ&å ‚~7¹ÚçÂÇNØÇ£.¸-æÍ…,ⶳL^Њ´CxS] >½…ÆÃ>Vëæ5;kbÿÙ§ƒ(û— Û?öUÜöíSYX'窽ڙZëaqŽ6É£Ö5” +÷xŠ0<hÖ÷!P­wÒÏTë¯ðq¹ë5š‡º˜¬Àc¦]ò:…a ¹_o:i‰˜ +Ã<ë–ø&MuéA¬ñ¦ð=Îܦ£]³êßIÓôKTˆr˜á%ús:Nˆ +ö¾²q¿â%ë#ŒQËÀ8ƒÀôŸ„ù«8¼ïZëH/Ú^†íI`382˜û^Åaôáþ˜çó<‡½äS˜{À©ýqp¿ÿ +IÀ€ç}øðð]nƒq'¢ý4øñ4s†¹Éü`n(þƒOŠ³¼›æ˜}f~ £=Àx %»R(G[u^xÙg> <6s‹9ãHØKmÞkWyÌ© i¸*ÔÜê 2·2dsŸ¥ «5”‰!šÏœµcíHåC„Ï#Ÿ G:þðùTgRvÑ8Žï»#X¤åQ +¶Òõ=¨Ï¦Õò +ð¿åG  >GÔ¼ª>=$šzŸð;A¨óò[ôûUòcT¾aooÒœ=ÇÃ1|5 +ñ.NåÁÔä·3ð|JWlK- Þ¢Vek¡÷ÄiqRœ¶ºø(ߦ/ËïcÿNR@¶!¿Ü¸9|bõŠÉ_£\ý`Þ~[(OÏ£NyíæÀ¶ ýÎaŒc°3v¡Ï»¯ÒbùKÚ ‡ð>¸Èo +è[!ê¨Vû!u‰›Ôåžœ¼ÈzYÏØb}QáòæÅTß”¯îäóv¼íîà¯ò5ÓOöñþñ<®ê‡6ºNyDÖ»@Ж#b?õGÅÛhûÚ®Ç3ÿ0EµKÀá~DõJö8c󴧀™ú<ú °å +ÈÓÀI»N‡€w€Œ}ò”Ÿ + ± |†„îpø•cËÏu'}&\E4ºþ:u3´ëÖ?Ùíõ4óÍ×1äezžáÞAmžmÔ&q?èÓ0fVóÌÑ_§wóçnÐÞ¤Y*†6Â÷²Æ{Ÿ]ÎÏÿ¯ñîØßÀ£Ê‡+¸mÕÎS d+d«ÜJ_g ^‰z܉§v\c§ï(}zÿl=¸B’sv–>»ž½¯w«‹SxëfÀáAš/г })ÚÙõq_µAQ]gøœ{îÞÝu½ìŠh„ì^Y®5ø±ÍÞ% ácF«@;Yª5NXm2M¡è4¦Úh¡Ñ¨ÑFHšN€²ÜU³¨­L:&c&£t¦3íô‡bkõGIÒÚI‹ÒçœÝE4:IgÚ?Ýç}ÎûqÞsî¹çÞûÇ%ò‚€v¾‹ŸÕÕ·>¨QŽË9¹ÇîѵZ²]@ña®™²ÏIý +΀ˆ•ýurP@>»€rŠ|S`Ò¿”¼$0e]ëŠ1¥?uR÷åÞûƒù™êe õìeR^ §xr'ßwíù5‰ý>©‹wɟóLÜy6ð¬<(çÿðì|¼¼÷¿‹âý Þ@Ö¨+I…¶µçz‚ãê­ ÏÏÄwOÞø(Ú¿E{#P„ö;°ï#ÍømØ'ðÁVº}RÍDýNÈ>9n·$úÞº <—Èqë!ÿú}»ýÇ«àÃ.?`÷Žÿ(GŸTžCßþ5ôÕ‰\ãhߺü¨Ž&xü‡€ð;1ÆïD=rŸsè•tþø¢œ,×!9mÊ|tƹ‹±œSZÚ+jJQG‹ZÖ†úYÔ“,ÎmKž™Ì“b·øŠÚYÔ¯¶%¨™59¢)çÁŠ³dÝÄ0»«¨˜qpÑÃ’­‚ÂÀpX™ó¿dו>²€p®Y³³¤çªUV–l<²,ш-\¸žÆ®’¿ +»Ê®‘‚D¯XÁñ°eß#nJ 'ݨ—£€BLö‡˜o~ ëûþØ%ò +Ùí’¥Ï áûì’Žºú ;ôœŽ¥ÍðN\ +%Ã#À(0¨¤™½EÚ`@¡Éb VXX/ëÅ<{Ðß +Y 4€JÖ±·aFHös¶•ä£ïv˜Ì¿ÄI~œ ~öðëÐw%õ`á?ž´¿ +}6øX’ž>]ð+IýY|zD¿]Iîf;­î çÀŸ ” ­ÃhÆÒ5$eßgÛäHƒàx{‚±\mVžWÞ£¶ØCsÝXÒ6,}V® ++×FT¸ZS1­‰˜E¬1­ˆiEL+V¥„íÄx;Å&…ô¹Ãºïĺ {r‘ö ;n¡±ç°Ž…˜Õ~¶Õ*àØd[bËÍ@è{Km²§cs³w4ç4±ÁiIv‹ØÍÒ»9æœ.¬›c™Ù FÔ3á4¶‰|PH¤øP¨l“å+ægÙd»ƒ˜i¼]igíj»M-)§éX€Ôá +ÎI:[D‚(ä‘ -mr¶8w;™Ç™ë,qšÎ:§­™µ³Æ8+f!VË"ÌŸ¶ì+–€ÌÕÚŠ%®nWÔ5ìqÙ¢Ú°6¢jcš-W+ÑL­NkÒZ´ÝZ§Ö­9;µN»Òäjqív1+×Uâ2]u.·Óîð^¶Q|› =@ Ð ¨Xãì¹ì) ‚»ÁR<%*]HÍŒ = +¶As#Î87¬nXÝ°Há©š€–¤W›ô¤úˆø1áDQ”kÖvrL´€*h:4šŽ¨e3ô@æu“¶Q»2å+Iú›MúÇdLÊgŠ¾Ê¸ùõÃ…4ZH» ig!5ƒ¡pÀ̇HOOx#F¤ Ò£6{›æ‚æµÖ[kÔÔö¨!oÈ„zÔbo±Q\PÜ£r/7xïQ;jj.Ô\©Q#5Í5í5¬·.f•$ç‚O[s3¥îðJœ@)‰@v×F8d1šU€äJ?¬ý°ö“Z ØУ_¼^ yÒ'ì]Ò'Z¯Üåg¸ð>kÅ’Úp^¹  `ÈÝŸŒN´¤= +9*íµÉøniç©> /¸FùškÄã×HB@hlä +Û@®È É`PY#þØ¥ÿ>¥ùM}ñ,NfÏFÁ”>Ãá {”éØ:Šl!I¹_Ê”>3­J¿Y¥ÿªJ±J_€†R@Âp–2Ït…õSa½6¬†ud{ˆä]™%¥&$ý‹”OHé73òôOóôOòôòô×òôyú—óD¿yxvu%CJ—ôˆ”URÎ7]\ë¸^Êõ°NORŒNʤ̑2KHúñ)w¹›8ÏÑI92Q+XÈã +‘D'¬`tÛ +®ݲ‚'Aÿ´‚‡øyú)•Ÿ4zÓòÝàáYôo´Rú'IþˆV’^ðx øg$H +ð›Vpˆÿ)ú‡þÉwˆø×Iì×E+¥ýµd¿ŸXþõ„åÿF=NürÔ£–ÿ¬‡,ÿ~ÐË–¨Ã2Ä·ZÁ…<<ƒn!>EÄn"†"fR“ñqdÞ^è\aùE¯r1@œ>fyƒˆYž§^R'‡ã–W^d6ñÊóˆWN:‹’Ó¨[N^'ù’–w²h§ŒüÁsâÂÉß©Û:Éÿt×·êi¥ÕË3$–ËâWüqjœá—½çøE_œ®·ø°?î€ã‚?®ÐÓ|‹E¬BÏðÿÞï•Þ/¼¸Õ]ÁEü„·‘¿j@·øÿy1 +²W¼îÿ£¼&ØËWq +·Ä`æ4¾Âû-¾æeqZëå‹}q1•äè=ÃbÄù^9•¯”žU–;ý¶é·ï²o´¯·¯±¯´/±/²çÚ³íóìŽt‡Ç‘æ˜î˜æp84‡êPÄ‘Ÿ5qh $CóÒT!UÙö(BBˆ·¾B +žèLV­T¯-£ÑôjR½®,ZZT·O<]VTuÔ}µ~Ò5@‹*û┬«Ç¦½YÑôÇꇥÅ{f nÝ{°¡VG‡7‘ê¹Ñ›kqÓÖ4FmÞ²9dö³¡9¡ôGg,_U~Ñ””Ew~sŠ¦þædGT¯­¾Ý +ˆÆDvCutõÚܯÕ);”æŠò!¥EPCý}^ÙQñ¤°ÓçË&ÃH¾Ò‚0Tü-‰°Éa$ŸÆdX Ã6ͯ(ÌÏO½K+E¶Ï»2hK"—C W „)9Ä'sù”†ýHæžšl:¡n™Ì=ÈdóDРa ÄoˆÁRƒF©t÷Þq{Ätˆ!Ç1hƒ‡Ò³^õ±M]WüÞû¾üýžíÄ~/!Ž?b“ä5ßNˆÛWòòaV!]©Ö$ÅãkWêØ®ÖnÔ¤«ÆРA[Y·ÁHºŽ¨]‘p’&H +ëØû'“:iêÆD´¦ëfm´Œ‘¤;ω`•øgÒž}ιïœëwÞ½çœß=¾;§|udÁÚ¢ƒ9òÿójû&ã™+;ÃC¾pÔŠf¾ýì°˜Ùs»§v^Ñ î ˆÆ‡590”¹âêÈìôu¸§ïaÔ̾Ž)4~´gjPê˜P¾ŽÞ™Ét{çç|¼ã«=}‡¥µ‡µk¾&;ïaîÔÌ“š¯NÍW§ækRÌûê|¤ +w>Ü3¥Cm½í;Vå 1 ¢ÅžÞ6‡ðÌÆ|q<à_(ž¥[F¹7còµeÌ@š©ªµªU3Auj& ¨ù5“øžâYüÆšIµÕ׆d$†÷tÜù&‰¤F©” <™óº$­g{gfÓûz2JF gÔhG/Ö‘Z»Ú{TaN™WÈ^%­Œ)ãÊi…I¥zAm›óÎ{I¿w¯7íóŽ{O{YÍ°£ç¬ªŒ{?öR)È&œ„+Ü‘÷™ _í6™Jh  UwrJnïiõ¢Aèv1tæUÈäjÚÄ Ÿè ÑèÀ¿ ô:ÐŒ¦¡ª¨ª°¸§CóØ+k #Rõ3µõÍY»Våö¾UÞ¶*•ÖzätKƒ¡•‡Æ£Yà¿úÐG@ÿb¨zª>ÿðÔjÖö&PBÆðún’KÈI,ÃkÛLÈ2ÒHKpˆL•ñçóáD +ÁV@@@À¤¼6¡ý,¥É»ƒ‹™|·Œ8Ô5Eðò´©™›F %ï¼M!§ +Î`$éXfìQ¸éñ“ø $ʧʲ²M¸¡t-+¨Æ°ºZÕcõðGKnêâ’Ê ÛÈM_„ßoùìuŽF*C³Ó:7œšÓ S¨ ³¹(‹yÕ¦/B5@Ô@40XЫ¦¶ô£½(ÆмµäŸÅ.8ªEüGºrÛ„HüÓ®jɵäêjÛŸS·â2_™·Œ°S˜°œ]qI±«˜bíÞo ˆ’S"¬‡¶ÆP)[Ã9L0*Ãî.Ö³ …1$€å1Ec•yª¬µmšêka}Þõ +‚ÓÑPß´¡É\Xðy9–l9”ì‹ÿú±o½{wô+—¡xSÒU][ª¸¿£ñ¡ 9q +w?Ò:þ‹•Ó_9{ôßÝ\¹6ut`ä];–¨õ<¸}å8äÎu ;æ@¯ªª'Ä‘F¢*’gÑ7±´Úñèíôxy!>ÚXcœµÿB<Þƒ Aø*t-<ÑÌèu&B¡Y|¦oVm ¯Zkù4„Ÿài^rÎ’2¼¸¶¹²Ò%ä-Â-ŠÕÂÖú$·„?‘åºZÁñˆÝß`-p8œ…žÆ¤QÛmý×ñ]Ù±B¢Íç/ò·Ñ¿zíö‘fñûIIÝóäÊ+•nW©ÖÜk| ÖèÂÃê‹œh 9ÅuE˜¤1ÞåpTp +·™{“cU÷ãtŸîqgŸø¤.iMÚŽdùõ”ñ”å2sÙùkñ}çûâ‚û}ËY-1Å…’Cr–ˆœÞi%Aé ÒA瘛%BœE’IbÍ”DVt: + 8;mÎÂkèõj©e¿ë³Tƒj˜¢1 K§%"ÍR +°q‡g01¹²ø°jF쟻íýö½ö´¶g1§ÚUXTr«îýn*êžp·tß‚Z3cU-è'{IšŒ‘92O®’‰ŽH¥³øå»ù¼¨¬ft¤ëF$'@Z+¹åH\iYŽO±¤ýÑžscz<§Ÿ×‰÷Ê‹V›3”Œ-"Âê”·÷I‡%°÷Z”³ï’åR]-ŽD bȘò4"Ô„P±œ¯ ’Y[<ËÎSßÔ´z«i`÷‰§wŽüÒü±“ªÝ2yk#Ž=õئ"̬Üöã6üý7G'Sñó¿üÝ‘Ý»|fåz³P§îv¨ò/A<ëñÖóÈðÙ´)¤‡?ªb +µêÆMÆN/=¯ÇÍj0œ.o8Ä­ú´ïùꟖ/›­¾\}ÕwÕÿÇê¼õ›6ë*²øÐLy¹€²dqæ·µ¸6KÏPŒàÀŽ,?S¢Ê5ÁhègsEù<Œ +ž| †#ù@$g2&lÊâ# ¯Ú_EŽTMT‘*ПéçÒ°ö,ùP5¨A<¼$A”ÅÏ©ö9;±K +à\» |tr‘ø +-ôȹ‘–\$g Õ¬bPSu+`àiÖëñyÊ<~Í2~K `p©¡«bØÅÃÈc\Ã}5[Ã¥æ +me +Ù+GáÊ×؊˲½)9'G>Xo 1˜W9òèӘǞ€Ï§Õ¡Ynøþ©—^¬mvßþg¾³ò·ƒƒ5©ÈúU§¿r׫¾¢Rù{ÛÜÝãF +Ó[ýrwß+'êÎ~-3úFÇú’ûtL k<ñTwgsIy«ËðÄKݻӓpr 7Tëyˆ®þUþ^-w˜¡Ù ›UžRy\iÂ….¦ô ‹i“ÑŒh“™fMf¨ªuªÓpœNGÑkÒ¡R36_ÀÇáÜ1âqÕÌ`V¯cYC›Lôè‡)@²]ªQ¯ç)á’6äym$‚#ñ\è³ú¬žFÜSçÏž\~—¤ž>¹R†o¼¼òC¼k?õâÒ!òÚr¿†_1È÷瘭ȃ]jûOhlëuíq¥™4›.9ôö«.6Š* +Ÿû3³³Ýîîtgû³Û-™aévÝÕ¶j“¦)KcA-ÅB¤¡­”Bj)nÿÒj#iJ +´&¨ø“à4|‘7µ!$‘4¾ë“kiPx1’(Ò®çn§}|˜“|w¾{ç'“ïœùîþF‰£ŠV»Ø.½Åè +Já z2x2tž}âL†Óa/þezÕ<Ÿ–_P¨øÝ”1!UžnøuÆu#XbŽ".áêÓºnh³è$EL3QS²tÁ0p£%¡˜Ô~Ô‘uLnc‡‰n Ó0~ ¦Tš4ˆ!b:uSMªT +¬%§Éͬb‹­hój«P'[Ú‹h:Èq?Í4º¾p™ ¥<.¡\ &+Fcº$Aú£cºŒŽ#Œ}Û7ÓÕÍ{}ûבŽ”H­{H+q.*X–¸o®”ïjñbí–6¼cùàâ|ÿXËøó}Ã#½åá`YÅ3Û.žì¹L¸Ôx!UvöøLwêhYõÎ'CqÕØpñõW¿¯yÂA½¢:wc..buAîš±ç`ÎgÌùcéÍRYfd”ð‘‚c…¼V‰Ê ¢™éû¢ w¤ô‰D¼]}º$ÑœL{ÝØ¿SäÈô¹‚3cÔŒµÅ’±tŒÇ+ºã)ÐTM×*5S;¥%5‡xì~‹r·uûÒ¢Õ£d­ +Um½•@É}-/¹äb™f%Dÿx> +endobj +27 0 obj +<< /Filter /FlateDecode /Length 13336 /Length1 26432 >> +stream +H‰\U tMgþöÿŸso„D4" Á+DC$Ä«Iä&â3ZK"ñˆ¦dy´LÓ¡Jé ¦C×äªW¼S†a,,‚ÔDQÖ¬jgTî™/׬i;g¯³Öþ³ÿ½¿½÷·÷à‡EÐÈþë˜Ø‰ƒG¯ò+¹;,§0»(ìPò2 g Ksf;²ýëjùï&àã“_4©ð‹ôÂX®¹g^›4mnþ™ÄNW€ø®@躂¼ìܳÛV“|x¦G76;øâwû‚Ââ9Q—bèÏ¿h¾iÚ›9ÙX°¼7]Ÿæwyaöœ"¿LYE<Ôczva^üÀ!ßyÄónÑ›3‹‰›OîÓ†ÿE3òŠ¦–¨œ‹€fnó·hkñ¾az +ZÖ¾ÄjÕyY/Ì©pz¦X5:ÖÚ¿|ÿûD`)Ú£kqãqVi¤Ê« +CB +%½0X S|'#A„¯Åè†o$ +‹%ñí0 -Œ°IX°—e2vðôg’„"éÖmŒ@†µ>€>ø‹?Úò¯8­[´0ïâ®ÂB&Ö™›h%¿ÂtkÆá¢dÊX+ 1 ±›qµòž3L+ ñ˜ˆb—@‰Ò%ÖgH0¯5Úc´. €ú›iõ‘êl¤Yß" u†XÌh ºS¦ãSìÅM ‘xÄÑ×x,@…Ž"Æt,gld¾Th«œÑôDÞFÌ‘c*ܼf>µæáÆG¤¥(Ç—8‡´–&#u¡'Ñ:#•ž–âü™™;N9)M%\Òò—rKîèéú>-ÿñ=þ%Q2YªDUbÆÖ/¶ö ’&ÑÆ@ŒÂ4|.‘’$cyv£š­ª·õ^}Óˆ2žX Ö ØCÝlg\çqg½Òd¨\U õ.ók>ñÆ €Q,ÅVìÇ31¥‘4‘æâîÒ“‘Í—crGµVN5ZOÔæJk®µ +áäÊxäñä,Á2ìC5îâ!KKžŒáÉDÉUò¾œTÕz”§×IÆZc‡qÜxa63{.zj˜õ;]1”2ù˜Ç\WRNàºhi%mh©Ÿ ¢¥ ’/ ¤L>”-²MöÊ)¹ ä‰ü[…¨•j:¨þ¢ªÕÝZwÒ.ý]e„×íÙõ­=G=O¬ÆVg«»Ufm´nX½U#ã‘BvMå,XŠ2|ˆO˜óÝ8‡+äÝm¯Ôâ)kð£ØȦP"j'Né ÑŒn”Œ–ÙR*«¥\¾’;R+/TÕŽÒIõPƒÔ8U¢©ÚW;u²ž£?Ò—ôsc®KÙaî1ŸÚjí>U/6ÔßòÀ3Ù³Ö³ÁŠ'md^ {.ýɹA¬r.Þ¢ÌÀ,ÌfŽæ1ãÉœ +|ƒ8*æ¾78¡ð6ÈVâ;ÔÃ#Šõ4Ňò{WV&…lÉ’<Öö¥Ì—Y.ë(ä÷²™ù½(—ä²Ü–{òŒ1AuQÉj#ÊPcÕxÊ•£«j7强ªn¨»ê¹ÐÍt[ÝA§êIú=]ªÝz·þ›¾bDÉFº1Õ8e\däéæ@s‚™c®07›[Ìãæ³Ö´l«mŸÚ*muv_{{†}¤}¹ýOöƒö›v˧ù4”è;â§gµŒ5bT™Xª’qQÅú¬Z#;~¦³”r1AUêÃê“eú®þ\•†Ëû»§X¡Ê¼l™u8¥Z‚SVÖèluD­W!ÒC÷1–Uœ:s‰s‹º­ìª‚Y x]BñOã +~ånét¥ºC®n‘šëÎ1:ÕõÖ«46ªë +Ÿ·Ì›1ðØÄlã„7 ^g „%ÞJ<¶Á6›ÈŒKÛñ, +Ô‚–Ò'…b¦iˆš5]Lž(1EŽ"%íÔ•Qš48j’ + I•TU«øõ;wÞÆÆ*´*âó¹÷œ»œ{îwÏyãâ%aSŠvÛM +V™™!1„¢bS‹šn±¾OCÇôð°Ñ7ä£öDÈÛìlÛ3•¶8ÕæÌï¼7ëV‹gGcGÒ­~Ũ™µ]ç®aÑÍ3±tk€ÿÆãXså¼Ú„Q‹­ûĆf»É‡ã1S:Œ-u> Ÿ*y¾-ÁÖ$vèfF°*¸ÍØ‘ÀÕÌ1LjÚœ3'rÞz‡æÔèFK,0Wøƒñ¶êÜ{ÈhÚÿÂìˆ>{¼¥$<àËJv`Z¦ÝðNMolIÙDK çVCS*²{¬!L½C‡'± ÎTƶ”‘ÑQ†aø—0ËìÄl73¢ ÃWÁzžoºò|AÝøŒÀ€àëã5m¶FËó}FÜdž¤¨»Ó6C!³¸˜)âŽâNáã—DYIxßüLp·O‡@øhbÛ¯Xˆð|Ádž"ÔŽŽÙÓKöuj÷Rda(nÊ ¶ ;–œléq,©é‰ ˜ü"ñ”Ó“ŸúŸé›1½f[…)Íøæ-I{Cs°¡±5¦× ;¶ +-ãzI{YÊf·Ìéјâ—í–ìW„¤Üœ̘×Tóð_¤îr{ÀJ¡‘ôZÓ—XüŸÜå¤!ëcž%Ä­i¶›fEh|¿r\œ{^CÃj¾ÜÐÒjSÆÙj‘ £6¨× £mÈêiê¾ qŸ+Æîš„s£CÖoŽùÍÚ¾8±Mª[eªJ½©·¹5v¿ÃôÞ–Ø ,ÉÑDU|`>l±ó:QDhå”–{:÷ðà L”=Âä?!êVU(D¿cH"¡ó8:‰:†ä¤Î'tøWÂwïŒÕЃ>ú×ѱ&_`CúwO¡V.årKvÐOçÔ=dªD…Àzü0ýÖOMr9õÉ,ûi6ôßT£BŒ¯B1d+ì2ôõÀ`1–5À[®VðÀI¬QÄëIô{mv½N>×& +A6~´‹ÔwiVNÍ@H¹WŒöØòÝÇ©ãîEÆ-e‰~¾ÚM;`¯G{¯‰sdCN²¡`ÿËì3dTý=¡’uí|¬½sCÊqZ¹r=ôUЯE¿sŠå~ëu´«Ñ!6kX/ÎÞMÀ:Ìi€Ÿb½nZÛt웹Ȃ=G) ç¤WéÈ/«EäçÆqîM·Î¹Jø4 ØGö/ì“\n}¼ +¼kûVwدtu(K¨²òúò%œ¹‰$Ø+\ÿ¤J†‡¬Ïq®÷€j'e¢ +~6º^¤eܦ ðwê)øô)­ƒ-¤=I  _*ߎm¥òO©LË£ œ¯c«nÁ=æB'µà>,È©êû4¶ù@>îðœ'Ç}¾_œÏú~\ǘF ™¹%øÕI>ìÏ1ç»Ï’6›Ö5ؾ| +窀ýàp\ÌÁ|¬[ió°(%æ^ +Ù|O’¡àÀ«À!àq`7°•Ç`ÝbŒgžtaÍôç1?˜X‹ï¡ÞæNø]$8–|3?FëY@¦†·ec*Ææð{aΊ÷‚·À|dn1gÉü¼?+½Ìçä;O“~×jfÄÙÁ­4™Ï±—|ùàõ!צñhç&á’_'‘!›KB2Ÿ‘×Þ´å[¶¼ ' ¸6p~æúÀ9Xâ«ÃË +C68üœÈS›Ÿël~ÞÎË[r dÔ®-œ»³ùb/·ýf7s~äÇ9’óç8güD™šßOOá oˆ<| s“ïz.°ï·óò°uHäÃNk¯»ÖÚ«–X{µr«Wûr›µO>`íLÕT•î·sYÀ©¥¢Ž^  §Žºº¨ÛÎi\w—º*Q›’uTÔOm9üØ&ê[ýüÅ̦år•É•©ø6û"Úߥ2å—À Äà€5ªÎD¯†þ'ÀÌû#â™ Û'ó ðàæÞ‡öÛU^¢2×£è端AŽÿÀ¼/PŸò<õi>:,wX'ÄúŒccðz<XèHöÕÁ¤>ÿœ¼“ú[}ËÏ”“øÇkðºb)µF‰¬?yI9Ö(§³ÀùM̦ƒÒ“DîIz8eã×´ZÈ wxPê6ªzNC–@~Œ§€ ÀMubqœ^|AÃO†|‘b,aø-pű¥ƒ÷šLŸõ¯4®ïZL3ä0¾ ÃtûøÓ´Tý6rí"|KÊ>ÚÀЦÑ.·‡vÉ~æMè» +é)uÝw'îé´HÄ0‰ÈÝœñnÁßh\Ÿÿ_ëÝ-p¿_ñ?C ‡®"þnÊ.ÐW¥wh¥rŠÖ0ì~BÄó4-rî ú^¡ŸpàÊJE&êÑ~”áô'ÞëúX÷\:8p/¦ï3Ô+ÿæ¾êcÛª®øýpœ8γ¤mJÒöÛ +®ÓÔæ%mºh$Ïý¢cs›NѾèšLBFÖÐ6ѵØeÓ>¤Zê$HК@2@kz[݆Pÿ±6„’¡II kºµ”ɺëGÒýî}N(Q+6iûg²~çwνçž{Þy×÷Ý `¶]’!?pÊ5¶TÙ;%¦í™y¯‡vÒˆ:­µÆfÙØC¾%ÁR°%rSbÆnǹªÝ^Ÿ¨íV ÔH íN ÔŽHÀ÷ûWÕõ+²®˜SŽ%ÓïgzÏ~?2/Çoàw† WÏæ™õ]Ø/>±æ7Ùë}Æ–{ÉÙY>ÿ'>þoà¿r½˜ÿOÀç÷ÀËÀ±ÿõ\ûƒÜ#|rŸgÔm8«nÁÿâ5ÒJÈdšKG ¹ŒU1y< îÃ7¢ü+ Š6|&Wƒç@ßGøŽàÈ>•tT“G +çJôMm„ßÃ@ÎŽ35z=âÿØüíg$à¤ßm܇þ7í±SßÿöEð·Wц}y'ôçÍÐßþ ì¢v¼Kð»tHžG®qýïòuîÿ.Û÷ +™æÙwˆÿˆ·}:ϾsL¿ÿOãé»Ä5XÕ¡pozûª»Ïõî8Ÿ`¬×ÕÀY:ˆ3e@ž£åYVžŸåùqšÕ½ +ûAaþÊ«Ø#ϯòì,ϯà:ðº¢sØÓJVNçu„´_É;¸µv­aæÀuË‹ðã°ìÕ ŒAgÝä&¢£Šy5ª‡ˆU« +ÊŠ•¶bE걸¼NŒÌA”„íQVx™1q6åSÄK©lå—-ßÌÆ'-o¥aÆ}ür»@éçI`¤‹@ÒƒûQ³œˆ°J=†þãÄdNú ©²M@ú[•ódø·„·\±F[±|ó¶øþ&òù‰Îÿ^~¼|Œ¿B4•ç“–×gd0ß>¸ïã%è~Šo'øþ ©QnÇ…Çžç¸GŒx)ßÏw(—ûù½¤|¿[º€?‰LMþ®årËüÞ¾¹Æ ?‡kÞxW•îäÛHO’³\š‘—ñ3‡²èÈ‘’^%Mþº@ Ì÷ ž!óÐ7Äw‘¹àgùCb®žà)·eÌ÷„(idi#wauQTü<*~^Íö«v¥Aâµü'$0õ4´ÓÐ|¸Å€6  H½v9þzÞƒO”Ÿ$)þɽÐù€@+%6ó|*á@í(Z´\™ÙQQ©ÜvXe£u`CAL“ZUó®þ°z”¬5¿Fø£p•¡tßµßn—ï`gøCª»Tú_‚I‰—O +¾b••i¼ýv˜]»a`pÀ­ÏÐN:÷6Ëã5¼ükjð焧AäëñèëUµÖ‹¹•ó­”MüóX$ùq‡Ž7 –½¬•ÍFl€oP¼AèA»YTÞ ”uÂe/žÕVi¹œnr¬%Õ\Wøßñˆ5§Êб›Õ#5ȯ.¸~ dÐ"+nX¾ +,ñ;¸¡Ò6H'Ðô¼Hî^¤AN©/_gZÏ× +ô"ý;I2„¡ɽOß!a–¾EjÙsàœH´Âû=;}´ÐÅhÄ”YÐçEÉÑgD$ Ú/"!ÐÓ6íô¸H.íÉ= Ÿ‹äPß#ãu“°Šó(©U|¿HÔ û^‘R"u‰ÄrÐÝ¢å5ÐVÑrF½“¤XÙ4I"*ÓoˆdÝ…ù: «îÍd¹Š|«HÈ’¬“Aâ][x5tµ<ØÑUô ŠbŠH n-"R ºÅ®ÜgE²´R„QcÚ$Â{Q¹… –È÷ó" +! +(("ÏÁIÉ% E"¹T#G"©Ê¬¤E%U."ÒË'"~ý%ê&I±”ÔÒž_듈{©%G¿$ô‹f®„þ‹øjmêºãçœkû^;~\;~…̹¶o|m|ã’8 ŠãÇÉZŒ^e6ÅU KÞ yllÍ&m=JÂþç:#eâÓ¾ì8çùûóÜóøçªð÷To Ÿfv +Ê!¬þGøÍ·…ßõNš‰2áwáO„ßöû…_†‘¨Þ × +ÓÒ!¡zW˜ÈT PLéß)ü¤_]áÇL»*\ †Ùû× ²p^*RÎù*:>$¼$ £°F2§„á°G ='ìQA.aWx“0†¼súú_v„_z£ªÆÏ…?6GUÒýªEOÇUà©þMBh@;@ƒVØ—õ0µ6ú.õŠàŽ‰„gšox…ñqȵìMöEv'»…MÂ{d¬­bíœã93gä Çé8 +G8Ä!b/>œMÈn/»Ž§•NCKÚæ -¡ 1 ÁAëRΤIzsRi–ÓEöá&¥EN+ì†g³Œ_Íá´2õ÷‹•×5_FerN1ŠIÅ™B‘µ‘µ‚#M!3 [– ÷‹­¾ÊëøòÄðUL¢wç®ü +C…>.ùÚ]FäN´FÔLhÓ<¬Ž.á#ht9Ér‰‹†åŽl!“étïJUB?Aãn97Œd¹$P–È«Õ@ß©úe:gÃíÌ2÷3Ì”áÏ@žU#ü)ˆîg ÏB„_ÅLÅgâ³qf*3“™î™;³w˜©ÈLd6Â4/i@Eå0h¸ü•‡Gé°ŒUkU»¡;"ËÔäÿøz2¥^TWçÉ°Šüh®¼Ü.£ê”Òèðò†{îW-üÀ%ß"xZÇ.QŽ´šiXÍ4FœN;M˜x-ÒãÞŠÜ2?[ˆuó÷b™…j‡6ÿŠÕ«|VŸ5Üâè—™zТÏW3E¯ñZ„4¯k×£î2¬Fo¨aüeëÊ´:­Î ‰‘4’A*“Œ=L—¡§¬ß0f8i0^ùÍÚkšk†[š[†»š»†yí¼Á`özì~Ñãõ8ü~icMM‘„»ƒÉÂan£Ñø¾ÞÃÁ{Än$ä}‡­òzªý"Dz1ö˜àŽ”~ÀJ-®EØd1 fbŽ{,𦯪òTD쎚P5 áÑdª¶›=kè@…ÕÄÁEjo`‚|¨ +³à µ·Çæø9>v/fµ­©‹Í©¬:‡ŸËó ùX \•ŸÏCÿ.W%ɘŸûñ÷óÿUËòêU8?„†°µ¡¾©©¹Á*J’(ZíNgCƒÃm¨onjnŠZéhÔGÑ $’†à¶ƒ=FQ,ÿÑž «cMd¡5ÒZ½Â\愶æ«+ÍÃûb—4‹ ¿i:¾oáK?;²¸c 18Ì~w?s”¶œz¹Òßè£ÅÓd¾vß$ +²Âÿ9¯!9—¬ÜõFrÔ¯¿ÞÈ &<²qúD™©Ñ¢ôD_$MXèkæq/Ä|_BVüü +ðø#?XÈËtÇ´ÇTS»R]©§SåVŸCôët«Ý¥ú>IF\ýê§"‹§u?WFûþu¿×\í¯;OãÛªŽÏ$ìkeãÑsôÌêA3aá¨ffð± ø>¶¤˜ +]ÁgÕ­ z=®••:º‰º9¨úß^ÜÿHíúÆ¥M_Ö{Í¢¢ÿ]=üDÓ úTALt8!^0]6MšÞqjl¶fUñUÄ%Dôœû’Põ Ñ +,a‹øÏoáK:ϾÃÉ/\‘®C>ÉÎÂR¨¤|¹y7q‡1µÉ\_ÑnÁ=˜(ãuô†JGi5ÑÚÖHë„ÝhnÜP7SGë.Ö‘:AÂR‚§€ƒNåñ*>Áoàgx +_QÛ2¾ôUäÌ\6èA¸æK½¹¼ê¹{sí1ØÍ÷çàûy™1ó°•c8¿zUÇ¡DÈ6•WÄÑÙ¤Ppeè̹Da«/ˆƒ9ˆà‚°tXwduƒ¦ÁòAÿ`X©›ªÓ +šÙÆ\ÇÄÁ•G"']§#Lçß©yÝùfÍõóqË)+ACyœ§ÏÐ$ªK+|íªÅn¯Z_u ítõÊcu÷¸Ú¨N'úƒR´±©©¡Þé*}Åh¹$úYØcv§Ë LjùµŽ‹´,Ž~ñ@×ÄÀ–k­zãªä+ëöܺƈ+”íÖ®ÿìWûì>¯Æ—ùÖÖøÅ—nžÿËáƵxŧç á…“¯Ú…ï~¿ð†T~º´ ˜<3È‹£‰¬Î–¶çíìŽ>÷!;0üÜ"ïY?$2›>vüù‡ÉpÌý‰rGãV¦Ÿ9àÿ +sÌÿ5æä¿É.ÿØ6Ê3Žß{Ÿcûì;ŸÏ¿bÇç;_ì8çó9É9‰Ç~›’•´u-´`Öµ¥´£¤Tmj;eL´R5ñG‡ÛL“¦f¤­ üÑLÓ¤1!ÕÛ´JÐ?ZibHaTø‡%Ýó¾v[‘î}îÞܽ¾û>Ïóyž7ð™ÿÓ°g ûvu{<& ƒt7×Ýp¥# Úi¢þ ‰lÈí‚M̲àóDhïFp\w"O2p}‰8…èä 8ÄâX°ÌôØz]ÿžþ½KOçI6°hˆDÇ2ÜOmJnÛlÉ¡Q#@8µ$$ŵ±×ÚÁBÊÆÖõÆ*ši’`1Iæ¬A¬@¨Â«Hú`FH*˜êí‹EãQ–OÊjŠéQ")” +&R(†¡æ Ô0‰“F]32½ã@üçvâÀuá0×X¿íÙ=óýêÞ1}®ùBëàÎõß½ö·Ï3}ጣM /Þ;´}úáȹ‹'.†Âÿþõ[Ï«òð®sb +JÜ”ë d¨‰Ã6âCªÁŠ<ãVyÉÝ5`·òAÉ/2㘒(ªûÏ:2Tr6¡&ê î|%†²'ÃÈ +ü¬·ðnÞkãh .Úª}Ýæìh´ňl¥x‰¥ò:«ŸÉÛ_·u•aòÑ„–ˆÄ«­ +\õûå¼@4‡…ˆÅv~ÈI -e„´PŽ g„EgIØCO[ÂMÁ-ÄÓvÉf‹ö_µ÷Ð~Ä“B´° +r’xëjUZ]X]ÔÒ³O¤/Í[ïÍÄõI>±^è{ÙsÊ:›¿Øõ®çü¥âMã‹û¼ÞaO™¯ðém®nHÛ¼'¯Ž©³ê/º_8çyÛz{Ú‡g)ÍŸI 7î6”ZÞo 5¢s{ +Ë•ÎæœN©0„cN©†È¿—å˜Skr]8¬($E•ÞÑס×f9l:\“Kb"xðuÛ=“ígiªÉub±Þ6=‹fgcãÍÛ-Š^ÿ8Šq³èˆêF6ô&MŽÇù†‡`ëö§Ô)vjV“ȤD'%$JªÄJMÎ…•¬S‚¥X‰Žê°Ö²füž +³ÜŸw +8Ó爅ÅÓn¾Ð*°…£[Çv´Käíj•øzÈâθÞXøÄÈ&½ IäêºI[™5¹bÚàÙéï>rAÁªæ˜»ÖLJ³= ›Qøì>¸Wu€Ãð`Ô±äVh4-4A¡‡$‡"®Ñ 7‰)íÑö@Æá!wûž!i¡ÀÝ«,ûšX Å_Þ±&Gk¿ÿûƒ ?Øqâ·?mížyüäS?zéùK-ãóŽTç­ô³´Ês¿yõM1ñCîWOöLì?»Ý5‘7Šl¿¸ãUmpðáRñ;q|dædipñÉW>¨=Ûüåá§ß\ÞTúê¿Aµ<¼}Ët<˜Š^v3ô²c´—½þ.Ãß¾ùŽ¯R¤Ùû@ÙqmfÙùb«Èº].>Âgù.ÑÏèLAõKºTàåóË6˜¡šì5Ôs†ªgt¡ú3™¤¡jMöc¼/Óo¨…L%àQ&v Ë­kZ à÷v«äPBXÛTá™ûž,‡ð4•q¸( +Âë‡Á´`Ð + ºCX +:WBH ¡tèJˆ•B(ÔDïcy¥ˆÔâR‘µ‹Ï%jeò!Ë°µ°µ° µ°µ…"µ8ÉQdĤšd“ý9:/v3‡ìÜJ®•ãÈÔòè¸C-äµðRôVO¯æäâÖ¶v+B" "ØÔ¨J= + íVƒríîtk¤=j«Wƒ• +æºPƒv +É`_]£¿¡õtFí«PÄWÛŽ‹0$¤z€D¯¦Ô﬿‹à5Ž@Ìš²AÚFD 9…æB+ßí¿uÞMðøµ¹\ýiëñ™G~’ïŸÜÈÅeÙLôÏÄÐÄFv"ÌÕ\sëÿzhzÿË‹g–݆áÖzž@oýxBÙðíë݆Á§#¹KO9Ý}ÐS 0 ›qb|L’¹†#©ãÁh] BëšTƒ’,%ù¨¡Ê¤™Ôý†$'™˜¡&ßGŸ3ˆÊtFœó<â1ƒ„$/½¢Af];æò‚ úU?ëˆE1,%bŒ—‰YNgjCQj±m•œ¥(:ELTŠ²Ñc85ŸbÕÔžÔbj)Õe§ê©Óp²’º‘â{·­xÀq_6(|Ún“n­u*P}’„Jm¢{5e$ôMAÓì¦Ýb¼{÷‡Åé +w-¥§\‡èÆnL¬'öv«G÷±:œöAvš ›Awð±2QmŒ–d$ºž‘T—ÄKïƒâNµƒ*ï¢ÚAÑ—àG2ð$ïò2wʵ(ãk+C̲å8¾ŽBÄâ H´äC§}ˆñI>ÖwL•å%™³åº|Z^‘oÈ.™Ü?è8Ä^²ŠN +Dü +uv!ma`}KŽå{2Ì}õÜÝçþ²—||‡M£P?M¶‹°éÓ‹¾Š‡GyϱÊór—úxî#ö*÷Ï.Ì—XÜUt=ÁÊbv¶¦4Éf½;3û˜Å;3Þew°gYSXƒ]™ìlŒí`âÙtcŠ°ÁÆ%<bW%Ei#™ªBªÔVü(*?R5¦ÄJUÕ-QRªJEmÔDý‘F¢i+«R ˆÙî¹3ë ÍFý±w÷»çÜ;íž{ÏwϦüe,ðWØ©:)…)…æ/·¨6Y«Ö²|¸F6ñ_¦4÷Ë$¼)“HÁI46¤‘H@Ñ Ö£˜àPí¬†ËúÊÚöç–ÒEºÄ“AÏ?‡Ô1~<8.Ž©¿dÞÖ£Þ¡š¡ðhbÜ;V3OøHÊû°ž"ôXŠÒ‰A­¤¤©ºUâTÝâ‚ÒõÌ‘¹S¿ì?õÞï¦ÿü›]JHX_Xª™5Ñ\6É^{ñ£¯¿óµ‹dɵëÄêÜpóW‡ÊÝjzu©»<šŠQ&éÁrü0®`=1±ªÍ -B4(ºÅtDû§‰EXõU˜ +íØëz“3LiîtXt¬mFãEÑ"ç…s#¨5R1œ +êõ”¨‰õ<‰ÅÒuÍ!dåm=årf±^O 9• ,ÛZ+î÷ÚU¥ðJ1PÏk©@¸ 7Ip¤ïsÞÞ½¬w’¼i PVt<£2iw7¥.(»Èp¬•ãÅ©4JH‹i&ý‡†^·^v ùöíòÌŒ8ížY¸, ¿–7$.È$‹TØËgk!ÙÜÓÌÕ­T¹*t]œL£‰†µ+¦Úõò+mÍkÛ +M½Þ@M*Y3ˆ7ØØ<ç]mù¹eì¥w¿Ù×QZÛÝÎññtiϱ÷š[ÄE* +(OË)Ƴ)^›ôг.7ÿæ<7 *\°CãÂxq:!ê$¹j«„‹FÙØWÂÂ2ÁXᨿ?$0ì$ Ù)p5˜\D8ÂÝÃx"ñØÉ(—Áh)B#$¦ÒÅÆÈTäF„¨ILd5¤ºÛ›!}õŠw7ÌàJ³ÓåRë,Ã!¯ã6 ÃDZË ÕЩ¸¡rråÊUdòƒÂ9±íóÚæ«»ž—§^üÑnvîòÞÙŸmnLíOí]>O>Îìzë$ÝÒü´çuöä™WdÊŸ{ö%9ZDÕÈ qAAdEÎÛmŒ7*¥h)^R6F7Æ7*;=;åíÚ g`Ÿð%ùPü²OÛ¯?'ž’OÇ_PF´“Æ s¼pÁzŸÿn…þ’¿ww„»¡ûùà>ĉ‰Óì¦Âî‚ŸF–¥H¢ šª'8“˜ÖÝtë*‹t%bà/‹Äu%gdõœ=9ÿÜ„Ä2Èâ#öAò†•Ï¯Ó¨®ð¯3ð¬®áPãX?KØg%1*I" À¬“dôe‘cΟ×"2^ òWã¾Á–©[†Ž³’È‘@ÞÌ%”€ŸÏ³ š“y·¤_Õì–îF[º'Ôd±` ¡"àb~X EIšÇ }’,½jï–†$Fú Y +øñn*cÃþQÿ¼Ÿ]æ·ý›ü¬_]Z˜d¶OÔý|[b’ä_B.½¹T±~O&f“êl¢·£¿ýVÙ%UJ§4…°ÉŠ+ËÃèIJËÙ +ËwZ|Ës¶°†CzÔ±¬dÄ"N9½åš©ò¿·?+úZ}­tó¡Ê…açHÕæ?œä’8ù‰½g¤–¸/Ú¢ ˆ{tz›aqšMu1*=•HÄÉÖºïŽPzV†^ÂNÏÃýâÇͦº‚¼¿l±ñò™€¶´‘ü±YK9‘Ì­"±ÂJkÌk³[˜ï»Ñe³µ²´mî[d0ÑSïËfYU‰÷àpÓú¤¹˜Ëfù¦fU¨´ÿ0âÿW\°íÿžnÌTð½ + 4Ô| ôû¿ëBþ"@T{€Ø/\Ä_{õBUTQEUTQEUTQEUTQEUTñ0€´E¥I"xxbcŸ| ¶úÇM>¶ët®ïêîy`#lÞ° +v|á¿zígÑ8Â>"þU XÏ@£ðe8>?×æ÷áüá…ùù›~*Q~\{r(}°¿ò< *ö¤ò Uü¸>Þrº‚œg–COÅg §+>‹óߨøú?­ø<úëèêhëj·¶ìéí?¾åÈàžÃù5Gö}ú Ð]ˆ6ìÛÁ‚­´Aè‡èÅþ8lÁ WÖ ?€ÁÛ‚WÀ1ô÷`?ýóŸÅ4Òž%ðwhÅ›=YqÓ‚÷,îÇTr¯ø8ôèhÁÂ~FÆÇ?i/o æ„Ç}ô5¿ö5±#•Ufnè +ü@ë ·Þñ©>çî‹7›ÖQûãë—õû/Ͼ"vøšpH×Ýyó¿Äúæ³ +endstream +endobj +28 0 obj +<< +/S /D +>> +endobj +29 0 obj +<< +/Nums [ 0 28 0 R ] +>> +endobj +30 0 obj +<< +/Type /Pages +/Kids [ 35 0 R 1 0 R 4 0 R 7 0 R 10 0 R 13 0 R 17 0 R ] +/Count 7 +>> +endobj +31 0 obj +<< +/CreationDate (D:20031107155820+02'00') +/ModDate (D:20031107155820+02'00') +/Producer (Acrobat Distiller 5.0 \(Windows\)) +/Author (ege) +/Creator (PScript5.dll Version 5.2) +/Title (Microsoft PowerPoint - fifo_Comparison.ppt) +>> +endobj +32 0 obj +<< /Type /Metadata /Subtype /XML /Length 1098 >> +stream + +Microsoft PowerPoint - fifo_Comparison.ppt + + +endstream +endobj +xref +0 33 +0000000000 65535 f +0000063513 00000 n +0000063664 00000 n +0000063822 00000 n +0000066188 00000 n +0000066339 00000 n +0000066473 00000 n +0000068166 00000 n +0000068317 00000 n +0000068463 00000 n +0000072477 00000 n +0000072631 00000 n +0000072778 00000 n +0000075405 00000 n +0000075559 00000 n +0000075779 00000 n +0000080237 00000 n +0000080498 00000 n +0000080652 00000 n +0000080835 00000 n +0000081223 00000 n +0000153071 00000 n +0000216698 00000 n +0000216914 00000 n +0000217315 00000 n +0000217528 00000 n +0000227848 00000 n +0000228068 00000 n +0000241495 00000 n +0000241526 00000 n +0000241570 00000 n +0000241675 00000 n +0000241922 00000 n +trailer +<< +/Size 33 +/ID[<5ab2ce6d23797f07660c2e8ad696cfc3><5b35cbeb57638c642f899e30b20e117a>] +>> +startxref +173 +%%EOF Index: trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Doc/fifojen_erot.txt =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Doc/fifojen_erot.txt (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Doc/fifojen_erot.txt (revision 18) @@ -0,0 +1,30 @@ + +Fifo_case (global): +- input and output-register is always the same. +- after the first data the following data is stored to + a shift register +- see the fifo_case.ppt for more info + +differencies between fifo_case's: +v3 - bug discovered - don't use +v4 - uses a variable rather than a signal to update control signals + (Empty, Full, etc.). +v4a - doesn't reset to zero any register. only control + data_amount +v5 - code-level registered output (concurrent assignments), v3 doesn't have. + - signal is used to update control signals. +v6 - different from v5 : doesn't reset to zero any register. only control + + data_amount + + +fifo_im: uses mux in the input +fifo_iom: uses mux in the input and output +fifo_im_case: implemented as fifo_im except that uses "case" instead of "if". + (makes it concurrent rather than sequential) + +there is a problem with fifo_im (both) when trying to write data even though +fifo is full. + + +Fifo_cases: +tested: doesn't set the output to '0's when last data is read. +Result: doesn't have a significant impact on anything Index: trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Doc/plot_comparison.xls =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Doc/plot_comparison.xls =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Doc/plot_comparison.xls (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Doc/plot_comparison.xls (revision 18)
trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Doc/plot_comparison.xls Property changes : Added: svn:mime-type ## -0,0 +1 ## +application/octet-stream \ No newline at end of property Index: trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Doc/emulation_status.txt =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Doc/emulation_status.txt (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Doc/emulation_status.txt (revision 18) @@ -0,0 +1,4 @@ +fifo_im_case - ok +fifo_casev4 - toimii, data_outissa heittoa verrattuna in-muxiin, kun fifo +tyhja (tama kun tyhjentaa, in-mux ei) +fifo_casev5 - kuten v4. Index: trunk/TUT/ip.hwp.storage/fifos/synch_fifos/environment.cshrc =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synch_fifos/environment.cshrc (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synch_fifos/environment.cshrc (revision 18) @@ -0,0 +1,35 @@ + +# source /opt/modeltech-5.5d/modeltech.cshrc +# source /opt/modeltech-5.6b/modeltech.cshrc + source /opt/modeltech-5.7a/modeltech.cshrc + + +# Synopsys-hommat pitaa sourcettaa vastaa Mentorin +# juttujen jalkeen, koska paskat Mentorin softat ei muuten +# toimi. Tulee maailman informatiivisin +# virheilmoitus "printenv: Undefined variable." + +source /opt/synopsys/syn-2000.11/synopsys.cshrc + + + + + + +setenv USER_HOME $HOME + + +setenv CODEC_DATA_DIR /tmp/${USER}/Fifo_comparison +setenv CODEC_WORK_DIR ${PWD} + +echo "###########" +echo Directory settings for fifo_comparison +echo Data_dir = $CODEC_DATA_DIR +echo Work_dir = $CODEC_WORK_DIR +echo "###########" + + + + + +echo; echo " Environment is set" Index: trunk/TUT/ip.hwp.storage/fifos/synch_fifos/shifter.do =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synch_fifos/shifter.do (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synch_fifos/shifter.do (revision 18) @@ -0,0 +1,31 @@ +onerror {resume} +quietly WaveActivateNextPane {} 0 +add wave -noupdate -format Logic /tb_fifo2/clk +add wave -noupdate -format Logic /tb_fifo2/rst_n +add wave -noupdate -format Literal -radix unsigned /tb_fifo2/data_in +add wave -noupdate -format Literal -radix unsigned /tb_fifo2/data_out +add wave -noupdate -format Logic /tb_fifo2/write_enable +add wave -noupdate -format Logic /tb_fifo2/read_enable +add wave -noupdate -format Logic /tb_fifo2/full +add wave -noupdate -format Logic /tb_fifo2/one_place_left +add wave -noupdate -format Logic /tb_fifo2/empty +add wave -noupdate -format Logic /tb_fifo2/one_data_left +add wave -noupdate -format Literal -radix unsigned /tb_fifo2/read_data +add wave -noupdate -format Literal /tb_fifo2/test_phase +add wave -noupdate -format Literal -radix unsigned /tb_fifo2/dut/intermediate_signal +add wave -noupdate -format Literal -radix unsigned /tb_fifo2/dut/first_slot/data_reg +add wave -noupdate -format Literal -radix unsigned /tb_fifo2/dut/map_slots__3/gen_slot_i/data_reg +add wave -noupdate -format Literal -radix unsigned /tb_fifo2/dut/map_slots__2/gen_slot_i/data_reg +add wave -noupdate -format Literal -radix unsigned /tb_fifo2/dut/map_slots__1/gen_slot_i/data_reg +add wave -noupdate -format Literal -radix unsigned /tb_fifo2/dut/map_slots__0/gen_slot_i/data_reg +TreeUpdate [SetDefaultTree] +WaveRestoreCursors {102 ns} +WaveRestoreZoom {0 ns} {442 ns} +configure wave -namecolwidth 220 +configure wave -valuecolwidth 110 +configure wave -justifyvalue left +configure wave -signalnamewidth 0 +configure wave -snapdistance 10 +configure wave -datasetprefix 0 +configure wave -rowmargin 4 +configure wave -childrowmargin 2 Index: trunk/TUT/ip.hwp.storage/fifos/synch_fifos/modelsim.ini =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synch_fifos/modelsim.ini (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synch_fifos/modelsim.ini (revision 18) @@ -0,0 +1,293 @@ +[Library] +others = $MODEL_TECH/../modelsim.ini + +work = /tmp/kulmala3/Fifo_comparison/codelib +[vcom] +; Turn on VHDL-1993 as the default. Default is off (VHDL-1987). +; VHDL93 = 1 + +; Show source line containing error. Default is off. +; Show_source = 1 + +; Turn off unbound-component warnings. Default is on. +; Show_Warning1 = 0 + +; Turn off process-without-a-wait-statement warnings. Default is on. +; Show_Warning2 = 0 + +; Turn off null-range warnings. Default is on. +; Show_Warning3 = 0 + +; Turn off no-space-in-time-literal warnings. Default is on. +; Show_Warning4 = 0 + +; Turn off multiple-drivers-on-unresolved-signal warnings. Default is on. +; Show_Warning5 = 0 + +; Turn off optimization for IEEE std_logic_1164 package. Default is on. +; Optimize_1164 = 0 + +; Turn on resolving of ambiguous function overloading in favor of the +; "explicit" function declaration (not the one automatically created by +; the compiler for each type declaration). Default is off. +; The .ini file has Explict enabled so that std_logic_signed/unsigned +; will match the behavior of synthesis tools. +Explicit = 1 + +; Turn off VITAL compliance checking. Default is checking on. +; NoVitalCheck = 1 + +; Ignore VITAL compliance checking errors. Default is to not ignore. +; IgnoreVitalErrors = 1 + +; Turn off VITAL compliance checking warnings. Default is to show warnings. +; Show_VitalChecksWarnings = false + +; Keep silent about case statement static warnings. +; Default is to give a warning. +; NoCaseStaticError = 1 + +; Keep silent about warnings caused by aggregates that are not locally static. +; Default is to give a warning. +; NoOthersStaticError = 1 + +; Treat as errors: +; case statement static warnings +; warnings caused by aggregates that are not locally static +; Overrides NoCaseStaticError, NoOthersStaticError settings. +; PedanticErrors = 1 + +; Turn off acceleration of the VITAL packages. Default is to accelerate. +; NoVital = 1 + +; Turn off inclusion of debugging info within design units. +; Default is to include debugging info. +; NoDebug = 1 + +; Turn off "loading..." messages. Default is messages on. +; Quiet = 1 + +; Turn on some limited synthesis rule compliance checking. Checks only: +; -- signals used (read) by a process must be in the sensitivity list +; CheckSynthesis = 1 + +; Activate optimizations on expressions that don't involve signals, +; waits, or function/procedure/task invocations. Default is off. +; ScalarOpts = 1 + +; Require the user to specify a configuration for all bindings, +; and do not generate a compile time default binding for the +; component. This will result in an elaboration error of +; 'component not bound' if the user fails to do so. Avoids the rare +; issue of a false dependency upon the unused default binding. +; RequireConfigForAllDefaultBinding = 1 + +; Inhibit range checking on subscripts of arrays. Range checking on +; scalars defined with subtypes is inhibited by default. +; NoIndexCheck = 1 + +; Perform range checks on all (implicit and explicit) assignments to +; scalar objects defined with subtypes. +; RangeCheck = 1 + +[vlog] + +; Turn off inclusion of debugging info within design units. +; Default is to include debugging info. +; NoDebug = 1 + +; Turn off "loading..." messages. Default is messages on. +; Quiet = 1 + +; Turn on Verilog hazard checking (order-dependent accessing of global vars). +; Default is off. +; Hazard = 1 + +; Turn on converting regular Verilog identifiers to uppercase. Allows case +; insensitivity for module names. Default is no conversion. +; UpCase = 1 + +; Turn on incremental compilation of modules. Default is off. +; Incremental = 1 + +; Turns on lint-style checking. +; Show_Lint = 1 + +[vsim] +; Simulator resolution +; Set to fs, ps, ns, us, ms, or sec with optional prefix of 1, 10, or 100. +Resolution = ns + +; User time unit for run commands +; Set to default, fs, ps, ns, us, ms, or sec. The default is to use the +; unit specified for Resolution. For example, if Resolution is 100ps, +; then UserTimeUnit defaults to ps. +UserTimeUnit = default + +; Default run length +RunLength = 100 + +; Maximum iterations that can be run without advancing simulation time +IterationLimit = 5000 + +; Directive to license manager: +; vhdl Immediately reserve a VHDL license +; vlog Immediately reserve a Verilog license +; plus Immediately reserve a VHDL and Verilog license +; nomgc Do not look for Mentor Graphics Licenses +; nomti Do not look for Model Technology Licenses +; noqueue Do not wait in the license queue when a license isn't available +; viewsim Try for viewer license but accept simulator license(s) instead +; of queuing for viewer license +; License = plus + +; Stop the simulator after an assertion message +; 0 = Note 1 = Warning 2 = Error 3 = Failure 4 = Fatal +BreakOnAssertion = 3 + +; Assertion Message Format +; %S - Severity Level +; %R - Report Message +; %T - Time of assertion +; %D - Delta +; %I - Instance or Region pathname (if available) +; %% - print '%' character +AssertionFormat = "** %S: %R Time: %T Iteration: %D%I\n" + +; Assertion File - alternate file for storing assertion messages +; AssertFile = assert.log + +; Default radix for all windows and commands... +; Set to symbolic, ascii, binary, octal, decimal, hex, unsigned +DefaultRadix = symbolic + +; VSIM Startup command +; Startup = do startup.do + +; File for saving command transcript +TranscriptFile = transcript + +; File for saving command history +; CommandHistory = cmdhist.log + +; Specify whether paths in simulator commands should be described +; in VHDL or Verilog format. For VHDL, PathSeparator = / +; for Verilog, PathSeparator = . +PathSeparator = / + +; Specify the dataset separator for fully rooted contexts. +; The default is ':'. For example, sim:/top +; Must not be the same character as PathSeparator. +DatasetSeparator = : + +; Disable assertion messages +; IgnoreNote = 1 +; IgnoreWarning = 1 +; IgnoreError = 1 +; IgnoreFailure = 1 + +; Default force kind. May be freeze, drive, or deposit +; or in other terms, fixed, wired, or charged. +; DefaultForceKind = freeze + +; If zero, open files when elaborated; otherwise, open files on +; first read or write. Default is 0. +; DelayFileOpen = 1 + +; Control VHDL files opened for write +; 0 = Buffered, 1 = Unbuffered +UnbufferedOutput = 0 + +; Control number of VHDL files open concurrently +; This number should always be less than the +; current ulimit setting for max file descriptors. +; 0 = unlimited +ConcurrentFileLimit = 40 + +; Controls the number of hierarchical regions displayed as +; part of a signal name shown in the waveform window. The default +; value or a value of zero tells VSIM to display the full name. +; WaveSignalNameWidth = 0 + +; Turn off warnings from the std_logic_arith, std_logic_unsigned +; and std_logic_signed packages. +; StdArithNoWarnings = 1 + +; Turn off warnings from the IEEE numeric_std and numeric_bit packages. +; NumericStdNoWarnings = 1 + +; Control the format of a generate statement label. Don't quote it. +; GenerateFormat = %s__%d + +; Specify whether checkpoint files should be compressed. +; The default is to be compressed. +; CheckpointCompressMode = 0 + +; List of dynamically loaded objects for Verilog PLI applications +; Veriuser = veriuser.sl + +; Specify default options for the restart command. Options can be one +; or more of: -force -nobreakpoint -nolist -nolog -nowave +; DefaultRestartOptions = -force + +; HP-UX 10.20 ONLY - Enable memory locking to speed up large designs +; (> 500 megabyte memory footprint). Default is disabled. +; Specify number of megabytes to lock. +; LockedMemory = 1000 + +; Turn on (1) or off (0) WLF file compression. +; The default is 1; compress WLF file. +; WLFCompress = 0 + +; Specify whether to save all design hierarchy (1) in WLF file +; or only regions containing logged signals (0). +; The default is 0; log only regions with logged signals. +; WLFSaveAllRegions = 1 + +; WLF file time limit. Limit WLF file by time, as closely as possible, +; to the specified amount of simulation time. When the limit is exceeded +; the earliest times get truncated from the file. +; If both time and size limits are specified the most restrictive is used. +; UserTimeUnits are used if time units are not specified. +; The default is 0; no limit. Example: WLFTimeLimit = {100 ms} +; WLFTimeLimit = 0 + +; WLF file size limit. Limit WLF file size, as closely as possible, +; to the specified number of megabytes. If both time and size limits +; are specified then the most restrictive is used. +; The default is 0; no limit. +; WLFSizeLimit = 1000 + +; Specify whether or not a WLF file should be deleted when the +; simulation ends. A value of 1 will cause the WLF file to be deleted. +; The default is 0; don't delete WLF file when simulation ends. +; WLFDeleteOnQuit = 1 + +[lmc] +; ModelSim's interface to Logic Modeling's SmartModel SWIFT software +libsm = $MODEL_TECH/libsm.sl +; ModelSim's interface to Logic Modeling's SmartModel SWIFT software (Windows NT) +; libsm = $MODEL_TECH/libsm.dll +; Logic Modeling's SmartModel SWIFT software (HP 9000 Series 700) +; libswift = $LMC_HOME/lib/hp700.lib/libswift.sl +; Logic Modeling's SmartModel SWIFT software (IBM RISC System/6000) +; libswift = $LMC_HOME/lib/ibmrs.lib/swift.o +; Logic Modeling's SmartModel SWIFT software (Sun4 Solaris) +; libswift = $LMC_HOME/lib/sun4Solaris.lib/libswift.so +; Logic Modeling's SmartModel SWIFT software (Windows NT) +; libswift = $LMC_HOME/lib/pcnt.lib/libswift.dll +; Logic Modeling's SmartModel SWIFT software (Linux) +; libswift = $LMC_HOME/lib/x86_linux.lib/libswift.so + +; ModelSim's interface to Logic Modeling's hardware modeler SFI software +libhm = $MODEL_TECH/libhm.sl +; ModelSim's interface to Logic Modeling's hardware modeler SFI software (Windows NT) +; libhm = $MODEL_TECH/libhm.dll +; Logic Modeling's hardware modeler SFI software (HP 9000 Series 700) +; libsfi = /lib/hp700/libsfi.sl +; Logic Modeling's hardware modeler SFI software (IBM RISC System/6000) +; libsfi = /lib/rs6000/libsfi.a +; Logic Modeling's hardware modeler SFI software (Sun4 Solaris) +; libsfi = /lib/sun4.solaris/libsfi.so +; Logic Modeling's hardware modeler SFI software (Windows NT) +; libsfi = /lib/pcnt/lm_sfi.dll Index: trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_slotted_2.vhd =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_slotted_2.vhd (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_slotted_2.vhd (revision 18) @@ -0,0 +1,147 @@ +------------------------------------------------------------------------------- +-- Title : fifo +-- Project : +------------------------------------------------------------------------------- +-- File : fifo_slotted_2.vhd +-- Author : +-- Company : +-- Created : 2005-05-23 +-- Last update: 2005/12/15 +-- Platform : +-- Standard : VHDL'87 +------------------------------------------------------------------------------- +-- Description: +------------------------------------------------------------------------------- +-- Copyright (c) 2005 +------------------------------------------------------------------------------- +-- Revisions : +-- Date Version Author Description +-- 2005-05-23 1.0 penttin5 Created +-- 2005-05-31 1.1 penttin5 Added comments +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; + +entity fifo is + + generic ( + data_width_g : integer := 0; + depth_g : integer := 0 + ); + port ( + clk : in std_logic; + rst_n : in std_logic; + data_in : in std_logic_vector (data_width_g-1 downto 0); + we_in : in std_logic; + one_p_out : out std_logic; + full_out : out std_logic; + data_out : out std_logic_vector (data_width_g-1 downto 0); + re_in : in std_logic; + empty_out : out std_logic; + one_d_out : out std_logic + ); + +end fifo; + +architecture rtl of fifo is + + component fifo_reg + generic ( + width_g : integer := 0); + + port ( + clk : in std_logic; + rst_n : in std_logic; + load_in : in std_logic; + data1_in : in std_logic_vector(width_g - 1 downto 0); + data2_in : in std_logic_vector(width_g - 1 downto 0); + data_sel_in : in std_logic; + data_out : out std_logic_vector(width_g - 1 downto 0)); + end component; -- fifo_reg + + signal fifo_state_r : std_logic_vector(depth_g downto 0); + type reg_data_type is array (0 to depth_g) of std_logic_vector(data_width_g - 1 downto 0); + type reg_load_type is array (0 to depth_g - 1) of std_logic; + signal reg_data_out : reg_data_type; + signal reg_load : reg_load_type; + signal reg_data_sel : std_logic_vector(depth_g - 1 downto 0); + +begin -- rtl + + empty_out <= fifo_state_r(0); + full_out <= fifo_state_r(depth_g); + one_d_out <= fifo_state_r(1); + one_p_out <= fifo_state_r(depth_g - 1); + data_out <= reg_data_out(0); + + reg_data_out(depth_g) <= (others => '0'); + + -- load new value if (write and this is the next free register) or read + reg_load_assign : for i in 0 to depth_g - 1 generate + reg_load(i) <= (fifo_state_r(i) and we_in) or re_in; + end generate reg_load_assign; + + + -- sel = 0 <=> load from data_in, + -- sel = 1 <=> load from register i+1 + -- Data in from the next register (i+1) if: + -- 1 not read or not write or this is not the first free register + -- AND + -- 1.1 read and fifo full or + -- 1.2 read and write and this is not the last free register + reg_data_sel_assign : for i in 0 to depth_g - 1 generate + reg_data_sel(i) <= ((re_in and (not(we_in) or fifo_state_r(depth_g))) or (re_in and we_in and not (fifo_state_r (i + 1)))) + and (not(re_in and we_in and fifo_state_r(i))); + end generate reg_data_sel_assign; + + map_registers : for i in 0 to depth_g - 1 generate + gen_reg_i : fifo_reg + generic map ( + width_g => data_width_g + ) + port map ( + clk => clk, + rst_n => rst_n, + load_in => reg_load(i), + data1_in => data_in, + data2_in => reg_data_out(i + 1), + data_sel_in => reg_data_sel(i), + data_out => reg_data_out(i) + ); + end generate map_registers; + + ----------------------------------------------------------------------------- + -- Update fifo_state_r + ----------------------------------------------------------------------------- + fifo_state_r_update : process (clk, rst_n) + begin -- process fifo + if rst_n = '0' then -- asynchronous reset (active low) + + -- after reset the first register is the first free register + fifo_state_r (depth_g downto 1) <= (others => '0'); + fifo_state_r (0) <= '1'; + + elsif clk'event and clk = '1' then -- rising clock edge + + -- free the last full register if: + -- read and fifo isn't empty or simultaneus read and write and fifo is full + if (re_in = '1' and ((we_in = '0' and fifo_state_r(0) = '0') or + (we_in = '1' and fifo_state_r(depth_g) = '1'))) + then + fifo_state_r <= '0' & fifo_state_r(depth_g downto 1); + + -- fill the first free register if: + -- write and fifo isn't full or simultaneus read and write and fifo is empty + -- write and ( (no read and fifo not full) or (read and empty) ) + elsif (we_in = '1' and ((re_in = '0' and fifo_state_r(depth_g) = '0') or + (re_in = '1' and fifo_state_r(0) = '1'))) then + fifo_state_r <= fifo_state_r(depth_g - 1 downto 0) & '0'; + else + fifo_state_r <= fifo_state_r; + end if; + end if; + end process fifo_state_r_update; +end rtl; Index: trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_iom.vhdl =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_iom.vhdl (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_iom.vhdl (revision 18) @@ -0,0 +1,299 @@ +------------------------------------------------------------------------------- +-- File : fifo_iom.vhdl +-- Description : Fifo buffer for hibi interface. +-- Uses pointers and muxes for input and output. +-- +-- Author : Erno Salminen +-- Date : 29.04.2002 +-- Modified : 30.04.2002 Vesa Lahtinen Optimized for synthesis +-- +-- 02.06 ES: default assignment Fifo_Buffer <= Fifo_Buffer +-- Effect on synthesis is uncertain : +-- small fifos seem to gets smaller and faster, but big fifos +-- get bigger and slower. Strange. +------------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; + +entity fifo is + + + generic ( + width : integer := 0; + depth : integer := 0); + + port ( + Clk : in std_logic; + Rst_n : in std_logic; + Data_In : in std_logic_vector (width-1 downto 0); + Write_Enable : in std_logic; + One_Place_Left : out std_logic; + Full : out std_logic; + Data_Out : out std_logic_vector (width-1 downto 0); + Read_Enable : in std_logic; + Empty : out std_logic; + One_Data_Left : out std_logic + ); + +end fifo; + +architecture inout_mux of fifo is + + type data_array is array (depth-1 downto 0) of std_logic_vector (width-1 downto 0); + signal Fifo_Buffer : data_array; + + signal in_ptr : integer range 0 to depth-1; + signal out_ptr : integer range 0 to depth-1; + + -- Registers + signal Full_reg : std_logic; + signal Empty_reg : std_logic; + signal One_Data_Left_reg : std_logic; + signal One_Place_Left_reg : std_logic; + --signal Data_Amount : std_logic_vector (depth-1 downto 0); + signal Data_Amount : integer range 0 to depth-1; + + +begin -- inout_mux + + -- Continuous assignments + -- Assigns register values to outputs + Full <= Full_reg; + Empty <= Empty_reg; + One_Data_Left <= One_Data_Left_reg; + One_Place_Left <= One_Place_Left_reg; + Data_Out <= Fifo_Buffer (out_ptr); + -- Note! There is some old value in data output when fifo is empty. + + +Main : process (Clk, Rst_n) +begin -- process Main + if Rst_n = '0' then -- asynchronous reset (active low) + + -- Reset all registers + -- Fifo is empty at first + Full_reg <= '0'; + Empty_reg <= '1'; + One_Data_Left_reg <= '0'; + in_ptr <= 0; + out_ptr <= 0; + Data_Amount <= 0; --(others => '0'); + + if depth =1 then -- 30.07 + One_Place_Left_reg <= '1'; + else + One_Place_Left_reg <= '0'; + end if; + + for i in 0 to depth-1 loop + Fifo_Buffer (i) <= (others => '0'); + end loop; -- i + + elsif Clk'event and Clk = '1' then -- rising clock edge + + + -- 1) Write data to fifo + if Write_Enable = '1' and Read_Enable = '0' then + + if Full_reg = '0' then + Empty_reg <= '0'; + if (in_ptr = (depth-1)) then + in_ptr <= 0; + else + in_ptr <= in_ptr + 1; + end if; + out_ptr <= out_ptr; + Data_Amount <= Data_Amount +1; + Fifo_Buffer <= Fifo_Buffer; --02.06 + Fifo_Buffer (in_ptr) <= Data_In; + + -- Check if the fifo is getting full + if Data_Amount + 2 = depth then + Full_reg <= '0'; + One_Place_Left_reg <= '1'; + elsif Data_Amount +1 = depth then + Full_reg <= '1'; + One_Place_Left_reg <= '0'; + else + Full_reg <= '0'; + One_Place_Left_reg <= '0'; + end if; + + -- If fifo was empty, it has now one data + if Empty_reg = '1' then + One_Data_Left_reg <= '1'; + else + One_Data_Left_reg <= '0'; + end if; + + else + in_ptr <= in_ptr; + out_ptr <= out_ptr; + Full_reg <= Full_reg; + Empty_reg <= Empty_reg; + Fifo_Buffer <= Fifo_Buffer; + Data_Amount <= Data_Amount; + One_Data_Left_reg <= One_Data_Left_reg; + One_Place_Left_reg <= One_Place_Left_reg; + end if; + + + -- 2) Read data from fifo + elsif Write_Enable = '0' and Read_Enable = '1' then + + if Empty_reg = '0' then + in_ptr <= in_ptr; + if (out_ptr = (depth-1)) then + out_ptr <= 0; + else + out_ptr <= out_ptr + 1; + end if; + Full_reg <= '0'; + Data_Amount <= Data_Amount -1; + Fifo_Buffer <= Fifo_Buffer; --02.06 + + -- Debug + -- Fifo_Buffer (out_ptr) <= (others => '1'); + + -- Check if the fifo is getting empty + if Data_Amount = 2 then + Empty_reg <= '0'; + One_data_Left_reg <= '1'; + elsif Data_Amount = 1 then + Empty_reg <= '1'; + One_Data_Left_reg <= '0'; + else + Empty_reg <= '0'; + One_Data_Left_reg <= '0'; + end if; + + -- If fifo was full, it is no more + if Full_reg = '1' then + One_Place_Left_reg <= '1'; + else + One_Place_Left_reg <= '0'; + end if; + + else + in_ptr <= in_ptr; + out_ptr <= out_ptr; + Full_reg <= Full_reg; + Empty_reg <= Empty_reg; + Fifo_Buffer <= Fifo_Buffer; + Data_Amount <= Data_Amount; + One_Data_Left_reg <= One_Data_Left_reg; + One_Place_Left_reg <= One_Place_Left_reg; + end if; + + + -- 3) Write and read at the same time + elsif Write_Enable = '1' and Read_Enable = '1' then + + + if Full_reg = '0' and Empty_reg = '0' then + if (in_ptr = (depth-1)) then + in_ptr <= 0; + else + in_ptr <= in_ptr + 1; + end if; + if (out_ptr = (depth-1)) then + out_ptr <= 0; + else + out_ptr <= out_ptr + 1; + end if; + Full_reg <= '0'; + Empty_reg <= '0'; + Data_Amount <= Data_Amount; + One_Data_Left_reg <= One_Data_Left_reg; + One_Place_Left_reg <= One_Place_Left_reg; + + Fifo_Buffer <= Fifo_Buffer; --02.06 + Fifo_Buffer (in_ptr) <= Data_In; + -- Fifo_Buffer (out_ptr) <= (others => '1'); --debug + + + elsif Full_reg = '1' and Empty_reg = '0' then + -- Fifo is full, only reading is possible + in_ptr <= in_ptr; + if (out_ptr = (depth-1)) then + out_ptr <= 0; + else + out_ptr <= out_ptr + 1; + end if; + Full_reg <= '0'; + One_Place_Left_reg <= '1'; + Fifo_Buffer <= Fifo_Buffer; --02.06 + --Fifo_Buffer (out_ptr) <= (others => '1'); -- Debug + Data_Amount <= Data_Amount -1; + + -- Check if the fifo is getting empty + if Data_Amount = 2 then + Empty_reg <= '0'; + One_data_Left_reg <= '1'; + elsif Data_Amount = 1 then + Empty_reg <= '1'; + One_Data_Left_reg <= '0'; + else + Empty_reg <= '0'; + One_Data_Left_reg <= '0'; + end if; + + + elsif Full_reg = '0' and Empty_reg = '1' then + -- Fifo is empty, only writing is possible + if (in_ptr = (depth-1)) then + in_ptr <= 0; + else + in_ptr <= in_ptr + 1; + end if; + out_ptr <= out_ptr; + Empty_reg <= '0'; + One_Data_Left_reg <= '1'; + Fifo_Buffer <= Fifo_Buffer; --02.06 + Fifo_Buffer (in_ptr) <= Data_In; + Data_Amount <= Data_Amount +1; + + -- Check if the fifo is getting full + if Data_Amount + 2 = depth then + Full_reg <= '0'; + One_Place_Left_reg <= '1'; + elsif Data_Amount +1 = depth then + Full_reg <= '1'; + One_Place_Left_reg <= '0'; + else + Full_reg <= '0'; + One_Place_Left_reg <= '0'; + end if; + + + -- 4) Do nothing, fifo remains idle + else + + in_ptr <= in_ptr; + out_ptr <= out_ptr; + Full_reg <= Full_reg; + Empty_reg <= Empty_reg; + Fifo_Buffer <= Fifo_Buffer; + Data_Amount <= Data_Amount; + One_Data_Left_reg <= One_Data_Left_reg; + One_Place_Left_reg <= One_Place_Left_reg; + end if; + + else + -- Fifo is idle + in_ptr <= in_ptr; + out_ptr <= out_ptr; + Full_reg <= Full_reg; + Empty_reg <= Empty_reg; + Fifo_Buffer <= Fifo_Buffer; + Data_Amount <= Data_Amount; + One_Data_Left_reg <= One_Data_Left_reg; + One_Place_Left_reg <= One_Place_Left_reg; + end if; + + end if; +end process Main; + +end inout_mux; Index: trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/lifo_slotted.vhdl =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/lifo_slotted.vhdl (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/lifo_slotted.vhdl (revision 18) @@ -0,0 +1,204 @@ +------------------------------------------------------------------------------- +-- File : lifo_shift.vhdl +-- Description : Lifo buffer for hibi interface +-- +-- Author : Erno Salminen +-- Date : 29.05.2003 +-- Modified : +-- +------------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; + +entity lifo is + + generic ( + width : integer := 3; + depth : integer := 30); + + port ( + Clk : in std_logic; + Rst_n : in std_logic; + Data_In : in std_logic_vector (width-1 downto 0); + Write_Enable : in std_logic; + One_Place_Left : out std_logic; + Full : out std_logic; + Data_Out : out std_logic_vector (width-1 downto 0); + Read_Enable : in std_logic; + Empty : out std_logic; + One_Data_Left : out std_logic + ); + +end lifo; + + + +architecture slotted_lifo_reg of lifo is + + component fifo_slot + generic ( + width : integer := 0); + port ( + Clk : in std_logic; + Rst_n : in std_logic; + Right_Valid_In : in std_logic; + Right_Enable_In : in std_logic; + Right_Data_In : in std_logic_vector ( width-1 downto 0); + + Left_Data_In : in std_logic_vector ( width-1 downto 0); + Left_Valid_In : in std_logic; + Left_Enable : in std_logic; + Valid_Out : out std_logic; + Data_Out : out std_logic_vector ( width-1 downto 0) + ); + + end component; -- fifo_slot; + + + + type Fifo_slot_type is record + Valid : std_logic; + Data : std_logic_vector ( width-1 downto 0); + end record; + type slot_signal_array is array (depth downto -1) of Fifo_slot_type; + signal intermediate_signal : slot_signal_array; + signal we : std_logic_vector ( depth-1 downto 0); + signal re : std_logic_vector ( depth-1 downto 0); + +begin -- slotted_lifo_reg + + + ----------------------------------------------------------------------------- + -- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + -- LIFO! + -- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + ------------------------------------------------------------------------------ + + -- Continuous assignments + -- Assigns register values to outputs + assert depth > 1 report "Lifo depth must be more than one!" severity WARNING; + Full <= intermediate_signal (depth-1).Valid; -- ylin paikka varattu + Empty <= not (intermediate_signal (0).Valid ); -- alin paikka tyhja + + -- Yksi data=alin taynna, toiseksi alin tyhja + One_Data_Left <= not (intermediate_signal (1).Valid) and intermediate_signal (0).Valid; + + -- Yksi paikka=ylin tyhja, toiseksi ylin taynna + One_Place_Left <= not (intermediate_signal (depth-1).Valid) and intermediate_signal (depth-2).Valid; + + Data_Out <= intermediate_signal (0).Data; --alin data ulostuloon + -- Note! There is some old value in data output when lifo is empty. + + + map_slots : for i in 0 to depth-1 generate + gen_slot_i : fifo_slot + generic map ( + width => width) + port map ( + Clk => Clk, + Rst_n => Rst_n, + Right_Valid_In => intermediate_signal (i-1).Valid, + Right_Data_In => intermediate_signal (i-1).Data, + Right_Enable_In => we(i), + Left_Valid_In => intermediate_signal (i+1).Valid, + Left_Data_In => intermediate_signal (i+1).Data, + Left_Enable => re(i), + Valid_Out => intermediate_signal (i).Valid, + Data_Out => intermediate_signal (i).Data + ); + end generate map_slots; + + intermediate_signal (depth).Data <= (others => '0'); --'Z'); + intermediate_signal (depth).Valid <= '0'; + + intermediate_signal (-1).Data <= Data_In; + intermediate_signal (-1).Valid <= '1'; + + + + async_first_slot: process (intermediate_signal, Data_In, Write_Enable, Read_Enable) + begin -- process async_first_slot + -- Ohjataan ensimmaisen we-signaalia + + if Write_Enable = '1' and Read_Enable = '0' then + -- Kirjoitus pelkästään + + re <= (others => '0'); + + if intermediate_signal (depth-1).Valid = '1' then + -- Ylin paikka taynna + we <= (others => '0'); + else + -- Kirjoitetaan uusi data + we <= (others => '1'); + end if; + + + elsif Write_Enable = '0' and Read_Enable = '1' then + -- Luku pelkästään + we <= (others => '0'); + re <= (others => '1'); + + + + elsif Write_Enable = '1' and Read_Enable = '1' then + --Luku ja kirjoitus yhta aikaa + + if intermediate_signal (depth-1).Valid = '1' then + -- Ylin paikka taynna + we <= (others => '0'); + re <= (others => '1'); + + else + -- Kirjoitetaan uusi data alinmpaan slottiiin + -- muut pitväät vanahan arvonsa + we <= (others => '0'); + we(0) <= '1'; + re <= (others => '0'); + + end if; + + + + else + -- Ei tehda mitaan + we <= (others => '0'); --'Z'); + re <= (others => '0'); --'Z'); + + + end if; + + + end process async_first_slot; + + + ----------------------------------------------------------------------------- + -- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + -- LIFO! + -- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + ------------------------------------------------------------------------------ + + + check_we: process (we) + variable one_bits : integer := 0; + begin -- process check_we + one_bits := 0; + + for i in 0 to depth-1 loop + if we(i)= '1' then + one_bits := one_bits +1; + end if; + end loop; -- i + + +-- assert one_bits < 2 report "Too many write enables" severity WARNING; + end process check_we; + + + + + + +end slotted_lifo_reg; --architecture Index: trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_casev3.vhdl =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_casev3.vhdl (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_casev3.vhdl (revision 18) @@ -0,0 +1,237 @@ + +-- !NOTE! output control signals ain't working right in all cases!! + +-- use v5 or v6. + +------------------------------------------------------------------------------- +-- File : fifo_casev3.vhdl +-- Description : Fifo buffer for hibi interface +-- Author : Ari Kulmala +-- Date : 10.06.2003 +-- Modified : 18.06.2003 - Re-wrote the way output control signals are +-- assigned +-- +-- +-- Detailed description: +-- -Input and Output always from the same register +-- -> input-buffer is shifted whenever write occurs +-- -> when read, a mux chooses which value to load to the output next +-- (the oldest) +-- +-- !NOTE! isn't tested as one-length FIFO. doesn't probably work. (vector +-- length (1 downto 2) ... +-- +-- !NOTE! +-- * Output is zero when empty. +------------------------------------------------------------------------------- + + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.std_logic_arith.all; + + +entity fifo is + + generic ( + width : integer := 0; + depth : integer := 0); + + port ( + Clk : in std_logic; + Rst_n : in std_logic; -- Active low + Data_In : in std_logic_vector (width-1 downto 0); + Write_Enable : in std_logic; + One_Place_Left : out std_logic; + Full : out std_logic; + Data_Out : out std_logic_vector (width-1 downto 0); + Read_Enable : in std_logic; + Empty : out std_logic; + One_Data_Left : out std_logic + ); + +end fifo; + +architecture behavioral of fifo is + + type reg is array (depth downto 2) of std_logic_vector + (width-1 downto 0); + signal input_buffer : reg; + +-- signal output : std_logic_vector (width-1 downto 0); + signal Data_amount : integer range 0 to depth; + + + signal WR : std_logic_vector ( 1 downto 0); + +begin -- behavioral + + -- Concurrent assignment + WR <= Write_Enable & Read_Enable; + + + +process (Clk, rst_n) +begin -- process + if rst_n = '0' then -- asynchronous reset (active low) + for i in depth downto 2 loop + input_buffer(i) <= (others => '0'); + end loop; -- i + + Data_out <= (others => '0'); + Data_Amount <= 0; + Empty <= '1'; + One_Data_Left <= '0'; + One_Place_Left <= '0'; + Full <= '0'; + + elsif Clk'event and Clk = '1' then -- rising clock edge + +case WR is + when "01" => -- Read data + if Data_amount = 0 then + Data_amount <= Data_amount; + elsif Data_amount = 1 then + Data_out <= (others => '0'); + Data_amount <= Data_amount-1; + else + Data_out <= input_buffer(Data_amount); + Data_amount <= Data_amount-1; + end if; + + + when "10" => -- Write Data + + if Data_amount = 0 then + Data_out <= Data_In; + Data_amount <= Data_amount+1; + elsif Data_amount = depth then + input_buffer <= input_buffer; + else + for i in depth-1 downto 2 loop + input_buffer(i+1) <= input_buffer(i); + end loop; -- i + input_buffer(2) <= Data_In; + Data_amount <= Data_amount+1; + end if; + + when "11" => -- Read and Write concurrently + + if Data_amount = 0 then + Data_out <= Data_in; + elsif Data_amount = 1 then + Data_out <= Data_In; + elsif Data_amount = depth then -- cannot write if full + Data_out <= input_buffer (Data_amount); + Data_amount <= Data_amount-1; + else + Data_out <= input_buffer (Data_amount); + for i in depth-1 downto 2 loop + input_buffer(i+1) <= input_buffer(i); + end loop; -- i + input_buffer(2) <= Data_In; + end if; + + when others => -- Do nothing + input_buffer <= input_buffer; + Data_amount <= Data_amount; + +end case; + + if Data_amount = 0 then + if Write_Enable = '1' then + Empty <= '0'; + One_Data_Left <= '1'; + else + Empty <= '1'; + One_Place_Left <= '0'; + end if; + + One_Data_Left <= '0'; + Full <= '0'; + + elsif Data_amount = 1 then + if Read_Enable = '1' then + Empty <= '1'; + One_Data_Left <= '0'; + else + Empty <= '0'; + One_Data_Left <= '1'; + end if; + if Write_Enable = '1' then + One_Data_Left <= '0'; + end if; + + One_Place_Left <= '0'; + Full <= '0'; + + elsif Data_amount = 2 then + if Read_Enable = '1' then + One_Data_Left <= '1'; + else + One_Data_Left <= '0'; + end if; + Empty <= '0'; + One_Place_Left <= '0'; + Full <= '0'; + + + elsif Data_amount = (depth-2) then + Empty <= '0'; + if Write_Enable = '1' then + One_Place_Left <= '1'; + else + One_Place_Left <= '0'; + end if; + + One_Data_Left <= '0'; + Full <= '0'; + elsif Data_amount = (depth-1) then + Empty <= '0'; + if Read_Enable = '1' or Write_Enable = '1' then + One_Place_Left <= '0'; + else + One_Place_Left <= '1'; + end if; + One_Data_Left <= '0'; + if Write_Enable = '1' then + Full <= '1'; + else + Full <= '0'; + end if; + + elsif Data_Amount = depth then + if Read_Enable = '1' then + full <= '0'; + One_Data_Left <= '1'; + else + full <= '1'; + One_Data_Left <= '0'; + end if; + Empty <= '0'; + One_Place_Left <= '0'; + + else + Empty <= '0'; + One_Place_Left <= '0'; + One_Data_Left <= '0'; + Full <= '0'; + end if; + + end if; --synchronous + + end process; + +end behavioral; + + + + + + + + + + + + Index: trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_casev4.vhdl =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_casev4.vhdl (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_casev4.vhdl (revision 18) @@ -0,0 +1,188 @@ +------------------------------------------------------------------------------- +-- File : fifo_casev4.vhdl +-- Description : Fifo buffer for hibi interface +-- Author : Ari Kulmala +-- Date : 12.06.2003 +-- Modified : +-- +-- +-- Detailed description: +-- -Uses variable to handle Data-amount and Full, Empty etc. signals +-- -Input and Output always from the same register +-- -> input-buffer is shifted whenever write occurs +-- -> when read, a mux chooses which value to load to the output next +-- (the oldest) +-- +-- Fifo with case version 4: +-- different from v3: +-- - using variable data_amount in order to update it right away, +-- rather than wait util the process ends. +-- +-- !NOTE! isn't tested as one-length FIFO. doesn't probably work. (vector +-- length (1 downto 2) ... +-- +-- !NOTE! +-- * Output is zero when empty. (doesn't speed this up if otherwise). +------------------------------------------------------------------------------- + + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.std_logic_arith.all; + + +entity fifo is + + generic ( + width : integer := 0; + depth : integer := 0); + + port ( + Clk : in std_logic; + Rst_n : in std_logic; -- Active low + Data_In : in std_logic_vector (width-1 downto 0); + Write_Enable : in std_logic; + One_Place_Left : out std_logic; + Full : out std_logic; + Data_Out : out std_logic_vector (width-1 downto 0); + Read_Enable : in std_logic; + Empty : out std_logic; + One_Data_Left : out std_logic + ); + +end fifo; + +architecture behavioral of fifo is + +-- range is this so that one can use data_amount directly to indexing + type reg is array (depth downto 2) of std_logic_vector + (width-1 downto 0); + signal input_buffer : reg; + +-- tie them together so that use of case is simpler + signal WR : std_logic_vector ( 1 downto 0); + +begin -- behavioral + + -- Concurrent assignment + WR <= Write_Enable & Read_Enable; + + + +process (Clk, rst_n) + variable Data_amount : integer range 0 to depth; +begin -- process + if rst_n = '0' then -- asynchronous reset (active low) + for i in depth downto 2 loop + input_buffer(i) <= (others => '0'); + end loop; -- i + + Data_out <= (others => '0'); + Data_Amount := 0; + Empty <= '1'; + One_Data_Left <= '0'; + One_Place_Left <= '0'; + Full <= '0'; + + elsif Clk'event and Clk = '1' then -- rising clock edge + +case WR is + when "01" => -- Read data + if Data_amount = 0 then + Data_amount := Data_amount; + elsif Data_amount = 1 then + Data_out <= (others => '0'); + Data_amount := Data_amount-1; + else + Data_out <= input_buffer(Data_amount); + Data_amount := Data_amount-1; + end if; + + + when "10" => -- Write Data + + if Data_amount = 0 then + Data_out <= Data_In; + Data_amount := Data_amount+1; + elsif Data_amount = depth then + input_buffer <= input_buffer; + else + for i in depth-1 downto 2 loop -- Shifting + input_buffer(i+1) <= input_buffer(i); + end loop; -- i + input_buffer(2) <= Data_In; + Data_amount := Data_amount+1; + end if; + + when "11" => -- Read and Write concurrently + + if Data_amount = 0 then -- cannot read if empty + Data_out <= Data_in; + Data_Amount := Data_Amount +1; + elsif Data_amount = 1 then + Data_out <= Data_In; + elsif Data_amount = depth then -- cannot write if full + Data_out <= input_buffer (Data_amount); + Data_amount := Data_amount-1; + else + Data_out <= input_buffer (Data_amount); + for i in depth-1 downto 2 loop -- Shifting + input_buffer(i+1) <= input_buffer(i); + end loop; -- i + input_buffer(2) <= Data_In; + end if; + + when others => -- Do nothing, Both 0. + input_buffer <= input_buffer; + Data_amount := Data_amount; + +end case; + +-- because Data_amount is a variable, it's updated right-away. + + if Data_amount = 0 then -- Empty + Empty <= '1'; + One_Place_Left <= '0'; + One_Data_Left <= '0'; + Full <= '0'; + + elsif Data_amount = 1 then -- One_Data_Left + + Empty <= '0'; + One_Data_Left <= '1'; + One_Place_Left <= '0'; + Full <= '0'; + elsif Data_amount = depth-1 then --one_place_left + Empty <= '0'; + One_Place_Left <= '1'; + One_Data_Left <= '0'; + Full <= '0'; + elsif Data_amount = depth then --full + Empty <= '0'; + One_Place_Left <= '0'; + One_Data_Left <= '0'; + Full <= '1'; + else -- Otherwise every signal is low + Empty <= '0'; + One_Place_Left <= '0'; + One_Data_Left <= '0'; + Full <= '0'; + end if; + + end if; --synchronous + + end process; + +end behavioral; + + + + + + + + + + + + Index: trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_casev5.vhdl =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_casev5.vhdl (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_casev5.vhdl (revision 18) @@ -0,0 +1,242 @@ +------------------------------------------------------------------------------- +-- File : fifo_casev5.vhdl +-- Description : Fifo buffer for hibi interface +-- Author : Ari Kulmala +-- Date : 10.06.2003 +-- Modified : 18.06.2003 - Re-wrote the way output control signals are +-- assigned +-- +-- +-- Detailed description: +-- -Input and Output always from the same register +-- -> input-buffer is shifted whenever write occurs +-- -> when read, a mux chooses which value to load to the output next +-- (the oldest) +-- +-- !NOTE! isn't tested as one-length FIFO. doesn't probably work. (vector +-- length (1 downto 2) ... +-- +-- !NOTE! +-- * Output is zero when empty. +------------------------------------------------------------------------------- + + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.std_logic_arith.all; + + +entity fifo is + + generic ( + width : integer := 0; + depth : integer := 0); + + port ( + Clk : in std_logic; + Rst_n : in std_logic; -- Active low + Data_In : in std_logic_vector (width-1 downto 0); + Write_Enable : in std_logic; + One_Place_Left : out std_logic; + Full : out std_logic; + Data_Out : out std_logic_vector (width-1 downto 0); + Read_Enable : in std_logic; + Empty : out std_logic; + One_Data_Left : out std_logic + ); + +end fifo; + + +architecture behavioral of fifo is + + -- range is this so that one can use data_amount directly to indexing + type reg is array (depth downto 2) of std_logic_vector + (width-1 downto 0); + signal input_buffer : reg; + -- Registers + signal Full_reg : std_logic; + signal Empty_reg : std_logic; + signal One_Data_Left_reg : std_logic; + signal One_Place_Left_reg : std_logic; + signal Data_amount : integer range 0 to depth; + + + signal WR : std_logic_vector ( 1 downto 0); + +begin -- behavioral + + -- Continuous assignments + -- Assigns register values to outputs + Full <= Full_reg; + Empty <= Empty_reg; + One_Data_Left <= One_Data_Left_reg; + One_Place_Left <= One_Place_Left_reg; + -- Concurrent assignment + WR <= Write_Enable & Read_Enable; + + + + process (Clk, rst_n) + begin -- process + if rst_n = '0' then -- asynchronous reset (active low) + for i in depth downto 2 loop + input_buffer(i) <= (others => '0'); + end loop; -- i + Data_out <= (others => '0'); + + Data_Amount <= 0; + Empty_reg <= '1'; + One_Data_Left_reg <= '0'; + One_Place_Left_reg <= '0'; + Full_reg <= '0'; + + elsif Clk'event and Clk = '1' then -- rising clock edge + + case WR is + when "01" => + -- Read data + if Data_amount = 0 then + -- empty + Data_amount <= Data_amount; + Empty_reg <= '1'; + One_Data_Left_reg <= '0'; + elsif Data_amount = 1 then + -- 1 data + Data_out <= (others => '0'); + Data_amount <= Data_amount-1; + Empty_reg <= '1'; + One_Data_Left_reg <= '0'; + elsif Data_amount = 2 then + Data_out <= input_buffer(Data_amount); + Data_amount <= Data_amount-1; + Empty_reg <= '0'; + One_Data_Left_reg <= '1'; + else + Data_out <= input_buffer(Data_amount); + Data_amount <= Data_amount-1; + One_Data_Left_reg <= '0'; + Empty_reg <= '0'; + end if; + + -- Fifo's getting emptier + if Data_amount = depth-1 then + One_Place_Left_reg <= '0'; + Full_reg <= '0'; + elsif Data_amount = depth then + One_Place_Left_reg <= '1'; + Full_reg <= '0'; + else + One_Place_Left_reg <= '0'; + Full_reg <= '0'; + end if; + + + when "10" => + -- Write Data + if Data_amount = 0 then + Data_out <= Data_In; + Data_amount <= Data_amount+1; + elsif Data_amount = depth then + input_buffer <= input_buffer; + else + for i in depth-1 downto 2 loop + input_buffer(i+1) <= input_buffer(i); + end loop; -- i + input_buffer(2) <= Data_In; + Data_amount <= Data_amount+1; + end if; + + -- define the values for output control signals + if Data_amount = 0 then + Empty_reg <= '0'; + One_Data_Left_reg <= '1'; + Full_reg <= '0'; + One_Place_Left_reg <= '0'; + elsif Data_amount = 1 then + Empty_reg <= '0'; + One_Data_Left_reg <= '0'; + Full_reg <= '0'; + One_Place_Left_reg <= '0'; + elsif Data_amount = depth-2 then + Empty_reg <= '0'; + One_Data_Left_reg <= '0'; + Full_reg <= '0'; + One_Place_Left_reg <= '1'; + elsif Data_amount = depth-1 then + Empty_reg <= '0'; + One_Data_Left_reg <= '0'; + Full_reg <= '1'; + One_Place_Left_reg <= '0'; + else + Empty_reg <= Empty_reg; + One_Data_Left_reg <= One_Data_Left_reg; + Full_reg <= Full_reg; + One_Place_Left_reg <= One_Place_Left_reg; + end if; + + when "11" => + -- Read and Write concurrently + + if Data_amount = 0 then + -- can only write + Data_out <= Data_in; + Empty_reg <= '0'; + One_Data_Left_reg <= '1'; + Full_reg <= '0'; + One_Place_Left_reg <= '0'; + Data_amount <= Data_amount+1; + + elsif Data_amount = 1 then + Data_out <= Data_In; + Empty_reg <= '0'; + One_Data_Left_reg <= '1'; + Full_reg <= '0'; + One_Place_Left_reg <= '0'; + + elsif Data_amount = depth then + -- cannot write if full, just read + Data_out <= input_buffer (Data_amount); + Data_amount <= Data_amount-1; + Empty_reg <= '0'; + One_Data_Left_reg <= '0'; + Full_reg <= '0'; + One_Place_Left_reg <= '1'; + else + Data_out <= input_buffer (Data_amount); + for i in depth-1 downto 2 loop + input_buffer(i+1) <= input_buffer(i); + end loop; -- i + input_buffer(2) <= Data_In; + Empty_reg <= Empty_reg; + One_Data_Left_reg <= One_Data_Left_reg; + Full_reg <= Full_reg; + One_Place_Left_reg <= One_Place_Left_reg; + end if; + + when others => + -- Do nothing, write and read low + input_buffer <= input_buffer; + Data_amount <= Data_amount; + Empty_reg <= Empty_reg; + One_Data_Left_reg <= One_Data_Left_reg; + Full_reg <= Full_reg; + One_Place_Left_reg <= One_Place_Left_reg; + + end case; + end if; --synchronous + end process; + +end behavioral; + + + + + + + + + + + + Index: trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_casev4a.vhdl =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_casev4a.vhdl (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_casev4a.vhdl (revision 18) @@ -0,0 +1,173 @@ +-- Fifo with case version 4: +-- different from v3: +-- - using variable data_amount in order to update it right away, +-- rather than wait util the process ends. +-- +-- Designer : Ari Kulmala +-- +-- Variable Data_amount will infer register synthesis! Scary stuff, es 07.11.2003 + + + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.std_logic_arith.all; + + +entity fifo is + + generic ( + width : integer := 0; + depth : integer := 0 + ); + port ( + Clk : in std_logic; + Rst_n : in std_logic; -- Active low + Data_In : in std_logic_vector (width-1 downto 0); + Write_Enable : in std_logic; + One_Place_Left : out std_logic; + Full : out std_logic; + Data_Out : out std_logic_vector (width-1 downto 0); + Read_Enable : in std_logic; + Empty : out std_logic; + One_Data_Left : out std_logic + ); + +end fifo; + +architecture behavioral of fifo is + + type reg is array (depth downto 2) of std_logic_vector + (width-1 downto 0); + signal input_buffer : reg; + + signal WR : std_logic_vector ( 1 downto 0); + +begin -- behavioral + + -- Concurrent assignment + WR <= Write_Enable & Read_Enable; + + + + process (Clk, rst_n) + variable Data_amount : integer range 0 to depth; + begin -- process + if rst_n = '0' then -- asynchronous reset (active low) + -- for i in depth downto 2 loop + -- input_buffer(i) <= (others => '0'); + -- end loop; -- i + -- Data_out <= (others => '0'); + + Data_Amount := 0; + Empty <= '1'; + One_Data_Left <= '0'; + One_Place_Left <= '0'; + Full <= '0'; + + elsif Clk'event and Clk = '1' then -- rising clock edge + + case WR is + when "01" => + -- Read data + if Data_amount = 0 then + Data_amount := Data_amount; + elsif Data_amount = 1 then + -- Data_out <= (others => '0'); + Data_amount := Data_amount-1; + else + Data_out <= input_buffer(Data_amount); + Data_amount := Data_amount-1; + end if; + + + when "10" => + -- Write Data + if Data_amount = 0 then + Data_out <= Data_In; + Data_amount := Data_amount+1; + elsif Data_amount = depth then + input_buffer <= input_buffer; + else + for i in depth-1 downto 2 loop + input_buffer(i+1) <= input_buffer(i); + end loop; -- i + input_buffer(2) <= Data_In; + Data_amount := Data_amount+1; + end if; + + when "11" => + -- Read and Write concurrently + if Data_amount = 0 then + -- cannot read if empty + Data_out <= Data_in; + Data_Amount := Data_Amount +1; + elsif Data_amount = 1 then + Data_out <= Data_In; + elsif Data_amount = depth then + -- cannot write if full + Data_out <= input_buffer (Data_amount); + Data_amount := Data_amount-1; + else + Data_out <= input_buffer (Data_amount); + for i in depth-1 downto 2 loop + input_buffer(i+1) <= input_buffer(i); + end loop; -- i + input_buffer(2) <= Data_In; + end if; + + when others => -- Do nothing + input_buffer <= input_buffer; + Data_amount := Data_amount; + + end case; + + if Data_amount = 0 then + Empty <= '1'; + One_Place_Left <= '0'; + One_Data_Left <= '0'; + Full <= '0'; + + elsif Data_amount = 1 then + + Empty <= '0'; + One_Data_Left <= '1'; + One_Place_Left <= '0'; + Full <= '0'; + elsif Data_amount = depth-1 then --one place left + Empty <= '0'; + + One_Place_Left <= '1'; + One_Data_Left <= '0'; + Full <= '0'; + elsif Data_amount = depth then --full + Empty <= '0'; + One_Place_Left <= '0'; + One_Data_Left <= '0'; + Full <= '1'; + + + else + Empty <= '0'; + One_Place_Left <= '0'; + One_Data_Left <= '0'; + Full <= '0'; + end if; + + end if; --synchronous + + end process; + +end behavioral; + + + + + + + + + + + + Index: trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_casev6.vhdl =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_casev6.vhdl (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_casev6.vhdl (revision 18) @@ -0,0 +1,248 @@ +------------------------------------------------------------------------------- +-- File : fifo_casev6.vhdl +-- Description : Fifo buffer for hibi interface +-- Author : Ari Kulmala +-- Date : 10.06.2003 +-- Modified : 18.06.2003 - Re-wrote the way output control signals are +-- assigned +-- - output value is not zero when empty +-- +-- Detailed description: +-- -Input and Output always from the same register +-- -> input-buffer is shifted whenever write occurs +-- -> when read, a mux chooses which value to load to the output next +-- (the oldest) +-- +-- !NOTE! isn't tested as one-length FIFO. doesn't probably work. (vector +-- length (1 downto 2) ... +-- +-- !NOTE! +-- * Output stays in the old value when empty. +------------------------------------------------------------------------------- + +------------------------------------------------------------------------------- +-- To do: as in fifo_casev4: fifojen nollaus olisi syyta ehka poistaa myos +-- resetin yhteydesta, jos sita ei nollata myoskaan luettaessa viimeinen +-- samaten input_bufferin nollaus. +------------------------------------------------------------------------------- + +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.std_logic_arith.all; + + +entity fifo is + + generic ( + width : integer := 0; + depth : integer := 0); + + port ( + Clk : in std_logic; + Rst_n : in std_logic; -- Active low + Data_In : in std_logic_vector (width-1 downto 0); + Write_Enable : in std_logic; + One_Place_Left : out std_logic; + Full : out std_logic; + Data_Out : out std_logic_vector (width-1 downto 0); + Read_Enable : in std_logic; + Empty : out std_logic; + One_Data_Left : out std_logic + ); + +end fifo; + +architecture behavioral of fifo is + + -- range is this so that one can use data_amount directly to indexing + type reg is array (depth downto 2) of std_logic_vector + (width-1 downto 0); + signal input_buffer : reg; + -- Registers + signal Full_reg : std_logic; + signal Empty_reg : std_logic; + signal One_Data_Left_reg : std_logic; + signal One_Place_Left_reg : std_logic; + + signal Data_amount : integer range 0 to depth; + + + signal WR : std_logic_vector ( 1 downto 0); + +begin -- behavioral + + -- Continuous assignments + -- Assigns register values to outputs + Full <= Full_reg; + Empty <= Empty_reg; + One_Data_Left <= One_Data_Left_reg; + One_Place_Left <= One_Place_Left_reg; + -- Concurrent assignment + WR <= Write_Enable & Read_Enable; + + + +process (Clk, rst_n) +begin -- process + if rst_n = '0' then -- asynchronous reset (active low) + -- for i in depth downto 2 loop + -- input_buffer(i) <= (others => '0'); + -- end loop; -- i + -- Data_out <= (others => '0'); + Data_Amount <= 0; + Empty_reg <= '1'; + One_Data_Left_reg <= '0'; + One_Place_Left_reg <= '0'; + Full_reg <= '0'; + + elsif Clk'event and Clk = '1' then -- rising clock edge + + case WR is + when "01" => + -- Read data + if Data_amount = 0 then + -- empty + Data_amount <= Data_amount; + Empty_reg <= '1'; + One_Data_Left_reg <= '0'; + elsif Data_amount = 1 then -- 1 data + -- Data_out <= (others => '0'); + Data_amount <= Data_amount-1; + Empty_reg <= '1'; + One_Data_Left_reg <= '0'; + elsif Data_amount = 2 then + Data_out <= input_buffer(Data_amount); + Data_amount <= Data_amount-1; + Empty_reg <= '0'; + One_Data_Left_reg <= '1'; + else + Data_out <= input_buffer(Data_amount); + Data_amount <= Data_amount-1; + One_Data_Left_reg <= '0'; + Empty_reg <= '0'; + end if; + + if Data_amount = depth-1 then + One_Place_Left_reg <= '0'; + Full_reg <= '0'; + elsif Data_amount = depth then + One_Place_Left_reg <= '1'; + Full_reg <= '0'; + else + One_Place_Left_reg <= '0'; + Full_reg <= '0'; + end if; + + + when "10" => + -- Write Data + if Data_amount = 0 then + Data_out <= Data_In; + Data_amount <= Data_amount+1; + elsif Data_amount = depth then + input_buffer <= input_buffer; + else + for i in depth-1 downto 2 loop + input_buffer(i+1) <= input_buffer(i); + end loop; -- i + input_buffer(2) <= Data_In; + Data_amount <= Data_amount+1; + end if; + + -- Define the control signals here + + if Data_amount = 0 then + Empty_reg <= '0'; + One_Data_Left_reg <= '1'; + Full_reg <= '0'; + One_Place_Left_reg <= '0'; + elsif Data_amount = 1 then + Empty_reg <= '0'; + One_Data_Left_reg <= '0'; + Full_reg <= '0'; + One_Place_Left_reg <= '0'; + elsif Data_amount = depth-2 then + Empty_reg <= '0'; + One_Data_Left_reg <= '0'; + Full_reg <= '0'; + One_Place_Left_reg <= '1'; + elsif Data_amount = depth-1 then + Empty_reg <= '0'; + One_Data_Left_reg <= '0'; + Full_reg <= '1'; + One_Place_Left_reg <= '0'; + else + Empty_reg <= Empty_reg; + One_Data_Left_reg <= One_Data_Left_reg; + Full_reg <= Full_reg; + One_Place_Left_reg <= One_Place_Left_reg; + + end if; + + when "11" => + -- Read and Write concurrently + + if Data_amount = 0 then + -- can only write + Data_out <= Data_in; + Empty_reg <= '0'; + One_Data_Left_reg <= '1'; + Full_reg <= '0'; + One_Place_Left_reg <= '0'; + Data_amount <= Data_amount+1; + + elsif Data_amount = 1 then + Data_out <= Data_In; + Empty_reg <= '0'; + One_Data_Left_reg <= '1'; + Full_reg <= '0'; + One_Place_Left_reg <= '0'; + + elsif Data_amount = depth then + -- cannot write if full, just read + Data_out <= input_buffer (Data_amount); + Data_amount <= Data_amount-1; + Empty_reg <= '0'; + One_Data_Left_reg <= '0'; + Full_reg <= '0'; + One_Place_Left_reg <= '1'; + else + Data_out <= input_buffer (Data_amount); + for i in depth-1 downto 2 loop + input_buffer(i+1) <= input_buffer(i); + end loop; -- i + input_buffer(2) <= Data_In; + Empty_reg <= Empty_reg; + One_Data_Left_reg <= One_Data_Left_reg; + Full_reg <= Full_reg; + One_Place_Left_reg <= One_Place_Left_reg; + end if; + + when others => + -- Do nothing + input_buffer <= input_buffer; + Data_amount <= Data_amount; + Empty_reg <= Empty_reg; + One_Data_Left_reg <= One_Data_Left_reg; + Full_reg <= Full_reg; + One_Place_Left_reg <= One_Place_Left_reg; + + end case; + + end if; --synchronous + + end process; + +end behavioral; + + + + + + + + + + + + Index: trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/dual_ram_async_read.vhd =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/dual_ram_async_read.vhd (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/dual_ram_async_read.vhd (revision 18) @@ -0,0 +1,74 @@ +------------------------------------------------------------------------------- +-- Title : Dual port RAM +-- Project : +------------------------------------------------------------------------------- +-- File : dual_ram.vhd +-- Author : +-- Company : +-- Created : 2005-05-26 +-- Last update: 2005-05-31 +-- Platform : +-- Standard : VHDL'87 +------------------------------------------------------------------------------- +-- Description: dual port RAM with asynchronous read for QuartusII +------------------------------------------------------------------------------- +-- Copyright (c) 2005 +------------------------------------------------------------------------------- +-- Revisions : +-- Date Version Author Description +-- 2005-05-26 1.0 penttin5 Created +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; + +entity dual_ram_async_read is + + generic ( + ram_width : integer := 0; + ram_depth : integer := 0); + port + ( + clock1 : in std_logic; + clock2 : in std_logic; + data : in std_logic_vector(0 to ram_width - 1); + write_address : in integer range 0 to ram_depth - 1; + read_address : in integer range 0 to ram_depth - 1; + we : in std_logic; + q : out std_logic_vector(0 to ram_width - 1) + ); + + type word is array(0 to ram_width - 1) of std_logic; + type ram is array(0 to ram_depth - 1) of std_logic_vector(0 to ram_width - 1); + subtype address_vector is integer range 0 to ram_depth - 1; + +-- signal read_address_reg : address_vector; + +end dual_ram_async_read; + +architecture rtl of dual_ram_async_read is + + signal ram_block : RAM; +begin + + process (clock1) + begin + if (clock1'event and clock1 = '1') then + if (we = '1') then + ram_block(write_address) <= data; + end if; + end if; + end process; + + + process (clock2) + begin + if (clock2'event and clock2 = '1') then + --q <= ram_block(read_address); + -- read_address_reg <= read_address; + end if; + end process; + + q <= ram_block (read_address); + +end rtl; Index: trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/double_fifo_demuxed_write.vhdl =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/double_fifo_demuxed_write.vhdl (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/double_fifo_demuxed_write.vhdl (revision 18) @@ -0,0 +1,272 @@ +------------------------------------------------------------------------------- +-- File : double_fifo_demuxed_write.vhdl +-- Description : Double_Fifo_Demuxed_Write buffer for hibi v.2 interface +-- Includes two fifos and a special demultiplexer +-- so that the writer sees only one fifo. Demultiplexer +-- directs addr+data to correct fifo (0 = for messages) +-- Author : Vesa Lahtinen +-- Date : 08.04.2003 +-- Modified : +-- +------------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; + + + +entity double_fifo_demuxed_write is + + generic ( + Data_Width : integer := 0; + Depth_0 : integer := 0; + Depth_1 : integer := 0; + Comm_Width : integer := 0 + ); + port ( + Clk : in std_logic; + Rst_n : in std_logic; + + Data_In : in std_logic_vector ( Data_Width-1 downto 0); + Comm_In : in std_logic_vector ( Comm_Width-1 downto 0); + Addr_Valid_In : in std_logic; + Write_Enable_In : in std_logic; + One_Place_Left_Out : out std_logic; + Full_Out : out std_logic; + + Read_Enable_In_0 : in std_logic; + Data_Out_0 : out std_logic_vector ( Data_Width-1 downto 0); + Comm_Out_0 : out std_logic_vector ( Comm_Width-1 downto 0); + Addr_Valid_Out_0 : out std_logic; + Empty_Out_0 : out std_logic; + One_Data_Left_Out_0 : out std_logic; + + Read_Enable_In_1 : in std_logic; + Data_Out_1 : out std_logic_vector ( Data_Width-1 downto 0); + Comm_Out_1 : out std_logic_vector ( Comm_Width-1 downto 0); + Addr_Valid_Out_1 : out std_logic; + Empty_Out_1 : out std_logic; + One_Data_Left_Out_1 : out std_logic + ); +end double_fifo_demuxed_write; + + + +architecture structural of double_fifo_demuxed_write is + + + + + component fifo + generic ( + width : integer := 0; + depth : integer := 0); + + port ( + Clk : in std_logic; + Rst_n : in std_logic; + Data_In : in std_logic_vector (width-1 downto 0); + Write_Enable : in std_logic; + One_Place_Left : out std_logic; + Full : out std_logic; + + Read_Enable : in std_logic; + Data_Out : out std_logic_vector (width-1 downto 0); + Empty : out std_logic; + One_Data_Left : out std_logic + ); + end component; --fifo; + + + component fifo_demux_write + generic ( + Data_Width : integer := 0; + Comm_Width : integer := 0); + + port ( + -- 13.04 Clk : in std_logic; + -- 13.04 Rst_n : in std_logic; + Data_In : in std_logic_vector (Data_Width-1 downto 0); + Addr_Valid_In : in std_logic; + Comm_In : in std_logic_vector (Comm_Width-1 downto 0); + WE_In : in std_logic; + One_Place_Left_Out : out std_logic; + Full_Out : out std_logic; + + -- Data/Comm/AV conencted to both fifos + -- Distinction made with WE! + Data_Out : out std_logic_vector (Data_Width-1 downto 0); + Comm_Out : out std_logic_vector (Comm_Width-1 downto 0); + Addr_Valid_Out : out std_logic; + WE_0_Out : out std_logic; + WE_1_Out : out std_logic; + Full_0_In : in std_logic; + Full_1_In : in std_logic; + One_Place_Left_0_In : in std_logic; + One_Place_Left_1_In : in std_logic + ); + end component; + + signal Data_AV_Comm_Out_0 : std_logic_vector ( 1 + Comm_Width + Data_Width-1 downto 0); + signal Data_AV_Comm_Out_1 : std_logic_vector ( 1 + Comm_Width + Data_Width-1 downto 0); + + signal Data_AV_Comm_From_Demux : std_logic_vector ( 1 + Comm_Width + Data_Width-1 downto 0); + + signal Data_Demux_To_fifo : std_logic_vector(Data_Width-1 downto 0); + signal Comm_Demux_To_fifo : std_logic_vector(Comm_Width-1 downto 0); + signal Addr_Valid_Demux_To_fifo : std_logic; + + signal Write_Enable_0 : std_logic; + signal Full_0 : std_logic; + signal One_Place_Left_0 : std_logic; + + signal Write_Enable_1 : std_logic; + signal Full_1 : std_logic; + signal One_Place_Left_1 : std_logic; + + signal Tie_High : std_logic; + signal Tie_Low : std_logic; + + +begin -- structural + -- Check generics + assert (Depth_0 + Depth_1 > 0) report "Both fifo depths zero!" severity warning; + + -- Concurrent assignments + Tie_High <= '1'; + Tie_Low <= '0'; + -- Combine fifo inputs + -- Data_AV_Comm_From_Demux <= Addr_Valid_Demux_To_fifo & Comm_Demux_To_fifo & Data_Demux_To_fifo; + + -- Splitting the data + Addr_Valid_Out_0 <= Data_AV_Comm_Out_0(Comm_Width+Data_Width); + Comm_Out_0 <= Data_AV_Comm_Out_0(Comm_Width+Data_Width-1 downto Data_Width); + Data_Out_0 <= Data_AV_Comm_Out_0(Data_Width-1 downto 0); + Addr_Valid_Out_1 <= Data_AV_Comm_Out_1(Comm_Width+Data_Width); + Comm_Out_1 <= Data_AV_Comm_Out_1(Comm_Width+Data_Width-1 downto Data_Width); + Data_Out_1 <= Data_AV_Comm_Out_1(Data_Width-1 downto 0); + + Map_Fifo_0 : if Depth_0 > 0 generate + Fifo_0 : fifo + generic map( + width => 1 + Comm_Width + Data_Width, + depth => Depth_0 + ) + port map( + Clk => Clk, + Rst_n => Rst_n, + + Data_In => Data_AV_Comm_From_Demux, + Write_Enable => Write_Enable_0, + One_Place_Left => One_Place_Left_0, + Full => Full_0, + + Read_Enable => Read_Enable_In_0, + Data_Out => Data_AV_Comm_Out_0, + Empty => Empty_Out_0, + One_Data_Left => One_Data_Left_Out_0 + ); + end generate Map_Fifo_0; + + Not_Map_Fifo_0 : if Depth_0 = 0 generate + -- Fifo #0 and demux does not exist! + Data_AV_Comm_Out_0 <= (others => '0'); + Empty_Out_0 <= Tie_High; + One_Data_Left_Out_0 <= Tie_Low; + Full_0 <= Tie_High; + One_Place_Left_0 <= Tie_Low; + Write_Enable_0 <= Tie_Low; + + -- Connect the other fifo (#1) straight to the outputs (FSM) + Write_Enable_1 <= Write_Enable_In; + One_Place_Left_Out <= One_Place_Left_1; + Full_Out <= Full_1; + Data_AV_Comm_From_Demux(Data_Width-1 downto 0) <= Data_In; + Data_AV_Comm_From_Demux(Comm_Width+Data_Width-1 downto Data_Width) <= Comm_In; + Data_AV_Comm_From_Demux(Comm_Width+Data_Width) <= Addr_Valid_In; + + end generate Not_Map_Fifo_0; + + + + + Map_Fifo_1 : if Depth_1 > 0 generate + Fifo_1 : fifo + generic map( + width => 1 + Comm_Width + Data_Width, + depth => Depth_1 + ) + port map( + Clk => Clk, + Rst_n => Rst_n, + + Data_In => Data_AV_Comm_From_Demux, + Write_Enable => Write_Enable_1, + One_Place_Left => One_Place_Left_1, + Full => Full_1, + + Read_Enable => Read_Enable_In_1, + Data_Out => Data_AV_Comm_Out_1, + Empty => Empty_Out_1, + One_Data_Left => One_Data_Left_Out_1 + ); + end generate Map_Fifo_1; + + Not_Map_Fifo_1 : if Depth_1 = 0 generate + -- Fifo #1 and demux does not exist! + Data_AV_Comm_Out_1 <= (others => '0'); + Empty_Out_1 <= Tie_High; + One_Data_Left_Out_1 <= Tie_Low; + Full_1 <= Tie_High; + One_Place_Left_1 <= Tie_Low; + Write_Enable_1 <= Tie_Low; + + -- Connect the other fifo (#0) straight to the outputs (FSM) + Write_Enable_0 <= Write_Enable_In; + One_Place_Left_Out <= One_Place_Left_0; + Full_Out <= Full_0; + Data_AV_Comm_From_Demux(Data_Width-1 downto 0) <= Data_In; + Data_AV_Comm_From_Demux(Comm_Width+Data_Width-1 downto Data_Width) <= Comm_In; + Data_AV_Comm_From_Demux(Comm_Width+Data_Width) <= Addr_Valid_In; + + end generate Not_Map_Fifo_1; + + + Map_Demux : if Depth_0 > 0 and Depth_1 > 0 generate + -- Demultiplexer is needed only if two fifos are used + DEMUX_01 : fifo_demux_write + generic map( + Data_Width => Data_Width, + Comm_Width => Comm_Width + ) + port map( + -- 13.04 + -- Clk => Clk, + -- Rst_n => Rst_n, + Data_In => Data_In, + Comm_In => Comm_In, + Addr_Valid_In => Addr_Valid_In, + WE_In => Write_Enable_In, + + One_Place_Left_Out => One_Place_Left_Out, + Full_Out => Full_Out, + Data_Out => Data_AV_Comm_From_Demux(Data_Width-1 downto 0), + Comm_Out => Data_AV_Comm_From_Demux(Comm_Width+Data_Width-1 downto Data_Width), + Addr_Valid_Out => Data_AV_Comm_From_Demux(Comm_Width+Data_Width), + WE_0_Out => Write_Enable_0, + WE_1_Out => Write_Enable_1, + + Full_0_In => Full_0, + Full_1_In => Full_1, + One_Place_Left_0_In => One_Place_Left_0, + One_Place_Left_1_In => One_Place_Left_1 + ); + end generate Map_Demux; + + +end structural; + + + + Index: trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_im_case.vhdl =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_im_case.vhdl (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_im_case.vhdl (revision 18) @@ -0,0 +1,287 @@ +------------------------------------------------------------------------------- +-- File : fifo_im_case.vhdl +-- Description : Fifo buffer for hibi interface +-- Author : Erno Salminen +-- Date : 29.04.2002 +-- Modified : 30.04.2002 Vesa Lahtinen Optimized for synthesis +-- +-- 02.06 ES: default assignment Fifo_Buffer <= Fifo_Buffer +-- smaller and faster implementation +-- Effect on synthesis is uncertain : +-- small fifos seem to gets smaller and faster, but big fifos +-- get bigger and slower. Strange. +-- +-- ?.06.03 AK - uses "case" instead of "if" in main process. +-- (makes it concurrent rather than sequential) +-- +------------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; + +entity fifo is + + generic ( + width : integer := 0; + depth : integer := 0); + + port ( + Clk : in std_logic; + Rst_n : in std_logic; + Data_In : in std_logic_vector (width-1 downto 0); + Write_Enable : in std_logic; + One_Place_Left : out std_logic; + Full : out std_logic; + Data_Out : out std_logic_vector (width-1 downto 0); + Read_Enable : in std_logic; + Empty : out std_logic; + One_Data_Left : out std_logic + ); + +end fifo; + +architecture behavioral of fifo is + + type data_array is array (depth-1 downto 0) of std_logic_vector (width-1 downto 0); + signal Fifo_Buffer : data_array; + + -- Registers + signal Full_reg : std_logic; + signal Empty_reg : std_logic; + signal One_Data_Left_reg : std_logic; + signal One_Place_Left_reg : std_logic; + --signal Data_Amount : std_logic_vector (depth-1 downto 0); + signal Data_Amount : integer range 0 to depth-1; + signal WR : std_logic_vector ( 1 downto 0); + + +begin -- in_mux + + -- Continuous assignments + -- Assigns register values to outputs + Full <= Full_reg; + Empty <= Empty_reg; + One_Data_Left <= One_Data_Left_reg; + One_Place_Left <= One_Place_Left_reg; + Data_Out <= Fifo_Buffer (0); + -- Note! There is some old value in data output when fifo is empty. + + WR <= Write_Enable & Read_Enable; + + +Main : process (Clk, Rst_n) +begin -- process Main + if Rst_n = '0' then -- asynchronous reset (active low) + + -- Reset all registers + -- Fifo is empty at first + Full_reg <= '0'; + Empty_reg <= '1'; + One_Data_Left_reg <= '0'; + Data_Amount <= 0; + + if depth =1 then -- 30.07 + One_Place_Left_reg <= '1'; + else + One_Place_Left_reg <= '0'; + end if; + + for i in 0 to depth-1 loop + Fifo_Buffer (i) <= (others => '0'); + end loop; -- i + + elsif Clk'event and Clk = '1' then -- rising clock edge + + + -- 1) Write data to fifo +-- if Write_Enable = '1' and Read_Enable = '0' then + + case WR is + when "10" => + + if Full_reg = '0' then + Empty_reg <= '0'; + Data_Amount <= Data_Amount +1; + + Fifo_Buffer <= Fifo_Buffer; --02.06 + Fifo_Buffer (Data_Amount) <= Data_In; + + -- Check if the fifo is getting full + if Data_Amount + 2 = depth then + Full_reg <= '0'; + One_Place_Left_reg <= '1'; + elsif Data_Amount +1 = depth then + Full_reg <= '1'; + One_Place_Left_reg <= '0'; + else + Full_reg <= '0'; + One_Place_Left_reg <= '0'; + end if; + + + -- If fifo was empty, it has now one data + if Empty_reg = '1' then + One_Data_Left_reg <= '1'; + else + One_Data_Left_reg <= '0'; + end if; + + else + Full_reg <= Full_reg; + Empty_reg <= Empty_reg; + Fifo_Buffer <= Fifo_Buffer; + Data_Amount <= Data_Amount; + One_Data_Left_reg <= One_Data_Left_reg; + One_Place_Left_reg <= One_Place_Left_reg; + end if; + + + -- 2) Read data from fifo +-- elsif Write_Enable = '0' and Read_Enable = '1' then + + when "01" => + if Empty_reg = '0' then + + -- Shiftaus + Fifo_Buffer <= Fifo_Buffer; --02.06 + for i in 0 to depth-2 loop + Fifo_Buffer (i) <= Fifo_Buffer (i+1); + end loop; -- i + + Full_reg <= '0'; + Data_Amount <= Data_Amount -1; + + -- Debug + -- Fifo_Buffer (out_ptr) <= (others => '1'); + + + + + -- Check if the fifo is getting empty + if Data_Amount = 2 then + Empty_reg <= '0'; + One_data_Left_reg <= '1'; + elsif Data_Amount = 1 then + Empty_reg <= '1'; + One_Data_Left_reg <= '0'; + else + Empty_reg <= '0'; + One_Data_Left_reg <= '0'; + end if; + + -- If fifo was full, it is no more + if Full_reg = '1' then + One_Place_Left_reg <= '1'; + else + One_Place_Left_reg <= '0'; + end if; + + else + Full_reg <= Full_reg; + Empty_reg <= Empty_reg; + Fifo_Buffer <= Fifo_Buffer; + Data_Amount <= Data_Amount; + One_Data_Left_reg <= One_Data_Left_reg; + One_Place_Left_reg <= One_Place_Left_reg; + end if; + + + -- 3) Write and read at the same time +-- elsif Write_Enable = '1' and Read_Enable = '1' then + + when "11" => + + if Full_reg = '0' and Empty_reg = '0' then + Full_reg <= '0'; + Empty_reg <= '0'; + Data_Amount <= Data_Amount; + One_Data_Left_reg <= One_Data_Left_reg; + One_Place_Left_reg <= One_Place_Left_reg; + + Fifo_Buffer <= Fifo_Buffer; --02.06 + -- Shiftaus + for i in 0 to depth-2 loop + Fifo_Buffer (i) <= Fifo_Buffer (i+1); + end loop; -- i + Fifo_Buffer (Data_Amount-1) <= Data_In; --vai amount-1 ?? koska pitaa + --shiftata samalla + + -- Fifo_Buffer (out_ptr) <= (others => '1'); --debug + + + elsif Full_reg = '1' and Empty_reg = '0' then + -- Fifo is full, only reading is possible + + Full_reg <= '0'; + One_Place_Left_reg <= '1'; + --Fifo_Buffer (out_ptr) <= (others => '1'); -- Debug + Data_Amount <= Data_Amount -1; + + Fifo_Buffer <= Fifo_Buffer; --02.06 + -- Shiftaus + for i in 0 to depth-2 loop + Fifo_Buffer (i) <= Fifo_Buffer (i+1); + end loop; -- i + + -- Check if the fifo is getting empty + if Data_Amount = 2 then + Empty_reg <= '0'; + One_data_Left_reg <= '1'; + elsif Data_Amount = 1 then + Empty_reg <= '1'; + One_Data_Left_reg <= '0'; + else + Empty_reg <= '0'; + One_Data_Left_reg <= '0'; + end if; + + + elsif Full_reg = '0' and Empty_reg = '1' then + -- Fifo is empty, only writing is possible + Empty_reg <= '0'; + One_Data_Left_reg <= '1'; + Fifo_Buffer <= Fifo_Buffer; --02.06 + Fifo_Buffer (Data_Amount) <= Data_In; --Data_Amount =0 + Data_Amount <= Data_Amount +1; + + -- Check if the fifo is getting full + if Data_Amount + 2 = depth then + Full_reg <= '0'; + One_Place_Left_reg <= '1'; + elsif Data_Amount +1 = depth then + Full_reg <= '1'; + One_Place_Left_reg <= '0'; + else + Full_reg <= '0'; + One_Place_Left_reg <= '0'; + end if; + + + else + -- Fifo is full and empty at the same time => impossible + Full_reg <= Full_reg; + Empty_reg <= Empty_reg; + Fifo_Buffer <= Fifo_Buffer; + Data_Amount <= Data_Amount; + One_Data_Left_reg <= One_Data_Left_reg; + One_Place_Left_reg <= One_Place_Left_reg; + end if; --Full_reg & Empty_reg + + + -- 4) Do nothing, fifo remains idle +-- else + + when others => + Full_reg <= Full_reg; + Empty_reg <= Empty_reg; + Fifo_Buffer <= Fifo_Buffer; + Data_Amount <= Data_Amount; + One_Data_Left_reg <= One_Data_Left_reg; + One_Place_Left_reg <= One_Place_Left_reg; + end case; + + end if; +end process Main; + +end behavioral; Index: trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_muxes.vhdl =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_muxes.vhdl (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_muxes.vhdl (revision 18) @@ -0,0 +1,771 @@ +------------------------------------------------------------------------------- +-- File : fifo_muxes.vhdl +-- Description : Makes two fifos look like a single fifo. +-- Two components : one for writing and one for reading fifo. +-- Write_demux: +-- Input : data, addr valid and command +-- Out : data, addr valid and command to two fifos +-- +-- Read_mux : +-- Input : data, addr valid and command from two fifos +-- Out : data, addr valid and command +-- +-- NOTE: +-- 1) +-- Read_mux does not fully support One_Data_Left_Out! +-- +-- It works when writing to fifo. However, when something +-- is written to empty fifo, One_Data_Left_Out remains 0 +-- even if Empty goes from 1 to 0! Be careful out there. +-- +-- Case when new addr is written to fifo 0 and there is a gap before +-- corresponding data. At the same time there is some data in fifo +-- #1. It is not wise to wait for data#0, because it blocks the data#1. +-- In such, case transfer from fifo#0 is interrupted (Empty goes high). +-- At the moment, One_Data_Left_Out does not work in such case. +-- (Probably it could be repaired with fifo_bookkeeper component?) +-- 2) +-- +-- Author : Erno Salminen +-- Date : 05.02.2003 +-- Modified : +-- +-- +------------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; + + + + + +-- Write_Mux checks the incoming addr. Same addr is not +-- written to fifo more than once! Written fifo is selected +-- according to incoming command +entity fifo_demux_write is + + generic ( + Data_Width : integer := 0; + Comm_Width : integer := 0 + ); + port ( + -- 13.04 Fully asynchronous! + --Clk : in std_logic; + --Rst_n : in std_logic; + + Data_In : in std_logic_vector (Data_Width-1 downto 0); + Addr_Valid_In : in std_logic; + Comm_In : in std_logic_vector (Comm_Width-1 downto 0); + WE_In : in std_logic; + One_Place_Left_Out : out std_logic; + Full_Out : out std_logic; + + -- Data/Comm/AV conencted to both fifos + -- Distinction made with WE! + Data_Out : out std_logic_vector (Data_Width-1 downto 0); + Comm_Out : out std_logic_vector (Comm_Width-1 downto 0); + Addr_Valid_Out : out std_logic; + WE_0_Out : out std_logic; + WE_1_Out : out std_logic; + Full_0_In : in std_logic; + Full_1_In : in std_logic; + One_Place_Left_0_In : in std_logic; + One_Place_Left_1_In : in std_logic + ); + +end fifo_demux_write; + + + + + + +-- constant Idle : std_logic_vector ( Comm_Width-1 downto 0) := "000"; -- 0 +-- constant Write_Config_Data : std_logic_vector ( Comm_Width-1 downto 0) := "001"; -- 1 +-- constant Write_Data : std_logic_vector ( Comm_Width-1 downto 0) := "010"; -- 2 +-- constant Write_Message : std_logic_vector ( Comm_Width-1 downto 0) := "011"; -- 3 + +-- constant Read_RQ : std_logic_vector ( Comm_Width-1 downto 0) := "100"; -- 4 +-- constant Read_Config : std_logic_vector ( Comm_Width-1 downto 0) := "101"; -- 5 +-- constant Multicast_Data : std_logic_vector ( Comm_Width-1 downto 0) := "110"; -- 6 +-- constant Multicast_Message : std_logic_vector ( Comm_Width-1 downto 0) := "111"; -- 7 + +architecture rtl of fifo_demux_write is + +begin -- rtl + + + -- Concurrent assignments + Data_Out <= Data_In; + Addr_Valid_Out <= Addr_Valid_In; + Comm_Out <= Comm_In; + + + -- PROCESSES + -- Fully combinational + Demultiplex_data : process (Data_In, Addr_Valid_In, Comm_In, WE_In, + One_Place_Left_0_In, One_Place_Left_1_In, + Full_0_In, Full_1_In) + begin -- process Demultiplex_data + + if Comm_In = conv_std_logic_vector (3, Comm_Width) + or Comm_In = conv_std_logic_vector (7, Comm_Width) then + -- MESSAGE + + WE_0_Out <= WE_In; + WE_1_Out <= '0'; + Full_Out <= Full_0_In; + One_Place_Left_Out <= One_Place_Left_0_In; + + + elsif Comm_In = conv_std_logic_vector (2, Comm_Width) + or Comm_In = conv_std_logic_vector (4, Comm_Width) + or Comm_In = conv_std_logic_vector (6, Comm_Width) then + -- DATA + WE_0_Out <= '0'; + WE_1_Out <= WE_In; + Full_Out <= Full_1_In; + One_Place_Left_Out <= One_Place_Left_1_In; + + + elsif Comm_In = conv_std_logic_vector (1, Comm_Width) + or Comm_In = conv_std_logic_vector (5, Comm_Width) then + -- CONFIG + assert false report "Config comm to fifo_demux_write" severity warning; + WE_0_Out <= '0'; + WE_1_Out <= '0'; + Full_Out <= '0'; + One_Place_Left_Out <= '0'; + + + else + --IDLE + WE_0_Out <= '0'; + WE_1_Out <= '0'; + Full_Out <= '0'; + One_Place_Left_Out <= '0'; + end if; --Comm_In + + + end process Demultiplex_data; + + + +end rtl; --fifo_demux_write + + + + + + +------------------------------------------------------------------------------- +--entity fifo_mux_read kaytetaan lukemaan kahdesta fifosta osoite ja data perakkain +-- fifolla 0 on suurempi prioritetti. Jos ollaan lukemassa fifoa 1, ei ruveta +-- lukemaan fifoa 0 ennekuin on siirretty ainakin yksi data fifosta 1. +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; + + + + + +entity fifo_mux_read is + + generic ( + Data_Width : integer := 0; + Comm_Width : integer := 0 + ); + port ( + Clk : in std_logic; + Rst_n : in std_logic; + + Data_0_In : in std_logic_vector (Data_Width-1 downto 0); + Comm_0_In : in std_logic_vector (Comm_Width-1 downto 0); + Addr_Valid_0_In : in std_logic; + One_Data_Left_0_In : in std_logic; + Empty_0_In : in std_logic; + RE_0_Out : out std_logic; + + Data_1_In : in std_logic_vector (Data_Width-1 downto 0); + Comm_1_In : in std_logic_vector (Comm_Width-1 downto 0); + Addr_Valid_1_In : in std_logic; + One_Data_Left_1_In : in std_logic; + Empty_1_In : in std_logic; + RE_1_Out : out std_logic; + + Read_Enable_In : in std_logic; + Data_Out : out std_logic_vector (Data_Width-1 downto 0); + Comm_Out : out std_logic_vector (Comm_Width-1 downto 0); + Addr_Valid_Out : out std_logic; + One_Data_Left_Out : out std_logic; + Empty_Out : out std_logic + ); + +end fifo_mux_read; + + +architecture rtl of fifo_mux_read is + signal Last_Addr_Reg_0 : std_logic_vector ( Comm_Width+Data_Width-1 downto 0); + signal Last_Addr_Reg_1 : std_logic_vector ( Comm_Width+Data_Width-1 downto 0); + + signal State_Reg : integer range 0 to 5; + -- Transferred_Reg - siirron tila + -- 00) Ei ole siirretty viela mitaan + -- 01) Osoite fifossa 0 + -- 02) Data fifossa 0 + -- 03) Osoite fifosta 1 + -- 04) Data fifosta 1 + -- 05) mol tyhjia + + -- Tilasiirtymat + -- 00 -> 01, 03 + -- 01 -> 02 + -- 02 -> 01, 02, 03 + -- 03 -> 04 + -- 04 -> 01, 04, 05 + -- 05 -> 01, 03 + +begin -- rtl + + + + -- PROC + Assign_Outputs : process (State_Reg, Data_1_In, Data_0_In, Addr_Valid_1_In, Addr_Valid_0_In, + Comm_0_In, Comm_1_In, Empty_0_In, Empty_1_In, + One_Data_Left_0_In, One_Data_Left_1_In, + Last_Addr_Reg_0, Last_Addr_Reg_1, Read_Enable_In) + begin -- process Assign_Outputs + + case State_Reg is + + when 0 => + -- Ei ole tehty mitaan + Data_Out <= (others => '0'); -- 'Z'); -- '0'); + Comm_Out <= (others => '0'); -- 'Z'); -- '0'); + Addr_Valid_Out <= '0'; + Empty_Out <= '1'; + RE_0_Out <= '0'; + RE_1_Out <= '0'; + + + + when 1 => + -- Siirretaan osoite 0 + + -- joko rekisterista (sama osoite kuin viimeksikin) + -- tai suoraan fifosta (uusi osoite, otetaan se myos talteen) + if Addr_Valid_0_In = '1' then + -- Uusi osoite + Data_Out <= Data_0_In; + Comm_Out <= Comm_0_In; + RE_0_Out <= Read_Enable_In; + else + Data_Out <= Last_Addr_Reg_0 (Data_Width-1 downto 0); + Comm_Out <= Last_Addr_Reg_0 ( Comm_Width+Data_Width-1 downto Data_Width); + RE_0_Out <= '0'; + + end if; + Addr_Valid_Out <= '1'; + Empty_Out <= '0'; + RE_1_Out <= '0'; + + + + when 2 => + -- Siirretaan data fifosta 0 + + if Addr_Valid_0_In = '1' and One_Data_Left_0_In = '1' then + -- Fifossa 0 pelkka osoite + + if Empty_1_In = '1' + or (Addr_Valid_1_In = '1' and One_Data_Left_1_In = '1') then + -- Fifo 1 tyhja tai siella pelkka osoite + RE_0_Out <= '0'; + RE_1_Out <= '0'; + Data_Out <= (others => '0'); -- 'X'); + Comm_Out <= (others => '0'); -- 'X'); + Addr_Valid_Out <= '0'; + Empty_Out <= '1'; + else + -- Fifossa 1 olisi jotain, otetaan varman paalle + RE_0_Out <= '0'; + RE_1_Out <= '0'; + Data_Out <= (others => '0'); -- '-'); + Comm_Out <= (others => '0'); -- '-'); + Addr_Valid_Out <= '0'; + Empty_Out <= '1'; + end if; --e_1 || (av1&1left1) + else + -- Fifossa 0 osoite+jotain tai dataa + RE_0_Out <= Read_Enable_In; + RE_1_Out <= '0'; + + Data_Out <= Data_0_In; + Comm_Out <= Comm_0_In; + Addr_Valid_Out <= Addr_Valid_0_In; + Empty_Out <= Empty_0_In; + end if; --av_1 + + + + + when 3 => + -- Siirretaan osoite 1 + + if Addr_Valid_1_In = '1' then + -- Uusi osoite + Data_Out <= Data_1_In; + Comm_Out <= Comm_1_In; + RE_1_Out <= Read_Enable_In; + else + Data_Out <= Last_Addr_Reg_1 (Data_Width-1 downto 0); + Comm_Out <= Last_Addr_Reg_1 ( Comm_Width+Data_Width-1 downto Data_Width); + RE_1_Out <= '0'; + end if; + RE_0_Out <= '0'; + Addr_Valid_Out <= '1'; + Empty_Out <= '0'; + + + + + when 4 => + -- Siirretaan fifosta 1 + + + if Addr_Valid_1_In = '1' and One_Data_Left_1_In = '1' then + -- Fifossa 1 pelkka osoite + + if Empty_0_In = '1' + or (Addr_Valid_0_In = '1' and One_Data_Left_0_In = '1') then + -- Fifo 0 tyhja tai siella pelkka osoite + RE_0_Out <= '0'; + RE_1_Out <= '0'; + Data_Out <= (others => '0'); -- 'X'); + Comm_Out <= (others => '0'); -- 'X'); + Addr_Valid_Out <= '0'; + Empty_Out <= '1'; + else + -- Fifossa 0 olisi jotain, otetaan varman paalle + RE_0_Out <= '0'; + RE_1_Out <= '0'; + Data_Out <= (others => '0'); -- '-'); + Comm_Out <= (others => '0'); -- '-'); + Addr_Valid_Out <= '0'; + Empty_Out <= '1'; + end if; --e_0 || (av0&1left0) + else + -- Fifossa 1 osoite+jotain tai dataa + RE_0_Out <= '0'; + RE_1_Out <= Read_Enable_In; + + Data_Out <= Data_1_In; + Comm_Out <= Comm_1_In; + Addr_Valid_Out <= Addr_Valid_1_In; + Empty_Out <= Empty_1_In; + end if; --av_1 + + + + when 5 => + -- Molemmat fifot tyhjia + RE_0_Out <= '0'; + RE_1_Out <= '0'; + Data_Out <= (others => '0'); -- 'Z'); -- '0'); + Comm_Out <= (others => '0'); -- 'Z'); -- '0'); + Addr_Valid_Out <= '0'; + Empty_Out <= '1'; + + when others => + RE_0_Out <= '0'; + RE_1_Out <= '0'; + Data_Out <= (others => '0'); -- 'Z'); -- '0'); + Comm_Out <= (others => '0'); -- 'Z'); -- '0'); + Addr_Valid_Out <= '0'; + Empty_Out <= '1'; + assert false report "Illegal state in fifo_mux_read" severity warning; + end case; + + end process Assign_Outputs; + + + + + -- PROC + Reg_proc : process (Clk, Rst_n) + begin -- process Reg_proc + if Rst_n = '0' then -- asynchronous reset (active low) + State_Reg <= 5; + Last_Addr_Reg_0 <= (others => '0'); -- '0'); + Last_Addr_Reg_1 <= (others => '0'); -- 'Z'); -- '0'); + + elsif Clk'event and Clk = '1' then -- rising clock edge + case State_Reg is + + when 0 => +-- -- Ei ole tehty mitaan + + + + + when 1 => + -- Siirretaan osoite 0 + -- joko rekisterista (sama osoite kuin viimeksikin) + -- tai suoraan fifosta (uusi osoite, otetaan se myos talteen) + if Read_Enable_In = '1' then + State_Reg <= 2; + else + State_Reg <= 1; + end if; + + if Addr_Valid_0_In = '1' then + -- Uusi osoite + Last_Addr_Reg_0 <= Comm_0_In & Data_0_In; + else + Last_Addr_Reg_0 <= Last_Addr_Reg_0; + end if; + + + + when 2 => + -- Siirretaan fifosta 0 + + if Read_Enable_In = '1' then + -- Luetaan fifosta 0 + + if One_Data_Left_0_In = '1' then + -- Oli viim data fifossa 0 + if Empty_1_In = '1' + or (Addr_Valid_1_In = '1' and One_Data_Left_1_In = '1') then + -- Myos fifo 1 tyhja tai siella pelkka osoite + State_Reg <= 5; + else + -- Siirretaan osoite 1 (fifosta tai rekisterista) + State_Reg <= 3; + end if; --Empty_1_In + Last_Addr_Reg_0 <= Last_Addr_Reg_0; + Last_Addr_Reg_1 <= Last_Addr_Reg_1; + + else + -- Fifossa 0 lukemisen jalkeenkin viela jotain + State_Reg <= 2; + Last_Addr_Reg_1 <= Last_Addr_Reg_1; + + if Addr_Valid_0_In = '1' then + -- fifosta 0 luettiin osoite + Last_Addr_Reg_0 <= Comm_0_In & Data_0_In; + else + -- Fifosta 0 luettiin dataa + Last_Addr_Reg_0 <= Last_Addr_Reg_0; + end if; --Addr_Valid_0_In + end if; --Empty_0_In + + + + + else + -- Odotellaan etta data luetaan + State_Reg <= 2; + Last_Addr_Reg_0 <= Last_Addr_Reg_0; + Last_Addr_Reg_1 <= Last_Addr_Reg_1; + end if; --Read_Enable_In + + + + + + + + when 3 => + -- Siirretaan osoite 1 + if Read_Enable_In = '1' then + State_Reg <= 4; + else + -- Odotellaan lukua + State_Reg <= 3; + end if; + + if Addr_Valid_1_In = '1' then + -- Uusi osoite + Last_Addr_Reg_1 <= Comm_1_In & Data_1_In; + else + Last_Addr_Reg_1 <= Last_Addr_Reg_1; + end if; + + + + when 4 => + -- Siirretaan fifosta 1 + + if Read_Enable_In = '1' then + -- Luetaan fifoa 1 + + if Addr_Valid_1_In = '1' then + -- Luetaan osoite fifosta 1 + Last_Addr_Reg_0 <= Last_Addr_Reg_0; + Last_Addr_Reg_1 <= Comm_1_In & Data_1_In; + + if One_Data_Left_1_In = '1' then + -- fifossa oli pelkka osoite + -- puolittainen VIRHE? + assert false report "Was? 1" severity note; + State_Reg <= 5; + else + -- Fifossa 1 on myos dataa, luetaan se + -- ennen (mahdollista) siirtymista + -- fifon 1 lukemiseen + State_Reg <= 4; + end if; --One_Data_Left_1_In + + else + -- Luetaan data fifosta 1 + + if Empty_0_In = '1' + or (Addr_Valid_0_In = '1' and One_Data_Left_0_In = '1') then + -- Fifo 0 tyhja tai siella pelkka osoite + + if One_Data_Left_1_In = '0' then + -- Onneksi fifossa 1 on viela jotain + State_Reg <= 4; + else + -- Ei ole siis kummassakaan fifossa mit'n + State_Reg <= 5; + end if; -- One_Data_Left_1_In + + + else + -- fifossa 0 luettavaa + -- siirretann siis osoite 1 seuraavaksi (fifosta/rekisterista) + State_Reg <= 1; + Last_Addr_Reg_0 <= Last_Addr_Reg_0; + Last_Addr_Reg_1 <= Last_Addr_Reg_1; + end if; --Empty_0_In or (av0 & 1left_0) + end if; --Addr_Valid_0_In + + + else + -- Odotetaan etta luetaan fifoa 1 + --State_Reg <= 4; + Last_Addr_Reg_0 <= Last_Addr_Reg_0; + Last_Addr_Reg_1 <= Last_Addr_Reg_1; + + if Addr_Valid_1_In = '1' and One_Data_Left_1_In ='1' then + -- Ei olekaan kuin pelkka osoite fifossa #1! + if Empty_0_In = '1' + or (Addr_Valid_0_In = '1' and One_Data_Left_0_In ='1') then + -- Ei ole fifossa 0 :kaan mitaan jarkevaa + State_Reg <= 5; + else + -- Voidaan siirtaa osoite 0 seuraavaksi + State_Reg <= 1; + end if; + else + -- fifossa 1 on myos dataa, odotellaan lukemista + State_Reg <= 4; + end if; + + + + end if; --Read_Enable_In + + + + + when 5 => + -- Ei voitu lukea kummastakaan fifosta + + Last_Addr_Reg_0 <= Last_Addr_Reg_0; + Last_Addr_Reg_1 <= Last_Addr_Reg_1; + + + if Empty_0_In = '1' or ( Addr_Valid_0_In = '1' and One_Data_Left_0_In ='1') then + -- Fifo 0 tyhja tai siella pelkka osoite + if Empty_1_In = '1' or ( Addr_Valid_1_In = '1' and One_Data_Left_1_In ='1') then + -- Fifo 1 tyhja tai siella pelkka osoite + -- => KUmmastakaan ei voi lukea + State_Reg <= 5; + else + -- Fifossa 1 jotain + -- siirretann siis osoite 1 seuraavaksi (fifosta/rekisterista) + State_Reg <= 3; + end if;--Empty_0_In or (av0 & 1left_0) + + else + -- Fifossa 0 jotain + -- siirretann siis osoite 0 seuraavaksi (fifosta/rekisterista) + State_Reg <= 1; + end if; --Empty_0_In or (av0 & 1left_0) + + + + + + + + when others => + assert false report "Illegal state in fifo_mux_read" severity warning; + end case; + + + end if; + end process Reg_proc; + + + -- One_Data_Left_Out on sen verta vaikea, etta tehdaan se omassa prosessissaan + Assign_1_D_Left_Out : process (State_Reg, + Data_0_In, Data_1_In, + Comm_0_In, Comm_1_In, + Empty_0_In, Empty_1_In, + Addr_Valid_0_In, Addr_Valid_1_In, + One_Data_Left_0_In,One_Data_Left_1_In, + Last_Addr_Reg_0, Last_Addr_Reg_1, + Read_Enable_In) + begin -- process Assign_1_D_Left_Out + case State_Reg is + + when 0 => + -- Ei ole tehty mitaan + One_Data_Left_Out <= '0'; + + when 1 => + -- Siirretaan osoite 0 + -- ellei ihmeita tapahdu, One_Data_Left_Out pitaisi olla 0! + + if Addr_Valid_0_In = '1' then + --Olisi syyta olla dataakin fifossa 0, toivotaan + One_Data_Left_Out <= '0'; + else + -- Sama osoite kuin viimeksi (rekisterista) + if Empty_0_In = '1' then + -- Fifossa 0 tyhja + assert false report + "Retrsnferring addr#0, but fifo#0 is empty. ERROR?" severity warning; + + + if Empty_1_In = '1' + or (Addr_Valid_1_In = '1' and One_Data_Left_1_In = '1') then + -- ja fifo 1:kin on tyhja, tai siina on pelkka osoite + One_Data_Left_Out <= '1'; + else + -- Voidaan siirtya lukemaan fifoa 1 + One_Data_Left_Out <= '0'; + end if; -- Empty_1_In || (av1 &1d_Left1) + else + One_Data_Left_Out <= '0'; + end if; -- Empty_0_In + + end if; -- Addr_Valid_0 + + + + + when 2 => + -- Siirretaan data fifosta 0 + + if One_Data_Left_0_In = '1' then + -- Fifo 0 tyhjenee + + if Empty_1_In = '1' then + -- ja fifo 1:kin on tyhja + One_Data_Left_Out <= '1'; + else + if Addr_Valid_1_In = '1' and One_Data_Left_1_In = '1' then + -- Fifossa 1 pelkka osoite + One_Data_Left_Out <= '1'; + else + -- Voidaan siirtya lukemaan fifoa 1 + One_Data_Left_Out <= '0'; + end if; --AV1 & 1D_Left1 + end if; -- Empty_1_In + else + -- Fifoon 0 jaa jotain + One_Data_Left_Out <= '0'; + end if; --One_Data_Left_0_In + + + + when 3 => + -- Siirretaan osoite 1 + -- ellei ihmeita tapahdu, One_Data_Left_Out pitaisi olla 0! + + if Addr_Valid_1_In = '1' then + --Olisi syyta olla dataakin fifossa 1, toivotaan + One_Data_Left_Out <= '0'; + else + -- Sama osoite kuin viimeksi (rekisterista) + + if Empty_1_In = '1' then + -- Fifo 1 on tyhja + assert false report + "Retrsnferring addr#1, but fifo#1 is empty. ERROR?" severity warning; + + if Empty_0_In = '1' + or (Addr_Valid_0_In = '1' and One_Data_Left_0_In = '1' )then + -- ja fifo 0:kin on tyhja + One_Data_Left_Out <= '1'; + else + -- Voidaan siirtya lukemaan fifoa 0 + One_Data_Left_Out <= '0'; + end if; -- Empty_1_In & (AV1 & 1D_Left1) + -- + else + One_Data_Left_Out <= '0'; + end if; --Empty_Left_1_In + end if; -- Addr_Valid_1 + + + + + + + when 4 => + -- Siirretaan data 1 + + if One_Data_Left_1_In = '1' then + -- fifo 1 tyhjenee + + if Empty_0_In = '1' + or (Addr_Valid_0_In = '1' and One_Data_Left_0_In = '1') then + -- Fifo 0:kin on tyhja tai siella pelkka osoite + One_Data_Left_Out <= '1'; + else + -- Voidaan siirtya lukemaan fifoa 0 + One_Data_Left_Out <= '0'; + end if; --Empty_0_In & (av0 & 1_D_Left0) + + else + -- Fifoon 1 jaa jotain + One_Data_Left_Out <= '0'; + end if; --One_Data_Left_1_In + + + + when 5 => + -- Molemmat fifot tyhjia + One_Data_Left_Out <= '0'; + + + when others => + One_Data_Left_Out <= '0'; + assert false report "Illegal state in fifo_mux_read" severity warning; + end case; + end process Assign_1_D_Left_Out; + + + + + + +end rtl; + + + + + + + + Index: trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_reg.vhd =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_reg.vhd (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_reg.vhd (revision 18) @@ -0,0 +1,80 @@ +------------------------------------------------------------------------------- +-- Title : fifo_reg +-- Project : +------------------------------------------------------------------------------- +-- File : fifo_reg.vhd +-- Author : +-- Company : +-- Created : 2005-05-23 +-- Last update: 31.05.2005 +-- Platform : +-- Standard : VHDL'87 +------------------------------------------------------------------------------- +-- Description: +------------------------------------------------------------------------------- +-- Copyright (c) 2005 +------------------------------------------------------------------------------- +-- Revisions : +-- Date Version Author Description +-- 2005-05-23 1.0 penttin5 Created +-- 31.5.2005 AK Naming scheme according to coding rules +------------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; + + +entity fifo_reg is + + generic ( + width_g : integer := 0 + ); + + port ( + clk : in std_logic; + rst_n : in std_logic; + load_in : in std_logic; + data1_in : in std_logic_vector(width_g - 1 downto 0); + data2_in : in std_logic_vector(width_g - 1 downto 0); + data_sel_in : in std_logic; + data_out : out std_logic_vector(width_g - 1 downto 0) + ); + +end fifo_reg; + +architecture RTL of fifo_reg is + + signal data_r : std_logic_vector(width_g - 1 downto 0); + signal load_and_sel : std_logic_vector(1 downto 0); + +begin -- RTL + + load_and_sel <= load_in & data_sel_in; + data_out <= data_r; + + fifo_reg : process (clk, rst_n) + begin -- process fifo_reg + if rst_n = '0' then -- asynchronous reset (active low) + data_r <= (others => '0'); + + elsif clk'event and clk = '1' then -- rising clock edge + case load_and_sel is + when "10" => + data_r <= data1_in; + when "11" => + data_r <= data2_in; + when others => + data_r <= data_r; + end case; +-- if load = '1' then +-- if data_sel = '0' then +-- data_r <= data1_in; +-- elsif data_sel = '1' then +-- data_r <= data2_in; +-- end if; +-- end if; + end if; + end process fifo_reg; + +end RTL; Index: trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_slotted.vhd =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_slotted.vhd (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_slotted.vhd (revision 18) @@ -0,0 +1,231 @@ +------------------------------------------------------------------------------- +-- File : fifo_shift.vhdl +-- Description : Fifo buffer for hibi interface +-- +-- Author : Erno Salminen +-- Date : 29.10.2004 +-- Modified : +-- 20.01.2005 ES Names changed +------------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; + +entity fifo is + + generic ( + data_width_g : integer := 32; + depth_g : integer := 5 + ); + port ( + clk : in std_logic; + rst_n : in std_logic; + data_in : in std_logic_vector (data_width_g-1 downto 0); + we_in : in std_logic; + one_p_out : out std_logic; + full_out : out std_logic; + data_out : out std_logic_vector (data_width_g-1 downto 0); + re_in : in std_logic; + empty_out : out std_logic; + one_d_out : out std_logic + ); + +end fifo; + + + +architecture slotted_fifo_reg of fifo is + + component fifo_slot + generic ( + width : integer := 0); + port ( + clk : in std_logic; + rst_n : in std_logic; + Right_Valid_In : in std_logic; + Right_Enable_In : in std_logic; + Right_data_in : in std_logic_vector ( width-1 downto 0); + + Left_data_in : in std_logic_vector ( width-1 downto 0); + Left_Valid_In : in std_logic; + Left_Enable : in std_logic; + Valid_Out : out std_logic; + data_out : out std_logic_vector ( width-1 downto 0) + ); + + end component; -- fifo_slot; + + + + type Fifo_slot_type is record + Valid : std_logic; + Data : std_logic_vector ( data_width_g-1 downto 0); + end record; + type slot_signal_array is array (depth_g downto 0) of Fifo_slot_type; + signal intermediate_signal : slot_signal_array; + signal we : std_logic_vector ( depth_g-1 downto 0); + signal re : std_logic_vector ( depth_g-1 downto 0); + + signal tie_high : std_logic; + + +begin -- slotted_fifo_reg + + + + -- Continuous assignments + -- Assigns register values to outputs + tie_high <= '1'; + assert depth_g > 1 report "Fifo depth_g must be more than one!" severity WARNING; + full_out <= intermediate_signal (depth_g-1).Valid; -- ylin paikka varattu + empty_out <= not (intermediate_signal (0).Valid ); -- alin paikka tyhja + + + + -- Yksi data=alin taynna, toiseksi alin tyhja + one_d_out <= not (intermediate_signal (1).Valid) and intermediate_signal (0).Valid; + + -- Yksi paikka=ylin tyhja, toiseksi ylin taynna + one_p_out <= not (intermediate_signal (depth_g-1).Valid) and intermediate_signal (depth_g-2).Valid; + + data_out <= intermediate_signal (0).Data; --alin data ulostuloon + -- Note! There is some old value in data output when fifo is empty. + + + + map_slots : for i in 0 to depth_g-1 generate + gen_slot_i : fifo_slot + generic map ( + width => data_width_g + ) + port map ( + clk => clk, + rst_n => rst_n, + Right_data_in => data_in, + Right_Valid_In => tie_high, + Right_Enable_In => we (i), + Left_Valid_In => intermediate_signal (i+1).Valid, + Left_data_in => intermediate_signal (i+1).Data, + Left_Enable => re (i), + Valid_Out => intermediate_signal (i).Valid, + data_out => intermediate_signal (i).Data + ); + end generate map_slots; + + intermediate_signal (depth_g).Data <= (others => '0'); --'Z'); + intermediate_signal (depth_g).Valid <= '0'; + + async_first_slot: process (intermediate_signal, we_in, re_in) + begin -- process async_first_slot + -- Ohjataan ensimmaisen we-signaalia + + if we_in = '1' and re_in = '0' then + -- Kirjoitus pelkästään + re <= (others => '0'); + + + if intermediate_signal (depth_g-1).Valid = '1' then + -- Ylin paikka taynna + we <= (others => '0'); + + + else + -- Kirjoitetaan uusi data + we <= (others => '0'); + + if intermediate_signal(0).Valid = '0' then + -- tyhjä + we(0) <= '1'; + else + + + for i in 1 to depth_g-1 loop + if intermediate_signal(i-1).Valid = '1' + and intermediate_signal(i).Valid = '0' + then + we(i) <= '1'; + end if; + end loop; -- (i + end if; + end if; + + + elsif we_in = '0' and re_in = '1' then + -- Luku pelkästään + we <= (others => '0'); + re <= (others => '1'); + + + + elsif we_in = '1' and re_in = '1' then + --Luku ja kirjoitus yhta aikaa + + if intermediate_signal (depth_g-1).Valid = '1' then + -- Ylin paikka taynna + we <= (others => '0'); + re <= (others => '1'); + + else + -- Kirjoitetaan uusi data ja shiftataaan vanhoja + we <= (others => '0'); + re <= (others => '1'); + + + if intermediate_signal(0).Valid = '0' then + -- tyhjä, ei shifatata + we(0) <= '1'; + re <= (others => '0'); + + else + + for i in 1 to depth_g-1 loop + if intermediate_signal(i-1).Valid = '1' + and intermediate_signal(i).Valid = '0' + then + -- kirjoiteteaan juuri tyhjenevään paikkaan + we (i-1) <= '1'; + re (i-1) <= '0'; + + end if; + end loop; -- (i + + end if; + end if; + + + + else + -- Ei tehda mitaan + we <= (others => '0'); --'Z'); + re <= (others => '0'); -- 'Z'); + + + end if; + + + end process async_first_slot; + + + + check_we: process (we) + variable one_bits : integer := 0; + begin -- process check_we + one_bits := 0; + + for i in 0 to depth_g-1 loop + if we(i)= '1' then + one_bits := one_bits +1; + end if; + end loop; -- i + + + -- assert one_bits < 2 report "Too many write enables" severity WARNING; + end process check_we; + + + + + + +end slotted_fifo_reg; --architecture Index: trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_ram.vhd =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_ram.vhd (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_ram.vhd (revision 18) @@ -0,0 +1,174 @@ +------------------------------------------------------------------------------- +-- Title : fifo +-- Project : +------------------------------------------------------------------------------- +-- File : fifo_ram.vhd +-- Author : +-- Company : +-- Created : 2005-05-26 +-- Last update: 2005-05-31 +-- Platform : +-- Standard : VHDL'87 +------------------------------------------------------------------------------- +-- Description: fifo implemented with dual port RAM with asynchronous read +------------------------------------------------------------------------------- +-- Copyright (c) 2005 +------------------------------------------------------------------------------- +-- Revisions : +-- Date Version Author Description +-- 2005-05-26 1.0 penttin5 Created +------------------------------------------------------------------------------- +-- +-- NOTE! Precision RTL synthesisis 2004c.45 doesn't infer the RAM with +-- asynchronous read for Stratix 1 S40F780C5. +-- Quartus II 4.2 infers RAM with asynchronic read but gives old RAM value +-- when reading and writing simultaneusly to/from same address. +-- That doesn't matter because FIFO doesn't read and write in the same +-- address at the same time. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; + +entity fifo is + + generic ( + data_width_g : integer := 0; + depth_g : integer := 0 + ); + + port ( + clk : in std_logic; + rst_n : in std_logic; + data_in : in std_logic_vector (data_width_g-1 downto 0); + we_in : in std_logic; + one_p_out : out std_logic; + full_out : out std_logic; + data_out : out std_logic_vector (data_width_g-1 downto 0); + re_in : in std_logic; + empty_out : out std_logic; + one_d_out : out std_logic + ); + +end fifo; + +architecture rtl of fifo is + + component dual_ram_async_read + generic ( + ram_width : integer := 0; + ram_depth : integer := 0); + port + ( + clock1 : in std_logic; + clock2 : in std_logic; + data : in std_logic_vector(0 to ram_width - 1); + write_address : in integer range 0 to ram_depth - 1; + read_address : in integer range 0 to ram_depth - 1; + we : in std_logic; + q : out std_logic_vector(0 to ram_width - 1) + ); + end component; -- dual_ram_async_read + + signal write_address_r : integer range 0 to depth_g - 1; + signal read_address_r : integer range 0 to depth_g - 1; + signal write_read_count_r : integer range 0 to depth_g; + signal ram_data_out_i : std_logic_vector(0 to data_width_g - 1); + signal we_ram : std_logic; + attribute dont_touch : boolean; + attribute dont_touch of gen_dual_ram: label is true; +begin -- rtl + + gen_dual_ram : dual_ram_async_read + generic map ( + ram_width => data_width_g, + ram_depth => depth_g + ) + port map ( + clock1 => clk, + clock2 => clk, + data => data_in, + write_address => write_address_r, + read_address => read_address_r, + we => we_ram, + q => ram_data_out_i + ); + + -- write to fifo when write enabled and fifo not full + we_ram <= we_in when write_read_count_r /= depth_g + else '0'; + + data_out <= ram_data_out_i; + + one_d_out <= '1' when write_read_count_r = 1 else + '0'; + one_p_out <= '1' when write_read_count_r = depth_g - 1 else + '0'; + empty_out <= '1' when write_read_count_r = 0 else + '0'; + full_out <= '1' when write_read_count_r = depth_g else + '0'; + + ----------------------------------------------------------------------------- + -- Update read and write addresses + ----------------------------------------------------------------------------- + fifo_read_and_write : process (clk, rst_n) + + begin -- process fifo_read_and_write + + if rst_n = '0' then -- asynchronous reset (active low) + write_read_count_r <= 0; + read_address_r <= 0; + write_address_r <= 0; + elsif clk'event and clk = '1' then -- rising clock edge + + -- read if re_in = '1' and fifo not empty or + -- simultaneus read and write and fifo full + if re_in = '1' and ((we_in = '0' and write_read_count_r /= 0) + or (we_in = '1' and write_read_count_r = depth_g)) then + write_read_count_r <= write_read_count_r - 1; + if read_address_r = depth_g - 1 then + read_address_r <= 0; + else + read_address_r <= read_address_r + 1; + end if; + write_address_r <= write_address_r; + + -- write if we_in = '1' and fifo not full or + -- simultaneus read and write and fifo empty + elsif we_in = '1' and ((re_in = '0' and write_read_count_r /= depth_g) + or (re_in = '1' and write_read_count_r = 0)) then + write_read_count_r <= write_read_count_r + 1; + read_address_r <= read_address_r; + if write_address_r = depth_g - 1 then + write_address_r <= 0; + else + write_address_r <= write_address_r + 1; + end if; + + -- write and read at the same time if re_in = '1' and we_in = '1' and + -- fifo not empty or full + elsif re_in = '1' and we_in = '1' and write_read_count_r /= depth_g and write_read_count_r /= 0 then + write_read_count_r <= write_read_count_r; + if read_address_r = depth_g - 1 then + read_address_r <= 0; + else + read_address_r <= read_address_r + 1; + end if; + if write_address_r = depth_g - 1 then + write_address_r <= 0; + else + write_address_r <= write_address_r + 1; + end if; + else + write_read_count_r <= write_read_count_r; + read_address_r <= read_address_r; + write_address_r <= write_address_r; + end if; + end if; + end process fifo_read_and_write; + +end rtl; Index: trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_mixed_clocks.vhdl =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_mixed_clocks.vhdl (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_mixed_clocks.vhdl (revision 18) @@ -0,0 +1,280 @@ +------------------------------------------------------------------------------- +-- File : fifo_mixed_clocks.vhdl +-- Description : Mixed Clocks fifo buffer for hibi interface +-- Author : Ari Kulmala +-- Date : 19.06.2003 +-- Modified : +-- +-- _almost_ works. Empty signal isn't behaving as expected when +-- concurrent read and write occurs. It's probably just a little +-- human err somewhere. Also has to check that full really works, even though +-- testbench says it does. +-- +-- +-- !NOTE! +-- * Output is rubbish when empty. (doesn't speed this up if otherwise). +------------------------------------------------------------------------------- +library IEEE; +use IEEE.std_logic_1164.all; +use IEEE.std_logic_arith.all; + + +entity mixed_clocks_fifo is + + generic ( + width : integer := 0; + depth : integer := 0); + + port ( + Clk_In : in std_logic; + Clk_Out : in std_logic; + Rst_n : in std_logic; -- Active low + Data_In : in std_logic_vector (width-1 downto 0); + Write_Enable : in std_logic; +-- One_Place_Left : out std_logic; + Full : out std_logic; + Data_Out : out std_logic_vector (width-1 downto 0); + Read_Enable : in std_logic; + Empty : out std_logic +-- One_Data_Left : out std_logic + ); + +end mixed_clocks_fifo; + +architecture behavioral of mixed_clocks_fifo is + type reg is array (depth-1 downto 0) of std_logic_vector + (width-1 downto 0); + signal Input_Buffer : reg; + signal Full_reg : std_logic; + signal Empty_reg : std_logic; +-- signal Full_register : std_logic register; +-- signal Empty_register : std_logic register; + signal Write_token : integer range 0 to depth-1; + signal Read_token : integer range 0 to depth-1; + -- if write catches read (full) + signal Write_Turned : std_logic; + signal Read_got : std_logic; + +begin -- behavioral + + -- Continious assignments + Full <= Full_reg; + Empty <= Empty_reg; + Data_Out <= Input_Buffer(Read_token); + + -- purpose: Read from the FIFO + Read : process (Clk_Out, Rst_n) + begin -- process Read + if Rst_n = '0' then -- asynchronous reset (active low) + Read_token <= 0; +-- Empty_reg <= '1'; + + elsif Clk_Out'event and Clk_Out = '1' then -- rising clock edge + if Read_Enable = '1' then + + if Empty_reg = '0' then + -- Full_reg <= '0'; + if Read_token = depth-1 then + Read_token <= 0; + else + Read_token <= Read_token+1; + end if; + +-- if Read_token = Write_token then +-- Empty_reg = '1'; +-- else +-- Empty_reg = '0'; +-- end if; + + else + Read_token <= Read_token; + end if; + end if; + + else + Read_token <= Read_token; + end if; + end process Read; + + -- purpose: Write to the FIFO + -- type : sequential + Write : process (Clk_In, Rst_n) + begin -- process Write + if Rst_n = '0' then -- asynchronous reset (active low) + Write_token <= 0; +-- Full_reg <= '0'; + + elsif Clk_In'event and Clk_In = '1' then -- rising clock edge + if Write_Enable = '1' then + + if Full_reg = '0' then + Input_Buffer(Write_token) <= Data_In; -- Write_token < depth +-- Empty_reg <= '0'; + if Write_token = depth-1 then + Write_token <= 0; + else + Write_token <= Write_token+1; + end if; + +-- if Write_token = Read_token then +-- -- Full_reg <= '1' +-- Write_Turned <= '1'; +-- else +-- -- Full_reg <= '0': +-- Write_Turned <= '0'; +-- end if; + else +-- Write_Turned <= Write_Turned; + Input_Buffer <= Input_Buffer; + Write_token <= Write_token; + end if; + end if; + + else +-- Write_Turned <= Write_Turned; + Input_Buffer <= Input_Buffer; + Write_token <= Write_token; + end if; + + end process Write; + +RESET: process (Clk_In, Clk_Out, Rst_n) + + -- ONLY READ CAN PUT EMPTY HIGH +begin -- process RESET + if Rst_n = '0' then -- asynchronous reset (active low) + Full_reg <= '0'; + Empty_reg <= '1'; + Write_Turned <= '0'; + elsif Clk_Out'event and Clk_Out = '1' then -- rising clock edge + +-- READ + + if Write_token = Read_token then + if Read_Enable = '1' and Write_Enable = '1' then + if Full_reg = '1' then + Full_reg <= '0'; + Write_Turned <= '0'; + -- Empty_reg <= '0'; +-- elsif Empty_reg = '1' then +-- Full_reg <= '0'; +-- Empty_reg <= '0'; + else + Full_reg <= Full_reg; + Empty_reg <= Empty_reg; + end if; + +-- elsif Write_Enable = '1' and Write_Turned = '0' then +-- Empty_reg <= '0'; +-- Full_reg <= '0'; + elsif Read_Enable = '1' and Write_Turned = '1' then +-- Empty_reg <= '0'; + Full_reg <= '0'; + Write_Turned <= '0'; + else + Full_reg <= Full_reg; + Empty_reg <= Empty_reg; + Write_Turned <= Write_Turned; + + end if; + -- getting empty + elsif (Write_token - Read_token = 1 or Write_token - Read_token = -depth+1) + and Read_Enable = '1' then + Full_reg <= '0'; + Empty_reg <= '1'; +-- elsif (Write_token - Read_token = -1 or Write_token - Read_token = depth-1) and Write_Enable = '1' then +-- Full_reg <= '1'; +-- Empty_reg <= '0'; +-- Write_Turned <= '1'; + + else + +-- Full_reg <= '0'; + Empty_reg <= '0'; + end if; + +-- ONLY WRITE CAN PUT FULL HIGH + + elsif Clk_In'event and Clk_In = '1' then -- rising clock edge + + if Write_token = Read_token then + if Read_Enable = '1' and Write_Enable = '1' then + if Full_reg = '1' then + Full_reg <= Full_reg; +-- Empty_reg <= '0'; + -- elsif Empty_reg = '1' then + -- Full_reg <= '0'; + -- Empty_reg <= '0'; + else + Full_reg <= Full_reg; + Empty_reg <= Empty_reg; + end if; + + elsif Write_Enable = '1' and Write_Turned = '0' then + Empty_reg <= '0'; + Full_reg <= '0'; + -- elsif Read_Enable = '1' and Write_Turned = '1' then + -- Empty_reg <= '0'; + -- Full_reg <= '0'; + -- Write_Turned <= '0'; + else + Full_reg <= Full_reg; + Empty_reg <= Empty_reg; + Write_Turned <= Write_Turned; + end if; + +-- elsif (Write_token - Read_token = 1 or Write_token - Read_token = -depth+1) +-- and Read_Enable = '1' then + -- Full_reg <= '0'; +-- Empty_reg <= '1'; + elsif (Write_token - Read_token = -1 or Write_token - Read_token = depth-1) and Write_Enable = '1' then + Full_reg <= '1'; +-- Empty_reg <= '0'; + Write_Turned <= '1'; + + else + + Full_reg <= '0'; + Empty_reg <= '0'; + end if; + + +-- if Write_token = Read_token then +-- if Write_Turned = '1' then +-- Full_reg <= '1'; +-- Empty_reg <= '0'; +-- else + + +-- Full_reg <= '0'; +-- Empty_reg <= '1'; +-- end if; + +-- else + +-- Full_reg <= '0'; +-- Empty_reg <= '0'; +-- end if; + + end if; +end process RESET; + + + + +-- if Rst_n = '0' then +-- Full_reg <= '0'; +-- Empty_reg <= '1'; +-- else +-- Full_reg <= Full_reg; +-- Empty_reg <= Empty_reg; +-- end if; +-- end process Reset; + +-- end process FULL_AND_EMPTY; + +end behavioral; + + + + Index: trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/conf_ram.vhd =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/conf_ram.vhd (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/conf_ram.vhd (revision 18) @@ -0,0 +1,194 @@ +-- megafunction wizard: %ALTSYNCRAM% +-- GENERATION: STANDARD +-- VERSION: WM1.0 +-- MODULE: altsyncram + +-- ============================================================ +-- File Name: conf_ram.vhd +-- Megafunction Name(s): +-- altsyncram +-- ============================================================ +-- ************************************************************ +-- THIS IS A WIZARD-GENERATED FILE. DO NOT EDIT THIS FILE! +-- +-- 5.0 Build 168 06/22/2005 SP 1.04 SJ Full Version +-- ************************************************************ + + +--Copyright (C) 1991-2005 Altera Corporation +--Your use of Altera Corporation's design tools, logic functions +--and other software and tools, and its AMPP partner logic +--functions, and any output files any of the foregoing +--(including device programming or simulation files), and any +--associated documentation or information are expressly subject +--to the terms and conditions of the Altera Program License +--Subscription Agreement, Altera MegaCore Function License +--Agreement, or other applicable license agreement, including, +--without limitation, that your use is for the sole purpose of +--programming logic devices manufactured by Altera and sold by +--Altera or its authorized distributors. Please refer to the +--applicable agreement for further details. + + +LIBRARY ieee; +USE ieee.std_logic_1164.all; + +LIBRARY altera_mf; +USE altera_mf.altera_mf_components.all; + +ENTITY conf_ram IS + PORT + ( + address : IN STD_LOGIC_VECTOR (3 DOWNTO 0); + clock : IN STD_LOGIC ; + q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) + ); +END conf_ram; + + +ARCHITECTURE SYN OF conf_ram IS + + SIGNAL sub_wire0 : STD_LOGIC_VECTOR (7 DOWNTO 0); + + + + COMPONENT altsyncram + GENERIC ( + operation_mode : STRING; + width_a : NATURAL; + widthad_a : NATURAL; + numwords_a : NATURAL; + lpm_type : STRING; + width_byteena_a : NATURAL; + outdata_reg_a : STRING; + outdata_aclr_a : STRING; + address_aclr_a : STRING; + read_during_write_mode_mixed_ports : STRING; + power_up_uninitialized : STRING; + init_file : STRING; + lpm_hint : STRING; + intended_device_family : STRING + ); + PORT ( + clock0 : IN STD_LOGIC ; + address_a : IN STD_LOGIC_VECTOR (3 DOWNTO 0); + q_a : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) + ); + END COMPONENT; + +BEGIN + q <= sub_wire0(7 DOWNTO 0); + + altsyncram_component : altsyncram + GENERIC MAP ( + operation_mode => "ROM", + width_a => 8, + widthad_a => 4, + numwords_a => 16, + lpm_type => "altsyncram", + width_byteena_a => 1, + outdata_reg_a => "CLOCK0", + outdata_aclr_a => "NONE", + address_aclr_a => "NONE", + read_during_write_mode_mixed_ports => "DONT_CARE", + power_up_uninitialized => "FALSE", + init_file => "conf_ram.mif", + lpm_hint => "ENABLE_RUNTIME_MOD=YES,INSTANCE_NAME=CONF", + intended_device_family => "Stratix" + ) + PORT MAP ( + clock0 => clock, + address_a => address, + q_a => sub_wire0 + ); + + + +END SYN; + +-- ============================================================ +-- CNX file retrieval info +-- ============================================================ +-- Retrieval info: PRIVATE: VarWidth NUMERIC "0" +-- Retrieval info: PRIVATE: WIDTH_WRITE_A NUMERIC "8" +-- Retrieval info: PRIVATE: WIDTH_WRITE_B NUMERIC "8" +-- Retrieval info: PRIVATE: WIDTH_READ_A NUMERIC "8" +-- Retrieval info: PRIVATE: WIDTH_READ_B NUMERIC "8" +-- Retrieval info: PRIVATE: MEMSIZE NUMERIC "128" +-- Retrieval info: PRIVATE: RAM_BLOCK_TYPE NUMERIC "0" +-- Retrieval info: PRIVATE: MAXIMUM_DEPTH NUMERIC "0" +-- Retrieval info: PRIVATE: IMPLEMENT_IN_LES NUMERIC "0" +-- Retrieval info: PRIVATE: Clock NUMERIC "0" +-- Retrieval info: PRIVATE: rden NUMERIC "0" +-- Retrieval info: PRIVATE: BYTE_ENABLE_A NUMERIC "0" +-- Retrieval info: PRIVATE: BYTE_ENABLE_B NUMERIC "0" +-- Retrieval info: PRIVATE: BYTE_SIZE NUMERIC "8" +-- Retrieval info: PRIVATE: Clock_A NUMERIC "0" +-- Retrieval info: PRIVATE: Clock_B NUMERIC "0" +-- Retrieval info: PRIVATE: REGdata NUMERIC "1" +-- Retrieval info: PRIVATE: REGwraddress NUMERIC "1" +-- Retrieval info: PRIVATE: REGwren NUMERIC "1" +-- Retrieval info: PRIVATE: REGrdaddress NUMERIC "1" +-- Retrieval info: PRIVATE: REGrren NUMERIC "1" +-- Retrieval info: PRIVATE: REGq NUMERIC "1" +-- Retrieval info: PRIVATE: INDATA_REG_B NUMERIC "0" +-- Retrieval info: PRIVATE: WRADDR_REG_B NUMERIC "0" +-- Retrieval info: PRIVATE: OUTDATA_REG_B NUMERIC "0" +-- Retrieval info: PRIVATE: CLRdata NUMERIC "0" +-- Retrieval info: PRIVATE: CLRwren NUMERIC "0" +-- Retrieval info: PRIVATE: CLRwraddress NUMERIC "0" +-- Retrieval info: PRIVATE: CLRrdaddress NUMERIC "0" +-- Retrieval info: PRIVATE: CLRrren NUMERIC "0" +-- Retrieval info: PRIVATE: CLRq NUMERIC "0" +-- Retrieval info: PRIVATE: BYTEENA_ACLR_A NUMERIC "0" +-- Retrieval info: PRIVATE: INDATA_ACLR_B NUMERIC "0" +-- Retrieval info: PRIVATE: WRCTRL_ACLR_B NUMERIC "0" +-- Retrieval info: PRIVATE: WRADDR_ACLR_B NUMERIC "0" +-- Retrieval info: PRIVATE: OUTDATA_ACLR_B NUMERIC "0" +-- Retrieval info: PRIVATE: BYTEENA_ACLR_B NUMERIC "0" +-- Retrieval info: PRIVATE: enable NUMERIC "0" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_A NUMERIC "0" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_A NUMERIC "0" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_INPUT_B NUMERIC "0" +-- Retrieval info: PRIVATE: CLOCK_ENABLE_OUTPUT_B NUMERIC "0" +-- Retrieval info: PRIVATE: ADDRESSSTALL_A NUMERIC "0" +-- Retrieval info: PRIVATE: ADDRESSSTALL_B NUMERIC "0" +-- Retrieval info: PRIVATE: READ_DURING_WRITE_MODE_MIXED_PORTS NUMERIC "2" +-- Retrieval info: PRIVATE: INIT_TO_SIM_X NUMERIC "0" +-- Retrieval info: PRIVATE: BlankMemory NUMERIC "0" +-- Retrieval info: PRIVATE: MIFfilename STRING "conf_ram.mif" +-- Retrieval info: PRIVATE: INIT_FILE_LAYOUT STRING "PORT_A" +-- Retrieval info: PRIVATE: JTAG_ENABLED NUMERIC "1" +-- Retrieval info: PRIVATE: JTAG_ID STRING "CONF" +-- Retrieval info: PRIVATE: INTENDED_DEVICE_FAMILY STRING "Stratix" +-- Retrieval info: PRIVATE: MEM_IN_BITS NUMERIC "0" +-- Retrieval info: PRIVATE: OPERATION_MODE NUMERIC "0" +-- Retrieval info: PRIVATE: UseDPRAM NUMERIC "1" +-- Retrieval info: CONSTANT: OPERATION_MODE STRING "ROM" +-- Retrieval info: CONSTANT: WIDTH_A NUMERIC "8" +-- Retrieval info: CONSTANT: WIDTHAD_A NUMERIC "4" +-- Retrieval info: CONSTANT: NUMWORDS_A NUMERIC "16" +-- Retrieval info: CONSTANT: LPM_TYPE STRING "altsyncram" +-- Retrieval info: CONSTANT: WIDTH_BYTEENA_A NUMERIC "1" +-- Retrieval info: CONSTANT: OUTDATA_REG_A STRING "CLOCK0" +-- Retrieval info: CONSTANT: OUTDATA_ACLR_A STRING "NONE" +-- Retrieval info: CONSTANT: ADDRESS_ACLR_A STRING "NONE" +-- Retrieval info: CONSTANT: READ_DURING_WRITE_MODE_MIXED_PORTS STRING "DONT_CARE" +-- Retrieval info: CONSTANT: POWER_UP_UNINITIALIZED STRING "FALSE" +-- Retrieval info: CONSTANT: INIT_FILE STRING "conf_ram.mif" +-- Retrieval info: CONSTANT: LPM_HINT STRING "ENABLE_RUNTIME_MOD=YES,INSTANCE_NAME=CONF" +-- Retrieval info: CONSTANT: INTENDED_DEVICE_FAMILY STRING "Stratix" +-- Retrieval info: USED_PORT: q 0 0 8 0 OUTPUT NODEFVAL q[7..0] +-- Retrieval info: USED_PORT: address 0 0 4 0 INPUT NODEFVAL address[3..0] +-- Retrieval info: USED_PORT: clock 0 0 0 0 INPUT NODEFVAL clock +-- Retrieval info: CONNECT: q 0 0 8 0 @q_a 0 0 8 0 +-- Retrieval info: CONNECT: @address_a 0 0 4 0 address 0 0 4 0 +-- Retrieval info: CONNECT: @clock0 0 0 0 0 clock 0 0 0 0 +-- Retrieval info: LIBRARY: altera_mf altera_mf.altera_mf_components.all +-- Retrieval info: GEN_FILE: TYPE_NORMAL conf_ram.vhd TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL conf_ram.inc FALSE +-- Retrieval info: GEN_FILE: TYPE_NORMAL conf_ram.cmp TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL conf_ram.bsf TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL conf_ram_inst.vhd TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL conf_ram_waveforms.html TRUE +-- Retrieval info: GEN_FILE: TYPE_NORMAL conf_ram_wave*.jpg FALSE Index: trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_slot.vhd =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_slot.vhd (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_slot.vhd (revision 18) @@ -0,0 +1,93 @@ +------------------------------------------------------------------------------- +-- File : fifo_slot.vhdl +-- Description : One slot for fifo register +-- Basically a Register(valid bit+data) and mux +-- Author : Erno Salminen +-- Date : 29.05.2003 +-- Modified : +-- +------------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; + + +entity fifo_slot is + + generic ( + width : integer := 0); + + port ( + Clk : in std_logic; + Rst_n : in std_logic; + Right_Valid_In : in std_logic; + Right_Enable_In : in std_logic; + Right_Data_In : in std_logic_vector ( width-1 downto 0); + + Left_Data_In : in std_logic_vector ( width-1 downto 0); + Left_Valid_in : in std_logic; + Left_Enable : in std_logic; + Valid_Out : out std_logic; + Data_Out : out std_logic_vector ( width-1 downto 0) + ); + +end fifo_slot; + + + +architecture rtl of fifo_slot is + + type Fifo_slot_type is record + Valid : std_logic; + Data : std_logic_vector ( width-1 downto 0); + end record; + + signal Data_reg : Fifo_slot_type; + + +begin -- rtl + + + -- CONC + Data_Out <= Data_reg.Data; + Valid_Out <= Data_reg.Valid; + + -- PROC + Sync : process (Clk, Rst_n) + begin -- process Sync + if Rst_n = '0' then -- asynchronous reset (active low) + Data_reg.Data <= (others => '0'); + Data_reg.Valid <= '0'; + + elsif Clk'event and Clk = '1' then -- rising clock edge + + if Right_Enable_In = '1' and Left_Enable = '1' then + -- ctrl = "11" = 3 + -- keep old values + Data_reg.Data <= Data_reg.Data; + Data_reg.Valid <= Data_reg.Valid; + assert false report "Simultaneous read+write" severity note; + + + elsif Right_Enable_In = '1' and Left_Enable = '0' then + -- ctrl = "10" = 2 + Data_reg.Data <= Right_Data_In; + Data_reg.Valid <= Right_Valid_In; --'1'; + + elsif Right_Enable_In = '0' and Left_Enable = '1'then + -- ctrl = "01" = 1 + Data_reg.Data <= Left_Data_In; + Data_reg.Valid <= Left_Valid_in; + + else + -- ctrl = "00" = 0 + Data_reg.Data <= Data_reg.Data; + Data_reg.Valid <= Data_reg.Valid; + end if; + + + end if; + end process Sync; + +end rtl; Index: trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_im.vhdl =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_im.vhdl (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_im.vhdl (revision 18) @@ -0,0 +1,274 @@ +------------------------------------------------------------------------------- +-- File : fifo_im.vhdl +-- Description : Fifo buffer for hibi interface +-- Author : Erno Salminen +-- Date : 29.04.2002 +-- Modified : 30.04.2002 Vesa Lahtinen Optimized for synthesis +-- +-- 02.06 ES: default assignment Fifo_Buffer <= Fifo_Buffer +-- smaller and faster implementation +-- Effect on synthesis is uncertain : +-- small fifos seem to gets smaller and faster, but big fifos +-- get bigger and slower. Strange. +------------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; + +entity fifo is + + generic ( + width : integer := 0; + depth : integer := 0); + + port ( + Clk : in std_logic; + Rst_n : in std_logic; + Data_In : in std_logic_vector (width-1 downto 0); + Write_Enable : in std_logic; + One_Place_Left : out std_logic; + Full : out std_logic; + Data_Out : out std_logic_vector (width-1 downto 0); + Read_Enable : in std_logic; + Empty : out std_logic; + One_Data_Left : out std_logic + ); + +end fifo; + +architecture in_mux of fifo is + + type data_array is array (depth-1 downto 0) of std_logic_vector (width-1 downto 0); + signal Fifo_Buffer : data_array; + + -- Registers + signal Full_reg : std_logic; + signal Empty_reg : std_logic; + signal One_Data_Left_reg : std_logic; + signal One_Place_Left_reg : std_logic; + --signal Data_Amount : std_logic_vector (depth-1 downto 0); + signal Data_Amount : integer range 0 to depth-1; + + +begin -- in_mux + + -- Continuous assignments + -- Assigns register values to outputs + Full <= Full_reg; + Empty <= Empty_reg; + One_Data_Left <= One_Data_Left_reg; + One_Place_Left <= One_Place_Left_reg; + Data_Out <= Fifo_Buffer (0); + -- Note! There is some old value in data output when fifo is empty. + + +Main : process (Clk, Rst_n) +begin -- process Main + if Rst_n = '0' then -- asynchronous reset (active low) + + -- Reset all registers + -- Fifo is empty at first + Full_reg <= '0'; + Empty_reg <= '1'; + One_Data_Left_reg <= '0'; + Data_Amount <= 0; + + if depth =1 then -- 30.07 + One_Place_Left_reg <= '1'; + else + One_Place_Left_reg <= '0'; + end if; + + for i in 0 to depth-1 loop + Fifo_Buffer (i) <= (others => '0'); + end loop; -- i + + elsif Clk'event and Clk = '1' then -- rising clock edge + + + -- 1) Write data to fifo + if Write_Enable = '1' and Read_Enable = '0' then + + if Full_reg = '0' then + Empty_reg <= '0'; + Data_Amount <= Data_Amount +1; + + Fifo_Buffer <= Fifo_Buffer; --02.06 + Fifo_Buffer (Data_Amount) <= Data_In; + + -- Check if the fifo is getting full + if Data_Amount + 2 = depth then + Full_reg <= '0'; + One_Place_Left_reg <= '1'; + elsif Data_Amount +1 = depth then + Full_reg <= '1'; + One_Place_Left_reg <= '0'; + else + Full_reg <= '0'; + One_Place_Left_reg <= '0'; + end if; + + + -- If fifo was empty, it has now one data + if Empty_reg = '1' then + One_Data_Left_reg <= '1'; + else + One_Data_Left_reg <= '0'; + end if; + + else + Full_reg <= Full_reg; + Empty_reg <= Empty_reg; + Fifo_Buffer <= Fifo_Buffer; + Data_Amount <= Data_Amount; + One_Data_Left_reg <= One_Data_Left_reg; + One_Place_Left_reg <= One_Place_Left_reg; + end if; + + + -- 2) Read data from fifo + elsif Write_Enable = '0' and Read_Enable = '1' then + + if Empty_reg = '0' then + + -- Shiftaus + Fifo_Buffer <= Fifo_Buffer; --02.06 + for i in 0 to depth-2 loop + Fifo_Buffer (i) <= Fifo_Buffer (i+1); + end loop; -- i + + Full_reg <= '0'; + Data_Amount <= Data_Amount -1; + + -- Debug + -- Fifo_Buffer (out_ptr) <= (others => '1'); + + + + + -- Check if the fifo is getting empty + if Data_Amount = 2 then + Empty_reg <= '0'; + One_data_Left_reg <= '1'; + elsif Data_Amount = 1 then + Empty_reg <= '1'; + One_Data_Left_reg <= '0'; + else + Empty_reg <= '0'; + One_Data_Left_reg <= '0'; + end if; + + -- If fifo was full, it is no more + if Full_reg = '1' then + One_Place_Left_reg <= '1'; + else + One_Place_Left_reg <= '0'; + end if; + + else + Full_reg <= Full_reg; + Empty_reg <= Empty_reg; + Fifo_Buffer <= Fifo_Buffer; + Data_Amount <= Data_Amount; + One_Data_Left_reg <= One_Data_Left_reg; + One_Place_Left_reg <= One_Place_Left_reg; + end if; + + + -- 3) Write and read at the same time + elsif Write_Enable = '1' and Read_Enable = '1' then + + + if Full_reg = '0' and Empty_reg = '0' then + Full_reg <= '0'; + Empty_reg <= '0'; + Data_Amount <= Data_Amount; + One_Data_Left_reg <= One_Data_Left_reg; + One_Place_Left_reg <= One_Place_Left_reg; + + Fifo_Buffer <= Fifo_Buffer; --02.06 + -- Shiftaus + for i in 0 to depth-2 loop + Fifo_Buffer (i) <= Fifo_Buffer (i+1); + end loop; -- i + Fifo_Buffer (Data_Amount-1) <= Data_In; --vai amount-1 ?? koska pitaa + --shiftata samalla + + -- Fifo_Buffer (out_ptr) <= (others => '1'); --debug + + + elsif Full_reg = '1' and Empty_reg = '0' then + -- Fifo is full, only reading is possible + + Full_reg <= '0'; + One_Place_Left_reg <= '1'; + --Fifo_Buffer (out_ptr) <= (others => '1'); -- Debug + Data_Amount <= Data_Amount -1; + + Fifo_Buffer <= Fifo_Buffer; --02.06 + -- Shiftaus + for i in 0 to depth-2 loop + Fifo_Buffer (i) <= Fifo_Buffer (i+1); + end loop; -- i + + -- Check if the fifo is getting empty + if Data_Amount = 2 then + Empty_reg <= '0'; + One_data_Left_reg <= '1'; + elsif Data_Amount = 1 then + Empty_reg <= '1'; + One_Data_Left_reg <= '0'; + else + Empty_reg <= '0'; + One_Data_Left_reg <= '0'; + end if; + + + elsif Full_reg = '0' and Empty_reg = '1' then + -- Fifo is empty, only writing is possible + Empty_reg <= '0'; + One_Data_Left_reg <= '1'; + Fifo_Buffer <= Fifo_Buffer; --02.06 + Fifo_Buffer (Data_Amount) <= Data_In; --Data_Amount =0 + Data_Amount <= Data_Amount +1; + + -- Check if the fifo is getting full + if Data_Amount + 2 = depth then + Full_reg <= '0'; + One_Place_Left_reg <= '1'; + elsif Data_Amount +1 = depth then + Full_reg <= '1'; + One_Place_Left_reg <= '0'; + else + Full_reg <= '0'; + One_Place_Left_reg <= '0'; + end if; + + + else + -- Fifo is full and empty at the same time => impossible + Full_reg <= Full_reg; + Empty_reg <= Empty_reg; + Fifo_Buffer <= Fifo_Buffer; + Data_Amount <= Data_Amount; + One_Data_Left_reg <= One_Data_Left_reg; + One_Place_Left_reg <= One_Place_Left_reg; + end if; --Full_reg & Empty_reg + + + -- 4) Do nothing, fifo remains idle + else + + Full_reg <= Full_reg; + Empty_reg <= Empty_reg; + Fifo_Buffer <= Fifo_Buffer; + Data_Amount <= Data_Amount; + One_Data_Left_reg <= One_Data_Left_reg; + One_Place_Left_reg <= One_Place_Left_reg; + end if; + + end if; +end process Main; + +end in_mux; Index: trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/double_fifo_muxed_read.vhdl =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/double_fifo_muxed_read.vhdl (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/double_fifo_muxed_read.vhdl (revision 18) @@ -0,0 +1,301 @@ +------------------------------------------------------------------------------- +-- File : double_fifo_muxed_read.vhdl +-- Description : Double_Fifo_Muxed_Read buffer for hibi v.2 interface +-- Includes two fifos and a special multiplexer +-- so that the reader sees only one fifo. Multiplexer +-- selects addr+data first from fifo 0 (i.e. it has a higher priority) +-- Author : Erno Salminen +-- Date : 07.02.2003 +-- Modified : +-- +------------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; + + + +entity double_fifo_muxed_read is + + generic ( + Data_Width : integer := 0; + Depth_0 : integer := 0; + Depth_1 : integer := 0; + Comm_Width : integer := 0 + ); + port ( + Clk : in std_logic; + Rst_n : in std_logic; + + Data_In_0 : in std_logic_vector ( Data_Width-1 downto 0); + Comm_In_0 : in std_logic_vector ( Comm_Width-1 downto 0); + Addr_Valid_In_0 : in std_logic; + Write_Enable_In_0 : in std_logic; + One_Place_Left_Out_0 : out std_logic; + Full_Out_0 : out std_logic; + + Data_In_1 : in std_logic_vector ( Data_Width-1 downto 0); + Comm_In_1 : in std_logic_vector ( Comm_Width-1 downto 0); + Addr_Valid_In_1 : in std_logic; + Write_Enable_In_1 : in std_logic; + One_Place_Left_Out_1 : out std_logic; + Full_Out_1 : out std_logic; + + Read_Enable_In : in std_logic; + Data_Out : out std_logic_vector ( Data_Width-1 downto 0); + Comm_Out : out std_logic_vector ( Comm_Width-1 downto 0); + Addr_Valid_Out : out std_logic; + Empty_Out : out std_logic; + One_Data_Left_Out : out std_logic + ); +end double_fifo_muxed_read; + + + +architecture structural of double_fifo_muxed_read is + + + + + component fifo + generic ( + width : integer := 0; + depth : integer := 0); + + port ( + Clk : in std_logic; + Rst_n : in std_logic; + Data_In : in std_logic_vector (width-1 downto 0); + Write_Enable : in std_logic; + One_Place_Left : out std_logic; + Full : out std_logic; + + Read_Enable : in std_logic; + Data_Out : out std_logic_vector (width-1 downto 0); + Empty : out std_logic; + One_Data_Left : out std_logic + ); + end component; --fifo; + + + component fifo_mux_read + generic ( + Data_Width : integer := 0; + Comm_Width : integer := 0 + ); + port ( + Clk : in std_logic; + Rst_n : in std_logic; + + Data_0_In : in std_logic_vector (Data_Width-1 downto 0); + Comm_0_In : in std_logic_vector (Comm_Width-1 downto 0); + Addr_Valid_0_In : in std_logic; + One_Data_Left_0_In : in std_logic; + Empty_0_In : in std_logic; + RE_0_Out : out std_logic; + + Data_1_In : in std_logic_vector (Data_Width-1 downto 0); + Comm_1_In : in std_logic_vector (Comm_Width-1 downto 0); + Addr_Valid_1_In : in std_logic; + One_Data_Left_1_In : in std_logic; + Empty_1_In : in std_logic; + RE_1_Out : out std_logic; + + Read_Enable_In : in std_logic; + Data_Out : out std_logic_vector (Data_Width-1 downto 0); + Comm_Out : out std_logic_vector (Comm_Width-1 downto 0); + Addr_Valid_Out : out std_logic; + One_Data_Left_Out : out std_logic; + Empty_Out : out std_logic + ); + end component; --fifo_mux_read; + + + signal Data_AV_Comm_In_0 : std_logic_vector ( 1 + Comm_Width + Data_Width-1 downto 0); + signal Data_AV_Comm_In_1 : std_logic_vector ( 1 + Comm_Width + Data_Width-1 downto 0); + + signal Data_AV_Comm_0_Mux : std_logic_vector ( 1 + Comm_Width + Data_Width-1 downto 0); + signal Data_0_Mux : std_logic_vector ( Data_Width-1 downto 0); + signal Comm_0_Mux : std_logic_vector ( Comm_Width-1 downto 0); + signal AV_0_Mux : std_logic; + + signal Data_AV_Comm_1_Mux : std_logic_vector ( 1 + Comm_Width + Data_Width-1 downto 0); + signal Data_1_Mux : std_logic_vector ( Data_Width-1 downto 0); + signal Comm_1_Mux : std_logic_vector ( Comm_Width-1 downto 0); + signal AV_1_Mux : std_logic; + + signal Read_Enable_Mux_0 : std_logic; + signal Empty_0_Mux : std_logic; + signal One_Data_Left_0_Mux : std_logic; + + signal Read_Enable_Mux_1 : std_logic; + signal Empty_1_Mux : std_logic; + signal One_Data_Left_1_Mux : std_logic; + + + signal Tie_High : std_logic; + signal Tie_Low : std_logic; + + +begin -- structural + -- Check generics + assert (Depth_0 + Depth_1 > 0) report "Both fifo depths zero!" severity warning; + + -- Concurrent assignments + Tie_High <= '1'; + Tie_Low <= '0'; + -- Combine fifo inputs + Data_AV_Comm_In_0 <= Addr_Valid_In_0 & Comm_In_0 & Data_In_0; + Data_AV_Comm_In_1 <= Addr_Valid_In_1 & Comm_In_1 & Data_In_1; + + + -- Split fifooutput + AV_0_Mux <= Data_AV_Comm_0_Mux ( 1+Comm_Width + Data_Width-1); + Comm_0_Mux <= Data_AV_Comm_0_Mux ( Comm_Width + Data_Width-1 downto Data_Width); + Data_0_Mux <= Data_AV_Comm_0_Mux ( Data_Width-1 downto 0); + AV_1_Mux <= Data_AV_Comm_1_Mux ( 1+Comm_Width + Data_Width-1); + Comm_1_Mux <= Data_AV_Comm_1_Mux ( Comm_Width + Data_Width-1 downto Data_Width); + Data_1_Mux <= Data_AV_Comm_1_Mux ( Data_Width-1 downto 0); + + + Map_Fifo_0 : if Depth_0 > 0 generate + Fifo_0 : fifo + generic map( + width => 1 + Comm_Width + Data_Width, + depth => Depth_0 + ) + port map( + Clk => Clk, + Rst_n => Rst_n, + + Data_In => Data_AV_Comm_In_0, + Write_Enable => Write_Enable_In_0, + One_Place_Left => One_Place_Left_Out_0, + Full => Full_Out_0, + + Read_Enable => Read_Enable_Mux_0, + Data_Out => Data_AV_Comm_0_Mux, + Empty => Empty_0_Mux, + One_Data_Left => One_Data_Left_0_Mux + ); + end generate Map_Fifo_0; + + + Not_Map_Fifo_0 : if Depth_0 = 0 generate + -- Fifo #0 does not exist! + Data_AV_Comm_0_Mux <= (others => '0'); + Empty_0_Mux <= Tie_High; + One_Data_Left_0_Mux <= Tie_Low; + Full_Out_0 <= Tie_High; + One_Place_Left_Out_0 <= Tie_Low; + + -- Connect the other fifo (#1)straight to the outputs ( => FSM) + Data_Out <= Data_1_Mux; + Comm_Out <= Comm_1_Mux; + Addr_Valid_Out <= AV_1_Mux; + One_Data_Left_Out <= One_Data_Left_1_Mux; + Empty_Out <= Empty_1_Mux; + + Read_Enable_Mux_1 <= Read_Enable_In; --15.05 + + end generate Not_Map_Fifo_0; + + + + + Map_Fifo_1 : if Depth_1 > 0 generate + Fifo_1 : fifo + generic map( + width => 1 + Comm_Width + Data_Width, + depth => Depth_1 + ) + port map( + Clk => Clk, + Rst_n => Rst_n, + + Data_In => Data_AV_Comm_In_1, + Write_Enable => Write_Enable_In_1, + One_Place_Left => One_Place_Left_Out_1, + Full => Full_Out_1, + + Read_Enable => Read_Enable_Mux_1, + Data_Out => Data_AV_Comm_1_Mux, + Empty => Empty_1_Mux, + One_Data_Left => One_Data_Left_1_Mux + ); + end generate Map_Fifo_1; + + + Not_Map_Fifo_1 : if Depth_1 = 0 generate + -- Fifo #1 does not exist! + + -- Signals fifo#1=> IP + -- Full_Out_1 <= Tie_High; + -- One_Place_Left_Out_1 <= Tie_Low; + + -- Signals fifo#1=> FSM + Data_AV_Comm_1_Mux <= (others => '0'); + Empty_1_Mux <= Tie_High; + One_Data_Left_1_Mux <= Tie_Low; + + -- Connect the other fifo (#0)straight to the outputs ( => FSM) + Data_Out <= Data_0_Mux; + Comm_Out <= Comm_0_Mux; + Addr_Valid_Out <= AV_0_Mux; + One_Data_Left_Out <= One_Data_Left_0_Mux; + Empty_Out <= Empty_0_Mux; + + Read_Enable_Mux_0 <= Read_Enable_In; --15.05 + + end generate Not_Map_Fifo_1; + + + Map_Mux : if Depth_0 > 0 and Depth_1 > 0 generate + -- Only one fifo used + -- Multiplexer is needed only if two fifos are used + MUX_01: fifo_mux_read + generic map( + Data_Width => Data_Width, + Comm_Width => Comm_Width + ) + port map( + Clk => Clk, + Rst_n => Rst_n, + + Data_0_In => Data_0_Mux, + Comm_0_In => Comm_0_Mux, + Addr_Valid_0_In => AV_0_Mux, + One_Data_Left_0_In => One_Data_Left_0_Mux, + Empty_0_In => Empty_0_Mux, + RE_0_Out => Read_Enable_Mux_0, + + Data_1_In => Data_1_Mux, + Comm_1_In => Comm_1_Mux, + Addr_Valid_1_In => AV_1_Mux, + One_Data_Left_1_In => One_Data_Left_1_Mux, + Empty_1_In => Empty_1_Mux, + RE_1_Out => Read_Enable_Mux_1, + + Read_Enable_In => Read_Enable_In, + Data_Out => Data_Out, + Comm_Out => Comm_Out, + Addr_Valid_Out => Addr_Valid_Out, + One_Data_Left_Out => One_Data_Left_Out, + Empty_Out => Empty_Out + ); + end generate Map_Mux; + + + + + + + + + + +end structural; + + + Index: trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_ram_dynamic.vhd =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_ram_dynamic.vhd (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_ram_dynamic.vhd (revision 18) @@ -0,0 +1,284 @@ +------------------------------------------------------------------------------- +-- Title : fifo +-- Project : +------------------------------------------------------------------------------- +-- File : fifo_ram_dynamic.vhd +-- Author : +-- Company : +-- Created : 2005-05-26 +-- Last update: 2006-03-02 +-- Platform : +-- Standard : VHDL'87 +------------------------------------------------------------------------------- +-- Description: Fifo w/dynamic depth implemented with dual port RAM +------------------------------------------------------------------------------- +-- Copyright (c) 2005 +------------------------------------------------------------------------------- +-- Revisions : +-- Date Version Author Description +-- 2005-05-26 1.0 penttin5 Created +------------------------------------------------------------------------------- +-- +-- NOTE! generic depth_g is the maximum depth of fifo +-- NOTE! Precision RTL synthesisis 2004c.45 doesn't infer the RAM with +-- asynchronous read for Stratix 1 S40F780C5. +-- Quartus II 4.2 infers RAM with asynchronic read but gives old RAM +-- value when reading and writing simultaneusly to/from same address. +-- That doesn't matter because FIFO doesn't read and write in the same +-- address at the same time. +-- +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; + +entity fifo is + + generic ( + data_width_g : integer := 32; + depth_g : integer := 10 -- this is the maximum depth of fifo! + ); + + port ( + clk : in std_logic; + rst_n : in std_logic; + data_in : in std_logic_vector (data_width_g-1 downto 0); + we_in : in std_logic; + one_p_out : out std_logic; + full_out : out std_logic; + data_out : out std_logic_vector (data_width_g-1 downto 0); + re_in : in std_logic; + empty_out : out std_logic; + one_d_out : out std_logic + ); + +end fifo; + +architecture rtl of fifo is + + -- this is the configuration RAM which holds the + -- dynamic depth value at address 0 + component conf_ram + port ( + address : in std_logic_vector(3 downto 0); + clock : in std_logic; + q : out std_logic_vector(7 downto 0) + ); + end component; + + component dual_ram_async_read + generic ( + ram_width : integer := 0; + ram_depth : integer := 0); + port + ( + clock1 : in std_logic; + clock2 : in std_logic; + data : in std_logic_vector(0 to ram_width - 1); + write_address : in integer range 0 to ram_depth - 1; + read_address : in integer range 0 to ram_depth - 1; + we : in std_logic; + q : out std_logic_vector(0 to ram_width - 1) + ); + end component; -- dual_ram_async_read + + signal write_address_r : integer range 0 to depth_g - 1; + signal read_address_r : integer range 0 to depth_g - 1; + signal write_read_count_r : integer range 0 to depth_g; + signal ram_data_out_i : std_logic_vector(0 to data_width_g - 1); + signal we_ram : std_logic; + + signal conf_ram_addr : std_logic_vector(3 downto 0); + signal depth_from_conf_ram : std_logic_vector(7 downto 0); + signal dynamic_depth_r : integer range 0 to depth_g; + signal full_out_r : std_logic; + +begin -- rtl + + conf_ram_inst : conf_ram + port map ( + address => (others => '0'), + clock => clk, + q => depth_from_conf_ram + ); + + gen_dual_ram : dual_ram_async_read + generic map ( + ram_width => data_width_g, + ram_depth => depth_g + ) + port map ( + clock1 => clk, + clock2 => clk, + data => data_in, + write_address => write_address_r, + read_address => read_address_r, + we => we_ram, + q => ram_data_out_i + ); + + full_out <= full_out_r; + -- write to fifo when write enabled and fifo not full + we_ram <= we_in when full_out_r = '0'--write_read_count_r < dynamic_depth_r + else '0'; + + data_out <= ram_data_out_i; + +-- one_d_out <= '1' when write_read_count_r = 1 else +-- '0'; +-- one_p_out <= '1' when write_read_count_r = dynamic_depth_r - 1 else +-- '0'; +-- empty_out <= '1' when write_read_count_r = 0 else +-- '0'; +-- full_out <= '1' when write_read_count_r >= dynamic_depth_r else +-- '0'; + + update_flags: process (clk, rst_n) + begin -- process update_flags + if rst_n = '0' then -- asynchronous reset (active low) + one_d_out <= '0'; + one_p_out <= '0'; + empty_out <= '1'; + full_out_r <= '0'; + elsif clk'event and clk = '1' then -- rising clock edge + + if (we_in = '0' and re_in = '0' and write_read_count_r = 1) or + (we_in = '1' and re_in = '1' and write_read_count_r = 1) or + (we_in = '1' and re_in = '0' and write_read_count_r = 0) or + (we_in = '0' and re_in = '1' and write_read_count_r = 2) then + one_d_out <= '1'; + else + one_d_out <= '0'; + end if; + + if (we_in = '0' and re_in = '0' and write_read_count_r = dynamic_depth_r - 1) or + (we_in = '1' and re_in = '1' and write_read_count_r = dynamic_depth_r - 1) or + (we_in = '1' and re_in = '0' and write_read_count_r = dynamic_depth_r - 2) or + (we_in = '0' and re_in = '1' and write_read_count_r = dynamic_depth_r) then + + one_p_out <= '1'; + else + one_p_out <= '0'; + end if; + + if (we_in = '0' and re_in = '0' and write_read_count_r = 0) or + (we_in = '0' and re_in = '1' and write_read_count_r = 0) or + (we_in = '0' and re_in = '1' and write_read_count_r = 1) then + + empty_out <= '1'; + else + empty_out <= '0'; + end if; + + if (we_in = '0' and re_in = '0' and write_read_count_r = dynamic_depth_r) or + (we_in = '1' and re_in = '0' and write_read_count_r = dynamic_depth_r) or + (we_in = '1' and re_in = '0' and write_read_count_r = dynamic_depth_r - 1) or + (write_read_count_r > dynamic_depth_r) then + + full_out_r <= '1'; + else + full_out_r <= '0'; + end if; + + end if; + end process update_flags; + + ----------------------------------------------------------------------------- + -- Update dynamic depth + ----------------------------------------------------------------------------- + update_dynamic_depth_r : process (clk, rst_n) + begin -- process update_dynamic_depth_r + if rst_n = '0' then -- asynchronous reset (active low) + dynamic_depth_r <= depth_g; + conf_ram_addr <= (others => '0'); + + elsif clk'event and clk = '1' then -- rising clock edge + conf_ram_addr <= (others => '0'); + + if conv_integer(depth_from_conf_ram) > depth_g + or depth_from_conf_ram = + + -- dynamic depth is bigger than maximum depth or + -- it's not defined(zero) => Use the maximum depth + conv_std_logic_vector(0, depth_from_conf_ram'length) then + dynamic_depth_r <= depth_g; + + else + + -- update dynamic depth + dynamic_depth_r <= + conv_integer(depth_from_conf_ram); + end if; + + end if; + end process update_dynamic_depth_r; + + ----------------------------------------------------------------------------- + -- Update read and write addresses + ----------------------------------------------------------------------------- + fifo_read_and_write : process (clk, rst_n) + + begin -- process fifo_read_and_write + + if rst_n = '0' then -- asynchronous reset (active low) + write_read_count_r <= 0; + read_address_r <= 0; + write_address_r <= 0; + + elsif clk'event and clk = '1' then -- rising clock edge + + -- read if re_in = '1' and fifo not empty or + -- simultaneus read and write and fifo full + if re_in = '1' and ((we_in = '0' and write_read_count_r /= 0) + or (we_in = '1' + and write_read_count_r = dynamic_depth_r)) then + + write_read_count_r <= write_read_count_r - 1; + + if read_address_r = dynamic_depth_r - 1 then + read_address_r <= 0; + else + read_address_r <= read_address_r + 1; + end if; + write_address_r <= write_address_r; + + -- write if we_in = '1' and fifo not full or + -- simultaneus read and write and fifo empty + elsif we_in = '1' and ((re_in = '0' and + write_read_count_r /= dynamic_depth_r) + or (re_in = '1' and write_read_count_r = 0)) then + write_read_count_r <= write_read_count_r + 1; + read_address_r <= read_address_r; + if write_address_r = dynamic_depth_r - 1 then + write_address_r <= 0; + else + write_address_r <= write_address_r + 1; + end if; + + -- write and read at the same time if re_in = '1' and we_in = '1' and + -- fifo not empty or full + elsif re_in = '1' and we_in = '1' + and write_read_count_r /= dynamic_depth_r + and write_read_count_r /= 0 then + write_read_count_r <= write_read_count_r; + if read_address_r = dynamic_depth_r - 1 then + read_address_r <= 0; + else + read_address_r <= read_address_r + 1; + end if; + if write_address_r = dynamic_depth_r - 1 then + write_address_r <= 0; + else + write_address_r <= write_address_r + 1; + end if; + else + write_read_count_r <= write_read_count_r; + read_address_r <= read_address_r; + write_address_r <= write_address_r; + end if; + end if; + end process fifo_read_and_write; + +end rtl; Index: trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/shift_slot.vhdl =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/shift_slot.vhdl (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/shift_slot.vhdl (revision 18) @@ -0,0 +1,73 @@ +------------------------------------------------------------------------------- +-- File : shift_slot.vhdl +-- Description : One slot for shift register +-- Basically a Register(valid bit+data) and mux +-- Author : Erno Salminen +-- Date : 29.05.2003 +-- Modified : +-- +------------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; + + +entity shift_slot is + + generic ( + width : integer := 0); + + port ( + Clk : in std_logic; + Rst_n : in std_logic; + Valid_In : in std_logic; + Data_In : in std_logic_vector ( width-1 downto 0); + Shift_Enable : in std_logic; + Valid_Out : out std_logic; + Data_Out : out std_logic_vector ( width-1 downto 0) + ); + +end shift_slot; + + + +architecture rtl of shift_slot is + + type Shift_slot_type is record + Valid : std_logic; + Data : std_logic_vector ( width-1 downto 0); + end record; + + signal Data_reg : Shift_slot_type; + + +begin -- rtl + + + -- CONC + Data_Out <= Data_reg.Data; + Valid_Out <= Data_reg.Valid; + + -- PROC + Sync : process (Clk, Rst_n) + begin -- process Sync + if Rst_n = '0' then -- asynchronous reset (active low) + Data_reg.Data <= (others => '0'); + Data_reg.Valid <= '0'; + + elsif Clk'event and Clk = '1' then -- rising clock edge + + if Shift_Enable = '1' then + Data_reg.Data <= Data_In; + Data_reg.Valid <= Valid_In; + else + Data_reg.Data <= Data_reg.Data; + Data_reg.Valid <= Data_reg.Valid; + end if; + + + end if; + end process Sync; + +end rtl; Index: trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_shift_slotted.vhdl =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_shift_slotted.vhdl (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_shift_slotted.vhdl (revision 18) @@ -0,0 +1,174 @@ +------------------------------------------------------------------------------- +-- File : fifo_shift.vhdl +-- Description : Fifo buffer for hibi interface +-- +-- Author : Erno Salminen +-- Date : 29.05.2003 +-- Modified : +-- +------------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; + +entity fifo is + + generic ( + width : integer := 0; + depth : integer := 0); + + port ( + Clk : in std_logic; + Rst_n : in std_logic; + Data_In : in std_logic_vector (width-1 downto 0); + Write_Enable : in std_logic; + One_Place_Left : out std_logic; + Full : out std_logic; + Data_Out : out std_logic_vector (width-1 downto 0); + Read_Enable : in std_logic; + Empty : out std_logic; + One_Data_Left : out std_logic + ); + +end fifo; + + + +architecture slotted_shift_reg of fifo is + + component shift_slot + generic ( + width : integer := 0); + port ( + Clk : in std_logic; + Rst_n : in std_logic; + Valid_In : in std_logic; + Data_In : in std_logic_vector ( width-1 downto 0); + Shift_Enable : in std_logic; + Valid_Out : out std_logic; + Data_Out : out std_logic_vector ( width-1 downto 0) + ); + + end component; -- shift_slot; + + + + type Fifo_slot_type is record + Valid : std_logic; + Data : std_logic_vector ( width-1 downto 0); + end record; + type slot_signal_array is array (depth downto 0) of Fifo_slot_type; + signal intermediate_signal : slot_signal_array; + signal Top_Slot_Write_Enable : std_logic; + +begin -- slotted_shift_reg + + + + -- Continuous assignments + -- Assigns register values to outputs + assert depth > 1 report "Fifo depth must be more than one!" severity WARNING; + Full <= intermediate_signal (depth-1).Valid; -- ylin paikka varattu + Empty <= not (intermediate_signal (0).Valid ); -- alin paikka tyhja + + -- Yksi data=alin taynna, toiseksi alin tyhja + One_Data_Left <= not (intermediate_signal (1).Valid) and intermediate_signal (0).Valid; + + -- Yksi paikka=ylin tyhja, toiseksi ylin taynna + One_Place_Left <= not (intermediate_signal (depth-1).Valid) and intermediate_signal (depth-2).Valid; + + Data_Out <= intermediate_signal (0).Data; --alin data ulostuloon + -- Note! There is some old value in data output when fifo is empty. + + + + top_slot : shift_slot + generic map ( + width => width) + port map ( + Clk => Clk, + Rst_n => Rst_n, + Valid_In => intermediate_signal (depth).Valid, + Data_In => intermediate_signal (depth).Data, + Shift_Enable => Top_Slot_Write_Enable, + Valid_Out => intermediate_signal(depth-1).Valid, + Data_Out => intermediate_signal(depth-1).Data + ); + + map_slots : for i in 0 to depth-2 generate + gen_slot_i : shift_slot + generic map ( + width => width) + port map ( + Clk => Clk, + Rst_n => Rst_n, + Valid_In => intermediate_signal (i+1).Valid, + Data_In => intermediate_signal (i+1).Data, + Shift_Enable => Read_Enable, + Valid_Out => intermediate_signal (i).Valid, + Data_Out => intermediate_signal (i).Data + ); + end generate map_slots; + + + async_first_slot: process (intermediate_signal, Data_In, Write_Enable, Read_Enable) + begin -- process async_first_slot + -- Ohjataan ensimmaisen (=kirjoitus-) paikan sisaanmenoja + + if Write_Enable = '1' and Read_Enable = '0' then + -- Kirjoitus + + if intermediate_signal (depth-1).Valid = '1' then + -- Ylin paikka taynna + Top_Slot_Write_Enable <= '0'; + intermediate_signal (depth).Data <= (others => '0'); --'Z'); + intermediate_signal (depth).Valid <= '0'; + + else + -- Kirjoitetaan uusi data ylimpaan + Top_Slot_Write_Enable <= '1'; + intermediate_signal (depth).Data <= Data_In; + intermediate_signal (depth).Valid <= '1'; + end if; + + + elsif Write_Enable = '0' and Read_Enable = '1' then + -- Luku + --Nollataan ylin paikka + Top_Slot_Write_Enable <= '1'; + intermediate_signal (depth).Data <= (others => '0'); -- 'Z'); + intermediate_signal (depth).Valid <= '0'; + + + elsif Write_Enable = '1' and Read_Enable = '1' then + --Luku ja kirjoitus yhta aikaa + if intermediate_signal (depth-1).Valid = '1' then + -- Ylin paikka taynna + Top_Slot_Write_Enable <= '0'; + intermediate_signal (depth).Data <= (others => '0'); --'Z'); + intermediate_signal (depth).Valid <= '0'; + + else + -- Kirjoitetaan uusi data ylimpaan + Top_Slot_Write_Enable <= '1'; + intermediate_signal (depth).Data <= Data_In; + intermediate_signal (depth).Valid <= '1'; + end if; + + + + else + -- Ei tehda mitaan + -- Ylin paikka taynna + Top_Slot_Write_Enable <= '0'; + intermediate_signal (depth).Data <= (others => '0'); --'Z'); + intermediate_signal (depth).Valid <= '0'; + + + end if; + + + end process async_first_slot; + +end slotted_shift_reg; --architecture Index: trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_shift.vhdl =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_shift.vhdl (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Vhdl/fifo_shift.vhdl (revision 18) @@ -0,0 +1,154 @@ +------------------------------------------------------------------------------- +-- File : fifo_shift.vhdl +-- Description : Fifo buffer for hibi interface +-- +-- Author : Erno Salminen +-- Date : 29.05.2003 +-- Modified : +-- +------------------------------------------------------------------------------- +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; + +entity fifo is + + generic ( + width : integer := 0; + depth : integer := 0); + + port ( + Clk : in std_logic; + Rst_n : in std_logic; + Data_In : in std_logic_vector (width-1 downto 0); + Write_Enable : in std_logic; + One_Place_Left : out std_logic; + Full : out std_logic; + Data_Out : out std_logic_vector (width-1 downto 0); + Read_Enable : in std_logic; + Empty : out std_logic; + One_Data_Left : out std_logic + ); + +end fifo; + + + +architecture shift_reg of fifo is + + type Fifo_slot_type is record + Valid : std_logic; + Data : std_logic_vector ( width-1 downto 0); + end record; + + type data_array is array (depth-1 downto 0) of Fifo_slot_type; + signal Fifo_Buffer : data_array; + + -- Registers + --signal Data_Amount : integer range 0 to depth-1; + + signal WE_RE : std_logic_vector ( 1 downto 0); + +begin -- shift_reg + + + + -- Continuous assignments + -- Assigns register values to outputs + WE_RE <= Write_Enable & Read_Enable; -- yhdistetaan case-lausetta varten + + assert depth > 1 report "Fifo depth must be more than one!" severity WARNING; + Full <= Fifo_Buffer (depth-1).Valid; -- ylin paikka varattu + Empty <= not (Fifo_Buffer (0).Valid); -- alin paikka tyhja + + -- Yksi data=alin taynna, toiseksi alin tyhja + One_Data_Left <= not (Fifo_Buffer (1).Valid) and Fifo_Buffer (0).Valid; + + -- Yksi paikka=ylin tyhja, toiseksi ylin taynna + One_Place_Left <= not (Fifo_Buffer (depth-1).Valid) and Fifo_Buffer (depth-2).Valid; + + Data_Out <= Fifo_Buffer (0).Data; --alin data ulostuloon + -- Note! There is some old value in data output when fifo is empty. + + + + + + + Sync: process (Clk, Rst_n) + begin -- process Sync + if Rst_n = '0' then -- asynchronous reset (active low) + + -- Reset all registers + --Data_Amount <= 0; + for i in 0 to depth-1 loop + Fifo_Buffer (i).Data <= (others => '0'); --'Z'); + Fifo_Buffer (i).Valid <= '0'; + end loop; -- i + + + elsif Clk'event and Clk = '1' then -- rising clock edge + + -- Vaihdetaan if-elsif-else case-lauseeksi + case WE_RE is + + when "10" => + -- Kirjoitus + if Fifo_Buffer (depth-1).Valid = '1' then + -- Fifo taynna, kirjoitus ei onnistu + Fifo_Buffer <= Fifo_Buffer; + assert false report "Cannot write to full fifo" severity note; + + else + -- Fifossa tilaa + --30.05 + -- !!! Huom jos tassa ei sijoita muihin paikkoihin vanhoja + -- arvoja, max. viive kasvaa!! + -- Esim. 50x1b (ilman sijoitusta) 1.5ns + -- 50x1b (sijoituksen kanssa) 0.88ns + -- be careful out there! + Fifo_Buffer <= Fifo_Buffer; --30.05 + Fifo_Buffer (depth-1).Valid <= '1'; --paikka kaytossa + Fifo_Buffer (depth-1).Data <= Data_In; + end if; + + + when "01" => + -- Luku + -- Shiftaus (isoista indekseista kohti indeksia nolla) + for i in 0 to depth-2 loop + Fifo_Buffer (i) <= Fifo_Buffer (i+1); + end loop; -- i + --ylin paikka tyhjenee + Fifo_Buffer (depth-1).Valid <= '0'; + Fifo_Buffer (depth-1).Data <= (others => '0'); --'Z'); + + + when "11" => + -- Seka kirjoitus etta luku + + if Fifo_Buffer (depth-1).Valid = '1' then + -- Fifo taynna, kirjoitus ei onnistu mutta luku onnistuu + -- Ylin (sisaantulo)paikka tyhjenee + Fifo_Buffer (depth-1).Data <= (others => '0'); --'Z'; + Fifo_Buffer (depth-1).Valid <= '0'; + else + -- Seka luku etta kirjoitus onnistuvat + Fifo_Buffer (depth-1).Valid <= '1'; --paikka kaytossa + Fifo_Buffer (depth-1).Data <= Data_In; + end if; + + -- Shiftataan joka tapauksessa (isoista indekseista kohti indeksia nolla) + for i in 0 to depth-2 loop + Fifo_Buffer (i) <= Fifo_Buffer (i+1); + end loop; -- i + + when others => + -- Ei tehda mitaan + Fifo_Buffer <= Fifo_Buffer; + end case; + end if; --rst/clk + end process Sync; + +end shift_reg; Index: trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Makefile =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Makefile (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synch_fifos/Makefile (revision 18) @@ -0,0 +1,118 @@ +# Generated by vmake version 2.0 + +# Define path to each library +LIB_IEEE = /opt/modeltech-5.7a/hppa64/../ieee +LIB_WORK = /tmp/kulmala3/Fifo_comparison/codelib +LIB_/TMP/KULMALA3/FIFO_COMPARISON/CODELIB = /tmp/kulmala3/Fifo_comparison/codelib + +# Define path to each design unit +IEEE-std_logic_unsigned = $(LIB_IEEE)/std_logic_unsigned/_primary.dat +IEEE-std_logic_1164 = $(LIB_IEEE)/std_logic_1164/_primary.dat +IEEE-std_logic_arith = $(LIB_IEEE)/std_logic_arith/_primary.dat +/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-tb_fifo_mixed_clocks2-behavioral = $(LIB_/TMP/KULMALA3/FIFO_COMPARISON/CODELIB)/tb_fifo_mixed_clocks2/behavioral.dat +/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-tb_fifo_mixed_clocks2 = $(LIB_/TMP/KULMALA3/FIFO_COMPARISON/CODELIB)/tb_fifo_mixed_clocks2/_primary.dat +/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-tb_fifo2-behavioral = $(LIB_/TMP/KULMALA3/FIFO_COMPARISON/CODELIB)/tb_fifo2/behavioral.dat +/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-tb_fifo2 = $(LIB_/TMP/KULMALA3/FIFO_COMPARISON/CODELIB)/tb_fifo2/_primary.dat +/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-tb_fifo1-behavioral = $(LIB_/TMP/KULMALA3/FIFO_COMPARISON/CODELIB)/tb_fifo1/behavioral.dat +/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-tb_fifo1 = $(LIB_/TMP/KULMALA3/FIFO_COMPARISON/CODELIB)/tb_fifo1/_primary.dat +/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-shift_slot-rtl = $(LIB_/TMP/KULMALA3/FIFO_COMPARISON/CODELIB)/shift_slot/rtl.dat +/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-shift_slot = $(LIB_/TMP/KULMALA3/FIFO_COMPARISON/CODELIB)/shift_slot/_primary.dat +/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-mixed_clocks_fifo-behavioral = $(LIB_/TMP/KULMALA3/FIFO_COMPARISON/CODELIB)/mixed_clocks_fifo/behavioral.dat +/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-mixed_clocks_fifo = $(LIB_/TMP/KULMALA3/FIFO_COMPARISON/CODELIB)/mixed_clocks_fifo/_primary.dat +/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-fifo-inout_mux = $(LIB_/TMP/KULMALA3/FIFO_COMPARISON/CODELIB)/fifo/inout_mux.dat +/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-fifo-in_mux = $(LIB_/TMP/KULMALA3/FIFO_COMPARISON/CODELIB)/fifo/in_mux.dat +/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-fifo-shift_reg = $(LIB_/TMP/KULMALA3/FIFO_COMPARISON/CODELIB)/fifo/shift_reg.dat +/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-fifo-slotted_shift_reg = $(LIB_/TMP/KULMALA3/FIFO_COMPARISON/CODELIB)/fifo/slotted_shift_reg.dat +/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-fifo-behavioral = $(LIB_/TMP/KULMALA3/FIFO_COMPARISON/CODELIB)/fifo/behavioral.dat +/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-fifo = $(LIB_/TMP/KULMALA3/FIFO_COMPARISON/CODELIB)/fifo/_primary.dat +/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-basic_cfg = $(LIB_/TMP/KULMALA3/FIFO_COMPARISON/CODELIB)/basic_cfg/_primary.dat +VCOM = vcom +VLOG = vlog + +whole_library : $(/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-tb_fifo_mixed_clocks2-behavioral) \ + $(/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-tb_fifo_mixed_clocks2) \ + $(/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-tb_fifo2-behavioral) \ + $(/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-tb_fifo2) \ + $(/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-tb_fifo1-behavioral) \ + $(/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-tb_fifo1) \ + $(/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-shift_slot-rtl) \ + $(/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-shift_slot) \ + $(/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-mixed_clocks_fifo-behavioral) \ + $(/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-mixed_clocks_fifo) \ + $(/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-fifo-inout_mux) \ + $(/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-fifo-in_mux) \ + $(/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-fifo-shift_reg) \ + $(/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-fifo-slotted_shift_reg) \ + $(/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-fifo-behavioral) \ + $(/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-fifo) \ + $(/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-basic_cfg) + +$(/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-fifo) \ +$(/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-fifo-behavioral) : Vhdl/fifo_casev4.vhdl \ + $(IEEE-std_logic_arith) \ + $(IEEE-std_logic_1164) + $(VCOM) -work /tmp/kulmala3/Fifo_comparison/codelib Vhdl/fifo_casev4.vhdl + +$(/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-fifo-slotted_shift_reg) : Vhdl/fifo_shift_slotted.vhdl \ + $(/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-shift_slot) \ + $(IEEE-std_logic_unsigned) \ + $(IEEE-std_logic_arith) \ + $(IEEE-std_logic_1164) \ + $(/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-fifo) + $(VCOM) -work /tmp/kulmala3/Fifo_comparison/codelib Vhdl/fifo_shift_slotted.vhdl + +$(/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-fifo-shift_reg) : Vhdl/fifo_shift.vhdl \ + $(IEEE-std_logic_unsigned) \ + $(IEEE-std_logic_arith) \ + $(IEEE-std_logic_1164) \ + $(/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-fifo) + $(VCOM) -work /tmp/kulmala3/Fifo_comparison/codelib Vhdl/fifo_shift.vhdl + +$(/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-fifo-in_mux) : Vhdl/fifo_im.vhdl \ + $(IEEE-std_logic_unsigned) \ + $(IEEE-std_logic_arith) \ + $(IEEE-std_logic_1164) \ + $(/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-fifo) + $(VCOM) -work /tmp/kulmala3/Fifo_comparison/codelib Vhdl/fifo_im.vhdl + +$(/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-fifo-inout_mux) : Vhdl/fifo_iom.vhdl \ + $(IEEE-std_logic_unsigned) \ + $(IEEE-std_logic_arith) \ + $(IEEE-std_logic_1164) \ + $(/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-fifo) + $(VCOM) -work /tmp/kulmala3/Fifo_comparison/codelib Vhdl/fifo_iom.vhdl + +$(/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-mixed_clocks_fifo) \ +$(/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-mixed_clocks_fifo-behavioral) : Vhdl/fifo_mixed_clocks.vhdl \ + $(IEEE-std_logic_arith) \ + $(IEEE-std_logic_1164) + $(VCOM) -work /tmp/kulmala3/Fifo_comparison/codelib Vhdl/fifo_mixed_clocks.vhdl + +$(/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-shift_slot) \ +$(/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-shift_slot-rtl) : Vhdl/shift_slot.vhdl \ + $(IEEE-std_logic_unsigned) \ + $(IEEE-std_logic_arith) \ + $(IEEE-std_logic_1164) + $(VCOM) -work /tmp/kulmala3/Fifo_comparison/codelib Vhdl/shift_slot.vhdl + +$(/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-tb_fifo1) \ +$(/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-tb_fifo1-behavioral) : Testbench/tb_fifo1.vhdl \ + $(/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-fifo) \ + $(IEEE-std_logic_arith) \ + $(IEEE-std_logic_1164) + $(VCOM) -work /tmp/kulmala3/Fifo_comparison/codelib Testbench/tb_fifo1.vhdl + +$(/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-tb_fifo2) \ +$(/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-tb_fifo2-behavioral) : Testbench/tb_fifo2.vhdl \ + $(/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-fifo) \ + $(IEEE-std_logic_arith) \ + $(IEEE-std_logic_1164) + $(VCOM) -work /tmp/kulmala3/Fifo_comparison/codelib Testbench/tb_fifo2.vhdl + +$(/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-basic_cfg) \ +$(/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-tb_fifo_mixed_clocks2) \ +$(/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-tb_fifo_mixed_clocks2-behavioral) : Testbench/tb_fifo_mixed_clocks2.vhdl \ + $(/TMP/KULMALA3/FIFO_COMPARISON/CODELIB-mixed_clocks_fifo) \ + $(IEEE-std_logic_arith) \ + $(IEEE-std_logic_1164) + $(VCOM) -work /tmp/kulmala3/Fifo_comparison/codelib Testbench/tb_fifo_mixed_clocks2.vhdl Index: trunk/TUT/ip.hwp.storage/fifos/synchronizer/Vhd/aif_read_in_burst.vhd =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synchronizer/Vhd/aif_read_in_burst.vhd (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synchronizer/Vhd/aif_read_in_burst.vhd (revision 18) @@ -0,0 +1,193 @@ +------------------------------------------------------------------------------- +-- Title : +-- Project : +------------------------------------------------------------------------------- +-- File : aif_read_in_burst +-- Author : kulmala3 +-- Created : 01.07.2005 +-- Last update: 28.07.2006 +-- Description: Input: regular fifo IF: output asynchronous ack/nack IF +-- +------------------------------------------------------------------------------- +-- Copyright (c) 2005 +------------------------------------------------------------------------------- +-- Revisions : +-- Date Version Author Description +-- 01.07.2005 1.0 AK Created +------------------------------------------------------------------------------- + + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; + +entity aif_read_in_burst is + generic ( + parity_g : integer := 0; -- do we send parity or no + burst_width_g : integer := 6; -- length = data_w/burst_w + data_width_g : integer := 36 + ); + port ( + clk : in std_logic; + rst_n : in std_logic; + empty_in : in std_logic; + re_out : out std_logic; + data_in : in std_logic_vector(data_width_g-1 downto 0); + data_out : out std_logic_vector(burst_width_g-1 downto 0); + a_we_out : out std_logic; + burst_out : out std_logic; + nack_in : in std_logic; + ack_in : in std_logic + + ); +end aif_read_in_burst; + +architecture rtl of aif_read_in_burst is + constant stages_c : integer := 2; -- only works with 2 now + signal ack_r : std_logic_vector(stages_c-1 downto 0); + signal nack_r : std_logic_vector(stages_c-1 downto 0); + + constant b_length_c : integer := data_width_g / burst_width_g; + + signal slow_cnt_r : integer range 0 to 15; -- slowdown counter + signal slow_value_r : integer range 0 to 15; -- slowdown counter + signal fail_cnt_r : integer range 0 to 1; -- two times we try to send per speed + signal a_we_l : std_logic; +-- signal full_r : std_logic; + + type data_vec_type is array (0 to b_length_c-1) of std_logic_vector(burst_width_g-1 downto 0); + signal data_slice : std_logic_vector(burst_width_g-1 downto 0); +-- signal datavec : data_vec_type; + signal slice_cnt_r : integer range 0 to b_length_c-1; + + signal ack_receiveid_r : std_logic; + signal nack_receiveid_r : std_logic; + + type send_state is (wait_data, send_burst, wait_ack, read_fifo); + signal ctrl_r : send_state; + + signal burst_r : std_logic; + +begin + + a_we_out <= a_we_l; + + data_out <= data_slice; + + burst_out <= burst_r; + + process (clk, rst_n) + begin -- process + if rst_n = '0' then -- asynchronous reset (active low) + a_we_l <= '0'; + re_out <= '0'; + ack_r <= (others => '0'); + nack_r <= (others => '0'); + slow_cnt_r <= 1; + slice_cnt_r <= 0; + fail_cnt_r <= 0; + ctrl_r <= wait_data; + slow_value_r <= 1; + ack_receiveid_r <= '0'; + nack_receiveid_r <= '0'; + burst_r <= '0'; + + elsif clk'event and clk = '1' then -- rising clock edge + for i in 0 to stages_c-2 loop + ack_r(i+1) <= ack_r(i); + nack_r(i+1) <= nack_r(i); + end loop; -- i + ack_r(0) <= ack_in; + nack_r(0) <= nack_in; + + ack_receiveid_r <= ack_receiveid_r or ((ack_r(stages_c-1) xor ack_r(stages_c-2))); + nack_receiveid_r <= nack_receiveid_r or ((nack_r(stages_c-1) xor nack_r(stages_c-2))); + + case ctrl_r is + when wait_data => + if empty_in = '1' then + ctrl_r <= wait_data; + else + -- data in HIBI FIFO, send it + a_we_l <= not a_we_l; + slow_cnt_r <= slow_value_r; + slice_cnt_r <= 0; + ctrl_r <= send_burst; + end if; + + when send_burst => +-- if slow_cnt_r = 1 then +-- slow_cnt_r <= slow_cnt_r-1; +-- if slice_cnt_r = b_length_c-1 then +-- ctrl_r <= wait_ack; +-- burst_r <= not burst_r; +-- slice_cnt_r <= 0; -- last one +-- else +-- slice_cnt_r <= slice_cnt_r+1; +-- end if; +-- elsif slow_cnt_r = 0 then +-- a_we_l <= not a_we_l; +-- slow_cnt_r <= slow_value_r; +-- else +-- slow_cnt_r <= slow_cnt_r-1; +-- end if; + + if slow_cnt_r = 0 then + a_we_l <= not a_we_l; + slow_cnt_r <= slow_value_r; + elsif slow_cnt_r = 1 then --slow_value_r then + + if slice_cnt_r = b_length_c-1 then + ctrl_r <= wait_ack; + burst_r <= not burst_r; + slice_cnt_r <= 0; -- last one + else + slice_cnt_r <= slice_cnt_r+1; + end if; + slow_cnt_r <= slow_cnt_r-1; + else + slow_cnt_r <= slow_cnt_r-1; + + end if; + + when wait_ack => + if ack_receiveid_r = '1' then + ack_receiveid_r <= '0'; + ctrl_r <= read_fifo; + re_out <= '1'; + end if; + + if nack_receiveid_r = '1' then + nack_receiveid_r <= '0'; + slow_value_r <= slow_value_r+1; + slow_cnt_r <= slow_value_r+1; + a_we_l <= not a_we_l; + ctrl_r <= send_burst; + slice_cnt_r <= 0; -- ha´s been for a while now + end if; + + when read_fifo => + re_out <= '0'; + ctrl_r <= wait_data; + + when others => null; + end case; + + + end if; + end process; + + + datamux : process (data_in, slice_cnt_r) + variable datavec : data_vec_type; + + begin -- process datamux + datavec(0) := data_in(burst_width_g-1 downto 0); + for i in 2 to b_length_c loop + datavec(i-1) := data_in(burst_width_g*(i)-1 downto burst_width_g*(i-1)); + end loop; -- i + data_slice <= datavec(slice_cnt_r); + end process datamux; + +end rtl; Index: trunk/TUT/ip.hwp.storage/fifos/synchronizer/Vhd/synch_fifo_pulse.vhd =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synchronizer/Vhd/synch_fifo_pulse.vhd (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synchronizer/Vhd/synch_fifo_pulse.vhd (revision 18) @@ -0,0 +1,71 @@ +------------------------------------------------------------------------------- +-- Title : Synchronizes two clock domains to a single clock FIFO +-- Project : +------------------------------------------------------------------------------- +-- File : synch_fifo_pulse.vhd +-- Author : kulmala3 +-- Created : 01.07.2005 +-- Last update: 01.07.2005 +-- Description: Generates a narrower pulse from a broader one, to read only one +-- data from a faster FIFO. +-- Should work at least when clk_fast is at least 2x clk_slow +-- tested on FPGA with clk_slow 50 and clk_fast 200 MHz +-- ASYNCHRONOUS INPUT/OUTPUT SIGNALS! +-- clk_slow: ____----____----____---- +-- clk_fast: -_-_-_-_-_-_-_-_-_-_-_-_ +-- re_in: __--------------------- +-- re_out: ____--________--______-- +------------------------------------------------------------------------------- +-- Copyright (c) 2005 +------------------------------------------------------------------------------- +-- Revisions : +-- Date Version Author Description +-- 01.07.2005 1.0 AK Created +------------------------------------------------------------------------------- + + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; + +entity synch_fifo_pulse is + + port ( + clk_slow : in std_logic; + clk_fast : in std_logic; + rst_n : in std_logic; + re_in : in std_logic; + re_out : out std_logic); + +end synch_fifo_pulse; + +architecture rtl of synch_fifo_pulse is + signal pulse_slow_r : std_logic; + signal pulse_fast_r : std_logic; + +begin -- rtl + + process (clk_slow, rst_n) + begin -- process + if rst_n = '0' then -- asynchronous reset (active low) + pulse_slow_r <= '0'; + + elsif clk_slow'event and clk_slow = '1' then -- rising clock edge + pulse_slow_r <= not pulse_slow_r; + end if; + end process; + + process (clk_fast, rst_n) + begin -- process + if rst_n = '0' then -- asynchronous reset (active low) + pulse_fast_r <= '0'; + + elsif clk_fast'event and clk_fast = '1' then -- rising clock edge + pulse_fast_r <= pulse_slow_r; + end if; + end process; + + re_out <= (pulse_fast_r xor pulse_slow_r) and re_in; + +end rtl; Index: trunk/TUT/ip.hwp.storage/fifos/synchronizer/Vhd/re_feeder.vhd =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synchronizer/Vhd/re_feeder.vhd (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synchronizer/Vhd/re_feeder.vhd (revision 18) @@ -0,0 +1,46 @@ +-- Simple block to test Synchronizer, no real testbench included. +-- tested on FPGA. + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; + +entity re_feeder is + generic ( + pulse_width_g : integer := 8 + ); + port ( + clk : in std_logic; + rst_n : in std_logic; + re_out : out std_logic + ); + +end re_feeder; + +architecture rtl of re_feeder is + signal counter_r : integer range 0 to pulse_width_g-1 ; + signal re_r : std_logic; +begin -- rtl + + re_out <= re_r; + + process (clk, rst_n) + begin -- process + if rst_n = '0' then -- asynchronous reset (active low) + counter_r <= 0; + re_r <= '0'; + + elsif clk'event and clk = '1' then -- rising clock edge + if counter_r = pulse_width_g-1 then + re_r <= not re_r; + counter_r <= 0; + else + re_r <= re_r; + counter_r <= counter_r+1; + end if; + end if; + end process; + + +end rtl; Index: trunk/TUT/ip.hwp.storage/fifos/synchronizer/Vhd/aif_read_out_burst.vhd =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synchronizer/Vhd/aif_read_out_burst.vhd (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synchronizer/Vhd/aif_read_out_burst.vhd (revision 18) @@ -0,0 +1,145 @@ +------------------------------------------------------------------------------- +-- Title : +-- Project : +------------------------------------------------------------------------------- +-- File : aif_read_out_burst +-- Author : kulmala3 +-- Created : 01.07.2005 +-- Last update: 05.01.2006 +-- Description: OUT: regular fifo IN: output asynchronous ack/nack IF +-- +------------------------------------------------------------------------------- +-- Copyright (c) 2005 +------------------------------------------------------------------------------- +-- Revisions : +-- Date Version Author Description +-- 01.07.2005 1.0 AK Created +------------------------------------------------------------------------------- + + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; + +entity aif_read_out_burst is + generic ( + parity_g : integer := 0; -- do we send parity or no + burst_width_g : integer := 6; -- length = data_w/burst_w + data_width_g : integer := 32 + ); + port ( + clk : in std_logic; + rst_n : in std_logic; + a_we_in : in std_logic; + ack_out : out std_logic; + nack_out : out std_logic; + empty_out : out std_logic; + re_in : in std_logic; + burst_in : in std_logic; + data_in : in std_logic_vector(burst_width_g-1 downto 0); + data_out : out std_logic_vector(data_width_g-1 downto 0) + + ); +end aif_read_out_burst; + +architecture rtl of aif_read_out_burst is + + constant stages_c : integer := 3; + constant ctrl_stages_c : integer := 2; -- burst + + constant b_length_c : integer := data_width_g / burst_width_g; + + signal ack_r : std_logic; + signal nack_r : std_logic; + -- synchronizer, last two are xorred + signal a_we_r : std_logic_vector(stages_c-1 downto 0); + + type in_data_type is array (0 to stages_c-1) of std_logic_vector(burst_width_g-1 downto 0); + signal in_data_r : in_data_type; + + signal data_r : std_logic_vector(data_width_g-1 downto 0); + + type data_vec_type is array (0 to b_length_c-1) of std_logic_vector(burst_width_g-1 downto 0); +-- signal data_slice : std_logic_vector(burst_width_g-1 downto 0); +-- signal datavec : data_vec_type; + signal slice_cnt_r : integer range 0 to b_length_c-1; + signal burst_r : std_logic_vector(stages_c-1 downto 0); + signal empty_r : std_logic; + signal data_ok_r : std_logic; + +begin + data_out <= data_r; + ack_out <= ack_r; + nack_out <= nack_r; + empty_out <= empty_r; + + process (clk, rst_n) + begin -- process + if rst_n = '0' then -- asynchronous reset (active low) + a_we_r <= (others => '0'); + ack_r <= '0'; + empty_r <= '1'; + slice_cnt_r <= 0; + nack_r <= '0'; + empty_r <= '1'; + for i in 0 to stages_c-1 loop + in_data_r(i) <= (others => '0'); + end loop; -- i + burst_r <= (others => '0'); + data_ok_r <= '0'; + + elsif clk'event and clk = '1' then -- rising clock edge + ack_r <= ack_r; + + for i in 0 to stages_c-2 loop + a_we_r(i+1) <= a_we_r(i); + in_data_r(i+1) <= in_data_r(i); + burst_r(i+1) <= burst_r(i); + end loop; -- i + + burst_r(0) <= burst_in; + a_we_r(0) <= a_we_in; + in_data_r(0) <= data_in; + + if (a_we_r(stages_c-1) xor a_we_r(stages_c-2)) = '1' then + -- slice cnt testaus! + + for i in 0 to b_length_c-1 loop + if i = slice_cnt_r then + data_r((i+1)*burst_width_g-1 downto burst_width_g*(i)) <= in_data_r(stages_c-2); + end if; + end loop; -- i + + if slice_cnt_r = b_length_c-1 then + empty_r <= '0'; + slice_cnt_r <= 0; + data_ok_r <= '1'; + else + empty_r <= '1'; + slice_cnt_r <= slice_cnt_r+1; + end if; + + end if; + + if (burst_r(stages_c-1) xor burst_r(stages_c-2)) = '1' then + if data_ok_r = '0' then + nack_r <= not nack_r; + empty_r <= '1'; + slice_cnt_r <= 0; + else + data_ok_r <= '0'; + end if; + end if; + + if re_in = '1' and empty_r = '0' then + -- acknowledge, stop writing + ack_r <= not ack_r; + empty_r <= '1'; + end if; + + + end if; + end process; + +end rtl; Index: trunk/TUT/ip.hwp.storage/fifos/synchronizer/Vhd/aif_we_in.vhd =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synchronizer/Vhd/aif_we_in.vhd (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synchronizer/Vhd/aif_we_in.vhd (revision 18) @@ -0,0 +1,82 @@ +------------------------------------------------------------------------------- +-- Title : +-- Project : +------------------------------------------------------------------------------- +-- File : +-- Author : kulmala3 +-- Created : 01.07.2005 +-- Last update: 10.01.2006 +-- Description: Input: regular fifo IF: output asynchronous ack/nack IF +-- +------------------------------------------------------------------------------- +-- Copyright (c) 2005 +------------------------------------------------------------------------------- +-- Revisions : +-- Date Version Author Description +-- 01.07.2005 1.0 AK Created +------------------------------------------------------------------------------- + + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; + +entity aif_we_in is + generic ( + data_width_g : integer := 32 + ); + port ( + clk : in std_logic; + rst_n : in std_logic; + we_in : in std_logic; + data_in : in std_logic_vector(data_width_g-1 downto 0); + data_out : out std_logic_vector(data_width_g-1 downto 0); + full_out : out std_logic; + a_we_out : out std_logic; -- must arrive after data! + ack_in : in std_logic -- actually, one clock cycle + ); -- more for data in rx +end aif_we_in; + +architecture rtl of aif_we_in is + constant stages_c : integer := 2; -- only works with 2 now + signal ack_r : std_logic_vector(stages_c-1 downto 0); + + signal a_we_l : std_logic; + signal data_r : std_logic_vector(data_width_g-1 downto 0); + signal full_r : std_logic; +begin + + a_we_out <= a_we_l; + + data_out <= data_r; + + process (clk, rst_n) + begin -- process + if rst_n = '0' then -- asynchronous reset (active low) + a_we_l <= '0'; + ack_r <= (others => '0'); + full_r <= '0'; +-- first_full_r <= '1'; +-- data_r <= (others => '0'); + + elsif clk'event and clk = '1' then -- rising clock edge + for i in 0 to stages_c-2 loop + ack_r(i+1) <= ack_r(i); + end loop; -- i + + ack_r(0) <= ack_in; + full_r <= (a_we_l xor ack_r(stages_c-1)); + if we_in = '1' and full_r = '0' then + a_we_l <= not a_we_l; + data_r <= data_in; + full_r <= '1'; -- react immediatelly + else + a_we_l <= a_we_l; + end if; + + end if; + end process; + + full_out <= full_r; +end rtl; Index: trunk/TUT/ip.hwp.storage/fifos/synchronizer/Vhd/aif_read_in.vhd =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synchronizer/Vhd/aif_read_in.vhd (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synchronizer/Vhd/aif_read_in.vhd (revision 18) @@ -0,0 +1,85 @@ +------------------------------------------------------------------------------- +-- Title : +-- Project : +------------------------------------------------------------------------------- +-- File : latch synch +-- Author : kulmala3 +-- Created : 01.07.2005 +-- Last update: 17.02.2006 +-- Description: Input: regular fifo IF: output asynchronous ack/nack IF +-- +------------------------------------------------------------------------------- +-- Copyright (c) 2005 +------------------------------------------------------------------------------- +-- Revisions : +-- Date Version Author Description +-- 01.07.2005 1.0 AK Created +------------------------------------------------------------------------------- + + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; + +entity aif_read_in is + generic ( + data_width_g : integer := 32 + ); + port ( + clk : in std_logic; + rst_n : in std_logic; + empty_in : in std_logic; + re_out : out std_logic; + data_in : in std_logic_vector(data_width_g-1 downto 0); + data_out : out std_logic_vector(data_width_g-1 downto 0); + a_we_out : out std_logic; + ack_in : in std_logic + ); +end aif_read_in; + +architecture rtl of aif_read_in is + constant stages_c : integer := 2; -- only works with 2 now + signal ack_r : std_logic_vector(stages_c-1 downto 0); + + + signal a_we_l : std_logic; + signal data_r : std_logic_vector(data_width_g-1 downto 0); + signal full_r : std_logic; +begin + + a_we_out <= a_we_l; + + data_out <= data_r; + + process (clk, rst_n) + begin -- process + if rst_n = '0' then -- asynchronous reset (active low) + a_we_l <= '0'; + re_out <= '0'; + ack_r <= (others => '0'); + full_r <= '0'; + + elsif clk'event and clk = '1' then -- rising clock edge + for i in 0 to stages_c-2 loop + ack_r(i+1) <= ack_r(i); + end loop; -- i + ack_r(0) <= ack_in; + full_r <= (a_we_l xor ack_r(stages_c-1)); + + if empty_in = '0' and full_r = '0' then + a_we_l <= not a_we_l; + re_out <= '1'; + data_r <= data_in; + full_r <= '1'; + else + re_out <= '0'; + a_we_l <= a_we_l; + end if; + + end if; + end process; + +-- full_r <= (a_we_l xor ack_in); +-- full_out <= full; +end rtl; Index: trunk/TUT/ip.hwp.storage/fifos/synchronizer/Vhd/aif_we_out.vhd =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synchronizer/Vhd/aif_we_out.vhd (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synchronizer/Vhd/aif_we_out.vhd (revision 18) @@ -0,0 +1,95 @@ +------------------------------------------------------------------------------- +-- Title : +-- Project : +------------------------------------------------------------------------------- +-- File : latch synch +-- Author : kulmala3 +-- Created : 01.07.2005 +-- Last update: 05.01.2006 +-- Description: OUT: regular fifo IN: output asynchronous ack/nack IF +-- +------------------------------------------------------------------------------- +-- Copyright (c) 2005 +------------------------------------------------------------------------------- +-- Revisions : +-- Date Version Author Description +-- 01.07.2005 1.0 AK Created +------------------------------------------------------------------------------- + + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; + +entity aif_we_out is + generic ( + data_width_g : integer := 32 + ); + port ( + clk : in std_logic; + rst_n : in std_logic; + a_we_in : in std_logic; + ack_out : out std_logic; + we_out : out std_logic; + data_in : in std_logic_vector(data_width_g-1 downto 0); + data_out : out std_logic_vector(data_width_g-1 downto 0); + + full_in : in std_logic + ); +end aif_we_out; + +architecture rtl of aif_we_out is + + constant stages_c : integer := 3; + + signal ack_r : std_logic; + signal received_data_r : std_logic; + -- synchronizer, last two are xorred + signal a_we_r : std_logic_vector(stages_c-1 downto 0); + signal data_r : std_logic_vector(data_width_g-1 downto 0); + +begin + data_out <= data_r; +-- ack_out <= ack_r; + + process (clk, rst_n) + begin -- process + if rst_n = '0' then -- asynchronous reset (active low) + a_we_r <= (others => '0'); + ack_r <= '0'; + ack_out <= '0'; + we_out <= '0'; + received_data_r <= '0'; + + elsif clk'event and clk = '1' then -- rising clock edge + + for i in 0 to stages_c-2 loop + a_we_r(i+1) <= a_we_r(i); + end loop; -- i + + a_we_r(0) <= a_we_in; + + -- now wait until we can write it to fifo + + if (a_we_r(stages_c-1) xor a_we_r(stages_c-2)) = '1' then + ack_r <= not ack_r; + received_data_r <= '1'; + we_out <= '1'; + data_r <= data_in; + else + ack_r <= ack_r; + end if; + + if full_in = '0' and received_data_r = '1' then + -- acknowledge, stop writing + ack_out <= ack_r; + we_out <= '0'; + received_data_r <= '0'; + end if; + + + end if; + end process; + +end rtl; Index: trunk/TUT/ip.hwp.storage/fifos/synchronizer/Vhd/aif_read_out.vhd =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synchronizer/Vhd/aif_read_out.vhd (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synchronizer/Vhd/aif_read_out.vhd (revision 18) @@ -0,0 +1,94 @@ +------------------------------------------------------------------------------- +-- Title : +-- Project : +------------------------------------------------------------------------------- +-- File : latch synch +-- Author : kulmala3 +-- Created : 01.07.2005 +-- Last update: 05.01.2006 +-- Description: OUT: regular fifo IN: output asynchronous ack/nack IF +-- +------------------------------------------------------------------------------- +-- Copyright (c) 2005 +------------------------------------------------------------------------------- +-- Revisions : +-- Date Version Author Description +-- 01.07.2005 1.0 AK Created +------------------------------------------------------------------------------- + + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; + +entity aif_read_out is + generic ( + data_width_g : integer := 32 + ); + port ( + clk : in std_logic; + rst_n : in std_logic; + a_we_in : in std_logic; + ack_out : out std_logic; + empty_out : out std_logic; + re_in : in std_logic; + data_in : in std_logic_vector(data_width_g-1 downto 0); + data_out : out std_logic_vector(data_width_g-1 downto 0) + + ); +end aif_read_out; + +architecture rtl of aif_read_out is + + constant stages_c : integer := 3; + + signal ack_r : std_logic; + signal received_data_r : std_logic; + -- synchronizer, last two are xorred + signal a_we_r : std_logic_vector(stages_c-1 downto 0); + signal data_r : std_logic_vector(data_width_g-1 downto 0); +begin + data_out <= data_r; +-- ack_out <= ack_r; + + process (clk, rst_n) + begin -- process + if rst_n = '0' then -- asynchronous reset (active low) + a_we_r <= (others => '0'); + ack_r <= '0'; + ack_out <= '0'; + received_data_r <= '0'; + empty_out <= '1'; + + elsif clk'event and clk = '1' then -- rising clock edge + + for i in 0 to stages_c-2 loop + a_we_r(i+1) <= a_we_r(i); + end loop; -- i + + a_we_r(0) <= a_we_in; + + -- now wait until we can write it to fifo + + if (a_we_r(stages_c-1) xor a_we_r(stages_c-2)) = '1' then + ack_r <= not ack_r; + received_data_r <= '1'; + data_r <= data_in; + empty_out <= '0'; + else + ack_r <= ack_r; + end if; + + if re_in = '1' and received_data_r = '1' then + -- acknowledge, stop writing + ack_out <= ack_r; + empty_out <= '1'; + received_data_r <= '0'; + end if; + + + end if; + end process; + +end rtl; Index: trunk/TUT/ip.hwp.storage/fifos/synchronizer/Vhd/asyn_re_fifo.vhd =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synchronizer/Vhd/asyn_re_fifo.vhd (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synchronizer/Vhd/asyn_re_fifo.vhd (revision 18) @@ -0,0 +1,127 @@ +------------------------------------------------------------------------------- +-- Title : asyn re fifo +-- Project : +------------------------------------------------------------------------------- +-- File : asyn_re_fifo.vhd +-- Author : kulmala3 +-- Created : 13.06.2006 +-- Last update: 13.06.2006 +-- Description: A FIFO with synchronous write interface and asynchronous +-- signaling for RX +------------------------------------------------------------------------------- +-- Copyright (c) 2006 +------------------------------------------------------------------------------- +-- Revisions : +-- Date Version Author Description +-- 13.06.2006 1.0 AK Created +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; + + +entity asyn_re_fifo is + generic ( + depth_g : integer := 5; + data_width_g : integer := 32 + ); + port ( + clk : in std_logic; + rst_n : in std_logic; + -- regular fifo + data_in : in std_logic_vector (data_width_g-1 downto 0); + we_in : in std_logic; + full_out : out std_logic; + -- asyn IF + data_out : out std_logic_vector (data_width_g-1 downto 0); + ack_in : in std_logic; + a_we_out : out std_logic + + ); +end asyn_re_fifo; + + +architecture structural of asyn_re_fifo is + + component aif_read_in + generic ( + data_width_g : integer); + port ( + clk : in std_logic; + rst_n : in std_logic; + empty_in : in std_logic; + re_out : out std_logic; + data_in : in std_logic_vector(data_width_g-1 downto 0); + data_out : out std_logic_vector(data_width_g-1 downto 0); + a_we_out : out std_logic; + ack_in : in std_logic); + end component; + + signal empty_to_read_in : std_logic; + signal re_from_read_in : std_logic; + signal data_to_read_in : std_logic_vector(data_width_g-1 downto 0); + signal data_from_read_in : std_logic_vector(data_width_g-1 downto 0); + signal a_we_from_read_in : std_logic; + signal ack_to_read_in : std_logic; + + component fifo + generic ( + data_width_g : integer; + depth_g : integer); + port ( + clk : in std_logic; + rst_n : in std_logic; + data_in : in std_logic_vector (data_width_g-1 downto 0); + we_in : in std_logic; + full_out : out std_logic; + one_p_out : out std_logic; + re_in : in std_logic; + data_out : out std_logic_vector (data_width_g-1 downto 0); + empty_out : out std_logic; + one_d_out : out std_logic); + end component; + + + +begin + + aif_read_in_1 : aif_read_in + generic map ( + data_width_g => data_width_g) + port map ( + clk => clk, + rst_n => rst_n, + + empty_in => empty_to_read_in, + re_out => re_from_read_in, + data_in => data_to_read_in, + + data_out => data_out, + a_we_out => a_we_out, + ack_in => ack_in + ); + + fifo_1 : fifo + generic map ( + data_width_g => data_width_g, + depth_g => depth_g) + port map ( + clk => clk, + rst_n => rst_n, + + data_in => data_in, + we_in => we_in, + full_out => full_out, + +-- one_p_out => one_p_out, +-- one_d_out => one_d_out, + + re_in => re_from_read_in, + data_out => data_to_read_in, + empty_out => empty_to_read_in + ); + + +end structural; Index: trunk/TUT/ip.hwp.storage/fifos/synchronizer/Vhd/ext_data_synch_v2.vhd =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synchronizer/Vhd/ext_data_synch_v2.vhd (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synchronizer/Vhd/ext_data_synch_v2.vhd (revision 18) @@ -0,0 +1,227 @@ +------------------------------------------------------------------------------- +-- Title : Off-chip data bus for same clock frequencies at different phase +-- Project : +------------------------------------------------------------------------------- +-- File : ext_data_synch.vhd +-- Author : +-- Created : 11.08.2006 +-- Last update: 07.08.2007 +-- Description: REQUIRES THE SAME CLOCK FREQUENCIES FROM BOTH ENDS! +-- Possible hazard in empty: not synchronized. maybe change it later if errors +-- occure. +------------------------------------------------------------------------------- +-- Copyright (c) 2006 +------------------------------------------------------------------------------- +-- Revisions : +-- Date Version Author Description +-- 11.08.2006 1.0 AK Created +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; + +entity ext_data_synch is + + generic ( + sync_freq_g : integer := 1; + bus_freq_g : integer := 1; + data_width_g : integer := 4; + depth_g : integer := 10 -- FIFO size & max transfer size + ); + + port ( + + clk_re : in std_logic; + clk_we : in std_logic; + rst_n : in std_logic; + + tx_data_in : in std_logic_vector(data_width_g-1 downto 0); + tx_empty_in : in std_logic; + tx_re_out : out std_logic; + + rx_re_in : in std_logic; + rx_data_out : out std_logic_vector(data_width_g-1 downto 0); + rx_empty_out : out std_logic; + + a_empty_in : in std_logic; + a_empty_out : out std_logic; + a_we_out : out std_logic; + a_we_in : in std_logic; + a_data_out : out std_logic_vector(data_width_g-1 downto 0); + a_data_in : in std_logic_vector(data_width_g-1 downto 0) + ); + +end ext_data_synch; + +architecture rtl of ext_data_synch is + constant stable_period_c : integer := 3; -- stable for n clock cycles. + -- works with 3 in FPGA. + constant n_data_on_lines_c : integer := 10; -- amount of data packets that may be + -- travelling currently to the other side. used to approximate the rquired + -- FIFO depth (depth_g+n_data_on_lines_c = fifo depth) + + -- tx signals + signal a_we_out_r : std_logic; + signal data_cnt_r : integer range depth_g downto 0; + signal stable_cnt_r : integer range stable_period_c-1 downto 0; + signal a_data_out_r : std_logic_vector(data_width_g-1 downto 0); + signal a_empty_in_r : std_logic_vector(1 downto 0); + --rx signals + signal a_we_in_r : std_logic_vector(1 downto 0); + signal read_in : std_logic; + + signal rx_fifo_data_in : std_logic_vector (data_width_g-1 downto 0); + signal rx_fifo_we_in : std_logic; + signal rx_fifo_full_out : std_logic; +-- signal rx_fifo_re_in : std_logic; +-- signal rx_fifo_data_out : std_logic_vector (data_width_g-1 downto 0); + signal rx_fifo_empty_out : std_logic; + + -- receiving FIFO + component multiclk_fifo + generic ( + re_freq_g : integer; + we_freq_g : integer; + depth_g : integer; + data_width_g : integer); + port ( + clk_re : in std_logic; + clk_we : in std_logic; + rst_n : in std_logic; + data_in : in std_logic_vector (data_width_g-1 downto 0); + we_in : in std_logic; + full_out : out std_logic; + one_p_out : out std_logic; + re_in : in std_logic; + data_out : out std_logic_vector (data_width_g-1 downto 0); + empty_out : out std_logic; + one_d_out : out std_logic); + end component; + +-- component fifo +-- generic ( +-- data_width_g : integer; +-- depth_g : integer); +-- port ( +-- clk : in std_logic; +-- rst_n : in std_logic; +-- data_in : in std_logic_vector (data_width_g-1 downto 0); +-- we_in : in std_logic; +-- full_out : out std_logic; +-- one_p_out : out std_logic; +-- re_in : in std_logic; +-- data_out : out std_logic_vector (data_width_g-1 downto 0); +-- empty_out : out std_logic; +-- one_d_out : out std_logic); +-- end component; + + type tx_states is (send, keep_stable); + signal tx_ctrl_r : tx_states; + +begin -- rtl + + -- purpose: tx side of the block + a_data_out <= a_data_out_r; + a_we_out <= a_we_out_r; + + process (clk_we, rst_n) + begin -- process + if rst_n = '0' then -- asynchronous reset (active low) + a_we_out_r <= '0'; + data_cnt_r <= 0; -- could also be depth_g + tx_ctrl_r <= send; + stable_cnt_r <= 0; + a_data_out_r <= (others => '0'); + tx_re_out <= '0'; + a_empty_in_r <= (others => '0'); + + elsif clk_we'event and clk_we = '1' then -- rising clock edge + a_empty_in_r(0) <= a_empty_in; + a_empty_in_r(1) <= a_empty_in_r(0); + case tx_ctrl_r is + when send => + if tx_empty_in = '0' and (a_empty_in_r(1) = '1' or data_cnt_r /= 0) then + a_data_out_r <= tx_data_in; + tx_re_out <= '1'; + a_we_out_r <= not a_we_out_r; + tx_ctrl_r <= keep_stable; + stable_cnt_r <= stable_period_c-1; + if a_empty_in_r(1) = '1' then + data_cnt_r <= depth_g; + else + data_cnt_r <= data_cnt_r-1; + end if; + + else + tx_re_out <= '0'; + end if; + + when keep_stable => + a_data_out_r <= a_data_out_r; + a_we_out_r <= a_we_out_r; + tx_re_out <= '0'; + if stable_cnt_r /= 0 then + stable_cnt_r <= stable_cnt_r-1; + else + tx_ctrl_r <= send; + stable_cnt_r <= stable_period_c-1; + end if; + + end case; + + end if; + end process; + + + read_in <= a_we_in_r(1) xor a_we_in_r(0); + -- purpose: rx side of the block + process (clk_we, rst_n) + begin -- process + if rst_n = '0' then -- asynchronous reset (active low) + a_we_in_r <= (others => '0'); + rx_fifo_we_in <= '0'; + + elsif clk_we'event and clk_we = '1' then -- rising clock edge + -- if FIFO is full, we are anyway screwed, no reason to check it... + a_we_in_r(0) <= a_we_in; + a_we_in_r(1) <= a_we_in_r(0); + if read_in = '1' then + rx_fifo_data_in <= a_data_in; + rx_fifo_we_in <= '1'; + assert rx_fifo_full_out = '0' report "Writing to full FIFO!!" severity error; + else + rx_fifo_we_in <= '0'; + end if; + end if; + end process; + + fifo_1 : multiclk_fifo + generic map ( + re_freq_g => sync_freq_g, + we_freq_g => sync_freq_g, + data_width_g => data_width_g, + depth_g => depth_g+n_data_on_lines_c) + port map ( + + clk_we => clk_we, + clk_re => clk_we, + rst_n => rst_n, + + data_in => rx_fifo_data_in, + we_in => rx_fifo_we_in, + full_out => rx_fifo_full_out, + +-- one_p_out => one_p_out, + re_in => rx_re_in, + data_out => rx_data_out, + empty_out => rx_fifo_empty_out +-- one_d_out => one_d_out + ); + + rx_empty_out <= rx_fifo_empty_out; + a_empty_out <= rx_fifo_empty_out; + +end rtl; + Index: trunk/TUT/ip.hwp.storage/fifos/synchronizer/Vhd/aif_we_top.vhd =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synchronizer/Vhd/aif_we_top.vhd (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synchronizer/Vhd/aif_we_top.vhd (revision 18) @@ -0,0 +1,122 @@ +------------------------------------------------------------------------------- +-- Title : +-- Project : +------------------------------------------------------------------------------- +-- File : +-- Author : +-- Created : 04.01.2006 +-- Last update: 24.02.2006 +-- Description: +------------------------------------------------------------------------------- +-- Copyright (c) 2006 +------------------------------------------------------------------------------- +-- Revisions : +-- Date Version Author Description +-- 04.01.2006 1.0 AK Created +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; +------------------------------------------------------------------------------- + +entity aif_we_top is + generic ( + data_width_g : integer := 32 + ); + port ( + tx_clk : in std_logic; + tx_rst_n : in std_logic; + tx_we_in : in std_logic; + tx_data_in : in std_logic_vector(data_width_g-1 downto 0); + tx_full_out : out std_logic; + + rx_clk : in std_logic; + rx_rst_n : in std_logic; + rx_full_in : in std_logic; + rx_we_out : out std_logic; + rx_data_out : out std_logic_vector(data_width_g-1 downto 0) + + ); + +end aif_we_top; + +------------------------------------------------------------------------------- + +architecture structural of aif_we_top is + + component aif_we_out + generic ( + data_width_g : integer := 32 + ); + port ( + clk : in std_logic; + rst_n : in std_logic; + a_we_in : in std_logic; + ack_out : out std_logic; + we_out : out std_logic; + data_in : in std_logic_vector(data_width_g-1 downto 0); + data_out : out std_logic_vector(data_width_g-1 downto 0); + full_in : in std_logic); + end component; + + -- component ports + signal ack_from_rx : std_logic; +-- signal we_from_rx : std_logic; +-- signal data_from_rx : std_logic_vector(data_width_g-1 downto 0); + + component aif_we_in + generic ( + data_width_g : integer); + port ( + clk : in std_logic; + rst_n : in std_logic; + we_in : in std_logic; + data_in : in std_logic_vector(data_width_g-1 downto 0); + data_out : out std_logic_vector(data_width_g-1 downto 0); + full_out : out std_logic; + a_we_out : out std_logic; + ack_in : in std_logic + ); + end component; + + signal data_from_tx : std_logic_vector(data_width_g-1 downto 0); +-- signal full_from_tx : std_logic; + signal a_we_from_tx : std_logic; + +begin -- structural + + -- component instantiation + DUT : aif_we_out + generic map ( + data_width_g => data_width_g) + port map ( + clk => rx_clk, + rst_n => rx_rst_n, + a_we_in => a_we_from_tx, + ack_out => ack_from_rx, + data_in => data_from_tx, + data_out => rx_data_out, + we_out => rx_we_out, + full_in => rx_full_in + ); + + asynch_if_tx_1 : aif_we_in + generic map ( + data_width_g => data_width_g) + port map ( + clk => tx_clk, + rst_n => tx_rst_n, + we_in => tx_we_in, + data_in => tx_data_in, + data_out => data_from_tx, + full_out => tx_full_out, + a_we_out => a_we_from_tx, + ack_in => ack_from_rx + ); + + +end structural; + +------------------------------------------------------------------------------- Index: trunk/TUT/ip.hwp.storage/fifos/synchronizer/Vhd/aif_read_top.vhd =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synchronizer/Vhd/aif_read_top.vhd (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synchronizer/Vhd/aif_read_top.vhd (revision 18) @@ -0,0 +1,124 @@ +------------------------------------------------------------------------------- +-- Title : +-- Project : +------------------------------------------------------------------------------- +-- File : +-- Author : +-- Created : 04.01.2006 +-- Last update: 04.01.2006 +-- Description: +------------------------------------------------------------------------------- +-- Copyright (c) 2006 +------------------------------------------------------------------------------- +-- Revisions : +-- Date Version Author Description +-- 04.01.2006 1.0 AK Created +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; +------------------------------------------------------------------------------- + +entity aif_read_top is + generic ( + data_width_g : integer := 32 + ); + port ( + tx_clk : in std_logic; + tx_rst_n : in std_logic; + tx_data_in : in std_logic_vector(data_width_g-1 downto 0); + tx_empty_in : in std_logic; + tx_re_out : out std_logic; + + rx_clk : in std_logic; + rx_rst_n : in std_logic; + rx_empty_out : out std_logic; + rx_re_in : in std_logic; + + rx_data_out : out std_logic_vector(data_width_g-1 downto 0) + + ); + +end aif_read_top; + +------------------------------------------------------------------------------- + +architecture structural of aif_read_top is + + component aif_read_out + generic ( + data_width_g : integer := 32 + ); + port ( + clk : in std_logic; + rst_n : in std_logic; + a_we_in : in std_logic; + ack_out : out std_logic; + empty_out : out std_logic; + re_in : in std_logic; + data_in : in std_logic_vector(data_width_g-1 downto 0); + data_out : out std_logic_vector(data_width_g-1 downto 0) + ); + end component; + + -- component ports + signal ack_from_rx : std_logic; +-- signal we_from_rx : std_logic; +-- signal data_from_rx : std_logic_vector(data_width_g-1 downto 0); + + component aif_read_in + generic ( + data_width_g : integer); + port ( + clk : in std_logic; + rst_n : in std_logic; + empty_in : in std_logic; + re_out : out std_logic; + data_in : in std_logic_vector(data_width_g-1 downto 0); + data_out : out std_logic_vector(data_width_g-1 downto 0); + a_we_out : out std_logic; + ack_in : in std_logic + ); + end component; + + signal data_from_tx : std_logic_vector(data_width_g-1 downto 0); + signal full_from_tx : std_logic; + signal a_we_from_tx : std_logic; + +begin -- structural + + -- component instantiation + DUT : aif_read_out + generic map ( + data_width_g => data_width_g) + port map ( + clk => rx_clk, + rst_n => rx_rst_n, + a_we_in => a_we_from_tx, + ack_out => ack_from_rx, + data_in => data_from_tx, + data_out => rx_data_out, + empty_out => rx_empty_out, + re_in => rx_re_in + ); + + aif_read_in_1 : aif_read_in + generic map ( + data_width_g => data_width_g) + port map ( + clk => tx_clk, + rst_n => tx_rst_n, + empty_in => tx_empty_in, + data_in => tx_data_in, + data_out => data_from_tx, + re_out => tx_re_out, + a_we_out => a_we_from_tx, + ack_in => ack_from_rx + ); + + +end structural; + +------------------------------------------------------------------------------- Index: trunk/TUT/ip.hwp.storage/fifos/synchronizer/Vhd/ext_data_synch.vhd =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synchronizer/Vhd/ext_data_synch.vhd (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synchronizer/Vhd/ext_data_synch.vhd (revision 18) @@ -0,0 +1,199 @@ +------------------------------------------------------------------------------- +-- Title : Off-chip data bus for same clock frequencies at different phase +-- Project : +------------------------------------------------------------------------------- +-- File : ext_data_synch.vhd +-- Author : +-- Created : 11.08.2006 +-- Last update: 15.08.2006 +-- Description: REQUIRES THE SAME CLOCK FREQUENCIES FROM BOTH ENDS! +-- Possible hazard in empty: not synchronized. maybe change it later if errors +-- occure. +------------------------------------------------------------------------------- +-- Copyright (c) 2006 +------------------------------------------------------------------------------- +-- Revisions : +-- Date Version Author Description +-- 11.08.2006 1.0 AK Created +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; + +entity ext_data_synch is + + generic ( + data_width_g : integer := 4; + depth_g : integer := 10 -- FIFO size & max transfer size + ); + + port ( + clk : in std_logic; + rst_n : in std_logic; + + tx_data_in : in std_logic_vector(data_width_g-1 downto 0); + tx_empty_in : in std_logic; + tx_re_out : out std_logic; + + rx_re_in : in std_logic; + rx_data_out : out std_logic_vector(data_width_g-1 downto 0); + rx_empty_out : out std_logic; + + a_empty_in : in std_logic; + a_empty_out : out std_logic; + a_we_out : out std_logic; + a_we_in : in std_logic; + a_data_out : out std_logic_vector(data_width_g-1 downto 0); + a_data_in : in std_logic_vector(data_width_g-1 downto 0) + ); + +end ext_data_synch; + +architecture rtl of ext_data_synch is + constant stable_period_c : integer := 3; -- stable for n clock cycles. + -- works with 3 in FPGA. + constant n_data_on_lines_c : integer := 10; -- amount of data packets that may be + -- travelling currently to the other side. used to approximate the rquired + -- FIFO depth (depth_g+n_data_on_lines_c = fifo depth) + + -- tx signals + signal a_we_out_r : std_logic; + signal data_cnt_r : integer range depth_g downto 0; + signal stable_cnt_r : integer range stable_period_c-1 downto 0; + signal a_data_out_r : std_logic_vector(data_width_g-1 downto 0); + signal a_empty_in_r : std_logic_vector(1 downto 0); + --rx signals + signal a_we_in_r : std_logic_vector(1 downto 0); + signal read_in : std_logic; + + signal rx_fifo_data_in : std_logic_vector (data_width_g-1 downto 0); + signal rx_fifo_we_in : std_logic; + signal rx_fifo_full_out : std_logic; +-- signal rx_fifo_re_in : std_logic; +-- signal rx_fifo_data_out : std_logic_vector (data_width_g-1 downto 0); + signal rx_fifo_empty_out : std_logic; + + -- receiving FIFO + component fifo + generic ( + data_width_g : integer; + depth_g : integer); + port ( + clk : in std_logic; + rst_n : in std_logic; + data_in : in std_logic_vector (data_width_g-1 downto 0); + we_in : in std_logic; + full_out : out std_logic; + one_p_out : out std_logic; + re_in : in std_logic; + data_out : out std_logic_vector (data_width_g-1 downto 0); + empty_out : out std_logic; + one_d_out : out std_logic); + end component; + + type tx_states is (send, keep_stable); + signal tx_ctrl_r : tx_states; + +begin -- rtl + + -- purpose: tx side of the block + a_data_out <= a_data_out_r; + a_we_out <= a_we_out_r; + + process (clk, rst_n) + begin -- process + if rst_n = '0' then -- asynchronous reset (active low) + a_we_out_r <= '0'; + data_cnt_r <= 0; -- could also be depth_g + tx_ctrl_r <= send; + stable_cnt_r <= 0; + a_data_out_r <= (others => '0'); + tx_re_out <= '0'; + a_empty_in_r <= (others => '0'); + + elsif clk'event and clk = '1' then -- rising clock edge + a_empty_in_r(0) <= a_empty_in; + a_empty_in_r(1) <= a_empty_in_r(0); + case tx_ctrl_r is + when send => + if tx_empty_in = '0' and (a_empty_in_r(1) = '1' or data_cnt_r /= 0) then + a_data_out_r <= tx_data_in; + tx_re_out <= '1'; + a_we_out_r <= not a_we_out_r; + tx_ctrl_r <= keep_stable; + stable_cnt_r <= stable_period_c-1; + if a_empty_in_r(1) = '1' then + data_cnt_r <= depth_g; + else + data_cnt_r <= data_cnt_r-1; + end if; + + else + tx_re_out <= '0'; + end if; + + when keep_stable => + a_data_out_r <= a_data_out_r; + a_we_out_r <= a_we_out_r; + tx_re_out <= '0'; + if stable_cnt_r /= 0 then + stable_cnt_r <= stable_cnt_r-1; + else + tx_ctrl_r <= send; + stable_cnt_r <= stable_period_c-1; + end if; + + end case; + + end if; + end process; + + + read_in <= a_we_in_r(1) xor a_we_in_r(0); + -- purpose: rx side of the block + process (clk, rst_n) + begin -- process + if rst_n = '0' then -- asynchronous reset (active low) + a_we_in_r <= (others => '0'); + rx_fifo_we_in <= '0'; + + elsif clk'event and clk = '1' then -- rising clock edge + -- if FIFO is full, we are anyway screwed, no reason to check it... + a_we_in_r(0) <= a_we_in; + a_we_in_r(1) <= a_we_in_r(0); + if read_in = '1' then + rx_fifo_data_in <= a_data_in; + rx_fifo_we_in <= '1'; + assert rx_fifo_full_out = '0' report "Writing to full FIFO!!" severity error; + else + rx_fifo_we_in <= '0'; + end if; + end if; + end process; + + fifo_1 : fifo + generic map ( + data_width_g => data_width_g, + depth_g => depth_g+n_data_on_lines_c) + port map ( + clk => clk, + rst_n => rst_n, + + data_in => rx_fifo_data_in, + we_in => rx_fifo_we_in, + full_out => rx_fifo_full_out, + +-- one_p_out => one_p_out, + re_in => rx_re_in, + data_out => rx_data_out, + empty_out => rx_fifo_empty_out +-- one_d_out => one_d_out + ); + + rx_empty_out <= rx_fifo_empty_out; + a_empty_out <= rx_fifo_empty_out; + +end rtl; + Index: trunk/TUT/ip.hwp.storage/fifos/synchronizer/Tb/tb_aif_we_top.vhd =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synchronizer/Tb/tb_aif_we_top.vhd (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synchronizer/Tb/tb_aif_we_top.vhd (revision 18) @@ -0,0 +1,214 @@ +------------------------------------------------------------------------------- +-- Title : Testbench for design "aif_we_top_s" +-- Project : +------------------------------------------------------------------------------- +-- File : tb_aif_we_top_send.vhd +-- Author : +-- Created : 04.01.2006 +-- Last update: 17.02.2006 +-- Description: +------------------------------------------------------------------------------- +-- Copyright (c) 2006 +------------------------------------------------------------------------------- +-- Revisions : +-- Date Version Author Description +-- 04.01.2006 1.0 AK Created +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; +use work.txt_util.all; +------------------------------------------------------------------------------- + +entity tb_aif_we_top is + +end tb_aif_we_top; + +------------------------------------------------------------------------------- + +architecture rtl of tb_aif_we_top is + + component aif_we_out + generic ( + data_width_g : integer := 32 + ); + port ( + clk : in std_logic; + rst_n : in std_logic; + a_we_in : in std_logic; + ack_out : out std_logic; + we_out : out std_logic; + data_in : in std_logic_vector(data_width_g-1 downto 0); + data_out : out std_logic_vector(data_width_g-1 downto 0); + full_in : in std_logic); + end component; + + constant data_width_g : integer := 32; + + -- component ports + signal clk : std_logic; + signal rst_n : std_logic; + signal ack_from_rx : std_logic; + signal we_from_rx : std_logic; + signal data_from_rx : std_logic_vector(data_width_g-1 downto 0); + signal full_to_rx : std_logic; + + -- clock and reset + constant Period : time := 100 ns; + constant Period2 : time := 10 ns; + + component aif_we_in + generic ( + data_width_g : integer); + port ( + clk : in std_logic; + rst_n : in std_logic; + we_in : in std_logic; + data_in : in std_logic_vector(data_width_g-1 downto 0); + data_out : out std_logic_vector(data_width_g-1 downto 0); + full_out : out std_logic; + a_we_out : out std_logic; + ack_in : in std_logic + ); + end component; + + signal we_to_tx : std_logic; + signal data_to_tx : std_logic_vector(data_width_g-1 downto 0); + signal data_from_tx : std_logic_vector(data_width_g-1 downto 0); + signal full_from_tx : std_logic; + signal a_we_from_tx : std_logic; + + signal clk2 : std_logic; +-- constant clk2_scaler : integer := 3; + + signal cnt_tx_data_r : std_logic_vector(data_width_g-1 downto 0); + signal cnt_rx_data_r : std_logic_vector(data_width_g-1 downto 0); + signal rx_full_cnt_r : integer; + signal tx_we_cnt_r : integer; + + constant full_after_we_c : integer := 3; -- after n data issue full + constant full_length_c : integer := 10; -- cc full is asserted + constant time_before_we_c : integer := 100; -- delay after sending + constant start_value_c : integer := 3; + +begin -- rtl + + -- component instantiation + DUT : aif_we_out + generic map ( + data_width_g => data_width_g) + port map ( + clk => clk, + rst_n => rst_n, + a_we_in => a_we_from_tx, + ack_out => ack_from_rx, + data_in => data_from_tx, + data_out => data_from_rx, + we_out => we_from_rx, + full_in => full_to_rx + ); + + aif_we_in_1 : aif_we_in + generic map ( + data_width_g => data_width_g) + port map ( + clk => clk2, + rst_n => rst_n, + we_in => we_to_tx, + data_in => data_to_tx, + data_out => data_from_tx, + full_out => full_from_tx, + a_we_out => a_we_from_tx, + ack_in => ack_from_rx + ); + + + -- receiving, use clk + process (clk, rst_n) + begin -- process + if rst_n = '0' then -- asynchronous reset (active low) + cnt_rx_data_r <= conv_std_logic_vector(start_value_c, data_width_g); + full_to_rx <= '0'; + rx_full_cnt_r <= 0; + + elsif clk'event and clk = '1' then -- rising clock edge + if we_from_rx = '1' and full_to_rx = '0' then + assert cnt_rx_data_r = data_from_rx report "Error: rx data wrong wait: " & + str(conv_integer(cnt_rx_data_r)) & "got: " & + str(conv_integer(data_from_rx)) + severity error; + cnt_rx_data_r <= cnt_rx_data_r+1; + rx_full_cnt_r <= rx_full_cnt_r + 1; + end if; + + if rx_full_cnt_r > full_after_we_c + full_length_c -1 then + full_to_rx <= '0'; + rx_full_cnt_r <= 0; + elsif rx_full_cnt_r > full_after_we_c-1 then + full_to_rx <= '1'; + rx_full_cnt_r <= rx_full_cnt_r+1; + end if; + + end if; + + end process; + + -- transmit, use different clock. + tx : process (clk2, rst_n) + begin -- process tx + if rst_n = '0' then -- asynchronous reset (active low) + tx_we_cnt_r <= 0; + data_to_tx <= conv_std_logic_vector(start_value_c, data_width_g); + cnt_tx_data_r <= conv_std_logic_vector(start_value_c, data_width_g); + we_to_tx <= '0'; + + elsif clk2'event and clk2 = '1' then -- rising clock edge + if tx_we_cnt_r > 0 then + tx_we_cnt_r <= tx_we_cnt_r-1; + we_to_tx <= '0'; + end if; + if full_from_tx = '0' then + if tx_we_cnt_r = 0 then + we_to_tx <= '1'; + data_to_tx <= cnt_tx_data_r; + cnt_tx_data_r <= cnt_tx_data_r+1; + tx_we_cnt_r <= time_before_we_c; + end if; + end if; + end if; + end process tx; + + -- clock generation + -- PROC + CLOCK1 : process -- generate clock signal for design + variable clktmp : std_logic := '0'; + begin + wait for PERIOD/2; + clktmp := not clktmp; + Clk <= clktmp; + end process CLOCK1; + + CLOCK2 : process -- generate clock signal for design + variable clktmp : std_logic := '0'; + begin + wait for PERIOD2/2; + clktmp := not clktmp; + Clk2 <= clktmp; + end process CLOCK2; + + -- PROC + RESET : process + begin + Rst_n <= '0'; -- Reset the testsystem + wait for 6*PERIOD; -- Wait + Rst_n <= '1'; -- de-assert reset + wait; + end process RESET; + + + +end rtl; + +------------------------------------------------------------------------------- Index: trunk/TUT/ip.hwp.storage/fifos/synchronizer/Tb/tb_asynch_if_fpga.vhd =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synchronizer/Tb/tb_asynch_if_fpga.vhd (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synchronizer/Tb/tb_asynch_if_fpga.vhd (revision 18) @@ -0,0 +1,189 @@ +------------------------------------------------------------------------------- +-- Title : Testbench for design "asynch_if_s" +-- Project : +------------------------------------------------------------------------------- +-- File : tb_asynch_if_fpga.vhd +-- Author : +-- Created : 04.01.2006 +-- Last update: 04.01.2006 +-- Description: +------------------------------------------------------------------------------- +-- Copyright (c) 2006 +------------------------------------------------------------------------------- +-- Revisions : +-- Date Version Author Description +-- 04.01.2006 1.0 AK Created +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; +--use work.txt_util.all; +------------------------------------------------------------------------------- + +entity tb_asynch_if_fpga is + port ( + clk : in std_logic; + clk2 : in std_logic; + rst_n : in std_logic; + error_out : out std_logic + ); +end tb_asynch_if_fpga; + +------------------------------------------------------------------------------- + +architecture rtl of tb_asynch_if_fpga is + + component asynch_if_rx + generic ( + data_width_g : integer := 32 + ); + port ( + clk : in std_logic; + rst_n : in std_logic; + a_we_in : in std_logic; + ack_out : out std_logic; + we_out : out std_logic; + data_in : in std_logic_vector(data_width_g-1 downto 0); + data_out : out std_logic_vector(data_width_g-1 downto 0); + full_in : in std_logic); + end component; + + constant data_width_g : integer := 32; + + -- component ports + signal ack_from_rx : std_logic; + signal we_from_rx : std_logic; + signal data_from_rx : std_logic_vector(data_width_g-1 downto 0); + signal full_to_rx : std_logic; + + -- clock and reset + component asynch_if_tx + generic ( + data_width_g : integer); + port ( + clk : in std_logic; + rst_n : in std_logic; + we_in : in std_logic; + data_in : in std_logic_vector(data_width_g-1 downto 0); + data_out : out std_logic_vector(data_width_g-1 downto 0); + full_out : out std_logic; + a_we_out : out std_logic; + ack_in : in std_logic + ); + end component; + + signal we_to_tx : std_logic; + signal data_to_tx : std_logic_vector(data_width_g-1 downto 0); + signal data_from_tx : std_logic_vector(data_width_g-1 downto 0); + signal full_from_tx : std_logic; + signal a_we_from_tx : std_logic; + + signal cnt_tx_data_r : std_logic_vector(data_width_g-1 downto 0); + signal cnt_rx_data_r : std_logic_vector(data_width_g-1 downto 0); + signal rx_full_cnt_r : integer; + signal tx_we_cnt_r : integer; + + constant full_after_we_c : integer := 3; -- after n data issue full + constant full_length_c : integer := 10; -- cc full is asserted + constant time_before_we_c : integer := 0; -- delay after sending + constant start_value_c : integer := 3; + +begin -- rtl + + -- component instantiation + DUT : asynch_if_rx + generic map ( + data_width_g => data_width_g) + port map ( + clk => clk, + rst_n => rst_n, + a_we_in => a_we_from_tx, + ack_out => ack_from_rx, + data_in => data_from_tx, + data_out => data_from_rx, + we_out => we_from_rx, + full_in => full_to_rx + ); + + asynch_if_tx_1 : asynch_if_tx + generic map ( + data_width_g => data_width_g) + port map ( + clk => clk2, + rst_n => rst_n, + we_in => we_to_tx, + data_in => data_to_tx, + data_out => data_from_tx, + full_out => full_from_tx, + a_we_out => a_we_from_tx, + ack_in => ack_from_rx + ); + + + -- receiving, use clk + process (clk, rst_n) + begin -- process + if rst_n = '0' then -- asynchronous reset (active low) + cnt_rx_data_r <= conv_std_logic_vector(start_value_c, data_width_g); + full_to_rx <= '0'; + rx_full_cnt_r <= 0; + error_out <= '0'; + + elsif clk'event and clk = '1' then -- rising clock edge + if we_from_rx = '1' and full_to_rx = '0' then + if cnt_rx_data_r /= data_from_rx then + error_out <= '1'; + else + error_out <= '0'; + end if; +-- assert cnt_rx_data_r = data_from_rx report "Error: rx data wrong wait: " & +-- str(conv_integer(cnt_rx_data_r)) & "got: " & +-- str(conv_integer(data_from_rx)) +-- severity error; + cnt_rx_data_r <= cnt_rx_data_r+1; + rx_full_cnt_r <= rx_full_cnt_r + 1; + end if; + + if rx_full_cnt_r > full_after_we_c + full_after_we_c -1 then + full_to_rx <= '0'; + rx_full_cnt_r <= 0; + elsif rx_full_cnt_r > full_after_we_c-1 then + full_to_rx <= '1'; + rx_full_cnt_r <= rx_full_cnt_r+1; + end if; + + end if; + + end process; + + -- transmit, use different clock. + tx : process (clk2, rst_n) + begin -- process tx + if rst_n = '0' then -- asynchronous reset (active low) + tx_we_cnt_r <= 0; + data_to_tx <= conv_std_logic_vector(start_value_c, data_width_g); + cnt_tx_data_r <= conv_std_logic_vector(start_value_c, data_width_g); + we_to_tx <= '0'; + + elsif clk2'event and clk2 = '1' then -- rising clock edge + if tx_we_cnt_r > 0 then + tx_we_cnt_r <= tx_we_cnt_r-1; + we_to_tx <= '0'; + end if; + if full_from_tx = '0' then + if tx_we_cnt_r = 0 then + we_to_tx <= '1'; + data_to_tx <= cnt_tx_data_r; + cnt_tx_data_r <= cnt_tx_data_r+1; + tx_we_cnt_r <= time_before_we_c; + end if; + end if; + end if; + end process tx; + + +end rtl; + +------------------------------------------------------------------------------- Index: trunk/TUT/ip.hwp.storage/fifos/synchronizer/Tb/tb_aif_top.vhd =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synchronizer/Tb/tb_aif_top.vhd (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synchronizer/Tb/tb_aif_top.vhd (revision 18) @@ -0,0 +1,196 @@ +------------------------------------------------------------------------------- +-- Title : Testbench for design "asynch_if_s" +-- Project : +------------------------------------------------------------------------------- +-- File : tb_asynch_if_send.vhd +-- Author : +-- Created : 04.01.2006 +-- Last update: 02.03.2006 +-- Description: +------------------------------------------------------------------------------- +-- Copyright (c) 2006 +------------------------------------------------------------------------------- +-- Revisions : +-- Date Version Author Description +-- 04.01.2006 1.0 AK Created +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; +use work.txt_util.all; +------------------------------------------------------------------------------- + +entity tb_aif_top is + +end tb_aif_top; + +------------------------------------------------------------------------------- + +architecture rtl of tb_aif_top is + + constant data_width_g : integer := 32; + + -- component ports + signal clk : std_logic; + signal rst_n : std_logic; + + -- clock and reset + constant Period : time := 10 ns; + constant Period2 : time := 100 ns; + + component aif_read_top + generic ( + data_width_g : integer); + port ( + tx_clk : in std_logic; + tx_rst_n : in std_logic; + tx_data_in : in std_logic_vector(data_width_g-1 downto 0); + tx_empty_in : in std_logic; + tx_re_out : out std_logic; + rx_clk : in std_logic; + rx_rst_n : in std_logic; + rx_empty_out : out std_logic; + rx_re_in : in std_logic; + rx_data_out : out std_logic_vector(data_width_g-1 downto 0)); + end component; + + signal tx_data_to : std_logic_vector(data_width_g-1 downto 0); + signal tx_empty_to : std_logic; + signal tx_re_from : std_logic; + signal rx_empty_from : std_logic; + signal rx_re_to : std_logic; + signal rx_data_from : std_logic_vector(data_width_g-1 downto 0); + + signal clk2 : std_logic; + constant clk_scaler : integer := 1; + constant clk2_scaler : integer := 1; + + signal cnt_tx_data_r : std_logic_vector(data_width_g-1 downto 0); + signal cnt_rx_data_r : std_logic_vector(data_width_g-1 downto 0); + signal rx_full_cnt_r : integer; + signal tx_we_cnt_r : integer; + + constant full_after_we_c : integer := 3; -- after n data issue full + constant full_length_c : integer := 10; -- cc full is asserted + constant time_before_we_c : integer := 10; -- delay after sending + constant start_value_c : integer := 3; + +begin -- rtl + + + aif_read_top_1 : aif_read_top + generic map ( + data_width_g => data_width_g) + port map ( + tx_clk => clk2, + tx_rst_n => rst_n, + tx_data_in => tx_data_to, + tx_empty_in => tx_empty_to, + tx_re_out => tx_re_from, + rx_clk => clk, + rx_rst_n => rst_n, + rx_empty_out => rx_empty_from, + rx_re_in => rx_re_to, + rx_data_out => rx_data_from + ); + + + -- use clk + process (clk, rst_n) + begin -- process + if rst_n = '0' then -- asynchronous reset (active low) + cnt_rx_data_r <= conv_std_logic_vector(start_value_c, data_width_g); + rx_re_to <= '0'; + rx_full_cnt_r <= 0; + + elsif clk'event and clk = '1' then -- rising clock edge + if rx_empty_from = '0' and rx_re_to = '1' then + cnt_rx_data_r <= cnt_rx_data_r+1; + assert cnt_rx_data_r = rx_data_from report "Error: rx data wrong wait: " & + str(conv_integer(cnt_rx_data_r)) & "got: " & + str(conv_integer(rx_data_from)) + severity error; + + end if; + if rx_empty_from = '0' then + + if rx_full_cnt_r > full_after_we_c + full_after_we_c -1 then + rx_re_to <= '1'; + rx_full_cnt_r <= 0; + elsif rx_full_cnt_r > full_after_we_c-1 then + rx_re_to <= '0'; + rx_full_cnt_r <= rx_full_cnt_r+1; + else + rx_re_to <= '1'; + rx_full_cnt_r <= rx_full_cnt_r+1; + end if; + + else + rx_re_to <= '0'; + end if; + -- rx re to always '1', resemble n2h2 behavior + -- rx_re_to <= '1'; + end if; + + end process; + + + -- transmit, use different clock. + tx : process (clk2, rst_n) + begin -- process tx + if rst_n = '0' then -- asynchronous reset (active low) + tx_we_cnt_r <= 0; + tx_data_to <= conv_std_logic_vector(start_value_c, data_width_g); + cnt_tx_data_r <= conv_std_logic_vector(start_value_c+1, data_width_g); + tx_empty_to <= '1'; + + elsif clk2'event and clk2 = '1' then -- rising clock edge + if tx_we_cnt_r > 0 then + tx_we_cnt_r <= tx_we_cnt_r-1; + tx_empty_to <= '1'; + else + tx_empty_to <= '0'; + if tx_re_from = '1' then + tx_data_to <= cnt_tx_data_r; + cnt_tx_data_r <= cnt_tx_data_r+1; + tx_we_cnt_r <= time_before_we_c; + end if; + + end if; + end if; + end process tx; + + -- clock generation + -- PROC + CLOCK1 : process -- generate clock signal for design + variable clktmp : std_logic := '0'; + begin + wait for PERIOD/2; + clktmp := not clktmp; + Clk <= clktmp; + end process CLOCK1; + + CLOCK2 : process -- generate clock signal for design + variable clktmp : std_logic := '0'; + begin + wait for PERIOD2/2; + clktmp := not clktmp; + Clk2 <= clktmp; + end process CLOCK2; + + -- PROC + RESET : process + begin + Rst_n <= '0'; -- Reset the testsystem + wait for 6*PERIOD; -- Wait + Rst_n <= '1'; -- de-assert reset + wait; + end process RESET; + + + +end rtl; + +------------------------------------------------------------------------------- Index: trunk/TUT/ip.hwp.storage/fifos/synchronizer/Tb/tb_asynch_if.vhd =================================================================== --- trunk/TUT/ip.hwp.storage/fifos/synchronizer/Tb/tb_asynch_if.vhd (nonexistent) +++ trunk/TUT/ip.hwp.storage/fifos/synchronizer/Tb/tb_asynch_if.vhd (revision 18) @@ -0,0 +1,214 @@ + +------------------------------------------------------------------------------- +-- Title : Testbench for design "asynch_if_s" +-- Project : +------------------------------------------------------------------------------- +-- File : tb_asynch_if_send.vhd +-- Author : +-- Created : 04.01.2006 +-- Last update: 05.01.2006 +-- Description: +------------------------------------------------------------------------------- +-- Copyright (c) 2006 +------------------------------------------------------------------------------- +-- Revisions : +-- Date Version Author Description +-- 04.01.2006 1.0 AK Created +------------------------------------------------------------------------------- + +library ieee; +use ieee.std_logic_1164.all; +use ieee.std_logic_arith.all; +use ieee.std_logic_unsigned.all; +use work.txt_util.all; +------------------------------------------------------------------------------- + +entity tb_asynch_if is + +end tb_asynch_if; + +------------------------------------------------------------------------------- + +architecture rtl of tb_asynch_if is + + component asynch_if_rx + generic ( + data_width_g : integer := 32 + ); + port ( + clk : in std_logic; + rst_n : in std_logic; + a_we_in : in std_logic; + ack_out : out std_logic; + we_out : out std_logic; + data_in : in std_logic_vector(data_width_g-1 downto 0); + data_out : out std_logic_vector(data_width_g-1 downto 0); + full_in : in std_logic); + end component; + + constant data_width_g : integer := 32; + + -- component ports + signal clk : std_logic; + signal rst_n : std_logic; + signal ack_from_rx : std_logic; + signal we_from_rx : std_logic; + signal data_from_rx : std_logic_vector(data_width_g-1 downto 0); + signal full_to_rx : std_logic; + + -- clock and reset + constant Period : time := 10 ns; + + component asynch_if_tx + generic ( + data_width_g : integer); + port ( + clk : in std_logic; + rst_n : in std_logic; + we_in : in std_logic; + data_in : in std_logic_vector(data_width_g-1 downto 0); + data_out : out std_logic_vector(data_width_g-1 downto 0); + full_out : out std_logic; + a_we_out : out std_logic; + ack_in : in std_logic + ); + end component; + + signal we_to_tx : std_logic; + signal data_to_tx : std_logic_vector(data_width_g-1 downto 0); + signal data_from_tx : std_logic_vector(data_width_g-1 downto 0); + signal full_from_tx : std_logic; + signal a_we_from_tx : std_logic; + + signal clk2 : std_logic; + constant clk2_scaler : integer := 3; + + signal cnt_tx_data_r : std_logic_vector(data_width_g-1 downto 0); + signal cnt_rx_data_r : std_logic_vector(data_width_g-1 downto 0); + signal rx_full_cnt_r : integer; + signal tx_we_cnt_r : integer; + + constant full_after_we_c : integer := 3; -- after n data issue full + constant full_length_c : integer := 10; -- cc full is asserted + constant time_before_we_c : integer := 0; -- delay after sending + constant start_value_c : integer := 3; + +begin -- rtl + + -- component instantiation + DUT : asynch_if_rx + generic map ( + data_width_g => data_width_g) + port map ( + clk => clk, + rst_n => rst_n, + a_we_in => a_we_from_tx, + ack_out => ack_from_rx, + data_in => data_from_tx, + data_out => data_from_rx, + we_out => we_from_rx, + full_in => full_to_rx + ); + + asynch_if_tx_1 : asynch_if_tx + generic map ( + data_width_g => data_width_g) + port map ( + clk => clk2, + rst_n => rst_n, + we_in => we_to_tx, + data_in => data_to_tx, + data_out => data_from_tx, + full_out => full_from_tx, + a_we_out => a_we_from_tx, + ack_in => ack_from_rx + ); + + + -- receiving, use clk + process (clk, rst_n) + begin -- process + if rst_n = '0' then -- asynchronous reset (active low) + cnt_rx_data_r <= conv_std_logic_vector(start_value_c, data_width_g); + full_to_rx <= '0'; + rx_full_cnt_r <= 0; + + elsif clk'event and clk = '1' then -- rising clock edge + if we_from_rx = '1' and full_to_rx = '0' then + assert cnt_rx_data_r = data_from_rx report "Error: rx data wrong wait: " & + str(conv_integer(cnt_rx_data_r)) & "got: " & + str(conv_integer(data_from_rx)) + severity error; + cnt_rx_data_r <= cnt_rx_data_r+1; + rx_full_cnt_r <= rx_full_cnt_r + 1; + end if; + + if rx_full_cnt_r > full_after_we_c + full_after_we_c -1 then + full_to_rx <= '0'; + rx_full_cnt_r <= 0; + elsif rx_full_cnt_r > full_after_we_c-1 then + full_to_rx <= '1'; + rx_full_cnt_r <= rx_full_cnt_r+1; + end if; + + end if; + + end process; + + -- transmit, use different clock. + tx : process (clk2, rst_n) + begin -- process tx + if rst_n = '0' then -- asynchronous reset (active low) + tx_we_cnt_r <= 0; + data_to_tx <= conv_std_logic_vector(start_value_c, data_width_g); + cnt_tx_data_r <= conv_std_logic_vector(start_value_c, data_width_g); + we_to_tx <= '0'; + + elsif clk2'event and clk2 = '1' then -- rising clock edge + if tx_we_cnt_r > 0 then + tx_we_cnt_r <= tx_we_cnt_r-1; + we_to_tx <= '0'; + end if; + if full_from_tx = '0' then + if tx_we_cnt_r = 0 then + we_to_tx <= '1'; + data_to_tx <= cnt_tx_data_r; + cnt_tx_data_r <= cnt_tx_data_r+1; + tx_we_cnt_r <= time_before_we_c; + end if; + end if; + end if; + end process tx; + + -- clock generation + -- PROC + CLOCK1 : process -- generate clock signal for design + variable clktmp : std_logic := '0'; + begin + wait for PERIOD/2; + clktmp := not clktmp; + Clk <= clktmp; + end process CLOCK1; + + CLOCK2 : process -- generate clock signal for design + variable clktmp : std_logic := '0'; + begin + wait for PERIOD/clk2_scaler; + clktmp := not clktmp; + Clk2 <= clktmp; + end process CLOCK2; + + -- PROC + RESET : process + begin + Rst_n <= '0'; -- Reset the testsystem + wait for 6*PERIOD; -- Wait + Rst_n <= '1'; -- de-assert reset + wait; + end process RESET; + + + +end rtl; + +-------------------------------------------------------------------------------

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.