Monitorar instâncias do SQL Server é uma tarefa que requer o uso de vários recursos, como DMVs, log de erros, contadores de performance, SQL Traces, etc; é um verdadeiro canivete suíço. Na busca por facilitar o meu trabalho,  eu incluí na minha estratégia de monitoramento diário uma stored procedure que é executada todos os dias, no início da manhã, coletando informações que considero vitais. Essa SP coleta os dados e gera um relatório em formato HTML, enviando-o para minha caixa de e-mail. Assim, quando chego na empresa a primeira coisa que faço é conferir os relatórios enviados para o meu e-mail. Além disso, essa SP também pode ser usada para capturar uma imagem de como está a instância naquele momento. A stored procedure tem apenas um parâmetro: @ExibirApenasHtm, cujo valor default é 0. Se você executar a SP passando o valor 1 então, ao invés de enviar um e-mail, será exibida uma string contendo o HTML do relatório. Copie essa string e cole no seu editor HTML preferido. Fique à vontade para adaptar a SP conforme as suas necessidades. Ela é compatível apenas com o SQL Server 2008 e versões superiores. ATENÇÃO: para usar o recurso de e-mail na stored procedure é necessário configurar o Database Mail.

Segue alguns trechos que o relatório exibe:

image

image

image

image

Exemplo de como executar a stored procedure enviando o relatório para uma conta de e-mail:

use master

go

EXEC dbo.uspRelatorioDiario;

Exemplo de como executar a stored procedure gerando apenas a string contendo o HTML do relatório:

use master

go

EXEC dbo.uspRelatorioDiario 1;

Segue nas linhas abaixo o código fonte da procedure. Se você preferir, pode baixá-la aqui.

USE DBAdmin
GO

/* SP para ser executada diariamente. Exibe resumo da situação atual do SGDB. */
if OBJECT_ID(‘dbo.uspRelatorioDiario’) IS NOT NULL
DROP PROCEDURE dbo.uspRelatorioDiario;
GO

CREATE PROCEDURE dbo.uspRelatorioDiario @ExibirApenasHtml BIT = 0
AS
SET LANGUAGE US_ENGLISH;

SET NOCOUNT ON;

— *** Variáveis
DECLARE @vSubject NVARCHAR(255) = ‘Relatório Diário do SQL Server: ‘+@@SERVERNAME;
DECLARE @vBody AS NVARCHAR(MAX) = ”;

— *** Parte 1: Informações de configuração da instância
IF OBJECT_ID(‘tempdb.dbo.#Tabela’) IS NOT NULL
DROP TABLE #Tabela;

DECLARE @vOnline_Since AS NVARCHAR (10) = ”;
DECLARE @vUptime_Days AS INT = 0;

SELECT
@vOnline_Since = CONVERT(NVARCHAR(10), DB.sqlserver_start_time,103)
, @vUptime_Days = DATEDIFF(DAY,DB.sqlserver_start_time,GETDATE())
FROM
sys.dm_os_sys_info DB;

SELECT
SERVERPROPERTY (‘ComputerNamePhysicalNetBIOS’) AS netbios_name
,@@SERVERNAME AS server_name
,SERVERPROPERTY(‘EDITION’) AS edition
,SERVERPROPERTY (‘ProductVersion’) AS version
,SERVERPROPERTY (‘ProductLevel’) AS [level]
,@vOnline_Since AS online_since
,@vUptime_Days AS uptime_days
INTO #Tabela;

SET @vBody =

<h3>Informações da Instância</h3>
<table border=”1″ cellpadding=”2″>
<tr>
<th>Nome NetBIOS</th>
<th>Nome da Instância</th>
<th>Edição</th>
<th>Versão</th>
<th>Level</th>
<th>Online desde</th>
<th>Qtde de dias online</th>
</tr>’;
SET @vBody = @vBody +
(
select
‘<tr>’+
‘<td>’+CONVERT(NVARCHAR,t.netbios_name)+'</td>’+
‘<td>’+CONVERT(NVARCHAR,server_name)+'</td>’+
‘<td>’+CONVERT(NVARCHAR,edition)+'</td>’+
‘<td>’+CONVERT(NVARCHAR,version)+'</td>’+
‘<td>’+CONVERT(NVARCHAR,level)+'</td>’+
‘<td>’+CONVERT(NVARCHAR,online_since)+'</td>’+
‘<td>’+CONVERT(NVARCHAR,uptime_days)+'</td>’+
‘</tr>’
from dbo.#Tabela t
)
SET @vBody = @vBody + ‘</table>’;

— *** Parte 2: Log de error do SQL
DECLARE
@Qt INT = 0,
@Loop INT = 1;

DECLARE @LogSQL1 TABLE
(    Seq INT IDENTITY(1,1),
LogDate DATETIME,
ProcessInfo VARCHAR(50),
Text VARCHAR(4000)
);
INSERT INTO @LogSql1 exec sp_readerrorlog;

— Tabela para somente erros
DECLARE @LogSQL2 TABLE
(    Seq INT IDENTITY(1,1),
LogDate DATETIME,
ProcessInfo VARCHAR(50),
Text VARCHAR(4000)
);
INSERT INTO @LogSQL2
SELECT TOP 30
LogDate, ProcessInfo, Text
FROM @LogSQL1 l
WHERE l.Text LIKE ‘%erro%’
ORDER BY 1 DESC;
SET @Qt = @@ROWCOUNT;
SET @vBody = @vBody +

<br><br>
<h3>Últimos 30 registros contendo a palavra “erro” no Log de Erros do SQL Server</h3>
<table border=1 cellpadding=2>
<tr>
<th>Data do Log</th>
<th>Processo</th>
<th>Texto</th>
</tr>
‘;
WHILE @Loop <= @Qt
BEGIN
SET @vBody = @vBody +
(
SELECT
‘<tr>’+
‘<td>’+CONVERT(VARCHAR,LogDate)+'</td>’+
‘<td>’+CONVERT(VARCHAR,ProcessInfo)+'</td>’+
‘<td>’+CONVERT(NVARCHAR(4000),Text)+'</td>’+
‘</tr>’
FROM @LogSQL2 t
WHERE t.Seq = @Loop
);
SET @Loop = @Loop +1;
END;
SET @vBody = @vBody + ‘</table>’;

— últimos 30 registros
DECLARE @LogSQL3 TABLE
(    Seq INT IDENTITY(1,1),
LogDate DATETIME,
ProcessInfo VARCHAR(50),
Text VARCHAR(4000)
);
INSERT INTO @LogSQL3
SELECT TOP 30
LogDate, ProcessInfo, Text
FROM @LogSQL1 l
ORDER BY 1 DESC;
SET @Qt = @@ROWCOUNT;
SET @Loop = 1;
SET @vBody = @vBody +

<br><br>
<h3>Últimos 30 registros do Log de Erros do SQL Server</h3>
<table border=1 cellpadding=2>
<tr>
<th>Data do Log</th>
<th>Processo</th>
<th>Texto</th>
</tr>
‘;
WHILE @Loop <= @Qt
BEGIN
SET @vBody = @vBody +
(
SELECT
‘<tr>’+
‘<td>’+CONVERT(VARCHAR,LogDate)+'</td>’+
‘<td>’+CONVERT(VARCHAR,ProcessInfo)+'</td>’+
‘<td>’+CONVERT(VARCHAR(4000),Text)+'</td>’+
‘</tr>’
FROM @LogSQL3 t
WHERE t.Seq = @Loop
);
SET @Loop = @Loop +1;
END;
SET @vBody = @vBody + ‘</table>’;

— *** Parte 3: Tamanho dos discos
DECLARE @vFixed_Drives_Free_Space_Table AS TABLE
(    drive_letter VARCHAR (5),
free_space_mb BIGINT,
Seq INT IDENTITY(1,1));
INSERT INTO @vFixed_Drives_Free_Space_Table
(
drive_letter
,free_space_mb
)
EXEC master.dbo.xp_fixeddrives;

SET @Qt = @@ROWCOUNT;
SET @Loop = 1;

SET @vBody = @vBody +

<br><br>
<h3>Espaço livre nas unidades de disco</h3>
<table border=1 cellpadding=2>
<tr>
<th>Unidade</th>
<th>Espaço Livre (MB)</th>
</tr>
‘;

WHILE @Loop <= @Qt
BEGIN
SET @vBody = @vBody +
(
SELECT
‘<tr>’+
‘<td>’+CONVERT(VARCHAR,drive_letter)+'</td>’+
‘<td>’+REVERSE (SUBSTRING (REVERSE (CONVERT (VARCHAR (15), CONVERT (MONEY, free_space_mb), 1)), 4, 15))+'</td>’+
‘</tr>’
FROM @vFixed_Drives_Free_Space_Table t
WHERE t.Seq = @Loop
);
SET @Loop = @Loop +1;
END;

SET @vBody = @vBody + ‘</table>’;

— *** Parte 4: tamanho das databases
CREATE TABLE #Tamanhos
(
Seq INT IDENTITY,
Banco VARCHAR(50),
ArquivoDeDados_EspacoReservadoEmDisco_MB DECIMAL(15,2),
ArquivoDeDados_EspacoUsado_MB DECIMAL(15,2),
ArquivoDeDados_EspacoLivre_MB DECIMAL(15,2)
);

EXEC sp_MSforeachdb ‘USE ?
INSERT INTO #Tamanhos
(
Banco
, ArquivoDeDados_EspacoReservadoEmDisco_MB
, ArquivoDeDados_EspacoUsado_MB
, ArquivoDeDados_EspacoLivre_MB
)
SELECT
DB_NAME() Banco
, CAST(a.EspacoReservadoEmDisco AS DECIMAL(15,2)) EspacoReservadoEmDisco_MB
, CAST(a.EspacoUsado AS DECIMAL(15,2)) EspacoUsado_MB
, CAST(a.EspacoReservadoEmDisco – a.EspacoUsado AS DECIMAL(15,2)) EspacoLivre_MB
FROM
(
select
(select SUM(ps.reserved_page_count)/128.0 from sys.dm_db_partition_stats ps) EspacoUsado
, (select SUM(size/128.0) from sys.database_files where type IN (0,2,4)) EspacoReservadoEmDisco
) a’;

DECLARE @Tamanhos TABLE
(
Seq INT IDENTITY,
Banco VARCHAR(50),
ArquivoDeDados_EspacoReservadoEmDisco_MB DECIMAL(15,2),
ArquivoDeDados_EspacoUsado_MB DECIMAL(15,2),
ArquivoDeDados_EspacoLivre_MB DECIMAL(15,2),
ArquivoDeLog_EspacoReservadoEmDisco_MB DECIMAL(15,2),
ArquivoDeLog_EspacoUsado_MB DECIMAL(15,2),
ArquivoDeLog_EspacoLivre_MB DECIMAL(15,2)
);

INSERT INTO @Tamanhos
SELECT
t.Banco
, t.ArquivoDeDados_EspacoReservadoEmDisco_MB
, t.ArquivoDeDados_EspacoUsado_MB
, t.ArquivoDeDados_EspacoLivre_MB
, l.EspacoReservadoEmDisco_MB AS ArquivoDeLog_EspacoReservadoEmDisco_MB
, l.EspacoUsado_MB AS ArquivoDeLog_EspacoUsado_MB
, CAST(l.EspacoReservadoEmDisco_MB-l.EspacoUsado_MB AS DECIMAL(10,2)) ArquivoDeLog_EspacoLivre_MB
FROM #Tamanhos t
JOIN
(
SELECT a.Banco, a.EspacoReservadoEmDisco_MB, b.EspacoUsado_MB
FROM
(
select
RTRIM(p.instance_name) AS Banco
, CAST(p.cntr_value/1024.0 AS DECIMAL(15,2)) AS EspacoReservadoEmDisco_MB
from sys.dm_os_performance_counters p
WHERE p.counter_name LIKE ‘Log File(s) Size (KB)%’
) a
JOIN
(
select
RTRIM(p.instance_name) AS Banco
, CAST(p.cntr_value/1024.0 AS DECIMAL(15,2)) AS EspacoUsado_MB
from sys.dm_os_performance_counters p
where p.counter_name LIKE ‘Log File(s) Used Size (KB)%’
) b ON a.Banco = b.Banco
WHERE a.Banco NOT IN (‘_Total’, ‘mssqlsystemresource’, ‘tempdb’, ‘master’, ‘model’, ‘msdb’)
) l ON t.Banco = l.Banco
ORDER BY Banco;

DROP TABLE #Tamanhos;

SET @vBody = @vBody +

<br><br>
<h3>Tamanho dos Bancos de Dados de Usuário</h3>
<table border=1 cellpadding=2>
<tr>
<th>Banco</th>
<th>Arquivo de Dados – Espaço Reservado em Disco (MB)</th>
<th>Espaço Usado (MB)</th>
<th>Espaço Livre (MB)</th>
<th>Arquivo de Log – Espaço Reservado em Disco (MB)</th>
<th>Espaço Usado (MB)</th>
<th>Espaço Livre (MB)</th>
</tr>
‘;

SELECT @Qt = COUNT(*) FROM @Tamanhos t;
SET @Loop = 1;
WHILE @Loop <= @Qt
BEGIN
SET @vBody = @vBody +
(
SELECT
‘<tr>’+
‘<td>’+ Banco +'</td>’+
‘<td>’+CONVERT(VARCHAR(20),t.ArquivoDeDados_EspacoReservadoEmDisco_MB)+'</td>’+
‘<td>’+CONVERT(VARCHAR(20),t.ArquivoDeDados_EspacoUsado_MB)+'</td>’+
‘<td>’+CONVERT(VARCHAR(20),t.ArquivoDeDados_EspacoLivre_MB)+'</td>’+
‘<td>’+CONVERT(VARCHAR(20),t.ArquivoDeLog_EspacoReservadoEmDisco_MB)+'</td>’+
‘<td>’+CONVERT(VARCHAR(20),t.ArquivoDeLog_EspacoUsado_MB)+'</td>’+
‘<td>’+CONVERT(VARCHAR(20),t.ArquivoDeLog_EspacoLivre_MB)+'</td>’+
‘</tr>’
FROM @Tamanhos t
WHERE t.Seq = @Loop
);
SET @Loop = @Loop +1;
END;

SET @vBody = @vBody + ‘</table>’;

— *** Parte 5: TempDB Size
SET @vBody = @vBody +

<br><br>
<h3>Espaço no TempDB</h3>
<table border=1 cellpadding=2>
<tr>
<th>Páginas Livres</th>
<th>Espaço Livre em MB</th>
</tr>
‘;
SET @vBody = @vBody +
(
SELECT
‘<tr>’+
‘<td>’+CONVERT(VARCHAR(20),SUM(unallocated_extent_page_count))+'</td>’+
‘<td>’+CONVERT(VARCHAR(20),CAST(SUM(unallocated_extent_page_count)/128.0 AS decimal(15,2)))+'</td>’+
‘</tr>’
FROM sys.dm_db_file_space_usage
);
SET @vBody = @vBody + ‘</table>’;

— *** Parte 6: Last backup with success
SET @vBody = @vBody +

<br><br>
<h3>Últimos Backups Realizados</h3>
<table border=1 cellpadding=2>
<tr>
<th>Banco</th>
<th>Descrição Opcional do Backup</th>
<th>Modelo de Recovery</th>
<th>Data e Hora de Início</th>
<th>Idade em dias</th>
<th>Tamanho do Backup em MB</th>
<th>Tipo</th>
<th>Arquivo</th>
</tr>
‘;
DECLARE @Backups TABLE
(
seq INT identity(1,1),
database_name NVARCHAR(128),
server_name NVARCHAR(128),
name  NVARCHAR(128),
recovery_model  NVARCHAR(60),
backup_start_date DATETIME,
days_ago VARCHAR(15),
backup_size_mb VARCHAR(15),
type char(1),
backup_type varchar(21),
physical_device_name nvarchar(260)
);

INSERT INTO @Backups
select
s.database_name
, s.server_name
, ISNULL(s.name,”)
, s.recovery_model
, s.backup_start_date
,REVERSE (SUBSTRING (REVERSE (CONVERT (VARCHAR (15), CONVERT (MONEY, DATEDIFF (DAY, s.backup_start_date, GETDATE ())), 1)), 4, 15)) AS days_ago
,REVERSE (SUBSTRING (REVERSE (CONVERT (VARCHAR (15), CONVERT (MONEY, ROUND (s.backup_size/1048576.0, 0)), 1)), 4, 15)) AS backup_size_mb
, s.type
,(CASE
WHEN s.type = ‘D’ THEN ‘Database’
WHEN s.type = ‘F’ THEN ‘File Or Filegroup’
WHEN s.type = ‘G’ THEN ‘Differential File’
WHEN s.type = ‘I’ THEN ‘Differential Database’
WHEN s.type = ‘L’ THEN ‘Log’
WHEN s.type = ‘P’ THEN ‘Partial’
WHEN s.type = ‘Q’ THEN ‘Differential Partial’
ELSE ‘N/A’
END) AS backup_type
, f.physical_device_name
from msdb.dbo.backupset s
JOIN msdb.dbo.backupmediafamily f ON s.media_set_id = f.media_set_id
WHERE s.backup_set_id =
(    SELECT TOP 1 a.backup_set_id
FROM msdb.dbo.backupset a
WHERE a.database_name = s.database_name
ORDER BY a.backup_set_id DESC    )
ORDER BY s.database_name;

SELECT @Qt = @@ROWCOUNT;
SET @Loop = 1;
WHILE @Loop <= @Qt
BEGIN
SET @vBody = @vBody +
(
select
‘<tr>’+
‘<td>’+CONVERT(VARCHAR(128),database_name)+'</td>’+
‘<td>’+CONVERT(VARCHAR(128),name)+'</td>’+
‘<td>’+CONVERT(VARCHAR(60),recovery_model)+'</td>’+
‘<td>’+CONVERT(VARCHAR(20),backup_start_date, 13)+'</td>’+
‘<td>’+CONVERT(VARCHAR(10),days_ago)+'</td>’+
‘<td>’+CONVERT(VARCHAR(10),backup_size_mb)+'</td>’+
‘<td>’+CONVERT(VARCHAR(25),backup_type)+'</td>’+
‘<td>’+CONVERT(VARCHAR(260),physical_device_name)+'</td>’+
‘</tr>’
from @Backups
WHERE seq = @Loop
);
SET @Loop = @Loop +1;
END;
SET @vBody = @vBody + ‘</table>’;

— *** Parte 7: status execution jobs
SET @vBody = @vBody +

<br><br>
<h3>Status da Última Execução dos Jobs</h3>
<table border=1 cellpadding=2>
<tr>
<th>Nome</th>
<th>Status</th>
<th>Mensagem</th>
<th>Data da Execução</th>
<th>Hora da Execução</th>
</tr>
‘;
DECLARE @Jobs TABLE
(
Seq INT IDENTITY,
name SYSNAME,
status VARCHAR(50),
message NVARCHAR(4000),
run_date varchar(20),
run_time varchar(20)
);
INSERT INTO @Jobs
SELECT
j.name
, (CASE h.run_status
WHEN 0 THEN ‘Falha’
WHEN 1 THEN ‘Sucesso’
WHEN 2 THEN ‘Repetir’
WHEN 3 THEN ‘Cancelado’
WHEN 4 THEN ‘Em Progresso’
END) [status]
, h.message
, h.run_date
, h.run_time
FROM msdb.dbo.sysjobs j
CROSS APPLY
(    SELECT TOP 1 h.run_date, h.run_time, h.run_status, h.message
from msdb.dbo.sysjobhistory h
WHERE h.step_id = 0
AND h.job_id = j.job_id
ORDER BY h.instance_id DESC
) h
ORDER BY name;

SELECT @Qt = @@ROWCOUNT;
SET @Loop = 1;
WHILE @Loop <= @Qt
BEGIN
SET @vBody = @vBody +
(
select
‘<tr>’+
‘<td>’+CONVERT(VARCHAR(128),j.name)+'</td>’+
‘<td>’+CONVERT(VARCHAR(50),j.status)+'</td>’+
‘<td>’+CONVERT(NVARCHAR(4000),message)+'</td>’+
‘<td>’+CONVERT(VARCHAR(20),j.run_date)+'</td>’+
‘<td>’+CONVERT(VARCHAR(20),j.run_time)+'</td>’+
‘</tr>’
from @Jobs j
WHERE seq = @Loop
);
SET @Loop = @Loop +1;
END;
SET @vBody = @vBody + ‘</table>’;

— *** Envia
if @ExibirApenasHtml = 0
exec msdb.dbo.sp_send_dbmail
@recipients = ‘[email protected]’,
@subject=@vSubject,
@body=@vBody,
@body_format = ‘HTML’;
— *** Exibe como HTML ao invés de enviar por e-mail
else
SELECT @vBody;

— *** Final: elimina tabelas temporárias
IF OBJECT_ID(‘tempdb.dbo.#Tamanhos’) IS NOT NULL
DROP TABLE #Tamanhos;
IF OBJECT_ID(‘tempdb.dbo.#Tabela’) IS NOT NULL
DROP TABLE #Tabela;

Monitorar instâncias do SQL Server é uma tarefa que requer o uso de vários recursos, como DMVs, log de erros, contadores de performance, SQL Traces, etc; é um verdadeiro canivete suíço. Na busca por facilitar o meu trabalho,  eu incluí na minha estratégia de monitoramento diário uma stored procedure que é executada todos os dias, no início da manhã, coletando informações que considero vitais. Essa SP coleta os dados e gera um relatório em formato HTML, enviando-o para minha caixa de e-mail. Assim, quando chego na empresa a primeira coisa que faço é conferir os relatórios enviados para o meu e-mail. Além disso, essa SP também pode ser usada para capturar uma imagem de como está a instância naquele momento. A stored procedure tem apenas um parâmetro: @ExibirApenasHtm, cujo valor default é 0. Se você executar a SP passando o valor 1 então, ao invés de enviar um e-mail, será exibida uma string contendo o HTML do relatório. Copie essa string e cole no seu editor HTML preferido. Fique à vontade para adaptar a SP conforme as suas necessidades. Ela é compatível apenas com o SQL Server 2008 e versões superiores. ATENÇÃO: para usar o recurso de e-mail na stored procedure é necessário configurar o Database Mail.

Segue alguns trechos que o relatório exibe:

IMAGEM – image

IMAGEM – image

IMAGEM – image

IMAGEM – image

Exemplo de como executar a stored procedure enviando o relatório para uma conta de e-mail:

[et_pb_dmb_code_snippet _builder_version=”4.0.6″ code=”dXNlIG1hc3RlcgoKZ28KCkVYRUMgZGJvLnVzcFJlbGF0b3Jpb0RpYXJpbzs=” hover_enabled=”0″]dXNlIG1hc3RlcgoKZ28KCkVYRUMgZGJvLnVzcFJlbGF0b3Jpb0RpYXJpbzs=[/et_pb_dmb_code_snippet]

Exemplo de como executar a stored procedure gerando apenas a string contendo o HTML do relatório:

[et_pb_dmb_code_snippet _builder_version=”4.0.6″ code=”dXNlIG1hc3RlcgoKZ28KCkVYRUMgZGJvLnVzcFJlbGF0b3Jpb0RpYXJpbyAxOw==” hover_enabled=”0″]dXNlIG1hc3RlcgoKZ28KCkVYRUMgZGJvLnVzcFJlbGF0b3Jpb0RpYXJpbyAxOw==[/et_pb_dmb_code_snippet]

Segue nas linhas abaixo o código fonte da procedure. Se você preferir, pode baixá-la aqui.

[et_pb_dmb_code_snippet _builder_version=”4.0.6″ code=”VVNFIERCQWRtaW4KR08KCi8qIFNQIHBhcmEgc2VyIGV4ZWN1dGFkYSBkaWFyaWFtZW50ZS4gRXhpYmUgcmVzdW1vIGRhIHNpdHVhw6fDo28gYXR1YWwgZG8gU0dEQi4gKi8KaWYgT0JKRUNUX0lEKOKAmGRiby51c3BSZWxhdG9yaW9EaWFyaW/igJkpIElTIE5PVCBOVUxMCkRST1AgUFJPQ0VEVVJFIGRiby51c3BSZWxhdG9yaW9EaWFyaW87CkdPCgpDUkVBVEUgUFJPQ0VEVVJFIGRiby51c3BSZWxhdG9yaW9EaWFyaW8gQEV4aWJpckFwZW5hc0h0bWwgQklUID0gMApBUwpTRVQgTEFOR1VBR0UgVVNfRU5HTElTSDsKClNFVCBOT0NPVU5UIE9OOwoK4oCUICoqKiBWYXJpw6F2ZWlzCkRFQ0xBUkUgQHZTdWJqZWN0IE5WQVJDSEFSKDI1NSkgPSDigJhSZWxhdMOzcmlvIERpw6FyaW8gZG8gU1FMIFNlcnZlcjog4oCYK0BAU0VSVkVSTkFNRTsKREVDTEFSRSBAdkJvZHkgQVMgTlZBUkNIQVIoTUFYKSA9IOKAnTsKCuKAlCAqKiogUGFydGUgMTogSW5mb3JtYcOnw7VlcyBkZSBjb25maWd1cmHDp8OjbyBkYSBpbnN0w6JuY2lhCklGIE9CSkVDVF9JRCjigJh0ZW1wZGIuZGJvLiNUYWJlbGHigJkpIElTIE5PVCBOVUxMCkRST1AgVEFCTEUgI1RhYmVsYTsKCkRFQ0xBUkUgQHZPbmxpbmVfU2luY2UgQVMgTlZBUkNIQVIgKDEwKSA9IOKAnTsKREVDTEFSRSBAdlVwdGltZV9EYXlzIEFTIElOVCA9IDA7CgpTRUxFQ1QKQHZPbmxpbmVfU2luY2UgPSBDT05WRVJUKE5WQVJDSEFSKDEwKSwgREIuc3Fsc2VydmVyX3N0YXJ0X3RpbWUsMTAzKQosIEB2VXB0aW1lX0RheXMgPSBEQVRFRElGRihEQVksREIuc3Fsc2VydmVyX3N0YXJ0X3RpbWUsR0VUREFURSgpKQpGUk9NCnN5cy5kbV9vc19zeXNfaW5mbyBEQjsKClNFTEVDVApTRVJWRVJQUk9QRVJUWSAo4oCYQ29tcHV0ZXJOYW1lUGh5c2ljYWxOZXRCSU9T4oCZKSBBUyBuZXRiaW9zX25hbWUKLEBAU0VSVkVSTkFNRSBBUyBzZXJ2ZXJfbmFtZQosU0VSVkVSUFJPUEVSVFko4oCYRURJVElPTuKAmSkgQVMgZWRpdGlvbgosU0VSVkVSUFJPUEVSVFkgKOKAmFByb2R1Y3RWZXJzaW9u4oCZKSBBUyB2ZXJzaW9uCixTRVJWRVJQUk9QRVJUWSAo4oCYUHJvZHVjdExldmVs4oCZKSBBUyBbbGV2ZWxdCixAdk9ubGluZV9TaW5jZSBBUyBvbmxpbmVfc2luY2UKLEB2VXB0aW1lX0RheXMgQVMgdXB0aW1lX2RheXMKSU5UTyAjVGFiZWxhOwoKU0VUIEB2Qm9keSA9CuKAmAo8aDM+SW5mb3JtYcOnw7VlcyBkYSBJbnN0w6JuY2lhPC9oMz4KPHRhYmxlIGJvcmRlcj3igJ0x4oCzIGNlbGxwYWRkaW5nPeKAnTLigLM+Cjx0cj4KPHRoPk5vbWUgTmV0QklPUzwvdGg+Cjx0aD5Ob21lIGRhIEluc3TDom5jaWE8L3RoPgo8dGg+RWRpw6fDo288L3RoPgo8dGg+VmVyc8OjbzwvdGg+Cjx0aD5MZXZlbDwvdGg+Cjx0aD5PbmxpbmUgZGVzZGU8L3RoPgo8dGg+UXRkZSBkZSBkaWFzIG9ubGluZTwvdGg+CjwvdHI+4oCZOwpTRVQgQHZCb2R5ID0gQHZCb2R5ICsKKApzZWxlY3QK4oCYPHRyPuKAmSsK4oCYPHRkPuKAmStDT05WRVJUKE5WQVJDSEFSLHQubmV0Ymlvc19uYW1lKSsnPC90ZD7igJkrCuKAmDx0ZD7igJkrQ09OVkVSVChOVkFSQ0hBUixzZXJ2ZXJfbmFtZSkrJzwvdGQ+4oCZKwrigJg8dGQ+4oCZK0NPTlZFUlQoTlZBUkNIQVIsZWRpdGlvbikrJzwvdGQ+4oCZKwrigJg8dGQ+4oCZK0NPTlZFUlQoTlZBUkNIQVIsdmVyc2lvbikrJzwvdGQ+4oCZKwrigJg8dGQ+4oCZK0NPTlZFUlQoTlZBUkNIQVIsbGV2ZWwpKyc8L3RkPuKAmSsK4oCYPHRkPuKAmStDT05WRVJUKE5WQVJDSEFSLG9ubGluZV9zaW5jZSkrJzwvdGQ+4oCZKwrigJg8dGQ+4oCZK0NPTlZFUlQoTlZBUkNIQVIsdXB0aW1lX2RheXMpKyc8L3RkPuKAmSsK4oCYPC90cj7igJkKZnJvbSBkYm8uI1RhYmVsYSB0CikKU0VUIEB2Qm9keSA9IEB2Qm9keSArIOKAmDwvdGFibGU+4oCZOwoK4oCUICoqKiBQYXJ0ZSAyOiBMb2cgZGUgZXJyb3IgZG8gU1FMCkRFQ0xBUkUKQFF0IElOVCA9IDAsCkBMb29wIElOVCA9IDE7CgpERUNMQVJFIEBMb2dTUUwxIFRBQkxFCiggICAgU2VxIElOVCBJREVOVElUWSgxLDEpLApMb2dEYXRlIERBVEVUSU1FLApQcm9jZXNzSW5mbyBWQVJDSEFSKDUwKSwKVGV4dCBWQVJDSEFSKDQwMDApCik7CklOU0VSVCBJTlRPIEBMb2dTcWwxIGV4ZWMgc3BfcmVhZGVycm9ybG9nOwoK4oCUIFRhYmVsYSBwYXJhIHNvbWVudGUgZXJyb3MKREVDTEFSRSBATG9nU1FMMiBUQUJMRQooICAgIFNlcSBJTlQgSURFTlRJVFkoMSwxKSwKTG9nRGF0ZSBEQVRFVElNRSwKUHJvY2Vzc0luZm8gVkFSQ0hBUig1MCksClRleHQgVkFSQ0hBUig0MDAwKQopOwpJTlNFUlQgSU5UTyBATG9nU1FMMgpTRUxFQ1QgVE9QIDMwCkxvZ0RhdGUsIFByb2Nlc3NJbmZvLCBUZXh0CkZST00gQExvZ1NRTDEgbApXSEVSRSBsLlRleHQgTElLRSDigJglZXJybyXigJkKT1JERVIgQlkgMSBERVNDOwpTRVQgQFF0ID0gQEBST1dDT1VOVDsKU0VUIEB2Qm9keSA9IEB2Qm9keSArCuKAmAo8YnI+PGJyPgo8aDM+w5psdGltb3MgMzAgcmVnaXN0cm9zIGNvbnRlbmRvIGEgcGFsYXZyYSDigJxlcnJv4oCdIG5vIExvZyBkZSBFcnJvcyBkbyBTUUwgU2VydmVyPC9oMz4KPHRhYmxlIGJvcmRlcj0xIGNlbGxwYWRkaW5nPTI+Cjx0cj4KPHRoPkRhdGEgZG8gTG9nPC90aD4KPHRoPlByb2Nlc3NvPC90aD4KPHRoPlRleHRvPC90aD4KPC90cj4K4oCYOwpXSElMRSBATG9vcCA8PSBAUXQKQkVHSU4KU0VUIEB2Qm9keSA9IEB2Qm9keSArCigKU0VMRUNUCuKAmDx0cj7igJkrCuKAmDx0ZD7igJkrQ09OVkVSVChWQVJDSEFSLExvZ0RhdGUpKyc8L3RkPuKAmSsK4oCYPHRkPuKAmStDT05WRVJUKFZBUkNIQVIsUHJvY2Vzc0luZm8pKyc8L3RkPuKAmSsK4oCYPHRkPuKAmStDT05WRVJUKE5WQVJDSEFSKDQwMDApLFRleHQpKyc8L3RkPuKAmSsK4oCYPC90cj7igJkKRlJPTSBATG9nU1FMMiB0CldIRVJFIHQuU2VxID0gQExvb3AKKTsKU0VUIEBMb29wID0gQExvb3AgKzE7CkVORDsKU0VUIEB2Qm9keSA9IEB2Qm9keSArIOKAmDwvdGFibGU+4oCZOwoK4oCUIMO6bHRpbW9zIDMwIHJlZ2lzdHJvcwpERUNMQVJFIEBMb2dTUUwzIFRBQkxFCiggICAgU2VxIElOVCBJREVOVElUWSgxLDEpLApMb2dEYXRlIERBVEVUSU1FLApQcm9jZXNzSW5mbyBWQVJDSEFSKDUwKSwKVGV4dCBWQVJDSEFSKDQwMDApCik7CklOU0VSVCBJTlRPIEBMb2dTUUwzClNFTEVDVCBUT1AgMzAKTG9nRGF0ZSwgUHJvY2Vzc0luZm8sIFRleHQKRlJPTSBATG9nU1FMMSBsCk9SREVSIEJZIDEgREVTQzsKU0VUIEBRdCA9IEBAUk9XQ09VTlQ7ClNFVCBATG9vcCA9IDE7ClNFVCBAdkJvZHkgPSBAdkJvZHkgKwrigJgKPGJyPjxicj4KPGgzPsOabHRpbW9zIDMwIHJlZ2lzdHJvcyBkbyBMb2cgZGUgRXJyb3MgZG8gU1FMIFNlcnZlcjwvaDM+Cjx0YWJsZSBib3JkZXI9MSBjZWxscGFkZGluZz0yPgo8dHI+Cjx0aD5EYXRhIGRvIExvZzwvdGg+Cjx0aD5Qcm9jZXNzbzwvdGg+Cjx0aD5UZXh0bzwvdGg+CjwvdHI+CuKAmDsKV0hJTEUgQExvb3AgPD0gQFF0CkJFR0lOClNFVCBAdkJvZHkgPSBAdkJvZHkgKwooClNFTEVDVArigJg8dHI+4oCZKwrigJg8dGQ+4oCZK0NPTlZFUlQoVkFSQ0hBUixMb2dEYXRlKSsnPC90ZD7igJkrCuKAmDx0ZD7igJkrQ09OVkVSVChWQVJDSEFSLFByb2Nlc3NJbmZvKSsnPC90ZD7igJkrCuKAmDx0ZD7igJkrQ09OVkVSVChWQVJDSEFSKDQwMDApLFRleHQpKyc8L3RkPuKAmSsK4oCYPC90cj7igJkKRlJPTSBATG9nU1FMMyB0CldIRVJFIHQuU2VxID0gQExvb3AKKTsKU0VUIEBMb29wID0gQExvb3AgKzE7CkVORDsKU0VUIEB2Qm9keSA9IEB2Qm9keSArIOKAmDwvdGFibGU+4oCZOwoK4oCUICoqKiBQYXJ0ZSAzOiBUYW1hbmhvIGRvcyBkaXNjb3MKREVDTEFSRSBAdkZpeGVkX0RyaXZlc19GcmVlX1NwYWNlX1RhYmxlIEFTIFRBQkxFCiggICAgZHJpdmVfbGV0dGVyIFZBUkNIQVIgKDUpLApmcmVlX3NwYWNlX21iIEJJR0lOVCwKU2VxIElOVCBJREVOVElUWSgxLDEpKTsKSU5TRVJUIElOVE8gQHZGaXhlZF9Ecml2ZXNfRnJlZV9TcGFjZV9UYWJsZQooCmRyaXZlX2xldHRlcgosZnJlZV9zcGFjZV9tYgopCkVYRUMgbWFzdGVyLmRiby54cF9maXhlZGRyaXZlczsKClNFVCBAUXQgPSBAQFJPV0NPVU5UOwpTRVQgQExvb3AgPSAxOwoKU0VUIEB2Qm9keSA9IEB2Qm9keSArCuKAmAo8YnI+PGJyPgo8aDM+RXNwYcOnbyBsaXZyZSBuYXMgdW5pZGFkZXMgZGUgZGlzY288L2gzPgo8dGFibGUgYm9yZGVyPTEgY2VsbHBhZGRpbmc9Mj4KPHRyPgo8dGg+VW5pZGFkZTwvdGg+Cjx0aD5Fc3Bhw6dvIExpdnJlIChNQik8L3RoPgo8L3RyPgrigJg7CgpXSElMRSBATG9vcCA8PSBAUXQKQkVHSU4KU0VUIEB2Qm9keSA9IEB2Qm9keSArCigKU0VMRUNUCuKAmDx0cj7igJkrCuKAmDx0ZD7igJkrQ09OVkVSVChWQVJDSEFSLGRyaXZlX2xldHRlcikrJzwvdGQ+4oCZKwrigJg8dGQ+4oCZK1JFVkVSU0UgKFNVQlNUUklORyAoUkVWRVJTRSAoQ09OVkVSVCAoVkFSQ0hBUiAoMTUpLCBDT05WRVJUIChNT05FWSwgZnJlZV9zcGFjZV9tYiksIDEpKSwgNCwgMTUpKSsnPC90ZD7igJkrCuKAmDwvdHI+4oCZCkZST00gQHZGaXhlZF9Ecml2ZXNfRnJlZV9TcGFjZV9UYWJsZSB0CldIRVJFIHQuU2VxID0gQExvb3AKKTsKU0VUIEBMb29wID0gQExvb3AgKzE7CkVORDsKClNFVCBAdkJvZHkgPSBAdkJvZHkgKyDigJg8L3RhYmxlPuKAmTsKCuKAlCAqKiogUGFydGUgNDogdGFtYW5obyBkYXMgZGF0YWJhc2VzCkNSRUFURSBUQUJMRSAjVGFtYW5ob3MKKApTZXEgSU5UIElERU5USVRZLApCYW5jbyBWQVJDSEFSKDUwKSwKQXJxdWl2b0RlRGFkb3NfRXNwYWNvUmVzZXJ2YWRvRW1EaXNjb19NQiBERUNJTUFMKDE1LDIpLApBcnF1aXZvRGVEYWRvc19Fc3BhY29Vc2Fkb19NQiBERUNJTUFMKDE1LDIpLApBcnF1aXZvRGVEYWRvc19Fc3BhY29MaXZyZV9NQiBERUNJTUFMKDE1LDIpCik7CgpFWEVDIHNwX01TZm9yZWFjaGRiIOKAmFVTRSA/CklOU0VSVCBJTlRPICNUYW1hbmhvcwooCkJhbmNvCiwgQXJxdWl2b0RlRGFkb3NfRXNwYWNvUmVzZXJ2YWRvRW1EaXNjb19NQgosIEFycXVpdm9EZURhZG9zX0VzcGFjb1VzYWRvX01CCiwgQXJxdWl2b0RlRGFkb3NfRXNwYWNvTGl2cmVfTUIKKQpTRUxFQ1QKREJfTkFNRSgpIEJhbmNvCiwgQ0FTVChhLkVzcGFjb1Jlc2VydmFkb0VtRGlzY28gQVMgREVDSU1BTCgxNSwyKSkgRXNwYWNvUmVzZXJ2YWRvRW1EaXNjb19NQgosIENBU1QoYS5Fc3BhY29Vc2FkbyBBUyBERUNJTUFMKDE1LDIpKSBFc3BhY29Vc2Fkb19NQgosIENBU1QoYS5Fc3BhY29SZXNlcnZhZG9FbURpc2NvIOKAkyBhLkVzcGFjb1VzYWRvIEFTIERFQ0lNQUwoMTUsMikpIEVzcGFjb0xpdnJlX01CCkZST00KKApzZWxlY3QKKHNlbGVjdCBTVU0ocHMucmVzZXJ2ZWRfcGFnZV9jb3VudCkvMTI4LjAgZnJvbSBzeXMuZG1fZGJfcGFydGl0aW9uX3N0YXRzIHBzKSBFc3BhY29Vc2FkbwosIChzZWxlY3QgU1VNKHNpemUvMTI4LjApIGZyb20gc3lzLmRhdGFiYXNlX2ZpbGVzIHdoZXJlIHR5cGUgSU4gKDAsMiw0KSkgRXNwYWNvUmVzZXJ2YWRvRW1EaXNjbwopIGHigJk7CgpERUNMQVJFIEBUYW1hbmhvcyBUQUJMRQooClNlcSBJTlQgSURFTlRJVFksCkJhbmNvIFZBUkNIQVIoNTApLApBcnF1aXZvRGVEYWRvc19Fc3BhY29SZXNlcnZhZG9FbURpc2NvX01CIERFQ0lNQUwoMTUsMiksCkFycXVpdm9EZURhZG9zX0VzcGFjb1VzYWRvX01CIERFQ0lNQUwoMTUsMiksCkFycXVpdm9EZURhZG9zX0VzcGFjb0xpdnJlX01CIERFQ0lNQUwoMTUsMiksCkFycXVpdm9EZUxvZ19Fc3BhY29SZXNlcnZhZG9FbURpc2NvX01CIERFQ0lNQUwoMTUsMiksCkFycXVpdm9EZUxvZ19Fc3BhY29Vc2Fkb19NQiBERUNJTUFMKDE1LDIpLApBcnF1aXZvRGVMb2dfRXNwYWNvTGl2cmVfTUIgREVDSU1BTCgxNSwyKQopOwoKSU5TRVJUIElOVE8gQFRhbWFuaG9zClNFTEVDVAp0LkJhbmNvCiwgdC5BcnF1aXZvRGVEYWRvc19Fc3BhY29SZXNlcnZhZG9FbURpc2NvX01CCiwgdC5BcnF1aXZvRGVEYWRvc19Fc3BhY29Vc2Fkb19NQgosIHQuQXJxdWl2b0RlRGFkb3NfRXNwYWNvTGl2cmVfTUIKLCBsLkVzcGFjb1Jlc2VydmFkb0VtRGlzY29fTUIgQVMgQXJxdWl2b0RlTG9nX0VzcGFjb1Jlc2VydmFkb0VtRGlzY29fTUIKLCBsLkVzcGFjb1VzYWRvX01CIEFTIEFycXVpdm9EZUxvZ19Fc3BhY29Vc2Fkb19NQgosIENBU1QobC5Fc3BhY29SZXNlcnZhZG9FbURpc2NvX01CLWwuRXNwYWNvVXNhZG9fTUIgQVMgREVDSU1BTCgxMCwyKSkgQXJxdWl2b0RlTG9nX0VzcGFjb0xpdnJlX01CCkZST00gI1RhbWFuaG9zIHQKSk9JTgooClNFTEVDVCBhLkJhbmNvLCBhLkVzcGFjb1Jlc2VydmFkb0VtRGlzY29fTUIsIGIuRXNwYWNvVXNhZG9fTUIKRlJPTQooCnNlbGVjdApSVFJJTShwLmluc3RhbmNlX25hbWUpIEFTIEJhbmNvCiwgQ0FTVChwLmNudHJfdmFsdWUvMTAyNC4wIEFTIERFQ0lNQUwoMTUsMikpIEFTIEVzcGFjb1Jlc2VydmFkb0VtRGlzY29fTUIKZnJvbSBzeXMuZG1fb3NfcGVyZm9ybWFuY2VfY291bnRlcnMgcApXSEVSRSBwLmNvdW50ZXJfbmFtZSBMSUtFIOKAmExvZyBGaWxlKHMpIFNpemUgKEtCKSXigJkKKSBhCkpPSU4KKApzZWxlY3QKUlRSSU0ocC5pbnN0YW5jZV9uYW1lKSBBUyBCYW5jbwosIENBU1QocC5jbnRyX3ZhbHVlLzEwMjQuMCBBUyBERUNJTUFMKDE1LDIpKSBBUyBFc3BhY29Vc2Fkb19NQgpmcm9tIHN5cy5kbV9vc19wZXJmb3JtYW5jZV9jb3VudGVycyBwCndoZXJlIHAuY291bnRlcl9uYW1lIExJS0Ug4oCYTG9nIEZpbGUocykgVXNlZCBTaXplIChLQikl4oCZCikgYiBPTiBhLkJhbmNvID0gYi5CYW5jbwpXSEVSRSBhLkJhbmNvIE5PVCBJTiAo4oCYX1RvdGFs4oCZLCDigJhtc3NxbHN5c3RlbXJlc291cmNl4oCZLCDigJh0ZW1wZGLigJksIOKAmG1hc3RlcuKAmSwg4oCYbW9kZWzigJksIOKAmG1zZGLigJkpCikgbCBPTiB0LkJhbmNvID0gbC5CYW5jbwpPUkRFUiBCWSBCYW5jbzsKCkRST1AgVEFCTEUgI1RhbWFuaG9zOwoKU0VUIEB2Qm9keSA9IEB2Qm9keSArCuKAmAo8YnI+PGJyPgo8aDM+VGFtYW5obyBkb3MgQmFuY29zIGRlIERhZG9zIGRlIFVzdcOhcmlvPC9oMz4KPHRhYmxlIGJvcmRlcj0xIGNlbGxwYWRkaW5nPTI+Cjx0cj4KPHRoPkJhbmNvPC90aD4KPHRoPkFycXVpdm8gZGUgRGFkb3Mg4oCTIEVzcGHDp28gUmVzZXJ2YWRvIGVtIERpc2NvIChNQik8L3RoPgo8dGg+RXNwYcOnbyBVc2FkbyAoTUIpPC90aD4KPHRoPkVzcGHDp28gTGl2cmUgKE1CKTwvdGg+Cjx0aD5BcnF1aXZvIGRlIExvZyDigJMgRXNwYcOnbyBSZXNlcnZhZG8gZW0gRGlzY28gKE1CKTwvdGg+Cjx0aD5Fc3Bhw6dvIFVzYWRvIChNQik8L3RoPgo8dGg+RXNwYcOnbyBMaXZyZSAoTUIpPC90aD4KPC90cj4K4oCYOwoKU0VMRUNUIEBRdCA9IENPVU5UKCopIEZST00gQFRhbWFuaG9zIHQ7ClNFVCBATG9vcCA9IDE7CldISUxFIEBMb29wIDw9IEBRdApCRUdJTgpTRVQgQHZCb2R5ID0gQHZCb2R5ICsKKApTRUxFQ1QK4oCYPHRyPuKAmSsK4oCYPHRkPuKAmSsgQmFuY28gKyc8L3RkPuKAmSsK4oCYPHRkPuKAmStDT05WRVJUKFZBUkNIQVIoMjApLHQuQXJxdWl2b0RlRGFkb3NfRXNwYWNvUmVzZXJ2YWRvRW1EaXNjb19NQikrJzwvdGQ+4oCZKwrigJg8dGQ+4oCZK0NPTlZFUlQoVkFSQ0hBUigyMCksdC5BcnF1aXZvRGVEYWRvc19Fc3BhY29Vc2Fkb19NQikrJzwvdGQ+4oCZKwrigJg8dGQ+4oCZK0NPTlZFUlQoVkFSQ0hBUigyMCksdC5BcnF1aXZvRGVEYWRvc19Fc3BhY29MaXZyZV9NQikrJzwvdGQ+4oCZKwrigJg8dGQ+4oCZK0NPTlZFUlQoVkFSQ0hBUigyMCksdC5BcnF1aXZvRGVMb2dfRXNwYWNvUmVzZXJ2YWRvRW1EaXNjb19NQikrJzwvdGQ+4oCZKwrigJg8dGQ+4oCZK0NPTlZFUlQoVkFSQ0hBUigyMCksdC5BcnF1aXZvRGVMb2dfRXNwYWNvVXNhZG9fTUIpKyc8L3RkPuKAmSsK4oCYPHRkPuKAmStDT05WRVJUKFZBUkNIQVIoMjApLHQuQXJxdWl2b0RlTG9nX0VzcGFjb0xpdnJlX01CKSsnPC90ZD7igJkrCuKAmDwvdHI+4oCZCkZST00gQFRhbWFuaG9zIHQKV0hFUkUgdC5TZXEgPSBATG9vcAopOwpTRVQgQExvb3AgPSBATG9vcCArMTsKRU5EOwoKU0VUIEB2Qm9keSA9IEB2Qm9keSArIOKAmDwvdGFibGU+4oCZOwoK4oCUICoqKiBQYXJ0ZSA1OiBUZW1wREIgU2l6ZQpTRVQgQHZCb2R5ID0gQHZCb2R5ICsK4oCYCjxicj48YnI+CjxoMz5Fc3Bhw6dvIG5vIFRlbXBEQjwvaDM+Cjx0YWJsZSBib3JkZXI9MSBjZWxscGFkZGluZz0yPgo8dHI+Cjx0aD5Qw6FnaW5hcyBMaXZyZXM8L3RoPgo8dGg+RXNwYcOnbyBMaXZyZSBlbSBNQjwvdGg+CjwvdHI+CuKAmDsKU0VUIEB2Qm9keSA9IEB2Qm9keSArCigKU0VMRUNUCuKAmDx0cj7igJkrCuKAmDx0ZD7igJkrQ09OVkVSVChWQVJDSEFSKDIwKSxTVU0odW5hbGxvY2F0ZWRfZXh0ZW50X3BhZ2VfY291bnQpKSsnPC90ZD7igJkrCuKAmDx0ZD7igJkrQ09OVkVSVChWQVJDSEFSKDIwKSxDQVNUKFNVTSh1bmFsbG9jYXRlZF9leHRlbnRfcGFnZV9jb3VudCkvMTI4LjAgQVMgZGVjaW1hbCgxNSwyKSkpKyc8L3RkPuKAmSsK4oCYPC90cj7igJkKRlJPTSBzeXMuZG1fZGJfZmlsZV9zcGFjZV91c2FnZQopOwpTRVQgQHZCb2R5ID0gQHZCb2R5ICsg4oCYPC90YWJsZT7igJk7CgrigJQgKioqIFBhcnRlIDY6IExhc3QgYmFja3VwIHdpdGggc3VjY2VzcwpTRVQgQHZCb2R5ID0gQHZCb2R5ICsK4oCYCjxicj48YnI+CjxoMz7Dmmx0aW1vcyBCYWNrdXBzIFJlYWxpemFkb3M8L2gzPgo8dGFibGUgYm9yZGVyPTEgY2VsbHBhZGRpbmc9Mj4KPHRyPgo8dGg+QmFuY288L3RoPgo8dGg+RGVzY3Jpw6fDo28gT3BjaW9uYWwgZG8gQmFja3VwPC90aD4KPHRoPk1vZGVsbyBkZSBSZWNvdmVyeTwvdGg+Cjx0aD5EYXRhIGUgSG9yYSBkZSBJbsOtY2lvPC90aD4KPHRoPklkYWRlIGVtIGRpYXM8L3RoPgo8dGg+VGFtYW5obyBkbyBCYWNrdXAgZW0gTUI8L3RoPgo8dGg+VGlwbzwvdGg+Cjx0aD5BcnF1aXZvPC90aD4KPC90cj4K4oCYOwpERUNMQVJFIEBCYWNrdXBzIFRBQkxFCigKc2VxIElOVCBpZGVudGl0eSgxLDEpLApkYXRhYmFzZV9uYW1lIE5WQVJDSEFSKDEyOCksCnNlcnZlcl9uYW1lIE5WQVJDSEFSKDEyOCksCm5hbWUgIE5WQVJDSEFSKDEyOCksCnJlY292ZXJ5X21vZGVsICBOVkFSQ0hBUig2MCksCmJhY2t1cF9zdGFydF9kYXRlIERBVEVUSU1FLApkYXlzX2FnbyBWQVJDSEFSKDE1KSwKYmFja3VwX3NpemVfbWIgVkFSQ0hBUigxNSksCnR5cGUgY2hhcigxKSwKYmFja3VwX3R5cGUgdmFyY2hhcigyMSksCnBoeXNpY2FsX2RldmljZV9uYW1lIG52YXJjaGFyKDI2MCkKKTsKCklOU0VSVCBJTlRPIEBCYWNrdXBzCnNlbGVjdApzLmRhdGFiYXNlX25hbWUKLCBzLnNlcnZlcl9uYW1lCiwgSVNOVUxMKHMubmFtZSzigJ0pCiwgcy5yZWNvdmVyeV9tb2RlbAosIHMuYmFja3VwX3N0YXJ0X2RhdGUKLFJFVkVSU0UgKFNVQlNUUklORyAoUkVWRVJTRSAoQ09OVkVSVCAoVkFSQ0hBUiAoMTUpLCBDT05WRVJUIChNT05FWSwgREFURURJRkYgKERBWSwgcy5iYWNrdXBfc3RhcnRfZGF0ZSwgR0VUREFURSAoKSkpLCAxKSksIDQsIDE1KSkgQVMgZGF5c19hZ28KLFJFVkVSU0UgKFNVQlNUUklORyAoUkVWRVJTRSAoQ09OVkVSVCAoVkFSQ0hBUiAoMTUpLCBDT05WRVJUIChNT05FWSwgUk9VTkQgKHMuYmFja3VwX3NpemUvMTA0ODU3Ni4wLCAwKSksIDEpKSwgNCwgMTUpKSBBUyBiYWNrdXBfc2l6ZV9tYgosIHMudHlwZQosKENBU0UKV0hFTiBzLnR5cGUgPSDigJhE4oCZIFRIRU4g4oCYRGF0YWJhc2XigJkKV0hFTiBzLnR5cGUgPSDigJhG4oCZIFRIRU4g4oCYRmlsZSBPciBGaWxlZ3JvdXDigJkKV0hFTiBzLnR5cGUgPSDigJhH4oCZIFRIRU4g4oCYRGlmZmVyZW50aWFsIEZpbGXigJkKV0hFTiBzLnR5cGUgPSDigJhJ4oCZIFRIRU4g4oCYRGlmZmVyZW50aWFsIERhdGFiYXNl4oCZCldIRU4gcy50eXBlID0g4oCYTOKAmSBUSEVOIOKAmExvZ+KAmQpXSEVOIHMudHlwZSA9IOKAmFDigJkgVEhFTiDigJhQYXJ0aWFs4oCZCldIRU4gcy50eXBlID0g4oCYUeKAmSBUSEVOIOKAmERpZmZlcmVudGlhbCBQYXJ0aWFs4oCZCkVMU0Ug4oCYTi9B4oCZCkVORCkgQVMgYmFja3VwX3R5cGUKLCBmLnBoeXNpY2FsX2RldmljZV9uYW1lCmZyb20gbXNkYi5kYm8uYmFja3Vwc2V0IHMKSk9JTiBtc2RiLmRiby5iYWNrdXBtZWRpYWZhbWlseSBmIE9OIHMubWVkaWFfc2V0X2lkID0gZi5tZWRpYV9zZXRfaWQKV0hFUkUgcy5iYWNrdXBfc2V0X2lkID0KKCAgICBTRUxFQ1QgVE9QIDEgYS5iYWNrdXBfc2V0X2lkCkZST00gbXNkYi5kYm8uYmFja3Vwc2V0IGEKV0hFUkUgYS5kYXRhYmFzZV9uYW1lID0gcy5kYXRhYmFzZV9uYW1lCk9SREVSIEJZIGEuYmFja3VwX3NldF9pZCBERVNDICAgICkKT1JERVIgQlkgcy5kYXRhYmFzZV9uYW1lOwoKU0VMRUNUIEBRdCA9IEBAUk9XQ09VTlQ7ClNFVCBATG9vcCA9IDE7CldISUxFIEBMb29wIDw9IEBRdApCRUdJTgpTRVQgQHZCb2R5ID0gQHZCb2R5ICsKKApzZWxlY3QK4oCYPHRyPuKAmSsK4oCYPHRkPuKAmStDT05WRVJUKFZBUkNIQVIoMTI4KSxkYXRhYmFzZV9uYW1lKSsnPC90ZD7igJkrCuKAmDx0ZD7igJkrQ09OVkVSVChWQVJDSEFSKDEyOCksbmFtZSkrJzwvdGQ+4oCZKwrigJg8dGQ+4oCZK0NPTlZFUlQoVkFSQ0hBUig2MCkscmVjb3ZlcnlfbW9kZWwpKyc8L3RkPuKAmSsK4oCYPHRkPuKAmStDT05WRVJUKFZBUkNIQVIoMjApLGJhY2t1cF9zdGFydF9kYXRlLCAxMykrJzwvdGQ+4oCZKwrigJg8dGQ+4oCZK0NPTlZFUlQoVkFSQ0hBUigxMCksZGF5c19hZ28pKyc8L3RkPuKAmSsK4oCYPHRkPuKAmStDT05WRVJUKFZBUkNIQVIoMTApLGJhY2t1cF9zaXplX21iKSsnPC90ZD7igJkrCuKAmDx0ZD7igJkrQ09OVkVSVChWQVJDSEFSKDI1KSxiYWNrdXBfdHlwZSkrJzwvdGQ+4oCZKwrigJg8dGQ+4oCZK0NPTlZFUlQoVkFSQ0hBUigyNjApLHBoeXNpY2FsX2RldmljZV9uYW1lKSsnPC90ZD7igJkrCuKAmDwvdHI+4oCZCmZyb20gQEJhY2t1cHMKV0hFUkUgc2VxID0gQExvb3AKKTsKU0VUIEBMb29wID0gQExvb3AgKzE7CkVORDsKU0VUIEB2Qm9keSA9IEB2Qm9keSArIOKAmDwvdGFibGU+4oCZOwoK4oCUICoqKiBQYXJ0ZSA3OiBzdGF0dXMgZXhlY3V0aW9uIGpvYnMKU0VUIEB2Qm9keSA9IEB2Qm9keSArCuKAmAo8YnI+PGJyPgo8aDM+U3RhdHVzIGRhIMOabHRpbWEgRXhlY3XDp8OjbyBkb3MgSm9iczwvaDM+Cjx0YWJsZSBib3JkZXI9MSBjZWxscGFkZGluZz0yPgo8dHI+Cjx0aD5Ob21lPC90aD4KPHRoPlN0YXR1czwvdGg+Cjx0aD5NZW5zYWdlbTwvdGg+Cjx0aD5EYXRhIGRhIEV4ZWN1w6fDo288L3RoPgo8dGg+SG9yYSBkYSBFeGVjdcOnw6NvPC90aD4KPC90cj4K4oCYOwpERUNMQVJFIEBKb2JzIFRBQkxFCigKU2VxIElOVCBJREVOVElUWSwKbmFtZSBTWVNOQU1FLApzdGF0dXMgVkFSQ0hBUig1MCksCm1lc3NhZ2UgTlZBUkNIQVIoNDAwMCksCnJ1bl9kYXRlIHZhcmNoYXIoMjApLApydW5fdGltZSB2YXJjaGFyKDIwKQopOwpJTlNFUlQgSU5UTyBASm9icwpTRUxFQ1QKai5uYW1lCiwgKENBU0UgaC5ydW5fc3RhdHVzCldIRU4gMCBUSEVOIOKAmEZhbGhh4oCZCldIRU4gMSBUSEVOIOKAmFN1Y2Vzc2/igJkKV0hFTiAyIFRIRU4g4oCYUmVwZXRpcuKAmQpXSEVOIDMgVEhFTiDigJhDYW5jZWxhZG/igJkKV0hFTiA0IFRIRU4g4oCYRW0gUHJvZ3Jlc3Nv4oCZCkVORCkgW3N0YXR1c10KLCBoLm1lc3NhZ2UKLCBoLnJ1bl9kYXRlCiwgaC5ydW5fdGltZQpGUk9NIG1zZGIuZGJvLnN5c2pvYnMgagpDUk9TUyBBUFBMWQooICAgIFNFTEVDVCBUT1AgMSBoLnJ1bl9kYXRlLCBoLnJ1bl90aW1lLCBoLnJ1bl9zdGF0dXMsIGgubWVzc2FnZQpmcm9tIG1zZGIuZGJvLnN5c2pvYmhpc3RvcnkgaApXSEVSRSBoLnN0ZXBfaWQgPSAwCkFORCBoLmpvYl9pZCA9IGouam9iX2lkCk9SREVSIEJZIGguaW5zdGFuY2VfaWQgREVTQwopIGgKT1JERVIgQlkgbmFtZTsKClNFTEVDVCBAUXQgPSBAQFJPV0NPVU5UOwpTRVQgQExvb3AgPSAxOwpXSElMRSBATG9vcCA8PSBAUXQKQkVHSU4KU0VUIEB2Qm9keSA9IEB2Qm9keSArCigKc2VsZWN0CuKAmDx0cj7igJkrCuKAmDx0ZD7igJkrQ09OVkVSVChWQVJDSEFSKDEyOCksai5uYW1lKSsnPC90ZD7igJkrCuKAmDx0ZD7igJkrQ09OVkVSVChWQVJDSEFSKDUwKSxqLnN0YXR1cykrJzwvdGQ+4oCZKwrigJg8dGQ+4oCZK0NPTlZFUlQoTlZBUkNIQVIoNDAwMCksbWVzc2FnZSkrJzwvdGQ+4oCZKwrigJg8dGQ+4oCZK0NPTlZFUlQoVkFSQ0hBUigyMCksai5ydW5fZGF0ZSkrJzwvdGQ+4oCZKwrigJg8dGQ+4oCZK0NPTlZFUlQoVkFSQ0hBUigyMCksai5ydW5fdGltZSkrJzwvdGQ+4oCZKwrigJg8L3RyPuKAmQpmcm9tIEBKb2JzIGoKV0hFUkUgc2VxID0gQExvb3AKKTsKU0VUIEBMb29wID0gQExvb3AgKzE7CkVORDsKU0VUIEB2Qm9keSA9IEB2Qm9keSArIOKAmDwvdGFibGU+4oCZOwoK4oCUICoqKiBFbnZpYQppZiBARXhpYmlyQXBlbmFzSHRtbCA9IDAKZXhlYyBtc2RiLmRiby5zcF9zZW5kX2RibWFpbApAcmVjaXBpZW50cyA9IOKAmGFkZWlsc29ucmJyaXRvQGdtYWlsLmNvbeKAmSwKQHN1YmplY3Q9QHZTdWJqZWN0LApAYm9keT1AdkJvZHksCkBib2R5X2Zvcm1hdCA9IOKAmEhUTUzigJk7CuKAlCAqKiogRXhpYmUgY29tbyBIVE1MIGFvIGludsOpcyBkZSBlbnZpYXIgcG9yIGUtbWFpbAplbHNlClNFTEVDVCBAdkJvZHk7CgrigJQgKioqIEZpbmFsOiBlbGltaW5hIHRhYmVsYXMgdGVtcG9yw6FyaWFzCklGIE9CSkVDVF9JRCjigJh0ZW1wZGIuZGJvLiNUYW1hbmhvc+KAmSkgSVMgTk9UIE5VTEwKRFJPUCBUQUJMRSAjVGFtYW5ob3M7CklGIE9CSkVDVF9JRCjigJh0ZW1wZGIuZGJvLiNUYWJlbGHigJkpIElTIE5PVCBOVUxMCkRST1AgVEFCTEUgI1RhYmVsYTs=” hover_enabled=”0″]VVNFIERCQWRtaW4KR08KCi8qIFNQIHBhcmEgc2VyIGV4ZWN1dGFkYSBkaWFyaWFtZW50ZS4gRXhpYmUgcmVzdW1vIGRhIHNpdHVhw6fDo28gYXR1YWwgZG8gU0dEQi4gKi8KaWYgT0JKRUNUX0lEKOKAmGRiby51c3BSZWxhdG9yaW9EaWFyaW/igJkpIElTIE5PVCBOVUxMCkRST1AgUFJPQ0VEVVJFIGRiby51c3BSZWxhdG9yaW9EaWFyaW87CkdPCgpDUkVBVEUgUFJPQ0VEVVJFIGRiby51c3BSZWxhdG9yaW9EaWFyaW8gQEV4aWJpckFwZW5hc0h0bWwgQklUID0gMApBUwpTRVQgTEFOR1VBR0UgVVNfRU5HTElTSDsKClNFVCBOT0NPVU5UIE9OOwoK4oCUICoqKiBWYXJpw6F2ZWlzCkRFQ0xBUkUgQHZTdWJqZWN0IE5WQVJDSEFSKDI1NSkgPSDigJhSZWxhdMOzcmlvIERpw6FyaW8gZG8gU1FMIFNlcnZlcjog4oCYK0BAU0VSVkVSTkFNRTsKREVDTEFSRSBAdkJvZHkgQVMgTlZBUkNIQVIoTUFYKSA9IOKAnTsKCuKAlCAqKiogUGFydGUgMTogSW5mb3JtYcOnw7VlcyBkZSBjb25maWd1cmHDp8OjbyBkYSBpbnN0w6JuY2lhCklGIE9CSkVDVF9JRCjigJh0ZW1wZGIuZGJvLiNUYWJlbGHigJkpIElTIE5PVCBOVUxMCkRST1AgVEFCTEUgI1RhYmVsYTsKCkRFQ0xBUkUgQHZPbmxpbmVfU2luY2UgQVMgTlZBUkNIQVIgKDEwKSA9IOKAnTsKREVDTEFSRSBAdlVwdGltZV9EYXlzIEFTIElOVCA9IDA7CgpTRUxFQ1QKQHZPbmxpbmVfU2luY2UgPSBDT05WRVJUKE5WQVJDSEFSKDEwKSwgREIuc3Fsc2VydmVyX3N0YXJ0X3RpbWUsMTAzKQosIEB2VXB0aW1lX0RheXMgPSBEQVRFRElGRihEQVksREIuc3Fsc2VydmVyX3N0YXJ0X3RpbWUsR0VUREFURSgpKQpGUk9NCnN5cy5kbV9vc19zeXNfaW5mbyBEQjsKClNFTEVDVApTRVJWRVJQUk9QRVJUWSAo4oCYQ29tcHV0ZXJOYW1lUGh5c2ljYWxOZXRCSU9T4oCZKSBBUyBuZXRiaW9zX25hbWUKLEBAU0VSVkVSTkFNRSBBUyBzZXJ2ZXJfbmFtZQosU0VSVkVSUFJPUEVSVFko4oCYRURJVElPTuKAmSkgQVMgZWRpdGlvbgosU0VSVkVSUFJPUEVSVFkgKOKAmFByb2R1Y3RWZXJzaW9u4oCZKSBBUyB2ZXJzaW9uCixTRVJWRVJQUk9QRVJUWSAo4oCYUHJvZHVjdExldmVs4oCZKSBBUyBbbGV2ZWxdCixAdk9ubGluZV9TaW5jZSBBUyBvbmxpbmVfc2luY2UKLEB2VXB0aW1lX0RheXMgQVMgdXB0aW1lX2RheXMKSU5UTyAjVGFiZWxhOwoKU0VUIEB2Qm9keSA9CuKAmAo8aDM+SW5mb3JtYcOnw7VlcyBkYSBJbnN0w6JuY2lhPC9oMz4KPHRhYmxlIGJvcmRlcj3igJ0x4oCzIGNlbGxwYWRkaW5nPeKAnTLigLM+Cjx0cj4KPHRoPk5vbWUgTmV0QklPUzwvdGg+Cjx0aD5Ob21lIGRhIEluc3TDom5jaWE8L3RoPgo8dGg+RWRpw6fDo288L3RoPgo8dGg+VmVyc8OjbzwvdGg+Cjx0aD5MZXZlbDwvdGg+Cjx0aD5PbmxpbmUgZGVzZGU8L3RoPgo8dGg+UXRkZSBkZSBkaWFzIG9ubGluZTwvdGg+CjwvdHI+4oCZOwpTRVQgQHZCb2R5ID0gQHZCb2R5ICsKKApzZWxlY3QK4oCYPHRyPuKAmSsK4oCYPHRkPuKAmStDT05WRVJUKE5WQVJDSEFSLHQubmV0Ymlvc19uYW1lKSsnPC90ZD7igJkrCuKAmDx0ZD7igJkrQ09OVkVSVChOVkFSQ0hBUixzZXJ2ZXJfbmFtZSkrJzwvdGQ+4oCZKwrigJg8dGQ+4oCZK0NPTlZFUlQoTlZBUkNIQVIsZWRpdGlvbikrJzwvdGQ+4oCZKwrigJg8dGQ+4oCZK0NPTlZFUlQoTlZBUkNIQVIsdmVyc2lvbikrJzwvdGQ+4oCZKwrigJg8dGQ+4oCZK0NPTlZFUlQoTlZBUkNIQVIsbGV2ZWwpKyc8L3RkPuKAmSsK4oCYPHRkPuKAmStDT05WRVJUKE5WQVJDSEFSLG9ubGluZV9zaW5jZSkrJzwvdGQ+4oCZKwrigJg8dGQ+4oCZK0NPTlZFUlQoTlZBUkNIQVIsdXB0aW1lX2RheXMpKyc8L3RkPuKAmSsK4oCYPC90cj7igJkKZnJvbSBkYm8uI1RhYmVsYSB0CikKU0VUIEB2Qm9keSA9IEB2Qm9keSArIOKAmDwvdGFibGU+4oCZOwoK4oCUICoqKiBQYXJ0ZSAyOiBMb2cgZGUgZXJyb3IgZG8gU1FMCkRFQ0xBUkUKQFF0IElOVCA9IDAsCkBMb29wIElOVCA9IDE7CgpERUNMQVJFIEBMb2dTUUwxIFRBQkxFCiggICAgU2VxIElOVCBJREVOVElUWSgxLDEpLApMb2dEYXRlIERBVEVUSU1FLApQcm9jZXNzSW5mbyBWQVJDSEFSKDUwKSwKVGV4dCBWQVJDSEFSKDQwMDApCik7CklOU0VSVCBJTlRPIEBMb2dTcWwxIGV4ZWMgc3BfcmVhZGVycm9ybG9nOwoK4oCUIFRhYmVsYSBwYXJhIHNvbWVudGUgZXJyb3MKREVDTEFSRSBATG9nU1FMMiBUQUJMRQooICAgIFNlcSBJTlQgSURFTlRJVFkoMSwxKSwKTG9nRGF0ZSBEQVRFVElNRSwKUHJvY2Vzc0luZm8gVkFSQ0hBUig1MCksClRleHQgVkFSQ0hBUig0MDAwKQopOwpJTlNFUlQgSU5UTyBATG9nU1FMMgpTRUxFQ1QgVE9QIDMwCkxvZ0RhdGUsIFByb2Nlc3NJbmZvLCBUZXh0CkZST00gQExvZ1NRTDEgbApXSEVSRSBsLlRleHQgTElLRSDigJglZXJybyXigJkKT1JERVIgQlkgMSBERVNDOwpTRVQgQFF0ID0gQEBST1dDT1VOVDsKU0VUIEB2Qm9keSA9IEB2Qm9keSArCuKAmAo8YnI+PGJyPgo8aDM+w5psdGltb3MgMzAgcmVnaXN0cm9zIGNvbnRlbmRvIGEgcGFsYXZyYSDigJxlcnJv4oCdIG5vIExvZyBkZSBFcnJvcyBkbyBTUUwgU2VydmVyPC9oMz4KPHRhYmxlIGJvcmRlcj0xIGNlbGxwYWRkaW5nPTI+Cjx0cj4KPHRoPkRhdGEgZG8gTG9nPC90aD4KPHRoPlByb2Nlc3NvPC90aD4KPHRoPlRleHRvPC90aD4KPC90cj4K4oCYOwpXSElMRSBATG9vcCA8PSBAUXQKQkVHSU4KU0VUIEB2Qm9keSA9IEB2Qm9keSArCigKU0VMRUNUCuKAmDx0cj7igJkrCuKAmDx0ZD7igJkrQ09OVkVSVChWQVJDSEFSLExvZ0RhdGUpKyc8L3RkPuKAmSsK4oCYPHRkPuKAmStDT05WRVJUKFZBUkNIQVIsUHJvY2Vzc0luZm8pKyc8L3RkPuKAmSsK4oCYPHRkPuKAmStDT05WRVJUKE5WQVJDSEFSKDQwMDApLFRleHQpKyc8L3RkPuKAmSsK4oCYPC90cj7igJkKRlJPTSBATG9nU1FMMiB0CldIRVJFIHQuU2VxID0gQExvb3AKKTsKU0VUIEBMb29wID0gQExvb3AgKzE7CkVORDsKU0VUIEB2Qm9keSA9IEB2Qm9keSArIOKAmDwvdGFibGU+4oCZOwoK4oCUIMO6bHRpbW9zIDMwIHJlZ2lzdHJvcwpERUNMQVJFIEBMb2dTUUwzIFRBQkxFCiggICAgU2VxIElOVCBJREVOVElUWSgxLDEpLApMb2dEYXRlIERBVEVUSU1FLApQcm9jZXNzSW5mbyBWQVJDSEFSKDUwKSwKVGV4dCBWQVJDSEFSKDQwMDApCik7CklOU0VSVCBJTlRPIEBMb2dTUUwzClNFTEVDVCBUT1AgMzAKTG9nRGF0ZSwgUHJvY2Vzc0luZm8sIFRleHQKRlJPTSBATG9nU1FMMSBsCk9SREVSIEJZIDEgREVTQzsKU0VUIEBRdCA9IEBAUk9XQ09VTlQ7ClNFVCBATG9vcCA9IDE7ClNFVCBAdkJvZHkgPSBAdkJvZHkgKwrigJgKPGJyPjxicj4KPGgzPsOabHRpbW9zIDMwIHJlZ2lzdHJvcyBkbyBMb2cgZGUgRXJyb3MgZG8gU1FMIFNlcnZlcjwvaDM+Cjx0YWJsZSBib3JkZXI9MSBjZWxscGFkZGluZz0yPgo8dHI+Cjx0aD5EYXRhIGRvIExvZzwvdGg+Cjx0aD5Qcm9jZXNzbzwvdGg+Cjx0aD5UZXh0bzwvdGg+CjwvdHI+CuKAmDsKV0hJTEUgQExvb3AgPD0gQFF0CkJFR0lOClNFVCBAdkJvZHkgPSBAdkJvZHkgKwooClNFTEVDVArigJg8dHI+4oCZKwrigJg8dGQ+4oCZK0NPTlZFUlQoVkFSQ0hBUixMb2dEYXRlKSsnPC90ZD7igJkrCuKAmDx0ZD7igJkrQ09OVkVSVChWQVJDSEFSLFByb2Nlc3NJbmZvKSsnPC90ZD7igJkrCuKAmDx0ZD7igJkrQ09OVkVSVChWQVJDSEFSKDQwMDApLFRleHQpKyc8L3RkPuKAmSsK4oCYPC90cj7igJkKRlJPTSBATG9nU1FMMyB0CldIRVJFIHQuU2VxID0gQExvb3AKKTsKU0VUIEBMb29wID0gQExvb3AgKzE7CkVORDsKU0VUIEB2Qm9keSA9IEB2Qm9keSArIOKAmDwvdGFibGU+4oCZOwoK4oCUICoqKiBQYXJ0ZSAzOiBUYW1hbmhvIGRvcyBkaXNjb3MKREVDTEFSRSBAdkZpeGVkX0RyaXZlc19GcmVlX1NwYWNlX1RhYmxlIEFTIFRBQkxFCiggICAgZHJpdmVfbGV0dGVyIFZBUkNIQVIgKDUpLApmcmVlX3NwYWNlX21iIEJJR0lOVCwKU2VxIElOVCBJREVOVElUWSgxLDEpKTsKSU5TRVJUIElOVE8gQHZGaXhlZF9Ecml2ZXNfRnJlZV9TcGFjZV9UYWJsZQooCmRyaXZlX2xldHRlcgosZnJlZV9zcGFjZV9tYgopCkVYRUMgbWFzdGVyLmRiby54cF9maXhlZGRyaXZlczsKClNFVCBAUXQgPSBAQFJPV0NPVU5UOwpTRVQgQExvb3AgPSAxOwoKU0VUIEB2Qm9keSA9IEB2Qm9keSArCuKAmAo8YnI+PGJyPgo8aDM+RXNwYcOnbyBsaXZyZSBuYXMgdW5pZGFkZXMgZGUgZGlzY288L2gzPgo8dGFibGUgYm9yZGVyPTEgY2VsbHBhZGRpbmc9Mj4KPHRyPgo8dGg+VW5pZGFkZTwvdGg+Cjx0aD5Fc3Bhw6dvIExpdnJlIChNQik8L3RoPgo8L3RyPgrigJg7CgpXSElMRSBATG9vcCA8PSBAUXQKQkVHSU4KU0VUIEB2Qm9keSA9IEB2Qm9keSArCigKU0VMRUNUCuKAmDx0cj7igJkrCuKAmDx0ZD7igJkrQ09OVkVSVChWQVJDSEFSLGRyaXZlX2xldHRlcikrJzwvdGQ+4oCZKwrigJg8dGQ+4oCZK1JFVkVSU0UgKFNVQlNUUklORyAoUkVWRVJTRSAoQ09OVkVSVCAoVkFSQ0hBUiAoMTUpLCBDT05WRVJUIChNT05FWSwgZnJlZV9zcGFjZV9tYiksIDEpKSwgNCwgMTUpKSsnPC90ZD7igJkrCuKAmDwvdHI+4oCZCkZST00gQHZGaXhlZF9Ecml2ZXNfRnJlZV9TcGFjZV9UYWJsZSB0CldIRVJFIHQuU2VxID0gQExvb3AKKTsKU0VUIEBMb29wID0gQExvb3AgKzE7CkVORDsKClNFVCBAdkJvZHkgPSBAdkJvZHkgKyDigJg8L3RhYmxlPuKAmTsKCuKAlCAqKiogUGFydGUgNDogdGFtYW5obyBkYXMgZGF0YWJhc2VzCkNSRUFURSBUQUJMRSAjVGFtYW5ob3MKKApTZXEgSU5UIElERU5USVRZLApCYW5jbyBWQVJDSEFSKDUwKSwKQXJxdWl2b0RlRGFkb3NfRXNwYWNvUmVzZXJ2YWRvRW1EaXNjb19NQiBERUNJTUFMKDE1LDIpLApBcnF1aXZvRGVEYWRvc19Fc3BhY29Vc2Fkb19NQiBERUNJTUFMKDE1LDIpLApBcnF1aXZvRGVEYWRvc19Fc3BhY29MaXZyZV9NQiBERUNJTUFMKDE1LDIpCik7CgpFWEVDIHNwX01TZm9yZWFjaGRiIOKAmFVTRSA/CklOU0VSVCBJTlRPICNUYW1hbmhvcwooCkJhbmNvCiwgQXJxdWl2b0RlRGFkb3NfRXNwYWNvUmVzZXJ2YWRvRW1EaXNjb19NQgosIEFycXVpdm9EZURhZG9zX0VzcGFjb1VzYWRvX01CCiwgQXJxdWl2b0RlRGFkb3NfRXNwYWNvTGl2cmVfTUIKKQpTRUxFQ1QKREJfTkFNRSgpIEJhbmNvCiwgQ0FTVChhLkVzcGFjb1Jlc2VydmFkb0VtRGlzY28gQVMgREVDSU1BTCgxNSwyKSkgRXNwYWNvUmVzZXJ2YWRvRW1EaXNjb19NQgosIENBU1QoYS5Fc3BhY29Vc2FkbyBBUyBERUNJTUFMKDE1LDIpKSBFc3BhY29Vc2Fkb19NQgosIENBU1QoYS5Fc3BhY29SZXNlcnZhZG9FbURpc2NvIOKAkyBhLkVzcGFjb1VzYWRvIEFTIERFQ0lNQUwoMTUsMikpIEVzcGFjb0xpdnJlX01CCkZST00KKApzZWxlY3QKKHNlbGVjdCBTVU0ocHMucmVzZXJ2ZWRfcGFnZV9jb3VudCkvMTI4LjAgZnJvbSBzeXMuZG1fZGJfcGFydGl0aW9uX3N0YXRzIHBzKSBFc3BhY29Vc2FkbwosIChzZWxlY3QgU1VNKHNpemUvMTI4LjApIGZyb20gc3lzLmRhdGFiYXNlX2ZpbGVzIHdoZXJlIHR5cGUgSU4gKDAsMiw0KSkgRXNwYWNvUmVzZXJ2YWRvRW1EaXNjbwopIGHigJk7CgpERUNMQVJFIEBUYW1hbmhvcyBUQUJMRQooClNlcSBJTlQgSURFTlRJVFksCkJhbmNvIFZBUkNIQVIoNTApLApBcnF1aXZvRGVEYWRvc19Fc3BhY29SZXNlcnZhZG9FbURpc2NvX01CIERFQ0lNQUwoMTUsMiksCkFycXVpdm9EZURhZG9zX0VzcGFjb1VzYWRvX01CIERFQ0lNQUwoMTUsMiksCkFycXVpdm9EZURhZG9zX0VzcGFjb0xpdnJlX01CIERFQ0lNQUwoMTUsMiksCkFycXVpdm9EZUxvZ19Fc3BhY29SZXNlcnZhZG9FbURpc2NvX01CIERFQ0lNQUwoMTUsMiksCkFycXVpdm9EZUxvZ19Fc3BhY29Vc2Fkb19NQiBERUNJTUFMKDE1LDIpLApBcnF1aXZvRGVMb2dfRXNwYWNvTGl2cmVfTUIgREVDSU1BTCgxNSwyKQopOwoKSU5TRVJUIElOVE8gQFRhbWFuaG9zClNFTEVDVAp0LkJhbmNvCiwgdC5BcnF1aXZvRGVEYWRvc19Fc3BhY29SZXNlcnZhZG9FbURpc2NvX01CCiwgdC5BcnF1aXZvRGVEYWRvc19Fc3BhY29Vc2Fkb19NQgosIHQuQXJxdWl2b0RlRGFkb3NfRXNwYWNvTGl2cmVfTUIKLCBsLkVzcGFjb1Jlc2VydmFkb0VtRGlzY29fTUIgQVMgQXJxdWl2b0RlTG9nX0VzcGFjb1Jlc2VydmFkb0VtRGlzY29fTUIKLCBsLkVzcGFjb1VzYWRvX01CIEFTIEFycXVpdm9EZUxvZ19Fc3BhY29Vc2Fkb19NQgosIENBU1QobC5Fc3BhY29SZXNlcnZhZG9FbURpc2NvX01CLWwuRXNwYWNvVXNhZG9fTUIgQVMgREVDSU1BTCgxMCwyKSkgQXJxdWl2b0RlTG9nX0VzcGFjb0xpdnJlX01CCkZST00gI1RhbWFuaG9zIHQKSk9JTgooClNFTEVDVCBhLkJhbmNvLCBhLkVzcGFjb1Jlc2VydmFkb0VtRGlzY29fTUIsIGIuRXNwYWNvVXNhZG9fTUIKRlJPTQooCnNlbGVjdApSVFJJTShwLmluc3RhbmNlX25hbWUpIEFTIEJhbmNvCiwgQ0FTVChwLmNudHJfdmFsdWUvMTAyNC4wIEFTIERFQ0lNQUwoMTUsMikpIEFTIEVzcGFjb1Jlc2VydmFkb0VtRGlzY29fTUIKZnJvbSBzeXMuZG1fb3NfcGVyZm9ybWFuY2VfY291bnRlcnMgcApXSEVSRSBwLmNvdW50ZXJfbmFtZSBMSUtFIOKAmExvZyBGaWxlKHMpIFNpemUgKEtCKSXigJkKKSBhCkpPSU4KKApzZWxlY3QKUlRSSU0ocC5pbnN0YW5jZV9uYW1lKSBBUyBCYW5jbwosIENBU1QocC5jbnRyX3ZhbHVlLzEwMjQuMCBBUyBERUNJTUFMKDE1LDIpKSBBUyBFc3BhY29Vc2Fkb19NQgpmcm9tIHN5cy5kbV9vc19wZXJmb3JtYW5jZV9jb3VudGVycyBwCndoZXJlIHAuY291bnRlcl9uYW1lIExJS0Ug4oCYTG9nIEZpbGUocykgVXNlZCBTaXplIChLQikl4oCZCikgYiBPTiBhLkJhbmNvID0gYi5CYW5jbwpXSEVSRSBhLkJhbmNvIE5PVCBJTiAo4oCYX1RvdGFs4oCZLCDigJhtc3NxbHN5c3RlbXJlc291cmNl4oCZLCDigJh0ZW1wZGLigJksIOKAmG1hc3RlcuKAmSwg4oCYbW9kZWzigJksIOKAmG1zZGLigJkpCikgbCBPTiB0LkJhbmNvID0gbC5CYW5jbwpPUkRFUiBCWSBCYW5jbzsKCkRST1AgVEFCTEUgI1RhbWFuaG9zOwoKU0VUIEB2Qm9keSA9IEB2Qm9keSArCuKAmAo8YnI+PGJyPgo8aDM+VGFtYW5obyBkb3MgQmFuY29zIGRlIERhZG9zIGRlIFVzdcOhcmlvPC9oMz4KPHRhYmxlIGJvcmRlcj0xIGNlbGxwYWRkaW5nPTI+Cjx0cj4KPHRoPkJhbmNvPC90aD4KPHRoPkFycXVpdm8gZGUgRGFkb3Mg4oCTIEVzcGHDp28gUmVzZXJ2YWRvIGVtIERpc2NvIChNQik8L3RoPgo8dGg+RXNwYcOnbyBVc2FkbyAoTUIpPC90aD4KPHRoPkVzcGHDp28gTGl2cmUgKE1CKTwvdGg+Cjx0aD5BcnF1aXZvIGRlIExvZyDigJMgRXNwYcOnbyBSZXNlcnZhZG8gZW0gRGlzY28gKE1CKTwvdGg+Cjx0aD5Fc3Bhw6dvIFVzYWRvIChNQik8L3RoPgo8dGg+RXNwYcOnbyBMaXZyZSAoTUIpPC90aD4KPC90cj4K4oCYOwoKU0VMRUNUIEBRdCA9IENPVU5UKCopIEZST00gQFRhbWFuaG9zIHQ7ClNFVCBATG9vcCA9IDE7CldISUxFIEBMb29wIDw9IEBRdApCRUdJTgpTRVQgQHZCb2R5ID0gQHZCb2R5ICsKKApTRUxFQ1QK4oCYPHRyPuKAmSsK4oCYPHRkPuKAmSsgQmFuY28gKyc8L3RkPuKAmSsK4oCYPHRkPuKAmStDT05WRVJUKFZBUkNIQVIoMjApLHQuQXJxdWl2b0RlRGFkb3NfRXNwYWNvUmVzZXJ2YWRvRW1EaXNjb19NQikrJzwvdGQ+4oCZKwrigJg8dGQ+4oCZK0NPTlZFUlQoVkFSQ0hBUigyMCksdC5BcnF1aXZvRGVEYWRvc19Fc3BhY29Vc2Fkb19NQikrJzwvdGQ+4oCZKwrigJg8dGQ+4oCZK0NPTlZFUlQoVkFSQ0hBUigyMCksdC5BcnF1aXZvRGVEYWRvc19Fc3BhY29MaXZyZV9NQikrJzwvdGQ+4oCZKwrigJg8dGQ+4oCZK0NPTlZFUlQoVkFSQ0hBUigyMCksdC5BcnF1aXZvRGVMb2dfRXNwYWNvUmVzZXJ2YWRvRW1EaXNjb19NQikrJzwvdGQ+4oCZKwrigJg8dGQ+4oCZK0NPTlZFUlQoVkFSQ0hBUigyMCksdC5BcnF1aXZvRGVMb2dfRXNwYWNvVXNhZG9fTUIpKyc8L3RkPuKAmSsK4oCYPHRkPuKAmStDT05WRVJUKFZBUkNIQVIoMjApLHQuQXJxdWl2b0RlTG9nX0VzcGFjb0xpdnJlX01CKSsnPC90ZD7igJkrCuKAmDwvdHI+4oCZCkZST00gQFRhbWFuaG9zIHQKV0hFUkUgdC5TZXEgPSBATG9vcAopOwpTRVQgQExvb3AgPSBATG9vcCArMTsKRU5EOwoKU0VUIEB2Qm9keSA9IEB2Qm9keSArIOKAmDwvdGFibGU+4oCZOwoK4oCUICoqKiBQYXJ0ZSA1OiBUZW1wREIgU2l6ZQpTRVQgQHZCb2R5ID0gQHZCb2R5ICsK4oCYCjxicj48YnI+CjxoMz5Fc3Bhw6dvIG5vIFRlbXBEQjwvaDM+Cjx0YWJsZSBib3JkZXI9MSBjZWxscGFkZGluZz0yPgo8dHI+Cjx0aD5Qw6FnaW5hcyBMaXZyZXM8L3RoPgo8dGg+RXNwYcOnbyBMaXZyZSBlbSBNQjwvdGg+CjwvdHI+CuKAmDsKU0VUIEB2Qm9keSA9IEB2Qm9keSArCigKU0VMRUNUCuKAmDx0cj7igJkrCuKAmDx0ZD7igJkrQ09OVkVSVChWQVJDSEFSKDIwKSxTVU0odW5hbGxvY2F0ZWRfZXh0ZW50X3BhZ2VfY291bnQpKSsnPC90ZD7igJkrCuKAmDx0ZD7igJkrQ09OVkVSVChWQVJDSEFSKDIwKSxDQVNUKFNVTSh1bmFsbG9jYXRlZF9leHRlbnRfcGFnZV9jb3VudCkvMTI4LjAgQVMgZGVjaW1hbCgxNSwyKSkpKyc8L3RkPuKAmSsK4oCYPC90cj7igJkKRlJPTSBzeXMuZG1fZGJfZmlsZV9zcGFjZV91c2FnZQopOwpTRVQgQHZCb2R5ID0gQHZCb2R5ICsg4oCYPC90YWJsZT7igJk7CgrigJQgKioqIFBhcnRlIDY6IExhc3QgYmFja3VwIHdpdGggc3VjY2VzcwpTRVQgQHZCb2R5ID0gQHZCb2R5ICsK4oCYCjxicj48YnI+CjxoMz7Dmmx0aW1vcyBCYWNrdXBzIFJlYWxpemFkb3M8L2gzPgo8dGFibGUgYm9yZGVyPTEgY2VsbHBhZGRpbmc9Mj4KPHRyPgo8dGg+QmFuY288L3RoPgo8dGg+RGVzY3Jpw6fDo28gT3BjaW9uYWwgZG8gQmFja3VwPC90aD4KPHRoPk1vZGVsbyBkZSBSZWNvdmVyeTwvdGg+Cjx0aD5EYXRhIGUgSG9yYSBkZSBJbsOtY2lvPC90aD4KPHRoPklkYWRlIGVtIGRpYXM8L3RoPgo8dGg+VGFtYW5obyBkbyBCYWNrdXAgZW0gTUI8L3RoPgo8dGg+VGlwbzwvdGg+Cjx0aD5BcnF1aXZvPC90aD4KPC90cj4K4oCYOwpERUNMQVJFIEBCYWNrdXBzIFRBQkxFCigKc2VxIElOVCBpZGVudGl0eSgxLDEpLApkYXRhYmFzZV9uYW1lIE5WQVJDSEFSKDEyOCksCnNlcnZlcl9uYW1lIE5WQVJDSEFSKDEyOCksCm5hbWUgIE5WQVJDSEFSKDEyOCksCnJlY292ZXJ5X21vZGVsICBOVkFSQ0hBUig2MCksCmJhY2t1cF9zdGFydF9kYXRlIERBVEVUSU1FLApkYXlzX2FnbyBWQVJDSEFSKDE1KSwKYmFja3VwX3NpemVfbWIgVkFSQ0hBUigxNSksCnR5cGUgY2hhcigxKSwKYmFja3VwX3R5cGUgdmFyY2hhcigyMSksCnBoeXNpY2FsX2RldmljZV9uYW1lIG52YXJjaGFyKDI2MCkKKTsKCklOU0VSVCBJTlRPIEBCYWNrdXBzCnNlbGVjdApzLmRhdGFiYXNlX25hbWUKLCBzLnNlcnZlcl9uYW1lCiwgSVNOVUxMKHMubmFtZSzigJ0pCiwgcy5yZWNvdmVyeV9tb2RlbAosIHMuYmFja3VwX3N0YXJ0X2RhdGUKLFJFVkVSU0UgKFNVQlNUUklORyAoUkVWRVJTRSAoQ09OVkVSVCAoVkFSQ0hBUiAoMTUpLCBDT05WRVJUIChNT05FWSwgREFURURJRkYgKERBWSwgcy5iYWNrdXBfc3RhcnRfZGF0ZSwgR0VUREFURSAoKSkpLCAxKSksIDQsIDE1KSkgQVMgZGF5c19hZ28KLFJFVkVSU0UgKFNVQlNUUklORyAoUkVWRVJTRSAoQ09OVkVSVCAoVkFSQ0hBUiAoMTUpLCBDT05WRVJUIChNT05FWSwgUk9VTkQgKHMuYmFja3VwX3NpemUvMTA0ODU3Ni4wLCAwKSksIDEpKSwgNCwgMTUpKSBBUyBiYWNrdXBfc2l6ZV9tYgosIHMudHlwZQosKENBU0UKV0hFTiBzLnR5cGUgPSDigJhE4oCZIFRIRU4g4oCYRGF0YWJhc2XigJkKV0hFTiBzLnR5cGUgPSDigJhG4oCZIFRIRU4g4oCYRmlsZSBPciBGaWxlZ3JvdXDigJkKV0hFTiBzLnR5cGUgPSDigJhH4oCZIFRIRU4g4oCYRGlmZmVyZW50aWFsIEZpbGXigJkKV0hFTiBzLnR5cGUgPSDigJhJ4oCZIFRIRU4g4oCYRGlmZmVyZW50aWFsIERhdGFiYXNl4oCZCldIRU4gcy50eXBlID0g4oCYTOKAmSBUSEVOIOKAmExvZ+KAmQpXSEVOIHMudHlwZSA9IOKAmFDigJkgVEhFTiDigJhQYXJ0aWFs4oCZCldIRU4gcy50eXBlID0g4oCYUeKAmSBUSEVOIOKAmERpZmZlcmVudGlhbCBQYXJ0aWFs4oCZCkVMU0Ug4oCYTi9B4oCZCkVORCkgQVMgYmFja3VwX3R5cGUKLCBmLnBoeXNpY2FsX2RldmljZV9uYW1lCmZyb20gbXNkYi5kYm8uYmFja3Vwc2V0IHMKSk9JTiBtc2RiLmRiby5iYWNrdXBtZWRpYWZhbWlseSBmIE9OIHMubWVkaWFfc2V0X2lkID0gZi5tZWRpYV9zZXRfaWQKV0hFUkUgcy5iYWNrdXBfc2V0X2lkID0KKCAgICBTRUxFQ1QgVE9QIDEgYS5iYWNrdXBfc2V0X2lkCkZST00gbXNkYi5kYm8uYmFja3Vwc2V0IGEKV0hFUkUgYS5kYXRhYmFzZV9uYW1lID0gcy5kYXRhYmFzZV9uYW1lCk9SREVSIEJZIGEuYmFja3VwX3NldF9pZCBERVNDICAgICkKT1JERVIgQlkgcy5kYXRhYmFzZV9uYW1lOwoKU0VMRUNUIEBRdCA9IEBAUk9XQ09VTlQ7ClNFVCBATG9vcCA9IDE7CldISUxFIEBMb29wIDw9IEBRdApCRUdJTgpTRVQgQHZCb2R5ID0gQHZCb2R5ICsKKApzZWxlY3QK4oCYPHRyPuKAmSsK4oCYPHRkPuKAmStDT05WRVJUKFZBUkNIQVIoMTI4KSxkYXRhYmFzZV9uYW1lKSsnPC90ZD7igJkrCuKAmDx0ZD7igJkrQ09OVkVSVChWQVJDSEFSKDEyOCksbmFtZSkrJzwvdGQ+4oCZKwrigJg8dGQ+4oCZK0NPTlZFUlQoVkFSQ0hBUig2MCkscmVjb3ZlcnlfbW9kZWwpKyc8L3RkPuKAmSsK4oCYPHRkPuKAmStDT05WRVJUKFZBUkNIQVIoMjApLGJhY2t1cF9zdGFydF9kYXRlLCAxMykrJzwvdGQ+4oCZKwrigJg8dGQ+4oCZK0NPTlZFUlQoVkFSQ0hBUigxMCksZGF5c19hZ28pKyc8L3RkPuKAmSsK4oCYPHRkPuKAmStDT05WRVJUKFZBUkNIQVIoMTApLGJhY2t1cF9zaXplX21iKSsnPC90ZD7igJkrCuKAmDx0ZD7igJkrQ09OVkVSVChWQVJDSEFSKDI1KSxiYWNrdXBfdHlwZSkrJzwvdGQ+4oCZKwrigJg8dGQ+4oCZK0NPTlZFUlQoVkFSQ0hBUigyNjApLHBoeXNpY2FsX2RldmljZV9uYW1lKSsnPC90ZD7igJkrCuKAmDwvdHI+4oCZCmZyb20gQEJhY2t1cHMKV0hFUkUgc2VxID0gQExvb3AKKTsKU0VUIEBMb29wID0gQExvb3AgKzE7CkVORDsKU0VUIEB2Qm9keSA9IEB2Qm9keSArIOKAmDwvdGFibGU+4oCZOwoK4oCUICoqKiBQYXJ0ZSA3OiBzdGF0dXMgZXhlY3V0aW9uIGpvYnMKU0VUIEB2Qm9keSA9IEB2Qm9keSArCuKAmAo8YnI+PGJyPgo8aDM+U3RhdHVzIGRhIMOabHRpbWEgRXhlY3XDp8OjbyBkb3MgSm9iczwvaDM+Cjx0YWJsZSBib3JkZXI9MSBjZWxscGFkZGluZz0yPgo8dHI+Cjx0aD5Ob21lPC90aD4KPHRoPlN0YXR1czwvdGg+Cjx0aD5NZW5zYWdlbTwvdGg+Cjx0aD5EYXRhIGRhIEV4ZWN1w6fDo288L3RoPgo8dGg+SG9yYSBkYSBFeGVjdcOnw6NvPC90aD4KPC90cj4K4oCYOwpERUNMQVJFIEBKb2JzIFRBQkxFCigKU2VxIElOVCBJREVOVElUWSwKbmFtZSBTWVNOQU1FLApzdGF0dXMgVkFSQ0hBUig1MCksCm1lc3NhZ2UgTlZBUkNIQVIoNDAwMCksCnJ1bl9kYXRlIHZhcmNoYXIoMjApLApydW5fdGltZSB2YXJjaGFyKDIwKQopOwpJTlNFUlQgSU5UTyBASm9icwpTRUxFQ1QKai5uYW1lCiwgKENBU0UgaC5ydW5fc3RhdHVzCldIRU4gMCBUSEVOIOKAmEZhbGhh4oCZCldIRU4gMSBUSEVOIOKAmFN1Y2Vzc2/igJkKV0hFTiAyIFRIRU4g4oCYUmVwZXRpcuKAmQpXSEVOIDMgVEhFTiDigJhDYW5jZWxhZG/igJkKV0hFTiA0IFRIRU4g4oCYRW0gUHJvZ3Jlc3Nv4oCZCkVORCkgW3N0YXR1c10KLCBoLm1lc3NhZ2UKLCBoLnJ1bl9kYXRlCiwgaC5ydW5fdGltZQpGUk9NIG1zZGIuZGJvLnN5c2pvYnMgagpDUk9TUyBBUFBMWQooICAgIFNFTEVDVCBUT1AgMSBoLnJ1bl9kYXRlLCBoLnJ1bl90aW1lLCBoLnJ1bl9zdGF0dXMsIGgubWVzc2FnZQpmcm9tIG1zZGIuZGJvLnN5c2pvYmhpc3RvcnkgaApXSEVSRSBoLnN0ZXBfaWQgPSAwCkFORCBoLmpvYl9pZCA9IGouam9iX2lkCk9SREVSIEJZIGguaW5zdGFuY2VfaWQgREVTQwopIGgKT1JERVIgQlkgbmFtZTsKClNFTEVDVCBAUXQgPSBAQFJPV0NPVU5UOwpTRVQgQExvb3AgPSAxOwpXSElMRSBATG9vcCA8PSBAUXQKQkVHSU4KU0VUIEB2Qm9keSA9IEB2Qm9keSArCigKc2VsZWN0CuKAmDx0cj7igJkrCuKAmDx0ZD7igJkrQ09OVkVSVChWQVJDSEFSKDEyOCksai5uYW1lKSsnPC90ZD7igJkrCuKAmDx0ZD7igJkrQ09OVkVSVChWQVJDSEFSKDUwKSxqLnN0YXR1cykrJzwvdGQ+4oCZKwrigJg8dGQ+4oCZK0NPTlZFUlQoTlZBUkNIQVIoNDAwMCksbWVzc2FnZSkrJzwvdGQ+4oCZKwrigJg8dGQ+4oCZK0NPTlZFUlQoVkFSQ0hBUigyMCksai5ydW5fZGF0ZSkrJzwvdGQ+4oCZKwrigJg8dGQ+4oCZK0NPTlZFUlQoVkFSQ0hBUigyMCksai5ydW5fdGltZSkrJzwvdGQ+4oCZKwrigJg8L3RyPuKAmQpmcm9tIEBKb2JzIGoKV0hFUkUgc2VxID0gQExvb3AKKTsKU0VUIEBMb29wID0gQExvb3AgKzE7CkVORDsKU0VUIEB2Qm9keSA9IEB2Qm9keSArIOKAmDwvdGFibGU+4oCZOwoK4oCUICoqKiBFbnZpYQppZiBARXhpYmlyQXBlbmFzSHRtbCA9IDAKZXhlYyBtc2RiLmRiby5zcF9zZW5kX2RibWFpbApAcmVjaXBpZW50cyA9IOKAmGFkZWlsc29ucmJyaXRvQGdtYWlsLmNvbeKAmSwKQHN1YmplY3Q9QHZTdWJqZWN0LApAYm9keT1AdkJvZHksCkBib2R5X2Zvcm1hdCA9IOKAmEhUTUzigJk7CuKAlCAqKiogRXhpYmUgY29tbyBIVE1MIGFvIGludsOpcyBkZSBlbnZpYXIgcG9yIGUtbWFpbAplbHNlClNFTEVDVCBAdkJvZHk7CgrigJQgKioqIEZpbmFsOiBlbGltaW5hIHRhYmVsYXMgdGVtcG9yw6FyaWFzCklGIE9CSkVDVF9JRCjigJh0ZW1wZGIuZGJvLiNUYW1hbmhvc+KAmSkgSVMgTk9UIE5VTEwKRFJPUCBUQUJMRSAjVGFtYW5ob3M7CklGIE9CSkVDVF9JRCjigJh0ZW1wZGIuZGJvLiNUYWJlbGHigJkpIElTIE5PVCBOVUxMCkRST1AgVEFCTEUgI1RhYmVsYTs=[/et_pb_dmb_code_snippet]