Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 88

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 215

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 216

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 217

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 218

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 219

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 220
PK!CP>>lib.podnu6$=encoding utf8 =head1 NAME local::lib~[pt_br] - crie e use um diretório lib/ local para módulos perl com PERL5LIB =head1 SINOPSE No código - use local::lib; # configura um lib local em ~/perl5 use local::lib '~/foo'; # idem, mas ~/foo # Ou... use FindBin; use local::lib "$FindBin::Bin/../suporte"; # bibliotecas de suporte locais à aplicação Pela linha de comando (shell) - # Instala o LWP e suas dependências não encontradas no diretório '~/perl5' perl -MCPAN -Mlocal::lib -e 'CPAN::install(LWP)' # Apenas exibe alguns comandos úteis para a shell $ perl -Mlocal::lib export PERL_MB_OPT='--install_base /home/username/perl5' export PERL_MM_OPT='INSTALL_BASE=/home/username/perl5' export PERL5LIB='/home/username/perl5/lib/perl5/i386-linux:/home/username/perl5/lib/perl5' export PATH="/home/username/perl5/bin:$PATH" =head2 A técnica de 'bootstrapping' Uma forma comum de instalar o local::lib é usando o que é conhecido como técnica de "bootstrapping". É uma boa abordagem caso seu administrador de sistemas não tenha instalado o local::lib. Nesse caso, você precisará instalar o local::lib em seu diretório de usuário. Caso você tenha privilégios de administrador, ainda assim deverá configurar suas variáveis de ambiente, como discutido no passo 4, abaixo. Sem elas, você ainda instalará módulos no CPAN do sistema e seus scripts Perl não utilizarão o caminho para o lib/ que você definiu com o local::lib. Por padrão, o local::lib instala os módulos do CPAN e a si próprio em ~/perl5. Usuários do Windows devem ler L. 1. Baixe e descompacte o local::lib do CPAN (procure por "Download" na página do CPAN sobre o local::lib). Faça isso como um usuário comum, não como root ou administrador. Descompacte o arquivo em seu diretório de usuário ou em qualquer outro local conveniente. 2. Execute isso: perl Makefile.PL --bootstrap Caso o sistema pergunte se deve configurar tudo que puder automaticamente, você provavelmente deve responder que sim (yes). Para instalar o local::lib em um diretório que não o padrão, você precisará especificá-lo ao chamar o bootstrap, da seguinte forma: perl Makefile.PL --bootstrap=~/foo 3. Execute isso: (local::lib assume que você possui o comando 'make' instalado em seu sistema) make test && make install 4. Agora precisamos configurar as variáveis de ambiente apropriadas para que o Perl use nosso recém-criado diretório lib/. Caso esteja usando bash ou outra shell Bourne, você pode fazer isso adicionando a seguinte linha em seu script de inicialização da shell: echo 'eval $(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)' >>~/.bashrc Caso esteja usando a shell C, pode fazer da seguinte forma: /bin/csh echo $SHELL /bin/csh perl -I$HOME/perl5/lib/perl5 -Mlocal::lib >> ~/.cshrc Caso tenha passado para o bootstrap um diretório que não o padrão, você precisará indicá-lo na chamada ao local::lib, dessa forma: echo 'eval $(perl -I$HOME/foo/lib/perl5 -Mlocal::lib=$HOME/foo)' >>~/.bashrc Após atualizar seu arquivo de configuração da shell, certifique-se de processá-lo novamente para obter as modificações em sua shell atual. Shells Bourne usam C<. ~/.bashrc> para isso, enquanto shells C usam C. Se estiver em uma máquina lenta ou operando com grandes limitações de espaço em disco, você pode desativar a geração automática de manpages a partir do POD ao instalar módulos. Para isso, basta passar o argumento C<--no-manpages> durante o bootstrap: perl Makefile.PL --bootstrap --no-manpages Para evitar ter que fazer vários bootstraps para vários ambientes de módulos Perl na mesma conta de usuário - por exemplo se você usa o local::lib para desenvolver diferentes aplicativos independentes - você pode utilizar uma única instalação bootstrap do local::lib para instalar módulos em diretórios diferentes da seguinte forma: cd ~/meudir1 perl -Mlocal::lib=./ eval $(perl -Mlocal::lib=./) ### Para configurar o ambiente apenas nessa shell printenv ### Veja que o ~/meudir1 está na PERL5LIB perl -MCPAN -e install ... ### Os módulos que quiser cd ../meudir2 ... REPITA ... Para múltiplos ambientes destinados a múltiplos aplicativos, você pode precisar incluir uma versão modificada das instruções de C<< use FindBin >> no exemplo "No código" acima. Caso tenha feito algo como o que foi descrito acima, terá um conjunto de módulos Perl em C<< ~/meudir1/lib >>. Caso tenha um script em C<< ~/meudir1/scripts/meuscript.pl >>, você precisará indicar a ele onde encontrar os módulos que instalou para ele em C<< ~/meudir1/lib >>. Em C<< ~/meudir1/scripts/meuscript.pl >>: use strict; use warnings; use local::lib "$FindBin::Bin/.."; ### aponta para ~/meudir1 e o local::lib acha o lib/ use lib "$FindBin::Bin/../lib"; ### aponta para ~/meudir1/lib Coloque isso antes de qualquer bloco BEGIN { ... } que precise dos módulos instalados. =head2 Diferenças ao usar esse módulo em Win32 Para configurar as variáveis de ambiente apropriadas para sua sessão atual do C, você pode fazer assim: C:\>perl -Mlocal::lib set PERL_MB_OPT=--install_base C:\DOCUME~1\ADMINI~1\perl5 set PERL_MM_OPT=INSTALL_BASE=C:\DOCUME~1\ADMINI~1\perl5 set PERL5LIB=C:\DOCUME~1\ADMINI~1\perl5\lib\perl5;C:\DOCUME~1\ADMINI~1\perl5\lib\perl5\MSWin32-x86-multi-thread set PATH=C:\DOCUME~1\ADMINI~1\perl5\bin;%PATH% ### Para configurar o ambiente apenas dessa shell C:\>perl -Mlocal::lib > %TEMP%\tmp.bat && %TEMP%\tmp.bat && del %TEMP%\temp.bat ### em vez de $(perl -Mlocal::lib=./) Caso queira que as configurações do ambiente persistam, você precisará adicioná-las em Painel de Controle -> Sistema, ou usar o L. O "~" é transformado no diretório do perfil do usuário (o diretório com o nome do usuário dentro de "Documents and Settings" (Windows XP ou anterior) ou "Usuários" (Windows Vista e mais recentes)) a menos que $ENV{HOME} exista. Após isso, o nome do diretório é encurtado e os subdiretórios são criados (o que significa que o diretório deve existir). =head1 MOTIVAÇÃO A versão de um pacote Perl na sua máquina nem sempre é a que você precisa. Obviamente, a melhor coisa a fazer seria atualizá-la para a versão desejada. No entanto, você pode estar em uma situação que o impede de fazer isso. Talvez você não tenha privilégios de administrador do sistema; ou talvez esteja usando um sistema de gerenciamento de pacotes como o do Debian, e ainda não exista um pacote disponível na versão desejada. local::lib resolve esse problema possibilitando a criação de seu próprio diretório de pacotes Perl obtidos do CPAN (em sistemas multi-usuário, isso normalmente fica dentro do diretório de seu usuário). A instalação do Perl no sistema permanece inalterada; você simplesmente chama o Perl com opções especiais para que ele use os pacotes em seu diretório local em vez dos pacotes do sistema. O local::lib organiza as coisas para que versões dos pacotes Perl instalados localmente tenham precedência sobre as do sistema. Caso esteja usando um sistema de gerenciamento de pacote (como em sistemas Debian), não precisará se preocupar com conflitos entre o Debian e o CPAN. Sua versão local dos pacotes será instalada em um diretório completamente diferente das versões instaladas pelo gerenciador de pacotes do sistema. =head1 DESCRIÇÃO Este módulo oferece uma forma rápida e conveniente para criar um repositório de módulos locais ao usuário, dentro do diretório do mesmo. Ele também monta e exibe para o usuário uma lista de variáveis de ambiente utilizando a sintaxe da shell atual do usuário (conforme especificado pela variável de ambiente C), pronta para ser adicionada diretamente no arquivo de configuração da shell. Generalizando, o local::lib permite a criação e uso de um diretório contendo módulos Perl fora do C<@INC> do Perl. Isso facilita a produção de aplicações com uma versão específica de determinado módulo, ou coleção de módulos. Também é útil quando o mantenedor de um módulo não aplicou determinado patch que você precisa para seu aplicativo. Durante o C, o local::lib define valores apropriados para as seguintes variáveis de ambiente: =over 4 =item PERL_MB_OPT =item PERL_MM_OPT =item PERL5LIB =item PATH valores serão anexados ao PATH, em vez de substituí-lo. =back Esses valores são então disponibilizados para referência por qualquer outro código após o C. =head1 CRIANDO UM CONJUNTO AUTO-CONTIDO DE MÓDULOS Veja L para uma maneira de fazer isso - mas note que há uma série de ressalvas na abordagem, e a melhor forma é sempre fazer o 'build' contra uma versão limpa do perl (i.e. com 'site' e 'vendor' o mais vazios possível). =head1 MÉTODOS =head2 ensure_dir_structure_for =over 4 =item Argumentos: $caminho_do_diretorio =item Valor de Retorno: Nenhum =back Tenta criar o caminho fornecido, e todos os diretórios superiores necessários. Gera uma exceção em caso de falha. =head2 print_environment_vars_for =over 4 =item Argumentos: $caminho_do_diretorio =item Valor de Retorno: Nenhum =back Exibe na saída padrão as variáveis listadas acima, devidamente ajustadas para utilizar o caminho fornecido como diretório base. =head2 build_environment_vars_for =over 4 =item Argumentos: $caminho_do_diretorio, $interpolar =item Valor de Retorno: %variaveis_de_ambiente =back Retorna hash contendo as variáveis de ambiente listadas acima, devidamente ajustadas para utilizar o caminho fornecido como diretório base. =head2 setup_env_hash_for =over 4 =item Argumentos: $caminho_do_diretorio =item Valor de Retorno: Nenhum =back Constrói as chaves no C<%ENV> para o caminho fornecido, chamando C. =head2 install_base_perl_path =over 4 =item Argumentos: $caminho_do_diretorio =item Valor de Retorno: $caminho_base_de_instalacao =back Retorna um caminho de diretório indicando onde instalar os módulos Perl para essa instalação local de bibliotecas. Adiciona os diretórios C e C ao final do caminho fornecido. =head2 install_base_arch_path =over 4 =item Argumentos: $caminho_do_diretorio =item Valor de Retorno: $caminho_base_de_instalacao_arch =back Retorna um caminho de diretório indicando onde instalar os módulos Perl de arquiteturas específicas para essa instalação local de bibliotecas. Baseia-se no valor de retorno do método L, adicionando o valor de C<$Config{archname}>. =head2 install_base_bin_path =over 4 =item Argumentos: $caminho_do_diretorio =item Valor de Retorno: $caminho_base_de_instalacao_bin =back Retorna um caminho de diretório indicando onde instalar programas executáveis para essa instalação local de bibliotecas. Baseia-se no valor de retorno do método L, adicionando o diretório C. =head2 resolve_empty_path =over 4 =item Argumentos: $caminho_do_diretorio =item Valor de Retorno: $caminho_base_de_instalacao =back Cria e retorna o caminho de diretório raiz em que a instalação local de módulos deve ser feita. O padrão é C<~/perl5>. =head2 resolve_home_path =over 4 =item Argumentos: $caminho_do_diretorio =item Valor de Retorno: $caminho_para_home =back Procura pelo diretório padrão (home) do usuário. Gera uma exceção caso não encontre resultado definitivo. =head2 resolve_relative_path =over 4 =item Argumentos: $caminho_do_diretorio =item Valor de Retorno: $caminho_absoluto =back Transforma o caminho fornecido em um caminho absoluto. =head2 resolve_path =over 4 =item Argumentos: $caminho_do_diretorio =item Valor de Retorno: $caminho_absoluto =back Invoca os seguintes métodos em sequência, passando o resultado do método anterior para o seguinte, na tentativa de descobrir onde configurar o ambiente para a instalação local de bibliotecas: L, L, L. Passa o caminho de diretório fornecido para L que retorna um resultado que é passado para L, que então tem seu resultado passado para L. O resultado dessa chamada final é então retornado pelo L. =head1 UM AVISO SOBRE UNINST=1 Tenha cuidado ao usar o local::lib em conjunto com "make install UNINST=1". A idéia dessa opção é desinstalar a versão anterior de um módulo antes de instalar a mais recente. No entanto ela não possui uma verificação de segurança de que a versão antiga e a nova referem-se ao mesmo diretório. Usada em combinação com o local::lib, você pode potencialmente apagar uma versão globalmente acessível de um módulo e instalar a versão mais nova no diretório local. Apenas utilize "make install UNINST=1" junto com o local::lib se você entende essas possíveis consequências. =head1 LIMITAÇÕES As ferramentas auxiliares do perl não conseguem lidar com nomes de diretórios contendo espaços, então não é possível fazer seu bootstrap do local::lib em um diretório com espaços. O que você pode fazer é mover seu local::lib para um diretório com espaços B ter instalado todos os módulos dentro dele. Mas esteja ciente que você não poderá atualizar ou instalar outros módulos do CPAN nesse diretório local após a mudança. A detecção da shell é relativamente básica. Neste momento, qualquer coisa com csh no nome será tratada como a C shell ou compatível, e todo o resto será tratado como Bourne, exceto em sistemas Win32. Caso a variável de ambiente C não esteja disponível, assumiremos tratar-se de uma shell compatível com a Bourne. A técnica de bootstrap é um hack e usará o CPAN.pm para o ExtUtils::MakeMaker mesmo que você tenha o CPANPLUS instalado. Destrói qualquer valor pré-existente nas variáveis de ambiente PERL5LIB, PERL_MM_OPT e PERL_MB_OPT. Provavelmente deveria auto-configurar o CPAN caso isso ainda não tenha sido feito. Correções (patches) são muito bem-vindos para quaisquer dos itens acima. Em sistemas Win32, não há uma forma de escrever no registro as variáveis de ambiente criadas, para que elas persistam a uma reinicialização. =head1 SOLUÇÃO DE PROBLEMAS Se você configurou o local::lib para instalar módulos do CPAN em algum lugar do seu 'home', e mais tarde tentou instalar um módulo fazendo C, mas ele falhou com um erro como: C e em algum lugar no seu log de instalação houver um erro dizendo C<'INSTALL_BASE' is not a known MakeMaker parameter name>, então você de alguma forma perdeu seu ExtUtils::MakeMaker atualizado. Para remediar a situação, execute novamente o procedimento de bootstrap descrito acima. Então, execute C Finalmente, execute novamente o C e ele deve instalar sem problemas. =head1 AMBIENTE =over 4 =item SHELL =item COMSPEC O local::lib procura pela variável de ambiente C do usuário ao processar e exibir os comandos a serem adicionados no arquivo de configuração da shell. Em sistemas Win32, C também será examinado. =back =head1 SUPORTE IRC: Acesse #local-lib em irc.perl.org. =head1 AUTOR DA TRADUÇÃO Breno G. de Oliveira, C<< >>, após ter perdido uma aposta para o L durante a Copa de 2010. =head1 COPYRIGHT Copyright (c) 2007 - 2010 L e L do local::lib como listados em L. =head1 LICENÇA Esta biblioteca é software livre e pode ser distribuída sob os mesmo termos do perl. PK! OOlib.pmnu6$package local::lib; use 5.006; BEGIN { if ($ENV{RELEASE_TESTING}) { require strict; strict->import; require warnings; warnings->import; } } use Config (); our $VERSION = '2.000029'; $VERSION =~ tr/_//d; BEGIN { *_WIN32 = ($^O eq 'MSWin32' || $^O eq 'NetWare' || $^O eq 'symbian') ? sub(){1} : sub(){0}; # punt on these systems *_USE_FSPEC = ($^O eq 'MacOS' || $^O eq 'VMS' || $INC{'File/Spec.pm'}) ? sub(){1} : sub(){0}; } my $_archname = $Config::Config{archname}; my $_version = $Config::Config{version}; my @_inc_version_list = reverse split / /, $Config::Config{inc_version_list}; my $_path_sep = $Config::Config{path_sep}; our $_DIR_JOIN = _WIN32 ? '\\' : '/'; our $_DIR_SPLIT = (_WIN32 || $^O eq 'cygwin') ? qr{[\\/]} : qr{/}; our $_ROOT = _WIN32 ? do { my $UNC = qr{[\\/]{2}[^\\/]+[\\/][^\\/]+}; qr{^(?:$UNC|[A-Za-z]:|)$_DIR_SPLIT}; } : qr{^/}; our $_PERL; sub _perl { if (!$_PERL) { # untaint and validate ($_PERL, my $exe) = $^X =~ /((?:.*$_DIR_SPLIT)?(.+))/; $_PERL = 'perl' if $exe !~ /perl/; if (_is_abs($_PERL)) { } elsif (-x $Config::Config{perlpath}) { $_PERL = $Config::Config{perlpath}; } elsif ($_PERL =~ $_DIR_SPLIT && -x $_PERL) { $_PERL = _rel2abs($_PERL); } else { ($_PERL) = map { /(.*)/ } grep { -x $_ } map { ($_, _WIN32 ? ("$_.exe") : ()) } map { join($_DIR_JOIN, $_, $_PERL) } split /\Q$_path_sep\E/, $ENV{PATH}; } } $_PERL; } sub _cwd { if (my $cwd = defined &Cwd::sys_cwd ? \&Cwd::sys_cwd : defined &Cwd::cwd ? \&Cwd::cwd : undef ) { no warnings 'redefine'; *_cwd = $cwd; goto &$cwd; } my $drive = shift; return Win32::GetCwd() if _WIN32 && defined &Win32::GetCwd && !$drive; local @ENV{qw(PATH IFS CDPATH ENV BASH_ENV)}; delete @ENV{qw(PATH IFS CDPATH ENV BASH_ENV)}; my $cmd = $drive ? "eval { Cwd::getdcwd(q($drive)) }" : 'getcwd'; my $perl = _perl; my $cwd = `"$perl" -MCwd -le "print $cmd"`; chomp $cwd; if (!length $cwd && $drive) { $cwd = $drive; } $cwd =~ s/$_DIR_SPLIT?$/$_DIR_JOIN/; $cwd; } sub _catdir { if (_USE_FSPEC) { require File::Spec; File::Spec->catdir(@_); } else { my $dir = join($_DIR_JOIN, @_); $dir =~ s{($_DIR_SPLIT)(?:\.?$_DIR_SPLIT)+}{$1}g; $dir; } } sub _is_abs { if (_USE_FSPEC) { require File::Spec; File::Spec->file_name_is_absolute($_[0]); } else { $_[0] =~ $_ROOT; } } sub _rel2abs { my ($dir, $base) = @_; return $dir if _is_abs($dir); $base = _WIN32 && $dir =~ s/^([A-Za-z]:)// ? _cwd("$1") : $base ? _rel2abs($base) : _cwd; return _catdir($base, $dir); } our $_DEVNULL; sub _devnull { return $_DEVNULL ||= _USE_FSPEC ? (require File::Spec, File::Spec->devnull) : _WIN32 ? 'nul' : $^O eq 'os2' ? '/dev/nul' : '/dev/null'; } sub import { my ($class, @args) = @_; if ($0 eq '-') { push @args, @ARGV; require Cwd; } my @steps; my %opts; my %attr; my $shelltype; while (@args) { my $arg = shift @args; # check for lethal dash first to stop processing before causing problems # the fancy dash is U+2212 or \xE2\x88\x92 if ($arg =~ /\xE2\x88\x92/) { die <<'DEATH'; WHOA THERE! It looks like you've got some fancy dashes in your commandline! These are *not* the traditional -- dashes that software recognizes. You probably got these by copy-pasting from the perldoc for this module as rendered by a UTF8-capable formatter. This most typically happens on an OS X terminal, but can happen elsewhere too. Please try again after replacing the dashes with normal minus signs. DEATH } elsif ($arg eq '--self-contained') { die <<'DEATH'; FATAL: The local::lib --self-contained flag has never worked reliably and the original author, Mark Stosberg, was unable or unwilling to maintain it. As such, this flag has been removed from the local::lib codebase in order to prevent misunderstandings and potentially broken builds. The local::lib authors recommend that you look at the lib::core::only module shipped with this distribution in order to create a more robust environment that is equivalent to what --self-contained provided (although quite possibly not what you originally thought it provided due to the poor quality of the documentation, for which we apologise). DEATH } elsif( $arg =~ /^--deactivate(?:=(.*))?$/ ) { my $path = defined $1 ? $1 : shift @args; push @steps, ['deactivate', $path]; } elsif ( $arg eq '--deactivate-all' ) { push @steps, ['deactivate_all']; } elsif ( $arg =~ /^--shelltype(?:=(.*))?$/ ) { $shelltype = defined $1 ? $1 : shift @args; } elsif ( $arg eq '--no-create' ) { $opts{no_create} = 1; } elsif ( $arg eq '--quiet' ) { $attr{quiet} = 1; } elsif ( $arg eq '--always' ) { $attr{always} = 1; } elsif ( $arg =~ /^--/ ) { die "Unknown import argument: $arg"; } else { push @steps, ['activate', $arg, \%opts]; } } if (!@steps) { push @steps, ['activate', undef, \%opts]; } my $self = $class->new(%attr); for (@steps) { my ($method, @args) = @$_; $self = $self->$method(@args); } if ($0 eq '-') { print $self->environment_vars_string($shelltype); exit 0; } else { $self->setup_local_lib; } } sub new { my $class = shift; bless {@_}, $class; } sub clone { my $self = shift; bless {%$self, @_}, ref $self; } sub inc { $_[0]->{inc} ||= \@INC } sub libs { $_[0]->{libs} ||= [ \'PERL5LIB' ] } sub bins { $_[0]->{bins} ||= [ \'PATH' ] } sub roots { $_[0]->{roots} ||= [ \'PERL_LOCAL_LIB_ROOT' ] } sub extra { $_[0]->{extra} ||= {} } sub quiet { $_[0]->{quiet} } sub _as_list { my $list = shift; grep length, map { !(ref $_ && ref $_ eq 'SCALAR') ? $_ : ( defined $ENV{$$_} ? split(/\Q$_path_sep/, $ENV{$$_}) : () ) } ref $list ? @$list : $list; } sub _remove_from { my ($list, @remove) = @_; return @$list if !@remove; my %remove = map { $_ => 1 } @remove; grep !$remove{$_}, _as_list($list); } my @_lib_subdirs = ( [$_version, $_archname], [$_version], [$_archname], (map [$_], @_inc_version_list), [], ); sub install_base_bin_path { my ($class, $path) = @_; return _catdir($path, 'bin'); } sub install_base_perl_path { my ($class, $path) = @_; return _catdir($path, 'lib', 'perl5'); } sub install_base_arch_path { my ($class, $path) = @_; _catdir($class->install_base_perl_path($path), $_archname); } sub lib_paths_for { my ($class, $path) = @_; my $base = $class->install_base_perl_path($path); return map { _catdir($base, @$_) } @_lib_subdirs; } sub _mm_escape_path { my $path = shift; $path =~ s/\\/\\\\/g; if ($path =~ s/ /\\ /g) { $path = qq{"$path"}; } return $path; } sub _mb_escape_path { my $path = shift; $path =~ s/\\/\\\\/g; return qq{"$path"}; } sub installer_options_for { my ($class, $path) = @_; return ( PERL_MM_OPT => defined $path ? "INSTALL_BASE="._mm_escape_path($path) : undef, PERL_MB_OPT => defined $path ? "--install_base "._mb_escape_path($path) : undef, ); } sub active_paths { my ($self) = @_; $self = ref $self ? $self : $self->new; return grep { # screen out entries that aren't actually reflected in @INC my $active_ll = $self->install_base_perl_path($_); grep { $_ eq $active_ll } @{$self->inc}; } _as_list($self->roots); } sub deactivate { my ($self, $path) = @_; $self = $self->new unless ref $self; $path = $self->resolve_path($path); $path = $self->normalize_path($path); my @active_lls = $self->active_paths; if (!grep { $_ eq $path } @active_lls) { warn "Tried to deactivate inactive local::lib '$path'\n"; return $self; } my %args = ( bins => [ _remove_from($self->bins, $self->install_base_bin_path($path)) ], libs => [ _remove_from($self->libs, $self->install_base_perl_path($path)) ], inc => [ _remove_from($self->inc, $self->lib_paths_for($path)) ], roots => [ _remove_from($self->roots, $path) ], ); $args{extra} = { $self->installer_options_for($args{roots}[0]) }; $self->clone(%args); } sub deactivate_all { my ($self) = @_; $self = $self->new unless ref $self; my @active_lls = $self->active_paths; my %args; if (@active_lls) { %args = ( bins => [ _remove_from($self->bins, map $self->install_base_bin_path($_), @active_lls) ], libs => [ _remove_from($self->libs, map $self->install_base_perl_path($_), @active_lls) ], inc => [ _remove_from($self->inc, map $self->lib_paths_for($_), @active_lls) ], roots => [ _remove_from($self->roots, @active_lls) ], ); } $args{extra} = { $self->installer_options_for(undef) }; $self->clone(%args); } sub activate { my ($self, $path, $opts) = @_; $opts ||= {}; $self = $self->new unless ref $self; $path = $self->resolve_path($path); $self->ensure_dir_structure_for($path, { quiet => $self->quiet }) unless $opts->{no_create}; $path = $self->normalize_path($path); my @active_lls = $self->active_paths; if (grep { $_ eq $path } @active_lls[1 .. $#active_lls]) { $self = $self->deactivate($path); } my %args; if ($opts->{always} || !@active_lls || $active_lls[0] ne $path) { %args = ( bins => [ $self->install_base_bin_path($path), @{$self->bins} ], libs => [ $self->install_base_perl_path($path), @{$self->libs} ], inc => [ $self->lib_paths_for($path), @{$self->inc} ], roots => [ $path, @{$self->roots} ], ); } $args{extra} = { $self->installer_options_for($path) }; $self->clone(%args); } sub normalize_path { my ($self, $path) = @_; $path = ( Win32::GetShortPathName($path) || $path ) if $^O eq 'MSWin32'; return $path; } sub build_environment_vars_for { my $self = $_[0]->new->activate($_[1], { always => 1 }); $self->build_environment_vars; } sub build_activate_environment_vars_for { my $self = $_[0]->new->activate($_[1], { always => 1 }); $self->build_environment_vars; } sub build_deactivate_environment_vars_for { my $self = $_[0]->new->deactivate($_[1]); $self->build_environment_vars; } sub build_deact_all_environment_vars_for { my $self = $_[0]->new->deactivate_all; $self->build_environment_vars; } sub build_environment_vars { my $self = shift; ( PATH => join($_path_sep, _as_list($self->bins)), PERL5LIB => join($_path_sep, _as_list($self->libs)), PERL_LOCAL_LIB_ROOT => join($_path_sep, _as_list($self->roots)), %{$self->extra}, ); } sub setup_local_lib_for { my $self = $_[0]->new->activate($_[1]); $self->setup_local_lib; } sub setup_local_lib { my $self = shift; # if Carp is already loaded, ensure Carp::Heavy is also loaded, to avoid # $VERSION mismatch errors (Carp::Heavy loads Carp, so we do not need to # check in the other direction) require Carp::Heavy if $INC{'Carp.pm'}; $self->setup_env_hash; @INC = @{$self->inc}; } sub setup_env_hash_for { my $self = $_[0]->new->activate($_[1]); $self->setup_env_hash; } sub setup_env_hash { my $self = shift; my %env = $self->build_environment_vars; for my $key (keys %env) { if (defined $env{$key}) { $ENV{$key} = $env{$key}; } else { delete $ENV{$key}; } } } sub print_environment_vars_for { print $_[0]->environment_vars_string_for(@_[1..$#_]); } sub environment_vars_string_for { my $self = $_[0]->new->activate($_[1], { always => 1}); $self->environment_vars_string; } sub environment_vars_string { my ($self, $shelltype) = @_; $shelltype ||= $self->guess_shelltype; my $extra = $self->extra; my @envs = ( PATH => $self->bins, PERL5LIB => $self->libs, PERL_LOCAL_LIB_ROOT => $self->roots, map { $_ => $extra->{$_} } sort keys %$extra, ); $self->_build_env_string($shelltype, \@envs); } sub _build_env_string { my ($self, $shelltype, $envs) = @_; my @envs = @$envs; my $build_method = "build_${shelltype}_env_declaration"; my $out = ''; while (@envs) { my ($name, $value) = (shift(@envs), shift(@envs)); if ( ref $value && @$value == 1 && ref $value->[0] && ref $value->[0] eq 'SCALAR' && ${$value->[0]} eq $name) { next; } $out .= $self->$build_method($name, $value); } my $wrap_method = "wrap_${shelltype}_output"; if ($self->can($wrap_method)) { return $self->$wrap_method($out); } return $out; } sub build_bourne_env_declaration { my ($class, $name, $args) = @_; my $value = $class->_interpolate($args, '${%s:-}', qr/["\\\$!`]/, '\\%s'); if (!defined $value) { return qq{unset $name;\n}; } $value =~ s/(^|\G|$_path_sep)\$\{$name:-\}$_path_sep/$1\${$name}\${$name:+$_path_sep}/g; $value =~ s/$_path_sep\$\{$name:-\}$/\${$name:+$_path_sep\${$name}}/; qq{${name}="$value"; export ${name};\n} } sub build_csh_env_declaration { my ($class, $name, $args) = @_; my ($value, @vars) = $class->_interpolate($args, '${%s}', qr/["\$]/, '"\\%s"'); if (!defined $value) { return qq{unsetenv $name;\n}; } my $out = ''; for my $var (@vars) { $out .= qq{if ! \$?$name setenv $name '';\n}; } my $value_without = $value; if ($value_without =~ s/(?:^|$_path_sep)\$\{$name\}(?:$_path_sep|$)//g) { $out .= qq{if "\${$name}" != '' setenv $name "$value";\n}; $out .= qq{if "\${$name}" == '' }; } $out .= qq{setenv $name "$value_without";\n}; return $out; } sub build_cmd_env_declaration { my ($class, $name, $args) = @_; my $value = $class->_interpolate($args, '%%%s%%', qr(%), '%s'); if (!$value) { return qq{\@set $name=\n}; } my $out = ''; my $value_without = $value; if ($value_without =~ s/(?:^|$_path_sep)%$name%(?:$_path_sep|$)//g) { $out .= qq{\@if not "%$name%"=="" set "$name=$value"\n}; $out .= qq{\@if "%$name%"=="" }; } $out .= qq{\@set "$name=$value_without"\n}; return $out; } sub build_powershell_env_declaration { my ($class, $name, $args) = @_; my $value = $class->_interpolate($args, '$env:%s', qr/["\$]/, '`%s'); if (!$value) { return qq{Remove-Item -ErrorAction 0 Env:\\$name;\n}; } my $maybe_path_sep = qq{\$(if("\$env:$name"-eq""){""}else{"$_path_sep"})}; $value =~ s/(^|\G|$_path_sep)\$env:$name$_path_sep/$1\$env:$name"+$maybe_path_sep+"/g; $value =~ s/$_path_sep\$env:$name$/"+$maybe_path_sep+\$env:$name+"/; qq{\$env:$name = \$("$value");\n}; } sub wrap_powershell_output { my ($class, $out) = @_; return $out || " \n"; } sub build_fish_env_declaration { my ($class, $name, $args) = @_; my $value = $class->_interpolate($args, '$%s', qr/[\\"'$ ]/, '\\%s'); if (!defined $value) { return qq{set -e $name;\n}; } # fish has special handling for PATH, CDPATH, and MANPATH. They are always # treated as arrays, and joined with ; when storing the environment. Other # env vars can be arrays, but will be joined without a separator. We only # really care about PATH, but might as well make this routine more general. if ($name =~ /^(?:CD|MAN)?PATH$/) { $value =~ s/$_path_sep/ /g; my $silent = $name =~ /^(?:CD)?PATH$/ ? " 2>"._devnull : ''; return qq{set -x $name $value$silent;\n}; } my $out = ''; my $value_without = $value; if ($value_without =~ s/(?:^|$_path_sep)\$$name(?:$_path_sep|$)//g) { $out .= qq{set -q $name; and set -x $name $value;\n}; $out .= qq{set -q $name; or }; } $out .= qq{set -x $name $value_without;\n}; $out; } sub _interpolate { my ($class, $args, $var_pat, $escape, $escape_pat) = @_; return unless defined $args; my @args = ref $args ? @$args : $args; return unless @args; my @vars = map { $$_ } grep { ref $_ eq 'SCALAR' } @args; my $string = join $_path_sep, map { ref $_ eq 'SCALAR' ? sprintf($var_pat, $$_) : do { s/($escape)/sprintf($escape_pat, $1)/ge; $_; }; } @args; return wantarray ? ($string, \@vars) : $string; } sub pipeline; sub pipeline { my @methods = @_; my $last = pop(@methods); if (@methods) { \sub { my ($obj, @args) = @_; $obj->${pipeline @methods}( $obj->$last(@args) ); }; } else { \sub { shift->$last(@_); }; } } sub resolve_path { my ($class, $path) = @_; $path = $class->${pipeline qw( resolve_relative_path resolve_home_path resolve_empty_path )}($path); $path; } sub resolve_empty_path { my ($class, $path) = @_; if (defined $path) { $path; } else { '~/perl5'; } } sub resolve_home_path { my ($class, $path) = @_; $path =~ /^~([^\/]*)/ or return $path; my $user = $1; my $homedir = do { if (! length($user) && defined $ENV{HOME}) { $ENV{HOME}; } else { require File::Glob; File::Glob::bsd_glob("~$user", File::Glob::GLOB_TILDE()); } }; unless (defined $homedir) { require Carp; require Carp::Heavy; Carp::croak( "Couldn't resolve homedir for " .(defined $user ? $user : 'current user') ); } $path =~ s/^~[^\/]*/$homedir/; $path; } sub resolve_relative_path { my ($class, $path) = @_; _rel2abs($path); } sub ensure_dir_structure_for { my ($class, $path, $opts) = @_; $opts ||= {}; my @dirs; foreach my $dir ( $class->lib_paths_for($path), $class->install_base_bin_path($path), ) { my $d = $dir; while (!-d $d) { push @dirs, $d; require File::Basename; $d = File::Basename::dirname($d); } } warn "Attempting to create directory ${path}\n" if !$opts->{quiet} && @dirs; my %seen; foreach my $dir (reverse @dirs) { next if $seen{$dir}++; mkdir $dir or -d $dir or die "Unable to create $dir: $!" } return; } sub guess_shelltype { my $shellbin = defined $ENV{SHELL} && length $ENV{SHELL} ? ($ENV{SHELL} =~ /([\w.]+)$/)[-1] : ( $^O eq 'MSWin32' && exists $ENV{'!EXITCODE'} ) ? 'bash' : ( $^O eq 'MSWin32' && $ENV{PROMPT} && $ENV{COMSPEC} ) ? ($ENV{COMSPEC} =~ /([\w.]+)$/)[-1] : ( $^O eq 'MSWin32' && !$ENV{PROMPT} ) ? 'powershell.exe' : 'sh'; for ($shellbin) { return /csh$/ ? 'csh' : /fish$/ ? 'fish' : /command(?:\.com)?$/i ? 'cmd' : /cmd(?:\.exe)?$/i ? 'cmd' : /4nt(?:\.exe)?$/i ? 'cmd' : /powershell(?:\.exe)?$/i ? 'powershell' : 'bourne'; } } 1; __END__ =encoding utf8 =head1 NAME local::lib - create and use a local lib/ for perl modules with PERL5LIB =head1 SYNOPSIS In code - use local::lib; # sets up a local lib at ~/perl5 use local::lib '~/foo'; # same, but ~/foo # Or... use FindBin; use local::lib "$FindBin::Bin/../support"; # app-local support library From the shell - # Install LWP and its missing dependencies to the '~/perl5' directory perl -MCPAN -Mlocal::lib -e 'CPAN::install(LWP)' # Just print out useful shell commands $ perl -Mlocal::lib PERL_MB_OPT='--install_base /home/username/perl5'; export PERL_MB_OPT; PERL_MM_OPT='INSTALL_BASE=/home/username/perl5'; export PERL_MM_OPT; PERL5LIB="/home/username/perl5/lib/perl5"; export PERL5LIB; PATH="/home/username/perl5/bin:$PATH"; export PATH; PERL_LOCAL_LIB_ROOT="/home/usename/perl5:$PERL_LOCAL_LIB_ROOT"; export PERL_LOCAL_LIB_ROOT; From a F<.bash_profile> or F<.bashrc> file - eval "$(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)" =head2 The bootstrapping technique A typical way to install local::lib is using what is known as the "bootstrapping" technique. You would do this if your system administrator hasn't already installed local::lib. In this case, you'll need to install local::lib in your home directory. Even if you do have administrative privileges, you will still want to set up your environment variables, as discussed in step 4. Without this, you would still install the modules into the system CPAN installation and also your Perl scripts will not use the lib/ path you bootstrapped with local::lib. By default local::lib installs itself and the CPAN modules into ~/perl5. Windows users must also see L. =over 4 =item 1. Download and unpack the local::lib tarball from CPAN (search for "Download" on the CPAN page about local::lib). Do this as an ordinary user, not as root or administrator. Unpack the file in your home directory or in any other convenient location. =item 2. Run this: perl Makefile.PL --bootstrap If the system asks you whether it should automatically configure as much as possible, you would typically answer yes. =item 3. Run this: (local::lib assumes you have make installed on your system) make test && make install =item 4. Now we need to setup the appropriate environment variables, so that Perl starts using our newly generated lib/ directory. If you are using bash or any other Bourne shells, you can add this to your shell startup script this way: echo 'eval "$(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)"' >>~/.bashrc If you are using C shell, you can do this as follows: % echo $SHELL /bin/csh $ echo 'eval `perl -I$HOME/perl5/lib/perl5 -Mlocal::lib`' >> ~/.cshrc After writing your shell configuration file, be sure to re-read it to get the changed settings into your current shell's environment. Bourne shells use C<. ~/.bashrc> for this, whereas C shells use C. =back =head3 Bootstrapping into an alternate directory In order to install local::lib into a directory other than the default, you need to specify the name of the directory when you call bootstrap. Then, when setting up the environment variables, both perl and local::lib must be told the location of the bootstrap directory. The setup process would look as follows: perl Makefile.PL --bootstrap=~/foo make test && make install echo 'eval "$(perl -I$HOME/foo/lib/perl5 -Mlocal::lib=$HOME/foo)"' >>~/.bashrc . ~/.bashrc =head3 Other bootstrapping options If you're on a slower machine, or are operating under draconian disk space limitations, you can disable the automatic generation of manpages from POD when installing modules by using the C<--no-manpages> argument when bootstrapping: perl Makefile.PL --bootstrap --no-manpages To avoid doing several bootstrap for several Perl module environments on the same account, for example if you use it for several different deployed applications independently, you can use one bootstrapped local::lib installation to install modules in different directories directly this way: cd ~/mydir1 perl -Mlocal::lib=./ eval $(perl -Mlocal::lib=./) ### To set the environment for this shell alone printenv ### You will see that ~/mydir1 is in the PERL5LIB perl -MCPAN -e install ... ### whatever modules you want cd ../mydir2 ... REPEAT ... If you use F<.bashrc> to activate a local::lib automatically, the local::lib will be re-enabled in any sub-shells used, overriding adjustments you may have made in the parent shell. To avoid this, you can initialize the local::lib in F<.bash_profile> rather than F<.bashrc>, or protect the local::lib invocation with a C<$SHLVL> check: [ $SHLVL -eq 1 ] && eval "$(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)" If you are working with several C environments, you may want to remove some of them from the current environment without disturbing the others. You can deactivate one environment like this (using bourne sh): eval $(perl -Mlocal::lib=--deactivate,~/path) which will generate and run the commands needed to remove C<~/path> from your various search paths. Whichever environment was B will remain the target for module installations. That is, if you activate C<~/path_A> and then you activate C<~/path_B>, new modules you install will go in C<~/path_B>. If you deactivate C<~/path_B> then modules will be installed into C<~/pathA> -- but if you deactivate C<~/path_A> then they will still be installed in C<~/pathB> because pathB was activated later. You can also ask C to clean itself completely out of the current shell's environment with the C<--deactivate-all> option. For multiple environments for multiple apps you may need to include a modified version of the C<< use FindBin >> instructions in the "In code" sample above. If you did something like the above, you have a set of Perl modules at C<< ~/mydir1/lib >>. If you have a script at C<< ~/mydir1/scripts/myscript.pl >>, you need to tell it where to find the modules you installed for it at C<< ~/mydir1/lib >>. In C<< ~/mydir1/scripts/myscript.pl >>: use strict; use warnings; use local::lib "$FindBin::Bin/.."; ### points to ~/mydir1 and local::lib finds lib use lib "$FindBin::Bin/../lib"; ### points to ~/mydir1/lib Put this before any BEGIN { ... } blocks that require the modules you installed. =head2 Differences when using this module under Win32 To set up the proper environment variables for your current session of C, you can use this: C:\>perl -Mlocal::lib set PERL_MB_OPT=--install_base C:\DOCUME~1\ADMINI~1\perl5 set PERL_MM_OPT=INSTALL_BASE=C:\DOCUME~1\ADMINI~1\perl5 set PERL5LIB=C:\DOCUME~1\ADMINI~1\perl5\lib\perl5 set PATH=C:\DOCUME~1\ADMINI~1\perl5\bin;%PATH% ### To set the environment for this shell alone C:\>perl -Mlocal::lib > %TEMP%\tmp.bat && %TEMP%\tmp.bat && del %TEMP%\tmp.bat ### instead of $(perl -Mlocal::lib=./) If you want the environment entries to persist, you'll need to add them to the Control Panel's System applet yourself or use L. The "~" is translated to the user's profile directory (the directory named for the user under "Documents and Settings" (Windows XP or earlier) or "Users" (Windows Vista or later)) unless $ENV{HOME} exists. After that, the home directory is translated to a short name (which means the directory must exist) and the subdirectories are created. =head3 PowerShell local::lib also supports PowerShell, and can be used with the C cmdlet. Invoke-Expression "$(perl -Mlocal::lib)" =head1 RATIONALE The version of a Perl package on your machine is not always the version you need. Obviously, the best thing to do would be to update to the version you need. However, you might be in a situation where you're prevented from doing this. Perhaps you don't have system administrator privileges; or perhaps you are using a package management system such as Debian, and nobody has yet gotten around to packaging up the version you need. local::lib solves this problem by allowing you to create your own directory of Perl packages downloaded from CPAN (in a multi-user system, this would typically be within your own home directory). The existing system Perl installation is not affected; you simply invoke Perl with special options so that Perl uses the packages in your own local package directory rather than the system packages. local::lib arranges things so that your locally installed version of the Perl packages takes precedence over the system installation. If you are using a package management system (such as Debian), you don't need to worry about Debian and CPAN stepping on each other's toes. Your local version of the packages will be written to an entirely separate directory from those installed by Debian. =head1 DESCRIPTION This module provides a quick, convenient way of bootstrapping a user-local Perl module library located within the user's home directory. It also constructs and prints out for the user the list of environment variables using the syntax appropriate for the user's current shell (as specified by the C environment variable), suitable for directly adding to one's shell configuration file. More generally, local::lib allows for the bootstrapping and usage of a directory containing Perl modules outside of Perl's C<@INC>. This makes it easier to ship an application with an app-specific copy of a Perl module, or collection of modules. Useful in cases like when an upstream maintainer hasn't applied a patch to a module of theirs that you need for your application. On import, local::lib sets the following environment variables to appropriate values: =over 4 =item PERL_MB_OPT =item PERL_MM_OPT =item PERL5LIB =item PATH =item PERL_LOCAL_LIB_ROOT =back When possible, these will be appended to instead of overwritten entirely. These values are then available for reference by any code after import. =head1 CREATING A SELF-CONTAINED SET OF MODULES See L for one way to do this - but note that there are a number of caveats, and the best approach is always to perform a build against a clean perl (i.e. site and vendor as close to empty as possible). =head1 IMPORT OPTIONS Options are values that can be passed to the C import besides the directory to use. They are specified as C or C. =head2 --deactivate Remove the chosen path (or the default path) from the module search paths if it was added by C, instead of adding it. =head2 --deactivate-all Remove all directories that were added to search paths by C from the search paths. =head2 --quiet Don't output any messages about directories being created. =head2 --always Always add directories to environment variables, ignoring if they are already included. =head2 --shelltype Specify the shell type to use for output. By default, the shell will be detected based on the environment. Should be one of: C, C, C, or C. =head2 --no-create Prevents C from creating directories when activating dirs. This is likely to cause issues on Win32 systems. =head1 CLASS METHODS =head2 ensure_dir_structure_for =over 4 =item Arguments: $path =item Return value: None =back Attempts to create a local::lib directory, including subdirectories and all required parent directories. Throws an exception on failure. =head2 print_environment_vars_for =over 4 =item Arguments: $path =item Return value: None =back Prints to standard output the variables listed above, properly set to use the given path as the base directory. =head2 build_environment_vars_for =over 4 =item Arguments: $path =item Return value: %environment_vars =back Returns a hash with the variables listed above, properly set to use the given path as the base directory. =head2 setup_env_hash_for =over 4 =item Arguments: $path =item Return value: None =back Constructs the C<%ENV> keys for the given path, by calling L. =head2 active_paths =over 4 =item Arguments: None =item Return value: @paths =back Returns a list of active C paths, according to the C environment variable and verified against what is really in C<@INC>. =head2 install_base_perl_path =over 4 =item Arguments: $path =item Return value: $install_base_perl_path =back Returns a path describing where to install the Perl modules for this local library installation. Appends the directories C and C to the given path. =head2 lib_paths_for =over 4 =item Arguments: $path =item Return value: @lib_paths =back Returns the list of paths perl will search for libraries, given a base path. This includes the base path itself, the architecture specific subdirectory, and perl version specific subdirectories. These paths may not all exist. =head2 install_base_bin_path =over 4 =item Arguments: $path =item Return value: $install_base_bin_path =back Returns a path describing where to install the executable programs for this local library installation. Appends the directory C to the given path. =head2 installer_options_for =over 4 =item Arguments: $path =item Return value: %installer_env_vars =back Returns a hash of environment variables that should be set to cause installation into the given path. =head2 resolve_empty_path =over 4 =item Arguments: $path =item Return value: $base_path =back Builds and returns the base path into which to set up the local module installation. Defaults to C<~/perl5>. =head2 resolve_home_path =over 4 =item Arguments: $path =item Return value: $home_path =back Attempts to find the user's home directory. If no definite answer is available, throws an exception. =head2 resolve_relative_path =over 4 =item Arguments: $path =item Return value: $absolute_path =back Translates the given path into an absolute path. =head2 resolve_path =over 4 =item Arguments: $path =item Return value: $absolute_path =back Calls the following in a pipeline, passing the result from the previous to the next, in an attempt to find where to configure the environment for a local library installation: L, L, L. Passes the given path argument to L which then returns a result that is passed to L, which then has its result passed to L. The result of this final call is returned from L. =head1 OBJECT INTERFACE =head2 new =over 4 =item Arguments: %attributes =item Return value: $local_lib =back Constructs a new C object, representing the current state of C<@INC> and the relevant environment variables. =head1 ATTRIBUTES =head2 roots An arrayref representing active C directories. =head2 inc An arrayref representing C<@INC>. =head2 libs An arrayref representing the PERL5LIB environment variable. =head2 bins An arrayref representing the PATH environment variable. =head2 extra A hashref of extra environment variables (e.g. C and C) =head2 no_create If set, C will not try to create directories when activating them. =head1 OBJECT METHODS =head2 clone =over 4 =item Arguments: %attributes =item Return value: $local_lib =back Constructs a new C object based on the existing one, overriding the specified attributes. =head2 activate =over 4 =item Arguments: $path =item Return value: $new_local_lib =back Constructs a new instance with the specified path active. =head2 deactivate =over 4 =item Arguments: $path =item Return value: $new_local_lib =back Constructs a new instance with the specified path deactivated. =head2 deactivate_all =over 4 =item Arguments: None =item Return value: $new_local_lib =back Constructs a new instance with all C directories deactivated. =head2 environment_vars_string =over 4 =item Arguments: [ $shelltype ] =item Return value: $shell_env_string =back Returns a string to set up the C, meant to be run by a shell. =head2 build_environment_vars =over 4 =item Arguments: None =item Return value: %environment_vars =back Returns a hash with the variables listed above, properly set to use the given path as the base directory. =head2 setup_env_hash =over 4 =item Arguments: None =item Return value: None =back Constructs the C<%ENV> keys for the given path, by calling L. =head2 setup_local_lib Constructs the C<%ENV> hash using L, and set up C<@INC>. =head1 A WARNING ABOUT UNINST=1 Be careful about using local::lib in combination with "make install UNINST=1". The idea of this feature is that will uninstall an old version of a module before installing a new one. However it lacks a safety check that the old version and the new version will go in the same directory. Used in combination with local::lib, you can potentially delete a globally accessible version of a module while installing the new version in a local place. Only combine "make install UNINST=1" and local::lib if you understand these possible consequences. =head1 LIMITATIONS =over 4 =item * Directory names with spaces in them are not well supported by the perl toolchain and the programs it uses. Pure-perl distributions should support spaces, but problems are more likely with dists that require compilation. A workaround you can do is moving your local::lib to a directory with spaces B you installed all modules inside your local::lib bootstrap. But be aware that you can't update or install CPAN modules after the move. =item * Rather basic shell detection. Right now anything with csh in its name is assumed to be a C shell or something compatible, and everything else is assumed to be Bourne, except on Win32 systems. If the C environment variable is not set, a Bourne-compatible shell is assumed. =item * Kills any existing PERL_MM_OPT or PERL_MB_OPT. =item * Should probably auto-fixup CPAN config if not already done. =item * On VMS and MacOS Classic (pre-OS X), local::lib loads L. This means any L version installed in the local::lib will be ignored by scripts using local::lib. A workaround for this is using C instead of using C directly. =item * Conflicts with L's C option. C uses the C option, as it has more predictable and sane behavior. If something attempts to use the C option when running a F, L will refuse to run, as the two options conflict. This can be worked around by temporarily unsetting the C environment variable. =item * Conflicts with L's C<--prefix> option. Similar to the previous limitation, but any C<--prefix> option specified will be ignored. This can be worked around by temporarily unsetting the C environment variable. =back Patches very much welcome for any of the above. =over 4 =item * On Win32 systems, does not have a way to write the created environment variables to the registry, so that they can persist through a reboot. =back =head1 TROUBLESHOOTING If you've configured local::lib to install CPAN modules somewhere in to your home directory, and at some point later you try to install a module with C, but it fails with an error like: C and buried within the install log is an error saying C<'INSTALL_BASE' is not a known MakeMaker parameter name>, then you've somehow lost your updated ExtUtils::MakeMaker module. To remedy this situation, rerun the bootstrapping procedure documented above. Then, run C Finally, re-run C and it should install without problems. =head1 ENVIRONMENT =over 4 =item SHELL =item COMSPEC local::lib looks at the user's C environment variable when printing out commands to add to the shell configuration file. On Win32 systems, C is also examined. =back =head1 SEE ALSO =over 4 =item * L =back =head1 SUPPORT IRC: Join #toolchain on irc.perl.org. =head1 AUTHOR Matt S Trout http://www.shadowcat.co.uk/ auto_install fixes kindly sponsored by http://www.takkle.com/ =head1 CONTRIBUTORS Patches to correctly output commands for csh style shells, as well as some documentation additions, contributed by Christopher Nehren . Doc patches for a custom local::lib directory, more cleanups in the english documentation and a L contributed by Torsten Raudssus . Hans Dieter Pearcey sent in some additional tests for ensuring things will install properly, submitted a fix for the bug causing problems with writing Makefiles during bootstrapping, contributed an example program, and submitted yet another fix to ensure that local::lib can install and bootstrap properly. Many, many thanks! pattern of Freenode IRC contributed the beginnings of the Troubleshooting section. Many thanks! Patch to add Win32 support contributed by Curtis Jewell . Warnings for missing PATH/PERL5LIB (as when not running interactively) silenced by a patch from Marco Emilio Poleggi. Mark Stosberg provided the code for the now deleted '--self-contained' option. Documentation patches to make win32 usage clearer by David Mertens (run4flat). Brazilian L and minor doc patches contributed by Breno G. de Oliveira . Improvements to stacking multiple local::lib dirs and removing them from the environment later on contributed by Andrew Rodland . Patch for Carp version mismatch contributed by Hakim Cassimally . Rewrite of internals and numerous bug fixes and added features contributed by Graham Knop . =head1 COPYRIGHT Copyright (c) 2007 - 2013 the local::lib L and L as listed above. =head1 LICENSE This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut PK!D bin/rackupnuȯ#!/opt/cpanel/ea-ruby27/root/usr/bin/ruby # # This file was generated by RubyGems. # # The application 'rack' is installed as part of a gem, and # this file is here to facilitate running it. # require 'rubygems' version = ">= 0.a" str = ARGV.first if str str = str.b[/\A_(.*)_\z/, 1] if str and Gem::Version.correct?(str) version = str ARGV.shift end end if Gem.respond_to?(:activate_bin_path) load Gem.activate_bin_path('rack', 'rackup', version) else gem "rack", version load Gem.bin_path("rack", "rackup", version) end PK!͟E+lib64/gems/ruby/ruby-lsapi-5.7/gem_make.outnu[current directory: /opt/cpanel/ea-ruby27/root/usr/local/share/gems/gems/ruby-lsapi-5.7/ext/lsapi /opt/cpanel/ea-ruby27/root/usr/bin/ruby -I /opt/cpanel/ea-ruby27/root/usr/share/ruby/ruby-2.7.8 -r ./siteconf20250624-2551536-irf92j.rb extconf.rb checking for -lsocket... no creating Makefile current directory: /opt/cpanel/ea-ruby27/root/usr/local/share/gems/gems/ruby-lsapi-5.7/ext/lsapi make "DESTDIR=" clean rm -f rm -f lsapi.so *.o *.bak mkmf.log .*.time current directory: /opt/cpanel/ea-ruby27/root/usr/local/share/gems/gems/ruby-lsapi-5.7/ext/lsapi make "DESTDIR=" gcc -I. -I/opt/cpanel/ea-ruby27/root/usr/include -I/opt/cpanel/ea-ruby27/root/usr/include/ruby/backward -I/opt/cpanel/ea-ruby27/root/usr/include -I. -DRUBY_2 -fPIC -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fPIC -m64 -o lsapilib.o -c lsapilib.c gcc -I. -I/opt/cpanel/ea-ruby27/root/usr/include -I/opt/cpanel/ea-ruby27/root/usr/include/ruby/backward -I/opt/cpanel/ea-ruby27/root/usr/include -I. -DRUBY_2 -fPIC -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fPIC -m64 -o lsruby.o -c lsruby.c rm -f lsapi.so gcc -shared -o lsapi.so lsapilib.o lsruby.o -L. -L/opt/cpanel/ea-ruby27/root/usr/lib64 -L. -Wl,-rpath=/opt/cpanel/ea-ruby27/root/usr/lib64 -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,-rpath=/opt/cpanel/ea-ruby27/root/usr/lib64 -m64 -lruby -lm -lc current directory: /opt/cpanel/ea-ruby27/root/usr/local/share/gems/gems/ruby-lsapi-5.7/ext/lsapi make "DESTDIR=" install /usr/bin/mkdir -p . ./.gem.20250624-2551536-1swza1k exit > .sitearchdir.time /usr/bin/install -c -m 0755 lsapi.so ./.gem.20250624-2551536-1swza1k PK!1lib64/gems/ruby/ruby-lsapi-5.7/gem.build_completenu[PK!'ثث'lib64/gems/ruby/ruby-lsapi-5.7/lsapi.sonuȯELF>S@X@8 @&% P P !P ! h h !h !888$$ Std PtdpppQtdRtdP P !P !GNỤLLis?C H‚3@(L`qCSlP*fRn}'3qѮl>&Sɶ ܮʼnSO`[is|&߱RD/y7řkՊ eY&09=By:%/=ejOzJ6'l#mNULCB1{!\$O#W23S=apbU06aD7jp#7ĴDIΊ=\4yݾCEкQuo rSѮIo|q%h6 󝵛 ' =qX[ u  f ! ysO[ |  [7 P + k & !\  2LRT s ? + q ux >A  # -r cH  "./  " "$7x n, 9  A 9 4, 2( F"Xf E  L r `G  |F pD   K 5 ti~ P 0z! b p. 8! ] @Z\ e n  v 1 p Y ` o@   Prl yj U P| 0- q]   n pY n  5 Po `w$ }l! s U T E @u qS m7 mT @(   Г  {F @qJ p @! |I   p  !b 0g ` P@$ '! l 6 0n  ` @!__gmon_start___ITM_deregisterTMCloneTable_ITM_registerTMCloneTable__cxa_finalizecompareValueLocationset_skip_writesigactionsigemptyset__stack_chk_failreallocfcntlacceptsetsockoptmmapmemsetsetsidread__errno_locationclosewritevkillgetppid__ctype_b_locstrncpystrchrstrcasecmpstrtolgetaddrinfomemcpyfreeaddrinfoinet_addrLSAPI_Log__vfprintf_chk__snprintf_chkgetuid__fprintf_chkgettimeofdaylocaltime_rwaitpidforksystemexitlsapi_perrorstrerrorLSAPI_is_suEXEC_DaemonLSAPI_StopLSAPI_IsRunningLSAPI_Register_Pgrp_Timer_CallbackLSAPI_InitRequestmallocgetpeernamedup2LSAPI_Initgeteuidsignalg_reqdlopendlsymLSAPI_Is_Listen_rLSAPI_Is_ListenLSAPI_Reset_rLSAPI_Release_rfreeLSAPI_GetHeader_rLSAPI_ReqBodyGetChar_rLSAPI_ReqBodyGetLine_rmemchrmemmoveLSAPI_ReadReqBody_rFlush_RespBuf_rLSAPI_GetEnv_rstrcmp__ctype_toupper_locLSAPI_ForeachOrgHeader_rqsortLSAPI_ForeachHeader_rLSAPI_ForeachEnv_rLSAPI_ForeachSpecialEnv_rLSAPI_FinalizeRespHeaders_rLSAPI_Flush_rLSAPI_Write_Stderr_rgetpidgetcwdmemccpy__realpath_chkLSAPI_Finish_rLSAPI_End_Response_rLSAPI_Write_rLSAPI_sendfile_rsendfileLSAPI_AppendRespHeader2_rstrlenLSAPI_AppendRespHeader_rLSAPI_CreateListenSock2socketbindlistenunlinkLSAPI_ParseSockAddrLSAPI_CreateListenSockLSAPI_Init_Prefork_ServercallocsetpgidsysconfLSAPI_Set_Server_fdLSAPI_reset_server_stateis_enough_free_memLSAPI_Postfork_ChildLSAPI_Postfork_ParenttimeLSAPI_Accept_Before_Fork__fdelt_chkusleepsched_yieldLSAPI_Set_Max_ReqsLSAPI_Set_Max_IdleLSAPI_Set_Max_ChildrenLSAPI_Set_Extra_ChildrenLSAPI_Set_Max_Process_TimeLSAPI_Set_Max_Idle_ChildrenLSAPI_Set_Server_Max_Idle_SecsLSAPI_Set_Slow_Req_MsecsLSAPI_Get_Slow_Req_MsecsLSAPI_No_Check_ppidLSAPI_Get_ppidLSAPI_Init_Env_Parametersgetenvgetpwnamdlerrorsetrlimit__fxstatsetreuidLSAPI_ErrResponse_rlsapi_MD5Initlsapi_MD5Updatelsapi_MD5FinalgetpwuidsetgidsetgroupssetuidstrtollprctlinitgroupsLSAPI_Accept_rLSAPI_Prefork_Accept_rsigaddsetsigprocmaskLSAPI_Set_Restored_Parent_PidLSAPI_Inc_Req_Processedselectrb_str_newrb_hash_asetrb_funcallvrb_intern2rb_gc_markmunmaprb_check_typerb_obj_as_stringrb_f_sprintfs_fn_add_envrb_string_valuerb_string_value_ptrrb_eval_string_wraprb_str_new_staticrb_ruby_verbose_ptrrb_define_global_construby_strdupmkstempftruncaterb_str_buf_newrb_str_catrb_num2intrb_fix2intmemmemrb_yieldrb_gc_writebarrier_unprotectrb_io_putsrb_ary_detransientrb_exec_recursiverb_default_rsrb_output_fsrb_output_rsrb_lastline_getInit_lsapichdirrb_stderrrb_cObjectrb_const_getrb_global_variablerb_define_classrb_data_object_zallocrb_stdoutrb_stdinrb_hash_new__memcpy_chkrb_define_global_functionrb_define_methodrb_define_singleton_methodlibruby.so.2.7libm.so.6libc.so.6__environ_edata__bss_start_endGLIBC_2.14GLIBC_2.15GLIBC_2.4GLIBC_2.3.4GLIBC_2.2.5GLIBC_2.3/opt/cpanel/ea-ruby27/root/usr/lib64 ) 4 ii ? ti I ui U ii a P !PTX !T` !` ! ! ! !A ! ! !# !) !. !4 !; !J !Z !j !x ! ! ! ! ! ! !( !0 !8 !@ !H !P !X ! ` !!h !p !,x !< !@ !R !^ !r ! ! ! ! ! ! ! ! ! !  ! !' !: !Q( !_0 !r8 !@ !H !P !X !` !!!!!!!!$#!8!X!`!h!p!x!!!!!2!!<!H!J!R!V!V!W!!!m!{!!! !(!0!8!@!H!P!X!`!h!p! x! ! ! ! !!!!!!!!!!!!!!!!! !(!0!8!@!H!P!X! `!"h!#p!x!$!%!&!!'!(!!)!!!!*!+!,!-!!!!!.!/ !0(!0!18!@!H!3P!4X!5`!6h!7p!8x!9!;!=!>!?!@!!A!B!C!D!E!F!!G!!I!K!L!M!N !O(!0!P8!Q@!H!SP!X!T`!Uh!Xp!Yx!Z![!\!]!^!!_!`!!a!b!c!d!e!f!g!h!i!!j!k !l(!0!8!n@!oH!pP!qX!r`!h!sp!tx!u!w!x!y!z!|!!}!~!!!!!!!!!!!! !(!0!8!@!H!P!HH) HtH5r %s hhhhhhhhqhah Qh Ah 1h !h hhhhhhhhhhqhahQhAh1h!hhhh h!h"h#h$h%h&h'qh(ah)Qh*Ah+1h,!h-h.h/h0h1h2h3h4h5h6h7qh8ah9Qh:Ah;1h<!h=h>h?h@hAhBhChDhEhFhGqhHahIQhJAhK1hL!hMhNhOhPhQhRhShThUhVhWqhXahYQhZAh[1h\!h]h^h_h`hahbhchdhehfhgqhhahiQhjAhk1hl!hmhnhohphqhrhshthuhvhwqhxahyQhzAh{1h|!h}h~hhhhhhhhhqhahQhAh1h!hhhhhhhhhhhqhahQhAh1h!hhhhhhhhhhhq% D% D% D% D% D% D% D% D% D% D% D% D% D% D%} D%u D%m D%e D%] D%U D%M D%E D%= D%5 D%- D%% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D%} D%u D%m D%e D%] D%U D%M D%E D%= D%5 D%- D%% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D%} D%u D%m D%e D%] D%U D%M D%E D%= D%5 D%- D%% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D%} D%u D%m D%e D%] D%U D%M D%E D%= D%5 D%- D%% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D%} D%u D%m D%e D%] D%U D%M D%E D%= D%5 D%- D%% D% D% D% D% D% D% D% D% D% D% D% D% D% D% DH= H H9tH Ht H=i H5b H)HHH?HHtH HtfD=% u+UH=ʻ Ht H=. d ]wff.N ÐHGH+FHcAVIH@AUATL$USHtQHHtIHIL9r 0HI9v'KHSMsH;Յ[]A\A]A^[D]A\A]A^øff.f=^ D ÐO AWDD_AVAUATUSD6^nAxj׋G3G D!3G V\$ЋW^$DD1\$!3WAʋN Fp $E‰L$A1A1DD^ !D1G;νD\$DEDVDT$A!A1EE|A 1AD!E1DD*ƇGD1D!A1A1DDN DL$E F0D!DnA1D1DGFEDf Dd$D^(A!A1EEؘiA 1AD!1DDDʋ^0D1D!A1DE [D 1!D1DDN,A1DL$G\EA!Df8A1ED"kA 1AD!1DDN4EqDD1!1DE CyD 1!D1DDV<1G!I!1DDD$ Eb%1!1DDD$E@@1!1DDD$ EQZ^&1!1DE6Ƕ1!1DD]/։ 1!1DESD1!1DE ؉ 1!1DDD$E01!1DDD$ E!1!1DE7É1!1DDD$ E 1!1DDD$A0ZEAA1A!A1AA㩉A AD1!1t$DD1!A ogD1 1D!FL*1DD$Ή1AA!B9A1DD$A AD1D$qDD11‹D$ 0"amD1G 81Ɖ11DDD$ ED꾤11DDD$AKAA1A5`KA1AЉApA 1AD1D1D1A ~(D 1G'111DDD$ A0AA1A1AЋT$A2A1D1֋T$ 9ىDD11D11C|A A1A1AD$A0eVĉA1D1AD")Dt$ D D1A *CDG# 1  1DD9Ή 1DDY[e\$  1DE Dt$ щ1DE3}D\$  1DDD$E] 1DEO~oA AD 1DE ,DT$ A1ADE6CDt$ AN 1A~SADEAA A1A5:ADA AD 1Љ3*\$D D1DFӆ[ ]A\A]A^ 1։ 1DƉA4A_ OW GOW ATI1USHdH%(H$1HHH<$t)H$dH3%(u TH=o 1XtIɲ tH=` -HcH5`HEHf [ÉD1?H= `HW(Hw`HLJHHLJ0HHWHVHWHWHWHWH)81HSHHHt:HHt)HHtH{@Ht 1[fDHtGwBLHcAT4t/HcApHHH€:t HH1ff.fHtPtJSHcH;}HSHH[~ Hcи[ÃAWAVAUATUSHZHHHD$H:GH%HIHIIILfDA)HcHL9HcIOIvI HLHtML)HLHXHHAIA$D)EH[]A\A]A^A_LHHHAL|$II)AM?DLLHcH~A-H1|v@AVAUATUSHIHHHHHH+E1HH9HcHO؋)HH~)H9HwHHNHHIELL)Ht6Eu@HHDjHu48u @ uMt-M[L]A\A]A^H~IHH)uIDHO(HW8HLJLSH)ʍBHGpH0HpH@Hwp~HcHHH HPHO8HGpAWAVAUATUSHHHT$HHH<$IH=\HcB$HH@H,H9rZf.HH9vGH3LluHCH[]A\A]A^A_HD$L9IM9f.1H[]A\A]A^A_H$1L={ L@Al4tI4LHHuHD$HcP 1~H $HLMtM9sHH$ID$HD$@IcMIcmH,$L| L9)A\$){H8HD$'-t _HHI9tHU:t8IcU IcEH$H€:H $HcHcAVHH€:@AVAUATUSL$HH $L9uHdH%(H$@1HHHHHHE1L LgfHHcHcT4t7 qHM HIcAHL EHT DT t HHuHHcP HHL L9IcIHLfHH I9HcHHc0AHLcP IHcHHBDBHJH H2JAuH  L$DIH Ic LEtaE1@AI E9~CAMIUIAuI}ӅH$@dH3%(u6H@[]A\A]A^D1@IcUL{8IHC0L)H9>Lt$L+{(LA@LLfIM)MK H@σLSLCpNIHDI0HI@HKpM~HC(MxIH E1I@HC8HL1HMLIHHKpH9eHmthILM)MUI9t HItDL+t$HL[]A\A]A^A_DM@@M)(KIHt$HLHk8f.HAVLAUIATIUSHu\H߉{AD${LǃLSHu0{L[L]A\A]A^k[H]A\A]A^Hff.AWAVAUATUSHHHHD$ 0xIHIH Lc\CHcT t u(HDLcLH t tLÅ~6HcAT t u#H@Å~ALH t tE<AG=I|$PHHTI9T$Hs7HI+t$@L2%))I|$PLHHcAMt$PHLIFID$PA:I|$P}MD$PII@ID$PAIc$0fET8HЃA$0D$ H[]A\A]A^A_D$ ff.H HB=0AUATUSHcHfDA< t< uH؅uH[]A\A]IHPHHDI9D$Hs3HI+t$@L2%))tQI|$PHHAPI\$PHCID$PIc$0fET8HЃA$0H1[]A\A]øSDAUATAUHSH?dH%(HD$1D$ff t1fHL$dH3 %(H[]A\A]ÐA1ҾÃtʼnǺ1HL$Aߺؿu#DH'uD o߻D HZDeOAkDH}An}NcHtff.USHdH%(H$1HHu/HH$dH3%(uHĘ[]Կ@1H= tAUATA'USH 'DNuD H@AHH HHtH- t iƉlj JUDk H DcEuD蟹jf.H=j>H=F 11H\$HCX= f= DH Htxff.H HtxxHe Ht~xHE Ht~xH% Htxff.= D D Ð DAUATUHH=0=SH8dH%(H$(1mHtH H= H=<FHE1 H边H=<Ht 1H薹x H=<HHt 1HmIAąWE1H=<Ht 1H<ߌ H=<蚳HtHǺ 1菳H=<sH H=<THtHǺ 1иYH=p< H1 H蘸OH=V<HtHǺ 1oH=D<̲HtHǺ 1H1H=5<襲HtHǺ 1!H="<~HtHǺ 1òH=<WHt]H=<AHt 1H轷 _H=;Ht 1H菷Ջ Dn ` R EH=;H=2 u P% 5 H=;蓱H 1H  …t Hw HHHHD L;L ;L;C HLt@HֹL€D t%HtAHHt9HLuHfDHJHHJHuHHu1ۉH$(dH3%(H8[]A\A]fD H趲D1 sAHc讲L%w HH a裮Åt= @R u \ 5b `HH5=uHH5y=1u HH5=Fff.AVIAUEATIUHSHt4Hu!(fDHH褭HLwH]HuMtEL[1]A\A]A^ÐIcLLH#EgHGHHܺvT2HGAWAVAAUIATUHoSH1HGO@ƉWDW?t;AĉDHH|@D)A9rhAGt4LLDHL9A?vWEfAIIIH޺@HH@ HLL9uA?DLHH[]A\A]A^A_ܱIATLfUHSFH?LHz?)ƒw=t19rLHfCAD$AD$ ID$071)2HCHLHCP?o H{1HMHHCPH)KXH[]A\ff.fAWAVAUATUSHdH%(H$1Ht^ IAfMcg IoA_@LHCHuMX8u =~ uٽH$dH3 %( HĨ[]A\A]A^A_f~AAuIALJf8LS|xr@tPHf@HPXN MgA;G ZA9~uEo)HHcIHLD2Hu$G85} uAMgA9ID$,HD$HcIIDhAh(A9}A /HcIH4@HeHAIIh$A9}A HcIH4@HHAIIHl$p(ILHIILp$hMIc@o9gIcP[9SIcpG9?IcH39+IHHHHIHT$IIc@ H)IHHIHHHIHIIcHIHHHD$I9E1DL4t9dfH "H IGAG IPH f@ f@ HHP P H HPPHHPPHHPPHHPPf@f@f@HH#PP H H'P#P$H$H+P'P(f@f@!f@%H(P+f@)I1 fDIHcȋL4t#fBIHT4 rfB@2JHHuMIcP IHHH9pH@ppHH@ppHH@ppHH@ppHH@ppHH@ppHH@ppHH@pHH9wMApIbIc@ IH0:| ALJt`{ { A{ 1LHcϩIHIGAo IuID%{ D-{ B(AA1IcH4IILI 9HqH=, IJDB(9xHqH=, XIJB($AD$IKAzHL$;Mbfo{ Lt$ LAoL$AT$Ml$)$踪 LL8HL$LH#LLH$ID$H$I3L$H1H D$$Dl$EDDl$H=Dz IHIDz MH=y t"LDLŃP|$臨Et$A9uHt$螤D=Ń5y $A?D5y t @AH5(L*HtHHy f)gy #AH5k 1KH@H5J*1YLH 1H菤IH5421H5Y21D%x x DD$4H=x IHtZEW7E1111H=e2H5)1耨E|$迦M2;|$藦E1H5)LuI}觧Ń1H5a)LKfD=w -w w ED$AIFH5(1覧HH)H5h0H1聧1H5(L 1H50LA#LH c2Hr 解1H5(Laff.AVAUATUSHdH%(H$1D$ HH ;1Ll$Ld$Lt$ HklRr {ul;LLD$CHv Ht@HDv Ht{1f|$=u u|H4tH舴H`q d1H$dH3 %(u}HĠ[]A\A]A^D賜 {H5 h \Hfы{LA; ff.AWAVAUATUSHD=Du dH%(H$1ExH@H-yt H}u ;>g DH-u Ht 1aHEDp EH$L|$PDcA:E1AfD Ep EDt EtHt Ht @fLH1HIc臝DHD$PHD$XA ?)ѺHH D9#11A|$MHo D9#Ht Ht @D9#f AD91葳fH$dH34%(' H[]A\A]A^A_KL$HDŽ$hMl$H$L̞H$LHHD$@迚AHLDŽ$hH$腞H$LHHD$0xPH$LHHD$8S+H$`L HHD$(.H$ LHHD$H ADžHD$PE1Ll$`HD$H$HD$H$`HD$fD%q EHq Ht H=m 1蔞IL9t<1ձL5EDu EME1VFHm LH1HHc}՚}LD$LHD$PHD$X ?)ѺH1H T`1Vm  '8Ht$(1ҿ 轘x=_5p tHq Ht @f,D9# DCHp Ht@Hp HtDc1DN 0l =o {H5b HH1p Ht*Hap HB(@HAp Ht@Ho H@˖8B-DAD9M=bk 譟=Fk Ho HtDH`o Ht A9HAo HtD҉T$$DE ~:E~5WT$$A˙A輙AuDE UM D9vHn AHtDH5Z&1ƞD$藕0 H=? gT$fD}蠩C1mH|$IH|$HT$Ht$1萔61E Mt AMgMg{E1cCHt$1ҿ;H=d(Gf;)>fDD$$菔0d T$$WH=ST$WT$fDD#AfD^m RDh EBH+m H29h {H5u_ ДH{wH=&f̓H=='0讖MAH… H{HLh H=:Ht$1ҿ贒Hk bl L=bl Hl H%l 'l Hk HtH\X 11L='l AGHk Ht{1蝦D-~g EuHk Ht!E9~Zg Xk ;t Ht$@1ҿL$ Ht$01ҿHt$H1ҿHt$81ҿ֒Ht$(1ҿ ŒkHLSH$&$ޒL$踒Yj j H=/"J%˚,H=$"QHj Ht*fC1CD$CCT$HC(HC tj fD=nj lj ff.@H%f f.ffDn Hff.HV HH+HHODH1f1fATIHUSHchHcLHZH=n HH[]A\ff.HH5ui dH%(HD$1Hm H$Ht-H=m HHD$dH3%(u&H@H= &跘HH i ffDHSHH=QU 謏HfHH=1U 茏Hc5l ;5d H=l |6Hl Hl l HfD蛎f?IH=T HH+9M1~+HHcHc5il H5Vl 聐~Sl Hfff.@HH=QT |tHHHDHff.UHSH H6Hm t]uaHHHtT؃tJ tEHH؉уu5HM u@HHpH}HH[]HD@HuHߎHMH tHPHpfSHCH[ff.SHSHH[ÐHH=!S LHmb HHH=S \HMb HHH=R 輑tH#b HHUSHH=R :H=ej HtKHPj HLj Jj 腍9Gj t H5e 8j Ht[11ҿ}1H$j ?H-Q H;HHu艔HuH;HjH[a HH[]fH="HHme SHH\$Ht$HH-1HH[ff.fAWAVAUAATIUSHHJfDmH{HfKHu{Ht -gN OkHU{Hu-JN 2HHAnonymous mmap() failedlocalhost%02d:%02d:%02d [%s] [UID:%d][%d] %.*syesnosystem()%s, errno: %d (%s) /dev/nulllibpthread.sopthread_atforkHTTP_[UID:%d][%d] %s:%s: %s LSAPI: jail() failure./etc/Can't set signalsaccept() failedLSAPI_STDERR_LOGPHP_LSAPI_MAX_REQUESTSLSAPI_MAX_REQSLSAPI_KEEP_LISTENLSAPI_AVOID_FORKLSAPI_ACCEPT_NOTIFYLSAPI_SLOW_REQ_MSECSLSAPI_ALLOW_CORE_DUMPLSAPI_MAX_IDLEPHP_LSAPI_CHILDRENLSAPI_EXTRA_CHILDRENLSAPI_MAX_IDLE_CHILDRENLSAPI_PGRP_MAX_IDLELSAPI_MAX_PROCESS_TIMELSAPI_PPID_NO_CHECKLSAPI_MAX_BUSY_WORKERLSAPI_DUMP_DEBUG_INFOnobodyLSAPI_DEFAULT_UIDLSAPI_DEFAULT_GIDLSAPI_SECRETLSAPI_LVE_ENABLEliblve.so.0lve_is_availablelve_instance_initlve_destroylve_enterlve_leavejailPHP_LSAPI_PHPRC=packetLen < 0 packetLen > %d Bad request header - ERROR#1 ParseRequest error SUEXEC_AUTHSUEXEC_UGIDLSAPI: setgid()LSAPI: initgroups()LSAPI: setgroups()LSAPI: setuid()Bad request header - ERROR#2 lsapi_accept() errorPragma: no-cacheRetry-After: 60Content-Type: text/htmlDEBUGNOTICEWARNERRORCRITFATALAcceptAccept-CharsetAccept-EncodingAccept-LanguageAuthorizationConnectionContent-TypeContent-LengthCookieCookie2HostPragmaRefererUser-AgentCache-ControlIf-Modified-SinceIf-MatchIf-None-MatchIf-RangeIf-Unmodified-SinceKeep-AliveX-Forwarded-ForViaTransfer-EncodingHTTP_ACCEPTHTTP_ACCEPT_CHARSETHTTP_ACCEPT_ENCODINGHTTP_ACCEPT_LANGUAGEHTTP_AUTHORIZATIONHTTP_CONNECTIONCONTENT_TYPECONTENT_LENGTHHTTP_COOKIEHTTP_COOKIE2HTTP_HOSTHTTP_PRAGMAHTTP_REFERERHTTP_USER_AGENTHTTP_CACHE_CONTROLHTTP_IF_MODIFIED_SINCEHTTP_IF_MATCHHTTP_IF_NONE_MATCHHTTP_IF_RANGEHTTP_IF_UNMODIFIED_SINCEHTTP_KEEP_ALIVEHTTP_RANGEHTTP_X_FORWARDED_FORHTTP_VIAHTTP_TRANSFER_ENCODING%04d-%02d-%02d %02d:%02d:%02d.%06d Child process with pid: %d was killed by signal: %d, core dumped: %s Possible runaway process, UID: %d, PPID: %d, PID: %d, reqCount: %d, process time: %ld, checkpoint time: %ld, start time: %ld gdb --batch -ex "attach %d" -ex "set height 0" -ex "bt" >&2;PATH=$PATH:/usr/sbin lsof -p %d >&2Force killing runaway process PID: %d with SIGKILL Killing runaway process PID: %d with SIGTERM Children tracking is wrong: Cur Children: %d, count: %d, idle: %d, dying: %d LSAPI: LVE jail(%d) result: %d, error: %s ! Invalid custom stderr log pathFailed to open custom stderr logCan't set signal handler for SIGCHILDReached max children process limit: %d, extra: %d, current: %d, busy: %d, please increase LSAPI_CHILDREN. LSAPI: failed to open secret file: %s! LSAPI: failed to check state of file: %s! LSAPI: file permission check failure: %s LSAPI: failed to read secret from secret file: %s LSAPI: Unable to initialize LVERequest header does match total size, total: %d, real: %ld LSAPI: missing SUEXEC_UGID env, use default user! LSAPI: SUEXEC_AUTH authentication failed, use default user! LSAPI: lve_enter() failure, reached resource limit.prctl: Failed to set dumpable, core dump may not be available!sigprocmask(SIG_BLOCK) to block SIGCHLDsigprocmask( SIG_SETMASK ) to restore SIGMASK in childfork() failed, please increase process limitsigprocmask( SIG_SETMASK ) to restore SIGMASKCache-Control: private, no-cache, no-store, must-revalidate, max-age=0PID 508 Resource Limit Is Reached

Resource Limit Is Reached

The website is temporarily unable to service your request as it exceeded resource limit. Please try again later.
          replacesrandQUERY_STRINGREQUEST_URIPATH_INFOREQUEST_PATHSCRIPT_NAMESTDERRreopenftruncate() failed. File mapping failed. Memory calloc error[...]nilLSAPI_MAX_BODYBUF_LENGTHLSAPI_TEMPFILEXXXXXXRACK_ROOTchdir()to_hashCGI/1.2eval_string_wrapLSAPIacceptaccept_new_connectionpostfork_childpostfork_parentprocessputcwriteprintprintfputs<<flushgetcgetsreadrewindeacheofeof?closebinmodeisattytty?syncsync=RACK_ENVGATEWAY_Irewindable_input.rbNTERFACE/tmp/lsapi.XXXXX;{ \f(q@rTrh r|rrr z8zl {p{{p|},p~| DЀl0,x0P px P$ `8 pL Ў` | P `@ ВT  @X l p p  0| xDЪX0lp @ P4`H\p 0@P<л|TPPp,@Th| p  8@X0Pp0P `d P$8d0zRx $X FJ w?:*3$"Db \mpmm LmsEIB E(A0z (A BBBI A (D BBBA m m@mYGJB B(A0A80F(B DBb0TtBFC G  AABK   AABG xEO D  A @$ T hY|hJEDS ]Ph H XAH$lFBB B(A0A8LP 8A0A(B BBBH <H FBB A(A0 (D BBBI \i`ptFBB B(A0A8DP~ 8A0A(B BBBA k 8A0A(B BBBH L0$FBB A(A0H Q D 0A(A BBBH L$FBB B(A0A8G 8A0A(B BBBF tFFX$nCXJLlFBB B(A0A8DA 8A0A(B BBBA `( ܏BBB B(A0A8G I K I L N N w 8A0A(B BBBI 0 xBMD GL  AABA < =BAA G L@I@U  AABG $ TWEHG ( \ag H SHL FBB B(A0A8DPS 8D0A(B BBBF T lbIE D(C0P (F BBBM Q(H BBBAH FBB B(A0A8DP 8A0A(B BBBA T< xCBA A(G0` (A ABBD  (C ABBA J8 @-FBD D(D@T (A ABBB  4( @lECGF AAI L !cBG A(D0 (A ABBE XD0` dt pZ 10 pFAA G@7  AABF  $@LsL HFBB B(A0A8G 8A0A(B BBBG < P  d x  ( 4 @ L  H  D@ << FBA K(G (A ABBG <X FEE D(D0M (C BBBB L(HhFBH E(A0E8I@ 8A0A(B BBBE ( FED ABH$ BBB B(A0A8G 8A0A(B BBBJ DpDFBB A(A0G 0A(A BBBF L FBB B(A0A8G  8A0A(B BBBA \h4p Hl\x+p(BFGA kFBzD O E   HU gHQ G <haydT2HW I I(tEDL ] CAJ dELhEYl HWt HW|-Hd( EAD  DAJ LX3ED hAHlxFBB E(D0C8GPm 8F0A(B BBBG ,LZAD J ABL 4oAD  AAK pP \ 4FDA D(F0` (D ABBB j (D ABBE l(G DBBDBBI B(A0A8D@8D0A(B BBBl*HP H I|UKI8FBA D(D@ (A ABBE @(TEDG0 AAI H$PFBB A(A0 (F BBBH {(F BBB@(OFBB A(D0D@  0A(A BBBJ 84KFBA A(D0 (A ABBE GNUPTT` !A#).4;JZjx !,<@R^r ':Q_r   k p> P !X !o` !.@&p o%oo($oDh !>>>>>>?? ?0?@?P?`?p?????????@@ @0@@@P@`@p@@@@@@@@@AA A0A@APA`ApAAAAAAAAABB B0B@BPB`BpBBBBBBBBBCC C0C@CPC`CpCCCCCCCCCDD D0D@DPD`DpDDDDDDDDDEE E0E@EPE`EpEEEEEEEEEFF F0F@FPF`FpFFFFFFFFFGG G0G@GPG`GpGGGGGGGGGHH H0H@HPH`HpHHHHHHHHHII,LSLSLSLS!$#!GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)GA$3a1SSGA$3a1p>>GA$3a1GA$3a1SYT GA$3p1113`TGA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobin GA*GOW*GA*GA+stack_clashGA*cf_protection GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign GA*FORTIFY`TeTGA+GLIBCXX_ASSERTIONS`TeT GA*FORTIFYeTTGA+GLIBCXX_ASSERTIONSeTT GA*FORTIFYTTGA+GLIBCXX_ASSERTIONSTT GA*FORTIFYTUGA+GLIBCXX_ASSERTIONSTU GA*FORTIFYUUGA+GLIBCXX_ASSERTIONSUU GA*FORTIFYU/UGA+GLIBCXX_ASSERTIONSU/U GA*FORTIFY/U\GA+GLIBCXX_ASSERTIONS/U\ GA*FORTIFY\]GA+GLIBCXX_ASSERTIONS\] GA*FORTIFY]]GA+GLIBCXX_ASSERTIONS]] GA*FORTIFY]]GA+GLIBCXX_ASSERTIONS]] GA*FORTIFY]5^GA+GLIBCXX_ASSERTIONS]5^ GA*FORTIFY5^^GA+GLIBCXX_ASSERTIONS5^^ GA*FORTIFY^_GA+GLIBCXX_ASSERTIONS^_ GA*FORTIFY_`GA+GLIBCXX_ASSERTIONS_` GA*FORTIFY`aGA+GLIBCXX_ASSERTIONS`a GA*FORTIFYaaGA+GLIBCXX_ASSERTIONSaa GA*FORTIFYabGA+GLIBCXX_ASSERTIONSab GA*FORTIFYb?cGA+GLIBCXX_ASSERTIONSb?c GA*FORTIFY?ceGA+GLIBCXX_ASSERTIONS?ce GA*FORTIFYeahGA+GLIBCXX_ASSERTIONSeah GA*FORTIFYah$jGA+GLIBCXX_ASSERTIONSah$j GA*FORTIFY$j[kGA+GLIBCXX_ASSERTIONS$j[k GA*FORTIFY[kmGA+GLIBCXX_ASSERTIONS[km GA*FORTIFYmmGA+GLIBCXX_ASSERTIONSmm GA*FORTIFYmmGA+GLIBCXX_ASSERTIONSmm GA*FORTIFYmnGA+GLIBCXX_ASSERTIONSmn GA*FORTIFYnnGA+GLIBCXX_ASSERTIONSnn GA*FORTIFYn,nGA+GLIBCXX_ASSERTIONSn,n GA*FORTIFY,noGA+GLIBCXX_ASSERTIONS,no GA*FORTIFYopGA+GLIBCXX_ASSERTIONSop GA*FORTIFYppGA+GLIBCXX_ASSERTIONSpp GA*FORTIFYppGA+GLIBCXX_ASSERTIONSpp GA*FORTIFYp9qGA+GLIBCXX_ASSERTIONSp9q GA*FORTIFY9qqGA+GLIBCXX_ASSERTIONS9qq GA*FORTIFYqqGA+GLIBCXX_ASSERTIONSqq GA*FORTIFYqMrGA+GLIBCXX_ASSERTIONSqMr GA*FORTIFYMrsGA+GLIBCXX_ASSERTIONSMrs GA*FORTIFYstGA+GLIBCXX_ASSERTIONSst GA*FORTIFYt9uGA+GLIBCXX_ASSERTIONSt9u GA*FORTIFY9u\wGA+GLIBCXX_ASSERTIONS9u\w GA*FORTIFY\wyGA+GLIBCXX_ASSERTIONS\wy GA*FORTIFYy{GA+GLIBCXX_ASSERTIONSy{ GA*FORTIFY{{GA+GLIBCXX_ASSERTIONS{{ GA*FORTIFY{F|GA+GLIBCXX_ASSERTIONS{F| GA*FORTIFYF||GA+GLIBCXX_ASSERTIONSF|| GA*FORTIFY|}GA+GLIBCXX_ASSERTIONS|} GA*FORTIFY}\GA+GLIBCXX_ASSERTIONS}\ GA*FORTIFY\QGA+GLIBCXX_ASSERTIONS\Q GA*FORTIFYQGA+GLIBCXX_ASSERTIONSQ GA*FORTIFYMGA+GLIBCXX_ASSERTIONSM GA*FORTIFYMՃGA+GLIBCXX_ASSERTIONSMՃ GA*FORTIFYՃGA+GLIBCXX_ASSERTIONSՃ GA*FORTIFYVGA+GLIBCXX_ASSERTIONSV GA*FORTIFYV%GA+GLIBCXX_ASSERTIONSV% GA*FORTIFY%GA+GLIBCXX_ASSERTIONS% GA*FORTIFY+GA+GLIBCXX_ASSERTIONS+ GA*FORTIFY+]GA+GLIBCXX_ASSERTIONS+] GA*FORTIFY]tGA+GLIBCXX_ASSERTIONS]t GA*FORTIFYtGA+GLIBCXX_ASSERTIONSt GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFY3GA+GLIBCXX_ASSERTIONS3 GA*FORTIFY3GA+GLIBCXX_ASSERTIONS3 GA*FORTIFYэGA+GLIBCXX_ASSERTIONSэ GA*FORTIFYэPGA+GLIBCXX_ASSERTIONSэP GA*FORTIFYPGA+GLIBCXX_ASSERTIONSP GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFY˓GA+GLIBCXX_ASSERTIONS˓ GA*FORTIFY˓GA+GLIBCXX_ASSERTIONS˓ GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFY(GA+GLIBCXX_ASSERTIONS( GA*FORTIFY(HGA+GLIBCXX_ASSERTIONS(H GA*FORTIFYHdGA+GLIBCXX_ASSERTIONSHd GA*FORTIFYd{GA+GLIBCXX_ASSERTIONSd{ GA*FORTIFY{GA+GLIBCXX_ASSERTIONS{ GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFY@GA+GLIBCXX_ASSERTIONS@ GA*FORTIFY@hGA+GLIBCXX_ASSERTIONS@h GA*FORTIFYhYGA+GLIBCXX_ASSERTIONShY GA*FORTIFYY#GA+GLIBCXX_ASSERTIONSY# GA*FORTIFY#GA+GLIBCXX_ASSERTIONS# GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYѸGA+GLIBCXX_ASSERTIONSѸ GA*FORTIFYѸGA+GLIBCXX_ASSERTIONSѸ GA$3p1113SSGA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobin GA*GOW*GA*GA+stack_clashGA*cf_protection GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign GA$3p1113SSGA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobin GA*GOW*GA*GA+stack_clashGA*cf_protection GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign GA$3p1113SSGA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobin GA*GOW*GA*GA+stack_clashGA*cf_protection GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign GA$3p1113SSGA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobin GA*GOW*GA*GA+stack_clashGA*cf_protection GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign GA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobin GA*GOW*GA*GA+stack_clashGA*cf_protection GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign GA*FORTIFY GA+GLIBCXX_ASSERTIONS GA*FORTIFY "GA+GLIBCXX_ASSERTIONS " GA*FORTIFY"[GA+GLIBCXX_ASSERTIONS"[ GA*FORTIFY[hGA+GLIBCXX_ASSERTIONS[h GA*FORTIFYhwGA+GLIBCXX_ASSERTIONShw GA*FORTIFYwGA+GLIBCXX_ASSERTIONSw GA*FORTIFYҹGA+GLIBCXX_ASSERTIONSҹ GA*FORTIFYҹZGA+GLIBCXX_ASSERTIONSҹZ GA*FORTIFYZmGA+GLIBCXX_ASSERTIONSZm GA*FORTIFYmGA+GLIBCXX_ASSERTIONSm GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYaGA+GLIBCXX_ASSERTIONSa GA*FORTIFYaGA+GLIBCXX_ASSERTIONSa GA*FORTIFYWGA+GLIBCXX_ASSERTIONSW GA*FORTIFYWrGA+GLIBCXX_ASSERTIONSWr GA*FORTIFYrGA+GLIBCXX_ASSERTIONSr GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFY GA+GLIBCXX_ASSERTIONS GA*FORTIFY GA+GLIBCXX_ASSERTIONS GA*FORTIFY3GA+GLIBCXX_ASSERTIONS3 GA*FORTIFY3_GA+GLIBCXX_ASSERTIONS3_ GA*FORTIFY_GA+GLIBCXX_ASSERTIONS_ GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFY'GA+GLIBCXX_ASSERTIONS' GA*FORTIFY'GA+GLIBCXX_ASSERTIONS' GA*FORTIFYPGA+GLIBCXX_ASSERTIONSP GA*FORTIFYPGA+GLIBCXX_ASSERTIONSP GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA$3p1113SSGA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobin GA*GOW*GA*GA+stack_clashGA*cf_protection GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign GA$3p1113SSGA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobin GA*GOW*GA*GA+stack_clashGA*cf_protection GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign GA$3p1113SSGA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobin GA*GOW*GA*GA+stack_clashGA*cf_protection GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign GA$3p1113SSGA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobin GA*GOW*GA*GA+stack_clashGA*cf_protection GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3a1GA$3a1GA$3a1>>GA$3a1,`Td,^  )`Td/f 4-/x/W,/R,/h  %-/4Ga '9 ) (_intG )@/30G$ G @ + @u1 G @W G3  ! q W Gj , `@ A &C $(E (aJ 0NL8-PX@ [+H4\+X1 ]+h$j$xp4Gl- + - N1 ooGG X a4&c&  E18,:  ;1?2A .B 4C1GO,I  J4K1 O,Q  R:#S  ,T U1aIc E.d EC^&;e&P#g1 Ya[ E]ah 1l5'n,o 1tf v E( w x@ Cp3&5&j <&<Db_rtL&VO&+i&4p&y5G1$ +S&& f'( m* &0 |%{ fO/|AHCIRT Cv&d,"7&$ R  E+v"v!&T.S1 4 c G@4H*H*/.0/M,-Gld)y" m, -c 9 11;  CmG"Fy<d (eGf I@I8@IEIE"A%1 U3-6 |$7 |8 |9 | : |(; |0[$< |8C= |@@ |H-A |PB |X'D ` F hHpy0It2/J xx,M94NNiO Q 6/Y ![ c%\ ;.] +^ E'_ r`b g +J(   G J! J`%  G 4'3C  < 'E; 'p: 'F   T h4I '5 T X3@! $x(6x 2gb#;& 'm 9 g& 4 5g)OY!!"4! !  ! ":"F 2" Ex"" #!X.@$  = 8 ! i)0# %9"# ;# =# 4  G  "&4 i5&6  &7  < |"]0'1 '3 |Z'4 |'6 #'7 '8 |'9 | @2': |(jtm8(, ( ( %( &(  j( L (((( -( ((0|< G' ), ')) ')' ), ')) ')H**! B@,Hi13( '    ! v/* ,101$  5+,*X A!>/"#$&%"&'y3()0*+.,F-g .W / 0,123P-4,5k*6*78]19Z:^;(<<.=>*?@&AB$C5DWE!F"GH_Id"J%KLM/NO2PU(QiR$S2TU1VTWX!YkZ$%[\$]y$^"$_!"`dakbzcd-e *f1g'h.ij#k+1l mn opHqqrOst$ujv2w? xE&yz"4{"| }~ ##t2' 048,d+EwY/~  1w38 50i#0!"$$P~##4a A u qN5!+A3+6(u- @$>'[!%%20, "4_/w 6s&'6 -$|'/-2 'p-7 ' -; .U! .m .4J%/"p,/* /!B@/),4 S3- xm0!{)).h2/(2%33\,^b"glP1) a. 00t /{C/&S/ &%/ -&G'/ =-G=GMG"/h/ 4M'1/h'H0/h"s/ / 4 /o,//-GKC1/,+/ 5///M$/Ki005h$07M08X"09W0: _0; F 0<n0= | z+0>( ,"Q n1 1 .1 GkB@2,Nx5/%J Y% ) )  =`+Br.7-"(L+C2q&02s9&2t"2kP22m \22n _'2o 2p ~2u"",2<02 2 9! 2 9 '2 902 92 9 2 9C2 9 `-2 9$(,2 9("(222V#2 4G9G"]2K2 9,.2 9/2 92 9 "x2G2 9 2 9"12o<02"2"/C"" / 1 | 2 |U 3  4 k : <T% = ? 2 @u B| C * E|(s F|03% G|8( I|@"( J|H - K|P" L!VX* O ` P h3 Q p" R x T'\9 V'b W'h# X'h Y'E Z' \'nF* ]'t _| `| a|c b|1 c|* d`* e! f3 g h&! iL k'zL& m'G(L2 n'8L\& oE ""0pVr s  uh&vwx z { |(vGa=G q'=" s w9   EM4 X9    $EM x7=RH H"CXOYbufP = Q YinRG-G?]!NB@j/"~  H#!  @#!) !E  <#! 8#!% 4#! 0#!3 !'' ,#! (#!S $#!'  #!9    #!P H #!Y0 H #!*& H !N. !| #!* "!` !22 ! !9' !l !"G3 "!#* "!^G.N  !G t q#N  ! t G'  !MC>C+Q "!,2L "! L "!&@ "!d  "!J "!l E "!m  "! 9  "! * 9#!  9 9 #!o @! "!!9Z! #!  g!F!9! ! |' , ! "!m!/  "!      "! # !# !*"Go'&%" p!KS' "J2+.2Hm(  !K&@ V#T% U  *    + 5 &   (c 0 8M& " z# "!V# @ d! `!? x"!  !!$ # @!!O  -  !@   !  `!H,! x$2cnt!U$2pid'U  :B 0UYO%2buf'#!U#injU|T~Q} $ &o3k 9#fpk,pmchn no  tp 5К,4 }U4Tw T,"T0Q: ;  ,64JT0Q:dd,]YsUsT0Q:5-T0Q: -ʕT0Q: -T0Q:99.HT0Q:bb i.)'qT0Q: .NLT0Q: /sqT0Q:זז P/T0Q:/#T0Q:BB!/QT0Q: :W B3 : :E?N: %3:II0rpXT0Q:ss0T0Q: # 25 B}NrHM}1eYA;'UvT0Q S 14'ћ3U1TsQ}ʊg T2A?ۊom@UsT "!Q@ Ll2Us2U  L2UsU T QvDY2U MnY 3U _YU qfU F {@  5@ {ՌƗƗ3՗T0Q: zș  4>8>74 =rP"4TsqUsٙ]4U T 4UsT  [! 5 mZV04UsT I5UsT X,5UsT nQ5UsT v5UsT 5U "ʳY5U ~lYU ;W6%;O";#;Y2x6k4 2 %2w~}׳6U2T~Qw"Y7U 9 Y,7U 6YK7U *\Yj7U <Y7U MY7U aѕ;ݕY7U vY7U <yt0Y,8U ]YK8U xG<Yw8U ;Y8U Ɩ;ҖY8U <Y8U Q;Y'9U =YF9U 0^9Us/<DY9U dY9U Q;{X9TvQ | $0.MXe4] ":!p], (/_ ":3:=GE `: (/E- G %% :!p%) %%2| ]%= 2$' :len( end) |:=G'- ;i pw!)p70 2;env ! )del! D* TD55 ()p ;*$U(!P;**U(0<*I'U(5G<*I5&U(v<*\$U(0Г<*'#"U(3 <*I5U( = \ X )  H . -5+ fd !!!ret !! [4 ="/"W ~M( Et;=   0 5 >__d ""ɮU| $ &585> 8!## O EO($$O($$O$$Ow PyPz%P{2P|?P~LP%%YP0&&fP5'+'sP''P('PI)/)PtPtPuPvNPPr p?PW*S*{>QT?Q**?U  y @y++!y 9C@++++ ,,7@Ä1,/,W,U,},{,(*UvT|Q@Tԯ7@U}C AUAT|Qt7"AU}8CGAU?T|Qt]ClAU2T|QtCAU:T|QtCAU3T|Qt3AU ! OAU0+KQ BU|Z[%BUV3±KBT}Q0R0XtٱC|BU:TtQ0JBU T TBU [WVBUu7BUtϴhCUtTAtDCU0TtQtL5tCU2TtQICU q CU *CU 4B DU x8DU tiDU2TtQ0Զ߶3DU0T0Q  UCDT0LCDUATtQ0CEU?TtQ0ɷC8EU3TtQ0ڷC\EU2TtQ0CEU:TtQ0FEU pUQnU @ ?y j"FQy,,-?y0+Qy,,+y #/ y,,+y #  y--yB-@-*T !Q8ly 9G~yh-f-+y y--y--*T !Q8zqQGUs?OhGU03GU|TvQ0R0X_U[WGU|GU|T05sQi HU WLGHUs?Ãs_x_HUsrHUs?ÃszqpHUsOHU0/M M .M .5+-- O 4*.. P 4..WQ }M(R E} [4S a/Q/retT (00 BV z#00EactX ~; I   0 5RI__d 7131Z; 1J 3 1w1ے#JU ՏT7VJU| CJUATvQ `!57JU|ICJU?TvQ !!eCJU2TvQ  !CKU:TvQ  !C@KU3TvQ @!!3[KU !OrKU0KQKU}:[KUV3KT|Q0R0XӑC LUAT `!Q0C2LU?T !!Q0C[LU3T @!!Q0 CLU2T  !Q0CLU:T  !Q0LU T LU [W.Q )MU qHMU gMU pVMUu> P@N .> +5+2 25jN C 4a2_2qOU0LR  pO . *5+22 T  33 y 6 GOy*3(3 !y@  7NÄO3M3u3s333 P 9O333344 *UsTwQ@.>3rOU0T0Q  UOT05LEQP: Q B: @z# .; 95+act=  =  $= % O = / @>  >  "?  [4@ retA pidB  C 4 D 4 WE  M(F E H  I FP   0 FQ__d ) 3 D/ 1T'+  U: `k6R  ,G494  44 2 o5c5  65 & 66 T ^7X7  77l%RU T @l t Fv lY ' *==  5==  =X~ret X>T>pfd YSYUUTsZqYUsTv88 Z '8 ' 8 @ y&: Zp; | < |res=  != , N > 5? ZG? 0-[  6[>>  GJ?:?ret @?fd P@J@ D 83 @@ZT1Q0̊ZUsT2Q1[UsT1Q2RDX4?[UsTvQ} ][UsT|&LO,[Uv] 8| [ . /5+ * B!len LF[ch ) 3# _3 0^ . 05+@@ L C/A'A  ,AA ,. AA  LBFBlen BB;P \ch BB; \ch (C$C5H7] 3# dC^CqU|   x]CCCC+D)DTTQ~   ]TDPDDDDDT}Qv]UvU}x P|t^*. 25+U-| ÄDD)E'EQEME3 |F^ . 05+EE#fn !EE#arg ,EKFCF@=|p_QTRQt {Fp_ .t )5+FF#fnu !GF#argu ,EkGcG@{p_QTRQ6 a Ts` (a 6hGG#nb 6H.H#fnb (HH#argb 3E5I)I d #hIIrete JJqTX}6 yb . ,5+JJ#fn !KK#arg ,ELLi lLhLlen! LL " |LLret# 9M5M &$ }MoM;@ZbS7 Z}p8 |&NN  9 |NN : |NN U; 4O&O ~< &tOO < -tPP5z(achK cPaP%z O PPFa__cO z9 ̋zpF 1bPPQP݋/Q-Qr@{}U~T}#X|3*zbUv3$|"T v2$}"X|{`w$_d ./5+^QRQ#fn!QQ#arg,ER}Ri JS>Slen SS  |NTBTret TT & 5U#U!_d~5Gxc  |UU UcV[V ~&tVV -tVVxEdUwQ R TyE=dUwT| $ &Q R T32yQdXvyA"pd=GlT d2v1'U2v27T|@u'f .(5+EW3W K2; X X E4#h4X0X #h['f`f$Ff$9f`SfrXlX^fXXNkfelfXXwfRYJYfYYfYYf*Z&ZfdZ`ZUffZZUffZZv9EvRU|Ts3$"uRU|q|f .q-5+ K2q@is t |)p  | | U ~&t -t)ch) )__c8U< -g .</5+ *<B!len<O 1>  ?p@ A - *B -retC iovDg E  gGj|h .$5+e[Y[ret [[n o\g\ ^}.ph6\\$)]]h]f]CP]]]p}qTs@}hhUs}hUs?Ãs}^(%tiNi*.'5+U ;"\]]  T^R^-t Äy^w^^^^^ -`j .+5+^^ M5__#offBjy`i` N7a'a ;"\aa  jÄbbbbbbg5jUsچ*RjT~Q8Z^yjTTQQRR^8* - k .(5+ *;!lenH ;"\  p! " - ,# - $ - /%  -s l ..5+c c *;|cc Hcclen -ddXd /  ee Ht lneje$eeMtUvQ|-odt eeffAf=f{fwfʊhthtlffffۊffvt@U~TvQst%Prln .-5+*g g *:|gg Ghh THthjhlen -hh * -(i i y  |ii  |ii ~ |jjp |jj s  >nkkTkPkkks#nTQsYsTQsmoss nokk%s oolksU~rjUT:Qs q]mo .-5+TlHl+mo0r0roll%0roomm5rUs- o ..5+  len -|qSp*.+5+U (5;m7moff zmtm*y@qJqp .y&5+mmVqgqxqq(npYp .n%5+#nn-`$qtqnon}nn$qr Kzq .K*5+nn h-qUsMgEqUsVeqUs?Ãs^Us1-Pr .-%5+Do8ohqUsgqUsqpqUs̓^L4Ft .%5+oo/=X~ElenF ~+~ ?ypPPsQywpup-?yp`+Qypp+ypp / ypp+yp p   yppyqq*T !Q8OzqhsUstsT0sT|Q}߬sT0xsUssUv?ÃsqptUsM8tT6Q1R~X4` p yt*.(5+U pt@pFtU !'0n%w .(5+Eq;q#fd2qq  MrKr `{nTurrpr}rr$q n@ urrrr@ s snvT Y1o1o' >vkEsCs%1o'w~~Jo׳/vUvT~Q~So HovejshsYsso'U oT2nʳvU $ovUsT ovUvT1owU0owT0o(- n Sw2cb;*UDxn Tnox Ess p+pۄwU=T `T{ .1.5+ 82|!len2 !2+| 26 .4 5>{-N{G { .'5+!uid3L!gid>@ /Prv pw! { (6  `| .+5+ss#uid7LPtHt#pwL!ttret tt Tw3o|UQTs|U T Q|Xs}|UvT Q0  $} .,5+!uid8L) n%ret  r} .-5+!r} !.} @}G}=G#4}64{ ` .{,5+YuQu {?uu {R%vv1} ":_n~ uvqv i~ ~vvvv$zUvT Q1R X rf~U|TvJ*~U2QDI rm J [ t)J%stLSfdM ) zrc+ ,  )uid   .-5+ * i ) ~&t -t7# O .35+i F2bp|) ~&t -t7v ./5+pb7 &)Hp |b6O"t ^Y t4hww &tBjwfw*E4u! Q u#|ww 2*w#hx x Ux SxGx xxx&h!fdh /j=XlenkF ;R ف R<ف p SH S+ *U#hhr> ;>>\ >L)bF62 ]G .235+yy 2=Fz@zp4 |zz]vTv0$ Ă .$+5+!n$5p&  .05+ : * | i!fd \2i &< *Gret * n  .-!fd' *2E!len?ret -7D! у .35+# !fdret 6 ]U#fd#zz "+{{val &| |]UsT3Q0@.^UUT473wф ;wJ\ RDx&!lenx0t&R :!A \ V&Aw|o| g,A2||EsaC~\CWUvT0Qs\7oUs]CUvTsQ0]:&8 pTυ2sig8!U:+3 `T2sig3 UuP (0m7  E}=} \.}}mmUs@mU T [QURTv(evw~ ~xfmt'~~PVbuf Tvyp |\HzG 60Eap  u5gVtvEuVtm u{ihPևz܀ڀMhU|T Q1R X \igg/X/-zWUgU|T Q1R X "gõuUsT0gϵUsTu f+~zf۵T1Q}Ru\iff-GEznl gUsTdQ1R X 2Yv3$ !" i9gzSgUsTdQ1R X 8 >cg [[" OPNgT1Q FX|)grahW . :5+p D.E+|ʊJ-|.."-" J-"E"."%.= k|6ckkk.\|`c\\.p>Ec>E0>>.O'E̋c'E''.(EcG.q8 5I.18.rdid 5d<P.F A]__sA]__nA5AP.%|ՌI2%+%|sz' 8Jn n8 i i8* B   4 BS.0?)s)$)PW.1t+1W8-"mt+"m,mo`oto oHB-o1a @<0|vʊ8a8aDžŅۊFa@U~TvQ|Ta,aaq$ÃSуa G$%a 64aL8Usa+aa $Ã,b cY߆Ն)[Q6ه͇CmaP]=bUvQ|b,bOt c` Oc cfT05c,Y@cYY[SYY}Y&YY}Y}YYXRccG g)ʋȋcU|TsQ "dN ʑ),*SQzv*dUvT|Ql d dUsT0Q: `d Tٌ׌}q($ ̋eP ea݋͍ˍ1e Uv 6re\ SGmcc) U|T:c51U|T sd)OU}T]eAzU}T0Q}R}9eNU|Ie[U}e,UphUC?UUQUQVV[UC ה$UUU|UVJV؏VvpNVV+ViU T|QhgU TvQ33iVUui,f}lEf gg?1g,g9gDgQg^gkgxgfE~E~< gޒg51fqm%E~g,g9gԓ̓Dg<4Qg^gÔkgxg ~ e6)" HFnl CP]Ε̕~qTwQ2R} ~pZ Ä0.VTX~gU~U~?Ã~/*7U2T~\,9= :y:п `:Wb :y}: r::_:MG: `@, 2ԙҙmsUwT ہہ9 #^\%ہɌUsT|Q ҁјTvQ0* 3:pg 6E:pR:HGeY.'UsT AQ T^UsڙUvT2LUvU2T1C}U0T HQs9؂؂ ]  :ٛӛ%؂ :}U0T (QUM,jj1%jɜjjjjjjkQk j j0(jjjB6jɟşj j{jkJDk ES $Ä@@? c/-PUTQvÅg{UsgUs%^,[[`R[ [}[  [/#$[$[>[`,[>[3g[F@ljU|-щP  ޥTvQs,Y`8Y Y]WYYYYYQYY@ntUUTT,{X!#XXX-{X  X?5XX3-X՞U@T1|[UUߌ,x0 x|x<:x oO/c_תӪ ʊ  IGnlۊ@UsTvQ| x  A hx xx2*߁1V۠O 8 ۬٬o@iš%#JH%8qmʊέ̭ۊ@U}T|Qv yn y yz z~z^T((A ϯͯ%(Aˁ+445R DBig%45ˁKvT v $ &33$uuA ްܰ+)%uAˁ+5R SQxv%5ˁȱƱvT v $ &33$ ٣ wO D@>ecO X]%j v0Գҳ0" vˤp[GEpnl v٤ߴ  v CAjh v`6`޵ܵ v+)RP{w vEȦ۶ٶ vJ`(&`OMvt-vO÷Sw K$%w '#>#)a_&+v %ݸ۸O2¥3+%@xv v ۹׹ v0 ڨ$0:8 v#p $p_]-vA $*z1 ԩ$Ă/I޲*(ւTP%/vT ApfAOEu%u%3444E 6"6"0? bb  .v'v'*a 4.4.wD(D('t* *  585@((5R11  773  ' '= = 6 ##7% ~Y Y 81 1 * 9D C-C-*tCC*nD#D#  )K***k :*:* d?d?*%%**wk k p AC 9   ::f 44:96 }1}16 **6f  6p |'|'6 //*9 +Sn)n); y4y43 ;!b5b53[q$q$%dupdup* 1"1"* aa*!!X^^3&D i-i-)))] Z   <4A= 3 A((::uu+O#??3=t  0 ee0 >"?oE+%22((36tAtA3A  * cc55@ W*W*'nzz* A 00* OOA F ? )R9R,W,f xh %I4 'P )(int )@303!o  9 A% 1 U 3 - 6  $ 7   8   9  : (  ; 0 [$ < 8 C = @  @ H - A P  B X ' D` Fh Hp y0 It 2/ J x x, MP 4 NW i O  Q 6/ Y ! [ c% \ ;. ] + ^ G ' _ - r ` b  +(   9!`%  95 ? M3C E; p: F  UJ5 UF  5 U! a)}M,.0C"^! q *,!6 $/2 p7  ; g:H"\= Ff9:IDg98@tH95G4DCpG1;; WBG@b{@;=:=9G6=f9 A 7 i? E 8AWDF7jB:C7 7=7BY:bDE=I/> = 1=@A`pCu>6B36GKC 78 8@ 8.8<8J8X8f8t8  E@E+E:EIEXEgEvE E@Exn<@?<:Bv#Vw :ZCxFOG@CA7@-7; ; :L;@5A G8;B A ZN:; :len ptr aux54DZary  9 9(9as8@2:: e@99DCWN:C$Flen aux%2ptr&F4D'Wary( F 9\<(9as)(A(sA 9tB6u L 7v L @w G L !GA "H6L 7:";:eH: >:@:5?:F:@:V>:5:V9:8A:D:D:9:9:=:<:K@:@:9:v6:=:9::<:A:7:A@:5:7:F:#C:!<:C:C:.A:t9:F:9:P7:)D:-@:B:_;:7:>:s=:@:B:: :6 :; :: :[7 ::B:B:6:{A:5:%B:?:F:oD:F9 :D!:8":)G#:>%:/9&: 6':=(:F*:0C,:B;,:m:,(:8G:7H:V<I:HJ:t;K:8@:  9 >7 C=8<9B:G;8<d==h;>#@,Nx5/%J Y% ) )  =`+Br.7-"(L+$q=%0s%t k P2m \2n  _'o  p  ~u ", <0 =   !   '  0      C  `- $ (, ( (D 2D V# T4 T 9 d 9 ] K  ,.  /    x      1 <0"= " 4 i56 7  /k  1 2  U3  4 & : < T%= ? 2@ uB C *E( s F0 3%G8 (I@ "(JH -KP "L!X *O` Ph 3Qp "Rx T' 9V' W' #X' Y' EZ' \' F*]' _ ` a cb 1c *d `*e ! f 3g h &!i'k''&m'('2n'8'\&oG " : 2 G x" -=)d = 9 j(9qk="s)?!!!!!GD->.P  ;W = c  9 c GBG? sA W 4  o, F*C1+W5T$QQAH67Q   <)4?JU`Akv$J% p,  !{$$%S $%% 4%G' D 4 9 D 9 T 9 o  T1oH0o I 9  9@**+C%:+P=&:,=': '!,G+: '!,9H-: '!,</: '!,91 0! 6<-req>-env?: ?@)!!!-6AQ,PBC: '!,EE: (!,DGF '!,-<H:  !+EI,%J~ '! $9Ly :N =4O <P K?Q$9R7, BTy '! (9,;U  #!;.;  8!/@7K$0BH9 :1p: 0a?; C92 3D]*K #!4QC5U '5T32!0;^6;^$0A^2@!3D^K x#!4)C5U H5T740C5Q05R02!`08 :/-4nC5TH5Q `5R|2!08:TR4C5TH5Q `5R|7 %=8-%?9:;%yw:F%8/: :;A:4C5Us5T05Q:<CY5U < Cw5Us5TM<C5Us5Tm<C5Us5TK4C5Us5Tk8% @9 :!%/%8:HP +^;":;:4pC5U #!5Ts5Qv5R =9vv- ;90.;9ZX<)C5U  49C5Us8/:v C;A:4C5T05Q:> DD>$D<Cy5U 6>1D> >DD>D>D>b4<2D#5U 'FD?X$5T v5Q 5R0?$5T 5Q 5R0? $5T 5Q 5R0D>D>DGg>:v&JB":UJ?-:TK?:&EB:DX@:&EB!:GF:`&JB":UG<:0+C'JB:UL844 M8Gw::Ua(HB:1str :97=a( ';s(b\7+p 8)S(;*9N*:+*N8*:C*)%<>D(O*s>,+>DDE:(EB!:G.|:4)H;|saHC|*L:HB|6:1str~ :\P1n 0=9 LB0S:  89L@ w);9IE>WD>}D>,+<D)5Us $ &<O*)5U|<, E)5U}5Qs $ &4 E5U}5Q| $ &D6M:O*EBM :CstrO :6@PCnQ CpR G?8 a+H=98"P)6: 0u?; 0S:< HF0&>= ok6@> 88>+M8>OEQ:3QB.RF K+Cfd R6w+Cfd Csfn QD>GF:p2+HB :1ch >%EG::p%,HB!: >DG6:`,Sout!:_YSstr,:4m/5Us5TTDC:,E;EC*Tout6:Ci 6B :D?o:2-Taryo#:Touto.:E*:o7Ctmpq :Cir G;f:-H;fHCf,&"Soutf8:e_<1E-5UU5TT4/5UsG>B:PO/H;BHCB, SoutB8:}1iD 3BE :@8'9PTv.;99c_<XD.5U~5T3</.5Uv</.5Uv<8/.5Uv>E>KEUC6:0HB6!:Sstr6-: 0@8VR1len9 89 :/;94ʻTE5Uv5T<8'9λ`< /;994AaE5UsGC*:0K1HB*:-%Sc*+:Vch, W0@-8G9P`,0;Y9W9f;9kg<D05Us>D89.$1;94TE5Uv5T<?=15TW5Q1>KEG:: ~1JB#:UGH :32HB +:Sstr 7:<nE15Us<#{E15Us4-E5T0XA: S2YB,:A=>EX@: 2YB+:~z>ԼEXG:-2YB,:>EXR?:H4YB$:Zpid 5123[; ok+; $[A 23,D K h#!4C5U l5T54C5U85Q05R0\H4 4;U4>b4<E 45Qs4ƽE5Qs>&E>ED>k$D]< b4^@)_F z52` 5`;,;*5``A24,DK `#!4IC5U d5T74C5Q15Rw>ZKE F*5 95X= B6Y )YU3`ZYHY Taarg#G*&<E55UQ5T R $ &<E55U|5Ts $ &4ȹeD5QvX6n @B8Y n(mcYUn2YnGY nSN:aargo"G(Zpq blenr <E65U|5T~<E65Us5Tv $ &<ƾeD75Q|<4E175U|5T?<`EQ75U|5TD>D<D;5U >DmC5QU5RTj,+>n>+=86<M8Iw+..8,+@ >9:>+8K+@ =9:]+@4:i+8O:N =;l:;`:EA4_F5T15Q 5Rs59F><EF4gD5Us<RF=5Uv5Ts<_F=5U05Ts5Q35R15Xv5Y0<kF>5Uv<D6>5U <#kFN>5Uv<}Dm>5U 4kF5Uv<xF>5T14D5U j)?:*|N+*:8*:C*;*,*I+b <O*E?5U <6Fx?5U|"5Tv5Q 5R1,+m>O*Uj, ;B;,;,1%; -q-@:&-( 8 9z@;9=e9dd|@;9;9;w9FD4lF5Us88l|ZA;8mi988v0 DA;84F5Us=,'o B;,; -;,[Wr'q-@N&-<XDA5U 5T54F5U15Tw5Qv<F-B5U15Tw5Qv>KEj,PC;,;,;,seN,N,s,qCM,M,M,9:,:,>48'9 B;99aE</>C5Us5T~</VC5Us4XD5U|5T34B/5Ust>>t0:0:etOHOHu6"6"t4.4.wv??w/tmp/lsapi.XXXXXXv@@w .XXXXXXtu%u%u{t33ntC-C-tt>> t>>t77tCCtDD7t`C`CtDDtFF0t@@ t11  ujju;;L t773 t==tEBEBt2F2FtaGaGt::$u u t>>tFFxY Y t==RtAAt)H)HVt??WtEEcttR R t//}u66ut))^t<<u??tXAXAuZ uoAoA DtCC t//9 u##% t^^t== u449tv'v'a t tGGqw lsruby.ctSFSFtDDt@@YtpFpFB1B( 1 : ; 9 I8 41B11 4: ;9 I 1RBUX YW  : ;9 IB 4: ;9 IB : ;9 I I: ; 9 I4: ;9 I1RBX YW .?<n: ; 9 4: ;9 I4: ;9 IBI41 U.: ;9 'I : ; 9 I!I/ .?: ;9 'I@B4: ; 9 I41 : ;9 I8 .?<n: ;9 I!: ;9 I" : ; 9 #: ;9 IB$1% & : ; 9 I'4: ; 9 I?<(.?: ;9 '@B) *: ;9 I+1RBX YW ,.1@B-1RBUX YW ..?: ; 9 'I 4/$ > 0(1 : ; 9 2: ;9 I34&I5 6.: ;9 'I@B7.: ;9 ' 8.?: ;9 'I 9'I:.: ;9 '@B; U<7I=!I/> 1?1B@B1A.?<n: ; B> I: ; 9 C : ; 9 D.?: ;9 'I@BE4: ;9 IF G5IH4: ;9 I?<I : ; I8 J<K : ;9 L : ; 9 I8M: ;9 IN 1UO 1PQ41 R'S1X YW T.?: ;9 '@BU 1UV4: ; 9 IW.: ; 9 'I X> I: ; 9 Y : ; 9 I8 ZB1[1UX YW \1RBX Y W ]: ; 9 I^% _$ > ` a : ; 9 b : ; 9 Ic'd&eIf : ; g: ; 9 h!i(j : ; 9 k : ; 9 l4G: ; 9 m'InB1o.?: ;9 'I@Bp4: ;9 I qrBs.: ;9 'I t.: ;9 ' u.: ;9 I v.?: ; 9 '@Bw: ; 9 IBx: ; 9 IBy4: ; 9 IBz4: ; 9 IB{1RBUX Y W |4: ; 9 I}1UX YW ~.?<n.?<n: ;9 6% : ; 9 I$ >  $ > &I I7I I !I/  : ; 9  : ; 9 I8 : ; 9 <4: ; 9 I?<!4: ;9 I?<: ; 9 I> I: ;9 ( (((   : ;9  : ;9 I8  : ;9  : ;9 I : ;9  : ;9 I8  : ;9 I : ;9 I 8 '!I": ;9 I#> I: ; 9 $ : ; 9 % : ; 9 I& : ; 9 ' : ; 9 I8(!I/)'I* : ;9 +4: ; 9 I,4: ; 9 I- : ; 9 I8 .4: ; 9 I?/.?: ;9 @B04: ;9 IB14: ;9 IB2 U34: ;9 I415B64: ;9 I71RB UX YW 81RB UX YW 9 U:41B;1B<1=1RB X YW >1?@!I/ A.: ;9 B.: ;9 C4: ;9 ID.: ;9 'I E: ;9 IF G.: ;9 'I@BH: ;9 IBI1RB X YW J: ;9 IK.: ;9 'IL1RB X YW M1N41O1BP4: ;9 IQ.: ;9 I R.: ;9 I S: ;9 IBT: ;9 IU.: ;9 'I@BV4: ;9 IW1RB UX YW X.: ; 9 'I@BY: ; 9 IBZ4: ; 9 IB[4: ; 9 IB\1RB UX Y W ].: ; 9 ' ^: ; 9 I_.: ; 9 @B`4: ; 9 I a: ; 9 IBb4: ; 9 I c.: ; 9 '@BdB1e.: ; 9 'I f.?: ;9 '<g.?: ; 9 'I 4h.?: ;9 'I ij.1@Bk1l 1UmB1n41 o41p41 q41r s1UX YW t.?<n: ;9 u.?<n: ; 9 v.?<n: ; w6x.?<n R /usr/include/bits/usr/include/usr/include/sys/usr/lib/gcc/x86_64-redhat-linux/8/include/usr/include/bits/types/usr/include/netinet/usr/include/arpalsapilib.cstring_fortified.hunistd.hbyteswap.hstdlib.hstdio2.hfcntl2.hstdlib.hstat.hlsapilib.htypes.hstddef.hfcntl.hstruct_timespec.hstat.htime_t.h__sigset_t.hsigset_t.h__sigval_t.hsiginfo_t.hsignal.hsigaction.htypes.hstdint-intn.hstruct_timeval.hselect.hstdarg.hstruct_FILE.hFILE.hstdio.hsys_errlist.hresource.hstruct_iovec.hsocket.hsocket_type.hsockaddr.htime.hpwd.hstruct_tm.htime.hunistd.hctype.hconfname.hgetopt_core.hstdint-uintn.hin.hnetdb.hun.hlsapidef.hstring.hresource.hdlfcn.hsocket.herrno.hselect2.hsched.hmman.hsendfile.huio.hstrings.hinet.hwait.hprctl.hgrp.h `TKK.K5J/I#KK1 0 z zJ Z " OJJ = ...v <K gfJ.T2KxJ.n=@<YDw<<=:/;<;/u;=IK=H</փ-K-=>:X-=;=0:/;=I<//sf=H</[G-K-=18=;=0:X;=-/I=;/?Gf-K-=I<-=;=-/e=-/t0//-</-</-</-<///-<///-J=t=Y-</ȑ-</J>Xtu-=ttu;/K-=-/X-/t;/gK-=Y-=;=J;=/K-=-/X;/u-=ttu-=K;</f;=;/fu-=t.V>,>t;=/.K-=-/t-=-//-/-X.I</t.W=-/0,0,<.W=-/t/t;=;/H ># K# = l Z< < h u$I$K="IY<IJ =$J$<=;"<J = vXF.L L = /d f.L u /O7@p$tik<=<>V L a$f mX Xm< .>m<X N1+ pk " kJJ k.XX"~K k  [ X O(kX  < kX  b>= E<>:<Y<; = vk<q R< !l   l<lz/ f X< Kffkv ~*~ X$ rJ~ # .?f h ~~<  .<1 ~) < ~t)X ~<= jtt        Z-JJXft X L!s gf  fF J Y Y :"foXXXJlt0 hd/ L. XN6g J yi< X$   Z  4tKK  ;:|". < Z IY6t(f+K"JMX"X< mJ< & AJX0J XXXV$J)I!4f<9X!Jh  .$r.XX`KJ Jt5<uY"J q<% 3$x.`XYBW[$g   F x \ *2. F^ \t;:j KK-uYIX mKi+JJK2KKu\/ u  u  (tX |  x(9?JL6J9xX<u1tu6,XJK,@g L,K /sJK u XQy  X KEW \ g x. < %  /s u Z ptt  /t.X  o tK !f J/ kt Zs gY  Z Y g Y  #!xwJKxJK K!JK sJ  s< ! KJ9J!JK!s  f K =J YYt YYt YYJ YY<xK t<YL ,<W ue [A<v v .KXe#!CJ;Cg K E dX ` x DNK$ JG MY<," g <    =  &> t u X   Y r< f Kr  < r rJ huJL |   fX.X  ]u u<   Z = = y<kJK,&J"Irt &s=r< !rff  "yJD!IK L%; K%H K KKK.7 .XB#I1u#J Q  F Z  KNJ U  X  hJ.$ .Xhr / X L*~Jf-S. LKI u YZ .HJ K Y)%fX80JJ )X%<XX$%4HJL<0YBL=;B=Vv<)/Mt z0<6u  zt/  L4K"vI4H =" @"F %#K%W Yz Q*uJf  uJ K mJJ .I  <vJ uMF =0J u) Y%#K,K"9 =& =X YsJY FX:JJ Z L N*<xX<JX>tJ e < 7/t  L4K xH4 = K *vJfJ  uJ  Y.W mJt mX K t Km \x JYKWiX<JJz NS =;0WX Y)? K  LeJf<Ki*_8tK )^ ~tf<_K z.` ztf< XKJZfv*=gJ Z AK=%, =%H KM, tY,Lho!(fot(= -K l X|K<x < o.K Ms f sf tJt    Z 93JJM _< . jy 93JJ Kw ' K"f/ s XM X X mXL  f   yr rX' =P Yr J:h6t YGu  uf>= . f  K  ^tj  !tJ<   jF % =%H K  Z7)K LK)8 K! K 2%o = K%: K2 GK  _X#< ]< <& Y ZX [f<Ȃ _Xy q   KK&,N>:hZs"  [sf  "Ui Xi g Y .. - sX ... K fh00< =  h+< Y  u<   Y Jz   . L+< g  /.  L g J JK*X.X v6= Y; u/ Xl f? lJXY lf"Kl "K8G8=P.4XK%      J.Jp<J*<X v6= Y;. / Xl f lJXY"=8G8= I/..c<<jBz<  sX&`" f [Z M   L  Y 0 U= =Y K ^f 4I gYK$/ fY L y^ /K-%]  K+/X>0XX<uj Yv Xg Y IgZ$Hv&L<X(.= /.u.Z .fJOwX(WuO=.ft"<*w  <K t Y /?N&tuKK  h g G] t Y t YtM   t  Y IgYJvYY g r Y >v t YK, <Y ._ho<x }KYWJtbXK X 9    ft "u ; <u WY rXu WY X"0", XX LXJ<f?JfjK t Y*=K t ,=K t 0=K t .=K t Y,=KgjKK 2K zt/ Y Z  c    Zc  cf  Zc <<   a,<  Zci  Zc x    Zc w X     c       Yc  v    Yc  v    Zc  w    Yc  v  Z [    Zc   g     Yb  f }r       g {  g1J }  <1-u-).K.X UJ.< Z .)J KIK XxK +zz< O=>;g< 0:>< Y6 2 _< < Z    \_<   _X<   _ @ /        J       f :v ZYw Yu    Zv  .X t   tXI/ /    u ~ft  Zr> Z J  z  X/X < zX   tX /  `ggWK>X u ~X~ }XYX |X |<Y ^  X ./ XR XUJ Y   h.eX> tYvtYK   M U -/](tq $~Zv <Qyt/Z t   t Z*(t N   bX J| < y  !#J Y  Z+KZ)=1K- M< <Y v.u. }Jt ZY< gJ f"<  /  np < }2NX)     ~ |X}Y"Xg![qg!p'Y>tYK&CXK%.ZY&i fYp<x u   Zv X w ~9}5Xl t.Z7j.+"<g7/W5K/I Mu_Kg\K f /opt/cpanel/ea-ruby27/root/usr/include/ruby/usr/include/bits/usr/include/usr/lib/gcc/x86_64-redhat-linux/8/include/usr/include/bits/types/usr/include/sys/usr/include/netinetlsruby.clsapilib.hruby.hstdio2.hstdlib.hstring_fortified.hstddef.htypes.hstruct_FILE.hFILE.hstdio.hsys_errlist.htypes.hstdint-intn.hstdint-uintn.hunistd.hgetopt_core.hmath.hintern.hversion.hlsapidef.htime.hstruct_iovec.herrno.hsockaddr.hsocket.hin.hsignal.hstring.hmman.hutil.h  JK?K| #t>iK>KK{KY;./*X **}( // RX} t     0Yf q\:>X. t" u t/u* uZ ^  %gfu Z3 X |t |< tXX uKt  .t.  X  f. f *8u t  X    o.@5< t-< ti JJ [X #JiX Y  L( ff#X< x9= t; K1 tQJ/f J L 2  =t<UMtUX&<< ` 0z X .    =Yl  rX[wt Z " h   m grtX  h fY:g< KXfKY sbXtv  SY|X |X<   L/$ eX< z < zt yt5Y|X |.X z  Z rh Y   *xp*suqwZ7Mt -uDXZ;467954644584236:8648: "u{ wt JvI ;tZvpJuI==[X=XvXuv0X>f~z t gz t ` X p((* uv #G< Y(%[$ _SC_THREAD_SPORADIC_SERVERpthread_atfork_functotalLSAPI_Set_Max_Process_Timelsapi_parent_dead__fxstatparseContentLenFromHeaderugidLen_SC_2_SW_DEVm_pScriptFileLSAPI_Stopsi_addr_lsb_unused2_SC_TIMERSm_iReqCounter_fileno_SC_SHELL_SC_MEMORY_PROTECTION_SC_SCHAR_MAX__pathtm_secH_AUTHORIZATION_SC_THREAD_SAFE_FUNCTIONS_SC_UCHAR_MAXmax_lenfreeaddrinfoverifyHeader_SC_C_LANG_SUPPORTm_pIovecEndstrcpy__uint8_tIPPROTO_TPpw_uidwaitpidHTTP_HEADER_LEN_SC_TTY_NAME_MAX_SC_PASS_MAXLSAPI_ErrResponse_rsi_uidm_bytes_SC_2_PBS_TRACKfp_lve_destroym_pHeader_IO_buf_end__RLIM_NLIMITS_SC_SELECT_shortbufsockaddr_insa_family_tSOCK_DCCP_SC_BC_STRING_MAX_ISpunctis_enough_free_meminet_addr_SC_TRACE_INHERITinit_lve_exnewSizem_tmStartsetgroups_SC_SEMAPHORES_SC_EQUIV_CLASS_MAX__environ_sigpollsa_data__builtin_memmoveai_protocolm_pChildrenStatusCurIPPROTO_UDPoverflow_arg_areasin_zero_SC_DEVICE_SPECIFICin_port_tachMD5_SC_THREAD_THREADS_MAXerror_msg_SC_LEVEL3_CACHE_SIZE_SC_TRACEreg_save_area_archm_respPktHeaderg_running__off_t_addr_bndlsapi_cleanupachHeaderNamest_size_SC_THREAD_PROCESS_SHAREDallocateBuf_SC_JOB_CONTROLgetppidtm_isdstswapIntEndianlsapi_check_child_status_locks_max_idle_secslsapi_set_nblocks_schedule_notifysetUID_LVE_SC_NL_NMAX__RLIMIT_NPROCRLIMIT_DATApServeratolinitgroups_SC_POLLm_pHttpHeader_SC_V6_ILP32_OFF32_SC_TRACE_SYS_MAXm_pScriptName__builtin_va_listst_blksizeRLIMIT_NOFILEm_pEnvList_SC_BASE_sigchldLSAPI_Set_Max_Idle_Children_SC_LONG_BITfixEndianLSAPI_GetEnv_r_upper__fmtsa_familym_specialEnvListSizepw_passwd_SC_CLOCK_SELECTIONlsapi_resp_infoGNU C17 8.5.0 20210514 (Red Hat 8.5.0-26) -mtune=generic -m64 -march=x86-64 -g -O2 -fexceptions -fstack-protector-strong -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection=full -fPIC -fplugin=gcc-annobin__RLIMIT_RTTIME_SC_V7_LPBIG_OFFBIGbodyLeftfcntllastTime_SC_AIO_LISTIO_MAXLSAPI_Init_Prefork_ServerpErr1pErr2st_gidm_cntHeaderss_notify_scheduledm_envListSizegettimeofdayai_addrm_iAvoidForks_secret_timerlsapi_MD5Context__syscall_slong_t__builtin_memset_SC_FILE_SYSTEMsa_restorerm_pChildrenStatusEnd_IO_write_end_SC_SCHAR_MIN_SC_LINE_MAXLSAPI_SetRespStatus_rlsapi_MD5_CTX__resst_nlinks_addr_SC_TZNAME_MAX__va_list_tag_syscallst_ctim__builtin___snprintf_chkLSAPI_Postfork_Child_SC_2_VERSION_SC_2_PBS_CHECKPOINTIPPROTO_MPLS__sigset_tm_requestMethodOffm_tmWaitBeginreadSecretreadReq__tznameatoig_initedgetaddrinfovalLens_acklsapi_jailLVE__d0_SC_LEVEL4_CACHE_ASSOClsapi_MD5Final_SC_NL_LANGMAXdoAddrInfo__stack_chk_fail_killcurSizeRLIMIT_STACKIPPROTO_IPIPdlopenbacklogsin_family_SC_LEVEL1_ICACHE_ASSOCpIovrlim_maxm_iKillSentm_fdListen_SC_AIO_PRIO_DELTA_MAXvalidateHeadersst_atimm_statusm_reqBodyLensig_numoptargSOCK_RAWsnprintfold_int_SC_2_C_BINDs_enable_lve__clock_tparseRequestIPPROTO_RAWbufLen_SC_PRIORITY_SCHEDULING_SC_SS_REPL_MAXsival_ptrpStderrLogsetpgid__uid_tsi_stimeoptoptLSAPI_ReqBodyGetChar_rpKeysun_family__uint16_t_SC_FSYNCsin_portgetpeernameLSAPI_is_suEXEC_DaemonLSAPI_Is_Listen_rLSAPI_End_Response_r_SC_FILE_ATTRIBUTESsetreuidserverAddr_SC_NZEROm_pQueryString__gnuc_va_list_SC_2_C_DEV_chainpContentLen_call_addrEnvForeachnewfdm_iServerMaxIdleSOCK_NONBLOCKusleepSOCK_RDM_SC_SYMLOOP_MAXsockaddr_un_ISblankunsigned charIPPROTO_MAX_SC_MQ_OPEN_MAXSOCK_DGRAMm_tmReqBegin__fd_mask__blkcnt_tlsapi_enterLVE__builtin_calloc_IO_lock_t__uint32_tLSAPI_Is_ListenIPPROTO_COMPLSAPI_key_value_pairlsapi_check_pathLSAPI_ForeachHeader_rpHeaderName_SC_SEM_NSEMS_MAX_SC_USHRT_MAXLSAPI_FinalizeRespHeaders_r__read_alias__fdelt_chkshouldFixEndianpBody_SC_STREAM_MAX_SC_ASYNCHRONOUS_IOserverMaxIdle__open_alias_SC_READER_WRITER_LOCKS_SC_CPUTIME__getcwd_alias_SC_2_PBS_LOCATE_SC_DEVICE_IOsa_flagspVecgeteuid_SC_SIGNALS__ctype_b_loc_SC_V7_ILP32_OFFBIGs_notified_pids_max_reqsH_X_FORWARDED_FORs_pid_dump_debug_info_ISalpha__fprintf_chktm_zone__mode_tm_queryStringOff_SC_V7_LP64_OFF64_SC_NPROCESSORS_CONF__RLIMIT_SIGPENDINGfdInlsapi_changeUGidtv_usec_SC_XOPEN_XCU_VERSIONold_childold_termLSAPI_sendfile_rlsapi_lve_error_SC_MEMLOCKallocateRespHeaderBuf_ISprintsched_yieldpMessages_liblvepValueH_CONTENT_LENGTHm_tmLastCheckPoint__vfprintf_chk_ISalnum_SC_SEM_VALUE_MAXs_req_processedstrtoll_SC_XOPEN_XPG2_SC_XOPEN_XPG3_SC_XOPEN_XPG4LSAPI_STATE_CONNECTED_IO_write_ptr_SC_REALTIME_SIGNALSsystemlsapi_packet_headerIPPROTO_ENCAP_ISspacelsapi_suexec_authgetLFg_prefork_server__suseconds_texitLSAPI_CreateListenSock2__rlim_ts_ignore_pid__RLIMIT_MEMLOCKpCurpHeaderValue__sizes_slow_req_msecslsapi_init_children_statusgetuidH_COOKIELSAPI_ParseSockAddrdlsympthread_lib_SC_PII_INTERNET_DGRAM_SC_SINGLE_PROCESSbyteReverseLSAPI_Accept_Before_Fork_SC_SHRT_MAX_ISxdigit_SC_RAW_SOCKETSfp_lve_enterLSAPI_AppendRespHeader_rH_CONNECTIONLSAPI_GetHeader_r_SC_MULTI_PROCESSs_stderr_log_pathm_statefp_lve_instance_init_SC_BC_BASE_MAXH_CONTENT_TYPELSAPI_STATE_ACCEPTING_SC_RTSIG_MAX_SC_NETWORKINGachCmdH_ACCEPT_SC_GETGR_R_SIZE_MAXcompareValueLocation_SC_THREAD_ATTR_STACKADDR_SC_LEVEL2_CACHE_ASSOC_SC_IOV_MAX_SC_TRACE_EVENT_NAME_MAX_SC_PII_INTERNETIPPROTO_IGMPpServerAddrlsapi_acceptlsapi_initLVE_IO_save_baseLSAPI_Release_riovecold_usr1maxIdleChldm_iMaxChildren_SC_2_UPEai_canonnameIPPROTO_IPV6_SC_DELAYTIMER_MAXpw_dirsa_mask__sigval_tLSAPI_Set_Extra_Childrens_restored_ppidsin6_flowinfom_pid_SC_SYSTEM_DATABASElsapi_prefork_server_acceptm_pIovecToWritem_respHeaderLenH_IF_MATCHai_family__nlink_tsi_addrst_inost_modeLSAPI_IsRunning_SC_T_IOV_MAXCGI_HEADER_LENIPPROTO_DCCP__in6_uGetHeaderVarH_ACC_CHARSET__stream_SC_XOPEN_STREAMSm_iMaxIdleChildrensendfile_IScntrlm_reqBufSizelsapi_child_statusprctlallocateEnvList_ISupperpStatuserr_nosival_intsi_codem_pReqBufwait_timestrcasecmpH_IF_UNMOD_SINCEpw_name_SC_TRACE_USER_EVENT_MAX__socklen_tsend_notification_pktlsapi_requestpKeyEndcurTimelsapi_writev__ssize_t__srclsapi_closepChrootH_IF_RANGEtimespecnameOff__u6_addr8strerror__RLIMIT_RSSavoidForkm_packetLenLSAPI_ReadReqBody_rIPPROTO_MPTCP_SC_2_FORT_RUNbindfp_lve_leave__val_SC_ADVISORY_INFO__timezone__ctype_toupper_locsin6_addr_SC_TIMER_MAXpBufCur_SC_THREADSunset_lsapi_envs__sighandler_t_SC_USER_GROUPS_RLSAPI_Set_Server_fdLSAPI_CreateListenSock__RLIMIT_LOCKSm_respPktHeaderEndLSAPI_On_Timer_pfLSAPI_Set_Max_Reqs_SC_UINT_MAXst_uids_conn_close_pktLSAPI_Postfork_ParentpEndpktTypelsapilib.cset_skip_write_SC_TRACE_NAME_MAX_lowers_busy_workers_SC_THREAD_DESTRUCTOR_ITERATIONSm_flagm_pHeaderIndexidle_SC_CHILD_MAXlsapi_reopen_stderr2_IO_save_endtm_min__nptrLSAPI_InitLSAPI_Request_SC_V6_LP64_OFF64_SC_NGROUPS_MAXm_bufProcessedfixHeaderIndexEndianfp_offsetlsapi_MD5TransformLSAPI_Write_Stderr_r__time_t_SC_THREAD_ROBUST_PRIO_INHERITgp_offset_padLSAPI_ForeachOrgHeader_rsigaddsetLSAPI_Inc_Req_Processedm_httpHeaderLendyingrealpathtm_yday_SC_SSIZE_MAX_SC_PII_OSI_CLTS_SC_SYSTEM_DATABASE_RpAuth_SC_LEVEL1_DCACHE_SIZEkeyLenextraChildrenLSAPI_Flush_rshort unsigned intrlim_curLSAPI_Reset_rs_lveold_ppidLSAPI_CB_EnvHandler_valueLen__blksize_t_SC_STREAMSSOCK_STREAMdigest_SC_PAGESIZE_SC_THREAD_PRIORITY_SCHEDULINGcountsi_pidIPPROTO_MTPs_stop_SC_CHARCLASS_NAME_MAXlsapi_header_offsetvfprintfsetgid_boundstm_wday__off64_t__fd__lenachBuf_sigsys_IO_read_base_SC_XBS5_ILP32_OFFBIGsend_req_received_notificationIPPROTO_EGPLSAPI_reset_server_statesockaddrs_defaultGids_keep_listenerm_cntUnknownHeadersreadfdsai_addrlenlongsopterr_SC_DEVICE_SPECIFIC_RLSAPI_Set_Restored_Parent_Pidpw_gecosm_iExtraChildrenLSAPI_No_Check_ppid_SC_PIPE_IO_write_base_SC_XOPEN_CRYPTm_respInfotz_dsttime_SC_PHYS_PAGESlsapi_enable_core_dumpH_CACHE_CTRLH_COOKIE2_SC_ATEXIT_MAX__desttm_mon_SC_SHRT_MIN_SC_FIFOH_USERAGENTs_min_avail_pages_SC_USER_GROUPSm_lLastActiveLSAPI_ForeachEnv_rSOCK_PACKETsa_sigactionnotify_req_received_SC_XBS5_ILP32_OFF32s_worker_status_IO_marker__builtin_strncpys_ppidtm_yearmax_children_SC_2_PBS_MESSAGEm_pRespBufEndtimevalorig_masktmCur_SC_XOPEN_REALTIME_THREADSfp_lve_is_availablepAddrs_defaultUidm_pChildrenStatus__fds_bits_SC_SPIN_LOCKSLSAPI_Set_Server_Max_Idle_Secsm_bufRead_SC_SPORADIC_SERVERlsapi_close_connection_SC_LEVEL1_DCACHE_LINESIZE__sigaction_handlerlsapi_signal_SC_PRIORITIZED_IOSOCK_SEQPACKET__pid_t_IO_codecvt_SC_GETPW_R_SIZE_MAXpUgidheadershints_SC_XOPEN_VERSIONH_RANGE_SC_BC_SCALE_MAX_SC_2_C_VERSIONdup2strtolg_reqlong doubleparseEnvai_socktype_SC_THREAD_KEYS_MAXiov_len_SC_LEVEL4_CACHE_LINESIZEfd_setlsapi_MD5Init_SC_NL_TEXTMAXnonblocklsapi_req_header_SC_LOGIN_NAME_MAXfind_child_statusIPPROTO_PIM_SC_XBS5_LP64_OFF64_SC_SPAWNmaxChildrennewlensi_statussigemptyset_pkeym_headerOff__RLIMIT_OFILEHTTP_HEADERS_SC_2_PBSs_proc_group_timer_cbpw_gid__errno_location_SC_XBS5_LPBIG_OFFBIG_SC_WORD_BIT_SC_2_PBS_ACCOUNTINGm_pSpecialEnvListsin6_scope_id_SC_AIO_MAX__oflag_SC_2_CHAR_TERMresolved_path_SC_LEVEL1_ICACHE_LINESIZE_IO_buf_baseai_flagsrealloc_SC_XOPEN_SHM__dev_t_SC_XOPEN_ENH_I18Nold_quitRLIMIT_CPU__glibc_reserved_IO_read_end_SC_ULONG_MAX_SC_TYPED_MEMORY_OBJECTS_SC_TIMEOUTS_SC_LEVEL2_CACHE_SIZEfinal_SC_XOPEN_UNIXm_pRespBufPos_IO_FILEin_addr_tm_fdH_HOST_IO_wide_datacookiestrlen_sifields_SC_LEVEL2_CACHE_LINESIZE__u6_addr16s_pidIPPROTO_AHLSAPI_ReqBodyGetLine_rtm_hoursetsidFlush_RespBuf_r_SC_THREAD_STACK_MINisPipe_SC_PII_OSI_Mm_respHeaders_global_counterRLIMIT_AS_SC_NL_MSGMAXsi_signom_pAppData__RLIMIT_MSGQUEUEachAddrm_inProcess_SC_THREAD_ROBUST_PRIO_PROTECT_ISgraph_lsapi_prefork_servertm_mdaypIntegerlsapi_siguser1__pad0_SC_BC_DIM_MAX__pad5_SC_LEVEL1_DCACHE_ASSOCmallocs_dump_debug_infos_avail_pages__u6_addr32_headerInfom_typesi_errnofinish_closelisten_SC_XOPEN_REALTIME_markersLSAPI_InitRequest_SC_SAVED_IDSpBindm_scriptFileOff_SC_INT_MAXsi_bands_log_level_namess_skip_writeH_VIAmemccpyIPPROTO_ESPm_pRespHeaderBufEnd_SC_TRACE_LOGgetpwnamtimeout_SC_THREAD_PRIO_PROTECTg_fnSelectRLIMIT_FSIZE__builtin_memcpyst_rdevlsapi_http_header_indexpEnv_SC_OPEN_MAXst_devdlerrorheaderIndex_SC_UIO_MAXIOVLSAPI_Logm_pRespHeaderBuf__int32_tH_PRAGMA/opt/cpanel/ea-ruby27/root/usr/local/share/gems/gems/ruby-lsapi-5.7/ext/lsapiqsortpSecretFile__RLIMIT_NLIMITS__daylightIPPROTO_RSVPH_REFERERIPPROTO_UDPLITESOCK_CLOEXECLSAPI_Set_Slow_Req_MsecsLSAPI_Prefork_Accept_r_sys_siglist_SC_CHAR_MAXLSAPI_Get_ppid_ISlowerpEnvEndsigprocmaskm_pUnknownHeadergetpwuidm_reqState_SC_PII_XTIpRespHeadersleftsysconfm_pRespBufm_iCurChildrensocketLSAPI_Write_r_SC_PII_OSI_COTSm_totalLenm_pIovecs_stderr_is_pipefstat_SC_PII_SOCKET__gid_tlsapi_sigpipe_SC_V6_LPBIG_OFFBIG_SC_MQ_PRIO_MAXgetcwdH_TRANSFER_ENCODINGH_IF_MODIFIED_SINCE__bsxai_nexts_enable_core_dump_SC_TRACE_EVENT_FILTERnodelaysin6_family__resolved_freeres_buf_sigfaultm_iChildrenMaxIdleTime_SC_THREAD_CPUTIMEsi_utimetv_sec_SC_VERSIONm_cntSpecialEnv_SC_C_LANG_SUPPORT_Rlong long unsigned intsa_handlersin_addr_cur_columnlsapi_load_lve_libtoWrite_SC_PIIsi_fd_SC_MAPPED_FILES_SC_LEVEL4_CACHE_SIZEIPPROTO_BEETPHfp_lve_jail_SC_2_FORT_DEVIPPROTO_IPm_pRespHeaderBufPosst_blockslsapi_initSuEXEC__bswap_16getpid__buf_SC_2_LOCALEDEFm_cntEnvlocaltime_r_SC_LEVEL1_ICACHE_SIZEreadBodyToReqBuftm_gmtoffIPPROTO_PUP_IO_backup_baseH_KEEP_ALIVE_IO_read_ptr_SC_CHAR_BITLSAPI_Register_Pgrp_Timer_Callbackmd5ctx__socket_type__nbytes_nameLengetenv_freeres_list__aps_max_busy_workersIPPROTO_ETHERNETH_IF_NO_MATCHlsapi_readsun_pathCGI_HEADERSsi_overrun__bswap_32pReq_SC_INT_MINlsapi_MD5Update_SC_RE_DUP_MAX_SC_PII_INTERNET_STREAMachBodyachPeer_SC_THREAD_ATTR_STACKSIZEfull_path_old_offset_SC_SIGQUEUE_MAXsiginfo_t_SC_FD_MGMTexpect_connected_SC_SYNCHRONIZED_IOLSAPI_STATE_IDLEvalueOff_SC_V7_ILP32_OFF32skipunlinksend_conn_close_notificationoptinds_accept_notifyH_ACC_LANG_SC_EXPR_NEST_MAX_SC_LEVEL3_CACHE_LINESIZElong long intm_pktHeaderin6addr_loopbacks_accepting_workersIPPROTO_IDP_flags2allocateIovec_SC_MESSAGE_PASSING__ch_SC_REGEX_VERSIONm_iLenLSAPI_Set_Max_Children__d1setuidtv_nsecm_scriptNameOfflsapi_perror_SC_FILE_LOCKING_SC_AVPHYS_PAGES_SC_MB_LEN_MAX_ISdigitsockaddr_in6IPPROTO_SCTP_SC_PII_OSI_SC_ARG_MAX__ino_tsetsockopt_SC_MEMLOCK_RANGELSAPI_Finish_r_SC_SHARED_MEMORY_OBJECTSlsapi_resp_headerin6addr_anym_pRequestMethodachError_SC_CHAR_MIN__realpath_chkiov_basem_lReqBegins_uids_total_pagespw_shell__namem_versionB0m_versionB1IPPROTO_GRE_SC_XOPEN_LEGACY_SC_NL_ARGMAXRLIMIT_COREsi_tidtobekilled_SC_THREAD_PRIO_INHERIT_SC_LEVEL3_CACHE_ASSOC_SC_NPROCESSORS_ONLNm_headerLenexpect_acceptingm_pIovecCurLSAPI_Init_Env_Parametersaddr_len_SC_HOST_NAME_MAXIPPROTO_TCPLSAPI_AppendRespHeader2_r_SC_COLL_WEIGHTS_MAX_SC_MONOTONIC_CLOCK__rlimit_resourcem_reqBodyReadLSAPI_Set_Max_Idle_SC_CLK_TCKLSAPI_ForeachSpecialEnv_rlsapi_buildPacketHeaderLSAPI_perror_r_SC_NL_SETMAX_SC_BARRIERSbodyLenpBeginLSAPI_Accept_rwait_secslsapi_reopen_stderrstrcmpst_mtim__statbuf__RLIMIT_NICEfn_select_tshort intlsapi_notify_pidsi_sigvalsetrlimit_vtable_offset_SC_IPV6mmapIPPROTO_ICMPlsapi_sigchild_SC_REGEXPlsapi_schedule_notifyLSAPI_Get_Slow_Req_Msecs_SC_V6_ILP32_OFFBIGmemchrtz_minuteswestH_ACC_ENCODINGsin6_portm_iMaxReqProcessTime__RLIMIT_RTPRIOrb_mWaitWritable_sys_errlistRUBY_Qnilrb_eNoMemErrorrb_cMethodrb_obj_wb_unprotectrb_eSyntaxErrorsockaddr_isoblockSizeRUBY_FL_EXIVARdmarkRUBY_DATA_FUNCrb_eIOErrorrb_data_object_getrb_cFilerb_eSignallsapi_dataRUBY_T_ARRAYrb_eKeyErroradd_env_railslsapi_addstrRUBY_FL_UNTRUSTEDrb_eZeroDivErrorlsapi_getscreateTempFiledfreeRUBY_T_IMEMOrb_global_variableROBJECT_EMBED_LEN_MAXRUBY_T_UNDEFrb_cStringrb_eEOFErrorLSAPI_GetReqBodyRemain_rrb_mKernelrb_output_fsrb_cModulesockaddr_nsRUBY_T_FALSEruby_robject_flagsrb_cIntegerRUBY_T_FILErb_cTrueClassRUBY_FL_USER0RUBY_FL_USER1RUBY_FL_USER2RUBY_FL_USER3RUBY_FL_USER4RUBY_FL_USER5RUBY_FL_USER6RUBY_FL_USER7RUBY_FL_USER8RUBY_FL_USER9rb_fsRUBY_T_COMPLEXdata_struct_objrb_eEncCompatErrorruby_special_constsRSTRING_EMBED_LEN_SHIFTruby_rarray_flagsruby_descriptionRStringMAX_BODYBUF_LENGTHlsapi_bodyrb_eNameErrorneedReadrb_eRegexpErrorrb_cBasicObjectRUBY_T_STRUCTrb_cRationalrb_cFloatrb_cClassrb_cStatbasicRUBY_QtrueRUBY_T_STRINGrb_cContrb_cFalseClassRARRAY_EMBED_LEN_SHIFTreadMaxBodyBufLengthRUBY_T_MODULErb_eArgErrorrb_eInterruptrecurrb_funcallvRUBY_FL_SINGLETONcapanReadRUBY_T_ZOMBIEfloatrb_stderrlsapi_eachrb_str_catbodyBufRARRAY_EMBED_LEN_MAXRUBY_T_FIXNUMrb_eSecurityErrorisEofBodyBuflsapi_processlsapi_flushRARRAY_EMBED_FLAGROBJECT_EMBEDRUBY_SYMBOL_FLAGrb_mComparableRUBY_FLONUM_FLAGrb_stdoutruby_rstring_flagsrb_cTimeruby_enginerb_output_rsROBJECT_ENUM_ENDrb_eFatalrb_funcall_argcsTempFilerb_funcall_argssharedlsapi_printfRUBY_T_OBJECTs_fn_add_envmunmapRSTRING_EMBED_LEN_MAXbodyCurrentLenrb_cNumerics_req_stderrrb_cHashrb_array_const_ptrrb_rsRArraylsapi_markRUBY_ELTS_SHAREDlsapi_envruby_release_daterb_cDirsetup_cgi_envlsapi_eofrb_array_const_ptr_transientreadTempFileTemplaterb_str_newsockaddr_x25rb_eLoadErrororig_stderrRUBY_FL_PROMOTED0RUBY_FL_PROMOTED1ruby_versionorig_stdoutsigngamruby_copyrightrb_eExceptionrb_yieldadd_env_no_fixRUBY_T_FLOATRUBY_T_CLASSrb_cDataftruncateruby_fl_typerb_cComplexrb_check_typeRUBY_T_HASHRUBY_T_NODEchdirrb_mErrnoruby_api_versionreadMoreRUBY_FL_WB_PROTECTEDisBodyWriteToFilerb_mWaitReadablelsapi_setsyncRUBY_FL_TAINTlsapi_printrb_eSystemCallErrorrb_intern2program_invocation_short_namerb_cUnboundMethodrb_f_sprintfrb_const_getrb_eScriptErrorfn_writelsapi_syncreadBodyBuflsapi_reopenrb_mGCrb_eIndexErrorcurPoslsapi_s_acceptpreforkRUBY_T_DATAbuffssizetypeRUBY_FL_DUPPED__builtin_strchrrb_array_lenfilenamelsruby.csockaddr_eonrb_string_value_ptrrb_eFloatDomainErrorlsapi_puts_aryblkSizeInit_lsapirb_eStandardErrorrb_cSymbolrb_argv0rb_cMatchrb_cEncodinglsapi_isattyRARRAY_EMBED_LEN_MASKRUBY_T_NONErb_mProcessrb_mFileTestremainrb_cEnumerator__builtin___memcpy_chkrb_io_putslsapi_s_postfork_childrb_define_global_constrb_obj_as_stringrb_funcall_nargsRDatarb_cRangerb_cObjectRVALUE_EMBED_LEN_MAXrb_gc_markinitBodyBufruby_strduprb_eNotImpErrorlsapi_s_postfork_parentsockaddr_inarprb_cIORSTRING_ENUM_ENDRUBY_T_BIGNUMRSTRING_NOEMBEDRUBY_T_RATIONALRUBY_FL_PROMOTEDs_bodyrb_eTypeErrorRBasicrb_eNoMethodErrorRUBY_T_ICLASSrb_num2intcLSAPIRUBY_SPECIAL_SHIFTRUBY_T_SYMBOLrb_num2char_inlineselfrb_eSystemExitisAllBodyReadrb_cThreadRUBY_FL_SEEN_OBJ_IDruby_platformsockaddr_ax25RSTRING_FSTRrb_eThreadErrorrb_str_new_staticshared_rootrb_cNilClassrb_stdinrb_eStopIterationRUBY_FL_USHIFTklassrb_define_classRUBY_FL_FINALIZErb_cRandommkstemplsapi_putcstrcatlsapi_writelsapi_putsorig_stdinRUBY_FIXNUM_FLAGargvRARRAY_ENUM_ENDrb_eRuntimeErrorrb_cProcRUBY_IMMEDIATE_MASKrb_hash_asetrb_cStructheapRARRAY_TRANSIENT_FLAGrb_typeRUBY_T_NILRUBY_T_MOVEDrb_eSysStackErrorrb_num2int_inlineprogram_invocation_namerb_cArrayrb_eEncodingErrorrb_ruby_verbose_ptrrb_cBindingrb_intern_id_cacherb_ary_detransientRUBY_FL_USER10RUBY_FL_USER11RUBY_FL_USER12RUBY_FL_USER13RUBY_FL_USER14RUBY_FL_USER15RUBY_FL_USER16RUBY_FL_USER17RUBY_FL_USER18RUBY_FL_USER19RUBY_T_MATCHlsapi_rewinds_reqrb_eRangeErrors_stderr_datarb_eval_string_wrapRUBY_T_MASKrb_lastline_getcreateBodyBufrb_eMathDomainErrorrb_fix2intLSAPI_GetReqBodyLen_rrb_gc_writebarrier_unprotectrb_exec_recursiverb_eLocalJumpError_sys_nerrlsapi_getcrb_hash_newclear_envrb_cRegexplsapi_binmoderb_cNameErrorMesgVALUErb_mMathRUBY_T_TRUEmemmemsockaddr_atruby_value_typerb_eNoMatchingPatternErrors_req_dataruby_rvalue_flagsrb_str_buf_newRUBY_FLONUM_MASKruby_patchlevelRUBY_T_REGEXPorig_envRUBY_Qundeflsapi_s_accept_new_connrb_eFrozenErrorsockaddr_dlRSTRING_EMBED_LEN_MASKRUBY_FL_FREEZEsockaddr_ipxrb_default_rsrb_string_valueenv_copyorig_verboserb_data_object_zallocrb_mEnumerableRUBY_Qfalselsapi_eval_string_wrapddqd <#!T)TuPPP(PPsPPKP[P"R+RRJQ^Q5Q5<v <Q{ PTt _X ~XX[TiT2TAXX[P[aQxT4T@PP{P{t XRr t;# $  %!r"p;# $  %!r"u?[gRSRbRHRQRR {RTKTiQX%vXvzr TiTTQq Ru .Q2QHQ+Q4QQoQQ;QQXP iR~Rv FRFW{ _Rz QK$KU$KKVKKUKIKTIKKSKK|hKKTK.KP.KPKQpKuKQuK}K?p K$KQ$KLKUpK}KU3KFK q 3KFK03KFKUQKpK8QKpK0QKpK\pKyK 7p yK}KQpK~K0pK}KUKK@KKUKKSKKVKKXKK0KKSKK|hJlJUlJJ]JJUJJ]JJUJJUJ0JT0JJSJJTJJTJJSJJTJJs@JJSJJSJJQJJ^JJQJJQJJ^JJ^7JTJPWJZJp?ZJaJPaJtJ\tJJPJJ_lJJUJJ | v"|JJ_|JJSJJTJJT|JJUJJ | v"JJ@JJSJJTJJs@JJ}JJ ~ JJQJJ\JJu`IIUII\IIUII\`IITIIT`IIQIIVIIvxIIVIIV`IIRII^IIRII^`IIXII]IIXII]dIITdIIUP@c@Uc@CVCrDUrDEVE.EU.EeEVeElFUlF;GV;GTIU@@P@@P@@P@APA0AS0ACAPVAiAP}AAPAAPAAPABP$B7BPKB^BPrBBPBBPBBPrDDSDDPDEPEEPEESlFFPDDsp"1DDP@@P@@PjApAPAAPAA0AAPBBPDDPDD0.E4EP:EQEP~@A0A!AP$AC\rDDPDD\DD0DD\DE0EE\lFF\FF0FH\H@I\EITI\@@P@@PAAPAAS5ACAP[AiAPAAPAAPBBP)B7BPPB^BPwBBPBBPBBPFGP"G,GP'CQCPE#EP HQHPFFPG!GP;GPGPPGTGUTGGVHHVHHQHHVI;IVEITIVFFPG!GPDGPGPPGTGUTGGVHHVHHQHHVI;IVEITIVWGpGPpGGSHHSI%IS%I6IP6I@ISEITISDGWG0DGPGPPGTGUTGWGV`GeG}eGpGQpGqG}`GpGPpGqGSGG@GG "!GGS]CtCP{C}C0G HP H HPfCtCPHHPHIS]>,?0,?C?]p;u<0<<P<=]=>]>,?0,?C?]p;u<0u<`=}=>}>>T>>}>,?0,?,?},?C?0p;u<0u<@=V@=V=PV==V==P=>V>>V>,?0,?0?V>?C?0p;`=S=:?S<< s $ &<<U=>0Z>c>0c>{>^{>>~>>~~>>~: ;U ;/;S/;0;U;;P99U9:S::U::S::U9S:\::S::@::6::W::4::  ::H4U4U U $$6U404^^ $^$6040000T9r0? $0404_\_\mm_ $_$60404K\KV\V\ $V$60SS 6S]] 6]USUSUST.V.T  wS  P ' S' W v(d r Pr x S     p`# p`# <$ c ~`# <$d x ~`# <$ vv" P c ^d x ^  \  0  P  S89P8:9QP+ PQQ + Q # 0 # 0 # P  U s U ) P) > S> k Pk n Sn r Pr s S 7L7UL77U 7H7TH7w7Vw7x7Tx77VM7Z7Px77P55U56V6?6U?66V66U66V66U56T6?6T?6F6TF66\66T66T66\66T66P66P66\T6g6Pg66S66UF66]66n2(3U(34\44U223T23(4V(404T044T223Q234]44Q63Y3PY3c3pc3t3Pt3~3^33p33P33S34P4,4,4h4L3p3Qp3~3R33Q33R3 4T 4 4tp 44T414^4(4V(404T0414T404|I4R4QR4S4VI4R4TR4S4]I4R4|_(l(Pl(v(u_(v(3_(l(ul(v(P''U''U''U''T''Q''T''T''Q''R''Q''QP''U''U''UP''T''Q''T''TP''Q''R''Q''Q0`U`SSU0`T`^TT0`Q`VQVQQ0`R`]R]RRD\~1$~"3$U"T $ &33$U"\~1$~"3$U"T $ &33$U"\`iP{P0%%U%&S&&}&+'U+'9'}9'@'U@'E'U0%%T%&_&9'}9'@'T@'E'}0%%Q%9'|9'@'Q@'E'|%%V%%vb%%0%%p 9'@'0%%Q&&Q%%P&&Pb%%0%%^%%~%&^&'}+'9'}9'@'0c&u&}u&&]&&}&&}&&]+'9'}K&&_+'9'_c&&S+'9'SK&X&V_&u&Vu&&}&&t&&T&&}#+'9'V%'\+'9'\&&P&'}+'9'}&&V&&v8$8&2$p"&& v8$8&2$p"c&c&5c&c& c&c&^#|$U|$$U$$U$ %U %%U%$%U#w#Tw#$S$$T$%S%%T%$%T#w#Qw#$V$$Q$%V% %Q %%V%%Q%$%Q##P##p$$0$$0$$^$%^<#w#0##r ##t %%0##Q$$q$!$qpI$Y$RY$m$q %%qp$$P$$P$%P<#w#0w##\##|#,$\,$_$|_$$\$%\ %%\%%0$!$T3$m$T %%T%%q`$!$X>$B$RB$$X %%X#$P %%P#$Y %%Y !U!7!S7!p!wp!{!{!!U!!S!*"w*""U""w !T uF!q!S!!S!!s""S""P""P{!!|I"o"|o""P{!!VD""V""v""V{!!_I""_{!!}D"d"}{!!]""]{!!^""^o""q2$u"""q2$u"o""v8$8&2$u"""v8$8&2$u"""v8$8&2$u"((U(=)S=)>)U>)Q)UQ)b)Sb))U()0) )P!)&) &)<)P>))0(( uu@()Q>)Q) uu@b)|) uu@()P( )s ))T))s()s()Pt u T p p# p`# tp# Q P 4 T2D2UD22S22~~22U22S22~~22U22U2D2TD22V22T22T22T22V22T22T2D2QD22]22Q22Q22Q22]22Q22Q2D2RD22\22R22R22R22\22R22R2)2u)22^22U#22^22U#22uU2Z2|Z2u2PU2u24U2u2^`U< ]< H UH b ]b k U`T< VH b V`Q5 SH [ S[ ^ sp^ b SP}q $ &}} $ &P\H b PP0< \H b \P\V 0 SH H S 0 VH H V 0 ^H H ^ PH b P  S  V  ^ZUZ^UH^H\UQTQ]TH]H\TZQZHQH\QZRZ\RH\H\RlSHS?ZSZ_H_HRSP\QTQZ]ZVUVVUHVH\TT__PPSS__UVU(4^(3 p $ &37 s $ &USUSUUSss $ &0yTyTMYQYn t2$x"#4nyRU)S)*UUPU0//U/0S0 0U 0#0S#0)0U./U/[/S[/\/U\/a/Ua/o/So/u/UWWUWXSXXUXYSYYUYPYSPYUYUY#YsY#YsY#YsY0Y !Y#Ys U S"U"rSrU'T'V"]V]_P_rVrTdlP3  303}@3}S?LPL}\V]d2]d o3JP,2,U2,h,Vh,k,Uk,,V,<,T<,j,\j,k,Tk,,\,G,QG,,Q-,H,0H,L,Pk,,P,,R+:+U:++\++U++\+:+T:++^++T++^+:+Q:+V+SV++Q++P++p $  $-(q++ q++  U uh U T T q Rq w Rw y Ry R q Zw Z 0  [  p * X- q [q 0 0 T t  u|#- 4 T4 7 pD W T^ b tb q u|#q 00 C UC n Sn p Up w S0 G TG o Vo w TH _ P_ i sp u P U S U S U U S T V T V T V P P P0_U_VUV07T7\T\@JUJrVrvQvwU@UTUcScvRvwT@UV}U}V.U.VU@T|]|}T}.].5T5]v\S} S R.:v:\S\S P}Pv  \c "c c\SWRWXuSWQWX]SWs} 2}d}S 8dUS. F (s U  S  U  S $ U$ * U Q$ * Q P ) P) * u t $ & P  \  \ T  V  V  ^  ^ P ] $ P \ V ^G P P U V U VU T _ T _T Q \ Q \Q R ^ R z^zRR P S %P%XSXdPdS R ] ]R U SS(S T VT9V 4}4]}*\kPS(P(QS*S04^0QTPThSsS'<'<S',},<\l\UvFQSs0s0s}Q | Q|V\dUdU}P_U_/0/LPLn__UdSPnSSPSdnPPQQRX))U)*^**U**U**U**U))T)*~**T**~**T**~))Q))w)*Q**Q**Q**Q**Q))Q))w)*Q))T)*~))U)*^**S)*~*`*_`*v*v**_&*f*Qf****}x**Qj**]**P{**P**]{**2{**w{**~{**P**]{**2D*T*qT*j*PD*j*6D*j*\,-U--V-T.UT..V..Q..U..U..V..U..V..U,- T.q. .. .. .. ,-W--ST.q.S..S..S..S,-U-{-V{--ST.q.S..U..V..S..V,V-0V-h-U..0r--P..P- - - -W{--_--\{--S{-- -.S*.T.S..S--P--V*.;.P;.T.V..P..V-- A--Sq..V..Q..U000U01S11U11S11U11S000T0111T1111T1111T11000Q00V01Q11Q11V11Q11V00V01Q11Q11V01111101S11S11S00]0 1T 11x1b1Tn11T11T01V11V000F1^F1R1rpR11^11^0-1_-151x511_11_0b1Yq11Y11Y11Y00R11R11 @00400T11V1111_45U5%5U%5/5U/55\55U55\55U45T5%5T%5F5TF55V55T55V55T45Q5%5Q%5P5QP55Q55Q55S55s55}%55S55}55S55P55st"%575P75F5st"1F5f5vs"1K5`5T`5b5tpb5f5Tq55Sq55Vq55|7 7U 77U77U7 7T 77T77T77U78U88U88U77T78V88T88V88T88V77Q78]88Q88]88Q88]77Q78]88Q88]88]77T78V88T88V88V77U7^8\88\K LU LWL_WLLULP_P$PU$POW_OWTWUTWW_LLP,LWL\LL\,LWLVLLV,LWLSLLS=LGLPLLP,L=L\,L=LV,L=LSLP_OPOW_TWW_qMMPLPSOPDUS\UOWSTWWSLL1LLPLLQ8MqMV8MqM\.MqM]NMXMPqMMP8MNMV8MNM\8MNM]MPSOP,RS\UUSV0VSW/WSMP_OP,R_\UU_V0V_W/W_MM p1OPQ p1MP\OP,R\\UU\V0V\W/W\MNVMNMNMNVMNMNMNPNONVNONNON!NONV!NON!NON8NONPyOO_RiR_RDU_\UV_5VV_4WOW_TWW_yOO#R,R#\UhU#yO{O0{OOPOOpOOPOOROPQ_OPQPOPkPpOPQpSPkPQkPyPp kPQp oPyPQyPPpyPQp}PPQPPpPPpPQp PPpPPpPQp PPpPPpPQpPPQPPpPPp PQp PPp!PPp$PQp$ PPp%PPp(PQp(PPQPPp)QEQPEQIQp"Q'Qp1$q""Q.Qp1$q"3QEQQ3QEQQ6QEQRiQQPQQppQRPpQRQQQPQQppQQPQRppQQRQQRQQRQQR\UU_iUUPvRRVvRR_RRPRU_UV_5VV_4WOW_TWW_RDS\DSGSPGSSwST\UU\UU0UU\RKS]KSSPSS~ST]UU]TUPRU0UV05VV04WOW0TWW0R SZ SSzhUUzhUU0 SSZUUZRRpRSXUUX_SS__SSz|_SSRSS~_SSz_SSzSS\SS}pSS@SS "!SS]TT0UV05VV0VV04WJW0TWW0WW0T T~UUP8VXV\VVVTT_UV_5VV_VV_4WJW_TWW_WW_^TpTPyTTPTTPTTPUUPUVVAVXVPiVVPVVPVVPVVVVVP4WIWPWWPWWVT2TP2TT]UUP5V@VP@VXV]XVzV0VV]VV]VVPTWW] TT_UU_XVzV_VV_TWW_ T3T 3T;TPTWgWPhWW_UUHUU0UU "!U4UU4UU4UUDU !U4UPJP P$PU$PJP_.PJPPOVOTpqPPqP0uVT0V0T0?0T0?0nPP PPSSPS,8P8HSHcTSSH\TpSH\ #!Tp #!vv #!vPUU U  S  P U U  S  P S  S      0  0 U S D UD g Sg u Uu  S U S U T V D TD a Va u Tu  V T V T Q Q P  ] + P+ C ]C D P ] S  SW u P \ v| v| $0 $+(  v $0 $+( ? v $0 $+( v $0 $+(  P PL V Uu | U U u@aUN'! $ &'!"^a'! $ &'!"O^PNQ^aQpUUPPpUU`lUlqSqrP`lTlrTUUTTQSQPUwwUw1PT]wTTWPQpVpwQwQV{0S8=S0 s $ &3$}") s $ &3$}"UVWUTS,AS&V,WV+PUVS,9S0 U V U V0 S TS S T S PP S TS S S S S U VU3UTUUUUU U!U!UkPP0000SU\UTSTQQRRXX@USSSS@TVTTVTVT_V@Q\3Q3\JQJ_\@{R{]R]RG]G^ R Z]Z_^@XX3X3XJXJ_X7PPP_JTPT__`hUhmU`USQUS`TVRTV`QQQQVRTVSQUS\\rV * Vg q  q V@Y YiPiV * V* 4 P4 VRVPVyS* q SN q U Z pZ ^ UR n Pn \ PD } S  P6 > P * U U T UT S U S U  U T TT V T V T  V T QT Q Q  QT ] } ] ]T _ S Sd  d  |  |d l Sl  S Sv  S S U  U Q  Q T  V1U1.U.:U:PU1T1.T.=T=PT1Q1SQ.S.AQACSCPQ10UP^P.^1_UU       9>ACFQxx| *)SX 05:@nOh"'3"'3TY}O[]dRV] 0 P P  0 P P {!!!"""{!!""`"h"p""""`"h"""%'0'9'.&5&B&G&c&c&_(e(l(v(((() )))* **`*f*{**D*D*I*Q*;+>+c+n+q++,,,-X.x.....,,- --.0.X...0111110000U2U2`2j2D3c3k3~333334%4,41464<4I4S455+5555q5w5{55777 8 888888s:}:::s:}:::::::::O<T<<<<<=>`>>@@@@BQC E0EFH HXHHHI;IEITIFGHHI;IEITIDGGHHI;IEITIQCChEpFH HXHHHIhEEXHHHIEpFHHdIdIxII_JJJJ|J|JJJJJJJJJJJJJJJpKpKuKwKyK~KKKKKKKKK,LWLLL0LWLLLWL\LL POPiSiSUUUUOWTWWMPOP,R\UUV5VW4WyOyOOOOP\PaPdPhPkP\PaPdPhPkPrPvPyPrPvPyPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPQQQQQQQQQQQQQQQQQQQQQQQRiSiSUUV5VV4W@WEWOWTW`WcWWUSeSiSiSiSSSSUS_S_SeSiSiSiSSSSiSqSSSSSTTUV8VV4W@WEWOWTW`WcWWTTTTUUUV8VV4W@WEWOWTW`WcWW T;TUUTW`WcWW T;TTW`WcWWUUUUUDUYYYYY0YYYZ ZUZaZZZ@[]^_`_`8`` aHaaa0b > I S pXP !X !` !h !X!!`!@!'a !"  `T - SE Sa S~ S S S S S `T. eTI `TW eTu T pT! T T T  U" Ts- UJ Ue U sx"!z U /U #! /U \ 0UY \2 ]L \Y ]z ] ]k"! ] ] ]G ]: 5^X ]Ui 5^ ^ @^ ^ _ ^ _  `5 _P#!_#!s!! ` a ` a# aN aalH#!| a b b b ?c bO&<#!-8#!= ?ch e @cY e ah"! !@4#! ah$ $j@ phO(#!e!r $j [kU 0j+ [k m `k6 `!% ,#!7  mS  mm  m  m "! "!  m  n  n  n4  nf  ,n "!  ,n  o  o  p @#!' #!;  p\  p{  p  p  p  9q  9q  q+  qL  qk  q  Mr  Mr  s  s"  tC  tb  9u  9u  \w  !  \w  y ! d0 yU {xd { { { F| F|D |m | } } \#! \ Q7 `F Qc ~ `"!  M = M Ճ*p!7 Ճ[ }  V V % % C k + + ] ] t! tG k  !!!   3+ 3S y  э! э P$#!#!3"!B Pg   `!!! ! !@!! ' Gd!R t ˓ ˓   , V (~ ( H H d, dT {z0#! {    ; W  "!"!"!"!"!"!"!"!#"!0"!6 Y @z @ h h Y Y  #( #? T 0 \!b@$o!(|    ! > Ѹi Ѹ    S S  S( SG Sa S S S     "- :'!A "Z [q 0+{ [ h ` h w p w! < J h ҹ B'! ҹ Z z`#!'! Z  m+  ` 6  mQ  j  pv    g 0!   a  a ! a#! ;! p2F! a! Wz! ! W! r! `! r! !  " 3" X" p"(!v" " " " " ## -;# Y# u# '!#h#!#'!# # 3# 3 $ 3&$ _A$ @O$ _k$ $ `$ !$'!$p#!$ $ $  %#!% .% F% 4Q% r% % % % % *% % & U& ;& W& f& & '& & '& & 0& & P' P' P8' Q' PO]' w' '#!'x#!''!''!'' S' S' T(@!(X !=( PTI(P !'h(v( |(` !(h !(p(@!(! p>(( {F( )!) p :) n J)c)))) ))))*/*C*X* |f* **** P|* Prl* ti* n +4+?+R+i++ U+8!++++ 0+@!+ , q],7,H, p], pm, {, l,,, ,,,,-*- s >-R-d-x- --- `-- - . .2.6=.W. k. qS}. m7. p.... o../ / }l)/p>s>> ~ I I SSK} p ppXXL P !P X !X ` !`  h !h X!X!X`!` @!@ 0@-'ap@,8``;`G~^U@mfa0*Hlw!*=$ Hh8ѠPK!O 'lib64/gems/ruby/ruby-lsapi-5.7/mkmf.lognu[have_library: checking for -lsocket... -------------------- no "gcc -o conftest -I/opt/cpanel/ea-ruby27/root/usr/include -I/opt/cpanel/ea-ruby27/root/usr/include/ruby/backward -I/opt/cpanel/ea-ruby27/root/usr/include -I. -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fPIC conftest.c -L. -L/opt/cpanel/ea-ruby27/root/usr/lib64 -L. -Wl,-rpath=/opt/cpanel/ea-ruby27/root/usr/lib64 -fstack-protector-strong -rdynamic -Wl,-export-dynamic -m64 -lruby -lm -lc" checked program was: /* begin */ 1: #include "ruby.h" 2: 3: int main(int argc, char **argv) 4: { 5: return !!argv[argc]; 6: } /* end */ "gcc -o conftest -I/opt/cpanel/ea-ruby27/root/usr/include -I/opt/cpanel/ea-ruby27/root/usr/include/ruby/backward -I/opt/cpanel/ea-ruby27/root/usr/include -I. -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fPIC conftest.c -L. -L/opt/cpanel/ea-ruby27/root/usr/lib64 -L. -Wl,-rpath=/opt/cpanel/ea-ruby27/root/usr/lib64 -fstack-protector-strong -rdynamic -Wl,-export-dynamic -m64 -lruby -lsocket -lm -lc" /usr/bin/ld: cannot find -lsocket collect2: error: ld returned 1 exit status checked program was: /* begin */ 1: #include "ruby.h" 2: 3: /*top*/ 4: extern int t(void); 5: int main(int argc, char **argv) 6: { 7: if (argc > 1000000) { 8: int (* volatile tp)(void)=(int (*)(void))&t; 9: printf("%d", (*tp)()); 10: } 11: 12: return !!argv[argc]; 13: } 14: 15: int t(void) { ; return 0; } /* end */ -------------------- PK!K%,share/gems/specifications/rack-2.2.4.gemspecnu[# -*- encoding: utf-8 -*- # stub: rack 2.2.4 ruby lib Gem::Specification.new do |s| s.name = "rack".freeze s.version = "2.2.4" s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= s.metadata = { "bug_tracker_uri" => "https://github.com/rack/rack/issues", "changelog_uri" => "https://github.com/rack/rack/blob/master/CHANGELOG.md", "documentation_uri" => "https://rubydoc.info/github/rack/rack", "source_code_uri" => "https://github.com/rack/rack" } if s.respond_to? :metadata= s.require_paths = ["lib".freeze] s.authors = ["Leah Neukirchen".freeze] s.date = "2022-06-30" s.description = "Rack provides a minimal, modular and adaptable interface for developing\nweb applications in Ruby. By wrapping HTTP requests and responses in\nthe simplest way possible, it unifies and distills the API for web\nservers, web frameworks, and software in between (the so-called\nmiddleware) into a single method call.\n".freeze s.email = "leah@vuxu.org".freeze s.executables = ["rackup".freeze] s.extra_rdoc_files = ["README.rdoc".freeze, "CHANGELOG.md".freeze, "CONTRIBUTING.md".freeze] s.files = ["CHANGELOG.md".freeze, "CONTRIBUTING.md".freeze, "README.rdoc".freeze, "bin/rackup".freeze] s.homepage = "https://github.com/rack/rack".freeze s.licenses = ["MIT".freeze] s.required_ruby_version = Gem::Requirement.new(">= 2.3.0".freeze) s.rubygems_version = "3.1.6".freeze s.summary = "A modular Ruby webserver interface.".freeze s.installed_by_version = "3.1.6" if s.respond_to? :installed_by_version if s.respond_to? :specification_version then s.specification_version = 4 end if s.respond_to? :add_runtime_dependency then s.add_development_dependency(%q.freeze, ["~> 5.0"]) s.add_development_dependency(%q.freeze, [">= 0"]) s.add_development_dependency(%q.freeze, [">= 0"]) s.add_development_dependency(%q.freeze, [">= 0"]) else s.add_dependency(%q.freeze, ["~> 5.0"]) s.add_dependency(%q.freeze, [">= 0"]) s.add_dependency(%q.freeze, [">= 0"]) s.add_dependency(%q.freeze, [">= 0"]) end end PK!io#0share/gems/specifications/ruby-lsapi-5.7.gemspecnu[# -*- encoding: utf-8 -*- # stub: ruby-lsapi 5.7 ruby lib # stub: ext/lsapi/extconf.rb Gem::Specification.new do |s| s.name = "ruby-lsapi".freeze s.version = "5.7" s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= s.require_paths = ["lib".freeze] s.authors = ["LiteSpeed Technologies Inc.".freeze] s.date = "2024-03-13" s.description = "This is a ruby extension for fast communication with LiteSpeed Web Server.".freeze s.email = "info@litespeedtech.com".freeze s.extensions = ["ext/lsapi/extconf.rb".freeze] s.extra_rdoc_files = ["README".freeze] s.files = ["README".freeze, "ext/lsapi/extconf.rb".freeze] s.homepage = "http://www.litespeedtech.com/".freeze s.rubygems_version = "3.1.6".freeze s.summary = "A ruby extension for fast communication with LiteSpeed Web Server.".freeze s.installed_by_version = "3.1.6" if s.respond_to? :installed_by_version end PK!)+UU%share/gems/gems/rack-2.2.4/bin/rackupnuȯ#!/usr/bin/env ruby # frozen_string_literal: true require "rack" Rack::Server.start PK!8 'share/gems/gems/rack-2.2.4/CHANGELOG.mdnu[# Changelog All notable changes to this project will be documented in this file. For info on how to format all future additions to this file please reference [Keep A Changelog](https://keepachangelog.com/en/1.0.0/). ## [2.2.4] - 2022-06-30 - Better support for lower case headers in `Rack::ETag` middleware. ([#1919](https://github.com/rack/rack/pull/1919), [@ioquatix](https://github.com/ioquatix)) - Use custom exception on params too deep error. ([#1838](https://github.com/rack/rack/pull/1838), [@simi](https://github.com/simi)) ## [2.2.3.1] - 2022-05-27 ### Security - [CVE-2022-30123] Fix shell escaping issue in Common Logger - [CVE-2022-30122] Restrict parsing of broken MIME attachments ## [2.2.3] - 2020-02-11 ### Security - [CVE-2020-8184] Only decode cookie values ## [2.2.2] - 2020-02-11 ### Fixed - Fix incorrect `Rack::Request#host` value. ([#1591](https://github.com/rack/rack/pull/1591), [@ioquatix](https://github.com/ioquatix)) - Revert `Rack::Handler::Thin` implementation. ([#1583](https://github.com/rack/rack/pull/1583), [@jeremyevans](https://github.com/jeremyevans)) - Double assignment is still needed to prevent an "unused variable" warning. ([#1589](https://github.com/rack/rack/pull/1589), [@kamipo](https://github.com/kamipo)) - Fix to handle same_site option for session pool. ([#1587](https://github.com/rack/rack/pull/1587), [@kamipo](https://github.com/kamipo)) ## [2.2.1] - 2020-02-09 ### Fixed - Rework `Rack::Request#ip` to handle empty `forwarded_for`. ([#1577](https://github.com/rack/rack/pull/1577), [@ioquatix](https://github.com/ioquatix)) ## [2.2.0] - 2020-02-08 ### SPEC Changes - `rack.session` request environment entry must respond to `to_hash` and return unfrozen Hash. ([@jeremyevans](https://github.com/jeremyevans)) - Request environment cannot be frozen. ([@jeremyevans](https://github.com/jeremyevans)) - CGI values in the request environment with non-ASCII characters must use ASCII-8BIT encoding. ([@jeremyevans](https://github.com/jeremyevans)) - Improve SPEC/lint relating to SERVER_NAME, SERVER_PORT and HTTP_HOST. ([#1561](https://github.com/rack/rack/pull/1561), [@ioquatix](https://github.com/ioquatix)) ### Added - `rackup` supports multiple `-r` options and will require all arguments. ([@jeremyevans](https://github.com/jeremyevans)) - `Server` supports an array of paths to require for the `:require` option. ([@khotta](https://github.com/khotta)) - `Files` supports multipart range requests. ([@fatkodima](https://github.com/fatkodima)) - `Multipart::UploadedFile` supports an IO-like object instead of using the filesystem, using `:filename` and `:io` options. ([@jeremyevans](https://github.com/jeremyevans)) - `Multipart::UploadedFile` supports keyword arguments `:path`, `:content_type`, and `:binary` in addition to positional arguments. ([@jeremyevans](https://github.com/jeremyevans)) - `Static` supports a `:cascade` option for calling the app if there is no matching file. ([@jeremyevans](https://github.com/jeremyevans)) - `Session::Abstract::SessionHash#dig`. ([@jeremyevans](https://github.com/jeremyevans)) - `Response.[]` and `MockResponse.[]` for creating instances using status, headers, and body. ([@ioquatix](https://github.com/ioquatix)) - Convenient cache and content type methods for `Rack::Response`. ([#1555](https://github.com/rack/rack/pull/1555), [@ioquatix](https://github.com/ioquatix)) ### Changed - `Request#params` no longer rescues EOFError. ([@jeremyevans](https://github.com/jeremyevans)) - `Directory` uses a streaming approach, significantly improving time to first byte for large directories. ([@jeremyevans](https://github.com/jeremyevans)) - `Directory` no longer includes a Parent directory link in the root directory index. ([@jeremyevans](https://github.com/jeremyevans)) - `QueryParser#parse_nested_query` uses original backtrace when reraising exception with new class. ([@jeremyevans](https://github.com/jeremyevans)) - `ConditionalGet` follows RFC 7232 precedence if both If-None-Match and If-Modified-Since headers are provided. ([@jeremyevans](https://github.com/jeremyevans)) - `.ru` files supports the `frozen-string-literal` magic comment. ([@eregon](https://github.com/eregon)) - Rely on autoload to load constants instead of requiring internal files, make sure to require 'rack' and not just 'rack/...'. ([@jeremyevans](https://github.com/jeremyevans)) - `Etag` will continue sending ETag even if the response should not be cached. ([@henm](https://github.com/henm)) - `Request#host_with_port` no longer includes a colon for a missing or empty port. ([@AlexWayfer](https://github.com/AlexWayfer)) - All handlers uses keywords arguments instead of an options hash argument. ([@ioquatix](https://github.com/ioquatix)) - `Files` handling of range requests no longer return a body that supports `to_path`, to ensure range requests are handled correctly. ([@jeremyevans](https://github.com/jeremyevans)) - `Multipart::Generator` only includes `Content-Length` for files with paths, and `Content-Disposition` `filename` if the `UploadedFile` instance has one. ([@jeremyevans](https://github.com/jeremyevans)) - `Request#ssl?` is true for the `wss` scheme (secure websockets). ([@jeremyevans](https://github.com/jeremyevans)) - `Rack::HeaderHash` is memoized by default. ([#1549](https://github.com/rack/rack/pull/1549), [@ioquatix](https://github.com/ioquatix)) - `Rack::Directory` allow directory traversal inside root directory. ([#1417](https://github.com/rack/rack/pull/1417), [@ThomasSevestre](https://github.com/ThomasSevestre)) - Sort encodings by server preference. ([#1184](https://github.com/rack/rack/pull/1184), [@ioquatix](https://github.com/ioquatix), [@wjordan](https://github.com/wjordan)) - Rework host/hostname/authority implementation in `Rack::Request`. `#host` and `#host_with_port` have been changed to correctly return IPv6 addresses formatted with square brackets, as defined by [RFC3986](https://tools.ietf.org/html/rfc3986#section-3.2.2). ([#1561](https://github.com/rack/rack/pull/1561), [@ioquatix](https://github.com/ioquatix)) - `Rack::Builder` parsing options on first `#\` line is deprecated. ([#1574](https://github.com/rack/rack/pull/1574), [@ioquatix](https://github.com/ioquatix)) ### Removed - `Directory#path` as it was not used and always returned nil. ([@jeremyevans](https://github.com/jeremyevans)) - `BodyProxy#each` as it was only needed to work around a bug in Ruby <1.9.3. ([@jeremyevans](https://github.com/jeremyevans)) - `URLMap::INFINITY` and `URLMap::NEGATIVE_INFINITY`, in favor of `Float::INFINITY`. ([@ch1c0t](https://github.com/ch1c0t)) - Deprecation of `Rack::File`. It will be deprecated again in rack 2.2 or 3.0. ([@rafaelfranca](https://github.com/rafaelfranca)) - Support for Ruby 2.2 as it is well past EOL. ([@ioquatix](https://github.com/ioquatix)) - Remove `Rack::Files#response_body` as the implementation was broken. ([#1153](https://github.com/rack/rack/pull/1153), [@ioquatix](https://github.com/ioquatix)) - Remove `SERVER_ADDR` which was never part of the original SPEC. ([#1573](https://github.com/rack/rack/pull/1573), [@ioquatix](https://github.com/ioquatix)) ### Fixed - `Directory` correctly handles root paths containing glob metacharacters. ([@jeremyevans](https://github.com/jeremyevans)) - `Cascade` uses a new response object for each call if initialized with no apps. ([@jeremyevans](https://github.com/jeremyevans)) - `BodyProxy` correctly delegates keyword arguments to the body object on Ruby 2.7+. ([@jeremyevans](https://github.com/jeremyevans)) - `BodyProxy#method` correctly handles methods delegated to the body object. ([@jeremyevans](https://github.com/jeremyevans)) - `Request#host` and `Request#host_with_port` handle IPv6 addresses correctly. ([@AlexWayfer](https://github.com/AlexWayfer)) - `Lint` checks when response hijacking that `rack.hijack` is called with a valid object. ([@jeremyevans](https://github.com/jeremyevans)) - `Response#write` correctly updates `Content-Length` if initialized with a body. ([@jeremyevans](https://github.com/jeremyevans)) - `CommonLogger` includes `SCRIPT_NAME` when logging. ([@Erol](https://github.com/Erol)) - `Utils.parse_nested_query` correctly handles empty queries, using an empty instance of the params class instead of a hash. ([@jeremyevans](https://github.com/jeremyevans)) - `Directory` correctly escapes paths in links. ([@yous](https://github.com/yous)) - `Request#delete_cookie` and related `Utils` methods handle `:domain` and `:path` options in same call. ([@jeremyevans](https://github.com/jeremyevans)) - `Request#delete_cookie` and related `Utils` methods do an exact match on `:domain` and `:path` options. ([@jeremyevans](https://github.com/jeremyevans)) - `Static` no longer adds headers when a gzipped file request has a 304 response. ([@chooh](https://github.com/chooh)) - `ContentLength` sets `Content-Length` response header even for bodies not responding to `to_ary`. ([@jeremyevans](https://github.com/jeremyevans)) - Thin handler supports options passed directly to `Thin::Controllers::Controller`. ([@jeremyevans](https://github.com/jeremyevans)) - WEBrick handler no longer ignores `:BindAddress` option. ([@jeremyevans](https://github.com/jeremyevans)) - `ShowExceptions` handles invalid POST data. ([@jeremyevans](https://github.com/jeremyevans)) - Basic authentication requires a password, even if the password is empty. ([@jeremyevans](https://github.com/jeremyevans)) - `Lint` checks response is array with 3 elements, per SPEC. ([@jeremyevans](https://github.com/jeremyevans)) - Support for using `:SSLEnable` option when using WEBrick handler. (Gregor Melhorn) - Close response body after buffering it when buffering. ([@ioquatix](https://github.com/ioquatix)) - Only accept `;` as delimiter when parsing cookies. ([@mrageh](https://github.com/mrageh)) - `Utils::HeaderHash#clear` clears the name mapping as well. ([@raxoft](https://github.com/raxoft)) - Support for passing `nil` `Rack::Files.new`, which notably fixes Rails' current `ActiveStorage::FileServer` implementation. ([@ioquatix](https://github.com/ioquatix)) ### Documentation - CHANGELOG updates. ([@aupajo](https://github.com/aupajo)) - Added [CONTRIBUTING](CONTRIBUTING.md). ([@dblock](https://github.com/dblock)) ## [2.1.2] - 2020-01-27 - Fix multipart parser for some files to prevent denial of service ([@aiomaster](https://github.com/aiomaster)) - Fix `Rack::Builder#use` with keyword arguments ([@kamipo](https://github.com/kamipo)) - Skip deflating in Rack::Deflater if Content-Length is 0 ([@jeremyevans](https://github.com/jeremyevans)) - Remove `SessionHash#transform_keys`, no longer needed ([@pavel](https://github.com/pavel)) - Add to_hash to wrap Hash and Session classes ([@oleh-demyanyuk](https://github.com/oleh-demyanyuk)) - Handle case where session id key is requested but missing ([@jeremyevans](https://github.com/jeremyevans)) ## [2.1.1] - 2020-01-12 - Remove `Rack::Chunked` from `Rack::Server` default middleware. ([#1475](https://github.com/rack/rack/pull/1475), [@ioquatix](https://github.com/ioquatix)) - Restore support for code relying on `SessionId#to_s`. ([@jeremyevans](https://github.com/jeremyevans)) ## [2.1.0] - 2020-01-10 ### Added - Add support for `SameSite=None` cookie value. ([@hennikul](https://github.com/hennikul)) - Add trailer headers. ([@eileencodes](https://github.com/eileencodes)) - Add MIME Types for video streaming. ([@styd](https://github.com/styd)) - Add MIME Type for WASM. ([@buildrtech](https://github.com/buildrtech)) - Add `Early Hints(103)` to status codes. ([@egtra](https://github.com/egtra)) - Add `Too Early(425)` to status codes. ([@y-yagi]((https://github.com/y-yagi))) - Add `Bandwidth Limit Exceeded(509)` to status codes. ([@CJKinni](https://github.com/CJKinni)) - Add method for custom `ip_filter`. ([@svcastaneda](https://github.com/svcastaneda)) - Add boot-time profiling capabilities to `rackup`. ([@tenderlove](https://github.com/tenderlove)) - Add multi mapping support for `X-Accel-Mappings` header. ([@yoshuki](https://github.com/yoshuki)) - Add `sync: false` option to `Rack::Deflater`. (Eric Wong) - Add `Builder#freeze_app` to freeze application and all middleware instances. ([@jeremyevans](https://github.com/jeremyevans)) - Add API to extract cookies from `Rack::MockResponse`. ([@petercline](https://github.com/petercline)) ### Changed - Don't propagate nil values from middleware. ([@ioquatix](https://github.com/ioquatix)) - Lazily initialize the response body and only buffer it if required. ([@ioquatix](https://github.com/ioquatix)) - Fix deflater zlib buffer errors on empty body part. ([@felixbuenemann](https://github.com/felixbuenemann)) - Set `X-Accel-Redirect` to percent-encoded path. ([@diskkid](https://github.com/diskkid)) - Remove unnecessary buffer growing when parsing multipart. ([@tainoe](https://github.com/tainoe)) - Expand the root path in `Rack::Static` upon initialization. ([@rosenfeld](https://github.com/rosenfeld)) - Make `ShowExceptions` work with binary data. ([@axyjo](https://github.com/axyjo)) - Use buffer string when parsing multipart requests. ([@janko-m](https://github.com/janko-m)) - Support optional UTF-8 Byte Order Mark (BOM) in config.ru. ([@mikegee](https://github.com/mikegee)) - Handle `X-Forwarded-For` with optional port. ([@dpritchett](https://github.com/dpritchett)) - Use `Time#httpdate` format for Expires, as proposed by RFC 7231. ([@nanaya](https://github.com/nanaya)) - Make `Utils.status_code` raise an error when the status symbol is invalid instead of `500`. ([@adambutler](https://github.com/adambutler)) - Rename `Request::SCHEME_WHITELIST` to `Request::ALLOWED_SCHEMES`. - Make `Multipart::Parser.get_filename` accept files with `+` in their name. ([@lucaskanashiro](https://github.com/lucaskanashiro)) - Add Falcon to the default handler fallbacks. ([@ioquatix](https://github.com/ioquatix)) - Update codebase to avoid string mutations in preparation for `frozen_string_literals`. ([@pat](https://github.com/pat)) - Change `MockRequest#env_for` to rely on the input optionally responding to `#size` instead of `#length`. ([@janko](https://github.com/janko)) - Rename `Rack::File` -> `Rack::Files` and add deprecation notice. ([@postmodern](https://github.com/postmodern)). - Prefer Base64 “strict encoding” for Base64 cookies. ([@ioquatix](https://github.com/ioquatix)) ### Removed - Remove `to_ary` from Response ([@tenderlove](https://github.com/tenderlove)) - Deprecate `Rack::Session::Memcache` in favor of `Rack::Session::Dalli` from dalli gem ([@fatkodima](https://github.com/fatkodima)) ### Fixed - Eliminate warnings for Ruby 2.7. ([@osamtimizer](https://github.com/osamtimizer])) ### Documentation - Update broken example in `Session::Abstract::ID` documentation. ([tonytonyjan](https://github.com/tonytonyjan)) - Add Padrino to the list of frameworks implementing Rack. ([@wikimatze](https://github.com/wikimatze)) - Remove Mongrel from the suggested server options in the help output. ([@tricknotes](https://github.com/tricknotes)) - Replace `HISTORY.md` and `NEWS.md` with `CHANGELOG.md`. ([@twitnithegirl](https://github.com/twitnithegirl)) - CHANGELOG updates. ([@drenmi](https://github.com/Drenmi), [@p8](https://github.com/p8)) ## [2.0.8] - 2019-12-08 ### Security - [[CVE-2019-16782](https://nvd.nist.gov/vuln/detail/CVE-2019-16782)] Prevent timing attacks targeted at session ID lookup. BREAKING CHANGE: Session ID is now a SessionId instance instead of a String. ([@tenderlove](https://github.com/tenderlove), [@rafaelfranca](https://github.com/rafaelfranca)) ## [1.6.12] - 2019-12-08 ### Security - [[CVE-2019-16782](https://nvd.nist.gov/vuln/detail/CVE-2019-16782)] Prevent timing attacks targeted at session ID lookup. BREAKING CHANGE: Session ID is now a SessionId instance instead of a String. ([@tenderlove](https://github.com/tenderlove), [@rafaelfranca](https://github.com/rafaelfranca)) ## [2.0.7] - 2019-04-02 ### Fixed - Remove calls to `#eof?` on Rack input in `Multipart::Parser`, as this breaks the specification. ([@matthewd](https://github.com/matthewd)) - Preserve forwarded IP addresses for trusted proxy chains. ([@SamSaffron](https://github.com/SamSaffron)) ## [2.0.6] - 2018-11-05 ### Fixed - [[CVE-2018-16470](https://nvd.nist.gov/vuln/detail/CVE-2018-16470)] Reduce buffer size of `Multipart::Parser` to avoid pathological parsing. ([@tenderlove](https://github.com/tenderlove)) - Fix a call to a non-existing method `#accepts_html` in the `ShowExceptions` middleware. ([@tomelm](https://github.com/tomelm)) - [[CVE-2018-16471](https://nvd.nist.gov/vuln/detail/CVE-2018-16471)] Whitelist HTTP and HTTPS schemes in `Request#scheme` to prevent a possible XSS attack. ([@PatrickTulskie](https://github.com/PatrickTulskie)) ## [2.0.5] - 2018-04-23 ### Fixed - Record errors originating from invalid UTF8 in `MethodOverride` middleware instead of breaking. ([@mclark](https://github.com/mclark)) ## [2.0.4] - 2018-01-31 ### Changed - Ensure the `Lock` middleware passes the original `env` object. ([@lugray](https://github.com/lugray)) - Improve performance of `Multipart::Parser` when uploading large files. ([@tompng](https://github.com/tompng)) - Increase buffer size in `Multipart::Parser` for better performance. ([@jkowens](https://github.com/jkowens)) - Reduce memory usage of `Multipart::Parser` when uploading large files. ([@tompng](https://github.com/tompng)) - Replace ConcurrentRuby dependency with native `Queue`. ([@devmchakan](https://github.com/devmchakan)) ### Fixed - Require the correct digest algorithm in the `ETag` middleware. ([@matthewd](https://github.com/matthewd)) ### Documentation - Update homepage links to use SSL. ([@hugoabonizio](https://github.com/hugoabonizio)) ## [2.0.3] - 2017-05-15 ### Changed - Ensure `env` values are ASCII 8-bit encoded. ([@eileencodes](https://github.com/eileencodes)) ### Fixed - Prevent exceptions when a class with mixins inherits from `Session::Abstract::ID`. ([@jnraine](https://github.com/jnraine)) ## [2.0.2] - 2017-05-08 ### Added - Allow `Session::Abstract::SessionHash#fetch` to accept a block with a default value. ([@yannvanhalewyn](https://github.com/yannvanhalewyn)) - Add `Builder#freeze_app` to freeze application and all middleware. ([@jeremyevans](https://github.com/jeremyevans)) ### Changed - Freeze default session options to avoid accidental mutation. ([@kirs](https://github.com/kirs)) - Detect partial hijack without hash headers. ([@devmchakan](https://github.com/devmchakan)) - Update tests to use MiniTest 6 matchers. ([@tonytonyjan](https://github.com/tonytonyjan)) - Allow 205 Reset Content responses to set a Content-Length, as RFC 7231 proposes setting this to 0. ([@devmchakan](https://github.com/devmchakan)) ### Fixed - Handle `NULL` bytes in multipart filenames. ([@casperisfine](https://github.com/casperisfine)) - Remove warnings due to miscapitalized global. ([@ioquatix](https://github.com/ioquatix)) - Prevent exceptions caused by a race condition on multi-threaded servers. ([@sophiedeziel](https://github.com/sophiedeziel)) - Add RDoc as an explicit depencency for `doc` group. ([@tonytonyjan](https://github.com/tonytonyjan)) - Record errors originating from `Multipart::Parser` in the `MethodOverride` middleware instead of letting them bubble up. ([@carlzulauf](https://github.com/carlzulauf)) - Remove remaining use of removed `Utils#bytesize` method from the `File` middleware. ([@brauliomartinezlm](https://github.com/brauliomartinezlm)) ### Removed - Remove `deflate` encoding support to reduce caching overhead. ([@devmchakan](https://github.com/devmchakan)) ### Documentation - Update broken example in `Deflater` documentation. ([@mwpastore](https://github.com/mwpastore)) ## [2.0.1] - 2016-06-30 ### Changed - Remove JSON as an explicit dependency. ([@mperham](https://github.com/mperham)) # History/News Archive Items below this line are from the previously maintained HISTORY.md and NEWS.md files. ## [2.0.0.rc1] 2016-05-06 - Rack::Session::Abstract::ID is deprecated. Please change to use Rack::Session::Abstract::Persisted ## [2.0.0.alpha] 2015-12-04 - First-party "SameSite" cookies. Browsers omit SameSite cookies from third-party requests, closing the door on many CSRF attacks. - Pass `same_site: true` (or `:strict`) to enable: response.set_cookie 'foo', value: 'bar', same_site: true or `same_site: :lax` to use Lax enforcement: response.set_cookie 'foo', value: 'bar', same_site: :lax - Based on version 7 of the Same-site Cookies internet draft: https://tools.ietf.org/html/draft-west-first-party-cookies-07 - Thanks to Ben Toews (@mastahyeti) and Bob Long (@bobjflong) for updating to drafts 5 and 7. - Add `Rack::Events` middleware for adding event based middleware: middleware that does not care about the response body, but only cares about doing work at particular points in the request / response lifecycle. - Add `Rack::Request#authority` to calculate the authority under which the response is being made (this will be handy for h2 pushes). - Add `Rack::Response::Helpers#cache_control` and `cache_control=`. Use this for setting cache control headers on your response objects. - Add `Rack::Response::Helpers#etag` and `etag=`. Use this for setting etag values on the response. - Introduce `Rack::Response::Helpers#add_header` to add a value to a multi-valued response header. Implemented in terms of other `Response#*_header` methods, so it's available to any response-like class that includes the `Helpers` module. - Add `Rack::Request#add_header` to match. - `Rack::Session::Abstract::ID` IS DEPRECATED. Please switch to `Rack::Session::Abstract::Persisted`. `Rack::Session::Abstract::Persisted` uses a request object rather than the `env` hash. - Pull `ENV` access inside the request object in to a module. This will help with legacy Request objects that are ENV based but don't want to inherit from Rack::Request - Move most methods on the `Rack::Request` to a module `Rack::Request::Helpers` and use public API to get values from the request object. This enables users to mix `Rack::Request::Helpers` in to their own objects so they can implement `(get|set|fetch|each)_header` as they see fit (for example a proxy object). - Files and directories with + in the name are served correctly. Rather than unescaping paths like a form, we unescape with a URI parser using `Rack::Utils.unescape_path`. Fixes #265 - Tempfiles are automatically closed in the case that there were too many posted. - Added methods for manipulating response headers that don't assume they're stored as a Hash. Response-like classes may include the Rack::Response::Helpers module if they define these methods: - Rack::Response#has_header? - Rack::Response#get_header - Rack::Response#set_header - Rack::Response#delete_header - Introduce Util.get_byte_ranges that will parse the value of the HTTP_RANGE string passed to it without depending on the `env` hash. `byte_ranges` is deprecated in favor of this method. - Change Session internals to use Request objects for looking up session information. This allows us to only allocate one request object when dealing with session objects (rather than doing it every time we need to manipulate cookies, etc). - Add `Rack::Request#initialize_copy` so that the env is duped when the request gets duped. - Added methods for manipulating request specific data. This includes data set as CGI parameters, and just any arbitrary data the user wants to associate with a particular request. New methods: - Rack::Request#has_header? - Rack::Request#get_header - Rack::Request#fetch_header - Rack::Request#each_header - Rack::Request#set_header - Rack::Request#delete_header - lib/rack/utils.rb: add a method for constructing "delete" cookie headers. This allows us to construct cookie headers without depending on the side effects of mutating a hash. - Prevent extremely deep parameters from being parsed. CVE-2015-3225 ## [1.6.1] 2015-05-06 - Fix CVE-2014-9490, denial of service attack in OkJson - Use a monotonic time for Rack::Runtime, if available - RACK_MULTIPART_LIMIT changed to RACK_MULTIPART_PART_LIMIT (RACK_MULTIPART_LIMIT is deprecated and will be removed in 1.7.0) ## [1.5.3] 2015-05-06 - Fix CVE-2014-9490, denial of service attack in OkJson - Backport bug fixes to 1.5 series ## [1.6.0] 2014-01-18 - Response#unauthorized? helper - Deflater now accepts an options hash to control compression on a per-request level - Builder#warmup method for app preloading - Request#accept_language method to extract HTTP_ACCEPT_LANGUAGE - Add quiet mode of rack server, rackup --quiet - Update HTTP Status Codes to RFC 7231 - Less strict header name validation according to RFC 2616 - SPEC updated to specify headers conform to RFC7230 specification - Etag correctly marks etags as weak - Request#port supports multiple x-http-forwarded-proto values - Utils#multipart_part_limit configures the maximum number of parts a request can contain - Default host to localhost when in development mode - Various bugfixes and performance improvements ## [1.5.2] 2013-02-07 - Fix CVE-2013-0263, timing attack against Rack::Session::Cookie - Fix CVE-2013-0262, symlink path traversal in Rack::File - Add various methods to Session for enhanced Rails compatibility - Request#trusted_proxy? now only matches whole strings - Add JSON cookie coder, to be default in Rack 1.6+ due to security concerns - URLMap host matching in environments that don't set the Host header fixed - Fix a race condition that could result in overwritten pidfiles - Various documentation additions ## [1.4.5] 2013-02-07 - Fix CVE-2013-0263, timing attack against Rack::Session::Cookie - Fix CVE-2013-0262, symlink path traversal in Rack::File ## [1.1.6, 1.2.8, 1.3.10] 2013-02-07 - Fix CVE-2013-0263, timing attack against Rack::Session::Cookie ## [1.5.1] 2013-01-28 - Rack::Lint check_hijack now conforms to other parts of SPEC - Added hash-like methods to Abstract::ID::SessionHash for compatibility - Various documentation corrections ## [1.5.0] 2013-01-21 - Introduced hijack SPEC, for before-response and after-response hijacking - SessionHash is no longer a Hash subclass - Rack::File cache_control parameter is removed, in place of headers options - Rack::Auth::AbstractRequest#scheme now yields strings, not symbols - Rack::Utils cookie functions now format expires in RFC 2822 format - Rack::File now has a default mime type - rackup -b 'run Rack::Files.new(".")', option provides command line configs - Rack::Deflater will no longer double encode bodies - Rack::Mime#match? provides convenience for Accept header matching - Rack::Utils#q_values provides splitting for Accept headers - Rack::Utils#best_q_match provides a helper for Accept headers - Rack::Handler.pick provides convenience for finding available servers - Puma added to the list of default servers (preferred over Webrick) - Various middleware now correctly close body when replacing it - Rack::Request#params is no longer persistent with only GET params - Rack::Request#update_param and #delete_param provide persistent operations - Rack::Request#trusted_proxy? now returns true for local unix sockets - Rack::Response no longer forces Content-Types - Rack::Sendfile provides local mapping configuration options - Rack::Utils#rfc2109 provides old netscape style time output - Updated HTTP status codes - Ruby 1.8.6 likely no longer passes tests, and is no longer fully supported ## [1.4.4, 1.3.9, 1.2.7, 1.1.5] 2013-01-13 - [SEC] Rack::Auth::AbstractRequest no longer symbolizes arbitrary strings - Fixed erroneous test case in the 1.3.x series ## [1.4.3] 2013-01-07 - Security: Prevent unbounded reads in large multipart boundaries ## [1.3.8] 2013-01-07 - Security: Prevent unbounded reads in large multipart boundaries ## [1.4.2] 2013-01-06 - Add warnings when users do not provide a session secret - Fix parsing performance for unquoted filenames - Updated URI backports - Fix URI backport version matching, and silence constant warnings - Correct parameter parsing with empty values - Correct rackup '-I' flag, to allow multiple uses - Correct rackup pidfile handling - Report rackup line numbers correctly - Fix request loops caused by non-stale nonces with time limits - Fix reloader on Windows - Prevent infinite recursions from Response#to_ary - Various middleware better conforms to the body close specification - Updated language for the body close specification - Additional notes regarding ECMA escape compatibility issues - Fix the parsing of multiple ranges in range headers - Prevent errors from empty parameter keys - Added PATCH verb to Rack::Request - Various documentation updates - Fix session merge semantics (fixes rack-test) - Rack::Static :index can now handle multiple directories - All tests now utilize Rack::Lint (special thanks to Lars Gierth) - Rack::File cache_control parameter is now deprecated, and removed by 1.5 - Correct Rack::Directory script name escaping - Rack::Static supports header rules for sophisticated configurations - Multipart parsing now works without a Content-Length header - New logos courtesy of Zachary Scott! - Rack::BodyProxy now explicitly defines #each, useful for C extensions - Cookies that are not URI escaped no longer cause exceptions ## [1.3.7] 2013-01-06 - Add warnings when users do not provide a session secret - Fix parsing performance for unquoted filenames - Updated URI backports - Fix URI backport version matching, and silence constant warnings - Correct parameter parsing with empty values - Correct rackup '-I' flag, to allow multiple uses - Correct rackup pidfile handling - Report rackup line numbers correctly - Fix request loops caused by non-stale nonces with time limits - Fix reloader on Windows - Prevent infinite recursions from Response#to_ary - Various middleware better conforms to the body close specification - Updated language for the body close specification - Additional notes regarding ECMA escape compatibility issues - Fix the parsing of multiple ranges in range headers ## [1.2.6] 2013-01-06 - Add warnings when users do not provide a session secret - Fix parsing performance for unquoted filenames ## [1.1.4] 2013-01-06 - Add warnings when users do not provide a session secret ## [1.4.1] 2012-01-22 - Alter the keyspace limit calculations to reduce issues with nested params - Add a workaround for multipart parsing where files contain unescaped "%" - Added Rack::Response::Helpers#method_not_allowed? (code 405) - Rack::File now returns 404 for illegal directory traversals - Rack::File now returns 405 for illegal methods (non HEAD/GET) - Rack::Cascade now catches 405 by default, as well as 404 - Cookies missing '--' no longer cause an exception to be raised - Various style changes and documentation spelling errors - Rack::BodyProxy always ensures to execute its block - Additional test coverage around cookies and secrets - Rack::Session::Cookie can now be supplied either secret or old_secret - Tests are no longer dependent on set order - Rack::Static no longer defaults to serving index files - Rack.release was fixed ## [1.4.0] 2011-12-28 - Ruby 1.8.6 support has officially been dropped. Not all tests pass. - Raise sane error messages for broken config.ru - Allow combining run and map in a config.ru - Rack::ContentType will not set Content-Type for responses without a body - Status code 205 does not send a response body - Rack::Response::Helpers will not rely on instance variables - Rack::Utils.build_query no longer outputs '=' for nil query values - Various mime types added - Rack::MockRequest now supports HEAD - Rack::Directory now supports files that contain RFC3986 reserved chars - Rack::File now only supports GET and HEAD requests - Rack::Server#start now passes the block to Rack::Handler::#run - Rack::Static now supports an index option - Added the Teapot status code - rackup now defaults to Thin instead of Mongrel (if installed) - Support added for HTTP_X_FORWARDED_SCHEME - Numerous bug fixes, including many fixes for new and alternate rubies ## [1.1.3] 2011-12-28 - Security fix. http://www.ocert.org/advisories/ocert-2011-003.html Further information here: http://jruby.org/2011/12/27/jruby-1-6-5-1 ## [1.3.5] 2011-10-17 - Fix annoying warnings caused by the backport in 1.3.4 ## [1.3.4] 2011-10-01 - Backport security fix from 1.9.3, also fixes some roundtrip issues in URI - Small documentation update - Fix an issue where BodyProxy could cause an infinite recursion - Add some supporting files for travis-ci ## [1.2.4] 2011-09-16 - Fix a bug with MRI regex engine to prevent XSS by malformed unicode ## [1.3.3] 2011-09-16 - Fix bug with broken query parameters in Rack::ShowExceptions - Rack::Request#cookies no longer swallows exceptions on broken input - Prevents XSS attacks enabled by bug in Ruby 1.8's regexp engine - Rack::ConditionalGet handles broken If-Modified-Since helpers ## [1.3.2] 2011-07-16 - Fix for Rails and rack-test, Rack::Utils#escape calls to_s ## [1.3.1] 2011-07-13 - Fix 1.9.1 support - Fix JRuby support - Properly handle $KCODE in Rack::Utils.escape - Make method_missing/respond_to behavior consistent for Rack::Lock, Rack::Auth::Digest::Request and Rack::Multipart::UploadedFile - Reenable passing rack.session to session middleware - Rack::CommonLogger handles streaming responses correctly - Rack::MockResponse calls close on the body object - Fix a DOS vector from MRI stdlib backport ## [1.2.3] 2011-05-22 - Pulled in relevant bug fixes from 1.3 - Fixed 1.8.6 support ## [1.3.0] 2011-05-22 - Various performance optimizations - Various multipart fixes - Various multipart refactors - Infinite loop fix for multipart - Test coverage for Rack::Server returns - Allow files with '..', but not path components that are '..' - rackup accepts handler-specific options on the command line - Request#params no longer merges POST into GET (but returns the same) - Use URI.encode_www_form_component instead. Use core methods for escaping. - Allow multi-line comments in the config file - Bug L#94 reported by Nikolai Lugovoi, query parameter unescaping. - Rack::Response now deletes Content-Length when appropriate - Rack::Deflater now supports streaming - Improved Rack::Handler loading and searching - Support for the PATCH verb - env['rack.session.options'] now contains session options - Cookies respect renew - Session middleware uses SecureRandom.hex ## [1.2.2, 1.1.2] 2011-03-13 - Security fix in Rack::Auth::Digest::MD5: when authenticator returned nil, permission was granted on empty password. ## [1.2.1] 2010-06-15 - Make CGI handler rewindable - Rename spec/ to test/ to not conflict with SPEC on lesser operating systems ## [1.2.0] 2010-06-13 - Removed Camping adapter: Camping 2.0 supports Rack as-is - Removed parsing of quoted values - Add Request.trace? and Request.options? - Add mime-type for .webm and .htc - Fix HTTP_X_FORWARDED_FOR - Various multipart fixes - Switch test suite to bacon ## [1.1.0] 2010-01-03 - Moved Auth::OpenID to rack-contrib. - SPEC change that relaxes Lint slightly to allow subclasses of the required types - SPEC change to document rack.input binary mode in greator detail - SPEC define optional rack.logger specification - File servers support X-Cascade header - Imported Config middleware - Imported ETag middleware - Imported Runtime middleware - Imported Sendfile middleware - New Logger and NullLogger middlewares - Added mime type for .ogv and .manifest. - Don't squeeze PATH_INFO slashes - Use Content-Type to determine POST params parsing - Update Rack::Utils::HTTP_STATUS_CODES hash - Add status code lookup utility - Response should call #to_i on the status - Add Request#user_agent - Request#host knows about forwarded host - Return an empty string for Request#host if HTTP_HOST and SERVER_NAME are both missing - Allow MockRequest to accept hash params - Optimizations to HeaderHash - Refactored rackup into Rack::Server - Added Utils.build_nested_query to complement Utils.parse_nested_query - Added Utils::Multipart.build_multipart to complement Utils::Multipart.parse_multipart - Extracted set and delete cookie helpers into Utils so they can be used outside Response - Extract parse_query and parse_multipart in Request so subclasses can change their behavior - Enforce binary encoding in RewindableInput - Set correct external_encoding for handlers that don't use RewindableInput ## [1.0.1] 2009-10-18 - Bump remainder of rack.versions. - Support the pure Ruby FCGI implementation. - Fix for form names containing "=": split first then unescape components - Fixes the handling of the filename parameter with semicolons in names. - Add anchor to nested params parsing regexp to prevent stack overflows - Use more compatible gzip write api instead of "<<". - Make sure that Reloader doesn't break when executed via ruby -e - Make sure WEBrick respects the :Host option - Many Ruby 1.9 fixes. ## [1.0.0] 2009-04-25 - SPEC change: Rack::VERSION has been pushed to [1,0]. - SPEC change: header values must be Strings now, split on "\n". - SPEC change: Content-Length can be missing, in this case chunked transfer encoding is used. - SPEC change: rack.input must be rewindable and support reading into a buffer, wrap with Rack::RewindableInput if it isn't. - SPEC change: rack.session is now specified. - SPEC change: Bodies can now additionally respond to #to_path with a filename to be served. - NOTE: String bodies break in 1.9, use an Array consisting of a single String instead. - New middleware Rack::Lock. - New middleware Rack::ContentType. - Rack::Reloader has been rewritten. - Major update to Rack::Auth::OpenID. - Support for nested parameter parsing in Rack::Response. - Support for redirects in Rack::Response. - HttpOnly cookie support in Rack::Response. - The Rakefile has been rewritten. - Many bugfixes and small improvements. ## [0.9.1] 2009-01-09 - Fix directory traversal exploits in Rack::File and Rack::Directory. ## [0.9] 2009-01-06 - Rack is now managed by the Rack Core Team. - Rack::Lint is stricter and follows the HTTP RFCs more closely. - Added ConditionalGet middleware. - Added ContentLength middleware. - Added Deflater middleware. - Added Head middleware. - Added MethodOverride middleware. - Rack::Mime now provides popular MIME-types and their extension. - Mongrel Header now streams. - Added Thin handler. - Official support for swiftiplied Mongrel. - Secure cookies. - Made HeaderHash case-preserving. - Many bugfixes and small improvements. ## [0.4] 2008-08-21 - New middleware, Rack::Deflater, by Christoffer Sawicki. - OpenID authentication now needs ruby-openid 2. - New Memcache sessions, by blink. - Explicit EventedMongrel handler, by Joshua Peek - Rack::Reloader is not loaded in rackup development mode. - rackup can daemonize with -D. - Many bugfixes, especially for pool sessions, URLMap, thread safety and tempfile handling. - Improved tests. - Rack moved to Git. ## [0.3] 2008-02-26 - LiteSpeed handler, by Adrian Madrid. - SCGI handler, by Jeremy Evans. - Pool sessions, by blink. - OpenID authentication, by blink. - :Port and :File options for opening FastCGI sockets, by blink. - Last-Modified HTTP header for Rack::File, by blink. - Rack::Builder#use now accepts blocks, by Corey Jewett. (See example/protectedlobster.ru) - HTTP status 201 can contain a Content-Type and a body now. - Many bugfixes, especially related to Cookie handling. ## [0.2] 2007-05-16 - HTTP Basic authentication. - Cookie Sessions. - Static file handler. - Improved Rack::Request. - Improved Rack::Response. - Added Rack::ShowStatus, for better default error messages. - Bug fixes in the Camping adapter. - Removed Rails adapter, was too alpha. ## [0.1] 2007-03-03 PK!12ff-share/gems/gems/rack-2.2.4/example/lobster.runu[# frozen_string_literal: true require 'rack/lobster' use Rack::ShowExceptions run Rack::Lobster.new PK!Z6share/gems/gems/rack-2.2.4/example/protectedlobster.rbnu[# frozen_string_literal: true require 'rack' require 'rack/lobster' lobster = Rack::Lobster.new protected_lobster = Rack::Auth::Basic.new(lobster) do |username, password| Rack::Utils.secure_compare('secret', password) end protected_lobster.realm = 'Lobster 2.0' pretty_protected_lobster = Rack::ShowStatus.new(Rack::ShowExceptions.new(protected_lobster)) Rack::Server.start app: pretty_protected_lobster, Port: 9292 PK!P&K6share/gems/gems/rack-2.2.4/example/protectedlobster.runu[# frozen_string_literal: true require 'rack/lobster' use Rack::ShowExceptions use Rack::Auth::Basic, "Lobster 2.0" do |username, password| Rack::Utils.secure_compare('secret', password) end run Rack::Lobster.new PK!$'share/gems/gems/rack-2.2.4/rack.gemspecnu[# frozen_string_literal: true require_relative 'lib/rack/version' Gem::Specification.new do |s| s.name = "rack" s.version = Rack::RELEASE s.platform = Gem::Platform::RUBY s.summary = "A modular Ruby webserver interface." s.license = "MIT" s.description = <<~EOF Rack provides a minimal, modular and adaptable interface for developing web applications in Ruby. By wrapping HTTP requests and responses in the simplest way possible, it unifies and distills the API for web servers, web frameworks, and software in between (the so-called middleware) into a single method call. EOF s.files = Dir['{bin/*,contrib/*,example/*,lib/**/*}'] + %w(MIT-LICENSE rack.gemspec Rakefile README.rdoc SPEC.rdoc) s.bindir = 'bin' s.executables << 'rackup' s.require_path = 'lib' s.extra_rdoc_files = ['README.rdoc', 'CHANGELOG.md', 'CONTRIBUTING.md'] s.author = 'Leah Neukirchen' s.email = 'leah@vuxu.org' s.homepage = 'https://github.com/rack/rack' s.required_ruby_version = '>= 2.3.0' s.metadata = { "bug_tracker_uri" => "https://github.com/rack/rack/issues", "changelog_uri" => "https://github.com/rack/rack/blob/master/CHANGELOG.md", "documentation_uri" => "https://rubydoc.info/github/rack/rack", "source_code_uri" => "https://github.com/rack/rack" } s.add_development_dependency 'minitest', "~> 5.0" s.add_development_dependency 'minitest-sprint' s.add_development_dependency 'minitest-global_expectations' s.add_development_dependency 'rake' end PK!gs.s.&share/gems/gems/rack-2.2.4/README.rdocnu[= \Rack, a modular Ruby webserver interface {rack powers web applications}[https://rack.github.io/] {CircleCI}[https://circleci.com/gh/rack/rack] {Gem Version}[http://badge.fury.io/rb/rack] {SemVer Stability}[https://dependabot.com/compatibility-score.html?dependency-name=rack&package-manager=bundler&version-scheme=semver] {Inline docs}[http://inch-ci.org/github/rack/rack] \Rack provides a minimal, modular, and adaptable interface for developing web applications in Ruby. By wrapping HTTP requests and responses in the simplest way possible, it unifies and distills the API for web servers, web frameworks, and software in between (the so-called middleware) into a single method call. The exact details of this are described in the \Rack specification, which all \Rack applications should conform to. == Supported web servers The included *handlers* connect all kinds of web servers to \Rack: * WEBrick[https://github.com/ruby/webrick] * FCGI * CGI * SCGI * LiteSpeed[https://www.litespeedtech.com/] * Thin[https://rubygems.org/gems/thin] These web servers include \Rack handlers in their distributions: * Agoo[https://github.com/ohler55/agoo] * Falcon[https://github.com/socketry/falcon] * Iodine[https://github.com/boazsegev/iodine] * {NGINX Unit}[https://unit.nginx.org/] * {Phusion Passenger}[https://www.phusionpassenger.com/] (which is mod_rack for Apache and for nginx) * Puma[https://puma.io/] * Unicorn[https://yhbt.net/unicorn/] * uWSGI[https://uwsgi-docs.readthedocs.io/en/latest/] Any valid \Rack app will run the same on all these handlers, without changing anything. == Supported web frameworks These frameworks and many others support the \Rack API: * Camping[http://www.ruby-camping.com/] * Coset[http://leahneukirchen.org/repos/coset/] * Hanami[https://hanamirb.org/] * Padrino[http://padrinorb.com/] * Ramaze[http://ramaze.net/] * Roda[https://github.com/jeremyevans/roda] * {Ruby on Rails}[https://rubyonrails.org/] * Rum[https://github.com/leahneukirchen/rum] * Sinatra[http://sinatrarb.com/] * Utopia[https://github.com/socketry/utopia] * WABuR[https://github.com/ohler55/wabur] == Available middleware shipped with \Rack Between the server and the framework, \Rack can be customized to your applications needs using middleware. \Rack itself ships with the following middleware: * Rack::Chunked, for streaming responses using chunked encoding. * Rack::CommonLogger, for creating Apache-style logfiles. * Rack::ConditionalGet, for returning not modified responses when the response has not changed. * Rack::Config, for modifying the environment before processing the request. * Rack::ContentLength, for setting Content-Length header based on body size. * Rack::ContentType, for setting default Content-Type header for responses. * Rack::Deflater, for compressing responses with gzip. * Rack::ETag, for setting ETag header on string bodies. * Rack::Events, for providing easy hooks when a request is received and when the response is sent. * Rack::Files, for serving static files. * Rack::Head, for returning an empty body for HEAD requests. * Rack::Lint, for checking conformance to the \Rack API. * Rack::Lock, for serializing requests using a mutex. * Rack::Logger, for setting a logger to handle logging errors. * Rack::MethodOverride, for modifying the request method based on a submitted parameter. * Rack::Recursive, for including data from other paths in the application, and for performing internal redirects. * Rack::Reloader, for reloading files if they have been modified. * Rack::Runtime, for including a response header with the time taken to process the request. * Rack::Sendfile, for working with web servers that can use optimized file serving for file system paths. * Rack::ShowException, for catching unhandled exceptions and presenting them in a nice and helpful way with clickable backtrace. * Rack::ShowStatus, for using nice error pages for empty client error responses. * Rack::Static, for more configurable serving of static files. * Rack::TempfileReaper, for removing temporary files creating during a request. All these components use the same interface, which is described in detail in the \Rack specification. These optional components can be used in any way you wish. == Convenience If you want to develop outside of existing frameworks, implement your own ones, or develop middleware, \Rack provides many helpers to create \Rack applications quickly and without doing the same web stuff all over: * Rack::Request, which also provides query string parsing and multipart handling. * Rack::Response, for convenient generation of HTTP replies and cookie handling. * Rack::MockRequest and Rack::MockResponse for efficient and quick testing of \Rack application without real HTTP round-trips. * Rack::Cascade, for trying additional \Rack applications if an application returns a not found or method not supported response. * Rack::Directory, for serving files under a given directory, with directory indexes. * Rack::MediaType, for parsing Content-Type headers. * Rack::Mime, for determining Content-Type based on file extension. * Rack::RewindableInput, for making any IO object rewindable, using a temporary file buffer. * Rack::URLMap, to route to multiple applications inside the same process. == rack-contrib The plethora of useful middleware created the need for a project that collects fresh \Rack middleware. rack-contrib includes a variety of add-on components for \Rack and it is easy to contribute new modules. * https://github.com/rack/rack-contrib == rackup rackup is a useful tool for running \Rack applications, which uses the Rack::Builder DSL to configure middleware and build up applications easily. rackup automatically figures out the environment it is run in, and runs your application as FastCGI, CGI, or WEBrick---all from the same configuration. == Quick start Try the lobster! Either with the embedded WEBrick starter: ruby -Ilib lib/rack/lobster.rb Or with rackup: bin/rackup -Ilib example/lobster.ru By default, the lobster is found at http://localhost:9292. == Installing with RubyGems A Gem of \Rack is available at {rubygems.org}[https://rubygems.org/gems/rack]. You can install it with: gem install rack == Usage You should require the library: require 'rack' \Rack uses autoload to automatically load other files \Rack ships with on demand, so you should not need require paths under +rack+. If you require paths under +rack+ without requiring +rack+ itself, things may not work correctly. == Configuration Several parameters can be modified on Rack::Utils to configure \Rack behaviour. e.g: Rack::Utils.key_space_limit = 128 === key_space_limit The default number of bytes to allow all parameters keys in a given parameter hash to take up. Does not affect nested parameter hashes, so doesn't actually prevent an attacker from using more than this many bytes for parameter keys. Defaults to 65536 characters. === param_depth_limit The maximum amount of nesting allowed in parameters. For example, if set to 3, this query string would be allowed: ?a[b][c]=d but this query string would not be allowed: ?a[b][c][d]=e Limiting the depth prevents a possible stack overflow when parsing parameters. Defaults to 100. === multipart_part_limit The maximum number of parts a request can contain. Accepting too many part can lead to the server running out of file handles. The default is 128, which means that a single request can't upload more than 128 files at once. Set to 0 for no limit. Can also be set via the +RACK_MULTIPART_PART_LIMIT+ environment variable. == Changelog See {CHANGELOG.md}[https://github.com/rack/rack/blob/master/CHANGELOG.md]. == Contributing See {CONTRIBUTING.md}[https://github.com/rack/rack/blob/master/CONTRIBUTING.md]. == Contact Please post bugs, suggestions and patches to the bug tracker at {issues}[https://github.com/rack/rack/issues]. Please post security related bugs and suggestions to the core team at or rack-core@googlegroups.com. This list is not public. Due to wide usage of the library, it is strongly preferred that we manage timing in order to provide viable patches at the time of disclosure. Your assistance in this matter is greatly appreciated. Mailing list archives are available at . Git repository (send Git patches to the mailing list): * https://github.com/rack/rack You are also welcome to join the #rack channel on irc.freenode.net. == Thanks The \Rack Core Team, consisting of * Aaron Patterson (tenderlove[https://github.com/tenderlove]) * Samuel Williams (ioquatix[https://github.com/ioquatix]) * Jeremy Evans (jeremyevans[https://github.com/jeremyevans]) * Eileen Uchitelle (eileencodes[https://github.com/eileencodes]) * Matthew Draper (matthewd[https://github.com/matthewd]) * Rafael França (rafaelfranca[https://github.com/rafaelfranca]) and the \Rack Alumni * Ryan Tomayko (rtomayko[https://github.com/rtomayko]) * Scytrin dai Kinthra (scytrin[https://github.com/scytrin]) * Leah Neukirchen (leahneukirchen[https://github.com/leahneukirchen]) * James Tucker (raggi[https://github.com/raggi]) * Josh Peek (josh[https://github.com/josh]) * José Valim (josevalim[https://github.com/josevalim]) * Michael Fellinger (manveru[https://github.com/manveru]) * Santiago Pastorino (spastorino[https://github.com/spastorino]) * Konstantin Haase (rkh[https://github.com/rkh]) would like to thank: * Adrian Madrid, for the LiteSpeed handler. * Christoffer Sawicki, for the first Rails adapter and Rack::Deflater. * Tim Fletcher, for the HTTP authentication code. * Luc Heinrich for the Cookie sessions, the static file handler and bugfixes. * Armin Ronacher, for the logo and racktools. * Alex Beregszaszi, Alexander Kahn, Anil Wadghule, Aredridel, Ben Alpert, Dan Kubb, Daniel Roethlisberger, Matt Todd, Tom Robinson, Phil Hagelberg, S. Brent Faulkner, Bosko Milekic, Daniel Rodríguez Troitiño, Genki Takiuchi, Geoffrey Grosenbach, Julien Sanchez, Kamal Fariz Mahyuddin, Masayoshi Takahashi, Patrick Aljordm, Mig, Kazuhiro Nishiyama, Jon Bardin, Konstantin Haase, Larry Siden, Matias Korhonen, Sam Ruby, Simon Chiang, Tim Connor, Timur Batyrshin, and Zach Brock for bug fixing and other improvements. * Eric Wong, Hongli Lai, Jeremy Kemper for their continuous support and API improvements. * Yehuda Katz and Carl Lerche for refactoring rackup. * Brian Candler, for Rack::ContentType. * Graham Batty, for improved handler loading. * Stephen Bannasch, for bug reports and documentation. * Gary Wright, for proposing a better Rack::Response interface. * Jonathan Buch, for improvements regarding Rack::Response. * Armin Röhrl, for tracking down bugs in the Cookie generator. * Alexander Kellett for testing the Gem and reviewing the announcement. * Marcus Rückert, for help with configuring and debugging lighttpd. * The WSGI team for the well-done and documented work they've done and \Rack builds up on. * All bug reporters and patch contributors not mentioned above. == Links \Rack:: Official \Rack repositories:: \Rack Bug Tracking:: rack-devel mailing list:: == License \Rack is released under the {MIT License}[https://opensource.org/licenses/MIT]. PK!L+share/gems/gems/rack-2.2.4/contrib/rdoc.cssnu[/* Forked from the Darkfish templates rdoc.css file, much hacked, probably * imperfect */ html { max-width: 960px; margin: 0 auto; } body { font: 14px "Helvetica Neue", Helvetica, Tahoma, sans-serif; } body.file-popup { font-size: 90%; margin-left: 0; } h1 { color: #4183C4; } :link, :visited { color: #4183C4; text-decoration: none; } :link:hover, :visited:hover { border-bottom: 1px dotted #4183C4; } pre, pre.description { font: 12px Monaco,"Courier New","DejaVu Sans Mono","Bitstream Vera Sans Mono",monospace; padding: 1em; overflow: auto; line-height: 1.4; } /* @group Generic Classes */ .initially-hidden { display: none; } #search-field { width: 98%; } .missing-docs { font-size: 120%; background: white url(images/wrench_orange.png) no-repeat 4px center; color: #ccc; line-height: 2em; border: 1px solid #d00; opacity: 1; text-indent: 24px; letter-spacing: 3px; font-weight: bold; -webkit-border-radius: 5px; -moz-border-radius: 5px; } .target-section { border: 2px solid #dcce90; border-left-width: 8px; background: #fff3c2; } /* @end */ /* @group Index Page, Standalone file pages */ .indexpage ul { line-height: 160%; list-style: none; } .indexpage ul :link, .indexpage ul :visited { font-size: 16px; } .indexpage li { padding-left: 20px; } .indexpage ul > li { background: url(images/bullet_black.png) no-repeat left 4px; } .indexpage li.method { background: url(images/plugin.png) no-repeat left 4px; } .indexpage li.module { background: url(images/package.png) no-repeat left 4px; } .indexpage li.class { background: url(images/ruby.png) no-repeat left 4px; } .indexpage li.file { background: url(images/page_white_text.png) no-repeat left 4px; } .indexpage li li { background: url(images/tag_blue.png) no-repeat left 4px; } .indexpage li .toc-toggle { width: 16px; height: 16px; background: url(images/add.png) no-repeat; } .indexpage li .toc-toggle.open { background: url(images/delete.png) no-repeat; } /* @end */ /* @group Top-Level Structure */ .project-section, #file-metadata, #class-metadata { display: block; background: #f5f5f5; margin-bottom: 1em; padding: 0.5em; } .project-section h3, #file-metadata h3, #class-metadata h3 { margin: 0; } #metadata { float: left; width: 280px; } #documentation { margin: 2em 1em 2em 300px; } #validator-badges { clear: both; margin: 1em 1em 2em; font-size: smaller; } /* @end */ /* @group Metadata Section */ #metadata ul, #metadata dl, #metadata p { padding: 0px; list-style: none; } dl.svninfo { color: #666; margin: 0; } dl.svninfo dt { font-weight: bold; } ul.link-list li { white-space: nowrap; } ul.link-list .type { font-size: 8px; text-transform: uppercase; color: white; background: #969696; } /* @end */ /* @group Documentation Section */ .note-list { margin: 8px 0; } .label-list { margin: 8px 1.5em; border: 1px solid #ccc; } .description .label-list { font-size: 14px; } .note-list dt { font-weight: bold; } .note-list dd { } .label-list dt { font-weight: bold; background: #ddd; } .label-list dd { } .label-list dd + dt, .note-list dd + dt { margin-top: 0.7em; } #documentation .section { font-size: 90%; } #documentation h2.section-header { color: #333; font-size: 175%; } .documentation-section-title { position: relative; } .documentation-section-title .section-click-top { position: absolute; top: 6px; right: 12px; font-size: 10px; visibility: hidden; } .documentation-section-title:hover .section-click-top { visibility: visible; } #documentation h3.section-header { color: #333; font-size: 150%; } #constants-list > dl, #attributes-list > dl { margin: 1em 0 2em; border: 0; } #constants-list > dl dt, #attributes-list > dl dt { font-weight: bold; font-family: Monaco, "Andale Mono"; background: inherit; } #constants-list > dl dt a, #attributes-list > dl dt a { color: inherit; } #constants-list > dl dd, #attributes-list > dl dd { margin: 0 0 1em 0; color: #666; } .documentation-section h2 { position: relative; } .documentation-section h2 a { position: absolute; top: 8px; right: 10px; font-size: 12px; color: #9b9877; visibility: hidden; } .documentation-section h2:hover a { visibility: visible; } /* @group Method Details */ #documentation .method-source-code { display: none; } #documentation .method-detail { margin: 0.2em 0.2em; padding: 0.5em; } #documentation .method-detail:hover { background-color: #f5f5f5; } #documentation .method-heading { cursor: pointer; position: relative; font-size: 125%; line-height: 125%; font-weight: bold; color: #333; background: url(images/brick.png) no-repeat left bottom; padding-left: 20px; } #documentation .method-heading :link, #documentation .method-heading :visited { color: inherit; } #documentation .method-click-advice { position: absolute; right: 5px; font-size: 10px; color: #aaa; visibility: hidden; background: url(images/zoom.png) no-repeat right 5px; padding-right: 20px; overflow: show; } #documentation .method-heading:hover .method-click-advice { visibility: visible; } #documentation .method-alias .method-heading { color: #666; background: url(images/brick_link.png) no-repeat left bottom; } #documentation .method-description, #documentation .aliases { margin: 0 20px; color: #666; } #documentation .method-description p, #documentation .aliases p { line-height: 1.2em; } #documentation .aliases { font-style: italic; cursor: default; } #documentation .method-description p { margin-bottom: 0.5em; } #documentation .method-description ul { margin-left: 1.5em; } #documentation .attribute-method-heading { background: url(images/tag_green.png) no-repeat left bottom; } #documentation #attribute-method-details .method-detail:hover { background-color: transparent; cursor: default; } #documentation .attribute-access-type { font-size: 60%; text-transform: uppercase; vertical-align: super; } .method-section .method-source-code { background: white; } /* @group Source Code */ .ruby-constant .ruby-keyword .ruby-ivar .ruby-operator .ruby-identifier .ruby-node .ruby-comment .ruby-regexp .ruby-value { background: transparent; } /* Thanks GitHub!!! */ .ruby-constant { color: #458; font-weight: bold; } .ruby-keyword { color: black; font-weight: bold; } .ruby-ivar { color: teal; } .ruby-operator { color: #000; } .ruby-identifier { color: black; } .ruby-node { color: red; } .ruby-comment { color: #998; font-weight: bold; } .ruby-regexp { color: #009926; } .ruby-value { color: #099; } .ruby-string { color: red; } /* @group search results */ #search-section .section-header { margin: 0; padding: 0; } #search-results { width: 100%; list-style: none; margin: 0; padding: 0; } #search-results h1 { font-size: 1em; font-weight: normal; text-shadow: none; } #search-results .current { background: #eee; } #search-results li { list-style: none; line-height: 1em; padding: 0.5em; border-bottom: 1px solid black; } #search-results .search-namespace { font-weight: bold; } #search-results li em { background: yellow; font-style: normal; } #search-results pre { margin: 0.5em; } PK!qsAA0share/gems/gems/rack-2.2.4/contrib/rack_logo.svgnu[ PK!1X_._.+share/gems/gems/rack-2.2.4/contrib/rack.svgnu[ image/svg+xml PK!Nź\\+share/gems/gems/rack-2.2.4/contrib/rack.pngnu[PNG  IHDR@@e6sRGBbKGD pHYs B(xtIME ,+( IDATxyyhB#mɎ96ƾ %8q9J;n%Zw>;ݑ;#؉LNDxBF 1k@4cʩ{nIT "\\N|pvu7p7-cߔThՄNU7 (V a}v$o0e(""}v4$x_@QvLe_#AtVE9.Q1?F0:wZ]Jhzm\BEʫ 9MjpQ]P.lEC-B"L{.`^NbB*nbh9("chl9%2c Q<)""T23Ż+>Iו%wcqnzHP]1KѴիn]CDD$u^MzC8BiYZ,"" ^fZT&~2Vo~5VQ9ykiӜWOLZa-"Ü4O0TtԎ@cf>R#At}ʌՊn3.~ů:3%WYLe^EFՋN3"~:s43cih\CuF-ИmN-"Rf %p!yI\j&62VϏ""RUTff MXfhգNrAfLCNX}\'cx7kttUU} uGX+Иg9""'H73?p53Ke^M;k9 CJ33v斴h\E:ozS*"1$VB 4I&{_; |S9=S" `!2<~\%}{N/ QI\=U`~p#D8M9A4zթڐDk""`4!Dvl!9㌈Afk)cD$)r+pJzS"r{53V'zwwよTiyj Rȉȟu*иj+HxUjʑ[hE(&j$gSV,SDN|!f9"2nZFH?խctb."` -3~P܇HR ' j&6*ШZD*ÿ"uc6-cƚ ]7Vt@,$2c .u2V|CINHxuy>`D]ɌU;a>y{+|{?Y"YƪR'[13V@$AƯ5Kff9oZ3Az>v3*۲2,D8[VNh7}m*CXAuRGѵwRHgAcuU5:aH8/~e)^Yf >G[kfnS= N4 o&CD 4VԒMD7u4d,U9cJZEe՛Lwg8""NU锱ZTxZfX<p8""MXfh'!^tTofJ03s:DD:Lh@S}BIDD0Z;> :E~ xCx`5U,ފ[EDQ.ѭN+k l<hYa7J]A}~H+ev+Ԑ_-IE |&Hwʫq>gѣ;<. 'S'D(QZ=ܺx<Œ(1~ߗe;"xϋ ^ \ua;jZ۴w^]f Ď(2At914F xO|)*9Ҭٰ.ˎ ;DDDڙFP=PN%-G@ q%:~L+ \F+J&CBDJHCH}XDD$BL]L^%d9 '!3$""9v] ]y\|G }^2At_$""(.S»^` >NH3\ `qrHgLS٭zLB0S΁9¡#]""=/~$^q~`$  Q,u4)Rw0x{|E=n\Bzܟk-|u^zNE0`.!r|F"]+چDD4M=2 4c %f%A-S]b""33Yĩ]43xXޚg ֧DDJa* US|?\)pBzi10X 2\H \?F{ܾS1RTz!7X&m=Dޒ`@sZ@U1PmԿ6 Z!.s1gڋ%?O<"^*Rbkmyx#/ѯ.{IE{Ĺs(ykUD̏ў%>=}ɌYl*"U1c|ޖQ{^uq@M`"k=O3 uvEC ϕUQG{~\RP5DhFm"ȉ05F{nMDgpE. PoX(Nl*"Y`}exCky_OuEz1HϠά躋Ds(Eua7DZHϯcPϙ,SujaH:MYJ3NrEj,B*钟% Ek\: )ÜbYA/!:>47b@v)3y evӝb$=ϖL.aiϏ \ӫ\N 3<=cg^7ۥrhj|m" "uQl/޾?j8f)@RukMqE 1jag 6f)$16)N+( K?E5!X,H&MԔ&EVy>~`5htKP$cmV̏ў%cFMx19ۥfu?ͪMdW3 ;(.\J' Y.K414kVhS,oDZ/5ݓ @4k6_%5Ò1-*0^gT@һ4kVh6=e9D-lC;RiZck6sV\[?*y]?Q_'.f:\ Ѥ/fHX 0V#C̢=n g K$Rue^d`f<6OS`_ {Pix*DNj.WТ@zSgў2{0sBl*0Ƨ7ႇ;"afB`=!Zti\ǫ*E )E6=27WQz> ? |/'9ŵe!s=Vʋ> |2 l)0&MH ҶkWJ'l/y<@fαOu@"U "-6n3jbkS)M`S`"! !%Lj<ԧOc.DHud:.>| / #N;X&` TىўV`~&;\ : vuNw/%]ֈt|y*Hh ڛY_G^8><7F .HSP;5-_Ci=K";}4Mod8o?,yhyByp)DzY _)s^ˋ s7-_`ΊQE);cth9`^J#5% qndU`8\ Py4kc~4F{Nm@ P=毣+9ڳ7ўR<@DD@_⛀KO灚n* 63A+DI<rrMkOs)AO|EG\Vm6)';B s-zHDz=ˉK Q=0/XE4842('DҬR\!tQ;lf G mge@" 9._*XgMM~Bs~O"'HD9 |76l|Z[TpnۀS%0iz9ݩ2(tH$"R \Lk_>K|P#PT0h'8dpO<2 sm\B L5Hr zdc BoQ3iK:D>zHw9x[0 s16肈ȉ| 2& >Nq<2.%D 0T-"?FD5_.ʉ˘x$ 56/:]"r(DzYQd\y_!˾DwcH ș^kFbGCwhn%԰POy%ぷS{?M eh@D4FDv.'x$iz=DH%vLD@ sfG=ZdN<Rcѷ)4Q)DgpuN\y"t # A+]f0-9H?N/u9O&&`vN]C1た x'R+z2TWl! o3QֱV;nv}|\c%`욳H\BKUDx\$*+zb}|<[HcT5)m L$m=}?p;BdO߇`2˻&hoױut!)9sQ|E+i pS<N v"kOE1ܯe馵sV=zI=cC:knåp6-ք_/yOUdE3PcRIמ ]s;.@,ѓ&gۖn_@R6zQn397eWnz&`e<k>al h p[/)DN#@iHy# pdeh|D$3ix6'>J+xs} .P/3zxG9ugvNnOx-좿(e~_$%3b]  #h/^yЏj-?6l>aWN cfل⚓b}<6xxVjӷ)0)IMh#@15=)6rvJ\c)+vGM CzSYOѓLHgKQOm#S"JQIU+Pb Ic:&ua,LIL):\ :p.:E6R5um ӷHfj5I_]&oOULUW nfR}Ds!rEҴٹ߇)I7׭]N"eCsoO]hW]: MR"$}s|3vBhN`<>F0-_/.&xR 0!! 1HwUk pNJbeS=s-0+s*g/&}ȝmH(+&ԫ2A1-Rv Q-2bMEFˡhm2/%|),f|}<c=0%0Me%Iz4XI!WZm&ho1Vu xNQ5S`㩇vi#z1{y!)Y/ a}<~P>m&DN:xVuNtP=p)] ?_6"ݠ.:sꤍ @3iŸMAa.RA+Lψ3bSR90qy$AZM(֘ F+J|֓*^6:\@CKڵ?p.Ut$'8bhs ?vGIL.H߳N]#]P K ic{Ax$P1rlo۳ɢ'u#zx !~eKCwӊc+9N]myU9U^ ܅E8BZسTbB;n p<_I[aԈD>ׯ!$Gosnἂ5PzoĖȉQ$t\ETqIU= 9~n_5:\l3!" P;cg .dxjkbǚ"R4ЋW/vw=Ww @3CO?M(^&"RWg8fවH@\.sPS.n0""Mpg<;[k9 4g&Z{n0 B~D)Ň(CD:LY1`iWοm `K0s >tzD!|D:+pUGn~hUD)(H*wIг ׀x~᪖B|>,("h!8->>A6F0x7$:鲻U.vf&DS~^np.coQPD)GrB IDAT腄{ ˖HZ7y}1z[>r7ގo]m7(" ϸ?VZcrh}Gsoxۍrg㍷씋("ioבr|zT-ZOX'0eQ5Esz+?O_\{6C3#w=yj):l/hg=m:uD3} xSry(J`-r{E/EtaSJ&ӊo 흿 ޢ'ڙ6bZD:C{NHҏ8o@ǺcZD@UR'E=.-бhsEDT%6o=(alިRuԳLecxwa,T\v(NiIꓧ]ԥ]G7(]ZRQu{1v" ^N:'x}w<@xE@ *kQ*"p9(꒧2Q5l O%Ll779 K,O u(Mư#(]RKO6Zs]"G+jM{ ?6JEN(oi1%-becxm 9nsJ@u`&XIߌs&\Dj"s%̈́\u@: :Zׁ/Jz|M@ 2)wώo:m 3 V>|ЄVDj" 9:F:uJNW \'B-u0˩4S*[+z˶u'I gWsOn?M0*o$t D$uf$ 9^$j',v_"x0ĩ$p_U|}k)dP #7MBԻv}+aSJ_7[a(Cу E$e2P$ďT_mwIrGJ9Ck LDS H(`lNj1\f%|ѡQ-%4Ip|  IMM \L+:4?F΋(־AB()"r4sy{Fz #@c7DG/XHa' Бx^,wԔ0$ub_?OZҪ_sN/s agOTzP(&wѣrJ|2Àrb Ds4C[[2S)R;^C\@gv<ѣrJC9Ls>EǛsҩ<->4`Yt`)$E ; պHf쥿hXxVbգn:"1zBZ*P]qtKt"Iuw.a%N5jw>GE6OMT#@"cF$rcLU"S)$.;踉R#@5T!:C)WiY=1T 5V7UFzWQ=2FDnN'*MZCwyL͑"udGu@%=+ #@5D?tC9.UVңHȔ1YGUx { ?|@"1`N^FuLrj)L qTxȉTO4Cwh:rBNF|4+*DO/p-Rt =n?ĩSՄ9S=vm~1oaT%9Y%]eٱNC ˕[բg iW= \&)e1Rrvk#Edpy\ݘw'j:V"]mH7E{+<&DD6(Dt~`&&r^>yஜ k1?fUxKNu=H>㲜$?UBHjTFBz.B:-"=!Ǽu-~ZѡuKNgL~6ߥ~" ЄTNLưmo%lOO#~z/h!ҳbѳ(z(@ 9-VFq1|DseۀoD1t SY"=P]3?[kHHD sQJLK /w_@7Ec[HD:>˦WT[c븝f@6BƼx[UpPC&`T@""Ѷ%r:=ۮ$NX,,/ǵz i4vvWP7m%a\_O<Eu ٗP {B;V{?4x3iCj;vE ԝM#a/޳:cԮcԾx?pFrG=_vQ)Dlk dR?Tvyފ UWyK(@"ҋԵ]f®sn>Q$pNQ>貯 .RvstWmBZYEO LD$QuNUGإ43s߉}3t?`Yέ/M::FDD*d3GК!gl?<(;y5= ~J{RHOJ]d.h,!Ty.®9Q)DDJ.п]5 k>]vP?"'BzB$"R:͉+1P2wFB.Ơ ZD^?",> ?8HHH(P!ydHDN 6o#Ժ,<o>JyO0!u#tTPTW0TDu8qט':4w)".o p)D)Q,%ZKR!tKx﫹9Bتj{IOrѦD:bV7:(fJHޚnύEX˦R=@"=Y[oFB疥mnQ{(Zξ8kSz $tߋFQN0j\#LIL~ 0M{ [4I#lts:۩㰤cK$f7.xl!Bg:]%+z* ne6Z5GH8`S=o!j"YP}$2`*'ȯXop) !uB]=*xud~a\ zsߐ7 ?hWH0`\Sc2x@1Ɲ6"G"e.00= LJ\ߍ⛄,N09q:u'm{ԜǗN+>B]gEx= H0MgB5ᵄG\"@FD`p-Bt?ߍhZBA '1*'Sz6B?W']H3\Aʻ)w~Py-pl}F^]} bUD9*U(ʋ"BQ=s}&;RsIs  me݇)Lę.HJ-&n8rtHd-& uj1ṉ́eWRU3鲽(@Q-&FUcDl1!u=]6P :J*Q)jHB*.-&-&&xpVǟSM(@ZDyedbB鲣1BwI9(_=bB .upnb;PW+۔p3Fo{ϡ*O[imMńH1v>nl:0ٯeydt#,{..h@l1!"h>BlN"9/8 ^@u8 9>:8?~)_K/'|lVv)$K#lsϔǀ@:iIz hck-R<;rg.i ٟfo<|8u ^I #~\bByddy(˶6R%{کl$jDPʡ^`y|qzEz|liVovvNq.U-{)#3vo"tٗՉtN?SՇ+A>O(kS%"5@L~ $1_͟_v@=~PptR=[9Ghїp<۰wٱXQ`\;\ 9 &.%tTH PyDxZBO;\@_7oJ`!0i vFG< # ]ԋ m5,0[YhbB~8/bth10 jtӘ.+*p-lt/H2jM) ˺_ޟt*Ҭ-:å"juK-dl}[wбnT 1ZBi/]97Au/r(D́e#OE.5Nرr1ηnDdKl7tټ kes*Q9^LF\Q5|)Mm.T|9+dģC+ճm*jof);]s.P7NV ^Q5eAѡI{W8AL.Kodvl.de P7o½aQI7C nQ-~%5M|]" Ѿ7gpma08q(R`J.:L7({N-]9u]N(@72Q5|,bGKXӬJI]"萈)]Yj*À7v7F;eR5_$R;: :3Psވ/uDjC7F觜>Pn7?p!5 8{(@c .@w@Me2a).|O9]r& [{RCn'lkOM= !,;)4lFTSE& pIun+p ,z 9cw|@$zBݡofݡRz.QI9yB;-%IӁ[[ӷk_D3K}j1>s@VJ(eDR \+d_)6P #E@ Ium8 9q_&('`%%.03P} <sJ@Fv4 Hb!+ }D@My K陨RIFj؞ K5-%QI5Jn`5+)À>B2߽5*O_y6_v:"RW*,W  SV-Fz `ib\G+:d!F94AƳl poϫu]/{t@R-YyTm:6Ry N(z"`5Օ ܾ\xSئP[ftH@=B|%!TUͳ8gQ17JM`U"<P8*z쎢5JNHä\t!Q5Y~QU4ZZ$͈'6ӝ.(YtUf^O0TqqKwӮfXLCd׫bE *HdHP !imBB<5n-p-W@"'zthy" n2%*;H$R:KTeZ q@r]ѤQC_-4m YKh)BMXG=k:e"n {]Nwx~q5_G5uDh&zG֑ eIDATHDJEQ}_l[qBSŵ;203ET= |9jITWISZ4v I;tZ HEQݟq4zY`,ܔ6$Rߏ\4- ÁZM0U1飚݈ U%`( i':iE*v2 DFןhmS.cW"i!H}3p)<*uMGL~bܾ|}בDdMQWǟF1GZua8FhԘ " ՗1蹚j`= 5fϓNHDz|th (A]Њ! CvIwFs |, y{ME\G(_um'1_$rOQ0߿G.oRҙu.-M t'MH@b߲ f>O u5A&{jOq=e4fp)DzI [_8Ci1pkq/0ޗ4Mȉd"V ~;9za F^jZYtFA:ctS`~I *8_ QQ c>:R<,?PzK=N(RhjHl!=V$\D%T_/3ş7k ߝ/!{V|v'wzSIALISXP+ SK$Dv)XF ̎r,_`._۔6$"u`+!MrPVw2BB4z bEюҍy 1$M3ZAZt佌EN&4{kMU\ÄH.P}K$Ja(&(A: "a+ [ƫ̈́\`-y\_p)D@39z&rBIО kW]}ԗ .~E$(+2tX75AH/`<>N;NBݡI ߔx!\<wHDl&4!(A DY>KP0&uL ۣoE#e*s忕tSR\^k5Hv q@lB5M=v\X/v@",&Ft}u]^>MHU;BDm-n^p)DJybM`ޫ . pi I"QiHфf< o'#>Ja_O?% I Hzs_^i~Tvل(F˚(`V\QXl(u@;UMx#1zSUN<%[R6Y~8Bf}1T$S)HT)Ju-VuTD2J:d=sH@z4@3VEL20ryJ$*SI'(RgBآ 6%HOT ) xL:@iq&P~+i7L7_'LEWǟ\߁}wPhJh8-惉}Y>[һJf iJ( S.Љ2XD0=2\f"4ZMT me>). )z0iJT z?iZ@|lp)/<, Ъ{iUf#W'EvzgvEؖ2s_p.YeUrh9e=Ōm@ >[i%R_=E3!7r5{ پG/ԪʾI$E+Mn5ޠ0WBflԛLk#)5Z;hs_f6Y.F"LDi /gK_ԫGQ6éSIh$`-P7S[0 XKg_M7f׀ޓ"2 KV 2+λ'BYIS #@ P$t[*)ͯ>[Ed Dni!{dF(HgkS("@yFӿkÃmc8jFhP3ct[3uˤW>;6HVt@ M0^_WtYm)o \ >𽄣C x#ZmP(OgkS#" v&ӪLdhCs\gdp)| ;H}Pa1t/^`]#ZrrR`_rzO V`f v&<9+^+ѡTP(#T ݄]""$9cpwI/iI. }W|PHJhsEx 6PfY!B!eeh>(q/L/<0)@|5 M]fhҥbΉQv{"^"jg6A*`gh.;ۘc3 '8S%sjD$3xSZ鼷e 68L׀8E"WJh+QA,S)ͫN0KFzCapS%"=..4ԇ o~~+"vz{0`>i6¬KcJDP;c \o Cs }g8`[M(ҍX;D-&Pl7ԔѹvGT(@N~{9Qq)VJ@\Bs iDqH4Z\I4:+_ʷi ɺ"MVNHԏ?NA?QAXl)='8.3,LHH}S%W0Z<:z3uKEH6{" 96y3 -3KqKEH$g:U" y?Lfn~N)p^Ϲ|$FjQ՗O'Mpa"G#oޞ zS%~ԦV;n 3>ϧ)ӴSY7qD@2 Y; w<Žn כhRk}M,NqD@2 y3ujRQL} i:Ū^y#<{hpD@2 Y)!}@69ҍ%ni:U" )ԩZBh4ؿ,dR&ڔE@2TqZ,R6RS S8`VILїUN4R(\C_""v$FI3ϼ8өQQ95>N)KRF>BzQduW.'I':U" 9*C~- ^jwi1x/g\e?;Rgz-#N(@rL-x;ri n9^ZF곜*Q)䘌N,M%oޏFjԍˀu9|+B*jyJbh-#iN4 MRG6:k^{0O(gT\zziE6V N(a~Vխ[z 't_{ʬwvPfDDzS% ~teўCp)EdO%&v2RtD<ӢyA=" R7R/'4R+@i0$U:)N3}iV)}>,.?B l""]'e#ABj)pSh]=YLy/"Us.iWM@rLYCF*X`YRy&>-MN+#T֨12ĊAQTOaqY'wDgǙs|?ɔdw9s%i$ _%˗6+`NZjxϞn^~I>HZ* :D si۳!VQQ^zxXPC(ib{l<ݓKyA gY =`4HDK Rے7yN>`HREBPYᚺ=u.IjAszJ AhHTr4UzCeTT~Qr$Uz@Cq Fݞe&~67C*6X:_#It8@An,WSN{I*AV3* (֒OdnӤ%F=$HyRҥha9;lGb9%Ij uΝs;]pp=g, XIAAꜧZLF񱥆o)޻$R~RiA QINIJiL>:$YAv>H-$IjjR>-|>vM.IԶE. hE5R$IꆭK,|/:V$IY&ܜ%O1!$IukW5y%IR6D|v0RIc'hmGS($I.nF)9`K$p$k.XiҎԒ$I$I$I$I$I$i nsIENDB`PK!4TT&share/gems/gems/rack-2.2.4/MIT-LICENSEnu[The MIT License (MIT) Copyright (C) 2007-2019 Leah Neukirchen Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. PK!..&share/gems/gems/rack-2.2.4/lib/rack.rbnu[# frozen_string_literal: true # Copyright (C) 2007-2019 Leah Neukirchen # # Rack is freely distributable under the terms of an MIT-style license. # See MIT-LICENSE or https://opensource.org/licenses/MIT. # The Rack main module, serving as a namespace for all core Rack # modules and classes. # # All modules meant for use in your application are autoloaded here, # so it should be enough just to require 'rack' in your code. require_relative 'rack/version' module Rack HTTP_HOST = 'HTTP_HOST' HTTP_PORT = 'HTTP_PORT' HTTP_VERSION = 'HTTP_VERSION' HTTPS = 'HTTPS' PATH_INFO = 'PATH_INFO' REQUEST_METHOD = 'REQUEST_METHOD' REQUEST_PATH = 'REQUEST_PATH' SCRIPT_NAME = 'SCRIPT_NAME' QUERY_STRING = 'QUERY_STRING' SERVER_PROTOCOL = 'SERVER_PROTOCOL' SERVER_NAME = 'SERVER_NAME' SERVER_PORT = 'SERVER_PORT' CACHE_CONTROL = 'Cache-Control' EXPIRES = 'Expires' CONTENT_LENGTH = 'Content-Length' CONTENT_TYPE = 'Content-Type' SET_COOKIE = 'Set-Cookie' TRANSFER_ENCODING = 'Transfer-Encoding' HTTP_COOKIE = 'HTTP_COOKIE' ETAG = 'ETag' # HTTP method verbs GET = 'GET' POST = 'POST' PUT = 'PUT' PATCH = 'PATCH' DELETE = 'DELETE' HEAD = 'HEAD' OPTIONS = 'OPTIONS' LINK = 'LINK' UNLINK = 'UNLINK' TRACE = 'TRACE' # Rack environment variables RACK_VERSION = 'rack.version' RACK_TEMPFILES = 'rack.tempfiles' RACK_ERRORS = 'rack.errors' RACK_LOGGER = 'rack.logger' RACK_INPUT = 'rack.input' RACK_SESSION = 'rack.session' RACK_SESSION_OPTIONS = 'rack.session.options' RACK_SHOWSTATUS_DETAIL = 'rack.showstatus.detail' RACK_MULTITHREAD = 'rack.multithread' RACK_MULTIPROCESS = 'rack.multiprocess' RACK_RUNONCE = 'rack.run_once' RACK_URL_SCHEME = 'rack.url_scheme' RACK_HIJACK = 'rack.hijack' RACK_IS_HIJACK = 'rack.hijack?' RACK_HIJACK_IO = 'rack.hijack_io' RACK_RECURSIVE_INCLUDE = 'rack.recursive.include' RACK_MULTIPART_BUFFER_SIZE = 'rack.multipart.buffer_size' RACK_MULTIPART_TEMPFILE_FACTORY = 'rack.multipart.tempfile_factory' RACK_REQUEST_FORM_INPUT = 'rack.request.form_input' RACK_REQUEST_FORM_HASH = 'rack.request.form_hash' RACK_REQUEST_FORM_VARS = 'rack.request.form_vars' RACK_REQUEST_COOKIE_HASH = 'rack.request.cookie_hash' RACK_REQUEST_COOKIE_STRING = 'rack.request.cookie_string' RACK_REQUEST_QUERY_HASH = 'rack.request.query_hash' RACK_REQUEST_QUERY_STRING = 'rack.request.query_string' RACK_METHODOVERRIDE_ORIGINAL_METHOD = 'rack.methodoverride.original_method' RACK_SESSION_UNPACKED_COOKIE_DATA = 'rack.session.unpacked_cookie_data' autoload :Builder, "rack/builder" autoload :BodyProxy, "rack/body_proxy" autoload :Cascade, "rack/cascade" autoload :Chunked, "rack/chunked" autoload :CommonLogger, "rack/common_logger" autoload :ConditionalGet, "rack/conditional_get" autoload :Config, "rack/config" autoload :ContentLength, "rack/content_length" autoload :ContentType, "rack/content_type" autoload :ETag, "rack/etag" autoload :Events, "rack/events" autoload :File, "rack/file" autoload :Files, "rack/files" autoload :Deflater, "rack/deflater" autoload :Directory, "rack/directory" autoload :ForwardRequest, "rack/recursive" autoload :Handler, "rack/handler" autoload :Head, "rack/head" autoload :Lint, "rack/lint" autoload :Lock, "rack/lock" autoload :Logger, "rack/logger" autoload :MediaType, "rack/media_type" autoload :MethodOverride, "rack/method_override" autoload :Mime, "rack/mime" autoload :NullLogger, "rack/null_logger" autoload :Recursive, "rack/recursive" autoload :Reloader, "rack/reloader" autoload :RewindableInput, "rack/rewindable_input" autoload :Runtime, "rack/runtime" autoload :Sendfile, "rack/sendfile" autoload :Server, "rack/server" autoload :ShowExceptions, "rack/show_exceptions" autoload :ShowStatus, "rack/show_status" autoload :Static, "rack/static" autoload :TempfileReaper, "rack/tempfile_reaper" autoload :URLMap, "rack/urlmap" autoload :Utils, "rack/utils" autoload :Multipart, "rack/multipart" autoload :MockRequest, "rack/mock" autoload :MockResponse, "rack/mock" autoload :Request, "rack/request" autoload :Response, "rack/response" module Auth autoload :Basic, "rack/auth/basic" autoload :AbstractRequest, "rack/auth/abstract/request" autoload :AbstractHandler, "rack/auth/abstract/handler" module Digest autoload :MD5, "rack/auth/digest/md5" autoload :Nonce, "rack/auth/digest/nonce" autoload :Params, "rack/auth/digest/params" autoload :Request, "rack/auth/digest/request" end end module Session autoload :Cookie, "rack/session/cookie" autoload :Pool, "rack/session/pool" autoload :Memcache, "rack/session/memcache" end end PK!K,share/gems/gems/rack-2.2.4/lib/rack/files.rbnu[# frozen_string_literal: true require 'time' module Rack # Rack::Files serves files below the +root+ directory given, according to the # path info of the Rack request. # e.g. when Rack::Files.new("/etc") is used, you can access 'passwd' file # as http://localhost:9292/passwd # # Handlers can detect if bodies are a Rack::Files, and use mechanisms # like sendfile on the +path+. class Files ALLOWED_VERBS = %w[GET HEAD OPTIONS] ALLOW_HEADER = ALLOWED_VERBS.join(', ') MULTIPART_BOUNDARY = 'AaB03x' # @todo remove in 3.0 def self.method_added(name) if name == :response_body raise "#{self.class}\#response_body is no longer supported." end super end attr_reader :root def initialize(root, headers = {}, default_mime = 'text/plain') @root = (::File.expand_path(root) if root) @headers = headers @default_mime = default_mime @head = Rack::Head.new(lambda { |env| get env }) end def call(env) # HEAD requests drop the response body, including 4xx error messages. @head.call env end def get(env) request = Rack::Request.new env unless ALLOWED_VERBS.include? request.request_method return fail(405, "Method Not Allowed", { 'Allow' => ALLOW_HEADER }) end path_info = Utils.unescape_path request.path_info return fail(400, "Bad Request") unless Utils.valid_path?(path_info) clean_path_info = Utils.clean_path_info(path_info) path = ::File.join(@root, clean_path_info) available = begin ::File.file?(path) && ::File.readable?(path) rescue SystemCallError # Not sure in what conditions this exception can occur, but this # is a safe way to handle such an error. # :nocov: false # :nocov: end if available serving(request, path) else fail(404, "File not found: #{path_info}") end end def serving(request, path) if request.options? return [200, { 'Allow' => ALLOW_HEADER, CONTENT_LENGTH => '0' }, []] end last_modified = ::File.mtime(path).httpdate return [304, {}, []] if request.get_header('HTTP_IF_MODIFIED_SINCE') == last_modified headers = { "Last-Modified" => last_modified } mime_type = mime_type path, @default_mime headers[CONTENT_TYPE] = mime_type if mime_type # Set custom headers headers.merge!(@headers) if @headers status = 200 size = filesize path ranges = Rack::Utils.get_byte_ranges(request.get_header('HTTP_RANGE'), size) if ranges.nil? # No ranges: ranges = [0..size - 1] elsif ranges.empty? # Unsatisfiable. Return error, and file size: response = fail(416, "Byte range unsatisfiable") response[1]["Content-Range"] = "bytes */#{size}" return response elsif ranges.size >= 1 # Partial content partial_content = true if ranges.size == 1 range = ranges[0] headers["Content-Range"] = "bytes #{range.begin}-#{range.end}/#{size}" else headers[CONTENT_TYPE] = "multipart/byteranges; boundary=#{MULTIPART_BOUNDARY}" end status = 206 body = BaseIterator.new(path, ranges, mime_type: mime_type, size: size) size = body.bytesize end headers[CONTENT_LENGTH] = size.to_s if request.head? body = [] elsif !partial_content body = Iterator.new(path, ranges, mime_type: mime_type, size: size) end [status, headers, body] end class BaseIterator attr_reader :path, :ranges, :options def initialize(path, ranges, options) @path = path @ranges = ranges @options = options end def each ::File.open(path, "rb") do |file| ranges.each do |range| yield multipart_heading(range) if multipart? each_range_part(file, range) do |part| yield part end end yield "\r\n--#{MULTIPART_BOUNDARY}--\r\n" if multipart? end end def bytesize size = ranges.inject(0) do |sum, range| sum += multipart_heading(range).bytesize if multipart? sum += range.size end size += "\r\n--#{MULTIPART_BOUNDARY}--\r\n".bytesize if multipart? size end def close; end private def multipart? ranges.size > 1 end def multipart_heading(range) <<-EOF \r --#{MULTIPART_BOUNDARY}\r Content-Type: #{options[:mime_type]}\r Content-Range: bytes #{range.begin}-#{range.end}/#{options[:size]}\r \r EOF end def each_range_part(file, range) file.seek(range.begin) remaining_len = range.end - range.begin + 1 while remaining_len > 0 part = file.read([8192, remaining_len].min) break unless part remaining_len -= part.length yield part end end end class Iterator < BaseIterator alias :to_path :path end private def fail(status, body, headers = {}) body += "\n" [ status, { CONTENT_TYPE => "text/plain", CONTENT_LENGTH => body.size.to_s, "X-Cascade" => "pass" }.merge!(headers), [body] ] end # The MIME type for the contents of the file located at @path def mime_type(path, default_mime) Mime.mime_type(::File.extname(path), default_mime) end def filesize(path) # We check via File::size? whether this file provides size info # via stat (e.g. /proc files often don't), otherwise we have to # figure it out by reading the whole file into memory. ::File.size?(path) || ::File.read(path).bytesize end end end PK!V.share/gems/gems/rack-2.2.4/lib/rack/version.rbnu[# frozen_string_literal: true # Copyright (C) 2007-2019 Leah Neukirchen # # Rack is freely distributable under the terms of an MIT-style license. # See MIT-LICENSE or https://opensource.org/licenses/MIT. # The Rack main module, serving as a namespace for all core Rack # modules and classes. # # All modules meant for use in your application are autoloaded here, # so it should be enough just to require 'rack' in your code. module Rack # The Rack protocol version number implemented. VERSION = [1, 3] # Return the Rack protocol version as a dotted string. def self.version VERSION.join(".") end RELEASE = "2.2.4" # Return the Rack release as a dotted string. def self.release RELEASE end end PK!c,,6share/gems/gems/rack-2.2.4/lib/rack/method_override.rbnu[# frozen_string_literal: true module Rack class MethodOverride HTTP_METHODS = %w[GET HEAD PUT POST DELETE OPTIONS PATCH LINK UNLINK] METHOD_OVERRIDE_PARAM_KEY = "_method" HTTP_METHOD_OVERRIDE_HEADER = "HTTP_X_HTTP_METHOD_OVERRIDE" ALLOWED_METHODS = %w[POST] def initialize(app) @app = app end def call(env) if allowed_methods.include?(env[REQUEST_METHOD]) method = method_override(env) if HTTP_METHODS.include?(method) env[RACK_METHODOVERRIDE_ORIGINAL_METHOD] = env[REQUEST_METHOD] env[REQUEST_METHOD] = method end end @app.call(env) end def method_override(env) req = Request.new(env) method = method_override_param(req) || env[HTTP_METHOD_OVERRIDE_HEADER] begin method.to_s.upcase rescue ArgumentError env[RACK_ERRORS].puts "Invalid string for method" end end private def allowed_methods ALLOWED_METHODS end def method_override_param(req) req.POST[METHOD_OVERRIDE_PARAM_KEY] rescue Utils::InvalidParameterError, Utils::ParameterTypeError req.get_header(RACK_ERRORS).puts "Invalid or incomplete POST params" rescue EOFError req.get_header(RACK_ERRORS).puts "Bad request content body" end end end PK! .share/gems/gems/rack-2.2.4/lib/rack/chunked.rbnu[# frozen_string_literal: true module Rack # Middleware that applies chunked transfer encoding to response bodies # when the response does not include a Content-Length header. # # This supports the Trailer response header to allow the use of trailing # headers in the chunked encoding. However, using this requires you manually # specify a response body that supports a +trailers+ method. Example: # # [200, { 'Trailer' => 'Expires'}, ["Hello", "World"]] # # error raised # # body = ["Hello", "World"] # def body.trailers # { 'Expires' => Time.now.to_s } # end # [200, { 'Trailer' => 'Expires'}, body] # # No exception raised class Chunked include Rack::Utils # A body wrapper that emits chunked responses. class Body TERM = "\r\n" TAIL = "0#{TERM}" # Store the response body to be chunked. def initialize(body) @body = body end # For each element yielded by the response body, yield # the element in chunked encoding. def each(&block) term = TERM @body.each do |chunk| size = chunk.bytesize next if size == 0 yield [size.to_s(16), term, chunk.b, term].join end yield TAIL yield_trailers(&block) yield term end # Close the response body if the response body supports it. def close @body.close if @body.respond_to?(:close) end private # Do nothing as this class does not support trailer headers. def yield_trailers end end # A body wrapper that emits chunked responses and also supports # sending Trailer headers. Note that the response body provided to # initialize must have a +trailers+ method that returns a hash # of trailer headers, and the rack response itself should have a # Trailer header listing the headers that the +trailers+ method # will return. class TrailerBody < Body private # Yield strings for each trailer header. def yield_trailers @body.trailers.each_pair do |k, v| yield "#{k}: #{v}\r\n" end end end def initialize(app) @app = app end # Whether the HTTP version supports chunked encoding (HTTP 1.1 does). def chunkable_version?(ver) case ver # pre-HTTP/1.0 (informally "HTTP/0.9") HTTP requests did not have # a version (nor response headers) when 'HTTP/1.0', nil, 'HTTP/0.9' false else true end end # If the rack app returns a response that should have a body, # but does not have Content-Length or Transfer-Encoding headers, # modify the response to use chunked Transfer-Encoding. def call(env) status, headers, body = @app.call(env) headers = HeaderHash[headers] if chunkable_version?(env[SERVER_PROTOCOL]) && !STATUS_WITH_NO_ENTITY_BODY.key?(status.to_i) && !headers[CONTENT_LENGTH] && !headers[TRANSFER_ENCODING] headers[TRANSFER_ENCODING] = 'chunked' if headers['Trailer'] body = TrailerBody.new(body) else body = Body.new(body) end end [status, headers, body] end end end PK!ߺww3share/gems/gems/rack-2.2.4/lib/rack/handler/scgi.rbnu[# frozen_string_literal: true require 'scgi' require 'stringio' module Rack module Handler class SCGI < ::SCGI::Processor attr_accessor :app def self.run(app, **options) options[:Socket] = UNIXServer.new(options[:File]) if options[:File] new(options.merge(app: app, host: options[:Host], port: options[:Port], socket: options[:Socket])).listen end def self.valid_options environment = ENV['RACK_ENV'] || 'development' default_host = environment == 'development' ? 'localhost' : '0.0.0.0' { "Host=HOST" => "Hostname to listen on (default: #{default_host})", "Port=PORT" => "Port to listen on (default: 8080)", } end def initialize(settings = {}) @app = settings[:app] super(settings) end def process_request(request, input_body, socket) env = Hash[request] env.delete "HTTP_CONTENT_TYPE" env.delete "HTTP_CONTENT_LENGTH" env[REQUEST_PATH], env[QUERY_STRING] = env["REQUEST_URI"].split('?', 2) env[HTTP_VERSION] ||= env[SERVER_PROTOCOL] env[PATH_INFO] = env[REQUEST_PATH] env[QUERY_STRING] ||= "" env[SCRIPT_NAME] = "" rack_input = StringIO.new(input_body) rack_input.set_encoding(Encoding::BINARY) env.update( RACK_VERSION => Rack::VERSION, RACK_INPUT => rack_input, RACK_ERRORS => $stderr, RACK_MULTITHREAD => true, RACK_MULTIPROCESS => true, RACK_RUNONCE => false, RACK_URL_SCHEME => ["yes", "on", "1"].include?(env[HTTPS]) ? "https" : "http" ) status, headers, body = app.call(env) begin socket.write("Status: #{status}\r\n") headers.each do |k, vs| vs.split("\n").each { |v| socket.write("#{k}: #{v}\r\n")} end socket.write("\r\n") body.each {|s| socket.write(s)} ensure body.close if body.respond_to? :close end end end end end PK!٥CC3share/gems/gems/rack-2.2.4/lib/rack/handler/thin.rbnu[# frozen_string_literal: true require "thin" require "thin/server" require "thin/logging" require "thin/backends/tcp_server" module Rack module Handler class Thin def self.run(app, **options) environment = ENV['RACK_ENV'] || 'development' default_host = environment == 'development' ? 'localhost' : '0.0.0.0' host = options.delete(:Host) || default_host port = options.delete(:Port) || 8080 args = [host, port, app, options] # Thin versions below 0.8.0 do not support additional options args.pop if ::Thin::VERSION::MAJOR < 1 && ::Thin::VERSION::MINOR < 8 server = ::Thin::Server.new(*args) yield server if block_given? server.start end def self.valid_options environment = ENV['RACK_ENV'] || 'development' default_host = environment == 'development' ? 'localhost' : '0.0.0.0' { "Host=HOST" => "Hostname to listen on (default: #{default_host})", "Port=PORT" => "Port to listen on (default: 8080)", } end end end end PK! 3share/gems/gems/rack-2.2.4/lib/rack/handler/lsws.rbnu[# frozen_string_literal: true require 'lsapi' module Rack module Handler class LSWS def self.run(app, **options) while LSAPI.accept != nil serve app end end def self.serve(app) env = ENV.to_hash env.delete "HTTP_CONTENT_LENGTH" env[SCRIPT_NAME] = "" if env[SCRIPT_NAME] == "/" rack_input = RewindableInput.new($stdin.read.to_s) env.update( RACK_VERSION => Rack::VERSION, RACK_INPUT => rack_input, RACK_ERRORS => $stderr, RACK_MULTITHREAD => false, RACK_MULTIPROCESS => true, RACK_RUNONCE => false, RACK_URL_SCHEME => ["yes", "on", "1"].include?(ENV[HTTPS]) ? "https" : "http" ) env[QUERY_STRING] ||= "" env[HTTP_VERSION] ||= env[SERVER_PROTOCOL] env[REQUEST_PATH] ||= "/" status, headers, body = app.call(env) begin send_headers status, headers send_body body ensure body.close if body.respond_to? :close end ensure rack_input.close end def self.send_headers(status, headers) print "Status: #{status}\r\n" headers.each { |k, vs| vs.split("\n").each { |v| print "#{k}: #{v}\r\n" } } print "\r\n" STDOUT.flush end def self.send_body(body) body.each { |part| print part STDOUT.flush } end end end end PK! 6share/gems/gems/rack-2.2.4/lib/rack/handler/fastcgi.rbnu[# frozen_string_literal: true require 'fcgi' require 'socket' if defined? FCGI::Stream class FCGI::Stream alias _rack_read_without_buffer read def read(n, buffer = nil) buf = _rack_read_without_buffer n buffer.replace(buf.to_s) if buffer buf end end end module Rack module Handler class FastCGI def self.run(app, **options) if options[:File] STDIN.reopen(UNIXServer.new(options[:File])) elsif options[:Port] STDIN.reopen(TCPServer.new(options[:Host], options[:Port])) end FCGI.each { |request| serve request, app } end def self.valid_options environment = ENV['RACK_ENV'] || 'development' default_host = environment == 'development' ? 'localhost' : '0.0.0.0' { "Host=HOST" => "Hostname to listen on (default: #{default_host})", "Port=PORT" => "Port to listen on (default: 8080)", "File=PATH" => "Creates a Domain socket at PATH instead of a TCP socket. Ignores Host and Port if set.", } end def self.serve(request, app) env = request.env env.delete "HTTP_CONTENT_LENGTH" env[SCRIPT_NAME] = "" if env[SCRIPT_NAME] == "/" rack_input = RewindableInput.new(request.in) env.update( RACK_VERSION => Rack::VERSION, RACK_INPUT => rack_input, RACK_ERRORS => request.err, RACK_MULTITHREAD => false, RACK_MULTIPROCESS => true, RACK_RUNONCE => false, RACK_URL_SCHEME => ["yes", "on", "1"].include?(env[HTTPS]) ? "https" : "http" ) env[QUERY_STRING] ||= "" env[HTTP_VERSION] ||= env[SERVER_PROTOCOL] env[REQUEST_PATH] ||= "/" env.delete "CONTENT_TYPE" if env["CONTENT_TYPE"] == "" env.delete "CONTENT_LENGTH" if env["CONTENT_LENGTH"] == "" begin status, headers, body = app.call(env) begin send_headers request.out, status, headers send_body request.out, body ensure body.close if body.respond_to? :close end ensure rack_input.close request.finish end end def self.send_headers(out, status, headers) out.print "Status: #{status}\r\n" headers.each { |k, vs| vs.split("\n").each { |v| out.print "#{k}: #{v}\r\n" } } out.print "\r\n" out.flush end def self.send_body(out, body) body.each { |part| out.print part out.flush } end end end end PK!O !2share/gems/gems/rack-2.2.4/lib/rack/handler/cgi.rbnu[# frozen_string_literal: true module Rack module Handler class CGI def self.run(app, **options) $stdin.binmode serve app end def self.serve(app) env = ENV.to_hash env.delete "HTTP_CONTENT_LENGTH" env[SCRIPT_NAME] = "" if env[SCRIPT_NAME] == "/" env.update( RACK_VERSION => Rack::VERSION, RACK_INPUT => Rack::RewindableInput.new($stdin), RACK_ERRORS => $stderr, RACK_MULTITHREAD => false, RACK_MULTIPROCESS => true, RACK_RUNONCE => true, RACK_URL_SCHEME => ["yes", "on", "1"].include?(ENV[HTTPS]) ? "https" : "http" ) env[QUERY_STRING] ||= "" env[HTTP_VERSION] ||= env[SERVER_PROTOCOL] env[REQUEST_PATH] ||= "/" status, headers, body = app.call(env) begin send_headers status, headers send_body body ensure body.close if body.respond_to? :close end end def self.send_headers(status, headers) $stdout.print "Status: #{status}\r\n" headers.each { |k, vs| vs.split("\n").each { |v| $stdout.print "#{k}: #{v}\r\n" } } $stdout.print "\r\n" $stdout.flush end def self.send_body(body) body.each { |part| $stdout.print part $stdout.flush } end end end end PK!M6share/gems/gems/rack-2.2.4/lib/rack/handler/webrick.rbnu[# frozen_string_literal: true require 'webrick' require 'stringio' # This monkey patch allows for applications to perform their own chunking # through WEBrick::HTTPResponse if rack is set to true. class WEBrick::HTTPResponse attr_accessor :rack alias _rack_setup_header setup_header def setup_header app_chunking = rack && @header['transfer-encoding'] == 'chunked' @chunked = app_chunking if app_chunking _rack_setup_header @chunked = false if app_chunking end end module Rack module Handler class WEBrick < ::WEBrick::HTTPServlet::AbstractServlet def self.run(app, **options) environment = ENV['RACK_ENV'] || 'development' default_host = environment == 'development' ? 'localhost' : nil if !options[:BindAddress] || options[:Host] options[:BindAddress] = options.delete(:Host) || default_host end options[:Port] ||= 8080 if options[:SSLEnable] require 'webrick/https' end @server = ::WEBrick::HTTPServer.new(options) @server.mount "/", Rack::Handler::WEBrick, app yield @server if block_given? @server.start end def self.valid_options environment = ENV['RACK_ENV'] || 'development' default_host = environment == 'development' ? 'localhost' : '0.0.0.0' { "Host=HOST" => "Hostname to listen on (default: #{default_host})", "Port=PORT" => "Port to listen on (default: 8080)", } end def self.shutdown if @server @server.shutdown @server = nil end end def initialize(server, app) super server @app = app end def service(req, res) res.rack = true env = req.meta_vars env.delete_if { |k, v| v.nil? } rack_input = StringIO.new(req.body.to_s) rack_input.set_encoding(Encoding::BINARY) env.update( RACK_VERSION => Rack::VERSION, RACK_INPUT => rack_input, RACK_ERRORS => $stderr, RACK_MULTITHREAD => true, RACK_MULTIPROCESS => false, RACK_RUNONCE => false, RACK_URL_SCHEME => ["yes", "on", "1"].include?(env[HTTPS]) ? "https" : "http", RACK_IS_HIJACK => true, RACK_HIJACK => lambda { raise NotImplementedError, "only partial hijack is supported."}, RACK_HIJACK_IO => nil ) env[HTTP_VERSION] ||= env[SERVER_PROTOCOL] env[QUERY_STRING] ||= "" unless env[PATH_INFO] == "" path, n = req.request_uri.path, env[SCRIPT_NAME].length env[PATH_INFO] = path[n, path.length - n] end env[REQUEST_PATH] ||= [env[SCRIPT_NAME], env[PATH_INFO]].join status, headers, body = @app.call(env) begin res.status = status.to_i io_lambda = nil headers.each { |k, vs| if k == RACK_HIJACK io_lambda = vs elsif k.downcase == "set-cookie" res.cookies.concat vs.split("\n") else # Since WEBrick won't accept repeated headers, # merge the values per RFC 1945 section 4.2. res[k] = vs.split("\n").join(", ") end } if io_lambda rd, wr = IO.pipe res.body = rd res.chunked = true io_lambda.call wr elsif body.respond_to?(:to_path) res.body = ::File.open(body.to_path, 'rb') else body.each { |part| res.body << part } end ensure body.close if body.respond_to? :close end end end end end PK!qQ-share/gems/gems/rack-2.2.4/lib/rack/events.rbnu[# frozen_string_literal: true module Rack ### This middleware provides hooks to certain places in the request / # response lifecycle. This is so that middleware that don't need to filter # the response data can safely leave it alone and not have to send messages # down the traditional "rack stack". # # The events are: # # * on_start(request, response) # # This event is sent at the start of the request, before the next # middleware in the chain is called. This method is called with a request # object, and a response object. Right now, the response object is always # nil, but in the future it may actually be a real response object. # # * on_commit(request, response) # # The response has been committed. The application has returned, but the # response has not been sent to the webserver yet. This method is always # called with a request object and the response object. The response # object is constructed from the rack triple that the application returned. # Changes may still be made to the response object at this point. # # * on_send(request, response) # # The webserver has started iterating over the response body and presumably # has started sending data over the wire. This method is always called with # a request object and the response object. The response object is # constructed from the rack triple that the application returned. Changes # SHOULD NOT be made to the response object as the webserver has already # started sending data. Any mutations will likely result in an exception. # # * on_finish(request, response) # # The webserver has closed the response, and all data has been written to # the response socket. The request and response object should both be # read-only at this point. The body MAY NOT be available on the response # object as it may have been flushed to the socket. # # * on_error(request, response, error) # # An exception has occurred in the application or an `on_commit` event. # This method will get the request, the response (if available) and the # exception that was raised. # # ## Order # # `on_start` is called on the handlers in the order that they were passed to # the constructor. `on_commit`, on_send`, `on_finish`, and `on_error` are # called in the reverse order. `on_finish` handlers are called inside an # `ensure` block, so they are guaranteed to be called even if something # raises an exception. If something raises an exception in a `on_finish` # method, then nothing is guaranteed. class Events module Abstract def on_start(req, res) end def on_commit(req, res) end def on_send(req, res) end def on_finish(req, res) end def on_error(req, res, e) end end class EventedBodyProxy < Rack::BodyProxy # :nodoc: attr_reader :request, :response def initialize(body, request, response, handlers, &block) super(body, &block) @request = request @response = response @handlers = handlers end def each @handlers.reverse_each { |handler| handler.on_send request, response } super end end class BufferedResponse < Rack::Response::Raw # :nodoc: attr_reader :body def initialize(status, headers, body) super(status, headers) @body = body end def to_a; [status, headers, body]; end end def initialize(app, handlers) @app = app @handlers = handlers end def call(env) request = make_request env on_start request, nil begin status, headers, body = @app.call request.env response = make_response status, headers, body on_commit request, response rescue StandardError => e on_error request, response, e on_finish request, response raise end body = EventedBodyProxy.new(body, request, response, @handlers) do on_finish request, response end [response.status, response.headers, body] end private def on_error(request, response, e) @handlers.reverse_each { |handler| handler.on_error request, response, e } end def on_commit(request, response) @handlers.reverse_each { |handler| handler.on_commit request, response } end def on_start(request, response) @handlers.each { |handler| handler.on_start request, nil } end def on_finish(request, response) @handlers.reverse_each { |handler| handler.on_finish request, response } end def make_request(env) Rack::Request.new env end def make_response(status, headers, body) BufferedResponse.new status, headers, body end end end PK!kNN.share/gems/gems/rack-2.2.4/lib/rack/request.rbnu[# frozen_string_literal: true module Rack # Rack::Request provides a convenient interface to a Rack # environment. It is stateless, the environment +env+ passed to the # constructor will be directly modified. # # req = Rack::Request.new(env) # req.post? # req.params["data"] class Request (require_relative 'core_ext/regexp'; using ::Rack::RegexpExtensions) if RUBY_VERSION < '2.4' class << self attr_accessor :ip_filter end self.ip_filter = lambda { |ip| /\A127\.0\.0\.1\Z|\A(10|172\.(1[6-9]|2[0-9]|30|31)|192\.168)\.|\A::1\Z|\Afd[0-9a-f]{2}:.+|\Alocalhost\Z|\Aunix\Z|\Aunix:/i.match?(ip) } ALLOWED_SCHEMES = %w(https http).freeze SCHEME_WHITELIST = ALLOWED_SCHEMES if Object.respond_to?(:deprecate_constant) deprecate_constant :SCHEME_WHITELIST end def initialize(env) @params = nil super(env) end def params @params ||= super end def update_param(k, v) super @params = nil end def delete_param(k) v = super @params = nil v end module Env # The environment of the request. attr_reader :env def initialize(env) @env = env super() end # Predicate method to test to see if `name` has been set as request # specific data def has_header?(name) @env.key? name end # Get a request specific value for `name`. def get_header(name) @env[name] end # If a block is given, it yields to the block if the value hasn't been set # on the request. def fetch_header(name, &block) @env.fetch(name, &block) end # Loops through each key / value pair in the request specific data. def each_header(&block) @env.each(&block) end # Set a request specific value for `name` to `v` def set_header(name, v) @env[name] = v end # Add a header that may have multiple values. # # Example: # request.add_header 'Accept', 'image/png' # request.add_header 'Accept', '*/*' # # assert_equal 'image/png,*/*', request.get_header('Accept') # # http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2 def add_header(key, v) if v.nil? get_header key elsif has_header? key set_header key, "#{get_header key},#{v}" else set_header key, v end end # Delete a request specific value for `name`. def delete_header(name) @env.delete name end def initialize_copy(other) @env = other.env.dup end end module Helpers # The set of form-data media-types. Requests that do not indicate # one of the media types present in this list will not be eligible # for form-data / param parsing. FORM_DATA_MEDIA_TYPES = [ 'application/x-www-form-urlencoded', 'multipart/form-data' ] # The set of media-types. Requests that do not indicate # one of the media types present in this list will not be eligible # for param parsing like soap attachments or generic multiparts PARSEABLE_DATA_MEDIA_TYPES = [ 'multipart/related', 'multipart/mixed' ] # Default ports depending on scheme. Used to decide whether or not # to include the port in a generated URI. DEFAULT_PORTS = { 'http' => 80, 'https' => 443, 'coffee' => 80 } # The address of the client which connected to the proxy. HTTP_X_FORWARDED_FOR = 'HTTP_X_FORWARDED_FOR' # The contents of the host/:authority header sent to the proxy. HTTP_X_FORWARDED_HOST = 'HTTP_X_FORWARDED_HOST' # The value of the scheme sent to the proxy. HTTP_X_FORWARDED_SCHEME = 'HTTP_X_FORWARDED_SCHEME' # The protocol used to connect to the proxy. HTTP_X_FORWARDED_PROTO = 'HTTP_X_FORWARDED_PROTO' # The port used to connect to the proxy. HTTP_X_FORWARDED_PORT = 'HTTP_X_FORWARDED_PORT' # Another way for specifing https scheme was used. HTTP_X_FORWARDED_SSL = 'HTTP_X_FORWARDED_SSL' def body; get_header(RACK_INPUT) end def script_name; get_header(SCRIPT_NAME).to_s end def script_name=(s); set_header(SCRIPT_NAME, s.to_s) end def path_info; get_header(PATH_INFO).to_s end def path_info=(s); set_header(PATH_INFO, s.to_s) end def request_method; get_header(REQUEST_METHOD) end def query_string; get_header(QUERY_STRING).to_s end def content_length; get_header('CONTENT_LENGTH') end def logger; get_header(RACK_LOGGER) end def user_agent; get_header('HTTP_USER_AGENT') end def multithread?; get_header(RACK_MULTITHREAD) end # the referer of the client def referer; get_header('HTTP_REFERER') end alias referrer referer def session fetch_header(RACK_SESSION) do |k| set_header RACK_SESSION, default_session end end def session_options fetch_header(RACK_SESSION_OPTIONS) do |k| set_header RACK_SESSION_OPTIONS, {} end end # Checks the HTTP request method (or verb) to see if it was of type DELETE def delete?; request_method == DELETE end # Checks the HTTP request method (or verb) to see if it was of type GET def get?; request_method == GET end # Checks the HTTP request method (or verb) to see if it was of type HEAD def head?; request_method == HEAD end # Checks the HTTP request method (or verb) to see if it was of type OPTIONS def options?; request_method == OPTIONS end # Checks the HTTP request method (or verb) to see if it was of type LINK def link?; request_method == LINK end # Checks the HTTP request method (or verb) to see if it was of type PATCH def patch?; request_method == PATCH end # Checks the HTTP request method (or verb) to see if it was of type POST def post?; request_method == POST end # Checks the HTTP request method (or verb) to see if it was of type PUT def put?; request_method == PUT end # Checks the HTTP request method (or verb) to see if it was of type TRACE def trace?; request_method == TRACE end # Checks the HTTP request method (or verb) to see if it was of type UNLINK def unlink?; request_method == UNLINK end def scheme if get_header(HTTPS) == 'on' 'https' elsif get_header(HTTP_X_FORWARDED_SSL) == 'on' 'https' elsif forwarded_scheme forwarded_scheme else get_header(RACK_URL_SCHEME) end end # The authority of the incoming request as defined by RFC3976. # https://tools.ietf.org/html/rfc3986#section-3.2 # # In HTTP/1, this is the `host` header. # In HTTP/2, this is the `:authority` pseudo-header. def authority forwarded_authority || host_authority || server_authority end # The authority as defined by the `SERVER_NAME` and `SERVER_PORT` # variables. def server_authority host = self.server_name port = self.server_port if host if port "#{host}:#{port}" else host end end end def server_name get_header(SERVER_NAME) end def server_port if port = get_header(SERVER_PORT) Integer(port) end end def cookies hash = fetch_header(RACK_REQUEST_COOKIE_HASH) do |key| set_header(key, {}) end string = get_header(HTTP_COOKIE) unless string == get_header(RACK_REQUEST_COOKIE_STRING) hash.replace Utils.parse_cookies_header(string) set_header(RACK_REQUEST_COOKIE_STRING, string) end hash end def content_type content_type = get_header('CONTENT_TYPE') content_type.nil? || content_type.empty? ? nil : content_type end def xhr? get_header("HTTP_X_REQUESTED_WITH") == "XMLHttpRequest" end # The `HTTP_HOST` header. def host_authority get_header(HTTP_HOST) end def host_with_port(authority = self.authority) host, _, port = split_authority(authority) if port == DEFAULT_PORTS[self.scheme] host else authority end end # Returns a formatted host, suitable for being used in a URI. def host split_authority(self.authority)[0] end # Returns an address suitable for being to resolve to an address. # In the case of a domain name or IPv4 address, the result is the same # as +host+. In the case of IPv6 or future address formats, the square # brackets are removed. def hostname split_authority(self.authority)[1] end def port if authority = self.authority _, _, port = split_authority(self.authority) if port return port end end if forwarded_port = self.forwarded_port return forwarded_port.first end if scheme = self.scheme if port = DEFAULT_PORTS[self.scheme] return port end end self.server_port end def forwarded_for if value = get_header(HTTP_X_FORWARDED_FOR) split_header(value).map do |authority| split_authority(wrap_ipv6(authority))[1] end end end def forwarded_port if value = get_header(HTTP_X_FORWARDED_PORT) split_header(value).map(&:to_i) end end def forwarded_authority if value = get_header(HTTP_X_FORWARDED_HOST) wrap_ipv6(split_header(value).first) end end def ssl? scheme == 'https' || scheme == 'wss' end def ip remote_addresses = split_header(get_header('REMOTE_ADDR')) external_addresses = reject_trusted_ip_addresses(remote_addresses) unless external_addresses.empty? return external_addresses.first end if forwarded_for = self.forwarded_for unless forwarded_for.empty? # The forwarded for addresses are ordered: client, proxy1, proxy2. # So we reject all the trusted addresses (proxy*) and return the # last client. Or if we trust everyone, we just return the first # address. return reject_trusted_ip_addresses(forwarded_for).last || forwarded_for.first end end # If all the addresses are trusted, and we aren't forwarded, just return # the first remote address, which represents the source of the request. remote_addresses.first end # The media type (type/subtype) portion of the CONTENT_TYPE header # without any media type parameters. e.g., when CONTENT_TYPE is # "text/plain;charset=utf-8", the media-type is "text/plain". # # For more information on the use of media types in HTTP, see: # http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7 def media_type MediaType.type(content_type) end # The media type parameters provided in CONTENT_TYPE as a Hash, or # an empty Hash if no CONTENT_TYPE or media-type parameters were # provided. e.g., when the CONTENT_TYPE is "text/plain;charset=utf-8", # this method responds with the following Hash: # { 'charset' => 'utf-8' } def media_type_params MediaType.params(content_type) end # The character set of the request body if a "charset" media type # parameter was given, or nil if no "charset" was specified. Note # that, per RFC2616, text/* media types that specify no explicit # charset are to be considered ISO-8859-1. def content_charset media_type_params['charset'] end # Determine whether the request body contains form-data by checking # the request Content-Type for one of the media-types: # "application/x-www-form-urlencoded" or "multipart/form-data". The # list of form-data media types can be modified through the # +FORM_DATA_MEDIA_TYPES+ array. # # A request body is also assumed to contain form-data when no # Content-Type header is provided and the request_method is POST. def form_data? type = media_type meth = get_header(RACK_METHODOVERRIDE_ORIGINAL_METHOD) || get_header(REQUEST_METHOD) (meth == POST && type.nil?) || FORM_DATA_MEDIA_TYPES.include?(type) end # Determine whether the request body contains data by checking # the request media_type against registered parse-data media-types def parseable_data? PARSEABLE_DATA_MEDIA_TYPES.include?(media_type) end # Returns the data received in the query string. def GET if get_header(RACK_REQUEST_QUERY_STRING) == query_string get_header(RACK_REQUEST_QUERY_HASH) else query_hash = parse_query(query_string, '&;') set_header(RACK_REQUEST_QUERY_STRING, query_string) set_header(RACK_REQUEST_QUERY_HASH, query_hash) end end # Returns the data received in the request body. # # This method support both application/x-www-form-urlencoded and # multipart/form-data. def POST if get_header(RACK_INPUT).nil? raise "Missing rack.input" elsif get_header(RACK_REQUEST_FORM_INPUT) == get_header(RACK_INPUT) get_header(RACK_REQUEST_FORM_HASH) elsif form_data? || parseable_data? unless set_header(RACK_REQUEST_FORM_HASH, parse_multipart) form_vars = get_header(RACK_INPUT).read # Fix for Safari Ajax postings that always append \0 # form_vars.sub!(/\0\z/, '') # performance replacement: form_vars.slice!(-1) if form_vars.end_with?("\0") set_header RACK_REQUEST_FORM_VARS, form_vars set_header RACK_REQUEST_FORM_HASH, parse_query(form_vars, '&') get_header(RACK_INPUT).rewind end set_header RACK_REQUEST_FORM_INPUT, get_header(RACK_INPUT) get_header RACK_REQUEST_FORM_HASH else {} end end # The union of GET and POST data. # # Note that modifications will not be persisted in the env. Use update_param or delete_param if you want to destructively modify params. def params self.GET.merge(self.POST) end # Destructively update a parameter, whether it's in GET and/or POST. Returns nil. # # The parameter is updated wherever it was previous defined, so GET, POST, or both. If it wasn't previously defined, it's inserted into GET. # # env['rack.input'] is not touched. def update_param(k, v) found = false if self.GET.has_key?(k) found = true self.GET[k] = v end if self.POST.has_key?(k) found = true self.POST[k] = v end unless found self.GET[k] = v end end # Destructively delete a parameter, whether it's in GET or POST. Returns the value of the deleted parameter. # # If the parameter is in both GET and POST, the POST value takes precedence since that's how #params works. # # env['rack.input'] is not touched. def delete_param(k) post_value, get_value = self.POST.delete(k), self.GET.delete(k) post_value || get_value end def base_url "#{scheme}://#{host_with_port}" end # Tries to return a remake of the original request URL as a string. def url base_url + fullpath end def path script_name + path_info end def fullpath query_string.empty? ? path : "#{path}?#{query_string}" end def accept_encoding parse_http_accept_header(get_header("HTTP_ACCEPT_ENCODING")) end def accept_language parse_http_accept_header(get_header("HTTP_ACCEPT_LANGUAGE")) end def trusted_proxy?(ip) Rack::Request.ip_filter.call(ip) end # shortcut for request.params[key] def [](key) if $VERBOSE warn("Request#[] is deprecated and will be removed in a future version of Rack. Please use request.params[] instead") end params[key.to_s] end # shortcut for request.params[key] = value # # Note that modifications will not be persisted in the env. Use update_param or delete_param if you want to destructively modify params. def []=(key, value) if $VERBOSE warn("Request#[]= is deprecated and will be removed in a future version of Rack. Please use request.params[]= instead") end params[key.to_s] = value end # like Hash#values_at def values_at(*keys) keys.map { |key| params[key] } end private def default_session; {}; end # Assist with compatibility when processing `X-Forwarded-For`. def wrap_ipv6(host) # Even thought IPv6 addresses should be wrapped in square brackets, # sometimes this is not done in various legacy/underspecified headers. # So we try to fix this situation for compatibility reasons. # Try to detect IPv6 addresses which aren't escaped yet: if !host.start_with?('[') && host.count(':') > 1 "[#{host}]" else host end end def parse_http_accept_header(header) header.to_s.split(/\s*,\s*/).map do |part| attribute, parameters = part.split(/\s*;\s*/, 2) quality = 1.0 if parameters and /\Aq=([\d.]+)/ =~ parameters quality = $1.to_f end [attribute, quality] end end def query_parser Utils.default_query_parser end def parse_query(qs, d = '&') query_parser.parse_nested_query(qs, d) end def parse_multipart Rack::Multipart.extract_multipart(self, query_parser) end def split_header(value) value ? value.strip.split(/[,\s]+/) : [] end AUTHORITY = /^ # The host: (? # An IPv6 address: (\[(?.*)\]) | # An IPv4 address: (?[\d\.]+) | # A hostname: (?[a-zA-Z0-9\.\-]+) ) # The optional port: (:(?\d+))? $/x private_constant :AUTHORITY def split_authority(authority) if match = AUTHORITY.match(authority) if address = match[:ip6] return match[:host], address, match[:port]&.to_i else return match[:host], match[:host], match[:port]&.to_i end end # Give up! return authority, authority, nil end def reject_trusted_ip_addresses(ip_addresses) ip_addresses.reject { |ip| trusted_proxy?(ip) } end def forwarded_scheme allowed_scheme(get_header(HTTP_X_FORWARDED_SCHEME)) || allowed_scheme(extract_proto_header(get_header(HTTP_X_FORWARDED_PROTO))) end def allowed_scheme(header) header if ALLOWED_SCHEMES.include?(header) end def extract_proto_header(header) if header if (comma_index = header.index(',')) header[0, comma_index] else header end end end end include Env include Helpers end end PK!E/share/gems/gems/rack-2.2.4/lib/rack/deflater.rbnu[# frozen_string_literal: true require "zlib" require "time" # for Time.httpdate module Rack # This middleware enables content encoding of http responses, # usually for purposes of compression. # # Currently supported encodings: # # * gzip # * identity (no transformation) # # This middleware automatically detects when encoding is supported # and allowed. For example no encoding is made when a cache # directive of 'no-transform' is present, when the response status # code is one that doesn't allow an entity body, or when the body # is empty. # # Note that despite the name, Deflater does not support the +deflate+ # encoding. class Deflater (require_relative 'core_ext/regexp'; using ::Rack::RegexpExtensions) if RUBY_VERSION < '2.4' # Creates Rack::Deflater middleware. Options: # # :if :: a lambda enabling / disabling deflation based on returned boolean value # (e.g use Rack::Deflater, :if => lambda { |*, body| sum=0; body.each { |i| sum += i.length }; sum > 512 }). # However, be aware that calling `body.each` inside the block will break cases where `body.each` is not idempotent, # such as when it is an +IO+ instance. # :include :: a list of content types that should be compressed. By default, all content types are compressed. # :sync :: determines if the stream is going to be flushed after every chunk. Flushing after every chunk reduces # latency for time-sensitive streaming applications, but hurts compression and throughput. # Defaults to +true+. def initialize(app, options = {}) @app = app @condition = options[:if] @compressible_types = options[:include] @sync = options.fetch(:sync, true) end def call(env) status, headers, body = @app.call(env) headers = Utils::HeaderHash[headers] unless should_deflate?(env, status, headers, body) return [status, headers, body] end request = Request.new(env) encoding = Utils.select_best_encoding(%w(gzip identity), request.accept_encoding) # Set the Vary HTTP header. vary = headers["Vary"].to_s.split(",").map(&:strip) unless vary.include?("*") || vary.include?("Accept-Encoding") headers["Vary"] = vary.push("Accept-Encoding").join(",") end case encoding when "gzip" headers['Content-Encoding'] = "gzip" headers.delete(CONTENT_LENGTH) mtime = headers["Last-Modified"] mtime = Time.httpdate(mtime).to_i if mtime [status, headers, GzipStream.new(body, mtime, @sync)] when "identity" [status, headers, body] when nil message = "An acceptable encoding for the requested resource #{request.fullpath} could not be found." bp = Rack::BodyProxy.new([message]) { body.close if body.respond_to?(:close) } [406, { CONTENT_TYPE => "text/plain", CONTENT_LENGTH => message.length.to_s }, bp] end end # Body class used for gzip encoded responses. class GzipStream # Initialize the gzip stream. Arguments: # body :: Response body to compress with gzip # mtime :: The modification time of the body, used to set the # modification time in the gzip header. # sync :: Whether to flush each gzip chunk as soon as it is ready. def initialize(body, mtime, sync) @body = body @mtime = mtime @sync = sync end # Yield gzip compressed strings to the given block. def each(&block) @writer = block gzip = ::Zlib::GzipWriter.new(self) gzip.mtime = @mtime if @mtime @body.each { |part| # Skip empty strings, as they would result in no output, # and flushing empty parts would raise Zlib::BufError. next if part.empty? gzip.write(part) gzip.flush if @sync } ensure gzip.close end # Call the block passed to #each with the the gzipped data. def write(data) @writer.call(data) end # Close the original body if possible. def close @body.close if @body.respond_to?(:close) end end private # Whether the body should be compressed. def should_deflate?(env, status, headers, body) # Skip compressing empty entity body responses and responses with # no-transform set. if Utils::STATUS_WITH_NO_ENTITY_BODY.key?(status.to_i) || /\bno-transform\b/.match?(headers['Cache-Control'].to_s) || headers['Content-Encoding']&.!~(/\bidentity\b/) return false end # Skip if @compressible_types are given and does not include request's content type return false if @compressible_types && !(headers.has_key?('Content-Type') && @compressible_types.include?(headers['Content-Type'][/[^;]*/])) # Skip if @condition lambda is given and evaluates to false return false if @condition && !@condition.call(env, status, headers, body) # No point in compressing empty body, also handles usage with # Rack::Sendfile. return false if headers[CONTENT_LENGTH] == '0' true end end end PK!+uu.share/gems/gems/rack-2.2.4/lib/rack/runtime.rbnu[# frozen_string_literal: true module Rack # Sets an "X-Runtime" response header, indicating the response # time of the request, in seconds # # You can put it right before the application to see the processing # time, or before all the other middlewares to include time for them, # too. class Runtime FORMAT_STRING = "%0.6f" # :nodoc: HEADER_NAME = "X-Runtime" # :nodoc: def initialize(app, name = nil) @app = app @header_name = HEADER_NAME @header_name += "-#{name}" if name end def call(env) start_time = Utils.clock_time status, headers, body = @app.call(env) headers = Utils::HeaderHash[headers] request_time = Utils.clock_time - start_time unless headers.key?(@header_name) headers[@header_name] = FORMAT_STRING % request_time end [status, headers, body] end end end PK!82share/gems/gems/rack-2.2.4/lib/rack/null_logger.rbnu[# frozen_string_literal: true module Rack class NullLogger def initialize(app) @app = app end def call(env) env[RACK_LOGGER] = self @app.call(env) end def info(progname = nil, &block); end def debug(progname = nil, &block); end def warn(progname = nil, &block); end def error(progname = nil, &block); end def fatal(progname = nil, &block); end def unknown(progname = nil, &block); end def info? ; end def debug? ; end def warn? ; end def error? ; end def fatal? ; end def level ; end def progname ; end def datetime_format ; end def formatter ; end def sev_threshold ; end def level=(level); end def progname=(progname); end def datetime_format=(datetime_format); end def formatter=(formatter); end def sev_threshold=(sev_threshold); end def close ; end def add(severity, message = nil, progname = nil, &block); end def <<(msg); end end end PK!t-꟯ 2share/gems/gems/rack-2.2.4/lib/rack/show_status.rbnu[# frozen_string_literal: true require 'erb' module Rack # Rack::ShowStatus catches all empty responses and replaces them # with a site explaining the error. # # Additional details can be put into rack.showstatus.detail # and will be shown as HTML. If such details exist, the error page # is always rendered, even if the reply was not empty. class ShowStatus def initialize(app) @app = app @template = ERB.new(TEMPLATE) end def call(env) status, headers, body = @app.call(env) headers = Utils::HeaderHash[headers] empty = headers[CONTENT_LENGTH].to_i <= 0 # client or server error, or explicit message if (status.to_i >= 400 && empty) || env[RACK_SHOWSTATUS_DETAIL] # This double assignment is to prevent an "unused variable" warning. # Yes, it is dumb, but I don't like Ruby yelling at me. req = req = Rack::Request.new(env) message = Rack::Utils::HTTP_STATUS_CODES[status.to_i] || status.to_s # This double assignment is to prevent an "unused variable" warning. # Yes, it is dumb, but I don't like Ruby yelling at me. detail = detail = env[RACK_SHOWSTATUS_DETAIL] || message body = @template.result(binding) size = body.bytesize [status, headers.merge(CONTENT_TYPE => "text/html", CONTENT_LENGTH => size.to_s), [body]] else [status, headers, body] end end def h(obj) # :nodoc: case obj when String Utils.escape_html(obj) else Utils.escape_html(obj.inspect) end end # :stopdoc: # adapted from Django # Copyright (c) Django Software Foundation and individual contributors. # Used under the modified BSD license: # http://www.xfree86.org/3.3.6/COPYRIGHT2.html#5 TEMPLATE = <<'HTML' <%=h message %> at <%=h req.script_name + req.path_info %>

<%=h message %> (<%= status.to_i %>)

Request Method: <%=h req.request_method %>
Request URL: <%=h req.url %>

<%=h detail %>

You're seeing this error because you use Rack::ShowStatus.

HTML # :startdoc: end end PK!JO} } .share/gems/gems/rack-2.2.4/lib/rack/handler.rbnu[# frozen_string_literal: true module Rack # *Handlers* connect web servers with Rack. # # Rack includes Handlers for Thin, WEBrick, FastCGI, CGI, SCGI # and LiteSpeed. # # Handlers usually are activated by calling MyHandler.run(myapp). # A second optional hash can be passed to include server-specific # configuration. module Handler def self.get(server) return unless server server = server.to_s unless @handlers.include? server load_error = try_require('rack/handler', server) end if klass = @handlers[server] const_get(klass) else const_get(server, false) end rescue NameError => name_error raise load_error || name_error end # Select first available Rack handler given an `Array` of server names. # Raises `LoadError` if no handler was found. # # > pick ['thin', 'webrick'] # => Rack::Handler::WEBrick def self.pick(server_names) server_names = Array(server_names) server_names.each do |server_name| begin return get(server_name.to_s) rescue LoadError, NameError end end raise LoadError, "Couldn't find handler for: #{server_names.join(', ')}." end SERVER_NAMES = %w(puma thin falcon webrick).freeze private_constant :SERVER_NAMES def self.default # Guess. if ENV.include?("PHP_FCGI_CHILDREN") Rack::Handler::FastCGI elsif ENV.include?(REQUEST_METHOD) Rack::Handler::CGI elsif ENV.include?("RACK_HANDLER") self.get(ENV["RACK_HANDLER"]) else pick SERVER_NAMES end end # Transforms server-name constants to their canonical form as filenames, # then tries to require them but silences the LoadError if not found # # Naming convention: # # Foo # => 'foo' # FooBar # => 'foo_bar.rb' # FooBAR # => 'foobar.rb' # FOObar # => 'foobar.rb' # FOOBAR # => 'foobar.rb' # FooBarBaz # => 'foo_bar_baz.rb' def self.try_require(prefix, const_name) file = const_name.gsub(/^[A-Z]+/) { |pre| pre.downcase }. gsub(/[A-Z]+[^A-Z]/, '_\&').downcase require(::File.join(prefix, file)) nil rescue LoadError => error error end def self.register(server, klass) @handlers ||= {} @handlers[server.to_s] = klass.to_s end autoload :CGI, "rack/handler/cgi" autoload :FastCGI, "rack/handler/fastcgi" autoload :WEBrick, "rack/handler/webrick" autoload :LSWS, "rack/handler/lsws" autoload :SCGI, "rack/handler/scgi" autoload :Thin, "rack/handler/thin" register 'cgi', 'Rack::Handler::CGI' register 'fastcgi', 'Rack::Handler::FastCGI' register 'webrick', 'Rack::Handler::WEBrick' register 'lsws', 'Rack::Handler::LSWS' register 'scgi', 'Rack::Handler::SCGI' register 'thin', 'Rack::Handler::Thin' end end PK!Lź5share/gems/gems/rack-2.2.4/lib/rack/session/cookie.rbnu[# frozen_string_literal: true require 'openssl' require 'zlib' require_relative 'abstract/id' require 'json' require 'base64' module Rack module Session # Rack::Session::Cookie provides simple cookie based session management. # By default, the session is a Ruby Hash stored as base64 encoded marshalled # data set to :key (default: rack.session). The object that encodes the # session data is configurable and must respond to +encode+ and +decode+. # Both methods must take a string and return a string. # # When the secret key is set, cookie data is checked for data integrity. # The old secret key is also accepted and allows graceful secret rotation. # # Example: # # use Rack::Session::Cookie, :key => 'rack.session', # :domain => 'foo.com', # :path => '/', # :expire_after => 2592000, # :secret => 'change_me', # :old_secret => 'also_change_me' # # All parameters are optional. # # Example of a cookie with no encoding: # # Rack::Session::Cookie.new(application, { # :coder => Rack::Session::Cookie::Identity.new # }) # # Example of a cookie with custom encoding: # # Rack::Session::Cookie.new(application, { # :coder => Class.new { # def encode(str); str.reverse; end # def decode(str); str.reverse; end # }.new # }) # class Cookie < Abstract::PersistedSecure # Encode session cookies as Base64 class Base64 def encode(str) ::Base64.strict_encode64(str) end def decode(str) ::Base64.decode64(str) end # Encode session cookies as Marshaled Base64 data class Marshal < Base64 def encode(str) super(::Marshal.dump(str)) end def decode(str) return unless str ::Marshal.load(super(str)) rescue nil end end # N.B. Unlike other encoding methods, the contained objects must be a # valid JSON composite type, either a Hash or an Array. class JSON < Base64 def encode(obj) super(::JSON.dump(obj)) end def decode(str) return unless str ::JSON.parse(super(str)) rescue nil end end class ZipJSON < Base64 def encode(obj) super(Zlib::Deflate.deflate(::JSON.dump(obj))) end def decode(str) return unless str ::JSON.parse(Zlib::Inflate.inflate(super(str))) rescue nil end end end # Use no encoding for session cookies class Identity def encode(str); str; end def decode(str); str; end end attr_reader :coder def initialize(app, options = {}) @secrets = options.values_at(:secret, :old_secret).compact @hmac = options.fetch(:hmac, OpenSSL::Digest::SHA1) warn <<-MSG unless secure?(options) SECURITY WARNING: No secret option provided to Rack::Session::Cookie. This poses a security threat. It is strongly recommended that you provide a secret to prevent exploits that may be possible from crafted cookies. This will not be supported in future versions of Rack, and future versions will even invalidate your existing user cookies. Called from: #{caller[0]}. MSG @coder = options[:coder] ||= Base64::Marshal.new super(app, options.merge!(cookie_only: true)) end private def find_session(req, sid) data = unpacked_cookie_data(req) data = persistent_session_id!(data) [data["session_id"], data] end def extract_session_id(request) unpacked_cookie_data(request)["session_id"] end def unpacked_cookie_data(request) request.fetch_header(RACK_SESSION_UNPACKED_COOKIE_DATA) do |k| session_data = request.cookies[@key] if @secrets.size > 0 && session_data session_data, _, digest = session_data.rpartition('--') session_data = nil unless digest_match?(session_data, digest) end request.set_header(k, coder.decode(session_data) || {}) end end def persistent_session_id!(data, sid = nil) data ||= {} data["session_id"] ||= sid || generate_sid data end class SessionId < DelegateClass(Session::SessionId) attr_reader :cookie_value def initialize(session_id, cookie_value) super(session_id) @cookie_value = cookie_value end end def write_session(req, session_id, session, options) session = session.merge("session_id" => session_id) session_data = coder.encode(session) if @secrets.first session_data << "--#{generate_hmac(session_data, @secrets.first)}" end if session_data.size > (4096 - @key.size) req.get_header(RACK_ERRORS).puts("Warning! Rack::Session::Cookie data size exceeds 4K.") nil else SessionId.new(session_id, session_data) end end def delete_session(req, session_id, options) # Nothing to do here, data is in the client generate_sid unless options[:drop] end def digest_match?(data, digest) return unless data && digest @secrets.any? do |secret| Rack::Utils.secure_compare(digest, generate_hmac(data, secret)) end end def generate_hmac(data, secret) OpenSSL::HMAC.hexdigest(@hmac.new, secret, data) end def secure?(options) @secrets.size >= 1 || (options[:coder] && options[:let_coder_handle_secure_encoding]) end end end end PK!  3share/gems/gems/rack-2.2.4/lib/rack/session/pool.rbnu[# frozen_string_literal: true # AUTHOR: blink ; blink#ruby-lang@irc.freenode.net # THANKS: # apeiros, for session id generation, expiry setup, and threadiness # sergio, threadiness and bugreps require_relative 'abstract/id' require 'thread' module Rack module Session # Rack::Session::Pool provides simple cookie based session management. # Session data is stored in a hash held by @pool. # In the context of a multithreaded environment, sessions being # committed to the pool is done in a merging manner. # # The :drop option is available in rack.session.options if you wish to # explicitly remove the session from the session cache. # # Example: # myapp = MyRackApp.new # sessioned = Rack::Session::Pool.new(myapp, # :domain => 'foo.com', # :expire_after => 2592000 # ) # Rack::Handler::WEBrick.run sessioned class Pool < Abstract::PersistedSecure attr_reader :mutex, :pool DEFAULT_OPTIONS = Abstract::ID::DEFAULT_OPTIONS.merge drop: false def initialize(app, options = {}) super @pool = Hash.new @mutex = Mutex.new end def generate_sid loop do sid = super break sid unless @pool.key? sid.private_id end end def find_session(req, sid) with_lock(req) do unless sid and session = get_session_with_fallback(sid) sid, session = generate_sid, {} @pool.store sid.private_id, session end [sid, session] end end def write_session(req, session_id, new_session, options) with_lock(req) do @pool.store session_id.private_id, new_session session_id end end def delete_session(req, session_id, options) with_lock(req) do @pool.delete(session_id.public_id) @pool.delete(session_id.private_id) generate_sid unless options[:drop] end end def with_lock(req) @mutex.lock if req.multithread? yield ensure @mutex.unlock if @mutex.locked? end private def get_session_with_fallback(sid) @pool[sid.private_id] || @pool[sid.public_id] end end end end PK!vn7share/gems/gems/rack-2.2.4/lib/rack/session/memcache.rbnu[# frozen_string_literal: true require 'rack/session/dalli' module Rack module Session warn "Rack::Session::Memcache is deprecated, please use Rack::Session::Dalli from 'dalli' gem instead." Memcache = Dalli end end PK!`};};:share/gems/gems/rack-2.2.4/lib/rack/session/abstract/id.rbnu[# frozen_string_literal: true # AUTHOR: blink ; blink#ruby-lang@irc.freenode.net # bugrep: Andreas Zehnder require_relative '../../../rack' require 'time' require 'securerandom' require 'digest/sha2' module Rack module Session class SessionId ID_VERSION = 2 attr_reader :public_id def initialize(public_id) @public_id = public_id end def private_id "#{ID_VERSION}::#{hash_sid(public_id)}" end alias :cookie_value :public_id alias :to_s :public_id def empty?; false; end def inspect; public_id.inspect; end private def hash_sid(sid) Digest::SHA256.hexdigest(sid) end end module Abstract # SessionHash is responsible to lazily load the session from store. class SessionHash include Enumerable attr_writer :id Unspecified = Object.new def self.find(req) req.get_header RACK_SESSION end def self.set(req, session) req.set_header RACK_SESSION, session end def self.set_options(req, options) req.set_header RACK_SESSION_OPTIONS, options.dup end def initialize(store, req) @store = store @req = req @loaded = false end def id return @id if @loaded or instance_variable_defined?(:@id) @id = @store.send(:extract_session_id, @req) end def options @req.session_options end def each(&block) load_for_read! @data.each(&block) end def [](key) load_for_read! @data[key.to_s] end def dig(key, *keys) load_for_read! @data.dig(key.to_s, *keys) end def fetch(key, default = Unspecified, &block) load_for_read! if default == Unspecified @data.fetch(key.to_s, &block) else @data.fetch(key.to_s, default, &block) end end def has_key?(key) load_for_read! @data.has_key?(key.to_s) end alias :key? :has_key? alias :include? :has_key? def []=(key, value) load_for_write! @data[key.to_s] = value end alias :store :[]= def clear load_for_write! @data.clear end def destroy clear @id = @store.send(:delete_session, @req, id, options) end def to_hash load_for_read! @data.dup end def update(hash) load_for_write! @data.update(stringify_keys(hash)) end alias :merge! :update def replace(hash) load_for_write! @data.replace(stringify_keys(hash)) end def delete(key) load_for_write! @data.delete(key.to_s) end def inspect if loaded? @data.inspect else "#<#{self.class}:0x#{self.object_id.to_s(16)} not yet loaded>" end end def exists? return @exists if instance_variable_defined?(:@exists) @data = {} @exists = @store.send(:session_exists?, @req) end def loaded? @loaded end def empty? load_for_read! @data.empty? end def keys load_for_read! @data.keys end def values load_for_read! @data.values end private def load_for_read! load! if !loaded? && exists? end def load_for_write! load! unless loaded? end def load! @id, session = @store.send(:load_session, @req) @data = stringify_keys(session) @loaded = true end def stringify_keys(other) # Use transform_keys after dropping Ruby 2.4 support hash = {} other.to_hash.each do |key, value| hash[key.to_s] = value end hash end end # ID sets up a basic framework for implementing an id based sessioning # service. Cookies sent to the client for maintaining sessions will only # contain an id reference. Only #find_session, #write_session and # #delete_session are required to be overwritten. # # All parameters are optional. # * :key determines the name of the cookie, by default it is # 'rack.session' # * :path, :domain, :expire_after, :secure, and :httponly set the related # cookie options as by Rack::Response#set_cookie # * :skip will not a set a cookie in the response nor update the session state # * :defer will not set a cookie in the response but still update the session # state if it is used with a backend # * :renew (implementation dependent) will prompt the generation of a new # session id, and migration of data to be referenced at the new id. If # :defer is set, it will be overridden and the cookie will be set. # * :sidbits sets the number of bits in length that a generated session # id will be. # # These options can be set on a per request basis, at the location of # env['rack.session.options']. Additionally the id of the # session can be found within the options hash at the key :id. It is # highly not recommended to change its value. # # Is Rack::Utils::Context compatible. # # Not included by default; you must require 'rack/session/abstract/id' # to use. class Persisted DEFAULT_OPTIONS = { key: RACK_SESSION, path: '/', domain: nil, expire_after: nil, secure: false, httponly: true, defer: false, renew: false, sidbits: 128, cookie_only: true, secure_random: ::SecureRandom }.freeze attr_reader :key, :default_options, :sid_secure def initialize(app, options = {}) @app = app @default_options = self.class::DEFAULT_OPTIONS.merge(options) @key = @default_options.delete(:key) @cookie_only = @default_options.delete(:cookie_only) @same_site = @default_options.delete(:same_site) initialize_sid end def call(env) context(env) end def context(env, app = @app) req = make_request env prepare_session(req) status, headers, body = app.call(req.env) res = Rack::Response::Raw.new status, headers commit_session(req, res) [status, headers, body] end private def make_request(env) Rack::Request.new env end def initialize_sid @sidbits = @default_options[:sidbits] @sid_secure = @default_options[:secure_random] @sid_length = @sidbits / 4 end # Generate a new session id using Ruby #rand. The size of the # session id is controlled by the :sidbits option. # Monkey patch this to use custom methods for session id generation. def generate_sid(secure = @sid_secure) if secure secure.hex(@sid_length) else "%0#{@sid_length}x" % Kernel.rand(2**@sidbits - 1) end rescue NotImplementedError generate_sid(false) end # Sets the lazy session at 'rack.session' and places options and session # metadata into 'rack.session.options'. def prepare_session(req) session_was = req.get_header RACK_SESSION session = session_class.new(self, req) req.set_header RACK_SESSION, session req.set_header RACK_SESSION_OPTIONS, @default_options.dup session.merge! session_was if session_was end # Extracts the session id from provided cookies and passes it and the # environment to #find_session. def load_session(req) sid = current_session_id(req) sid, session = find_session(req, sid) [sid, session || {}] end # Extract session id from request object. def extract_session_id(request) sid = request.cookies[@key] sid ||= request.params[@key] unless @cookie_only sid end # Returns the current session id from the SessionHash. def current_session_id(req) req.get_header(RACK_SESSION).id end # Check if the session exists or not. def session_exists?(req) value = current_session_id(req) value && !value.empty? end # Session should be committed if it was loaded, any of specific options like :renew, :drop # or :expire_after was given and the security permissions match. Skips if skip is given. def commit_session?(req, session, options) if options[:skip] false else has_session = loaded_session?(session) || forced_session_update?(session, options) has_session && security_matches?(req, options) end end def loaded_session?(session) !session.is_a?(session_class) || session.loaded? end def forced_session_update?(session, options) force_options?(options) && session && !session.empty? end def force_options?(options) options.values_at(:max_age, :renew, :drop, :defer, :expire_after).any? end def security_matches?(request, options) return true unless options[:secure] request.ssl? end # Acquires the session from the environment and the session id from # the session options and passes them to #write_session. If successful # and the :defer option is not true, a cookie will be added to the # response with the session's id. def commit_session(req, res) session = req.get_header RACK_SESSION options = session.options if options[:drop] || options[:renew] session_id = delete_session(req, session.id || generate_sid, options) return unless session_id end return unless commit_session?(req, session, options) session.send(:load!) unless loaded_session?(session) session_id ||= session.id session_data = session.to_hash.delete_if { |k, v| v.nil? } if not data = write_session(req, session_id, session_data, options) req.get_header(RACK_ERRORS).puts("Warning! #{self.class.name} failed to save session. Content dropped.") elsif options[:defer] and not options[:renew] req.get_header(RACK_ERRORS).puts("Deferring cookie for #{session_id}") if $VERBOSE else cookie = Hash.new cookie[:value] = cookie_value(data) cookie[:expires] = Time.now + options[:expire_after] if options[:expire_after] cookie[:expires] = Time.now + options[:max_age] if options[:max_age] if @same_site.respond_to? :call cookie[:same_site] = @same_site.call(req, res) else cookie[:same_site] = @same_site end set_cookie(req, res, cookie.merge!(options)) end end public :commit_session def cookie_value(data) data end # Sets the cookie back to the client with session id. We skip the cookie # setting if the value didn't change (sid is the same) or expires was given. def set_cookie(request, res, cookie) if request.cookies[@key] != cookie[:value] || cookie[:expires] res.set_cookie_header = Utils.add_cookie_to_header(res.set_cookie_header, @key, cookie) end end # Allow subclasses to prepare_session for different Session classes def session_class SessionHash end # All thread safety and session retrieval procedures should occur here. # Should return [session_id, session]. # If nil is provided as the session id, generation of a new valid id # should occur within. def find_session(env, sid) raise '#find_session not implemented.' end # All thread safety and session storage procedures should occur here. # Must return the session id if the session was saved successfully, or # false if the session could not be saved. def write_session(req, sid, session, options) raise '#write_session not implemented.' end # All thread safety and session destroy procedures should occur here. # Should return a new session id or nil if options[:drop] def delete_session(req, sid, options) raise '#delete_session not implemented' end end class PersistedSecure < Persisted class SecureSessionHash < SessionHash def [](key) if key == "session_id" load_for_read! id.public_id if id else super end end end def generate_sid(*) public_id = super SessionId.new(public_id) end def extract_session_id(*) public_id = super public_id && SessionId.new(public_id) end private def session_class SecureSessionHash end def cookie_value(data) data.cookie_value end end class ID < Persisted def self.inherited(klass) k = klass.ancestors.find { |kl| kl.respond_to?(:superclass) && kl.superclass == ID } unless k.instance_variable_defined?(:"@_rack_warned") warn "#{klass} is inheriting from #{ID}. Inheriting from #{ID} is deprecated, please inherit from #{Persisted} instead" if $VERBOSE k.instance_variable_set(:"@_rack_warned", true) end super end # All thread safety and session retrieval procedures should occur here. # Should return [session_id, session]. # If nil is provided as the session id, generation of a new valid id # should occur within. def find_session(req, sid) get_session req.env, sid end # All thread safety and session storage procedures should occur here. # Must return the session id if the session was saved successfully, or # false if the session could not be saved. def write_session(req, sid, session, options) set_session req.env, sid, session, options end # All thread safety and session destroy procedures should occur here. # Should return a new session id or nil if options[:drop] def delete_session(req, sid, options) destroy_session req.env, sid, options end end end end end PK!|O2GG,share/gems/gems/rack-2.2.4/lib/rack/utils.rbnu[# -*- encoding: binary -*- # frozen_string_literal: true require 'uri' require 'fileutils' require 'set' require 'tempfile' require 'time' require_relative 'query_parser' module Rack # Rack::Utils contains a grab-bag of useful methods for writing web # applications adopted from all kinds of Ruby libraries. module Utils (require_relative 'core_ext/regexp'; using ::Rack::RegexpExtensions) if RUBY_VERSION < '2.4' ParameterTypeError = QueryParser::ParameterTypeError InvalidParameterError = QueryParser::InvalidParameterError DEFAULT_SEP = QueryParser::DEFAULT_SEP COMMON_SEP = QueryParser::COMMON_SEP KeySpaceConstrainedParams = QueryParser::Params RFC2822_DAY_NAME = [ 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat' ] RFC2822_MONTH_NAME = [ 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' ] class << self attr_accessor :default_query_parser end # The default number of bytes to allow parameter keys to take up. # This helps prevent a rogue client from flooding a Request. self.default_query_parser = QueryParser.make_default(65536, 100) module_function # URI escapes. (CGI style space to +) def escape(s) URI.encode_www_form_component(s) end # Like URI escaping, but with %20 instead of +. Strictly speaking this is # true URI escaping. def escape_path(s) ::URI::DEFAULT_PARSER.escape s end # Unescapes the **path** component of a URI. See Rack::Utils.unescape for # unescaping query parameters or form components. def unescape_path(s) ::URI::DEFAULT_PARSER.unescape s end # Unescapes a URI escaped string with +encoding+. +encoding+ will be the # target encoding of the string returned, and it defaults to UTF-8 def unescape(s, encoding = Encoding::UTF_8) URI.decode_www_form_component(s, encoding) end class << self attr_accessor :multipart_part_limit end # The maximum number of parts a request can contain. Accepting too many part # can lead to the server running out of file handles. # Set to `0` for no limit. self.multipart_part_limit = (ENV['RACK_MULTIPART_PART_LIMIT'] || 128).to_i def self.param_depth_limit default_query_parser.param_depth_limit end def self.param_depth_limit=(v) self.default_query_parser = self.default_query_parser.new_depth_limit(v) end def self.key_space_limit default_query_parser.key_space_limit end def self.key_space_limit=(v) self.default_query_parser = self.default_query_parser.new_space_limit(v) end if defined?(Process::CLOCK_MONOTONIC) def clock_time Process.clock_gettime(Process::CLOCK_MONOTONIC) end else # :nocov: def clock_time Time.now.to_f end # :nocov: end def parse_query(qs, d = nil, &unescaper) Rack::Utils.default_query_parser.parse_query(qs, d, &unescaper) end def parse_nested_query(qs, d = nil) Rack::Utils.default_query_parser.parse_nested_query(qs, d) end def build_query(params) params.map { |k, v| if v.class == Array build_query(v.map { |x| [k, x] }) else v.nil? ? escape(k) : "#{escape(k)}=#{escape(v)}" end }.join("&") end def build_nested_query(value, prefix = nil) case value when Array value.map { |v| build_nested_query(v, "#{prefix}[]") }.join("&") when Hash value.map { |k, v| build_nested_query(v, prefix ? "#{prefix}[#{escape(k)}]" : escape(k)) }.delete_if(&:empty?).join('&') when nil prefix else raise ArgumentError, "value must be a Hash" if prefix.nil? "#{prefix}=#{escape(value)}" end end def q_values(q_value_header) q_value_header.to_s.split(/\s*,\s*/).map do |part| value, parameters = part.split(/\s*;\s*/, 2) quality = 1.0 if parameters && (md = /\Aq=([\d.]+)/.match(parameters)) quality = md[1].to_f end [value, quality] end end # Return best accept value to use, based on the algorithm # in RFC 2616 Section 14. If there are multiple best # matches (same specificity and quality), the value returned # is arbitrary. def best_q_match(q_value_header, available_mimes) values = q_values(q_value_header) matches = values.map do |req_mime, quality| match = available_mimes.find { |am| Rack::Mime.match?(am, req_mime) } next unless match [match, quality] end.compact.sort_by do |match, quality| (match.split('/', 2).count('*') * -10) + quality end.last matches && matches.first end ESCAPE_HTML = { "&" => "&", "<" => "<", ">" => ">", "'" => "'", '"' => """, "/" => "/" } ESCAPE_HTML_PATTERN = Regexp.union(*ESCAPE_HTML.keys) # Escape ampersands, brackets and quotes to their HTML/XML entities. def escape_html(string) string.to_s.gsub(ESCAPE_HTML_PATTERN){|c| ESCAPE_HTML[c] } end def select_best_encoding(available_encodings, accept_encoding) # http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html expanded_accept_encoding = [] accept_encoding.each do |m, q| preference = available_encodings.index(m) || available_encodings.size if m == "*" (available_encodings - accept_encoding.map(&:first)).each do |m2| expanded_accept_encoding << [m2, q, preference] end else expanded_accept_encoding << [m, q, preference] end end encoding_candidates = expanded_accept_encoding .sort_by { |_, q, p| [-q, p] } .map!(&:first) unless encoding_candidates.include?("identity") encoding_candidates.push("identity") end expanded_accept_encoding.each do |m, q| encoding_candidates.delete(m) if q == 0.0 end (encoding_candidates & available_encodings)[0] end def parse_cookies(env) parse_cookies_header env[HTTP_COOKIE] end def parse_cookies_header(header) # According to RFC 6265: # The syntax for cookie headers only supports semicolons # User Agent -> Server == # Cookie: SID=31d4d96e407aad42; lang=en-US return {} unless header header.split(/[;] */n).each_with_object({}) do |cookie, cookies| next if cookie.empty? key, value = cookie.split('=', 2) cookies[key] = (unescape(value) rescue value) unless cookies.key?(key) end end def add_cookie_to_header(header, key, value) case value when Hash domain = "; domain=#{value[:domain]}" if value[:domain] path = "; path=#{value[:path]}" if value[:path] max_age = "; max-age=#{value[:max_age]}" if value[:max_age] expires = "; expires=#{value[:expires].httpdate}" if value[:expires] secure = "; secure" if value[:secure] httponly = "; HttpOnly" if (value.key?(:httponly) ? value[:httponly] : value[:http_only]) same_site = case value[:same_site] when false, nil nil when :none, 'None', :None '; SameSite=None' when :lax, 'Lax', :Lax '; SameSite=Lax' when true, :strict, 'Strict', :Strict '; SameSite=Strict' else raise ArgumentError, "Invalid SameSite value: #{value[:same_site].inspect}" end value = value[:value] end value = [value] unless Array === value cookie = "#{escape(key)}=#{value.map { |v| escape v }.join('&')}#{domain}" \ "#{path}#{max_age}#{expires}#{secure}#{httponly}#{same_site}" case header when nil, '' cookie when String [header, cookie].join("\n") when Array (header + [cookie]).join("\n") else raise ArgumentError, "Unrecognized cookie header value. Expected String, Array, or nil, got #{header.inspect}" end end def set_cookie_header!(header, key, value) header[SET_COOKIE] = add_cookie_to_header(header[SET_COOKIE], key, value) nil end def make_delete_cookie_header(header, key, value) case header when nil, '' cookies = [] when String cookies = header.split("\n") when Array cookies = header end key = escape(key) domain = value[:domain] path = value[:path] regexp = if domain if path /\A#{key}=.*(?:domain=#{domain}(?:;|$).*path=#{path}(?:;|$)|path=#{path}(?:;|$).*domain=#{domain}(?:;|$))/ else /\A#{key}=.*domain=#{domain}(?:;|$)/ end elsif path /\A#{key}=.*path=#{path}(?:;|$)/ else /\A#{key}=/ end cookies.reject! { |cookie| regexp.match? cookie } cookies.join("\n") end def delete_cookie_header!(header, key, value = {}) header[SET_COOKIE] = add_remove_cookie_to_header(header[SET_COOKIE], key, value) nil end # Adds a cookie that will *remove* a cookie from the client. Hence the # strange method name. def add_remove_cookie_to_header(header, key, value = {}) new_header = make_delete_cookie_header(header, key, value) add_cookie_to_header(new_header, key, { value: '', path: nil, domain: nil, max_age: '0', expires: Time.at(0) }.merge(value)) end def rfc2822(time) time.rfc2822 end # Modified version of stdlib time.rb Time#rfc2822 to use '%d-%b-%Y' instead # of '% %b %Y'. # It assumes that the time is in GMT to comply to the RFC 2109. # # NOTE: I'm not sure the RFC says it requires GMT, but is ambiguous enough # that I'm certain someone implemented only that option. # Do not use %a and %b from Time.strptime, it would use localized names for # weekday and month. # def rfc2109(time) wday = RFC2822_DAY_NAME[time.wday] mon = RFC2822_MONTH_NAME[time.mon - 1] time.strftime("#{wday}, %d-#{mon}-%Y %H:%M:%S GMT") end # Parses the "Range:" header, if present, into an array of Range objects. # Returns nil if the header is missing or syntactically invalid. # Returns an empty array if none of the ranges are satisfiable. def byte_ranges(env, size) warn "`byte_ranges` is deprecated, please use `get_byte_ranges`" if $VERBOSE get_byte_ranges env['HTTP_RANGE'], size end def get_byte_ranges(http_range, size) # See return nil unless http_range && http_range =~ /bytes=([^;]+)/ ranges = [] $1.split(/,\s*/).each do |range_spec| return nil unless range_spec =~ /(\d*)-(\d*)/ r0, r1 = $1, $2 if r0.empty? return nil if r1.empty? # suffix-byte-range-spec, represents trailing suffix of file r0 = size - r1.to_i r0 = 0 if r0 < 0 r1 = size - 1 else r0 = r0.to_i if r1.empty? r1 = size - 1 else r1 = r1.to_i return nil if r1 < r0 # backwards range is syntactically invalid r1 = size - 1 if r1 >= size end end ranges << (r0..r1) if r0 <= r1 end ranges end # Constant time string comparison. # # NOTE: the values compared should be of fixed length, such as strings # that have already been processed by HMAC. This should not be used # on variable length plaintext strings because it could leak length info # via timing attacks. def secure_compare(a, b) return false unless a.bytesize == b.bytesize l = a.unpack("C*") r, i = 0, -1 b.each_byte { |v| r |= v ^ l[i += 1] } r == 0 end # Context allows the use of a compatible middleware at different points # in a request handling stack. A compatible middleware must define # #context which should take the arguments env and app. The first of which # would be the request environment. The second of which would be the rack # application that the request would be forwarded to. class Context attr_reader :for, :app def initialize(app_f, app_r) raise 'running context does not respond to #context' unless app_f.respond_to? :context @for, @app = app_f, app_r end def call(env) @for.context(env, @app) end def recontext(app) self.class.new(@for, app) end def context(env, app = @app) recontext(app).call(env) end end # A case-insensitive Hash that preserves the original case of a # header when set. # # @api private class HeaderHash < Hash # :nodoc: def self.[](headers) if headers.is_a?(HeaderHash) && !headers.frozen? return headers else return self.new(headers) end end def initialize(hash = {}) super() @names = {} hash.each { |k, v| self[k] = v } end # on dup/clone, we need to duplicate @names hash def initialize_copy(other) super @names = other.names.dup end # on clear, we need to clear @names hash def clear super @names.clear end def each super do |k, v| yield(k, v.respond_to?(:to_ary) ? v.to_ary.join("\n") : v) end end def to_hash hash = {} each { |k, v| hash[k] = v } hash end def [](k) super(k) || super(@names[k.downcase]) end def []=(k, v) canonical = k.downcase.freeze delete k if @names[canonical] && @names[canonical] != k # .delete is expensive, don't invoke it unless necessary @names[canonical] = k super k, v end def delete(k) canonical = k.downcase result = super @names.delete(canonical) result end def include?(k) super || @names.include?(k.downcase) end alias_method :has_key?, :include? alias_method :member?, :include? alias_method :key?, :include? def merge!(other) other.each { |k, v| self[k] = v } self end def merge(other) hash = dup hash.merge! other end def replace(other) clear other.each { |k, v| self[k] = v } self end protected def names @names end end # Every standard HTTP code mapped to the appropriate message. # Generated with: # curl -s https://www.iana.org/assignments/http-status-codes/http-status-codes-1.csv | \ # ruby -ne 'm = /^(\d{3}),(?!Unassigned|\(Unused\))([^,]+)/.match($_) and \ # puts "#{m[1]} => \x27#{m[2].strip}\x27,"' HTTP_STATUS_CODES = { 100 => 'Continue', 101 => 'Switching Protocols', 102 => 'Processing', 103 => 'Early Hints', 200 => 'OK', 201 => 'Created', 202 => 'Accepted', 203 => 'Non-Authoritative Information', 204 => 'No Content', 205 => 'Reset Content', 206 => 'Partial Content', 207 => 'Multi-Status', 208 => 'Already Reported', 226 => 'IM Used', 300 => 'Multiple Choices', 301 => 'Moved Permanently', 302 => 'Found', 303 => 'See Other', 304 => 'Not Modified', 305 => 'Use Proxy', 306 => '(Unused)', 307 => 'Temporary Redirect', 308 => 'Permanent Redirect', 400 => 'Bad Request', 401 => 'Unauthorized', 402 => 'Payment Required', 403 => 'Forbidden', 404 => 'Not Found', 405 => 'Method Not Allowed', 406 => 'Not Acceptable', 407 => 'Proxy Authentication Required', 408 => 'Request Timeout', 409 => 'Conflict', 410 => 'Gone', 411 => 'Length Required', 412 => 'Precondition Failed', 413 => 'Payload Too Large', 414 => 'URI Too Long', 415 => 'Unsupported Media Type', 416 => 'Range Not Satisfiable', 417 => 'Expectation Failed', 421 => 'Misdirected Request', 422 => 'Unprocessable Entity', 423 => 'Locked', 424 => 'Failed Dependency', 425 => 'Too Early', 426 => 'Upgrade Required', 428 => 'Precondition Required', 429 => 'Too Many Requests', 431 => 'Request Header Fields Too Large', 451 => 'Unavailable for Legal Reasons', 500 => 'Internal Server Error', 501 => 'Not Implemented', 502 => 'Bad Gateway', 503 => 'Service Unavailable', 504 => 'Gateway Timeout', 505 => 'HTTP Version Not Supported', 506 => 'Variant Also Negotiates', 507 => 'Insufficient Storage', 508 => 'Loop Detected', 509 => 'Bandwidth Limit Exceeded', 510 => 'Not Extended', 511 => 'Network Authentication Required' } # Responses with HTTP status codes that should not have an entity body STATUS_WITH_NO_ENTITY_BODY = Hash[((100..199).to_a << 204 << 304).product([true])] SYMBOL_TO_STATUS_CODE = Hash[*HTTP_STATUS_CODES.map { |code, message| [message.downcase.gsub(/\s|-|'/, '_').to_sym, code] }.flatten] def status_code(status) if status.is_a?(Symbol) SYMBOL_TO_STATUS_CODE.fetch(status) { raise ArgumentError, "Unrecognized status code #{status.inspect}" } else status.to_i end end PATH_SEPS = Regexp.union(*[::File::SEPARATOR, ::File::ALT_SEPARATOR].compact) def clean_path_info(path_info) parts = path_info.split PATH_SEPS clean = [] parts.each do |part| next if part.empty? || part == '.' part == '..' ? clean.pop : clean << part end clean_path = clean.join(::File::SEPARATOR) clean_path.prepend("/") if parts.empty? || parts.first.empty? clean_path end NULL_BYTE = "\0" def valid_path?(path) path.valid_encoding? && !path.include?(NULL_BYTE) end end end PK!Zs@+share/gems/gems/rack-2.2.4/lib/rack/head.rbnu[# frozen_string_literal: true module Rack # Rack::Head returns an empty body for all HEAD requests. It leaves # all other requests unchanged. class Head def initialize(app) @app = app end def call(env) status, headers, body = @app.call(env) if env[REQUEST_METHOD] == HEAD [ status, headers, Rack::BodyProxy.new([]) do body.close if body.respond_to? :close end ] else [status, headers, body] end end end end PK!x0share/gems/gems/rack-2.2.4/lib/rack/directory.rbnu[# frozen_string_literal: true require 'time' module Rack # Rack::Directory serves entries below the +root+ given, according to the # path info of the Rack request. If a directory is found, the file's contents # will be presented in an html based index. If a file is found, the env will # be passed to the specified +app+. # # If +app+ is not specified, a Rack::Files of the same +root+ will be used. class Directory DIR_FILE = "%s%s%s%s\n" DIR_PAGE_HEADER = <<-PAGE %s

%s


PAGE DIR_PAGE_FOOTER = <<-PAGE
Name Size Type Last Modified

PAGE # Body class for directory entries, showing an index page with links # to each file. class DirectoryBody < Struct.new(:root, :path, :files) # Yield strings for each part of the directory entry def each show_path = Utils.escape_html(path.sub(/^#{root}/, '')) yield(DIR_PAGE_HEADER % [ show_path, show_path ]) unless path.chomp('/') == root yield(DIR_FILE % DIR_FILE_escape(files.call('..'))) end Dir.foreach(path) do |basename| next if basename.start_with?('.') next unless f = files.call(basename) yield(DIR_FILE % DIR_FILE_escape(f)) end yield(DIR_PAGE_FOOTER) end private # Escape each element in the array of html strings. def DIR_FILE_escape(htmls) htmls.map { |e| Utils.escape_html(e) } end end # The root of the directory hierarchy. Only requests for files and # directories inside of the root directory are supported. attr_reader :root # Set the root directory and application for serving files. def initialize(root, app = nil) @root = ::File.expand_path(root) @app = app || Files.new(@root) @head = Head.new(method(:get)) end def call(env) # strip body if this is a HEAD call @head.call env end # Internals of request handling. Similar to call but does # not remove body for HEAD requests. def get(env) script_name = env[SCRIPT_NAME] path_info = Utils.unescape_path(env[PATH_INFO]) if client_error_response = check_bad_request(path_info) || check_forbidden(path_info) client_error_response else path = ::File.join(@root, path_info) list_path(env, path, path_info, script_name) end end # Rack response to use for requests with invalid paths, or nil if path is valid. def check_bad_request(path_info) return if Utils.valid_path?(path_info) body = "Bad Request\n" [400, { CONTENT_TYPE => "text/plain", CONTENT_LENGTH => body.bytesize.to_s, "X-Cascade" => "pass" }, [body]] end # Rack response to use for requests with paths outside the root, or nil if path is inside the root. def check_forbidden(path_info) return unless path_info.include? ".." return if ::File.expand_path(::File.join(@root, path_info)).start_with?(@root) body = "Forbidden\n" [403, { CONTENT_TYPE => "text/plain", CONTENT_LENGTH => body.bytesize.to_s, "X-Cascade" => "pass" }, [body]] end # Rack response to use for directories under the root. def list_directory(path_info, path, script_name) url_head = (script_name.split('/') + path_info.split('/')).map do |part| Utils.escape_path part end # Globbing not safe as path could contain glob metacharacters body = DirectoryBody.new(@root, path, ->(basename) do stat = stat(::File.join(path, basename)) next unless stat url = ::File.join(*url_head + [Utils.escape_path(basename)]) mtime = stat.mtime.httpdate if stat.directory? type = 'directory' size = '-' url << '/' if basename == '..' basename = 'Parent Directory' else basename << '/' end else type = Mime.mime_type(::File.extname(basename)) size = filesize_format(stat.size) end [ url, basename, size, type, mtime ] end) [ 200, { CONTENT_TYPE => 'text/html; charset=utf-8' }, body ] end # File::Stat for the given path, but return nil for missing/bad entries. def stat(path) ::File.stat(path) rescue Errno::ENOENT, Errno::ELOOP return nil end # Rack response to use for files and directories under the root. # Unreadable and non-file, non-directory entries will get a 404 response. def list_path(env, path, path_info, script_name) if (stat = stat(path)) && stat.readable? return @app.call(env) if stat.file? return list_directory(path_info, path, script_name) if stat.directory? end entity_not_found(path_info) end # Rack response to use for unreadable and non-file, non-directory entries. def entity_not_found(path_info) body = "Entity not found: #{path_info}\n" [404, { CONTENT_TYPE => "text/plain", CONTENT_LENGTH => body.bytesize.to_s, "X-Cascade" => "pass" }, [body]] end # Stolen from Ramaze FILESIZE_FORMAT = [ ['%.1fT', 1 << 40], ['%.1fG', 1 << 30], ['%.1fM', 1 << 20], ['%.1fK', 1 << 10], ] # Provide human readable file sizes def filesize_format(int) FILESIZE_FORMAT.each do |format, size| return format % (int.to_f / size) if int >= size end "#{int}B" end end end PK!3.5.5-share/gems/gems/rack-2.2.4/lib/rack/server.rbnu[# frozen_string_literal: true require 'optparse' require 'fileutils' module Rack class Server (require_relative 'core_ext/regexp'; using ::Rack::RegexpExtensions) if RUBY_VERSION < '2.4' class Options def parse!(args) options = {} opt_parser = OptionParser.new("", 24, ' ') do |opts| opts.banner = "Usage: rackup [ruby options] [rack options] [rackup config]" opts.separator "" opts.separator "Ruby options:" lineno = 1 opts.on("-e", "--eval LINE", "evaluate a LINE of code") { |line| eval line, TOPLEVEL_BINDING, "-e", lineno lineno += 1 } opts.on("-d", "--debug", "set debugging flags (set $DEBUG to true)") { options[:debug] = true } opts.on("-w", "--warn", "turn warnings on for your script") { options[:warn] = true } opts.on("-q", "--quiet", "turn off logging") { options[:quiet] = true } opts.on("-I", "--include PATH", "specify $LOAD_PATH (may be used more than once)") { |path| (options[:include] ||= []).concat(path.split(":")) } opts.on("-r", "--require LIBRARY", "require the library, before executing your script") { |library| (options[:require] ||= []) << library } opts.separator "" opts.separator "Rack options:" opts.on("-b", "--builder BUILDER_LINE", "evaluate a BUILDER_LINE of code as a builder script") { |line| options[:builder] = line } opts.on("-s", "--server SERVER", "serve using SERVER (thin/puma/webrick)") { |s| options[:server] = s } opts.on("-o", "--host HOST", "listen on HOST (default: localhost)") { |host| options[:Host] = host } opts.on("-p", "--port PORT", "use PORT (default: 9292)") { |port| options[:Port] = port } opts.on("-O", "--option NAME[=VALUE]", "pass VALUE to the server as option NAME. If no VALUE, sets it to true. Run '#{$0} -s SERVER -h' to get a list of options for SERVER") { |name| name, value = name.split('=', 2) value = true if value.nil? options[name.to_sym] = value } opts.on("-E", "--env ENVIRONMENT", "use ENVIRONMENT for defaults (default: development)") { |e| options[:environment] = e } opts.on("-D", "--daemonize", "run daemonized in the background") { |d| options[:daemonize] = d ? true : false } opts.on("-P", "--pid FILE", "file to store PID") { |f| options[:pid] = ::File.expand_path(f) } opts.separator "" opts.separator "Profiling options:" opts.on("--heap HEAPFILE", "Build the application, then dump the heap to HEAPFILE") do |e| options[:heapfile] = e end opts.on("--profile PROFILE", "Dump CPU or Memory profile to PROFILE (defaults to a tempfile)") do |e| options[:profile_file] = e end opts.on("--profile-mode MODE", "Profile mode (cpu|wall|object)") do |e| { cpu: true, wall: true, object: true }.fetch(e.to_sym) do raise OptionParser::InvalidOption, "unknown profile mode: #{e}" end options[:profile_mode] = e.to_sym end opts.separator "" opts.separator "Common options:" opts.on_tail("-h", "-?", "--help", "Show this message") do puts opts puts handler_opts(options) exit end opts.on_tail("--version", "Show version") do puts "Rack #{Rack.version} (Release: #{Rack.release})" exit end end begin opt_parser.parse! args rescue OptionParser::InvalidOption => e warn e.message abort opt_parser.to_s end options[:config] = args.last if args.last && !args.last.empty? options end def handler_opts(options) begin info = [] server = Rack::Handler.get(options[:server]) || Rack::Handler.default if server && server.respond_to?(:valid_options) info << "" info << "Server-specific options for #{server.name}:" has_options = false server.valid_options.each do |name, description| next if /^(Host|Port)[^a-zA-Z]/.match?(name.to_s) # ignore handler's host and port options, we do our own. info << " -O %-21s %s" % [name, description] has_options = true end return "" if !has_options end info.join("\n") rescue NameError, LoadError return "Warning: Could not find handler specified (#{options[:server] || 'default'}) to determine handler-specific options" end end end # Start a new rack server (like running rackup). This will parse ARGV and # provide standard ARGV rackup options, defaulting to load 'config.ru'. # # Providing an options hash will prevent ARGV parsing and will not include # any default options. # # This method can be used to very easily launch a CGI application, for # example: # # Rack::Server.start( # :app => lambda do |e| # [200, {'Content-Type' => 'text/html'}, ['hello world']] # end, # :server => 'cgi' # ) # # Further options available here are documented on Rack::Server#initialize def self.start(options = nil) new(options).start end attr_writer :options # Options may include: # * :app # a rack application to run (overrides :config and :builder) # * :builder # a string to evaluate a Rack::Builder from # * :config # a rackup configuration file path to load (.ru) # * :environment # this selects the middleware that will be wrapped around # your application. Default options available are: # - development: CommonLogger, ShowExceptions, and Lint # - deployment: CommonLogger # - none: no extra middleware # note: when the server is a cgi server, CommonLogger is not included. # * :server # choose a specific Rack::Handler, e.g. cgi, fcgi, webrick # * :daemonize # if true, the server will daemonize itself (fork, detach, etc) # * :pid # path to write a pid file after daemonize # * :Host # the host address to bind to (used by supporting Rack::Handler) # * :Port # the port to bind to (used by supporting Rack::Handler) # * :AccessLog # webrick access log options (or supporting Rack::Handler) # * :debug # turn on debug output ($DEBUG = true) # * :warn # turn on warnings ($-w = true) # * :include # add given paths to $LOAD_PATH # * :require # require the given libraries # # Additional options for profiling app initialization include: # * :heapfile # location for ObjectSpace.dump_all to write the output to # * :profile_file # location for CPU/Memory (StackProf) profile output (defaults to a tempfile) # * :profile_mode # StackProf profile mode (cpu|wall|object) def initialize(options = nil) @ignore_options = [] if options @use_default_options = false @options = options @app = options[:app] if options[:app] else argv = defined?(SPEC_ARGV) ? SPEC_ARGV : ARGV @use_default_options = true @options = parse_options(argv) end end def options merged_options = @use_default_options ? default_options.merge(@options) : @options merged_options.reject { |k, v| @ignore_options.include?(k) } end def default_options environment = ENV['RACK_ENV'] || 'development' default_host = environment == 'development' ? 'localhost' : '0.0.0.0' { environment: environment, pid: nil, Port: 9292, Host: default_host, AccessLog: [], config: "config.ru" } end def app @app ||= options[:builder] ? build_app_from_string : build_app_and_options_from_config end class << self def logging_middleware lambda { |server| /CGI/.match?(server.server.name) || server.options[:quiet] ? nil : [Rack::CommonLogger, $stderr] } end def default_middleware_by_environment m = Hash.new {|h, k| h[k] = []} m["deployment"] = [ [Rack::ContentLength], logging_middleware, [Rack::TempfileReaper] ] m["development"] = [ [Rack::ContentLength], logging_middleware, [Rack::ShowExceptions], [Rack::Lint], [Rack::TempfileReaper] ] m end def middleware default_middleware_by_environment end end def middleware self.class.middleware end def start(&block) if options[:warn] $-w = true end if includes = options[:include] $LOAD_PATH.unshift(*includes) end Array(options[:require]).each do |library| require library end if options[:debug] $DEBUG = true require 'pp' p options[:server] pp wrapped_app pp app end check_pid! if options[:pid] # Touch the wrapped app, so that the config.ru is loaded before # daemonization (i.e. before chdir, etc). handle_profiling(options[:heapfile], options[:profile_mode], options[:profile_file]) do wrapped_app end daemonize_app if options[:daemonize] write_pid if options[:pid] trap(:INT) do if server.respond_to?(:shutdown) server.shutdown else exit end end server.run(wrapped_app, **options, &block) end def server @_server ||= Rack::Handler.get(options[:server]) unless @_server @_server = Rack::Handler.default # We already speak FastCGI @ignore_options = [:File, :Port] if @_server.to_s == 'Rack::Handler::FastCGI' end @_server end private def build_app_and_options_from_config if !::File.exist? options[:config] abort "configuration #{options[:config]} not found" end app, options = Rack::Builder.parse_file(self.options[:config], opt_parser) @options.merge!(options) { |key, old, new| old } app end def handle_profiling(heapfile, profile_mode, filename) if heapfile require "objspace" ObjectSpace.trace_object_allocations_start yield GC.start ::File.open(heapfile, "w") { |f| ObjectSpace.dump_all(output: f) } exit end if profile_mode require "stackprof" require "tempfile" make_profile_name(filename) do |filename| ::File.open(filename, "w") do |f| StackProf.run(mode: profile_mode, out: f) do yield end puts "Profile written to: #{filename}" end end exit end yield end def make_profile_name(filename) if filename yield filename else ::Dir::Tmpname.create("profile.dump") do |tmpname, _, _| yield tmpname end end end def build_app_from_string Rack::Builder.new_from_string(self.options[:builder]) end def parse_options(args) # Don't evaluate CGI ISINDEX parameters. # http://www.meb.uni-bonn.de/docs/cgi/cl.html args.clear if ENV.include?(REQUEST_METHOD) @options = opt_parser.parse!(args) @options[:config] = ::File.expand_path(options[:config]) ENV["RACK_ENV"] = options[:environment] @options end def opt_parser Options.new end def build_app(app) middleware[options[:environment]].reverse_each do |middleware| middleware = middleware.call(self) if middleware.respond_to?(:call) next unless middleware klass, *args = middleware app = klass.new(app, *args) end app end def wrapped_app @wrapped_app ||= build_app app end def daemonize_app # Cannot be covered as it forks # :nocov: Process.daemon # :nocov: end def write_pid ::File.open(options[:pid], ::File::CREAT | ::File::EXCL | ::File::WRONLY ){ |f| f.write("#{Process.pid}") } at_exit { ::FileUtils.rm_f(options[:pid]) } rescue Errno::EEXIST check_pid! retry end def check_pid! case pidfile_process_status when :running, :not_owned $stderr.puts "A server is already running. Check #{options[:pid]}." exit(1) when :dead ::File.delete(options[:pid]) end end def pidfile_process_status return :exited unless ::File.exist?(options[:pid]) pid = ::File.read(options[:pid]).to_i return :dead if pid == 0 Process.kill(0, pid) :running rescue Errno::ESRCH :dead rescue Errno::EPERM :not_owned end end end PK!ydy y /share/gems/gems/rack-2.2.4/lib/rack/reloader.rbnu[# frozen_string_literal: true # Copyright (C) 2009-2018 Michael Fellinger # Rack::Reloader is subject to the terms of an MIT-style license. # See MIT-LICENSE or https://opensource.org/licenses/MIT. require 'pathname' module Rack # High performant source reloader # # This class acts as Rack middleware. # # What makes it especially suited for use in a production environment is that # any file will only be checked once and there will only be made one system # call stat(2). # # Please note that this will not reload files in the background, it does so # only when actively called. # # It is performing a check/reload cycle at the start of every request, but # also respects a cool down time, during which nothing will be done. class Reloader (require_relative 'core_ext/regexp'; using ::Rack::RegexpExtensions) if RUBY_VERSION < '2.4' def initialize(app, cooldown = 10, backend = Stat) @app = app @cooldown = cooldown @last = (Time.now - cooldown) @cache = {} @mtimes = {} @reload_mutex = Mutex.new extend backend end def call(env) if @cooldown and Time.now > @last + @cooldown if Thread.list.size > 1 @reload_mutex.synchronize{ reload! } else reload! end @last = Time.now end @app.call(env) end def reload!(stderr = $stderr) rotation do |file, mtime| previous_mtime = @mtimes[file] ||= mtime safe_load(file, mtime, stderr) if mtime > previous_mtime end end # A safe Kernel::load, issuing the hooks depending on the results def safe_load(file, mtime, stderr = $stderr) load(file) stderr.puts "#{self.class}: reloaded `#{file}'" file rescue LoadError, SyntaxError => ex stderr.puts ex ensure @mtimes[file] = mtime end module Stat def rotation files = [$0, *$LOADED_FEATURES].uniq paths = ['./', *$LOAD_PATH].uniq files.map{|file| next if /\.(so|bundle)$/.match?(file) # cannot reload compiled files found, stat = figure_path(file, paths) next unless found && stat && mtime = stat.mtime @cache[file] = found yield(found, mtime) }.compact end # Takes a relative or absolute +file+ name, a couple possible +paths+ that # the +file+ might reside in. Returns the full path and File::Stat for the # path. def figure_path(file, paths) found = @cache[file] found = file if !found and Pathname.new(file).absolute? found, stat = safe_stat(found) return found, stat if found paths.find do |possible_path| path = ::File.join(possible_path, file) found, stat = safe_stat(path) return ::File.expand_path(found), stat if found end return false, false end def safe_stat(file) return unless file stat = ::File.stat(file) return file, stat if stat.file? rescue Errno::ENOENT, Errno::ENOTDIR, Errno::ESRCH @cache.delete(file) and false end end end end PK!v+share/gems/gems/rack-2.2.4/lib/rack/etag.rbnu[# frozen_string_literal: true require_relative '../rack' require 'digest/sha2' module Rack # Automatically sets the ETag header on all String bodies. # # The ETag header is skipped if ETag or Last-Modified headers are sent or if # a sendfile body (body.responds_to :to_path) is given (since such cases # should be handled by apache/nginx). # # On initialization, you can pass two parameters: a Cache-Control directive # used when Etag is absent and a directive when it is present. The first # defaults to nil, while the second defaults to "max-age=0, private, must-revalidate" class ETag ETAG_STRING = Rack::ETAG DEFAULT_CACHE_CONTROL = "max-age=0, private, must-revalidate" def initialize(app, no_cache_control = nil, cache_control = DEFAULT_CACHE_CONTROL) @app = app @cache_control = cache_control @no_cache_control = no_cache_control end def call(env) status, headers, body = @app.call(env) headers = Utils::HeaderHash[headers] if etag_status?(status) && etag_body?(body) && !skip_caching?(headers) original_body = body digest, new_body = digest_body(body) body = Rack::BodyProxy.new(new_body) do original_body.close if original_body.respond_to?(:close) end headers[ETAG_STRING] = %(W/"#{digest}") if digest end unless headers[CACHE_CONTROL] if digest headers[CACHE_CONTROL] = @cache_control if @cache_control else headers[CACHE_CONTROL] = @no_cache_control if @no_cache_control end end [status, headers, body] end private def etag_status?(status) status == 200 || status == 201 end def etag_body?(body) !body.respond_to?(:to_path) end def skip_caching?(headers) headers.key?(ETAG_STRING) || headers.key?('Last-Modified') end def digest_body(body) parts = [] digest = nil body.each do |part| parts << part (digest ||= Digest::SHA256.new) << part unless part.empty? end [digest && digest.hexdigest.byteslice(0, 32), parts] end end end PK!/KII-share/gems/gems/rack-2.2.4/lib/rack/static.rbnu[# frozen_string_literal: true module Rack # The Rack::Static middleware intercepts requests for static files # (javascript files, images, stylesheets, etc) based on the url prefixes or # route mappings passed in the options, and serves them using a Rack::Files # object. This allows a Rack stack to serve both static and dynamic content. # # Examples: # # Serve all requests beginning with /media from the "media" folder located # in the current directory (ie media/*): # # use Rack::Static, :urls => ["/media"] # # Same as previous, but instead of returning 404 for missing files under # /media, call the next middleware: # # use Rack::Static, :urls => ["/media"], :cascade => true # # Serve all requests beginning with /css or /images from the folder "public" # in the current directory (ie public/css/* and public/images/*): # # use Rack::Static, :urls => ["/css", "/images"], :root => "public" # # Serve all requests to / with "index.html" from the folder "public" in the # current directory (ie public/index.html): # # use Rack::Static, :urls => {"/" => 'index.html'}, :root => 'public' # # Serve all requests normally from the folder "public" in the current # directory but uses index.html as default route for "/" # # use Rack::Static, :urls => [""], :root => 'public', :index => # 'index.html' # # Set custom HTTP Headers for based on rules: # # use Rack::Static, :root => 'public', # :header_rules => [ # [rule, {header_field => content, header_field => content}], # [rule, {header_field => content}] # ] # # Rules for selecting files: # # 1) All files # Provide the :all symbol # :all => Matches every file # # 2) Folders # Provide the folder path as a string # '/folder' or '/folder/subfolder' => Matches files in a certain folder # # 3) File Extensions # Provide the file extensions as an array # ['css', 'js'] or %w(css js) => Matches files ending in .css or .js # # 4) Regular Expressions / Regexp # Provide a regular expression # %r{\.(?:css|js)\z} => Matches files ending in .css or .js # /\.(?:eot|ttf|otf|woff2|woff|svg)\z/ => Matches files ending in # the most common web font formats (.eot, .ttf, .otf, .woff2, .woff, .svg) # Note: This Regexp is available as a shortcut, using the :fonts rule # # 5) Font Shortcut # Provide the :fonts symbol # :fonts => Uses the Regexp rule stated right above to match all common web font endings # # Rule Ordering: # Rules are applied in the order that they are provided. # List rather general rules above special ones. # # Complete example use case including HTTP header rules: # # use Rack::Static, :root => 'public', # :header_rules => [ # # Cache all static files in public caches (e.g. Rack::Cache) # # as well as in the browser # [:all, {'Cache-Control' => 'public, max-age=31536000'}], # # # Provide web fonts with cross-origin access-control-headers # # Firefox requires this when serving assets using a Content Delivery Network # [:fonts, {'Access-Control-Allow-Origin' => '*'}] # ] # class Static (require_relative 'core_ext/regexp'; using ::Rack::RegexpExtensions) if RUBY_VERSION < '2.4' def initialize(app, options = {}) @app = app @urls = options[:urls] || ["/favicon.ico"] @index = options[:index] @gzip = options[:gzip] @cascade = options[:cascade] root = options[:root] || Dir.pwd # HTTP Headers @header_rules = options[:header_rules] || [] # Allow for legacy :cache_control option while prioritizing global header_rules setting @header_rules.unshift([:all, { CACHE_CONTROL => options[:cache_control] }]) if options[:cache_control] @file_server = Rack::Files.new(root) end def add_index_root?(path) @index && route_file(path) && path.end_with?('/') end def overwrite_file_path(path) @urls.kind_of?(Hash) && @urls.key?(path) || add_index_root?(path) end def route_file(path) @urls.kind_of?(Array) && @urls.any? { |url| path.index(url) == 0 } end def can_serve(path) route_file(path) || overwrite_file_path(path) end def call(env) path = env[PATH_INFO] if can_serve(path) if overwrite_file_path(path) env[PATH_INFO] = (add_index_root?(path) ? path + @index : @urls[path]) elsif @gzip && env['HTTP_ACCEPT_ENCODING'] && /\bgzip\b/.match?(env['HTTP_ACCEPT_ENCODING']) path = env[PATH_INFO] env[PATH_INFO] += '.gz' response = @file_server.call(env) env[PATH_INFO] = path if response[0] == 404 response = nil elsif response[0] == 304 # Do nothing, leave headers as is else if mime_type = Mime.mime_type(::File.extname(path), 'text/plain') response[1][CONTENT_TYPE] = mime_type end response[1]['Content-Encoding'] = 'gzip' end end path = env[PATH_INFO] response ||= @file_server.call(env) if @cascade && response[0] == 404 return @app.call(env) end headers = response[1] applicable_rules(path).each do |rule, new_headers| new_headers.each { |field, content| headers[field] = content } end response else @app.call(env) end end # Convert HTTP header rules to HTTP headers def applicable_rules(path) @header_rules.find_all do |rule, new_headers| case rule when :all true when :fonts /\.(?:ttf|otf|eot|woff2|woff|svg)\z/.match?(path) when String path = ::Rack::Utils.unescape(path) path.start_with?(rule) || path.start_with?('/' + rule) when Array /\.(#{rule.join('|')})\z/.match?(path) when Regexp rule.match?(path) else false end end end end end PK!OW޹ :share/gems/gems/rack-2.2.4/lib/rack/multipart/generator.rbnu[# frozen_string_literal: true module Rack module Multipart class Generator def initialize(params, first = true) @params, @first = params, first if @first && !@params.is_a?(Hash) raise ArgumentError, "value must be a Hash" end end def dump return nil if @first && !multipart? return flattened_params unless @first flattened_params.map do |name, file| if file.respond_to?(:original_filename) if file.path ::File.open(file.path, 'rb') do |f| f.set_encoding(Encoding::BINARY) content_for_tempfile(f, file, name) end else content_for_tempfile(file, file, name) end else content_for_other(file, name) end end.join << "--#{MULTIPART_BOUNDARY}--\r" end private def multipart? query = lambda { |value| case value when Array value.any?(&query) when Hash value.values.any?(&query) when Rack::Multipart::UploadedFile true end } @params.values.any?(&query) end def flattened_params @flattened_params ||= begin h = Hash.new @params.each do |key, value| k = @first ? key.to_s : "[#{key}]" case value when Array value.map { |v| Multipart.build_multipart(v, false).each { |subkey, subvalue| h["#{k}[]#{subkey}"] = subvalue } } when Hash Multipart.build_multipart(value, false).each { |subkey, subvalue| h[k + subkey] = subvalue } else h[k] = value end end h end end def content_for_tempfile(io, file, name) length = ::File.stat(file.path).size if file.path filename = "; filename=\"#{Utils.escape(file.original_filename)}\"" if file.original_filename <<-EOF --#{MULTIPART_BOUNDARY}\r Content-Disposition: form-data; name="#{name}"#{filename}\r Content-Type: #{file.content_type}\r #{"Content-Length: #{length}\r\n" if length}\r #{io.read}\r EOF end def content_for_other(file, name) <<-EOF --#{MULTIPART_BOUNDARY}\r Content-Disposition: form-data; name="#{name}"\r \r #{file}\r EOF end end end end PK!cY(>share/gems/gems/rack-2.2.4/lib/rack/multipart/uploaded_file.rbnu[# frozen_string_literal: true module Rack module Multipart class UploadedFile # The filename, *not* including the path, of the "uploaded" file attr_reader :original_filename # The content type of the "uploaded" file attr_accessor :content_type def initialize(filepath = nil, ct = "text/plain", bin = false, path: filepath, content_type: ct, binary: bin, filename: nil, io: nil) if io @tempfile = io @original_filename = filename else raise "#{path} file does not exist" unless ::File.exist?(path) @original_filename = filename || ::File.basename(path) @tempfile = Tempfile.new([@original_filename, ::File.extname(path)], encoding: Encoding::BINARY) @tempfile.binmode if binary FileUtils.copy_file(path, @tempfile.path) end @content_type = content_type end def path @tempfile.path if @tempfile.respond_to?(:path) end alias_method :local_path, :path def respond_to?(*args) super or @tempfile.respond_to?(*args) end def method_missing(method_name, *args, &block) #:nodoc: @tempfile.__send__(method_name, *args, &block) end end end end PK!]> -(-(7share/gems/gems/rack-2.2.4/lib/rack/multipart/parser.rbnu[# frozen_string_literal: true require 'strscan' module Rack module Multipart class MultipartPartLimitError < Errno::EMFILE; end class Parser (require_relative '../core_ext/regexp'; using ::Rack::RegexpExtensions) if RUBY_VERSION < '2.4' BUFSIZE = 1_048_576 TEXT_PLAIN = "text/plain" TEMPFILE_FACTORY = lambda { |filename, content_type| Tempfile.new(["RackMultipart", ::File.extname(filename.gsub("\0", '%00'))]) } BOUNDARY_REGEX = /\A([^\n]*(?:\n|\Z))/ class BoundedIO # :nodoc: def initialize(io, content_length) @io = io @content_length = content_length @cursor = 0 end def read(size, outbuf = nil) return if @cursor >= @content_length left = @content_length - @cursor str = if left < size @io.read left, outbuf else @io.read size, outbuf end if str @cursor += str.bytesize else # Raise an error for mismatching Content-Length and actual contents raise EOFError, "bad content body" end str end def rewind @io.rewind end end MultipartInfo = Struct.new :params, :tmp_files EMPTY = MultipartInfo.new(nil, []) def self.parse_boundary(content_type) return unless content_type data = content_type.match(MULTIPART) return unless data data[1] end def self.parse(io, content_length, content_type, tmpfile, bufsize, qp) return EMPTY if 0 == content_length boundary = parse_boundary content_type return EMPTY unless boundary io = BoundedIO.new(io, content_length) if content_length outbuf = String.new parser = new(boundary, tmpfile, bufsize, qp) parser.on_read io.read(bufsize, outbuf) loop do break if parser.state == :DONE parser.on_read io.read(bufsize, outbuf) end io.rewind parser.result end class Collector class MimePart < Struct.new(:body, :head, :filename, :content_type, :name) def get_data data = body if filename == "" # filename is blank which means no file has been selected return elsif filename body.rewind if body.respond_to?(:rewind) # Take the basename of the upload's original filename. # This handles the full Windows paths given by Internet Explorer # (and perhaps other broken user agents) without affecting # those which give the lone filename. fn = filename.split(/[\/\\]/).last data = { filename: fn, type: content_type, name: name, tempfile: body, head: head } end yield data end end class BufferPart < MimePart def file?; false; end def close; end end class TempfilePart < MimePart def file?; true; end def close; body.close; end end include Enumerable def initialize(tempfile) @tempfile = tempfile @mime_parts = [] @open_files = 0 end def each @mime_parts.each { |part| yield part } end def on_mime_head(mime_index, head, filename, content_type, name) if filename body = @tempfile.call(filename, content_type) body.binmode if body.respond_to?(:binmode) klass = TempfilePart @open_files += 1 else body = String.new klass = BufferPart end @mime_parts[mime_index] = klass.new(body, head, filename, content_type, name) check_open_files end def on_mime_body(mime_index, content) @mime_parts[mime_index].body << content end def on_mime_finish(mime_index) end private def check_open_files if Utils.multipart_part_limit > 0 if @open_files >= Utils.multipart_part_limit @mime_parts.each(&:close) raise MultipartPartLimitError, 'Maximum file multiparts in content reached' end end end end attr_reader :state def initialize(boundary, tempfile, bufsize, query_parser) @query_parser = query_parser @params = query_parser.make_params @boundary = "--#{boundary}" @bufsize = bufsize @full_boundary = @boundary @end_boundary = @boundary + '--' @state = :FAST_FORWARD @mime_index = 0 @collector = Collector.new tempfile @sbuf = StringScanner.new("".dup) @body_regex = /(?:#{EOL})?#{Regexp.quote(@boundary)}(?:#{EOL}|--)/m @rx_max_size = EOL.size + @boundary.bytesize + [EOL.size, '--'.size].max @head_regex = /(.*?#{EOL})#{EOL}/m end def on_read(content) handle_empty_content!(content) @sbuf.concat content run_parser end def result @collector.each do |part| part.get_data do |data| tag_multipart_encoding(part.filename, part.content_type, part.name, data) @query_parser.normalize_params(@params, part.name, data, @query_parser.param_depth_limit) end end MultipartInfo.new @params.to_params_hash, @collector.find_all(&:file?).map(&:body) end private def run_parser loop do case @state when :FAST_FORWARD break if handle_fast_forward == :want_read when :CONSUME_TOKEN break if handle_consume_token == :want_read when :MIME_HEAD break if handle_mime_head == :want_read when :MIME_BODY break if handle_mime_body == :want_read when :DONE break end end end def handle_fast_forward if consume_boundary @state = :MIME_HEAD else raise EOFError, "bad content body" if @sbuf.rest_size >= @bufsize :want_read end end def handle_consume_token tok = consume_boundary # break if we're at the end of a buffer, but not if it is the end of a field @state = if tok == :END_BOUNDARY || (@sbuf.eos? && tok != :BOUNDARY) :DONE else :MIME_HEAD end end def handle_mime_head if @sbuf.scan_until(@head_regex) head = @sbuf[1] content_type = head[MULTIPART_CONTENT_TYPE, 1] if name = head[MULTIPART_CONTENT_DISPOSITION, 1] name = Rack::Auth::Digest::Params::dequote(name) else name = head[MULTIPART_CONTENT_ID, 1] end filename = get_filename(head) if name.nil? || name.empty? name = filename || "#{content_type || TEXT_PLAIN}[]".dup end @collector.on_mime_head @mime_index, head, filename, content_type, name @state = :MIME_BODY else :want_read end end def handle_mime_body if (body_with_boundary = @sbuf.check_until(@body_regex)) # check but do not advance the pointer yet body = body_with_boundary.sub(/#{@body_regex}\z/m, '') # remove the boundary from the string @collector.on_mime_body @mime_index, body @sbuf.pos += body.length + 2 # skip \r\n after the content @state = :CONSUME_TOKEN @mime_index += 1 else # Save what we have so far if @rx_max_size < @sbuf.rest_size delta = @sbuf.rest_size - @rx_max_size @collector.on_mime_body @mime_index, @sbuf.peek(delta) @sbuf.pos += delta @sbuf.string = @sbuf.rest end :want_read end end def full_boundary; @full_boundary; end def consume_boundary while read_buffer = @sbuf.scan_until(BOUNDARY_REGEX) case read_buffer.strip when full_boundary then return :BOUNDARY when @end_boundary then return :END_BOUNDARY end return if @sbuf.eos? end end def get_filename(head) filename = nil case head when RFC2183 params = Hash[*head.scan(DISPPARM).flat_map(&:compact)] if filename = params['filename'] filename = $1 if filename =~ /^"(.*)"$/ elsif filename = params['filename*'] encoding, _, filename = filename.split("'", 3) end when BROKEN filename = $1 filename = $1 if filename =~ /^"(.*)"$/ end return unless filename if filename.scan(/%.?.?/).all? { |s| /%[0-9a-fA-F]{2}/.match?(s) } filename = Utils.unescape_path(filename) end filename.scrub! if filename !~ /\\[^\\"]/ filename = filename.gsub(/\\(.)/, '\1') end if encoding filename.force_encoding ::Encoding.find(encoding) end filename end CHARSET = "charset" def tag_multipart_encoding(filename, content_type, name, body) name = name.to_s encoding = Encoding::UTF_8 name.force_encoding(encoding) return if filename if content_type list = content_type.split(';') type_subtype = list.first type_subtype.strip! if TEXT_PLAIN == type_subtype rest = list.drop 1 rest.each do |param| k, v = param.split('=', 2) k.strip! v.strip! v = v[1..-2] if v.start_with?('"') && v.end_with?('"') encoding = Encoding.find v if k == CHARSET end end end name.force_encoding(encoding) body.force_encoding(encoding) end def handle_empty_content!(content) if content.nil? || content.empty? raise EOFError end end end end end PK!UE 6share/gems/gems/rack-2.2.4/lib/rack/conditional_get.rbnu[# frozen_string_literal: true module Rack # Middleware that enables conditional GET using If-None-Match and # If-Modified-Since. The application should set either or both of the # Last-Modified or Etag response headers according to RFC 2616. When # either of the conditions is met, the response body is set to be zero # length and the response status is set to 304 Not Modified. # # Applications that defer response body generation until the body's each # message is received will avoid response body generation completely when # a conditional GET matches. # # Adapted from Michael Klishin's Merb implementation: # https://github.com/wycats/merb/blob/master/merb-core/lib/merb-core/rack/middleware/conditional_get.rb class ConditionalGet def initialize(app) @app = app end # Return empty 304 response if the response has not been # modified since the last request. def call(env) case env[REQUEST_METHOD] when "GET", "HEAD" status, headers, body = @app.call(env) headers = Utils::HeaderHash[headers] if status == 200 && fresh?(env, headers) status = 304 headers.delete(CONTENT_TYPE) headers.delete(CONTENT_LENGTH) original_body = body body = Rack::BodyProxy.new([]) do original_body.close if original_body.respond_to?(:close) end end [status, headers, body] else @app.call(env) end end private # Return whether the response has not been modified since the # last request. def fresh?(env, headers) # If-None-Match has priority over If-Modified-Since per RFC 7232 if none_match = env['HTTP_IF_NONE_MATCH'] etag_matches?(none_match, headers) elsif (modified_since = env['HTTP_IF_MODIFIED_SINCE']) && (modified_since = to_rfc2822(modified_since)) modified_since?(modified_since, headers) end end # Whether the ETag response header matches the If-None-Match request header. # If so, the request has not been modified. def etag_matches?(none_match, headers) headers['ETag'] == none_match end # Whether the Last-Modified response header matches the If-Modified-Since # request header. If so, the request has not been modified. def modified_since?(modified_since, headers) last_modified = to_rfc2822(headers['Last-Modified']) and modified_since >= last_modified end # Return a Time object for the given string (which should be in RFC2822 # format), or nil if the string cannot be parsed. def to_rfc2822(since) # shortest possible valid date is the obsolete: 1 Nov 97 09:55 A # anything shorter is invalid, this avoids exceptions for common cases # most common being the empty string if since && since.length >= 16 # NOTE: there is no trivial way to write this in a non exception way # _rfc2822 returns a hash but is not that usable Time.rfc2822(since) rescue nil end end end end PK!ox.share/gems/gems/rack-2.2.4/lib/rack/cascade.rbnu[# frozen_string_literal: true module Rack # Rack::Cascade tries a request on several apps, and returns the # first response that is not 404 or 405 (or in a list of configured # status codes). If all applications tried return one of the configured # status codes, return the last response. class Cascade # deprecated, no longer used NotFound = [404, { CONTENT_TYPE => "text/plain" }, []] # An array of applications to try in order. attr_reader :apps # Set the apps to send requests to, and what statuses result in # cascading. Arguments: # # apps: An enumerable of rack applications. # cascade_for: The statuses to use cascading for. If a response is received # from an app, the next app is tried. def initialize(apps, cascade_for = [404, 405]) @apps = [] apps.each { |app| add app } @cascade_for = {} [*cascade_for].each { |status| @cascade_for[status] = true } end # Call each app in order. If the responses uses a status that requires # cascading, try the next app. If all responses require cascading, # return the response from the last app. def call(env) return [404, { CONTENT_TYPE => "text/plain" }, []] if @apps.empty? result = nil last_body = nil @apps.each do |app| # The SPEC says that the body must be closed after it has been iterated # by the server, or if it is replaced by a middleware action. Cascade # replaces the body each time a cascade happens. It is assumed that nil # does not respond to close, otherwise the previous application body # will be closed. The final application body will not be closed, as it # will be passed to the server as a result. last_body.close if last_body.respond_to? :close result = app.call(env) return result unless @cascade_for.include?(result[0].to_i) last_body = result[2] end result end # Append an app to the list of apps to cascade. This app will # be tried last. def add(app) @apps << app end # Whether the given app is one of the apps to cascade to. def include?(app) @apps.include?(app) end alias_method :<<, :add end end PK!mZ05056share/gems/gems/rack-2.2.4/lib/rack/show_exceptions.rbnu[# frozen_string_literal: true require 'ostruct' require 'erb' module Rack # Rack::ShowExceptions catches all exceptions raised from the app it # wraps. It shows a useful backtrace with the sourcefile and # clickable context, the whole Rack environment and the request # data. # # Be careful when you use this on public-facing sites as it could # reveal information helpful to attackers. class ShowExceptions CONTEXT = 7 def initialize(app) @app = app end def call(env) @app.call(env) rescue StandardError, LoadError, SyntaxError => e exception_string = dump_exception(e) env[RACK_ERRORS].puts(exception_string) env[RACK_ERRORS].flush if accepts_html?(env) content_type = "text/html" body = pretty(env, e) else content_type = "text/plain" body = exception_string end [ 500, { CONTENT_TYPE => content_type, CONTENT_LENGTH => body.bytesize.to_s, }, [body], ] end def prefers_plaintext?(env) !accepts_html?(env) end def accepts_html?(env) Rack::Utils.best_q_match(env["HTTP_ACCEPT"], %w[text/html]) end private :accepts_html? def dump_exception(exception) string = "#{exception.class}: #{exception.message}\n".dup string << exception.backtrace.map { |l| "\t#{l}" }.join("\n") string end def pretty(env, exception) req = Rack::Request.new(env) # This double assignment is to prevent an "unused variable" warning. # Yes, it is dumb, but I don't like Ruby yelling at me. path = path = (req.script_name + req.path_info).squeeze("/") # This double assignment is to prevent an "unused variable" warning. # Yes, it is dumb, but I don't like Ruby yelling at me. frames = frames = exception.backtrace.map { |line| frame = OpenStruct.new if line =~ /(.*?):(\d+)(:in `(.*)')?/ frame.filename = $1 frame.lineno = $2.to_i frame.function = $4 begin lineno = frame.lineno - 1 lines = ::File.readlines(frame.filename) frame.pre_context_lineno = [lineno - CONTEXT, 0].max frame.pre_context = lines[frame.pre_context_lineno...lineno] frame.context_line = lines[lineno].chomp frame.post_context_lineno = [lineno + CONTEXT, lines.size].min frame.post_context = lines[lineno + 1..frame.post_context_lineno] rescue end frame else nil end }.compact template.result(binding) end def template TEMPLATE end def h(obj) # :nodoc: case obj when String Utils.escape_html(obj) else Utils.escape_html(obj.inspect) end end # :stopdoc: # adapted from Django # Copyright (c) Django Software Foundation and individual contributors. # Used under the modified BSD license: # http://www.xfree86.org/3.3.6/COPYRIGHT2.html#5 TEMPLATE = ERB.new(<<-'HTML'.gsub(/^ /, '')) <%=h exception.class %> at <%=h path %>

<%=h exception.class %> at <%=h path %>

<%=h exception.message %>

Ruby <% if first = frames.first %> <%=h first.filename %>: in <%=h first.function %>, line <%=h frames.first.lineno %> <% else %> unknown location <% end %>
Web <%=h req.request_method %> <%=h(req.host + path)%>

Jump to:

Traceback (innermost first)

    <% frames.each { |frame| %>
  • <%=h frame.filename %>: in <%=h frame.function %> <% if frame.context_line %>
    <% if frame.pre_context %>
      <% frame.pre_context.each { |line| %>
    1. <%=h line %>
    2. <% } %>
    <% end %>
    1. <%=h frame.context_line %>...
    <% if frame.post_context %>
      <% frame.post_context.each { |line| %>
    1. <%=h line %>
    2. <% } %>
    <% end %>
    <% end %>
  • <% } %>

Request information

GET

<% if req.GET and not req.GET.empty? %> <% req.GET.sort_by { |k, v| k.to_s }.each { |key, val| %> <% } %>
Variable Value
<%=h key %>
<%=h val.inspect %>
<% else %>

No GET data.

<% end %>

POST

<% if ((req.POST and not req.POST.empty?) rescue (no_post_data = "Invalid POST data"; nil)) %> <% req.POST.sort_by { |k, v| k.to_s }.each { |key, val| %> <% } %>
Variable Value
<%=h key %>
<%=h val.inspect %>
<% else %>

<%= no_post_data || "No POST data" %>.

<% end %> <% unless req.cookies.empty? %> <% req.cookies.each { |key, val| %> <% } %>
Variable Value
<%=h key %>
<%=h val.inspect %>
<% else %>

No cookie data.

<% end %>

Rack ENV

<% env.sort_by { |k, v| k.to_s }.each { |key, val| %> <% } %>
Variable Value
<%=h key %>
<%=h val.inspect %>

You're seeing this error because you use Rack::ShowExceptions.

HTML # :startdoc: end end PK!m&0share/gems/gems/rack-2.2.4/lib/rack/recursive.rbnu[# frozen_string_literal: true require 'uri' module Rack # Rack::ForwardRequest gets caught by Rack::Recursive and redirects # the current request to the app at +url+. # # raise ForwardRequest.new("/not-found") # class ForwardRequest < Exception attr_reader :url, :env def initialize(url, env = {}) @url = URI(url) @env = env @env[PATH_INFO] = @url.path @env[QUERY_STRING] = @url.query if @url.query @env[HTTP_HOST] = @url.host if @url.host @env[HTTP_PORT] = @url.port if @url.port @env[RACK_URL_SCHEME] = @url.scheme if @url.scheme super "forwarding to #{url}" end end # Rack::Recursive allows applications called down the chain to # include data from other applications (by using # rack['rack.recursive.include'][...] or raise a # ForwardRequest to redirect internally. class Recursive def initialize(app) @app = app end def call(env) dup._call(env) end def _call(env) @script_name = env[SCRIPT_NAME] @app.call(env.merge(RACK_RECURSIVE_INCLUDE => method(:include))) rescue ForwardRequest => req call(env.merge(req.env)) end def include(env, path) unless path.index(@script_name) == 0 && (path[@script_name.size] == ?/ || path[@script_name.size].nil?) raise ArgumentError, "can only include below #{@script_name}, not #{path}" end env = env.merge(PATH_INFO => path, SCRIPT_NAME => @script_name, REQUEST_METHOD => GET, "CONTENT_LENGTH" => "0", "CONTENT_TYPE" => "", RACK_INPUT => StringIO.new("")) @app.call(env) end end end PK!ܼŚ6share/gems/gems/rack-2.2.4/lib/rack/tempfile_reaper.rbnu[# frozen_string_literal: true module Rack # Middleware tracks and cleans Tempfiles created throughout a request (i.e. Rack::Multipart) # Ideas/strategy based on posts by Eric Wong and Charles Oliver Nutter # https://groups.google.com/forum/#!searchin/rack-devel/temp/rack-devel/brK8eh-MByw/sw61oJJCGRMJ class TempfileReaper def initialize(app) @app = app end def call(env) env[RACK_TEMPFILES] ||= [] status, headers, body = @app.call(env) body_proxy = BodyProxy.new(body) do env[RACK_TEMPFILES].each(&:close!) unless env[RACK_TEMPFILES].nil? end [status, headers, body_proxy] end end end PK!\e e 7share/gems/gems/rack-2.2.4/lib/rack/rewindable_input.rbnu[# -*- encoding: binary -*- # frozen_string_literal: true require 'tempfile' module Rack # Class which can make any IO object rewindable, including non-rewindable ones. It does # this by buffering the data into a tempfile, which is rewindable. # # rack.input is required to be rewindable, so if your input stream IO is non-rewindable # by nature (e.g. a pipe or a socket) then you can wrap it in an object of this class # to easily make it rewindable. # # Don't forget to call #close when you're done. This frees up temporary resources that # RewindableInput uses, though it does *not* close the original IO object. class RewindableInput def initialize(io) @io = io @rewindable_io = nil @unlinked = false end def gets make_rewindable unless @rewindable_io @rewindable_io.gets end def read(*args) make_rewindable unless @rewindable_io @rewindable_io.read(*args) end def each(&block) make_rewindable unless @rewindable_io @rewindable_io.each(&block) end def rewind make_rewindable unless @rewindable_io @rewindable_io.rewind end # Closes this RewindableInput object without closing the originally # wrapped IO object. Cleans up any temporary resources that this RewindableInput # has created. # # This method may be called multiple times. It does nothing on subsequent calls. def close if @rewindable_io if @unlinked @rewindable_io.close else @rewindable_io.close! end @rewindable_io = nil end end private def make_rewindable # Buffer all data into a tempfile. Since this tempfile is private to this # RewindableInput object, we chmod it so that nobody else can read or write # it. On POSIX filesystems we also unlink the file so that it doesn't # even have a file entry on the filesystem anymore, though we can still # access it because we have the file handle open. @rewindable_io = Tempfile.new('RackRewindableInput') @rewindable_io.chmod(0000) @rewindable_io.set_encoding(Encoding::BINARY) if @rewindable_io.respond_to?(:set_encoding) @rewindable_io.binmode if filesystem_has_posix_semantics? raise 'Unlink failed. IO closed.' if @rewindable_io.closed? @unlinked = true end buffer = "".dup while @io.read(1024 * 4, buffer) entire_buffer_written_out = false while !entire_buffer_written_out written = @rewindable_io.write(buffer) entire_buffer_written_out = written == buffer.bytesize if !entire_buffer_written_out buffer.slice!(0 .. written - 1) end end end @rewindable_io.rewind end def filesystem_has_posix_semantics? RUBY_PLATFORM !~ /(mswin|mingw|cygwin|java)/ end end end PK!,]336share/gems/gems/rack-2.2.4/lib/rack/core_ext/regexp.rbnu[# frozen_string_literal: true # Regexp has `match?` since Ruby 2.4 # so to support Ruby < 2.4 we need to define this method module Rack module RegexpExtensions refine Regexp do def match?(string, pos = 0) !!match(string, pos) end end unless //.respond_to?(:match?) end end PK!*k/share/gems/gems/rack-2.2.4/lib/rack/sendfile.rbnu[# frozen_string_literal: true module Rack # = Sendfile # # The Sendfile middleware intercepts responses whose body is being # served from a file and replaces it with a server specific X-Sendfile # header. The web server is then responsible for writing the file contents # to the client. This can dramatically reduce the amount of work required # by the Ruby backend and takes advantage of the web server's optimized file # delivery code. # # In order to take advantage of this middleware, the response body must # respond to +to_path+ and the request must include an X-Sendfile-Type # header. Rack::Files and other components implement +to_path+ so there's # rarely anything you need to do in your application. The X-Sendfile-Type # header is typically set in your web servers configuration. The following # sections attempt to document # # === Nginx # # Nginx supports the X-Accel-Redirect header. This is similar to X-Sendfile # but requires parts of the filesystem to be mapped into a private URL # hierarchy. # # The following example shows the Nginx configuration required to create # a private "/files/" area, enable X-Accel-Redirect, and pass the special # X-Sendfile-Type and X-Accel-Mapping headers to the backend: # # location ~ /files/(.*) { # internal; # alias /var/www/$1; # } # # location / { # proxy_redirect off; # # proxy_set_header Host $host; # proxy_set_header X-Real-IP $remote_addr; # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # # proxy_set_header X-Sendfile-Type X-Accel-Redirect; # proxy_set_header X-Accel-Mapping /var/www/=/files/; # # proxy_pass http://127.0.0.1:8080/; # } # # Note that the X-Sendfile-Type header must be set exactly as shown above. # The X-Accel-Mapping header should specify the location on the file system, # followed by an equals sign (=), followed name of the private URL pattern # that it maps to. The middleware performs a simple substitution on the # resulting path. # # See Also: https://www.nginx.com/resources/wiki/start/topics/examples/xsendfile # # === lighttpd # # Lighttpd has supported some variation of the X-Sendfile header for some # time, although only recent version support X-Sendfile in a reverse proxy # configuration. # # $HTTP["host"] == "example.com" { # proxy-core.protocol = "http" # proxy-core.balancer = "round-robin" # proxy-core.backends = ( # "127.0.0.1:8000", # "127.0.0.1:8001", # ... # ) # # proxy-core.allow-x-sendfile = "enable" # proxy-core.rewrite-request = ( # "X-Sendfile-Type" => (".*" => "X-Sendfile") # ) # } # # See Also: http://redmine.lighttpd.net/wiki/lighttpd/Docs:ModProxyCore # # === Apache # # X-Sendfile is supported under Apache 2.x using a separate module: # # https://tn123.org/mod_xsendfile/ # # Once the module is compiled and installed, you can enable it using # XSendFile config directive: # # RequestHeader Set X-Sendfile-Type X-Sendfile # ProxyPassReverse / http://localhost:8001/ # XSendFile on # # === Mapping parameter # # The third parameter allows for an overriding extension of the # X-Accel-Mapping header. Mappings should be provided in tuples of internal to # external. The internal values may contain regular expression syntax, they # will be matched with case indifference. class Sendfile def initialize(app, variation = nil, mappings = []) @app = app @variation = variation @mappings = mappings.map do |internal, external| [/^#{internal}/i, external] end end def call(env) status, headers, body = @app.call(env) if body.respond_to?(:to_path) case type = variation(env) when 'X-Accel-Redirect' path = ::File.expand_path(body.to_path) if url = map_accel_path(env, path) headers[CONTENT_LENGTH] = '0' # '?' must be percent-encoded because it is not query string but a part of path headers[type] = ::Rack::Utils.escape_path(url).gsub('?', '%3F') obody = body body = Rack::BodyProxy.new([]) do obody.close if obody.respond_to?(:close) end else env[RACK_ERRORS].puts "X-Accel-Mapping header missing" end when 'X-Sendfile', 'X-Lighttpd-Send-File' path = ::File.expand_path(body.to_path) headers[CONTENT_LENGTH] = '0' headers[type] = path obody = body body = Rack::BodyProxy.new([]) do obody.close if obody.respond_to?(:close) end when '', nil else env[RACK_ERRORS].puts "Unknown x-sendfile variation: '#{type}'.\n" end end [status, headers, body] end private def variation(env) @variation || env['sendfile.type'] || env['HTTP_X_SENDFILE_TYPE'] end def map_accel_path(env, path) if mapping = @mappings.find { |internal, _| internal =~ path } path.sub(*mapping) elsif mapping = env['HTTP_X_ACCEL_MAPPING'] mapping.split(',').map(&:strip).each do |m| internal, external = m.split('=', 2).map(&:strip) new_path = path.sub(/^#{internal}/i, external) return new_path unless path == new_path end path end end end end PK!!3-!-!+share/gems/gems/rack-2.2.4/lib/rack/mock.rbnu[# frozen_string_literal: true require 'uri' require 'stringio' require_relative '../rack' require 'cgi/cookie' module Rack # Rack::MockRequest helps testing your Rack application without # actually using HTTP. # # After performing a request on a URL with get/post/put/patch/delete, it # returns a MockResponse with useful helper methods for effective # testing. # # You can pass a hash with additional configuration to the # get/post/put/patch/delete. # :input:: A String or IO-like to be used as rack.input. # :fatal:: Raise a FatalWarning if the app writes to rack.errors. # :lint:: If true, wrap the application in a Rack::Lint. class MockRequest class FatalWarning < RuntimeError end class FatalWarner def puts(warning) raise FatalWarning, warning end def write(warning) raise FatalWarning, warning end def flush end def string "" end end DEFAULT_ENV = { RACK_VERSION => Rack::VERSION, RACK_INPUT => StringIO.new, RACK_ERRORS => StringIO.new, RACK_MULTITHREAD => true, RACK_MULTIPROCESS => true, RACK_RUNONCE => false, }.freeze def initialize(app) @app = app end # Make a GET request and return a MockResponse. See #request. def get(uri, opts = {}) request(GET, uri, opts) end # Make a POST request and return a MockResponse. See #request. def post(uri, opts = {}) request(POST, uri, opts) end # Make a PUT request and return a MockResponse. See #request. def put(uri, opts = {}) request(PUT, uri, opts) end # Make a PATCH request and return a MockResponse. See #request. def patch(uri, opts = {}) request(PATCH, uri, opts) end # Make a DELETE request and return a MockResponse. See #request. def delete(uri, opts = {}) request(DELETE, uri, opts) end # Make a HEAD request and return a MockResponse. See #request. def head(uri, opts = {}) request(HEAD, uri, opts) end # Make an OPTIONS request and return a MockResponse. See #request. def options(uri, opts = {}) request(OPTIONS, uri, opts) end # Make a request using the given request method for the given # uri to the rack application and return a MockResponse. # Options given are passed to MockRequest.env_for. def request(method = GET, uri = "", opts = {}) env = self.class.env_for(uri, opts.merge(method: method)) if opts[:lint] app = Rack::Lint.new(@app) else app = @app end errors = env[RACK_ERRORS] status, headers, body = app.call(env) MockResponse.new(status, headers, body, errors) ensure body.close if body.respond_to?(:close) end # For historical reasons, we're pinning to RFC 2396. # URI::Parser = URI::RFC2396_Parser def self.parse_uri_rfc2396(uri) @parser ||= URI::Parser.new @parser.parse(uri) end # Return the Rack environment used for a request to +uri+. # All options that are strings are added to the returned environment. # Options: # :fatal :: Whether to raise an exception if request outputs to rack.errors # :input :: The rack.input to set # :method :: The HTTP request method to use # :params :: The params to use # :script_name :: The SCRIPT_NAME to set def self.env_for(uri = "", opts = {}) uri = parse_uri_rfc2396(uri) uri.path = "/#{uri.path}" unless uri.path[0] == ?/ env = DEFAULT_ENV.dup env[REQUEST_METHOD] = (opts[:method] ? opts[:method].to_s.upcase : GET).b env[SERVER_NAME] = (uri.host || "example.org").b env[SERVER_PORT] = (uri.port ? uri.port.to_s : "80").b env[QUERY_STRING] = (uri.query.to_s).b env[PATH_INFO] = ((!uri.path || uri.path.empty?) ? "/" : uri.path).b env[RACK_URL_SCHEME] = (uri.scheme || "http").b env[HTTPS] = (env[RACK_URL_SCHEME] == "https" ? "on" : "off").b env[SCRIPT_NAME] = opts[:script_name] || "" if opts[:fatal] env[RACK_ERRORS] = FatalWarner.new else env[RACK_ERRORS] = StringIO.new end if params = opts[:params] if env[REQUEST_METHOD] == GET params = Utils.parse_nested_query(params) if params.is_a?(String) params.update(Utils.parse_nested_query(env[QUERY_STRING])) env[QUERY_STRING] = Utils.build_nested_query(params) elsif !opts.has_key?(:input) opts["CONTENT_TYPE"] = "application/x-www-form-urlencoded" if params.is_a?(Hash) if data = Rack::Multipart.build_multipart(params) opts[:input] = data opts["CONTENT_LENGTH"] ||= data.length.to_s opts["CONTENT_TYPE"] = "multipart/form-data; boundary=#{Rack::Multipart::MULTIPART_BOUNDARY}" else opts[:input] = Utils.build_nested_query(params) end else opts[:input] = params end end end empty_str = String.new opts[:input] ||= empty_str if String === opts[:input] rack_input = StringIO.new(opts[:input]) else rack_input = opts[:input] end rack_input.set_encoding(Encoding::BINARY) env[RACK_INPUT] = rack_input env["CONTENT_LENGTH"] ||= env[RACK_INPUT].size.to_s if env[RACK_INPUT].respond_to?(:size) opts.each { |field, value| env[field] = value if String === field } env end end # Rack::MockResponse provides useful helpers for testing your apps. # Usually, you don't create the MockResponse on your own, but use # MockRequest. class MockResponse < Rack::Response class << self alias [] new end # Headers attr_reader :original_headers, :cookies # Errors attr_accessor :errors def initialize(status, headers, body, errors = StringIO.new("")) @original_headers = headers @errors = errors.string if errors.respond_to?(:string) @cookies = parse_cookies_from_header super(body, status, headers) buffered_body! end def =~(other) body =~ other end def match(other) body.match other end def body # FIXME: apparently users of MockResponse expect the return value of # MockResponse#body to be a string. However, the real response object # returns the body as a list. # # See spec_showstatus.rb: # # should "not replace existing messages" do # ... # res.body.should == "foo!" # end buffer = String.new super.each do |chunk| buffer << chunk end return buffer end def empty? [201, 204, 304].include? status end def cookie(name) cookies.fetch(name, nil) end private def parse_cookies_from_header cookies = Hash.new if original_headers.has_key? 'Set-Cookie' set_cookie_header = original_headers.fetch('Set-Cookie') set_cookie_header.split("\n").each do |cookie| cookie_name, cookie_filling = cookie.split('=', 2) cookie_attributes = identify_cookie_attributes cookie_filling parsed_cookie = CGI::Cookie.new( 'name' => cookie_name.strip, 'value' => cookie_attributes.fetch('value'), 'path' => cookie_attributes.fetch('path', nil), 'domain' => cookie_attributes.fetch('domain', nil), 'expires' => cookie_attributes.fetch('expires', nil), 'secure' => cookie_attributes.fetch('secure', false) ) cookies.store(cookie_name, parsed_cookie) end end cookies end def identify_cookie_attributes(cookie_filling) cookie_bits = cookie_filling.split(';') cookie_attributes = Hash.new cookie_attributes.store('value', cookie_bits[0].strip) cookie_bits.each do |bit| if bit.include? '=' cookie_attribute, attribute_value = bit.split('=') cookie_attributes.store(cookie_attribute.strip, attribute_value.strip) if cookie_attribute.include? 'max-age' cookie_attributes.store('expires', Time.now + attribute_value.strip.to_i) end end if bit.include? 'secure' cookie_attributes.store('secure', true) end end cookie_attributes end end end PK!D-share/gems/gems/rack-2.2.4/lib/rack/logger.rbnu[# frozen_string_literal: true require 'logger' module Rack # Sets up rack.logger to write to rack.errors stream class Logger def initialize(app, level = ::Logger::INFO) @app, @level = app, level end def call(env) logger = ::Logger.new(env[RACK_ERRORS]) logger.level = @level env[RACK_LOGGER] = logger @app.call(env) end end end PK!۷_B B 0share/gems/gems/rack-2.2.4/lib/rack/multipart.rbnu[# frozen_string_literal: true require_relative 'multipart/parser' module Rack # A multipart form data parser, adapted from IOWA. # # Usually, Rack::Request#POST takes care of calling this. module Multipart autoload :UploadedFile, 'rack/multipart/uploaded_file' autoload :Generator, 'rack/multipart/generator' EOL = "\r\n" MULTIPART_BOUNDARY = "AaB03x" MULTIPART = %r|\Amultipart/.*boundary=\"?([^\";,]+)\"?|ni TOKEN = /[^\s()<>,;:\\"\/\[\]?=]+/ CONDISP = /Content-Disposition:\s*#{TOKEN}\s*/i VALUE = /"(?:\\"|[^"])*"|#{TOKEN}/ BROKEN = /^#{CONDISP}.*;\s*filename=(#{VALUE})/i MULTIPART_CONTENT_TYPE = /Content-Type: (.*)#{EOL}/ni MULTIPART_CONTENT_DISPOSITION = /Content-Disposition:.*;\s*name=(#{VALUE})/ni MULTIPART_CONTENT_ID = /Content-ID:\s*([^#{EOL}]*)/ni # Updated definitions from RFC 2231 ATTRIBUTE_CHAR = %r{[^ \t\v\n\r)(><@,;:\\"/\[\]?='*%]} ATTRIBUTE = /#{ATTRIBUTE_CHAR}+/ SECTION = /\*[0-9]+/ REGULAR_PARAMETER_NAME = /#{ATTRIBUTE}#{SECTION}?/ REGULAR_PARAMETER = /(#{REGULAR_PARAMETER_NAME})=(#{VALUE})/ EXTENDED_OTHER_NAME = /#{ATTRIBUTE}\*[1-9][0-9]*\*/ EXTENDED_OTHER_VALUE = /%[0-9a-fA-F]{2}|#{ATTRIBUTE_CHAR}/ EXTENDED_OTHER_PARAMETER = /(#{EXTENDED_OTHER_NAME})=(#{EXTENDED_OTHER_VALUE}*)/ EXTENDED_INITIAL_NAME = /#{ATTRIBUTE}(?:\*0)?\*/ EXTENDED_INITIAL_VALUE = /[a-zA-Z0-9\-]*'[a-zA-Z0-9\-]*'#{EXTENDED_OTHER_VALUE}*/ EXTENDED_INITIAL_PARAMETER = /(#{EXTENDED_INITIAL_NAME})=(#{EXTENDED_INITIAL_VALUE})/ EXTENDED_PARAMETER = /#{EXTENDED_INITIAL_PARAMETER}|#{EXTENDED_OTHER_PARAMETER}/ DISPPARM = /;\s*(?:#{REGULAR_PARAMETER}|#{EXTENDED_PARAMETER})\s*/ RFC2183 = /^#{CONDISP}(#{DISPPARM})+$/i class << self def parse_multipart(env, params = Rack::Utils.default_query_parser) extract_multipart Rack::Request.new(env), params end def extract_multipart(req, params = Rack::Utils.default_query_parser) io = req.get_header(RACK_INPUT) io.rewind content_length = req.content_length content_length = content_length.to_i if content_length tempfile = req.get_header(RACK_MULTIPART_TEMPFILE_FACTORY) || Parser::TEMPFILE_FACTORY bufsize = req.get_header(RACK_MULTIPART_BUFFER_SIZE) || Parser::BUFSIZE info = Parser.parse io, content_length, req.get_header('CONTENT_TYPE'), tempfile, bufsize, params req.set_header(RACK_TEMPFILES, info.tmp_files) info.params end def build_multipart(params, first = true) Generator.new(params, first).dump end end end end PK!z 4share/gems/gems/rack-2.2.4/lib/rack/common_logger.rbnu[# frozen_string_literal: true module Rack # Rack::CommonLogger forwards every request to the given +app+, and # logs a line in the # {Apache common log format}[http://httpd.apache.org/docs/1.3/logs.html#common] # to the configured logger. class CommonLogger # Common Log Format: http://httpd.apache.org/docs/1.3/logs.html#common # # lilith.local - - [07/Aug/2006 23:58:02 -0400] "GET / HTTP/1.1" 500 - # # %{%s - %s [%s] "%s %s%s %s" %d %s\n} % # # The actual format is slightly different than the above due to the # separation of SCRIPT_NAME and PATH_INFO, and because the elapsed # time in seconds is included at the end. FORMAT = %{%s - %s [%s] "%s %s%s%s %s" %d %s %0.4f\n} # +logger+ can be any object that supports the +write+ or +<<+ methods, # which includes the standard library Logger. These methods are called # with a single string argument, the log message. # If +logger+ is nil, CommonLogger will fall back env['rack.errors']. def initialize(app, logger = nil) @app = app @logger = logger end # Log all requests in common_log format after a response has been # returned. Note that if the app raises an exception, the request # will not be logged, so if exception handling middleware are used, # they should be loaded after this middleware. Additionally, because # the logging happens after the request body has been fully sent, any # exceptions raised during the sending of the response body will # cause the request not to be logged. def call(env) began_at = Utils.clock_time status, headers, body = @app.call(env) headers = Utils::HeaderHash[headers] body = BodyProxy.new(body) { log(env, status, headers, began_at) } [status, headers, body] end private # Log the request to the configured logger. def log(env, status, header, began_at) length = extract_content_length(header) msg = FORMAT % [ env['HTTP_X_FORWARDED_FOR'] || env["REMOTE_ADDR"] || "-", env["REMOTE_USER"] || "-", Time.now.strftime("%d/%b/%Y:%H:%M:%S %z"), env[REQUEST_METHOD], env[SCRIPT_NAME], env[PATH_INFO], env[QUERY_STRING].empty? ? "" : "?#{env[QUERY_STRING]}", env[SERVER_PROTOCOL], status.to_s[0..3], length, Utils.clock_time - began_at ] msg.gsub!(/[^[:print:]\n]/) { |c| "\\x#{c.ord}" } logger = @logger || env[RACK_ERRORS] # Standard library logger doesn't support write but it supports << which actually # calls to write on the log device without formatting if logger.respond_to?(:write) logger.write(msg) else logger << msg end end # Attempt to determine the content length for the response to # include it in the logged data. def extract_content_length(headers) value = headers[CONTENT_LENGTH] !value || value.to_s == '0' ? '-' : value end end end PK!l9? .share/gems/gems/rack-2.2.4/lib/rack/builder.rbnu[# frozen_string_literal: true module Rack # Rack::Builder implements a small DSL to iteratively construct Rack # applications. # # Example: # # require 'rack/lobster' # app = Rack::Builder.new do # use Rack::CommonLogger # use Rack::ShowExceptions # map "/lobster" do # use Rack::Lint # run Rack::Lobster.new # end # end # # run app # # Or # # app = Rack::Builder.app do # use Rack::CommonLogger # run lambda { |env| [200, {'Content-Type' => 'text/plain'}, ['OK']] } # end # # run app # # +use+ adds middleware to the stack, +run+ dispatches to an application. # You can use +map+ to construct a Rack::URLMap in a convenient way. class Builder # https://stackoverflow.com/questions/2223882/whats-the-difference-between-utf-8-and-utf-8-without-bom UTF_8_BOM = '\xef\xbb\xbf' # Parse the given config file to get a Rack application. # # If the config file ends in +.ru+, it is treated as a # rackup file and the contents will be treated as if # specified inside a Rack::Builder block, using the given # options. # # If the config file does not end in +.ru+, it is # required and Rack will use the basename of the file # to guess which constant will be the Rack application to run. # The options given will be ignored in this case. # # Examples: # # Rack::Builder.parse_file('config.ru') # # Rack application built using Rack::Builder.new # # Rack::Builder.parse_file('app.rb') # # requires app.rb, which can be anywhere in Ruby's # # load path. After requiring, assumes App constant # # contains Rack application # # Rack::Builder.parse_file('./my_app.rb') # # requires ./my_app.rb, which should be in the # # process's current directory. After requiring, # # assumes MyApp constant contains Rack application def self.parse_file(config, opts = Server::Options.new) if config.end_with?('.ru') return self.load_file(config, opts) else require config app = Object.const_get(::File.basename(config, '.rb').split('_').map(&:capitalize).join('')) return app, {} end end # Load the given file as a rackup file, treating the # contents as if specified inside a Rack::Builder block. # # Treats the first comment at the beginning of a line # that starts with a backslash as options similar to # options passed on a rackup command line. # # Ignores content in the file after +__END__+, so that # use of +__END__+ will not result in a syntax error. # # Example config.ru file: # # $ cat config.ru # # #\ -p 9393 # # use Rack::ContentLength # require './app.rb' # run App def self.load_file(path, opts = Server::Options.new) options = {} cfgfile = ::File.read(path) cfgfile.slice!(/\A#{UTF_8_BOM}/) if cfgfile.encoding == Encoding::UTF_8 if cfgfile[/^#\\(.*)/] && opts warn "Parsing options from the first comment line is deprecated!" options = opts.parse! $1.split(/\s+/) end cfgfile.sub!(/^__END__\n.*\Z/m, '') app = new_from_string cfgfile, path return app, options end # Evaluate the given +builder_script+ string in the context of # a Rack::Builder block, returning a Rack application. def self.new_from_string(builder_script, file = "(rackup)") # We want to build a variant of TOPLEVEL_BINDING with self as a Rack::Builder instance. # We cannot use instance_eval(String) as that would resolve constants differently. binding, builder = TOPLEVEL_BINDING.eval('Rack::Builder.new.instance_eval { [binding, self] }') eval builder_script, binding, file builder.to_app end # Initialize a new Rack::Builder instance. +default_app+ specifies the # default application if +run+ is not called later. If a block # is given, it is evaluted in the context of the instance. def initialize(default_app = nil, &block) @use, @map, @run, @warmup, @freeze_app = [], nil, default_app, nil, false instance_eval(&block) if block_given? end # Create a new Rack::Builder instance and return the Rack application # generated from it. def self.app(default_app = nil, &block) self.new(default_app, &block).to_app end # Specifies middleware to use in a stack. # # class Middleware # def initialize(app) # @app = app # end # # def call(env) # env["rack.some_header"] = "setting an example" # @app.call(env) # end # end # # use Middleware # run lambda { |env| [200, { "Content-Type" => "text/plain" }, ["OK"]] } # # All requests through to this application will first be processed by the middleware class. # The +call+ method in this example sets an additional environment key which then can be # referenced in the application if required. def use(middleware, *args, &block) if @map mapping, @map = @map, nil @use << proc { |app| generate_map(app, mapping) } end @use << proc { |app| middleware.new(app, *args, &block) } end ruby2_keywords(:use) if respond_to?(:ruby2_keywords, true) # Takes an argument that is an object that responds to #call and returns a Rack response. # The simplest form of this is a lambda object: # # run lambda { |env| [200, { "Content-Type" => "text/plain" }, ["OK"]] } # # However this could also be a class: # # class Heartbeat # def self.call(env) # [200, { "Content-Type" => "text/plain" }, ["OK"]] # end # end # # run Heartbeat def run(app) @run = app end # Takes a lambda or block that is used to warm-up the application. This block is called # before the Rack application is returned by to_app. # # warmup do |app| # client = Rack::MockRequest.new(app) # client.get('/') # end # # use SomeMiddleware # run MyApp def warmup(prc = nil, &block) @warmup = prc || block end # Creates a route within the application. Routes under the mapped path will be sent to # the Rack application specified by run inside the block. Other requests will be sent to the # default application specified by run outside the block. # # Rack::Builder.app do # map '/heartbeat' do # run Heartbeat # end # run App # end # # The +use+ method can also be used inside the block to specify middleware to run under a specific path: # # Rack::Builder.app do # map '/heartbeat' do # use Middleware # run Heartbeat # end # run App # end # # This example includes a piece of middleware which will run before +/heartbeat+ requests hit +Heartbeat+. # # Note that providing a +path+ of +/+ will ignore any default application given in a +run+ statement # outside the block. def map(path, &block) @map ||= {} @map[path] = block end # Freeze the app (set using run) and all middleware instances when building the application # in to_app. def freeze_app @freeze_app = true end # Return the Rack application generated by this instance. def to_app app = @map ? generate_map(@run, @map) : @run fail "missing run or map statement" unless app app.freeze if @freeze_app app = @use.reverse.inject(app) { |a, e| e[a].tap { |x| x.freeze if @freeze_app } } @warmup.call(app) if @warmup app end # Call the Rack application generated by this builder instance. Note that # this rebuilds the Rack application and runs the warmup code (if any) # every time it is called, so it should not be used if performance is important. def call(env) to_app.call(env) end private # Generate a URLMap instance by generating new Rack applications for each # map block in this instance. def generate_map(default_app, mapping) mapped = default_app ? { '/' => default_app } : {} mapping.each { |r, b| mapped[r] = self.class.new(default_app, &b).to_app } URLMap.new(mapped) end end end PK!uc c 6share/gems/gems/rack-2.2.4/lib/rack/auth/digest/md5.rbnu[# frozen_string_literal: true require_relative '../abstract/handler' require_relative 'request' require_relative 'params' require_relative 'nonce' require 'digest/md5' module Rack module Auth module Digest # Rack::Auth::Digest::MD5 implements the MD5 algorithm version of # HTTP Digest Authentication, as per RFC 2617. # # Initialize with the [Rack] application that you want protecting, # and a block that looks up a plaintext password for a given username. # # +opaque+ needs to be set to a constant base64/hexadecimal string. # class MD5 < AbstractHandler attr_accessor :opaque attr_writer :passwords_hashed def initialize(app, realm = nil, opaque = nil, &authenticator) @passwords_hashed = nil if opaque.nil? and realm.respond_to? :values_at realm, opaque, @passwords_hashed = realm.values_at :realm, :opaque, :passwords_hashed end super(app, realm, &authenticator) @opaque = opaque end def passwords_hashed? !!@passwords_hashed end def call(env) auth = Request.new(env) unless auth.provided? return unauthorized end if !auth.digest? || !auth.correct_uri? || !valid_qop?(auth) return bad_request end if valid?(auth) if auth.nonce.stale? return unauthorized(challenge(stale: true)) else env['REMOTE_USER'] = auth.username return @app.call(env) end end unauthorized end private QOP = 'auth' def params(hash = {}) Params.new do |params| params['realm'] = realm params['nonce'] = Nonce.new.to_s params['opaque'] = H(opaque) params['qop'] = QOP hash.each { |k, v| params[k] = v } end end def challenge(hash = {}) "Digest #{params(hash)}" end def valid?(auth) valid_opaque?(auth) && valid_nonce?(auth) && valid_digest?(auth) end def valid_qop?(auth) QOP == auth.qop end def valid_opaque?(auth) H(opaque) == auth.opaque end def valid_nonce?(auth) auth.nonce.valid? end def valid_digest?(auth) pw = @authenticator.call(auth.username) pw && Rack::Utils.secure_compare(digest(auth, pw), auth.response) end def md5(data) ::Digest::MD5.hexdigest(data) end alias :H :md5 def KD(secret, data) H "#{secret}:#{data}" end def A1(auth, password) "#{auth.username}:#{auth.realm}:#{password}" end def A2(auth) "#{auth.method}:#{auth.uri}" end def digest(auth, password) password_hash = passwords_hashed? ? password : H(A1(auth, password)) KD password_hash, "#{auth.nonce}:#{auth.nc}:#{auth.cnonce}:#{QOP}:#{H A2(auth)}" end end end end end PK!ٓ:share/gems/gems/rack-2.2.4/lib/rack/auth/digest/request.rbnu[# frozen_string_literal: true require_relative '../abstract/request' require_relative 'params' require_relative 'nonce' module Rack module Auth module Digest class Request < Auth::AbstractRequest def method @env[RACK_METHODOVERRIDE_ORIGINAL_METHOD] || @env[REQUEST_METHOD] end def digest? "digest" == scheme end def correct_uri? request.fullpath == uri end def nonce @nonce ||= Nonce.parse(params['nonce']) end def params @params ||= Params.parse(parts.last) end def respond_to?(sym, *) super or params.has_key? sym.to_s end def method_missing(sym, *args) return super unless params.has_key?(key = sym.to_s) return params[key] if args.size == 0 raise ArgumentError, "wrong number of arguments (#{args.size} for 0)" end end end end end PK!q8share/gems/gems/rack-2.2.4/lib/rack/auth/digest/nonce.rbnu[# frozen_string_literal: true require 'digest/md5' require 'base64' module Rack module Auth module Digest # Rack::Auth::Digest::Nonce is the default nonce generator for the # Rack::Auth::Digest::MD5 authentication handler. # # +private_key+ needs to set to a constant string. # # +time_limit+ can be optionally set to an integer (number of seconds), # to limit the validity of the generated nonces. class Nonce class << self attr_accessor :private_key, :time_limit end def self.parse(string) new(*Base64.decode64(string).split(' ', 2)) end def initialize(timestamp = Time.now, given_digest = nil) @timestamp, @given_digest = timestamp.to_i, given_digest end def to_s Base64.encode64("#{@timestamp} #{digest}").strip end def digest ::Digest::MD5.hexdigest("#{@timestamp}:#{self.class.private_key}") end def valid? digest == @given_digest end def stale? !self.class.time_limit.nil? && (Time.now.to_i - @timestamp) > self.class.time_limit end def fresh? !stale? end end end end end PK!XGG9share/gems/gems/rack-2.2.4/lib/rack/auth/digest/params.rbnu[# frozen_string_literal: true module Rack module Auth module Digest class Params < Hash def self.parse(str) Params[*split_header_value(str).map do |param| k, v = param.split('=', 2) [k, dequote(v)] end.flatten] end def self.dequote(str) # From WEBrick::HTTPUtils ret = (/\A"(.*)"\Z/ =~ str) ? $1 : str.dup ret.gsub!(/\\(.)/, "\\1") ret end def self.split_header_value(str) str.scan(/\w+\=(?:"[^\"]+"|[^,]+)/n) end def initialize super() yield self if block_given? end def [](k) super k.to_s end def []=(k, v) super k.to_s, v.to_s end UNQUOTED = ['nc', 'stale'] def to_s map do |k, v| "#{k}=#{(UNQUOTED.include?(k) ? v.to_s : quote(v))}" end.join(', ') end def quote(str) # From WEBrick::HTTPUtils '"' + str.gsub(/[\\\"]/o, "\\\1") + '"' end end end end end PK!fmRX1share/gems/gems/rack-2.2.4/lib/rack/auth/basic.rbnu[# frozen_string_literal: true require_relative 'abstract/handler' require_relative 'abstract/request' require 'base64' module Rack module Auth # Rack::Auth::Basic implements HTTP Basic Authentication, as per RFC 2617. # # Initialize with the Rack application that you want protecting, # and a block that checks if a username and password pair are valid. # # See also: example/protectedlobster.rb class Basic < AbstractHandler def call(env) auth = Basic::Request.new(env) return unauthorized unless auth.provided? return bad_request unless auth.basic? if valid?(auth) env['REMOTE_USER'] = auth.username return @app.call(env) end unauthorized end private def challenge 'Basic realm="%s"' % realm end def valid?(auth) @authenticator.call(*auth.credentials) end class Request < Auth::AbstractRequest def basic? "basic" == scheme && credentials.length == 2 end def credentials @credentials ||= Base64.decode64(params).split(':', 2) end def username credentials.first end end end end end PK!#8AA<share/gems/gems/rack-2.2.4/lib/rack/auth/abstract/request.rbnu[# frozen_string_literal: true module Rack module Auth class AbstractRequest def initialize(env) @env = env end def request @request ||= Request.new(@env) end def provided? !authorization_key.nil? && valid? end def valid? !@env[authorization_key].nil? end def parts @parts ||= @env[authorization_key].split(' ', 2) end def scheme @scheme ||= parts.first && parts.first.downcase end def params @params ||= parts.last end private AUTHORIZATION_KEYS = ['HTTP_AUTHORIZATION', 'X-HTTP_AUTHORIZATION', 'X_HTTP_AUTHORIZATION'] def authorization_key @authorization_key ||= AUTHORIZATION_KEYS.detect { |key| @env.has_key?(key) } end end end end PK!^..<share/gems/gems/rack-2.2.4/lib/rack/auth/abstract/handler.rbnu[# frozen_string_literal: true module Rack module Auth # Rack::Auth::AbstractHandler implements common authentication functionality. # # +realm+ should be set for all handlers. class AbstractHandler attr_accessor :realm def initialize(app, realm = nil, &authenticator) @app, @realm, @authenticator = app, realm, authenticator end private def unauthorized(www_authenticate = challenge) return [ 401, { CONTENT_TYPE => 'text/plain', CONTENT_LENGTH => '0', 'WWW-Authenticate' => www_authenticate.to_s }, [] ] end def bad_request return [ 400, { CONTENT_TYPE => 'text/plain', CONTENT_LENGTH => '0' }, [] ] end end end end PK!aGi{{+share/gems/gems/rack-2.2.4/lib/rack/lint.rbnu[# frozen_string_literal: true require 'forwardable' module Rack # Rack::Lint validates your application and the requests and # responses according to the Rack spec. class Lint def initialize(app) @app = app @content_length = nil end # :stopdoc: class LintError < RuntimeError; end module Assertion def assert(message) unless yield raise LintError, message end end end include Assertion ## This specification aims to formalize the Rack protocol. You ## can (and should) use Rack::Lint to enforce it. ## ## When you develop middleware, be sure to add a Lint before and ## after to catch all mistakes. ## = Rack applications ## A Rack application is a Ruby object (not a class) that ## responds to +call+. def call(env = nil) dup._call(env) end def _call(env) ## It takes exactly one argument, the *environment* assert("No env given") { env } check_env env env[RACK_INPUT] = InputWrapper.new(env[RACK_INPUT]) env[RACK_ERRORS] = ErrorWrapper.new(env[RACK_ERRORS]) ## and returns an Array of exactly three values: ary = @app.call(env) assert("response is not an Array, but #{ary.class}") { ary.kind_of? Array } assert("response array has #{ary.size} elements instead of 3") { ary.size == 3 } status, headers, @body = ary ## The *status*, check_status status ## the *headers*, check_headers headers hijack_proc = check_hijack_response headers, env if hijack_proc && headers.is_a?(Hash) headers[RACK_HIJACK] = hijack_proc end ## and the *body*. check_content_type status, headers check_content_length status, headers @head_request = env[REQUEST_METHOD] == HEAD [status, headers, self] end ## == The Environment def check_env(env) ## The environment must be an unfrozen instance of Hash that includes ## CGI-like headers. The application is free to modify the ## environment. assert("env #{env.inspect} is not a Hash, but #{env.class}") { env.kind_of? Hash } assert("env should not be frozen, but is") { !env.frozen? } ## ## The environment is required to include these variables ## (adopted from PEP333), except when they'd be empty, but see ## below. ## REQUEST_METHOD:: The HTTP request method, such as ## "GET" or "POST". This cannot ever ## be an empty string, and so is ## always required. ## SCRIPT_NAME:: The initial portion of the request ## URL's "path" that corresponds to the ## application object, so that the ## application knows its virtual ## "location". This may be an empty ## string, if the application corresponds ## to the "root" of the server. ## PATH_INFO:: The remainder of the request URL's ## "path", designating the virtual ## "location" of the request's target ## within the application. This may be an ## empty string, if the request URL targets ## the application root and does not have a ## trailing slash. This value may be ## percent-encoded when originating from ## a URL. ## QUERY_STRING:: The portion of the request URL that ## follows the ?, if any. May be ## empty, but is always required! ## SERVER_NAME:: When combined with SCRIPT_NAME and ## PATH_INFO, these variables can be ## used to complete the URL. Note, however, ## that HTTP_HOST, if present, ## should be used in preference to ## SERVER_NAME for reconstructing ## the request URL. ## SERVER_NAME can never be an empty ## string, and so is always required. ## SERVER_PORT:: An optional +Integer+ which is the port the ## server is running on. Should be specified if ## the server is running on a non-standard port. ## HTTP_ Variables:: Variables corresponding to the ## client-supplied HTTP request ## headers (i.e., variables whose ## names begin with HTTP_). The ## presence or absence of these ## variables should correspond with ## the presence or absence of the ## appropriate HTTP header in the ## request. See ## {RFC3875 section 4.1.18}[https://tools.ietf.org/html/rfc3875#section-4.1.18] ## for specific behavior. ## In addition to this, the Rack environment must include these ## Rack-specific variables: ## rack.version:: The Array representing this version of Rack ## See Rack::VERSION, that corresponds to ## the version of this SPEC. ## rack.url_scheme:: +http+ or +https+, depending on the ## request URL. ## rack.input:: See below, the input stream. ## rack.errors:: See below, the error stream. ## rack.multithread:: true if the application object may be ## simultaneously invoked by another thread ## in the same process, false otherwise. ## rack.multiprocess:: true if an equivalent application object ## may be simultaneously invoked by another ## process, false otherwise. ## rack.run_once:: true if the server expects ## (but does not guarantee!) that the ## application will only be invoked this one ## time during the life of its containing ## process. Normally, this will only be true ## for a server based on CGI ## (or something similar). ## rack.hijack?:: present and true if the server supports ## connection hijacking. See below, hijacking. ## rack.hijack:: an object responding to #call that must be ## called at least once before using ## rack.hijack_io. ## It is recommended #call return rack.hijack_io ## as well as setting it in env if necessary. ## rack.hijack_io:: if rack.hijack? is true, and rack.hijack ## has received #call, this will contain ## an object resembling an IO. See hijacking. ## Additional environment specifications have approved to ## standardized middleware APIs. None of these are required to ## be implemented by the server. ## rack.session:: A hash like interface for storing ## request session data. ## The store must implement: if session = env[RACK_SESSION] ## store(key, value) (aliased as []=); assert("session #{session.inspect} must respond to store and []=") { session.respond_to?(:store) && session.respond_to?(:[]=) } ## fetch(key, default = nil) (aliased as []); assert("session #{session.inspect} must respond to fetch and []") { session.respond_to?(:fetch) && session.respond_to?(:[]) } ## delete(key); assert("session #{session.inspect} must respond to delete") { session.respond_to?(:delete) } ## clear; assert("session #{session.inspect} must respond to clear") { session.respond_to?(:clear) } ## to_hash (returning unfrozen Hash instance); assert("session #{session.inspect} must respond to to_hash and return unfrozen Hash instance") { session.respond_to?(:to_hash) && session.to_hash.kind_of?(Hash) && !session.to_hash.frozen? } end ## rack.logger:: A common object interface for logging messages. ## The object must implement: if logger = env[RACK_LOGGER] ## info(message, &block) assert("logger #{logger.inspect} must respond to info") { logger.respond_to?(:info) } ## debug(message, &block) assert("logger #{logger.inspect} must respond to debug") { logger.respond_to?(:debug) } ## warn(message, &block) assert("logger #{logger.inspect} must respond to warn") { logger.respond_to?(:warn) } ## error(message, &block) assert("logger #{logger.inspect} must respond to error") { logger.respond_to?(:error) } ## fatal(message, &block) assert("logger #{logger.inspect} must respond to fatal") { logger.respond_to?(:fatal) } end ## rack.multipart.buffer_size:: An Integer hint to the multipart parser as to what chunk size to use for reads and writes. if bufsize = env[RACK_MULTIPART_BUFFER_SIZE] assert("rack.multipart.buffer_size must be an Integer > 0 if specified") { bufsize.is_a?(Integer) && bufsize > 0 } end ## rack.multipart.tempfile_factory:: An object responding to #call with two arguments, the filename and content_type given for the multipart form field, and returning an IO-like object that responds to #<< and optionally #rewind. This factory will be used to instantiate the tempfile for each multipart form file upload field, rather than the default class of Tempfile. if tempfile_factory = env[RACK_MULTIPART_TEMPFILE_FACTORY] assert("rack.multipart.tempfile_factory must respond to #call") { tempfile_factory.respond_to?(:call) } env[RACK_MULTIPART_TEMPFILE_FACTORY] = lambda do |filename, content_type| io = tempfile_factory.call(filename, content_type) assert("rack.multipart.tempfile_factory return value must respond to #<<") { io.respond_to?(:<<) } io end end ## The server or the application can store their own data in the ## environment, too. The keys must contain at least one dot, ## and should be prefixed uniquely. The prefix rack. ## is reserved for use with the Rack core distribution and other ## accepted specifications and must not be used otherwise. ## %w[REQUEST_METHOD SERVER_NAME QUERY_STRING rack.version rack.input rack.errors rack.multithread rack.multiprocess rack.run_once].each { |header| assert("env missing required key #{header}") { env.include? header } } ## The SERVER_PORT must be an Integer if set. assert("env[SERVER_PORT] is not an Integer") do server_port = env["SERVER_PORT"] server_port.nil? || (Integer(server_port) rescue false) end ## The SERVER_NAME must be a valid authority as defined by RFC7540. assert("#{env[SERVER_NAME]} must be a valid authority") do URI.parse("http://#{env[SERVER_NAME]}/") rescue false end ## The HTTP_HOST must be a valid authority as defined by RFC7540. assert("#{env[HTTP_HOST]} must be a valid authority") do URI.parse("http://#{env[HTTP_HOST]}/") rescue false end ## The environment must not contain the keys ## HTTP_CONTENT_TYPE or HTTP_CONTENT_LENGTH ## (use the versions without HTTP_). %w[HTTP_CONTENT_TYPE HTTP_CONTENT_LENGTH].each { |header| assert("env contains #{header}, must use #{header[5, -1]}") { not env.include? header } } ## The CGI keys (named without a period) must have String values. ## If the string values for CGI keys contain non-ASCII characters, ## they should use ASCII-8BIT encoding. env.each { |key, value| next if key.include? "." # Skip extensions assert("env variable #{key} has non-string value #{value.inspect}") { value.kind_of? String } next if value.encoding == Encoding::ASCII_8BIT assert("env variable #{key} has value containing non-ASCII characters and has non-ASCII-8BIT encoding #{value.inspect} encoding: #{value.encoding}") { value.b !~ /[\x80-\xff]/n } } ## There are the following restrictions: ## * rack.version must be an array of Integers. assert("rack.version must be an Array, was #{env[RACK_VERSION].class}") { env[RACK_VERSION].kind_of? Array } ## * rack.url_scheme must either be +http+ or +https+. assert("rack.url_scheme unknown: #{env[RACK_URL_SCHEME].inspect}") { %w[http https].include?(env[RACK_URL_SCHEME]) } ## * There must be a valid input stream in rack.input. check_input env[RACK_INPUT] ## * There must be a valid error stream in rack.errors. check_error env[RACK_ERRORS] ## * There may be a valid hijack stream in rack.hijack_io check_hijack env ## * The REQUEST_METHOD must be a valid token. assert("REQUEST_METHOD unknown: #{env[REQUEST_METHOD].dump}") { env[REQUEST_METHOD] =~ /\A[0-9A-Za-z!\#$%&'*+.^_`|~-]+\z/ } ## * The SCRIPT_NAME, if non-empty, must start with / assert("SCRIPT_NAME must start with /") { !env.include?(SCRIPT_NAME) || env[SCRIPT_NAME] == "" || env[SCRIPT_NAME] =~ /\A\// } ## * The PATH_INFO, if non-empty, must start with / assert("PATH_INFO must start with /") { !env.include?(PATH_INFO) || env[PATH_INFO] == "" || env[PATH_INFO] =~ /\A\// } ## * The CONTENT_LENGTH, if given, must consist of digits only. assert("Invalid CONTENT_LENGTH: #{env["CONTENT_LENGTH"]}") { !env.include?("CONTENT_LENGTH") || env["CONTENT_LENGTH"] =~ /\A\d+\z/ } ## * One of SCRIPT_NAME or PATH_INFO must be ## set. PATH_INFO should be / if ## SCRIPT_NAME is empty. assert("One of SCRIPT_NAME or PATH_INFO must be set (make PATH_INFO '/' if SCRIPT_NAME is empty)") { env[SCRIPT_NAME] || env[PATH_INFO] } ## SCRIPT_NAME never should be /, but instead be empty. assert("SCRIPT_NAME cannot be '/', make it '' and PATH_INFO '/'") { env[SCRIPT_NAME] != "/" } end ## === The Input Stream ## ## The input stream is an IO-like object which contains the raw HTTP ## POST data. def check_input(input) ## When applicable, its external encoding must be "ASCII-8BIT" and it ## must be opened in binary mode, for Ruby 1.9 compatibility. assert("rack.input #{input} does not have ASCII-8BIT as its external encoding") { input.external_encoding == Encoding::ASCII_8BIT } if input.respond_to?(:external_encoding) assert("rack.input #{input} is not opened in binary mode") { input.binmode? } if input.respond_to?(:binmode?) ## The input stream must respond to +gets+, +each+, +read+ and +rewind+. [:gets, :each, :read, :rewind].each { |method| assert("rack.input #{input} does not respond to ##{method}") { input.respond_to? method } } end class InputWrapper include Assertion def initialize(input) @input = input end ## * +gets+ must be called without arguments and return a string, ## or +nil+ on EOF. def gets(*args) assert("rack.input#gets called with arguments") { args.size == 0 } v = @input.gets assert("rack.input#gets didn't return a String") { v.nil? or v.kind_of? String } v end ## * +read+ behaves like IO#read. ## Its signature is read([length, [buffer]]). ## ## If given, +length+ must be a non-negative Integer (>= 0) or +nil+, ## and +buffer+ must be a String and may not be nil. ## ## If +length+ is given and not nil, then this method reads at most ## +length+ bytes from the input stream. ## ## If +length+ is not given or nil, then this method reads ## all data until EOF. ## ## When EOF is reached, this method returns nil if +length+ is given ## and not nil, or "" if +length+ is not given or is nil. ## ## If +buffer+ is given, then the read data will be placed ## into +buffer+ instead of a newly created String object. def read(*args) assert("rack.input#read called with too many arguments") { args.size <= 2 } if args.size >= 1 assert("rack.input#read called with non-integer and non-nil length") { args.first.kind_of?(Integer) || args.first.nil? } assert("rack.input#read called with a negative length") { args.first.nil? || args.first >= 0 } end if args.size >= 2 assert("rack.input#read called with non-String buffer") { args[1].kind_of?(String) } end v = @input.read(*args) assert("rack.input#read didn't return nil or a String") { v.nil? or v.kind_of? String } if args[0].nil? assert("rack.input#read(nil) returned nil on EOF") { !v.nil? } end v end ## * +each+ must be called without arguments and only yield Strings. def each(*args) assert("rack.input#each called with arguments") { args.size == 0 } @input.each { |line| assert("rack.input#each didn't yield a String") { line.kind_of? String } yield line } end ## * +rewind+ must be called without arguments. It rewinds the input ## stream back to the beginning. It must not raise Errno::ESPIPE: ## that is, it may not be a pipe or a socket. Therefore, handler ## developers must buffer the input data into some rewindable object ## if the underlying input stream is not rewindable. def rewind(*args) assert("rack.input#rewind called with arguments") { args.size == 0 } assert("rack.input#rewind raised Errno::ESPIPE") { begin @input.rewind true rescue Errno::ESPIPE false end } end ## * +close+ must never be called on the input stream. def close(*args) assert("rack.input#close must not be called") { false } end end ## === The Error Stream def check_error(error) ## The error stream must respond to +puts+, +write+ and +flush+. [:puts, :write, :flush].each { |method| assert("rack.error #{error} does not respond to ##{method}") { error.respond_to? method } } end class ErrorWrapper include Assertion def initialize(error) @error = error end ## * +puts+ must be called with a single argument that responds to +to_s+. def puts(str) @error.puts str end ## * +write+ must be called with a single argument that is a String. def write(str) assert("rack.errors#write not called with a String") { str.kind_of? String } @error.write str end ## * +flush+ must be called without arguments and must be called ## in order to make the error appear for sure. def flush @error.flush end ## * +close+ must never be called on the error stream. def close(*args) assert("rack.errors#close must not be called") { false } end end class HijackWrapper include Assertion extend Forwardable REQUIRED_METHODS = [ :read, :write, :read_nonblock, :write_nonblock, :flush, :close, :close_read, :close_write, :closed? ] def_delegators :@io, *REQUIRED_METHODS def initialize(io) @io = io REQUIRED_METHODS.each do |meth| assert("rack.hijack_io must respond to #{meth}") { io.respond_to? meth } end end end ## === Hijacking # # AUTHORS: n.b. The trailing whitespace between paragraphs is important and # should not be removed. The whitespace creates paragraphs in the RDoc # output. # ## ==== Request (before status) def check_hijack(env) if env[RACK_IS_HIJACK] ## If rack.hijack? is true then rack.hijack must respond to #call. original_hijack = env[RACK_HIJACK] assert("rack.hijack must respond to call") { original_hijack.respond_to?(:call) } env[RACK_HIJACK] = proc do ## rack.hijack must return the io that will also be assigned (or is ## already present, in rack.hijack_io. io = original_hijack.call HijackWrapper.new(io) ## ## rack.hijack_io must respond to: ## read, write, read_nonblock, write_nonblock, flush, close, ## close_read, close_write, closed? ## ## The semantics of these IO methods must be a best effort match to ## those of a normal ruby IO or Socket object, using standard ## arguments and raising standard exceptions. Servers are encouraged ## to simply pass on real IO objects, although it is recognized that ## this approach is not directly compatible with SPDY and HTTP 2.0. ## ## IO provided in rack.hijack_io should preference the ## IO::WaitReadable and IO::WaitWritable APIs wherever supported. ## ## There is a deliberate lack of full specification around ## rack.hijack_io, as semantics will change from server to server. ## Users are encouraged to utilize this API with a knowledge of their ## server choice, and servers may extend the functionality of ## hijack_io to provide additional features to users. The purpose of ## rack.hijack is for Rack to "get out of the way", as such, Rack only ## provides the minimum of specification and support. env[RACK_HIJACK_IO] = HijackWrapper.new(env[RACK_HIJACK_IO]) io end else ## ## If rack.hijack? is false, then rack.hijack should not be set. assert("rack.hijack? is false, but rack.hijack is present") { env[RACK_HIJACK].nil? } ## ## If rack.hijack? is false, then rack.hijack_io should not be set. assert("rack.hijack? is false, but rack.hijack_io is present") { env[RACK_HIJACK_IO].nil? } end end ## ==== Response (after headers) ## It is also possible to hijack a response after the status and headers ## have been sent. def check_hijack_response(headers, env) # this check uses headers like a hash, but the spec only requires # headers respond to #each headers = Rack::Utils::HeaderHash[headers] ## In order to do this, an application may set the special header ## rack.hijack to an object that responds to call ## accepting an argument that conforms to the rack.hijack_io ## protocol. ## ## After the headers have been sent, and this hijack callback has been ## called, the application is now responsible for the remaining lifecycle ## of the IO. The application is also responsible for maintaining HTTP ## semantics. Of specific note, in almost all cases in the current SPEC, ## applications will have wanted to specify the header Connection:close in ## HTTP/1.1, and not Connection:keep-alive, as there is no protocol for ## returning hijacked sockets to the web server. For that purpose, use the ## body streaming API instead (progressively yielding strings via each). ## ## Servers must ignore the body part of the response tuple when ## the rack.hijack response API is in use. if env[RACK_IS_HIJACK] && headers[RACK_HIJACK] assert('rack.hijack header must respond to #call') { headers[RACK_HIJACK].respond_to? :call } original_hijack = headers[RACK_HIJACK] proc do |io| original_hijack.call HijackWrapper.new(io) end else ## ## The special response header rack.hijack must only be set ## if the request env has rack.hijack? true. assert('rack.hijack header must not be present if server does not support hijacking') { headers[RACK_HIJACK].nil? } nil end end ## ==== Conventions ## * Middleware should not use hijack unless it is handling the whole ## response. ## * Middleware may wrap the IO object for the response pattern. ## * Middleware should not wrap the IO object for the request pattern. The ## request pattern is intended to provide the hijacker with "raw tcp". ## == The Response ## === The Status def check_status(status) ## This is an HTTP status. When parsed as integer (+to_i+), it must be ## greater than or equal to 100. assert("Status must be >=100 seen as integer") { status.to_i >= 100 } end ## === The Headers def check_headers(header) ## The header must respond to +each+, and yield values of key and value. assert("headers object should respond to #each, but doesn't (got #{header.class} as headers)") { header.respond_to? :each } header.each { |key, value| ## The header keys must be Strings. assert("header key must be a string, was #{key.class}") { key.kind_of? String } ## Special headers starting "rack." are for communicating with the ## server, and must not be sent back to the client. next if key =~ /^rack\..+$/ ## The header must not contain a +Status+ key. assert("header must not contain Status") { key.downcase != "status" } ## The header must conform to RFC7230 token specification, i.e. cannot ## contain non-printable ASCII, DQUOTE or "(),/:;<=>?@[\]{}". assert("invalid header name: #{key}") { key !~ /[\(\),\/:;<=>\?@\[\\\]{}[:cntrl:]]/ } ## The values of the header must be Strings, assert("a header value must be a String, but the value of " + "'#{key}' is a #{value.class}") { value.kind_of? String } ## consisting of lines (for multiple header values, e.g. multiple ## Set-Cookie values) separated by "\\n". value.split("\n").each { |item| ## The lines must not contain characters below 037. assert("invalid header value #{key}: #{item.inspect}") { item !~ /[\000-\037]/ } } } end ## === The Content-Type def check_content_type(status, headers) headers.each { |key, value| ## There must not be a Content-Type, when the +Status+ is 1xx, ## 204 or 304. if key.downcase == "content-type" assert("Content-Type header found in #{status} response, not allowed") { not Rack::Utils::STATUS_WITH_NO_ENTITY_BODY.key? status.to_i } return end } end ## === The Content-Length def check_content_length(status, headers) headers.each { |key, value| if key.downcase == 'content-length' ## There must not be a Content-Length header when the ## +Status+ is 1xx, 204 or 304. assert("Content-Length header found in #{status} response, not allowed") { not Rack::Utils::STATUS_WITH_NO_ENTITY_BODY.key? status.to_i } @content_length = value end } end def verify_content_length(bytes) if @head_request assert("Response body was given for HEAD request, but should be empty") { bytes == 0 } elsif @content_length assert("Content-Length header was #{@content_length}, but should be #{bytes}") { @content_length == bytes.to_s } end end ## === The Body def each @closed = false bytes = 0 ## The Body must respond to +each+ assert("Response body must respond to each") do @body.respond_to?(:each) end @body.each { |part| ## and must only yield String values. assert("Body yielded non-string value #{part.inspect}") { part.kind_of? String } bytes += part.bytesize yield part } verify_content_length(bytes) ## ## The Body itself should not be an instance of String, as this will ## break in Ruby 1.9. ## ## If the Body responds to +close+, it will be called after iteration. If ## the body is replaced by a middleware after action, the original body ## must be closed first, if it responds to close. # XXX howto: assert("Body has not been closed") { @closed } ## ## If the Body responds to +to_path+, it must return a String ## identifying the location of a file whose contents are identical ## to that produced by calling +each+; this may be used by the ## server as an alternative, possibly more efficient way to ## transport the response. if @body.respond_to?(:to_path) assert("The file identified by body.to_path does not exist") { ::File.exist? @body.to_path } end ## ## The Body commonly is an Array of Strings, the application ## instance itself, or a File-like object. end def close @closed = true @body.close if @body.respond_to?(:close) end # :startdoc: end end ## == Thanks ## Some parts of this specification are adopted from PEP333: Python ## Web Server Gateway Interface ## v1.0 (http://www.python.org/dev/peps/pep-0333/). I'd like to thank ## everyone involved in that effort. PK!hcc3share/gems/gems/rack-2.2.4/lib/rack/query_parser.rbnu[# frozen_string_literal: true module Rack class QueryParser (require_relative 'core_ext/regexp'; using ::Rack::RegexpExtensions) if RUBY_VERSION < '2.4' DEFAULT_SEP = /[&;] */n COMMON_SEP = { ";" => /[;] */n, ";," => /[;,] */n, "&" => /[&] */n } # ParameterTypeError is the error that is raised when incoming structural # parameters (parsed by parse_nested_query) contain conflicting types. class ParameterTypeError < TypeError; end # InvalidParameterError is the error that is raised when incoming structural # parameters (parsed by parse_nested_query) contain invalid format or byte # sequence. class InvalidParameterError < ArgumentError; end # ParamsTooDeepError is the error that is raised when params are recursively # nested over the specified limit. class ParamsTooDeepError < RangeError; end def self.make_default(key_space_limit, param_depth_limit) new Params, key_space_limit, param_depth_limit end attr_reader :key_space_limit, :param_depth_limit def initialize(params_class, key_space_limit, param_depth_limit) @params_class = params_class @key_space_limit = key_space_limit @param_depth_limit = param_depth_limit end # Stolen from Mongrel, with some small modifications: # Parses a query string by breaking it up at the '&' # and ';' characters. You can also use this to parse # cookies by changing the characters used in the second # parameter (which defaults to '&;'). def parse_query(qs, d = nil, &unescaper) unescaper ||= method(:unescape) params = make_params (qs || '').split(d ? (COMMON_SEP[d] || /[#{d}] */n) : DEFAULT_SEP).each do |p| next if p.empty? k, v = p.split('=', 2).map!(&unescaper) if cur = params[k] if cur.class == Array params[k] << v else params[k] = [cur, v] end else params[k] = v end end return params.to_h end # parse_nested_query expands a query string into structural types. Supported # types are Arrays, Hashes and basic value types. It is possible to supply # query strings with parameters of conflicting types, in this case a # ParameterTypeError is raised. Users are encouraged to return a 400 in this # case. def parse_nested_query(qs, d = nil) params = make_params unless qs.nil? || qs.empty? (qs || '').split(d ? (COMMON_SEP[d] || /[#{d}] */n) : DEFAULT_SEP).each do |p| k, v = p.split('=', 2).map! { |s| unescape(s) } normalize_params(params, k, v, param_depth_limit) end end return params.to_h rescue ArgumentError => e raise InvalidParameterError, e.message, e.backtrace end # normalize_params recursively expands parameters into structural types. If # the structural types represented by two different parameter names are in # conflict, a ParameterTypeError is raised. def normalize_params(params, name, v, depth) raise ParamsTooDeepError if depth <= 0 name =~ %r(\A[\[\]]*([^\[\]]+)\]*) k = $1 || '' after = $' || '' if k.empty? if !v.nil? && name == "[]" return Array(v) else return end end if after == '' params[k] = v elsif after == "[" params[name] = v elsif after == "[]" params[k] ||= [] raise ParameterTypeError, "expected Array (got #{params[k].class.name}) for param `#{k}'" unless params[k].is_a?(Array) params[k] << v elsif after =~ %r(^\[\]\[([^\[\]]+)\]$) || after =~ %r(^\[\](.+)$) child_key = $1 params[k] ||= [] raise ParameterTypeError, "expected Array (got #{params[k].class.name}) for param `#{k}'" unless params[k].is_a?(Array) if params_hash_type?(params[k].last) && !params_hash_has_key?(params[k].last, child_key) normalize_params(params[k].last, child_key, v, depth - 1) else params[k] << normalize_params(make_params, child_key, v, depth - 1) end else params[k] ||= make_params raise ParameterTypeError, "expected Hash (got #{params[k].class.name}) for param `#{k}'" unless params_hash_type?(params[k]) params[k] = normalize_params(params[k], after, v, depth - 1) end params end def make_params @params_class.new @key_space_limit end def new_space_limit(key_space_limit) self.class.new @params_class, key_space_limit, param_depth_limit end def new_depth_limit(param_depth_limit) self.class.new @params_class, key_space_limit, param_depth_limit end private def params_hash_type?(obj) obj.kind_of?(@params_class) end def params_hash_has_key?(hash, key) return false if /\[\]/.match?(key) key.split(/[\[\]]+/).inject(hash) do |h, part| next h if part == '' return false unless params_hash_type?(h) && h.key?(part) h[part] end true end def unescape(s) Utils.unescape(s) end class Params def initialize(limit) @limit = limit @size = 0 @params = {} end def [](key) @params[key] end def []=(key, value) @size += key.size if key && !@params.key?(key) raise ParamsTooDeepError, 'exceeded available parameter key space' if @size > @limit @params[key] = value end def key?(key) @params.key?(key) end # Recursively unwraps nested `Params` objects and constructs an object # of the same shape, but using the objects' internal representations # (Ruby hashes) in place of the objects. The result is a hash consisting # purely of Ruby primitives. # # Mutation warning! # # 1. This method mutates the internal representation of the `Params` # objects in order to save object allocations. # # 2. The value you get back is a reference to the internal hash # representation, not a copy. # # 3. Because the `Params` object's internal representation is mutable # through the `#[]=` method, it is not thread safe. The result of # getting the hash representation while another thread is adding a # key to it is non-deterministic. # def to_h @params.each do |key, value| case value when self # Handle circular references gracefully. @params[key] = @params when Params @params[key] = value.to_h when Array value.map! { |v| v.kind_of?(Params) ? v.to_h : v } else # Ignore anything that is not a `Params` object or # a collection that can contain one. end end @params end alias_method :to_params_hash, :to_h end end end PK!Z  -share/gems/gems/rack-2.2.4/lib/rack/urlmap.rbnu[# frozen_string_literal: true require 'set' module Rack # Rack::URLMap takes a hash mapping urls or paths to apps, and # dispatches accordingly. Support for HTTP/1.1 host names exists if # the URLs start with http:// or https://. # # URLMap modifies the SCRIPT_NAME and PATH_INFO such that the part # relevant for dispatch is in the SCRIPT_NAME, and the rest in the # PATH_INFO. This should be taken care of when you need to # reconstruct the URL in order to create links. # # URLMap dispatches in such a way that the longest paths are tried # first, since they are most specific. class URLMap def initialize(map = {}) remap(map) end def remap(map) @known_hosts = Set[] @mapping = map.map { |location, app| if location =~ %r{\Ahttps?://(.*?)(/.*)} host, location = $1, $2 @known_hosts << host else host = nil end unless location[0] == ?/ raise ArgumentError, "paths need to start with /" end location = location.chomp('/') match = Regexp.new("^#{Regexp.quote(location).gsub('/', '/+')}(.*)", nil, 'n') [host, location, match, app] }.sort_by do |(host, location, _, _)| [host ? -host.size : Float::INFINITY, -location.size] end end def call(env) path = env[PATH_INFO] script_name = env[SCRIPT_NAME] http_host = env[HTTP_HOST] server_name = env[SERVER_NAME] server_port = env[SERVER_PORT] is_same_server = casecmp?(http_host, server_name) || casecmp?(http_host, "#{server_name}:#{server_port}") is_host_known = @known_hosts.include? http_host @mapping.each do |host, location, match, app| unless casecmp?(http_host, host) \ || casecmp?(server_name, host) \ || (!host && is_same_server) \ || (!host && !is_host_known) # If we don't have a matching host, default to the first without a specified host next end next unless m = match.match(path.to_s) rest = m[1] next unless !rest || rest.empty? || rest[0] == ?/ env[SCRIPT_NAME] = (script_name + location) env[PATH_INFO] = rest return app.call(env) end [404, { CONTENT_TYPE => "text/plain", "X-Cascade" => "pass" }, ["Not Found: #{path}"]] ensure env[PATH_INFO] = path env[SCRIPT_NAME] = script_name end private def casecmp?(v1, v2) # if both nil, or they're the same string return true if v1 == v2 # if either are nil... (but they're not the same) return false if v1.nil? return false if v2.nil? # otherwise check they're not case-insensitive the same v1.casecmp(v2).zero? end end end PK!CXX+share/gems/gems/rack-2.2.4/lib/rack/file.rbnu[# frozen_string_literal: true require_relative 'files' module Rack File = Files end PK!š3share/gems/gems/rack-2.2.4/lib/rack/content_type.rbnu[# frozen_string_literal: true module Rack # Sets the Content-Type header on responses which don't have one. # # Builder Usage: # use Rack::ContentType, "text/plain" # # When no content type argument is provided, "text/html" is the # default. class ContentType include Rack::Utils def initialize(app, content_type = "text/html") @app, @content_type = app, content_type end def call(env) status, headers, body = @app.call(env) headers = Utils::HeaderHash[headers] unless STATUS_WITH_NO_ENTITY_BODY.key?(status.to_i) headers[CONTENT_TYPE] ||= @content_type end [status, headers, body] end end end PK!P91share/gems/gems/rack-2.2.4/lib/rack/body_proxy.rbnu[# frozen_string_literal: true module Rack # Proxy for response bodies allowing calling a block when # the response body is closed (after the response has been fully # sent to the client). class BodyProxy # Set the response body to wrap, and the block to call when the # response has been fully sent. def initialize(body, &block) @body = body @block = block @closed = false end # Return whether the wrapped body responds to the method. def respond_to_missing?(method_name, include_all = false) super or @body.respond_to?(method_name, include_all) end # If not already closed, close the wrapped body and # then call the block the proxy was initialized with. def close return if @closed @closed = true begin @body.close if @body.respond_to? :close ensure @block.call end end # Whether the proxy is closed. The proxy starts as not closed, # and becomes closed on the first call to close. def closed? @closed end # Delegate missing methods to the wrapped body. def method_missing(method_name, *args, &block) @body.__send__(method_name, *args, &block) end ruby2_keywords(:method_missing) if respond_to?(:ruby2_keywords, true) end end PK!i\-share/gems/gems/rack-2.2.4/lib/rack/config.rbnu[# frozen_string_literal: true module Rack # Rack::Config modifies the environment using the block given during # initialization. # # Example: # use Rack::Config do |env| # env['my-key'] = 'some-value' # end class Config def initialize(app, &block) @app = app @block = block end def call(env) @block.call(env) @app.call(env) end end end PK!󸐷1share/gems/gems/rack-2.2.4/lib/rack/media_type.rbnu[# frozen_string_literal: true module Rack # Rack::MediaType parse media type and parameters out of content_type string class MediaType SPLIT_PATTERN = %r{\s*[;,]\s*} class << self # The media type (type/subtype) portion of the CONTENT_TYPE header # without any media type parameters. e.g., when CONTENT_TYPE is # "text/plain;charset=utf-8", the media-type is "text/plain". # # For more information on the use of media types in HTTP, see: # http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7 def type(content_type) return nil unless content_type content_type.split(SPLIT_PATTERN, 2).first.tap &:downcase! end # The media type parameters provided in CONTENT_TYPE as a Hash, or # an empty Hash if no CONTENT_TYPE or media-type parameters were # provided. e.g., when the CONTENT_TYPE is "text/plain;charset=utf-8", # this method responds with the following Hash: # { 'charset' => 'utf-8' } def params(content_type) return {} if content_type.nil? content_type.split(SPLIT_PATTERN)[1..-1].each_with_object({}) do |s, hsh| k, v = s.split('=', 2) hsh[k.tap(&:downcase!)] = strip_doublequotes(v) end end private def strip_doublequotes(str) (str.start_with?('"') && str.end_with?('"')) ? str[1..-2] : str end end end end PK!ԍ.share/gems/gems/rack-2.2.4/lib/rack/lobster.rbnu[# frozen_string_literal: true require 'zlib' module Rack # Paste has a Pony, Rack has a Lobster! class Lobster LobsterString = Zlib::Inflate.inflate("eJx9kEEOwyAMBO99xd7MAcytUhPlJyj2 P6jy9i4k9EQyGAnBarEXeCBqSkntNXsi/ZCvC48zGQoZKikGrFMZvgS5ZHd+aGWVuWwhVF0 t1drVmiR42HcWNz5w3QanT+2gIvTVCiE1lm1Y0eU4JGmIIbaKwextKn8rvW+p5PIwFl8ZWJ I8jyiTlhTcYXkekJAzTyYN6E08A+dk8voBkAVTJQ==".delete("\n ").unpack("m*")[0]) LambdaLobster = lambda { |env| if env[QUERY_STRING].include?("flip") lobster = LobsterString.split("\n"). map { |line| line.ljust(42).reverse }. join("\n") href = "?" else lobster = LobsterString href = "?flip" end content = ["Lobstericious!", "
", lobster, "
", "flip!"] length = content.inject(0) { |a, e| a + e.size }.to_s [200, { CONTENT_TYPE => "text/html", CONTENT_LENGTH => length }, content] } def call(env) req = Request.new(env) if req.GET["flip"] == "left" lobster = LobsterString.split("\n").map do |line| line.ljust(42).reverse. gsub('\\', 'TEMP'). gsub('/', '\\'). gsub('TEMP', '/'). gsub('{', '}'). gsub('(', ')') end.join("\n") href = "?flip=right" elsif req.GET["flip"] == "crash" raise "Lobster crashed" else lobster = LobsterString href = "?flip=left" end res = Response.new res.write "Lobstericious!" res.write "
"
      res.write lobster
      res.write "
" res.write "

flip!

" res.write "

crash!

" res.finish end end end if $0 == __FILE__ # :nocov: require_relative '../rack' Rack::Server.start( app: Rack::ShowExceptions.new(Rack::Lint.new(Rack::Lobster.new)), Port: 9292 ) # :nocov: end PK! |+share/gems/gems/rack-2.2.4/lib/rack/lock.rbnu[# frozen_string_literal: true require 'thread' module Rack # Rack::Lock locks every request inside a mutex, so that every request # will effectively be executed synchronously. class Lock def initialize(app, mutex = Mutex.new) @app, @mutex = app, mutex end def call(env) @mutex.lock @env = env @old_rack_multithread = env[RACK_MULTITHREAD] begin response = @app.call(env.merge!(RACK_MULTITHREAD => false)) returned = response << BodyProxy.new(response.pop) { unlock } ensure unlock unless returned end end private def unlock @mutex.unlock @env[RACK_MULTITHREAD] = @old_rack_multithread end end end PK!?5share/gems/gems/rack-2.2.4/lib/rack/content_length.rbnu[# frozen_string_literal: true module Rack # Sets the Content-Length header on responses that do not specify # a Content-Length or Transfer-Encoding header. Note that this # does not fix responses that have an invalid Content-Length # header specified. class ContentLength include Rack::Utils def initialize(app) @app = app end def call(env) status, headers, body = @app.call(env) headers = HeaderHash[headers] if !STATUS_WITH_NO_ENTITY_BODY.key?(status.to_i) && !headers[CONTENT_LENGTH] && !headers[TRANSFER_ENCODING] obody = body body, length = [], 0 obody.each { |part| body << part; length += part.bytesize } body = BodyProxy.new(body) do obody.close if obody.respond_to?(:close) end headers[CONTENT_LENGTH] = length.to_s end [status, headers, body] end end end PK!h##/share/gems/gems/rack-2.2.4/lib/rack/response.rbnu[# frozen_string_literal: true require 'time' module Rack # Rack::Response provides a convenient interface to create a Rack # response. # # It allows setting of headers and cookies, and provides useful # defaults (an OK response with empty headers and body). # # You can use Response#write to iteratively generate your response, # but note that this is buffered by Rack::Response until you call # +finish+. +finish+ however can take a block inside which calls to # +write+ are synchronous with the Rack response. # # Your application's +call+ should end returning Response#finish. class Response def self.[](status, headers, body) self.new(body, status, headers) end CHUNKED = 'chunked' STATUS_WITH_NO_ENTITY_BODY = Utils::STATUS_WITH_NO_ENTITY_BODY attr_accessor :length, :status, :body attr_reader :headers # @deprecated Use {#headers} instead. alias header headers # Initialize the response object with the specified body, status # and headers. # # @param body [nil, #each, #to_str] the response body. # @param status [Integer] the integer status as defined by the # HTTP protocol RFCs. # @param headers [#each] a list of key-value header pairs which # conform to the HTTP protocol RFCs. # # Providing a body which responds to #to_str is legacy behaviour. def initialize(body = nil, status = 200, headers = {}) @status = status.to_i @headers = Utils::HeaderHash[headers] @writer = self.method(:append) @block = nil # Keep track of whether we have expanded the user supplied body. if body.nil? @body = [] @buffered = true @length = 0 elsif body.respond_to?(:to_str) @body = [body] @buffered = true @length = body.to_str.bytesize else @body = body @buffered = false @length = 0 end yield self if block_given? end def redirect(target, status = 302) self.status = status self.location = target end def chunked? CHUNKED == get_header(TRANSFER_ENCODING) end # Generate a response array consistent with the requirements of the SPEC. # @return [Array] a 3-tuple suitable of `[status, headers, body]` # which is suitable to be returned from the middleware `#call(env)` method. def finish(&block) if STATUS_WITH_NO_ENTITY_BODY[status.to_i] delete_header CONTENT_TYPE delete_header CONTENT_LENGTH close return [@status, @headers, []] else if block_given? @block = block return [@status, @headers, self] else return [@status, @headers, @body] end end end alias to_a finish # For *response def each(&callback) @body.each(&callback) @buffered = true if @block @writer = callback @block.call(self) end end # Append to body and update Content-Length. # # NOTE: Do not mix #write and direct #body access! # def write(chunk) buffered_body! @writer.call(chunk.to_s) end def close @body.close if @body.respond_to?(:close) end def empty? @block == nil && @body.empty? end def has_header?(key); headers.key? key; end def get_header(key); headers[key]; end def set_header(key, v); headers[key] = v; end def delete_header(key); headers.delete key; end alias :[] :get_header alias :[]= :set_header module Helpers def invalid?; status < 100 || status >= 600; end def informational?; status >= 100 && status < 200; end def successful?; status >= 200 && status < 300; end def redirection?; status >= 300 && status < 400; end def client_error?; status >= 400 && status < 500; end def server_error?; status >= 500 && status < 600; end def ok?; status == 200; end def created?; status == 201; end def accepted?; status == 202; end def no_content?; status == 204; end def moved_permanently?; status == 301; end def bad_request?; status == 400; end def unauthorized?; status == 401; end def forbidden?; status == 403; end def not_found?; status == 404; end def method_not_allowed?; status == 405; end def precondition_failed?; status == 412; end def unprocessable?; status == 422; end def redirect?; [301, 302, 303, 307, 308].include? status; end def include?(header) has_header? header end # Add a header that may have multiple values. # # Example: # response.add_header 'Vary', 'Accept-Encoding' # response.add_header 'Vary', 'Cookie' # # assert_equal 'Accept-Encoding,Cookie', response.get_header('Vary') # # http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2 def add_header(key, v) if v.nil? get_header key elsif has_header? key set_header key, "#{get_header key},#{v}" else set_header key, v end end # Get the content type of the response. def content_type get_header CONTENT_TYPE end # Set the content type of the response. def content_type=(content_type) set_header CONTENT_TYPE, content_type end def media_type MediaType.type(content_type) end def media_type_params MediaType.params(content_type) end def content_length cl = get_header CONTENT_LENGTH cl ? cl.to_i : cl end def location get_header "Location" end def location=(location) set_header "Location", location end def set_cookie(key, value) cookie_header = get_header SET_COOKIE set_header SET_COOKIE, ::Rack::Utils.add_cookie_to_header(cookie_header, key, value) end def delete_cookie(key, value = {}) set_header SET_COOKIE, ::Rack::Utils.add_remove_cookie_to_header(get_header(SET_COOKIE), key, value) end def set_cookie_header get_header SET_COOKIE end def set_cookie_header=(v) set_header SET_COOKIE, v end def cache_control get_header CACHE_CONTROL end def cache_control=(v) set_header CACHE_CONTROL, v end # Specifies that the content shouldn't be cached. Overrides `cache!` if already called. def do_not_cache! set_header CACHE_CONTROL, "no-cache, must-revalidate" set_header EXPIRES, Time.now.httpdate end # Specify that the content should be cached. # @param duration [Integer] The number of seconds until the cache expires. # @option directive [String] The cache control directive, one of "public", "private", "no-cache" or "no-store". def cache!(duration = 3600, directive: "public") unless headers[CACHE_CONTROL] =~ /no-cache/ set_header CACHE_CONTROL, "#{directive}, max-age=#{duration}" set_header EXPIRES, (Time.now + duration).httpdate end end def etag get_header ETAG end def etag=(v) set_header ETAG, v end protected def buffered_body! return if @buffered if @body.is_a?(Array) # The user supplied body was an array: @body = @body.compact @body.each do |part| @length += part.to_s.bytesize end else # Turn the user supplied body into a buffered array: body = @body @body = Array.new body.each do |part| @writer.call(part.to_s) end body.close if body.respond_to?(:close) end @buffered = true end def append(chunk) @body << chunk unless chunked? @length += chunk.bytesize set_header(CONTENT_LENGTH, @length.to_s) end return chunk end end include Helpers class Raw include Helpers attr_reader :headers attr_accessor :status def initialize(status, headers) @status = status @headers = headers end def has_header?(key); headers.key? key; end def get_header(key); headers[key]; end def set_header(key, v); headers[key] = v; end def delete_header(key); headers.delete key; end end end end PK! Տ+share/gems/gems/rack-2.2.4/lib/rack/mime.rbnu[# frozen_string_literal: true module Rack module Mime # Returns String with mime type if found, otherwise use +fallback+. # +ext+ should be filename extension in the '.ext' format that # File.extname(file) returns. # +fallback+ may be any object # # Also see the documentation for MIME_TYPES # # Usage: # Rack::Mime.mime_type('.foo') # # This is a shortcut for: # Rack::Mime::MIME_TYPES.fetch('.foo', 'application/octet-stream') def mime_type(ext, fallback = 'application/octet-stream') MIME_TYPES.fetch(ext.to_s.downcase, fallback) end module_function :mime_type # Returns true if the given value is a mime match for the given mime match # specification, false otherwise. # # Rack::Mime.match?('text/html', 'text/*') => true # Rack::Mime.match?('text/plain', '*') => true # Rack::Mime.match?('text/html', 'application/json') => false def match?(value, matcher) v1, v2 = value.split('/', 2) m1, m2 = matcher.split('/', 2) (m1 == '*' || v1 == m1) && (m2.nil? || m2 == '*' || m2 == v2) end module_function :match? # List of most common mime-types, selected various sources # according to their usefulness in a webserving scope for Ruby # users. # # To amend this list with your local mime.types list you can use: # # require 'webrick/httputils' # list = WEBrick::HTTPUtils.load_mime_types('/etc/mime.types') # Rack::Mime::MIME_TYPES.merge!(list) # # N.B. On Ubuntu the mime.types file does not include the leading period, so # users may need to modify the data before merging into the hash. MIME_TYPES = { ".123" => "application/vnd.lotus-1-2-3", ".3dml" => "text/vnd.in3d.3dml", ".3g2" => "video/3gpp2", ".3gp" => "video/3gpp", ".a" => "application/octet-stream", ".acc" => "application/vnd.americandynamics.acc", ".ace" => "application/x-ace-compressed", ".acu" => "application/vnd.acucobol", ".aep" => "application/vnd.audiograph", ".afp" => "application/vnd.ibm.modcap", ".ai" => "application/postscript", ".aif" => "audio/x-aiff", ".aiff" => "audio/x-aiff", ".ami" => "application/vnd.amiga.ami", ".appcache" => "text/cache-manifest", ".apr" => "application/vnd.lotus-approach", ".asc" => "application/pgp-signature", ".asf" => "video/x-ms-asf", ".asm" => "text/x-asm", ".aso" => "application/vnd.accpac.simply.aso", ".asx" => "video/x-ms-asf", ".atc" => "application/vnd.acucorp", ".atom" => "application/atom+xml", ".atomcat" => "application/atomcat+xml", ".atomsvc" => "application/atomsvc+xml", ".atx" => "application/vnd.antix.game-component", ".au" => "audio/basic", ".avi" => "video/x-msvideo", ".bat" => "application/x-msdownload", ".bcpio" => "application/x-bcpio", ".bdm" => "application/vnd.syncml.dm+wbxml", ".bh2" => "application/vnd.fujitsu.oasysprs", ".bin" => "application/octet-stream", ".bmi" => "application/vnd.bmi", ".bmp" => "image/bmp", ".box" => "application/vnd.previewsystems.box", ".btif" => "image/prs.btif", ".bz" => "application/x-bzip", ".bz2" => "application/x-bzip2", ".c" => "text/x-c", ".c4g" => "application/vnd.clonk.c4group", ".cab" => "application/vnd.ms-cab-compressed", ".cc" => "text/x-c", ".ccxml" => "application/ccxml+xml", ".cdbcmsg" => "application/vnd.contact.cmsg", ".cdkey" => "application/vnd.mediastation.cdkey", ".cdx" => "chemical/x-cdx", ".cdxml" => "application/vnd.chemdraw+xml", ".cdy" => "application/vnd.cinderella", ".cer" => "application/pkix-cert", ".cgm" => "image/cgm", ".chat" => "application/x-chat", ".chm" => "application/vnd.ms-htmlhelp", ".chrt" => "application/vnd.kde.kchart", ".cif" => "chemical/x-cif", ".cii" => "application/vnd.anser-web-certificate-issue-initiation", ".cil" => "application/vnd.ms-artgalry", ".cla" => "application/vnd.claymore", ".class" => "application/octet-stream", ".clkk" => "application/vnd.crick.clicker.keyboard", ".clkp" => "application/vnd.crick.clicker.palette", ".clkt" => "application/vnd.crick.clicker.template", ".clkw" => "application/vnd.crick.clicker.wordbank", ".clkx" => "application/vnd.crick.clicker", ".clp" => "application/x-msclip", ".cmc" => "application/vnd.cosmocaller", ".cmdf" => "chemical/x-cmdf", ".cml" => "chemical/x-cml", ".cmp" => "application/vnd.yellowriver-custom-menu", ".cmx" => "image/x-cmx", ".com" => "application/x-msdownload", ".conf" => "text/plain", ".cpio" => "application/x-cpio", ".cpp" => "text/x-c", ".cpt" => "application/mac-compactpro", ".crd" => "application/x-mscardfile", ".crl" => "application/pkix-crl", ".crt" => "application/x-x509-ca-cert", ".csh" => "application/x-csh", ".csml" => "chemical/x-csml", ".csp" => "application/vnd.commonspace", ".css" => "text/css", ".csv" => "text/csv", ".curl" => "application/vnd.curl", ".cww" => "application/prs.cww", ".cxx" => "text/x-c", ".daf" => "application/vnd.mobius.daf", ".davmount" => "application/davmount+xml", ".dcr" => "application/x-director", ".dd2" => "application/vnd.oma.dd2+xml", ".ddd" => "application/vnd.fujixerox.ddd", ".deb" => "application/x-debian-package", ".der" => "application/x-x509-ca-cert", ".dfac" => "application/vnd.dreamfactory", ".diff" => "text/x-diff", ".dis" => "application/vnd.mobius.dis", ".djv" => "image/vnd.djvu", ".djvu" => "image/vnd.djvu", ".dll" => "application/x-msdownload", ".dmg" => "application/octet-stream", ".dna" => "application/vnd.dna", ".doc" => "application/msword", ".docm" => "application/vnd.ms-word.document.macroEnabled.12", ".docx" => "application/vnd.openxmlformats-officedocument.wordprocessingml.document", ".dot" => "application/msword", ".dotm" => "application/vnd.ms-word.template.macroEnabled.12", ".dotx" => "application/vnd.openxmlformats-officedocument.wordprocessingml.template", ".dp" => "application/vnd.osgi.dp", ".dpg" => "application/vnd.dpgraph", ".dsc" => "text/prs.lines.tag", ".dtd" => "application/xml-dtd", ".dts" => "audio/vnd.dts", ".dtshd" => "audio/vnd.dts.hd", ".dv" => "video/x-dv", ".dvi" => "application/x-dvi", ".dwf" => "model/vnd.dwf", ".dwg" => "image/vnd.dwg", ".dxf" => "image/vnd.dxf", ".dxp" => "application/vnd.spotfire.dxp", ".ear" => "application/java-archive", ".ecelp4800" => "audio/vnd.nuera.ecelp4800", ".ecelp7470" => "audio/vnd.nuera.ecelp7470", ".ecelp9600" => "audio/vnd.nuera.ecelp9600", ".ecma" => "application/ecmascript", ".edm" => "application/vnd.novadigm.edm", ".edx" => "application/vnd.novadigm.edx", ".efif" => "application/vnd.picsel", ".ei6" => "application/vnd.pg.osasli", ".eml" => "message/rfc822", ".eol" => "audio/vnd.digital-winds", ".eot" => "application/vnd.ms-fontobject", ".eps" => "application/postscript", ".es3" => "application/vnd.eszigno3+xml", ".esf" => "application/vnd.epson.esf", ".etx" => "text/x-setext", ".exe" => "application/x-msdownload", ".ext" => "application/vnd.novadigm.ext", ".ez" => "application/andrew-inset", ".ez2" => "application/vnd.ezpix-album", ".ez3" => "application/vnd.ezpix-package", ".f" => "text/x-fortran", ".f77" => "text/x-fortran", ".f90" => "text/x-fortran", ".fbs" => "image/vnd.fastbidsheet", ".fdf" => "application/vnd.fdf", ".fe_launch" => "application/vnd.denovo.fcselayout-link", ".fg5" => "application/vnd.fujitsu.oasysgp", ".fli" => "video/x-fli", ".flo" => "application/vnd.micrografx.flo", ".flv" => "video/x-flv", ".flw" => "application/vnd.kde.kivio", ".flx" => "text/vnd.fmi.flexstor", ".fly" => "text/vnd.fly", ".fm" => "application/vnd.framemaker", ".fnc" => "application/vnd.frogans.fnc", ".for" => "text/x-fortran", ".fpx" => "image/vnd.fpx", ".fsc" => "application/vnd.fsc.weblaunch", ".fst" => "image/vnd.fst", ".ftc" => "application/vnd.fluxtime.clip", ".fti" => "application/vnd.anser-web-funds-transfer-initiation", ".fvt" => "video/vnd.fvt", ".fzs" => "application/vnd.fuzzysheet", ".g3" => "image/g3fax", ".gac" => "application/vnd.groove-account", ".gdl" => "model/vnd.gdl", ".gem" => "application/octet-stream", ".gemspec" => "text/x-script.ruby", ".ghf" => "application/vnd.groove-help", ".gif" => "image/gif", ".gim" => "application/vnd.groove-identity-message", ".gmx" => "application/vnd.gmx", ".gph" => "application/vnd.flographit", ".gqf" => "application/vnd.grafeq", ".gram" => "application/srgs", ".grv" => "application/vnd.groove-injector", ".grxml" => "application/srgs+xml", ".gtar" => "application/x-gtar", ".gtm" => "application/vnd.groove-tool-message", ".gtw" => "model/vnd.gtw", ".gv" => "text/vnd.graphviz", ".gz" => "application/x-gzip", ".h" => "text/x-c", ".h261" => "video/h261", ".h263" => "video/h263", ".h264" => "video/h264", ".hbci" => "application/vnd.hbci", ".hdf" => "application/x-hdf", ".hh" => "text/x-c", ".hlp" => "application/winhlp", ".hpgl" => "application/vnd.hp-hpgl", ".hpid" => "application/vnd.hp-hpid", ".hps" => "application/vnd.hp-hps", ".hqx" => "application/mac-binhex40", ".htc" => "text/x-component", ".htke" => "application/vnd.kenameaapp", ".htm" => "text/html", ".html" => "text/html", ".hvd" => "application/vnd.yamaha.hv-dic", ".hvp" => "application/vnd.yamaha.hv-voice", ".hvs" => "application/vnd.yamaha.hv-script", ".icc" => "application/vnd.iccprofile", ".ice" => "x-conference/x-cooltalk", ".ico" => "image/vnd.microsoft.icon", ".ics" => "text/calendar", ".ief" => "image/ief", ".ifb" => "text/calendar", ".ifm" => "application/vnd.shana.informed.formdata", ".igl" => "application/vnd.igloader", ".igs" => "model/iges", ".igx" => "application/vnd.micrografx.igx", ".iif" => "application/vnd.shana.informed.interchange", ".imp" => "application/vnd.accpac.simply.imp", ".ims" => "application/vnd.ms-ims", ".ipk" => "application/vnd.shana.informed.package", ".irm" => "application/vnd.ibm.rights-management", ".irp" => "application/vnd.irepository.package+xml", ".iso" => "application/octet-stream", ".itp" => "application/vnd.shana.informed.formtemplate", ".ivp" => "application/vnd.immervision-ivp", ".ivu" => "application/vnd.immervision-ivu", ".jad" => "text/vnd.sun.j2me.app-descriptor", ".jam" => "application/vnd.jam", ".jar" => "application/java-archive", ".java" => "text/x-java-source", ".jisp" => "application/vnd.jisp", ".jlt" => "application/vnd.hp-jlyt", ".jnlp" => "application/x-java-jnlp-file", ".joda" => "application/vnd.joost.joda-archive", ".jp2" => "image/jp2", ".jpeg" => "image/jpeg", ".jpg" => "image/jpeg", ".jpgv" => "video/jpeg", ".jpm" => "video/jpm", ".js" => "application/javascript", ".json" => "application/json", ".karbon" => "application/vnd.kde.karbon", ".kfo" => "application/vnd.kde.kformula", ".kia" => "application/vnd.kidspiration", ".kml" => "application/vnd.google-earth.kml+xml", ".kmz" => "application/vnd.google-earth.kmz", ".kne" => "application/vnd.kinar", ".kon" => "application/vnd.kde.kontour", ".kpr" => "application/vnd.kde.kpresenter", ".ksp" => "application/vnd.kde.kspread", ".ktz" => "application/vnd.kahootz", ".kwd" => "application/vnd.kde.kword", ".latex" => "application/x-latex", ".lbd" => "application/vnd.llamagraphics.life-balance.desktop", ".lbe" => "application/vnd.llamagraphics.life-balance.exchange+xml", ".les" => "application/vnd.hhe.lesson-player", ".link66" => "application/vnd.route66.link66+xml", ".log" => "text/plain", ".lostxml" => "application/lost+xml", ".lrm" => "application/vnd.ms-lrm", ".ltf" => "application/vnd.frogans.ltf", ".lvp" => "audio/vnd.lucent.voice", ".lwp" => "application/vnd.lotus-wordpro", ".m3u" => "audio/x-mpegurl", ".m3u8" => "application/x-mpegurl", ".m4a" => "audio/mp4a-latm", ".m4v" => "video/mp4", ".ma" => "application/mathematica", ".mag" => "application/vnd.ecowin.chart", ".man" => "text/troff", ".manifest" => "text/cache-manifest", ".mathml" => "application/mathml+xml", ".mbk" => "application/vnd.mobius.mbk", ".mbox" => "application/mbox", ".mc1" => "application/vnd.medcalcdata", ".mcd" => "application/vnd.mcd", ".mdb" => "application/x-msaccess", ".mdi" => "image/vnd.ms-modi", ".mdoc" => "text/troff", ".me" => "text/troff", ".mfm" => "application/vnd.mfmp", ".mgz" => "application/vnd.proteus.magazine", ".mid" => "audio/midi", ".midi" => "audio/midi", ".mif" => "application/vnd.mif", ".mime" => "message/rfc822", ".mj2" => "video/mj2", ".mlp" => "application/vnd.dolby.mlp", ".mmd" => "application/vnd.chipnuts.karaoke-mmd", ".mmf" => "application/vnd.smaf", ".mml" => "application/mathml+xml", ".mmr" => "image/vnd.fujixerox.edmics-mmr", ".mng" => "video/x-mng", ".mny" => "application/x-msmoney", ".mov" => "video/quicktime", ".movie" => "video/x-sgi-movie", ".mp3" => "audio/mpeg", ".mp4" => "video/mp4", ".mp4a" => "audio/mp4", ".mp4s" => "application/mp4", ".mp4v" => "video/mp4", ".mpc" => "application/vnd.mophun.certificate", ".mpd" => "application/dash+xml", ".mpeg" => "video/mpeg", ".mpg" => "video/mpeg", ".mpga" => "audio/mpeg", ".mpkg" => "application/vnd.apple.installer+xml", ".mpm" => "application/vnd.blueice.multipass", ".mpn" => "application/vnd.mophun.application", ".mpp" => "application/vnd.ms-project", ".mpy" => "application/vnd.ibm.minipay", ".mqy" => "application/vnd.mobius.mqy", ".mrc" => "application/marc", ".ms" => "text/troff", ".mscml" => "application/mediaservercontrol+xml", ".mseq" => "application/vnd.mseq", ".msf" => "application/vnd.epson.msf", ".msh" => "model/mesh", ".msi" => "application/x-msdownload", ".msl" => "application/vnd.mobius.msl", ".msty" => "application/vnd.muvee.style", ".mts" => "model/vnd.mts", ".mus" => "application/vnd.musician", ".mvb" => "application/x-msmediaview", ".mwf" => "application/vnd.mfer", ".mxf" => "application/mxf", ".mxl" => "application/vnd.recordare.musicxml", ".mxml" => "application/xv+xml", ".mxs" => "application/vnd.triscape.mxs", ".mxu" => "video/vnd.mpegurl", ".n" => "application/vnd.nokia.n-gage.symbian.install", ".nc" => "application/x-netcdf", ".ngdat" => "application/vnd.nokia.n-gage.data", ".nlu" => "application/vnd.neurolanguage.nlu", ".nml" => "application/vnd.enliven", ".nnd" => "application/vnd.noblenet-directory", ".nns" => "application/vnd.noblenet-sealer", ".nnw" => "application/vnd.noblenet-web", ".npx" => "image/vnd.net-fpx", ".nsf" => "application/vnd.lotus-notes", ".oa2" => "application/vnd.fujitsu.oasys2", ".oa3" => "application/vnd.fujitsu.oasys3", ".oas" => "application/vnd.fujitsu.oasys", ".obd" => "application/x-msbinder", ".oda" => "application/oda", ".odc" => "application/vnd.oasis.opendocument.chart", ".odf" => "application/vnd.oasis.opendocument.formula", ".odg" => "application/vnd.oasis.opendocument.graphics", ".odi" => "application/vnd.oasis.opendocument.image", ".odp" => "application/vnd.oasis.opendocument.presentation", ".ods" => "application/vnd.oasis.opendocument.spreadsheet", ".odt" => "application/vnd.oasis.opendocument.text", ".oga" => "audio/ogg", ".ogg" => "application/ogg", ".ogv" => "video/ogg", ".ogx" => "application/ogg", ".org" => "application/vnd.lotus-organizer", ".otc" => "application/vnd.oasis.opendocument.chart-template", ".otf" => "application/vnd.oasis.opendocument.formula-template", ".otg" => "application/vnd.oasis.opendocument.graphics-template", ".oth" => "application/vnd.oasis.opendocument.text-web", ".oti" => "application/vnd.oasis.opendocument.image-template", ".otm" => "application/vnd.oasis.opendocument.text-master", ".ots" => "application/vnd.oasis.opendocument.spreadsheet-template", ".ott" => "application/vnd.oasis.opendocument.text-template", ".oxt" => "application/vnd.openofficeorg.extension", ".p" => "text/x-pascal", ".p10" => "application/pkcs10", ".p12" => "application/x-pkcs12", ".p7b" => "application/x-pkcs7-certificates", ".p7m" => "application/pkcs7-mime", ".p7r" => "application/x-pkcs7-certreqresp", ".p7s" => "application/pkcs7-signature", ".pas" => "text/x-pascal", ".pbd" => "application/vnd.powerbuilder6", ".pbm" => "image/x-portable-bitmap", ".pcl" => "application/vnd.hp-pcl", ".pclxl" => "application/vnd.hp-pclxl", ".pcx" => "image/x-pcx", ".pdb" => "chemical/x-pdb", ".pdf" => "application/pdf", ".pem" => "application/x-x509-ca-cert", ".pfr" => "application/font-tdpfr", ".pgm" => "image/x-portable-graymap", ".pgn" => "application/x-chess-pgn", ".pgp" => "application/pgp-encrypted", ".pic" => "image/x-pict", ".pict" => "image/pict", ".pkg" => "application/octet-stream", ".pki" => "application/pkixcmp", ".pkipath" => "application/pkix-pkipath", ".pl" => "text/x-script.perl", ".plb" => "application/vnd.3gpp.pic-bw-large", ".plc" => "application/vnd.mobius.plc", ".plf" => "application/vnd.pocketlearn", ".pls" => "application/pls+xml", ".pm" => "text/x-script.perl-module", ".pml" => "application/vnd.ctc-posml", ".png" => "image/png", ".pnm" => "image/x-portable-anymap", ".pntg" => "image/x-macpaint", ".portpkg" => "application/vnd.macports.portpkg", ".pot" => "application/vnd.ms-powerpoint", ".potm" => "application/vnd.ms-powerpoint.template.macroEnabled.12", ".potx" => "application/vnd.openxmlformats-officedocument.presentationml.template", ".ppa" => "application/vnd.ms-powerpoint", ".ppam" => "application/vnd.ms-powerpoint.addin.macroEnabled.12", ".ppd" => "application/vnd.cups-ppd", ".ppm" => "image/x-portable-pixmap", ".pps" => "application/vnd.ms-powerpoint", ".ppsm" => "application/vnd.ms-powerpoint.slideshow.macroEnabled.12", ".ppsx" => "application/vnd.openxmlformats-officedocument.presentationml.slideshow", ".ppt" => "application/vnd.ms-powerpoint", ".pptm" => "application/vnd.ms-powerpoint.presentation.macroEnabled.12", ".pptx" => "application/vnd.openxmlformats-officedocument.presentationml.presentation", ".prc" => "application/vnd.palm", ".pre" => "application/vnd.lotus-freelance", ".prf" => "application/pics-rules", ".ps" => "application/postscript", ".psb" => "application/vnd.3gpp.pic-bw-small", ".psd" => "image/vnd.adobe.photoshop", ".ptid" => "application/vnd.pvi.ptid1", ".pub" => "application/x-mspublisher", ".pvb" => "application/vnd.3gpp.pic-bw-var", ".pwn" => "application/vnd.3m.post-it-notes", ".py" => "text/x-script.python", ".pya" => "audio/vnd.ms-playready.media.pya", ".pyv" => "video/vnd.ms-playready.media.pyv", ".qam" => "application/vnd.epson.quickanime", ".qbo" => "application/vnd.intu.qbo", ".qfx" => "application/vnd.intu.qfx", ".qps" => "application/vnd.publishare-delta-tree", ".qt" => "video/quicktime", ".qtif" => "image/x-quicktime", ".qxd" => "application/vnd.quark.quarkxpress", ".ra" => "audio/x-pn-realaudio", ".rake" => "text/x-script.ruby", ".ram" => "audio/x-pn-realaudio", ".rar" => "application/x-rar-compressed", ".ras" => "image/x-cmu-raster", ".rb" => "text/x-script.ruby", ".rcprofile" => "application/vnd.ipunplugged.rcprofile", ".rdf" => "application/rdf+xml", ".rdz" => "application/vnd.data-vision.rdz", ".rep" => "application/vnd.businessobjects", ".rgb" => "image/x-rgb", ".rif" => "application/reginfo+xml", ".rl" => "application/resource-lists+xml", ".rlc" => "image/vnd.fujixerox.edmics-rlc", ".rld" => "application/resource-lists-diff+xml", ".rm" => "application/vnd.rn-realmedia", ".rmp" => "audio/x-pn-realaudio-plugin", ".rms" => "application/vnd.jcp.javame.midlet-rms", ".rnc" => "application/relax-ng-compact-syntax", ".roff" => "text/troff", ".rpm" => "application/x-redhat-package-manager", ".rpss" => "application/vnd.nokia.radio-presets", ".rpst" => "application/vnd.nokia.radio-preset", ".rq" => "application/sparql-query", ".rs" => "application/rls-services+xml", ".rsd" => "application/rsd+xml", ".rss" => "application/rss+xml", ".rtf" => "application/rtf", ".rtx" => "text/richtext", ".ru" => "text/x-script.ruby", ".s" => "text/x-asm", ".saf" => "application/vnd.yamaha.smaf-audio", ".sbml" => "application/sbml+xml", ".sc" => "application/vnd.ibm.secure-container", ".scd" => "application/x-msschedule", ".scm" => "application/vnd.lotus-screencam", ".scq" => "application/scvp-cv-request", ".scs" => "application/scvp-cv-response", ".sdkm" => "application/vnd.solent.sdkm+xml", ".sdp" => "application/sdp", ".see" => "application/vnd.seemail", ".sema" => "application/vnd.sema", ".semd" => "application/vnd.semd", ".semf" => "application/vnd.semf", ".setpay" => "application/set-payment-initiation", ".setreg" => "application/set-registration-initiation", ".sfd" => "application/vnd.hydrostatix.sof-data", ".sfs" => "application/vnd.spotfire.sfs", ".sgm" => "text/sgml", ".sgml" => "text/sgml", ".sh" => "application/x-sh", ".shar" => "application/x-shar", ".shf" => "application/shf+xml", ".sig" => "application/pgp-signature", ".sit" => "application/x-stuffit", ".sitx" => "application/x-stuffitx", ".skp" => "application/vnd.koan", ".slt" => "application/vnd.epson.salt", ".smi" => "application/smil+xml", ".snd" => "audio/basic", ".so" => "application/octet-stream", ".spf" => "application/vnd.yamaha.smaf-phrase", ".spl" => "application/x-futuresplash", ".spot" => "text/vnd.in3d.spot", ".spp" => "application/scvp-vp-response", ".spq" => "application/scvp-vp-request", ".src" => "application/x-wais-source", ".srt" => "text/srt", ".srx" => "application/sparql-results+xml", ".sse" => "application/vnd.kodak-descriptor", ".ssf" => "application/vnd.epson.ssf", ".ssml" => "application/ssml+xml", ".stf" => "application/vnd.wt.stf", ".stk" => "application/hyperstudio", ".str" => "application/vnd.pg.format", ".sus" => "application/vnd.sus-calendar", ".sv4cpio" => "application/x-sv4cpio", ".sv4crc" => "application/x-sv4crc", ".svd" => "application/vnd.svd", ".svg" => "image/svg+xml", ".svgz" => "image/svg+xml", ".swf" => "application/x-shockwave-flash", ".swi" => "application/vnd.arastra.swi", ".t" => "text/troff", ".tao" => "application/vnd.tao.intent-module-archive", ".tar" => "application/x-tar", ".tbz" => "application/x-bzip-compressed-tar", ".tcap" => "application/vnd.3gpp2.tcap", ".tcl" => "application/x-tcl", ".tex" => "application/x-tex", ".texi" => "application/x-texinfo", ".texinfo" => "application/x-texinfo", ".text" => "text/plain", ".tif" => "image/tiff", ".tiff" => "image/tiff", ".tmo" => "application/vnd.tmobile-livetv", ".torrent" => "application/x-bittorrent", ".tpl" => "application/vnd.groove-tool-template", ".tpt" => "application/vnd.trid.tpt", ".tr" => "text/troff", ".tra" => "application/vnd.trueapp", ".trm" => "application/x-msterminal", ".ts" => "video/mp2t", ".tsv" => "text/tab-separated-values", ".ttf" => "application/octet-stream", ".twd" => "application/vnd.simtech-mindmapper", ".txd" => "application/vnd.genomatix.tuxedo", ".txf" => "application/vnd.mobius.txf", ".txt" => "text/plain", ".ufd" => "application/vnd.ufdl", ".umj" => "application/vnd.umajin", ".unityweb" => "application/vnd.unity", ".uoml" => "application/vnd.uoml+xml", ".uri" => "text/uri-list", ".ustar" => "application/x-ustar", ".utz" => "application/vnd.uiq.theme", ".uu" => "text/x-uuencode", ".vcd" => "application/x-cdlink", ".vcf" => "text/x-vcard", ".vcg" => "application/vnd.groove-vcard", ".vcs" => "text/x-vcalendar", ".vcx" => "application/vnd.vcx", ".vis" => "application/vnd.visionary", ".viv" => "video/vnd.vivo", ".vrml" => "model/vrml", ".vsd" => "application/vnd.visio", ".vsf" => "application/vnd.vsf", ".vtt" => "text/vtt", ".vtu" => "model/vnd.vtu", ".vxml" => "application/voicexml+xml", ".war" => "application/java-archive", ".wasm" => "application/wasm", ".wav" => "audio/x-wav", ".wax" => "audio/x-ms-wax", ".wbmp" => "image/vnd.wap.wbmp", ".wbs" => "application/vnd.criticaltools.wbs+xml", ".wbxml" => "application/vnd.wap.wbxml", ".webm" => "video/webm", ".wm" => "video/x-ms-wm", ".wma" => "audio/x-ms-wma", ".wmd" => "application/x-ms-wmd", ".wmf" => "application/x-msmetafile", ".wml" => "text/vnd.wap.wml", ".wmlc" => "application/vnd.wap.wmlc", ".wmls" => "text/vnd.wap.wmlscript", ".wmlsc" => "application/vnd.wap.wmlscriptc", ".wmv" => "video/x-ms-wmv", ".wmx" => "video/x-ms-wmx", ".wmz" => "application/x-ms-wmz", ".woff" => "application/font-woff", ".woff2" => "application/font-woff2", ".wpd" => "application/vnd.wordperfect", ".wpl" => "application/vnd.ms-wpl", ".wps" => "application/vnd.ms-works", ".wqd" => "application/vnd.wqd", ".wri" => "application/x-mswrite", ".wrl" => "model/vrml", ".wsdl" => "application/wsdl+xml", ".wspolicy" => "application/wspolicy+xml", ".wtb" => "application/vnd.webturbo", ".wvx" => "video/x-ms-wvx", ".x3d" => "application/vnd.hzn-3d-crossword", ".xar" => "application/vnd.xara", ".xbd" => "application/vnd.fujixerox.docuworks.binder", ".xbm" => "image/x-xbitmap", ".xdm" => "application/vnd.syncml.dm+xml", ".xdp" => "application/vnd.adobe.xdp+xml", ".xdw" => "application/vnd.fujixerox.docuworks", ".xenc" => "application/xenc+xml", ".xer" => "application/patch-ops-error+xml", ".xfdf" => "application/vnd.adobe.xfdf", ".xfdl" => "application/vnd.xfdl", ".xhtml" => "application/xhtml+xml", ".xif" => "image/vnd.xiff", ".xla" => "application/vnd.ms-excel", ".xlam" => "application/vnd.ms-excel.addin.macroEnabled.12", ".xls" => "application/vnd.ms-excel", ".xlsb" => "application/vnd.ms-excel.sheet.binary.macroEnabled.12", ".xlsx" => "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", ".xlsm" => "application/vnd.ms-excel.sheet.macroEnabled.12", ".xlt" => "application/vnd.ms-excel", ".xltx" => "application/vnd.openxmlformats-officedocument.spreadsheetml.template", ".xml" => "application/xml", ".xo" => "application/vnd.olpc-sugar", ".xop" => "application/xop+xml", ".xpm" => "image/x-xpixmap", ".xpr" => "application/vnd.is-xpr", ".xps" => "application/vnd.ms-xpsdocument", ".xpw" => "application/vnd.intercon.formnet", ".xsl" => "application/xml", ".xslt" => "application/xslt+xml", ".xsm" => "application/vnd.syncml+xml", ".xspf" => "application/xspf+xml", ".xul" => "application/vnd.mozilla.xul+xml", ".xwd" => "image/x-xwindowdump", ".xyz" => "chemical/x-xyz", ".yaml" => "text/yaml", ".yml" => "text/yaml", ".zaz" => "application/vnd.zzazz.deck+xml", ".zip" => "application/zip", ".zmm" => "application/vnd.handheld-entertainment+xml", } end end PK!gmD #share/gems/gems/rack-2.2.4/Rakefilenu[# frozen_string_literal: true require "bundler/gem_tasks" require "rake/testtask" desc "Run all the tests" task default: :test desc "Install gem dependencies" task :deps do require 'rubygems' spec = Gem::Specification.load('rack.gemspec') spec.dependencies.each do |dep| reqs = dep.requirements_list reqs = (["-v"] * reqs.size).zip(reqs).flatten # Use system over sh, because we want to ignore errors! system Gem.ruby, "-S", "gem", "install", '--conservative', dep.name, *reqs end end desc "Make an archive as .tar.gz" task dist: %w[chmod changelog spec rdoc] do sh "git archive --format=tar --prefix=#{release}/ HEAD^{tree} >#{release}.tar" sh "pax -waf #{release}.tar -s ':^:#{release}/:' SPEC.rdoc ChangeLog doc rack.gemspec" sh "gzip -f -9 #{release}.tar" end desc "Make an official release" task :officialrelease do puts "Official build for #{release}..." sh "rm -rf stage" sh "git clone --shared . stage" sh "cd stage && rake officialrelease_really" sh "mv stage/#{release}.tar.gz stage/#{release}.gem ." end task officialrelease_really: %w[spec dist gem] do sh "shasum #{release}.tar.gz #{release}.gem" end def release "rack-" + File.read('lib/rack/version.rb')[/RELEASE += +([\"\'])([\d][\w\.]+)\1/, 2] end desc "Make binaries executable" task :chmod do Dir["bin/*"].each { |binary| File.chmod(0755, binary) } Dir["test/cgi/test*"].each { |binary| File.chmod(0755, binary) } end desc "Generate a ChangeLog" task changelog: "ChangeLog" file '.git/index' file "ChangeLog" => '.git/index' do File.open("ChangeLog", "w") { |out| log = `git log -z` log.force_encoding(Encoding::BINARY) log.split("\0").map { |chunk| author = chunk[/Author: (.*)/, 1].strip date = chunk[/Date: (.*)/, 1].strip desc, detail = $'.strip.split("\n", 2) detail ||= "" detail = detail.gsub(/.*darcs-hash:.*/, '') detail.rstrip! out.puts "#{date} #{author}" out.puts " * #{desc.strip}" out.puts detail unless detail.empty? out.puts } } end desc "Generate Rack Specification" task spec: "SPEC.rdoc" file 'lib/rack/lint.rb' file "SPEC.rdoc" => 'lib/rack/lint.rb' do File.open("SPEC.rdoc", "wb") { |file| IO.foreach("lib/rack/lint.rb") { |line| if line =~ /^\s*## ?(.*)/ file.puts $1 end } } end Rake::TestTask.new("test:regular") do |t| t.libs << "test" t.test_files = FileList["test/**/*_test.rb", "test/**/spec_*.rb", "test/gemloader.rb"] t.warning = false t.verbose = true end desc "Run tests with coverage" task "test_cov" do ENV['COVERAGE'] = '1' Rake::Task['test:regular'].invoke end desc "Run all the fast + platform agnostic tests" task test: %w[spec test:regular] desc "Run all the tests we run on CI" task ci: :test task gem: :spec do sh "gem build rack.gemspec" end task doc: :rdoc desc "Generate RDoc documentation" task rdoc: %w[changelog spec] do sh(*%w{rdoc --line-numbers --main README.rdoc --title 'Rack\ Documentation' --charset utf-8 -U -o doc} + %w{README.rdoc KNOWN-ISSUES SPEC.rdoc ChangeLog} + `git ls-files lib/\*\*/\*.rb`.strip.split) cp "contrib/rdoc.css", "doc/rdoc.css" end task pushdoc: :rdoc do sh "rsync -avz doc/ rack.rubyforge.org:/var/www/gforge-projects/rack/doc/" end task pushsite: :pushdoc do sh "cd site && git gc" sh "rsync -avz site/ rack.rubyforge.org:/var/www/gforge-projects/rack/" sh "cd site && git push" end PK!88$share/gems/gems/rack-2.2.4/SPEC.rdocnu[This specification aims to formalize the Rack protocol. You can (and should) use Rack::Lint to enforce it. When you develop middleware, be sure to add a Lint before and after to catch all mistakes. = Rack applications A Rack application is a Ruby object (not a class) that responds to +call+. It takes exactly one argument, the *environment* and returns an Array of exactly three values: The *status*, the *headers*, and the *body*. == The Environment The environment must be an unfrozen instance of Hash that includes CGI-like headers. The application is free to modify the environment. The environment is required to include these variables (adopted from PEP333), except when they'd be empty, but see below. REQUEST_METHOD:: The HTTP request method, such as "GET" or "POST". This cannot ever be an empty string, and so is always required. SCRIPT_NAME:: The initial portion of the request URL's "path" that corresponds to the application object, so that the application knows its virtual "location". This may be an empty string, if the application corresponds to the "root" of the server. PATH_INFO:: The remainder of the request URL's "path", designating the virtual "location" of the request's target within the application. This may be an empty string, if the request URL targets the application root and does not have a trailing slash. This value may be percent-encoded when originating from a URL. QUERY_STRING:: The portion of the request URL that follows the ?, if any. May be empty, but is always required! SERVER_NAME, SERVER_PORT:: When combined with SCRIPT_NAME and PATH_INFO, these variables can be used to complete the URL. Note, however, that HTTP_HOST, if present, should be used in preference to SERVER_NAME for reconstructing the request URL. SERVER_NAME and SERVER_PORT can never be empty strings, and so are always required. HTTP_ Variables:: Variables corresponding to the client-supplied HTTP request headers (i.e., variables whose names begin with HTTP_). The presence or absence of these variables should correspond with the presence or absence of the appropriate HTTP header in the request. See {RFC3875 section 4.1.18}[https://tools.ietf.org/html/rfc3875#section-4.1.18] for specific behavior. In addition to this, the Rack environment must include these Rack-specific variables: rack.version:: The Array representing this version of Rack See Rack::VERSION, that corresponds to the version of this SPEC. rack.url_scheme:: +http+ or +https+, depending on the request URL. rack.input:: See below, the input stream. rack.errors:: See below, the error stream. rack.multithread:: true if the application object may be simultaneously invoked by another thread in the same process, false otherwise. rack.multiprocess:: true if an equivalent application object may be simultaneously invoked by another process, false otherwise. rack.run_once:: true if the server expects (but does not guarantee!) that the application will only be invoked this one time during the life of its containing process. Normally, this will only be true for a server based on CGI (or something similar). rack.hijack?:: present and true if the server supports connection hijacking. See below, hijacking. rack.hijack:: an object responding to #call that must be called at least once before using rack.hijack_io. It is recommended #call return rack.hijack_io as well as setting it in env if necessary. rack.hijack_io:: if rack.hijack? is true, and rack.hijack has received #call, this will contain an object resembling an IO. See hijacking. Additional environment specifications have approved to standardized middleware APIs. None of these are required to be implemented by the server. rack.session:: A hash like interface for storing request session data. The store must implement: store(key, value) (aliased as []=); fetch(key, default = nil) (aliased as []); delete(key); clear; to_hash (returning unfrozen Hash instance); rack.logger:: A common object interface for logging messages. The object must implement: info(message, &block) debug(message, &block) warn(message, &block) error(message, &block) fatal(message, &block) rack.multipart.buffer_size:: An Integer hint to the multipart parser as to what chunk size to use for reads and writes. rack.multipart.tempfile_factory:: An object responding to #call with two arguments, the filename and content_type given for the multipart form field, and returning an IO-like object that responds to #<< and optionally #rewind. This factory will be used to instantiate the tempfile for each multipart form file upload field, rather than the default class of Tempfile. The server or the application can store their own data in the environment, too. The keys must contain at least one dot, and should be prefixed uniquely. The prefix rack. is reserved for use with the Rack core distribution and other accepted specifications and must not be used otherwise. The environment must not contain the keys HTTP_CONTENT_TYPE or HTTP_CONTENT_LENGTH (use the versions without HTTP_). The CGI keys (named without a period) must have String values. If the string values for CGI keys contain non-ASCII characters, they should use ASCII-8BIT encoding. There are the following restrictions: * rack.version must be an array of Integers. * rack.url_scheme must either be +http+ or +https+. * There must be a valid input stream in rack.input. * There must be a valid error stream in rack.errors. * There may be a valid hijack stream in rack.hijack_io * The REQUEST_METHOD must be a valid token. * The SCRIPT_NAME, if non-empty, must start with / * The PATH_INFO, if non-empty, must start with / * The CONTENT_LENGTH, if given, must consist of digits only. * One of SCRIPT_NAME or PATH_INFO must be set. PATH_INFO should be / if SCRIPT_NAME is empty. SCRIPT_NAME never should be /, but instead be empty. === The Input Stream The input stream is an IO-like object which contains the raw HTTP POST data. When applicable, its external encoding must be "ASCII-8BIT" and it must be opened in binary mode, for Ruby 1.9 compatibility. The input stream must respond to +gets+, +each+, +read+ and +rewind+. * +gets+ must be called without arguments and return a string, or +nil+ on EOF. * +read+ behaves like IO#read. Its signature is read([length, [buffer]]). If given, +length+ must be a non-negative Integer (>= 0) or +nil+, and +buffer+ must be a String and may not be nil. If +length+ is given and not nil, then this method reads at most +length+ bytes from the input stream. If +length+ is not given or nil, then this method reads all data until EOF. When EOF is reached, this method returns nil if +length+ is given and not nil, or "" if +length+ is not given or is nil. If +buffer+ is given, then the read data will be placed into +buffer+ instead of a newly created String object. * +each+ must be called without arguments and only yield Strings. * +rewind+ must be called without arguments. It rewinds the input stream back to the beginning. It must not raise Errno::ESPIPE: that is, it may not be a pipe or a socket. Therefore, handler developers must buffer the input data into some rewindable object if the underlying input stream is not rewindable. * +close+ must never be called on the input stream. === The Error Stream The error stream must respond to +puts+, +write+ and +flush+. * +puts+ must be called with a single argument that responds to +to_s+. * +write+ must be called with a single argument that is a String. * +flush+ must be called without arguments and must be called in order to make the error appear for sure. * +close+ must never be called on the error stream. === Hijacking ==== Request (before status) If rack.hijack? is true then rack.hijack must respond to #call. rack.hijack must return the io that will also be assigned (or is already present, in rack.hijack_io. rack.hijack_io must respond to: read, write, read_nonblock, write_nonblock, flush, close, close_read, close_write, closed? The semantics of these IO methods must be a best effort match to those of a normal ruby IO or Socket object, using standard arguments and raising standard exceptions. Servers are encouraged to simply pass on real IO objects, although it is recognized that this approach is not directly compatible with SPDY and HTTP 2.0. IO provided in rack.hijack_io should preference the IO::WaitReadable and IO::WaitWritable APIs wherever supported. There is a deliberate lack of full specification around rack.hijack_io, as semantics will change from server to server. Users are encouraged to utilize this API with a knowledge of their server choice, and servers may extend the functionality of hijack_io to provide additional features to users. The purpose of rack.hijack is for Rack to "get out of the way", as such, Rack only provides the minimum of specification and support. If rack.hijack? is false, then rack.hijack should not be set. If rack.hijack? is false, then rack.hijack_io should not be set. ==== Response (after headers) It is also possible to hijack a response after the status and headers have been sent. In order to do this, an application may set the special header rack.hijack to an object that responds to call accepting an argument that conforms to the rack.hijack_io protocol. After the headers have been sent, and this hijack callback has been called, the application is now responsible for the remaining lifecycle of the IO. The application is also responsible for maintaining HTTP semantics. Of specific note, in almost all cases in the current SPEC, applications will have wanted to specify the header Connection:close in HTTP/1.1, and not Connection:keep-alive, as there is no protocol for returning hijacked sockets to the web server. For that purpose, use the body streaming API instead (progressively yielding strings via each). Servers must ignore the body part of the response tuple when the rack.hijack response API is in use. The special response header rack.hijack must only be set if the request env has rack.hijack? true. ==== Conventions * Middleware should not use hijack unless it is handling the whole response. * Middleware may wrap the IO object for the response pattern. * Middleware should not wrap the IO object for the request pattern. The request pattern is intended to provide the hijacker with "raw tcp". == The Response === The Status This is an HTTP status. When parsed as integer (+to_i+), it must be greater than or equal to 100. === The Headers The header must respond to +each+, and yield values of key and value. The header keys must be Strings. Special headers starting "rack." are for communicating with the server, and must not be sent back to the client. The header must not contain a +Status+ key. The header must conform to RFC7230 token specification, i.e. cannot contain non-printable ASCII, DQUOTE or "(),/:;<=>?@[\]{}". The values of the header must be Strings, consisting of lines (for multiple header values, e.g. multiple Set-Cookie values) separated by "\\n". The lines must not contain characters below 037. === The Content-Type There must not be a Content-Type, when the +Status+ is 1xx, 204 or 304. === The Content-Length There must not be a Content-Length header when the +Status+ is 1xx, 204 or 304. === The Body The Body must respond to +each+ and must only yield String values. The Body itself should not be an instance of String, as this will break in Ruby 1.9. If the Body responds to +close+, it will be called after iteration. If the body is replaced by a middleware after action, the original body must be closed first, if it responds to close. If the Body responds to +to_path+, it must return a String identifying the location of a file whose contents are identical to that produced by calling +each+; this may be used by the server as an alternative, possibly more efficient way to transport the response. The Body commonly is an Array of Strings, the application instance itself, or a File-like object. == Thanks Some parts of this specification are adopted from PEP333: Python Web Server Gateway Interface v1.0 (http://www.python.org/dev/peps/pep-0333/). I'd like to thank everyone involved in that effort. PK!%m+ *share/gems/gems/rack-2.2.4/CONTRIBUTING.mdnu[Contributing to Rack ===================== Rack is work of [hundreds of contributors](https://github.com/rack/rack/graphs/contributors). You're encouraged to submit [pull requests](https://github.com/rack/rack/pulls), [propose features and discuss issues](https://github.com/rack/rack/issues). When in doubt, post to the [rack-devel](http://groups.google.com/group/rack-devel) mailing list. #### Fork the Project Fork the [project on Github](https://github.com/rack/rack) and check out your copy. ``` git clone https://github.com/contributor/rack.git cd rack git remote add upstream https://github.com/rack/rack.git ``` #### Create a Topic Branch Make sure your fork is up-to-date and create a topic branch for your feature or bug fix. ``` git checkout master git pull upstream master git checkout -b my-feature-branch ``` #### Bundle Install and Quick Test Ensure that you can build the project and run quick tests. ``` bundle install --without extra bundle exec rake test ``` #### Running All Tests Install all dependencies. ``` bundle install ``` Run all tests. ``` rake test ``` The test suite has no dependencies outside of the core Ruby installation and bacon. Some tests will be skipped if a dependency is not found. To run the test suite completely, you need: * fcgi * dalli * thin To test Memcache sessions, you need memcached (will be run on port 11211) and dalli installed. #### Write Tests Try to write a test that reproduces the problem you're trying to fix or describes a feature that you want to build. We definitely appreciate pull requests that highlight or reproduce a problem, even without a fix. #### Write Code Implement your feature or bug fix. Make sure that `bundle exec rake fulltest` completes without errors. #### Write Documentation Document any external behavior in the [README](README.rdoc). #### Update Changelog Add a line to [CHANGELOG](CHANGELOG.md). #### Commit Changes Make sure git knows your name and email address: ``` git config --global user.name "Your Name" git config --global user.email "contributor@example.com" ``` Writing good commit logs is important. A commit log should describe what changed and why. ``` git add ... git commit ``` #### Push ``` git push origin my-feature-branch ``` #### Make a Pull Request Go to https://github.com/contributor/rack and select your feature branch. Click the 'Pull Request' button and fill out the form. Pull requests are usually reviewed within a few days. #### Rebase If you've been working on a change for a while, rebase with upstream/master. ``` git fetch upstream git rebase upstream/master git push origin my-feature-branch -f ``` #### Make Required Changes Amend your previous commit and force push the changes. ``` git commit --amend git push origin my-feature-branch -f ``` #### Check on Your Pull Request Go back to your pull request after a few minutes and see whether it passed muster with Travis-CI. Everything should look green, otherwise fix issues and amend your commit as described above. #### Be Patient It's likely that your change will not be merged and that the nitpicky maintainers will ask you to do more, or fix seemingly benign problems. Hang on there! #### Thank You Please do know that we really appreciate and value your time and work. We love you, really. PK!##BB'share/gems/gems/ruby-lsapi-5.7/setup.rbnu[# # setup.rb # # Copyright (c) 2000-2005 Minero Aoki # # This program is free software. # You can distribute/modify this program under the terms of # the GNU LGPL, Lesser General Public License version 2.1. # unless Enumerable.method_defined?(:map) # Ruby 1.4.6 module Enumerable alias map collect end end unless File.respond_to?(:read) # Ruby 1.6 def File.read(fname) open(fname) {|f| return f.read } end end unless Errno.const_defined?(:ENOTEMPTY) # Windows? module Errno class ENOTEMPTY # We do not raise this exception, implementation is not needed. end end end def File.binread(fname) open(fname, 'rb') {|f| return f.read } end # for corrupted Windows' stat(2) def File.dir?(path) File.directory?((path[-1,1] == '/') ? path : path + '/') end class ConfigTable include Enumerable def initialize(rbconfig) @rbconfig = rbconfig @items = [] @table = {} # options @install_prefix = nil @config_opt = nil @verbose = true @no_harm = false end attr_accessor :install_prefix attr_accessor :config_opt attr_writer :verbose def verbose? @verbose end attr_writer :no_harm def no_harm? @no_harm end def [](key) lookup(key).resolve(self) end def []=(key, val) lookup(key).set val end def names @items.map {|i| i.name } end def each(&block) @items.each(&block) end def key?(name) @table.key?(name) end def lookup(name) @table[name] or setup_rb_error "no such config item: #{name}" end def add(item) @items.push item @table[item.name] = item end def remove(name) item = lookup(name) @items.delete_if {|i| i.name == name } @table.delete_if {|name, i| i.name == name } item end def load_script(path, inst = nil) if File.file?(path) MetaConfigEnvironment.new(self, inst).instance_eval File.read(path), path end end def savefile '.config' end def load_savefile begin File.foreach(savefile()) do |line| k, v = *line.split(/=/, 2) self[k] = v.strip end rescue Errno::ENOENT setup_rb_error $!.message + "\n#{File.basename($0)} config first" end end def save @items.each {|i| i.value } File.open(savefile(), 'w') {|f| @items.each do |i| f.printf "%s=%s\n", i.name, i.value if i.value? and i.value end } end def load_standard_entries standard_entries(@rbconfig).each do |ent| add ent end end def standard_entries(rbconfig) c = rbconfig rubypath = File.join(c['bindir'], c['ruby_install_name'] + c['EXEEXT']) major = c['MAJOR'].to_i minor = c['MINOR'].to_i teeny = c['TEENY'].to_i version = "#{major}.#{minor}" # ruby ver. >= 1.4.4? newpath_p = ((major >= 2) or ((major == 1) and ((minor >= 5) or ((minor == 4) and (teeny >= 4))))) if c['rubylibdir'] # V > 1.6.3 libruby = "#{c['prefix']}/lib/ruby" librubyver = c['rubylibdir'] librubyverarch = c['archdir'] siteruby = c['sitedir'] siterubyver = c['sitelibdir'] siterubyverarch = c['sitearchdir'] elsif newpath_p # 1.4.4 <= V <= 1.6.3 libruby = "#{c['prefix']}/lib/ruby" librubyver = "#{c['prefix']}/lib/ruby/#{version}" librubyverarch = "#{c['prefix']}/lib/ruby/#{version}/#{c['arch']}" siteruby = c['sitedir'] siterubyver = "$siteruby/#{version}" siterubyverarch = "$siterubyver/#{c['arch']}" else # V < 1.4.4 libruby = "#{c['prefix']}/lib/ruby" librubyver = "#{c['prefix']}/lib/ruby/#{version}" librubyverarch = "#{c['prefix']}/lib/ruby/#{version}/#{c['arch']}" siteruby = "#{c['prefix']}/lib/ruby/#{version}/site_ruby" siterubyver = siteruby siterubyverarch = "$siterubyver/#{c['arch']}" end parameterize = lambda {|path| path.sub(/\A#{Regexp.quote(c['prefix'])}/, '$prefix') } if arg = c['configure_args'].split.detect {|arg| /--with-make-prog=/ =~ arg } makeprog = arg.sub(/'/, '').split(/=/, 2)[1] else makeprog = 'make' end [ ExecItem.new('installdirs', 'std/site/home', 'std: install under libruby; site: install under site_ruby; home: install under $HOME')\ {|val, table| case val when 'std' table['rbdir'] = '$librubyver' table['sodir'] = '$librubyverarch' when 'site' table['rbdir'] = '$siterubyver' table['sodir'] = '$siterubyverarch' when 'home' setup_rb_error '$HOME was not set' unless ENV['HOME'] table['prefix'] = ENV['HOME'] table['rbdir'] = '$libdir/ruby' table['sodir'] = '$libdir/ruby' end }, PathItem.new('prefix', 'path', c['prefix'], 'path prefix of target environment'), PathItem.new('bindir', 'path', parameterize.call(c['bindir']), 'the directory for commands'), PathItem.new('libdir', 'path', parameterize.call(c['libdir']), 'the directory for libraries'), PathItem.new('datadir', 'path', parameterize.call(c['datadir']), 'the directory for shared data'), PathItem.new('mandir', 'path', parameterize.call(c['mandir']), 'the directory for man pages'), PathItem.new('sysconfdir', 'path', parameterize.call(c['sysconfdir']), 'the directory for system configuration files'), PathItem.new('localstatedir', 'path', parameterize.call(c['localstatedir']), 'the directory for local state data'), PathItem.new('libruby', 'path', libruby, 'the directory for ruby libraries'), PathItem.new('librubyver', 'path', librubyver, 'the directory for standard ruby libraries'), PathItem.new('librubyverarch', 'path', librubyverarch, 'the directory for standard ruby extensions'), PathItem.new('siteruby', 'path', siteruby, 'the directory for version-independent aux ruby libraries'), PathItem.new('siterubyver', 'path', siterubyver, 'the directory for aux ruby libraries'), PathItem.new('siterubyverarch', 'path', siterubyverarch, 'the directory for aux ruby binaries'), PathItem.new('rbdir', 'path', '$siterubyver', 'the directory for ruby scripts'), PathItem.new('sodir', 'path', '$siterubyverarch', 'the directory for ruby extentions'), PathItem.new('rubypath', 'path', rubypath, 'the path to set to #! line'), ProgramItem.new('rubyprog', 'name', rubypath, 'the ruby program using for installation'), ProgramItem.new('makeprog', 'name', makeprog, 'the make program to compile ruby extentions'), SelectItem.new('shebang', 'all/ruby/never', 'ruby', 'shebang line (#!) editing mode'), BoolItem.new('without-ext', 'yes/no', 'no', 'does not compile/install ruby extentions') ] end private :standard_entries def load_multipackage_entries multipackage_entries().each do |ent| add ent end end def multipackage_entries [ PackageSelectionItem.new('with', 'name,name...', '', 'ALL', 'package names that you want to install'), PackageSelectionItem.new('without', 'name,name...', '', 'NONE', 'package names that you do not want to install') ] end private :multipackage_entries ALIASES = { 'std-ruby' => 'librubyver', 'stdruby' => 'librubyver', 'rubylibdir' => 'librubyver', 'archdir' => 'librubyverarch', 'site-ruby-common' => 'siteruby', # For backward compatibility 'site-ruby' => 'siterubyver', # For backward compatibility 'bin-dir' => 'bindir', 'bin-dir' => 'bindir', 'rb-dir' => 'rbdir', 'so-dir' => 'sodir', 'data-dir' => 'datadir', 'ruby-path' => 'rubypath', 'ruby-prog' => 'rubyprog', 'ruby' => 'rubyprog', 'make-prog' => 'makeprog', 'make' => 'makeprog' } def fixup ALIASES.each do |ali, name| @table[ali] = @table[name] end @items.freeze @table.freeze @options_re = /\A--(#{@table.keys.join('|')})(?:=(.*))?\z/ end def parse_opt(opt) m = @options_re.match(opt) or setup_rb_error "config: unknown option #{opt}" m.to_a[1,2] end def dllext @rbconfig['DLEXT'] end def value_config?(name) lookup(name).value? end class Item def initialize(name, template, default, desc) @name = name.freeze @template = template @value = default @default = default @description = desc end attr_reader :name attr_reader :description attr_accessor :default alias help_default default def help_opt "--#{@name}=#{@template}" end def value? true end def value @value end def resolve(table) @value.gsub(%r<\$([^/]+)>) { table[$1] } end def set(val) @value = check(val) end private def check(val) setup_rb_error "config: --#{name} requires argument" unless val val end end class BoolItem < Item def config_type 'bool' end def help_opt "--#{@name}" end private def check(val) return 'yes' unless val case val when /\Ay(es)?\z/i, /\At(rue)?\z/i then 'yes' when /\An(o)?\z/i, /\Af(alse)\z/i then 'no' else setup_rb_error "config: --#{@name} accepts only yes/no for argument" end end end class PathItem < Item def config_type 'path' end private def check(path) setup_rb_error "config: --#{@name} requires argument" unless path path[0,1] == '$' ? path : File.expand_path(path) end end class ProgramItem < Item def config_type 'program' end end class SelectItem < Item def initialize(name, selection, default, desc) super @ok = selection.split('/') end def config_type 'select' end private def check(val) unless @ok.include?(val.strip) setup_rb_error "config: use --#{@name}=#{@template} (#{val})" end val.strip end end class ExecItem < Item def initialize(name, selection, desc, &block) super name, selection, nil, desc @ok = selection.split('/') @action = block end def config_type 'exec' end def value? false end def resolve(table) setup_rb_error "$#{name()} wrongly used as option value" end undef set def evaluate(val, table) v = val.strip.downcase unless @ok.include?(v) setup_rb_error "invalid option --#{@name}=#{val} (use #{@template})" end @action.call v, table end end class PackageSelectionItem < Item def initialize(name, template, default, help_default, desc) super name, template, default, desc @help_default = help_default end attr_reader :help_default def config_type 'package' end private def check(val) unless File.dir?("packages/#{val}") setup_rb_error "config: no such package: #{val}" end val end end class MetaConfigEnvironment def initialize(config, installer) @config = config @installer = installer end def config_names @config.names end def config?(name) @config.key?(name) end def bool_config?(name) @config.lookup(name).config_type == 'bool' end def path_config?(name) @config.lookup(name).config_type == 'path' end def value_config?(name) @config.lookup(name).config_type != 'exec' end def add_config(item) @config.add item end def add_bool_config(name, default, desc) @config.add BoolItem.new(name, 'yes/no', default ? 'yes' : 'no', desc) end def add_path_config(name, default, desc) @config.add PathItem.new(name, 'path', default, desc) end def set_config_default(name, default) @config.lookup(name).default = default end def remove_config(name) @config.remove(name) end # For only multipackage def packages raise '[setup.rb fatal] multi-package metaconfig API packages() called for single-package; contact application package vendor' unless @installer @installer.packages end # For only multipackage def declare_packages(list) raise '[setup.rb fatal] multi-package metaconfig API declare_packages() called for single-package; contact application package vendor' unless @installer @installer.packages = list end end end # class ConfigTable # This module requires: #verbose?, #no_harm? module FileOperations def mkdir_p(dirname, prefix = nil) dirname = prefix + File.expand_path(dirname) if prefix $stderr.puts "mkdir -p #{dirname}" if verbose? return if no_harm? # Does not check '/', it's too abnormal. dirs = File.expand_path(dirname).split(%r<(?=/)>) if /\A[a-z]:\z/i =~ dirs[0] disk = dirs.shift dirs[0] = disk + dirs[0] end dirs.each_index do |idx| path = dirs[0..idx].join('') Dir.mkdir path unless File.dir?(path) end end def rm_f(path) $stderr.puts "rm -f #{path}" if verbose? return if no_harm? force_remove_file path end def rm_rf(path) $stderr.puts "rm -rf #{path}" if verbose? return if no_harm? remove_tree path end def remove_tree(path) if File.symlink?(path) remove_file path elsif File.dir?(path) remove_tree0 path else force_remove_file path end end def remove_tree0(path) Dir.foreach(path) do |ent| next if ent == '.' next if ent == '..' entpath = "#{path}/#{ent}" if File.symlink?(entpath) remove_file entpath elsif File.dir?(entpath) remove_tree0 entpath else force_remove_file entpath end end begin Dir.rmdir path rescue Errno::ENOTEMPTY # directory may not be empty end end def move_file(src, dest) force_remove_file dest begin File.rename src, dest rescue File.open(dest, 'wb') {|f| f.write File.binread(src) } File.chmod File.stat(src).mode, dest File.unlink src end end def force_remove_file(path) begin remove_file path rescue end end def remove_file(path) File.chmod 0777, path File.unlink path end def install(from, dest, mode, prefix = nil) $stderr.puts "install #{from} #{dest}" if verbose? return if no_harm? realdest = prefix ? prefix + File.expand_path(dest) : dest realdest = File.join(realdest, File.basename(from)) if File.dir?(realdest) str = File.binread(from) if diff?(str, realdest) verbose_off { rm_f realdest if File.exist?(realdest) } File.open(realdest, 'wb') {|f| f.write str } File.chmod mode, realdest File.open("#{objdir_root()}/InstalledFiles", 'a') {|f| if prefix f.puts realdest.sub(prefix, '') else f.puts realdest end } end end def diff?(new_content, path) return true unless File.exist?(path) new_content != File.binread(path) end def command(*args) $stderr.puts args.join(' ') if verbose? system(*args) or raise RuntimeError, "system(#{args.map{|a| a.inspect }.join(' ')}) failed" end def ruby(*args) command config('rubyprog'), *args end def make(task = nil) command(*[config('makeprog'), task].compact) end def extdir?(dir) File.exist?("#{dir}/MANIFEST") or File.exist?("#{dir}/extconf.rb") end def files_of(dir) Dir.open(dir) {|d| return d.select {|ent| File.file?("#{dir}/#{ent}") } } end DIR_REJECT = %w( . .. CVS SCCS RCS CVS.adm .svn ) def directories_of(dir) Dir.open(dir) {|d| return d.select {|ent| File.dir?("#{dir}/#{ent}") } - DIR_REJECT } end end # This module requires: #srcdir_root, #objdir_root, #relpath module HookScriptAPI def get_config(key) @config[key] end alias config get_config # obsolete: use metaconfig to change configuration def set_config(key, val) @config[key] = val end # # srcdir/objdir (works only in the package directory) # def curr_srcdir "#{srcdir_root()}/#{relpath()}" end def curr_objdir "#{objdir_root()}/#{relpath()}" end def srcfile(path) "#{curr_srcdir()}/#{path}" end def srcexist?(path) File.exist?(srcfile(path)) end def srcdirectory?(path) File.dir?(srcfile(path)) end def srcfile?(path) File.file?(srcfile(path)) end def srcentries(path = '.') Dir.open("#{curr_srcdir()}/#{path}") {|d| return d.to_a - %w(. ..) } end def srcfiles(path = '.') srcentries(path).select {|fname| File.file?(File.join(curr_srcdir(), path, fname)) } end def srcdirectories(path = '.') srcentries(path).select {|fname| File.dir?(File.join(curr_srcdir(), path, fname)) } end end class ToplevelInstaller Version = '3.4.1' Copyright = 'Copyright (c) 2000-2005 Minero Aoki' TASKS = [ [ 'all', 'do config, setup, then install' ], [ 'config', 'saves your configurations' ], [ 'show', 'shows current configuration' ], [ 'setup', 'compiles ruby extentions and others' ], [ 'install', 'installs files' ], [ 'test', 'run all tests in test/' ], [ 'clean', "does `make clean' for each extention" ], [ 'distclean',"does `make distclean' for each extention" ] ] def ToplevelInstaller.invoke config = ConfigTable.new(load_rbconfig()) config.load_standard_entries config.load_multipackage_entries if multipackage? config.fixup klass = (multipackage?() ? ToplevelInstallerMulti : ToplevelInstaller) klass.new(File.dirname($0), config).invoke end def ToplevelInstaller.multipackage? File.dir?(File.dirname($0) + '/packages') end def ToplevelInstaller.load_rbconfig if arg = ARGV.detect {|arg| /\A--rbconfig=/ =~ arg } ARGV.delete(arg) load File.expand_path(arg.split(/=/, 2)[1]) $".push 'rbconfig.rb' else require 'rbconfig' end ::Config::CONFIG end def initialize(ardir_root, config) @ardir = File.expand_path(ardir_root) @config = config # cache @valid_task_re = nil end def config(key) @config[key] end def inspect "#<#{self.class} #{__id__()}>" end def invoke run_metaconfigs case task = parsearg_global() when nil, 'all' parsearg_config init_installers exec_config exec_setup exec_install else case task when 'config', 'test' ; when 'clean', 'distclean' @config.load_savefile if File.exist?(@config.savefile) else @config.load_savefile end __send__ "parsearg_#{task}" init_installers __send__ "exec_#{task}" end end def run_metaconfigs @config.load_script "#{@ardir}/metaconfig" end def init_installers @installer = Installer.new(@config, @ardir, File.expand_path('.')) end # # Hook Script API bases # def srcdir_root @ardir end def objdir_root '.' end def relpath '.' end # # Option Parsing # def parsearg_global while arg = ARGV.shift case arg when /\A\w+\z/ setup_rb_error "invalid task: #{arg}" unless valid_task?(arg) return arg when '-q', '--quiet' @config.verbose = false when '--verbose' @config.verbose = true when '--help' print_usage $stdout exit 0 when '--version' puts "#{File.basename($0)} version #{Version}" exit 0 when '--copyright' puts Copyright exit 0 else setup_rb_error "unknown global option '#{arg}'" end end nil end def valid_task?(t) valid_task_re() =~ t end def valid_task_re @valid_task_re ||= /\A(?:#{TASKS.map {|task,desc| task }.join('|')})\z/ end def parsearg_no_options unless ARGV.empty? task = caller(0).first.slice(%r<`parsearg_(\w+)'>, 1) setup_rb_error "#{task}: unknown options: #{ARGV.join(' ')}" end end alias parsearg_show parsearg_no_options alias parsearg_setup parsearg_no_options alias parsearg_test parsearg_no_options alias parsearg_clean parsearg_no_options alias parsearg_distclean parsearg_no_options def parsearg_config evalopt = [] set = [] @config.config_opt = [] while i = ARGV.shift if /\A--?\z/ =~ i @config.config_opt = ARGV.dup break end name, value = *@config.parse_opt(i) if @config.value_config?(name) @config[name] = value else evalopt.push [name, value] end set.push name end evalopt.each do |name, value| @config.lookup(name).evaluate value, @config end # Check if configuration is valid set.each do |n| @config[n] if @config.value_config?(n) end end def parsearg_install @config.no_harm = false @config.install_prefix = '' while a = ARGV.shift case a when '--no-harm' @config.no_harm = true when /\A--prefix=/ path = a.split(/=/, 2)[1] path = File.expand_path(path) unless path[0,1] == '/' @config.install_prefix = path else setup_rb_error "install: unknown option #{a}" end end end def print_usage(out) out.puts 'Typical Installation Procedure:' out.puts " $ ruby #{File.basename $0} config" out.puts " $ ruby #{File.basename $0} setup" out.puts " # ruby #{File.basename $0} install (may require root privilege)" out.puts out.puts 'Detailed Usage:' out.puts " ruby #{File.basename $0} " out.puts " ruby #{File.basename $0} [] []" fmt = " %-24s %s\n" out.puts out.puts 'Global options:' out.printf fmt, '-q,--quiet', 'suppress message outputs' out.printf fmt, ' --verbose', 'output messages verbosely' out.printf fmt, ' --help', 'print this message' out.printf fmt, ' --version', 'print version and quit' out.printf fmt, ' --copyright', 'print copyright and quit' out.puts out.puts 'Tasks:' TASKS.each do |name, desc| out.printf fmt, name, desc end fmt = " %-24s %s [%s]\n" out.puts out.puts 'Options for CONFIG or ALL:' @config.each do |item| out.printf fmt, item.help_opt, item.description, item.help_default end out.printf fmt, '--rbconfig=path', 'rbconfig.rb to load',"running ruby's" out.puts out.puts 'Options for INSTALL:' out.printf fmt, '--no-harm', 'only display what to do if given', 'off' out.printf fmt, '--prefix=path', 'install path prefix', '' out.puts end # # Task Handlers # def exec_config @installer.exec_config @config.save # must be final end def exec_setup @installer.exec_setup end def exec_install @installer.exec_install end def exec_test @installer.exec_test end def exec_show @config.each do |i| printf "%-20s %s\n", i.name, i.value if i.value? end end def exec_clean @installer.exec_clean end def exec_distclean @installer.exec_distclean end end # class ToplevelInstaller class ToplevelInstallerMulti < ToplevelInstaller include FileOperations def initialize(ardir_root, config) super @packages = directories_of("#{@ardir}/packages") raise 'no package exists' if @packages.empty? @root_installer = Installer.new(@config, @ardir, File.expand_path('.')) end def run_metaconfigs @config.load_script "#{@ardir}/metaconfig", self @packages.each do |name| @config.load_script "#{@ardir}/packages/#{name}/metaconfig" end end attr_reader :packages def packages=(list) raise 'package list is empty' if list.empty? list.each do |name| raise "directory packages/#{name} does not exist"\ unless File.dir?("#{@ardir}/packages/#{name}") end @packages = list end def init_installers @installers = {} @packages.each do |pack| @installers[pack] = Installer.new(@config, "#{@ardir}/packages/#{pack}", "packages/#{pack}") end with = extract_selection(config('with')) without = extract_selection(config('without')) @selected = @installers.keys.select {|name| (with.empty? or with.include?(name)) \ and not without.include?(name) } end def extract_selection(list) a = list.split(/,/) a.each do |name| setup_rb_error "no such package: #{name}" unless @installers.key?(name) end a end def print_usage(f) super f.puts 'Inluded packages:' f.puts ' ' + @packages.sort.join(' ') f.puts end # # Task Handlers # def exec_config run_hook 'pre-config' each_selected_installers {|inst| inst.exec_config } run_hook 'post-config' @config.save # must be final end def exec_setup run_hook 'pre-setup' each_selected_installers {|inst| inst.exec_setup } run_hook 'post-setup' end def exec_install run_hook 'pre-install' each_selected_installers {|inst| inst.exec_install } run_hook 'post-install' end def exec_test run_hook 'pre-test' each_selected_installers {|inst| inst.exec_test } run_hook 'post-test' end def exec_clean rm_f @config.savefile run_hook 'pre-clean' each_selected_installers {|inst| inst.exec_clean } run_hook 'post-clean' end def exec_distclean rm_f @config.savefile run_hook 'pre-distclean' each_selected_installers {|inst| inst.exec_distclean } run_hook 'post-distclean' end # # lib # def each_selected_installers Dir.mkdir 'packages' unless File.dir?('packages') @selected.each do |pack| $stderr.puts "Processing the package `#{pack}' ..." if verbose? Dir.mkdir "packages/#{pack}" unless File.dir?("packages/#{pack}") Dir.chdir "packages/#{pack}" yield @installers[pack] Dir.chdir '../..' end end def run_hook(id) @root_installer.run_hook id end # module FileOperations requires this def verbose? @config.verbose? end # module FileOperations requires this def no_harm? @config.no_harm? end end # class ToplevelInstallerMulti class Installer FILETYPES = %w( bin lib ext data conf man ) include FileOperations include HookScriptAPI def initialize(config, srcroot, objroot) @config = config @srcdir = File.expand_path(srcroot) @objdir = File.expand_path(objroot) @currdir = '.' end def inspect "#<#{self.class} #{File.basename(@srcdir)}>" end def noop(rel) end # # Hook Script API base methods # def srcdir_root @srcdir end def objdir_root @objdir end def relpath @currdir end # # Config Access # # module FileOperations requires this def verbose? @config.verbose? end # module FileOperations requires this def no_harm? @config.no_harm? end def verbose_off begin save, @config.verbose = @config.verbose?, false yield ensure @config.verbose = save end end # # TASK config # def exec_config exec_task_traverse 'config' end alias config_dir_bin noop alias config_dir_lib noop def config_dir_ext(rel) extconf if extdir?(curr_srcdir()) end alias config_dir_data noop alias config_dir_conf noop alias config_dir_man noop def extconf ruby "#{curr_srcdir()}/extconf.rb", *@config.config_opt end # # TASK setup # def exec_setup exec_task_traverse 'setup' end def setup_dir_bin(rel) files_of(curr_srcdir()).each do |fname| update_shebang_line "#{curr_srcdir()}/#{fname}" end end alias setup_dir_lib noop def setup_dir_ext(rel) make if extdir?(curr_srcdir()) end alias setup_dir_data noop alias setup_dir_conf noop alias setup_dir_man noop def update_shebang_line(path) return if no_harm? return if config('shebang') == 'never' old = Shebang.load(path) if old $stderr.puts "warning: #{path}: Shebang line includes too many args. It is not portable and your program may not work." if old.args.size > 1 new = new_shebang(old) return if new.to_s == old.to_s else return unless config('shebang') == 'all' new = Shebang.new(config('rubypath')) end $stderr.puts "updating shebang: #{File.basename(path)}" if verbose? open_atomic_writer(path) {|output| File.open(path, 'rb') {|f| f.gets if old # discard output.puts new.to_s output.print f.read } } end def new_shebang(old) if /\Aruby/ =~ File.basename(old.cmd) Shebang.new(config('rubypath'), old.args) elsif File.basename(old.cmd) == 'env' and old.args.first == 'ruby' Shebang.new(config('rubypath'), old.args[1..-1]) else return old unless config('shebang') == 'all' Shebang.new(config('rubypath')) end end def open_atomic_writer(path, &block) tmpfile = File.basename(path) + '.tmp' begin File.open(tmpfile, 'wb', &block) File.rename tmpfile, File.basename(path) ensure File.unlink tmpfile if File.exist?(tmpfile) end end class Shebang def Shebang.load(path) line = nil File.open(path) {|f| line = f.gets } return nil unless /\A#!/ =~ line parse(line) end def Shebang.parse(line) cmd, *args = *line.strip.sub(/\A\#!/, '').split(' ') new(cmd, args) end def initialize(cmd, args = []) @cmd = cmd @args = args end attr_reader :cmd attr_reader :args def to_s "#! #{@cmd}" + (@args.empty? ? '' : " #{@args.join(' ')}") end end # # TASK install # def exec_install rm_f 'InstalledFiles' exec_task_traverse 'install' end def install_dir_bin(rel) install_files targetfiles(), "#{config('bindir')}/#{rel}", 0755 end def install_dir_lib(rel) install_files libfiles(), "#{config('rbdir')}/#{rel}", 0644 end def install_dir_ext(rel) return unless extdir?(curr_srcdir()) install_files rubyextentions('.'), "#{config('sodir')}/#{File.dirname(rel)}", 0555 end def install_dir_data(rel) install_files targetfiles(), "#{config('datadir')}/#{rel}", 0644 end def install_dir_conf(rel) # FIXME: should not remove current config files # (rename previous file to .old/.org) install_files targetfiles(), "#{config('sysconfdir')}/#{rel}", 0644 end def install_dir_man(rel) install_files targetfiles(), "#{config('mandir')}/#{rel}", 0644 end def install_files(list, dest, mode) mkdir_p dest, @config.install_prefix list.each do |fname| install fname, dest, mode, @config.install_prefix end end def libfiles glob_reject(%w(*.y *.output), targetfiles()) end def rubyextentions(dir) ents = glob_select("*.#{@config.dllext}", targetfiles()) if ents.empty? setup_rb_error "no ruby extention exists: 'ruby #{$0} setup' first" end ents end def targetfiles mapdir(existfiles() - hookfiles()) end def mapdir(ents) ents.map {|ent| if File.exist?(ent) then ent # objdir else "#{curr_srcdir()}/#{ent}" # srcdir end } end # picked up many entries from cvs-1.11.1/src/ignore.c JUNK_FILES = %w( core RCSLOG tags TAGS .make.state .nse_depinfo #* .#* cvslog.* ,* .del-* *.olb *~ *.old *.bak *.BAK *.orig *.rej _$* *$ *.org *.in .* ) def existfiles glob_reject(JUNK_FILES, (files_of(curr_srcdir()) | files_of('.'))) end def hookfiles %w( pre-%s post-%s pre-%s.rb post-%s.rb ).map {|fmt| %w( config setup install clean ).map {|t| sprintf(fmt, t) } }.flatten end def glob_select(pat, ents) re = globs2re([pat]) ents.select {|ent| re =~ ent } end def glob_reject(pats, ents) re = globs2re(pats) ents.reject {|ent| re =~ ent } end GLOB2REGEX = { '.' => '\.', '$' => '\$', '#' => '\#', '*' => '.*' } def globs2re(pats) /\A(?:#{ pats.map {|pat| pat.gsub(/[\.\$\#\*]/) {|ch| GLOB2REGEX[ch] } }.join('|') })\z/ end # # TASK test # TESTDIR = 'test' def exec_test unless File.directory?('test') $stderr.puts 'no test in this package' if verbose? return end $stderr.puts 'Running tests...' if verbose? begin require 'test/unit' rescue LoadError setup_rb_error 'test/unit cannot loaded. You need Ruby 1.8 or later to invoke this task.' end runner = Test::Unit::AutoRunner.new(true) runner.to_run << TESTDIR runner.run end # # TASK clean # def exec_clean exec_task_traverse 'clean' rm_f @config.savefile rm_f 'InstalledFiles' end alias clean_dir_bin noop alias clean_dir_lib noop alias clean_dir_data noop alias clean_dir_conf noop alias clean_dir_man noop def clean_dir_ext(rel) return unless extdir?(curr_srcdir()) make 'clean' if File.file?('Makefile') end # # TASK distclean # def exec_distclean exec_task_traverse 'distclean' rm_f @config.savefile rm_f 'InstalledFiles' end alias distclean_dir_bin noop alias distclean_dir_lib noop def distclean_dir_ext(rel) return unless extdir?(curr_srcdir()) make 'distclean' if File.file?('Makefile') end alias distclean_dir_data noop alias distclean_dir_conf noop alias distclean_dir_man noop # # Traversing # def exec_task_traverse(task) run_hook "pre-#{task}" FILETYPES.each do |type| if type == 'ext' and config('without-ext') == 'yes' $stderr.puts 'skipping ext/* by user option' if verbose? next end traverse task, type, "#{task}_dir_#{type}" end run_hook "post-#{task}" end def traverse(task, rel, mid) dive_into(rel) { run_hook "pre-#{task}" __send__ mid, rel.sub(%r[\A.*?(?:/|\z)], '') directories_of(curr_srcdir()).each do |d| traverse task, "#{rel}/#{d}", mid end run_hook "post-#{task}" } end def dive_into(rel) return unless File.dir?("#{@srcdir}/#{rel}") dir = File.basename(rel) Dir.mkdir dir unless File.dir?(dir) prevdir = Dir.pwd Dir.chdir dir $stderr.puts '---> ' + rel if verbose? @currdir = rel yield Dir.chdir prevdir $stderr.puts '<--- ' + rel if verbose? @currdir = File.dirname(rel) end def run_hook(id) path = [ "#{curr_srcdir()}/#{id}", "#{curr_srcdir()}/#{id}.rb" ].detect {|cand| File.file?(cand) } return unless path begin instance_eval File.read(path), path, 1 rescue raise if $DEBUG setup_rb_error "hook #{path} failed:\n" + $!.message end end end # class Installer class SetupError < StandardError; end def setup_rb_error(msg) raise SetupError, msg end if $0 == __FILE__ begin ToplevelInstaller.invoke rescue SetupError raise if $DEBUG $stderr.puts $!.message $stderr.puts "Try 'ruby #{$0} --help' for detailed usage." exit 1 end end PK!sHH7share/gems/gems/ruby-lsapi-5.7/scripts/lsruby_runner.rbnuȯ#!/usr/local/bin/ruby require 'lsapi' class CodeCache def [](filename) mtime = File.mtime( filename ) entry = @cache[filename]; if entry != nil return entry end code = compile(filename) #entry = CodeEntry.new( filename, mtime, code ) @cache[filename] = code return code end private def initialize @cache = {} end def compile(filename) open(filename) do |f| s = f.read s.untaint binding = eval_string_wrap("binding") return eval(format("Proc.new {\n%s\n}", s), binding, filename, 0) end end end $count = 0; $cache = CodeCache.new while true $req = LSAPI.accept break if $req == nil filename = ENV['SCRIPT_FILENAME'] filename.untaint filename =~ %r{^(\/.*?)\/*([^\/]+)$} path = $1 Dir.chdir( path ) #load( filename, true ) code = $cache[filename] code.call end class CodeEntry public :path, :name, :mtime, :opcode def initizlize( filename, mtime, opcode ) filename =~ %r{^(\/.*?)\/*([^\/]+)$} @path = $1 @name = $2 @mtime = mtime @opcode = opcode end end PK! \i$i$1share/gems/gems/ruby-lsapi-5.7/ext/lsapi/Makefilenu[ SHELL = /bin/sh # V=0 quiet, V=1 verbose. other values don't work. V = 1 Q1 = $(V:1=) Q = $(Q1:0=@) ECHO1 = $(V:1=@ :) ECHO = $(ECHO1:0=@ echo) NULLCMD = : #### Start of system configuration section. #### srcdir = . topdir = /opt/cpanel/ea-ruby27/root/usr/include hdrdir = $(topdir) arch_hdrdir = /opt/cpanel/ea-ruby27/root/usr/include PATH_SEPARATOR = : VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby prefix = $(DESTDIR)/opt/cpanel/ea-ruby27/root/usr rubysitearchprefix = $(sitearchlibdir)/$(RUBY_BASE_NAME) rubyarchprefix = $(DESTDIR)/opt/cpanel/ea-ruby27/root/usr/lib64/ruby rubylibprefix = $(exec_prefix)/share/ruby exec_prefix = $(DESTDIR)/opt/cpanel/ea-ruby27/root/usr vendorarchhdrdir = $(vendorhdrdir)/$(arch) sitearchhdrdir = $(sitehdrdir)/$(arch) rubyarchhdrdir = $(DESTDIR)/opt/cpanel/ea-ruby27/root/usr/include vendorhdrdir = $(rubyhdrdir)/vendor_ruby sitehdrdir = $(rubyhdrdir)/site_ruby rubyhdrdir = $(DESTDIR)/opt/cpanel/ea-ruby27/root/usr/include vendorarchdir = $(DESTDIR)/opt/cpanel/ea-ruby27/root/usr/lib64/ruby/vendor_ruby vendorlibdir = $(vendordir)/$(ruby_version_dir_name) vendordir = $(DESTDIR)/opt/cpanel/ea-ruby27/root/usr/share/ruby/vendor_ruby sitearchdir = $(DESTDIR)./.gem.20250624-2551536-1swza1k sitelibdir = $(DESTDIR)./.gem.20250624-2551536-1swza1k sitedir = $(DESTDIR)/opt/cpanel/ea-ruby27/root/usr/local/share/ruby/site_ruby rubyarchdir = $(rubyarchprefix)/$(ruby_version_dir_name) rubylibdir = $(rubylibprefix)/$(ruby_version_dir_name) sitearchincludedir = $(includedir)/$(sitearch) archincludedir = $(includedir)/$(arch) sitearchlibdir = $(libdir)/$(sitearch) archlibdir = $(DESTDIR)/opt/cpanel/ea-ruby27/root/usr/lib64 ridir = $(datarootdir)/$(RI_BASE_NAME) mandir = $(DESTDIR)/opt/cpanel/ea-ruby27/root/usr/share/man localedir = $(datarootdir)/locale libdir = $(exec_prefix)/lib64 psdir = $(docdir) pdfdir = $(docdir) dvidir = $(docdir) htmldir = $(docdir) infodir = $(DESTDIR)/opt/cpanel/ea-ruby27/root/usr/share/info docdir = $(datarootdir)/doc/$(PACKAGE) oldincludedir = $(DESTDIR)/usr/include includedir = $(DESTDIR)/opt/cpanel/ea-ruby27/root/usr/include localstatedir = $(DESTDIR)/opt/cpanel/ea-ruby27/root/var sharedstatedir = $(DESTDIR)/opt/cpanel/ea-ruby27/root/var/lib sysconfdir = $(DESTDIR)/opt/cpanel/ea-ruby27/root/etc datadir = $(DESTDIR)/opt/cpanel/ea-ruby27/root/usr/share datarootdir = $(prefix)/share libexecdir = $(DESTDIR)/opt/cpanel/ea-ruby27/root/usr/libexec sbindir = $(DESTDIR)/opt/cpanel/ea-ruby27/root/usr/sbin bindir = $(exec_prefix)/bin archdir = $(rubyarchdir) CC_WRAPPER = CC = gcc CXX = g++ LIBRUBY = $(LIBRUBY_SO) LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME) LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static $(MAINLIBS) empty = OUTFLAG = -o $(empty) COUTFLAG = -o $(empty) CSRCFLAG = $(empty) RUBY_EXTCONF_H = cflags = $(optflags) $(debugflags) $(warnflags) cxxflags = optflags = -O3 debugflags = -ggdb3 warnflags = -Wall -Wextra -Wdeprecated-declarations -Wduplicated-cond -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wwrite-strings -Wimplicit-fallthrough=0 -Wmissing-noreturn -Wno-cast-function-type -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-packed-bitfield-compat -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wsuggest-attribute=format -Wsuggest-attribute=noreturn -Wunused-variable cppflags = CCDLFLAGS = -fPIC CFLAGS = $(CCDLFLAGS) -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fPIC $(ARCH_FLAG) INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir)/ruby/backward -I$(hdrdir) -I$(srcdir) DEFS = CPPFLAGS = $(DEFS) $(cppflags) -DRUBY_2 CXXFLAGS = $(CCDLFLAGS) -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection $(ARCH_FLAG) ldflags = -L. -Wl,-rpath=/opt/cpanel/ea-ruby27/root/usr/lib64 -fstack-protector-strong -rdynamic -Wl,-export-dynamic dldflags = -Wl,-rpath=/opt/cpanel/ea-ruby27/root/usr/lib64 ARCH_FLAG = -m64 DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG) LDSHARED = $(CC) -shared LDSHAREDXX = $(CXX) -shared AR = ar EXEEXT = RUBY_INSTALL_NAME = $(RUBY_BASE_NAME) RUBY_SO_NAME = ruby RUBYW_INSTALL_NAME = RUBY_VERSION_NAME = $(RUBY_BASE_NAME)-$(ruby_version_dir_name) RUBYW_BASE_NAME = rubyw RUBY_BASE_NAME = ruby arch = x86_64-linux sitearch = $(arch) ruby_version = 2.7.0 ruby = $(bindir)/$(RUBY_BASE_NAME) RUBY = $(ruby) BUILTRUBY = $(bindir)/$(RUBY_BASE_NAME) ruby_headers = $(hdrdir)/ruby.h $(hdrdir)/ruby/backward.h $(hdrdir)/ruby/ruby.h $(hdrdir)/ruby/defines.h $(hdrdir)/ruby/missing.h $(hdrdir)/ruby/intern.h $(hdrdir)/ruby/st.h $(hdrdir)/ruby/subst.h $(arch_hdrdir)/ruby/config.h RM = rm -f RM_RF = $(RUBY) -run -e rm -- -rf RMDIRS = rmdir --ignore-fail-on-non-empty -p MAKEDIRS = /usr/bin/mkdir -p INSTALL = /usr/bin/install -c INSTALL_PROG = $(INSTALL) -m 0755 INSTALL_DATA = $(INSTALL) -m 644 COPY = cp TOUCH = exit > #### End of system configuration section. #### preload = libpath = . $(archlibdir) LIBPATH = -L. -L$(archlibdir) DEFFILE = CLEANFILES = mkmf.log DISTCLEANFILES = DISTCLEANDIRS = extout = extout_prefix = target_prefix = LOCAL_LIBS = LIBS = $(LIBRUBYARG_SHARED) -lm -lc ORIG_SRCS = lsapilib.c lsruby.c SRCS = $(ORIG_SRCS) OBJS = lsapilib.o lsruby.o HDRS = $(srcdir)/lsapidef.h $(srcdir)/lsapilib.h LOCAL_HDRS = TARGET = lsapi TARGET_NAME = lsapi TARGET_ENTRY = Init_$(TARGET_NAME) DLLIB = $(TARGET).so EXTSTATIC = STATIC_LIB = TIMESTAMP_DIR = . BINDIR = $(bindir) RUBYCOMMONDIR = $(sitedir)$(target_prefix) RUBYLIBDIR = $(sitelibdir)$(target_prefix) RUBYARCHDIR = $(sitearchdir)$(target_prefix) HDRDIR = $(rubyhdrdir)/ruby$(target_prefix) ARCHHDRDIR = $(rubyhdrdir)/$(arch)/ruby$(target_prefix) TARGET_SO_DIR = TARGET_SO = $(TARGET_SO_DIR)$(DLLIB) CLEANLIBS = $(TARGET_SO) CLEANOBJS = *.o *.bak all: $(DLLIB) static: $(STATIC_LIB) .PHONY: all install static install-so install-rb .PHONY: clean clean-so clean-static clean-rb clean-static:: clean-rb-default:: clean-rb:: clean-so:: clean: clean-so clean-static clean-rb-default clean-rb -$(Q)$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES) .*.time distclean-rb-default:: distclean-rb:: distclean-so:: distclean-static:: distclean: clean distclean-so distclean-static distclean-rb-default distclean-rb -$(Q)$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log -$(Q)$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES) -$(Q)$(RMDIRS) $(DISTCLEANDIRS) 2> /dev/null || true realclean: distclean install: install-so install-rb install-so: $(DLLIB) $(TIMESTAMP_DIR)/.sitearchdir.time $(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR) clean-static:: -$(Q)$(RM) $(STATIC_LIB) install-rb: pre-install-rb do-install-rb install-rb-default install-rb-default: pre-install-rb-default do-install-rb-default pre-install-rb: Makefile pre-install-rb-default: Makefile do-install-rb: do-install-rb-default: pre-install-rb-default: @$(NULLCMD) $(TIMESTAMP_DIR)/.sitearchdir.time: $(Q) $(MAKEDIRS) $(@D) $(RUBYARCHDIR) $(Q) $(TOUCH) $@ site-install: site-install-so site-install-rb site-install-so: install-so site-install-rb: install-rb .SUFFIXES: .c .m .cc .mm .cxx .cpp .o .S .cc.o: $(ECHO) compiling $(<) $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< .cc.S: $(ECHO) translating $(<) $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< .mm.o: $(ECHO) compiling $(<) $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< .mm.S: $(ECHO) translating $(<) $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< .cxx.o: $(ECHO) compiling $(<) $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< .cxx.S: $(ECHO) translating $(<) $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< .cpp.o: $(ECHO) compiling $(<) $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< .cpp.S: $(ECHO) translating $(<) $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< .c.o: $(ECHO) compiling $(<) $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< .c.S: $(ECHO) translating $(<) $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< .m.o: $(ECHO) compiling $(<) $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $(CSRCFLAG)$< .m.S: $(ECHO) translating $(<) $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -S $(CSRCFLAG)$< $(TARGET_SO): $(OBJS) Makefile $(ECHO) linking shared-object $(DLLIB) -$(Q)$(RM) $(@) $(Q) $(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS) $(OBJS): $(HDRS) $(ruby_headers) PK!G,=333share/gems/gems/ruby-lsapi-5.7/ext/lsapi/lsapidef.hnu[/* Copyright (c) 2002-2018, Lite Speed Technologies Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the Lite Speed Technologies Inc nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _LSAPIDEF_H_ #define _LSAPIDEF_H_ #include #if defined (c_plusplus) || defined (__cplusplus) extern "C" { #endif enum { H_ACCEPT = 0, H_ACC_CHARSET, H_ACC_ENCODING, H_ACC_LANG, H_AUTHORIZATION, H_CONNECTION, H_CONTENT_TYPE, H_CONTENT_LENGTH, H_COOKIE, H_COOKIE2, H_HOST, H_PRAGMA, H_REFERER, H_USERAGENT, H_CACHE_CTRL, H_IF_MODIFIED_SINCE, H_IF_MATCH, H_IF_NO_MATCH, H_IF_RANGE, H_IF_UNMOD_SINCE, H_KEEP_ALIVE, H_RANGE, H_X_FORWARDED_FOR, H_VIA, H_TRANSFER_ENCODING }; #define LSAPI_SOCK_FILENO 0 #define LSAPI_VERSION_B0 'L' #define LSAPI_VERSION_B1 'S' /* Values for m_flag in lsapi_packet_header */ #define LSAPI_ENDIAN_LITTLE 0 #define LSAPI_ENDIAN_BIG 1 #define LSAPI_ENDIAN_BIT 1 #if defined(__i386__)||defined( __x86_64 )||defined( __x86_64__ ) #define LSAPI_ENDIAN LSAPI_ENDIAN_LITTLE #else #define LSAPI_ENDIAN LSAPI_ENDIAN_BIG #endif /* Values for m_type in lsapi_packet_header */ #define LSAPI_BEGIN_REQUEST 1 #define LSAPI_ABORT_REQUEST 2 #define LSAPI_RESP_HEADER 3 #define LSAPI_RESP_STREAM 4 #define LSAPI_RESP_END 5 #define LSAPI_STDERR_STREAM 6 #define LSAPI_REQ_RECEIVED 7 #define LSAPI_CONN_CLOSE 8 #define LSAPI_INTERNAL_ERROR 9 #define LSAPI_MAX_HEADER_LEN (1024 * 256) #define LSAPI_MAX_DATA_PACKET_LEN 16384 #define LSAPI_RESP_HTTP_HEADER_MAX 32768 #define LSAPI_PACKET_HEADER_LEN 8 struct lsapi_packet_header { char m_versionB0; /* LSAPI protocol version */ char m_versionB1; char m_type; char m_flag; union { int32_t m_iLen; /* include this header */ char m_bytes[4]; }m_packetLen; }; /* LSAPI request header packet 1. struct lsapi_req_header 2. struct lsapi_http_header_index 3. lsapi_header_offset * unknownHeaders 4. org http request header 5. request body if available */ struct lsapi_req_header { struct lsapi_packet_header m_pktHeader; int32_t m_httpHeaderLen; int32_t m_reqBodyLen; int32_t m_scriptFileOff; /* path to the script file. */ int32_t m_scriptNameOff; /* decrypted URI, without pathinfo, */ int32_t m_queryStringOff; /* Query string inside env */ int32_t m_requestMethodOff; int32_t m_cntUnknownHeaders; int32_t m_cntEnv; int32_t m_cntSpecialEnv; } ; struct lsapi_http_header_index { uint16_t m_headerLen[H_TRANSFER_ENCODING+1]; int32_t m_headerOff[H_TRANSFER_ENCODING+1]; } ; struct lsapi_header_offset { int32_t nameOff; int32_t nameLen; int32_t valueOff; int32_t valueLen; } ; struct lsapi_resp_info { int32_t m_cntHeaders; int32_t m_status; }; struct lsapi_resp_header { struct lsapi_packet_header m_pktHeader; struct lsapi_resp_info m_respInfo; }; #if defined (c_plusplus) || defined (__cplusplus) } #endif #endif PK!:share/gems/gems/ruby-lsapi-5.7/ext/lsapi/.sitearchdir.timenu[PK!6}[[1share/gems/gems/ruby-lsapi-5.7/ext/lsapi/lsruby.cnu[ #include "ruby.h" #if defined( RUBY_18 ) #include "util.h" #include "version.h" #elif defined( RUBY_VERSION_CODE ) && RUBY_VERSION_CODE < 180 #include "util.h" #else #include #include #endif #include "lsapilib.h" #include #include #include #include #include #include #include #include #include #ifndef RUBY_API_VERSION_CODE #define RUBY_API_VERSION_CODE (RUBY_API_VERSION_MAJOR*10000+RUBY_API_VERSION_MINOR*100+RUBY_API_VERSION_TEENY) #endif /* RUBY_EXTERN VALUE ruby_errinfo; */ RUBY_EXTERN VALUE rb_stdin; RUBY_EXTERN VALUE rb_stdout; #if defined( RUBY_VERSION_CODE ) && RUBY_VERSION_CODE < 180 RUBY_EXTERN VALUE rb_defout; #endif static VALUE orig_stdin; static VALUE orig_stdout; static VALUE orig_stderr; #if defined( RUBY_VERSION_CODE ) && RUBY_VERSION_CODE < 180 static VALUE orig_defout; #endif static VALUE orig_env; static VALUE env_copy; static VALUE lsapi_env; static int MAX_BODYBUF_LENGTH = (10 * 1024 * 1024); #if RUBY_API_VERSION_CODE >= 20700 # if defined rb_tainted_str_new # undef rb_tainted_str_new # endif # define rb_tainted_str_new(p,l) rb_str_new((p),(l)) #endif /* static VALUE lsapi_objrefs; */ typedef struct lsapi_data { LSAPI_Request * req; VALUE env; ssize_t (* fn_write)( LSAPI_Request *, const char * , size_t ); }lsapi_data; static VALUE cLSAPI; static VALUE s_req = Qnil; static lsapi_data * s_req_data; static VALUE s_req_stderr = Qnil; static lsapi_data * s_stderr_data; static pid_t s_pid = 0; typedef struct lsapi_body { char *bodyBuf; //we put small one into memory, otherwise, into a memory mapping file, and we still use the bodyBuf to access this mapping int bodyLen; //expected length got form content-length int bodyCurrentLen; //current length by read() readBodyToReqBuf int curPos; }lsapi_body; static lsapi_body s_body; static char sTempFile[1024] = {0}; /* * static void lsapi_ruby_setenv(const char *name, const char *value) * { * if (!name) return; * * if (value && *value) * ruby_setenv(name, value); * else * ruby_unsetenv(name); } * * */ static void lsapi_mark( lsapi_data * data ) { rb_gc_mark( data->env ); } /* * static void lsapi_free_data( lsapi_data * data ) * { * free( data ); } * * */ static int add_env_rails( const char * pKey, int keyLen, const char * pValue, int valLen, void * arg ) { char * p; int len; /* Fixup some environment variables for rails */ switch( *pKey ) { case 'Q': if ( strcmp( pKey, "QUERY_STRING" ) == 0 ) { if ( !*pValue ) return 1; } break; case 'R': if (( *(pKey+8) == 'U' )&&( strcmp( pKey, "REQUEST_URI" ) == 0 )) { p = strchr( pValue, '?' ); if ( p ) { len = valLen - ( p - pValue ) - 1; /* * valLen = p - pValue; *p++ = 0; */ } else { p = (char *)pValue + valLen; len = 0; } rb_hash_aset( lsapi_env,rb_tainted_str_new("PATH_INFO", 9), rb_tainted_str_new(pValue, p - pValue)); rb_hash_aset( lsapi_env,rb_tainted_str_new("REQUEST_PATH", 12), rb_tainted_str_new(pValue, p - pValue)); if ( *p == '?' ) ++p; rb_hash_aset( lsapi_env,rb_tainted_str_new("QUERY_STRING", 12), rb_tainted_str_new(p, len)); } break; case 'S': if ( strcmp( pKey, "SCRIPT_NAME" ) == 0 ) { pValue = "/"; valLen = 1; } break; case 'P': if ( strcmp( pKey, "PATH_INFO" ) == 0 ) return 1; default: break; } /* lsapi_ruby_setenv(pKey, pValue ); */ rb_hash_aset( lsapi_env,rb_tainted_str_new(pKey, keyLen), rb_tainted_str_new(pValue, valLen)); return 1; } static int add_env_no_fix( const char * pKey, int keyLen, const char * pValue, int valLen, void * arg ) { rb_hash_aset( lsapi_env,rb_tainted_str_new(pKey, keyLen), rb_tainted_str_new(pValue, valLen)); return 1; } typedef int (*fn_add_env)( const char * pKey, int keyLen, const char * pValue, int valLen, void * arg ); fn_add_env s_fn_add_env = add_env_no_fix; static void clear_env() { /* rb_funcall( lsapi_env, rb_intern( "clear" ), 0 ); */ rb_funcall( lsapi_env, rb_intern( "replace" ), 1, env_copy ); } static void setup_cgi_env( lsapi_data * data ) { clear_env(); LSAPI_ForeachHeader_r( data->req, s_fn_add_env, data ); LSAPI_ForeachEnv_r( data->req, s_fn_add_env, data ); } static VALUE lsapi_s_accept( VALUE self ) { int pid; if ( LSAPI_Prefork_Accept_r( &g_req ) == -1 ) return Qnil; else { if (s_body.bodyBuf != NULL) free (s_body.bodyBuf); s_body.bodyBuf = NULL; s_body.bodyLen = -1; s_body.bodyCurrentLen = 0; s_body.curPos = 0; pid = getpid(); if ( pid != s_pid ) { s_pid = pid; rb_funcall( Qnil, rb_intern( "srand" ), 0 ); } setup_cgi_env( s_req_data ); return s_req; } } static VALUE lsapi_s_accept_new_conn(VALUE self) { if (LSAPI_Accept_Before_Fork(&g_req) == -1 ) return Qnil; else return s_req; } static VALUE lsapi_s_postfork_child(VALUE self) { LSAPI_Postfork_Child(&g_req); return s_req; } static VALUE lsapi_s_postfork_parent(VALUE self) { LSAPI_Postfork_Parent(&g_req); return s_req; } /* * static int chdir_file( const char * pFile ) * { * char * p = strrchr( pFile, '/' ); * int ret; * if ( !p ) * return -1; *p = 0; ret = chdir( pFile ); *p = '/'; return ret; } */ static VALUE lsapi_eval_string_wrap(VALUE self, VALUE str) { #if RUBY_API_VERSION_CODE < 20700 if (rb_safe_level() >= 4) { Check_Type(str, T_STRING); } else #endif { SafeStringValue(str); } return rb_eval_string_wrap(StringValuePtr(str), NULL); } static VALUE lsapi_process( VALUE self ) { /* lsapi_data *data; const char * pScriptPath; Data_Get_Struct(self,lsapi_data, data); pScriptPath = LSAPI_GetScriptFileName_r( data->req ); */ /* * if ( chdir_file( pScriptPath ) == -1 ) * { * lsapi_send_error( 404 ); * } * rb_load_file( pScriptPath ); */ return Qnil; } static VALUE lsapi_putc(VALUE self, VALUE c) { char ch = NUM2CHR(c); lsapi_data *data; Data_Get_Struct(self,lsapi_data, data); if ( (*data->fn_write)( data->req, &ch, 1 ) == 1 ) return c; else return INT2NUM( EOF ); } static VALUE lsapi_write( VALUE self, VALUE str ) { lsapi_data *data; int len; Data_Get_Struct(self,lsapi_data, data); /* len = LSAPI_Write_r( data->req, RSTRING_PTR(str), RSTRING_LEN(str) ); */ if (TYPE(str) != T_STRING) str = rb_obj_as_string(str); len = (*data->fn_write)( data->req, RSTRING_PTR(str), RSTRING_LEN(str) ); return INT2NUM( len ); } static VALUE lsapi_print( int argc, VALUE *argv, VALUE out ) { int i; VALUE line; /* if no argument given, print `$_' */ if (argc == 0) { argc = 1; line = rb_lastline_get(); argv = &line; } for (i = 0; i0) { lsapi_write(out, rb_output_fs); } switch (TYPE(argv[i])) { case T_NIL: lsapi_write(out, rb_str_new2("nil")); break; default: lsapi_write(out, argv[i]); break; } } if (!NIL_P(rb_output_rs)) { lsapi_write(out, rb_output_rs); } return Qnil; } static VALUE lsapi_printf(int argc, VALUE *argv, VALUE out) { lsapi_write(out, rb_f_sprintf(argc, argv)); return Qnil; } static VALUE lsapi_puts _((int, VALUE*, VALUE)); #if RUBY_API_VERSION_CODE >= 10900 static VALUE lsapi_puts_ary(VALUE ary, VALUE out, int recur ) { VALUE tmp; long i; if (recur) { tmp = rb_str_new2("[...]"); rb_io_puts(1, &tmp, out); return Qnil; } for (i=0; i= 10900 rb_exec_recursive(lsapi_puts_ary, argv[i], out); #else rb_protect_inspect(lsapi_puts_ary, argv[i], out); #endif continue; default: line = argv[i]; break; } line = rb_obj_as_string(line); lsapi_write(out, line); if (*( RSTRING_PTR(line) + RSTRING_LEN(line) - 1 ) != '\n') { lsapi_write(out, rb_default_rs); } } return Qnil; } static VALUE lsapi_addstr(VALUE out, VALUE str) { lsapi_write(out, str); return out; } static VALUE lsapi_flush( VALUE self ) { /* * lsapi_data *data; * Data_Get_Struct(self,lsapi_data, data); */ LSAPI_Flush_r( &g_req ); return Qnil; } static VALUE lsapi_getc( VALUE self ) { int ch; /* * lsapi_data *data; * Data_Get_Struct(self,lsapi_data, data); */ #if RUBY_API_VERSION_CODE < 20700 if (rb_safe_level() >= 4 && !OBJ_TAINTED(self)) { rb_raise(rb_eSecurityError, "Insecure: operation on untainted IO"); } #endif ch = LSAPI_ReqBodyGetChar_r( &g_req ); if ( ch == EOF ) return Qnil; return INT2NUM( ch ); } static inline int isBodyWriteToFile() { return ((s_body.bodyLen >= MAX_BODYBUF_LENGTH)? (1): (0)); } //create a temp file and open it, if failed, fd = -1 static inline int createTempFile() { int fd = -1; char *sfn = strdup(sTempFile); if ((fd = mkstemp(sfn)) == -1) { fprintf(stderr, "%s: %s\n", sfn, strerror(errno)); } else unlink(sfn); free(sfn); return fd; } //return 1 if error occured! //if already created, always OK (0) static int createBodyBuf() { int fd = -1; if (s_body.bodyLen == -1) { s_body.bodyLen = LSAPI_GetReqBodyLen_r(&g_req); //Error if get a zeor length, should not happen if (s_body.bodyLen < 0) { //Wrong bode length will be treated as 0 s_body.bodyLen = 0; } if (s_body.bodyLen > 0) { if (isBodyWriteToFile()) { //create file mapping fd = createTempFile(); if (fd == -1) { return 1; } if (ftruncate(fd, s_body.bodyLen) == 0) { perror("ftruncate() failed. \n"); close(fd); return 1; } s_body.bodyBuf = mmap(NULL, s_body.bodyLen, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if (s_body.bodyBuf == MAP_FAILED) { perror("File mapping failed. \n"); close(fd); return 1; } close(fd); //close since needn't it anymore } else { s_body.bodyBuf = (char *)calloc(s_body.bodyLen, sizeof(char)); if (s_body.bodyBuf == NULL) { perror("Memory calloc error"); return 1; } } } } return 0; } static inline int isAllBodyRead() { return (s_body.bodyCurrentLen < s_body.bodyLen)? 0 : 1; } static inline int isEofBodyBuf() { return (s_body.curPos < s_body.bodyLen) ? 0 : 1; } //try to read length as times pagesize (such as 8KB * N) static int readBodyBuf(const int needRead) { const int blockSize = 8192; char *buff = s_body.bodyBuf + s_body.bodyCurrentLen; int nRead; int readMore = (needRead + blockSize -1) / blockSize * blockSize; int remain = LSAPI_GetReqBodyRemain_r( &g_req ); //Only when not enough left, needReadChange will be changed!!! if (remain < readMore) readMore = remain; if ( readMore <= 0 ) return 0; nRead = LSAPI_ReadReqBody_r(&g_req, buff, readMore); if ( nRead > 0 ) s_body.bodyCurrentLen += nRead; return nRead; } static VALUE lsapi_gets( VALUE self ) { VALUE str; const int blkSize = 4096; int n; char *p = NULL; #if RUBY_API_VERSION_CODE < 20700 if (rb_safe_level() >= 4 && !OBJ_TAINTED(self)) { rb_raise(rb_eSecurityError, "Insecure: operation on untainted IO"); } #endif if (createBodyBuf() == 1) { return Qnil; } //comment: while((p = memmem(s_body.bodyBuf + s_body.curPos, s_body.bodyCurrentLen - s_body.curPos, "\n", 1)) == NULL) { if (isAllBodyRead() == 1) break; //read one page and check, then reply readBodyBuf(blkSize); } p = memmem(s_body.bodyBuf + s_body.curPos, s_body.bodyCurrentLen - s_body.curPos, "\n", 1); if (p != NULL) n = p - s_body.bodyBuf - s_body.curPos + 1; else n = s_body.bodyCurrentLen - s_body.curPos; str = rb_str_buf_new( n ); #if RUBY_API_VERSION_CODE < 20700 OBJ_TAINT(str); #endif if (n > 0) { rb_str_buf_cat( str, s_body.bodyBuf + s_body.curPos, n ); s_body.curPos += n; } return str; } static VALUE lsapi_read(int argc, VALUE *argv, VALUE self) { VALUE str; int n; int needRead; int nRead; #if RUBY_API_VERSION_CODE < 20700 if (rb_safe_level() >= 4 && !OBJ_TAINTED(self)) { rb_raise(rb_eSecurityError, "Insecure: operation on untainted IO"); } #endif if (createBodyBuf() == 1) { return Qnil; } //we need to consider these 4 cases: //1, need all data since argc == 0, we may have all data 2, or not //3, need a length of data (argv >= 1), we may have enough data already read, 4, or not if (argc == 0) n = s_body.bodyLen - s_body.curPos; else { n = NUM2INT(argv[0]); //request that length from currentpos if (n < 0) return Qnil; if (n > s_body.bodyLen - s_body.curPos) n = s_body.bodyLen - s_body.curPos; } needRead = s_body.curPos + n - s_body.bodyCurrentLen; if (needRead < 0) needRead = 0; str = rb_str_buf_new( n ); #if RUBY_API_VERSION_CODE < 20700 OBJ_TAINT(str); #endif if (n == 0) return str; //copy already have part first if (n - needRead != 0) { rb_str_buf_cat( str, s_body.bodyBuf + s_body.curPos, n - needRead); s_body.curPos += (n - needRead); } if (needRead > 0) { //try to read needRead, but may be less (changed) when read the end of the data nRead = readBodyBuf(needRead); if (nRead > 0) { n = ((nRead < needRead) ? nRead : needRead); rb_str_buf_cat( str, s_body.bodyBuf + s_body.curPos, n ); s_body.curPos += n; } } return str; } static VALUE lsapi_rewind(VALUE self) { s_body.curPos = 0; return self; } static VALUE lsapi_each(VALUE self) { VALUE str; lsapi_rewind(self); while(isEofBodyBuf() != 1) { str = lsapi_gets(self); rb_yield(str); } return self; } static VALUE lsapi_eof(VALUE self) { return (LSAPI_GetReqBodyRemain_r( &g_req ) <= 0) ? Qtrue : Qfalse; } static VALUE lsapi_binmode(VALUE self) { return self; } static VALUE lsapi_isatty(VALUE self) { return Qfalse; } static VALUE lsapi_sync(VALUE self) { return Qfalse; } static VALUE lsapi_setsync(VALUE self,VALUE sync) { return Qfalse; } static VALUE lsapi_close(VALUE self) { LSAPI_Flush_r( &g_req ); if (isBodyWriteToFile()) { //msync(s_body.bodyBuf, s_body.bodyLen, MS_SYNC); //sleep(5); munmap(s_body.bodyBuf, s_body.bodyLen); } else free(s_body.bodyBuf); s_body.bodyBuf = NULL; s_body.bodyLen = -1; s_body.bodyCurrentLen = 0; s_body.curPos = 0; //Should the temp be deleted here?! return Qnil; } static VALUE lsapi_reopen( int argc, VALUE *argv, VALUE self) { VALUE orig_verbose; if ( self == s_req_stderr ) { /* constant silence hack */ orig_verbose = (VALUE)ruby_verbose; ruby_verbose = Qnil; rb_define_global_const("STDERR", orig_stderr); ruby_verbose = (VALUE)orig_verbose; return rb_funcall2( orig_stderr, rb_intern( "reopen" ), argc, argv ); } return self; } static void readMaxBodyBufLength() { int n; const char *p = getenv( "LSAPI_MAX_BODYBUF_LENGTH" ); if ( p ) { n = atoi( p ); if (n > 0) { if (strstr(p, "M") || strstr(p, "m")) MAX_BODYBUF_LENGTH = n * 1024 * 1024; else if (strstr(p, "K") || strstr(p, "k")) MAX_BODYBUF_LENGTH = n * 1024; else MAX_BODYBUF_LENGTH = n; } } } static void readTempFileTemplate() { const char *p = getenv( "LSAPI_TEMPFILE" ); if (p == NULL || strlen(p) > 1024 - 7) p = "/tmp/lsapi.XXXXXX"; strcpy(sTempFile, p); if (strlen(p) <= 6 || strcmp(p + (strlen(p) - 6), "XXXXXX") != 0) strcat(sTempFile, ".XXXXXX"); } static void initBodyBuf() { s_body.bodyBuf = NULL; s_body.bodyLen = -1; s_body.bodyCurrentLen = 0; s_body.curPos = 0; } void Init_lsapi() { VALUE orig_verbose; char * p; int prefork = 0; LSAPI_Init(); initBodyBuf(); readMaxBodyBufLength(); readTempFileTemplate(); p = getenv("LSAPI_CHILDREN"); if (p && atoi(p) > 1) prefork = 1; #ifdef rb_thread_select LSAPI_Init_Env_Parameters( rb_thread_select ); #else LSAPI_Init_Env_Parameters( select ); #endif s_pid = getpid(); p = getenv( "RACK_ROOT" ); if ( p ) { if ( chdir( p ) == -1 ) perror( "chdir()" ); } if ( p || getenv( "RACK_ENV" ) ) s_fn_add_env = add_env_rails; orig_stdin = rb_stdin; orig_stdout = rb_stdout; orig_stderr = rb_stderr; #if defined( RUBY_VERSION_CODE ) && RUBY_VERSION_CODE < 180 orig_defout = rb_defout; #endif orig_env = rb_const_get( rb_cObject, rb_intern("ENV") ); env_copy = rb_funcall( orig_env, rb_intern( "to_hash" ), 0 ); /* tell the garbage collector it is a global variable, do not recycle it. */ rb_global_variable(&env_copy); rb_hash_aset( env_copy,rb_tainted_str_new("GATEWAY_Irewindable_input.rbNTERFACE", 17), rb_tainted_str_new("CGI/1.2", 7)); rb_define_global_function("eval_string_wrap", lsapi_eval_string_wrap, 1); cLSAPI = rb_define_class("LSAPI", rb_cObject); rb_define_singleton_method(cLSAPI, "accept", lsapi_s_accept, 0); if (prefork) { rb_define_singleton_method(cLSAPI, "accept_new_connection", lsapi_s_accept_new_conn, 0); rb_define_singleton_method(cLSAPI, "postfork_child", lsapi_s_postfork_child, 0); rb_define_singleton_method(cLSAPI, "postfork_parent", lsapi_s_postfork_parent, 0); } rb_define_method(cLSAPI, "process", lsapi_process, 0 ); /* rb_define_method(cLSAPI, "initialize", lsapi_initialize, 0); */ rb_define_method(cLSAPI, "putc", lsapi_putc, 1); rb_define_method(cLSAPI, "write", lsapi_write, 1); rb_define_method(cLSAPI, "print", lsapi_print, -1); rb_define_method(cLSAPI, "printf", lsapi_printf, -1); rb_define_method(cLSAPI, "puts", lsapi_puts, -1); rb_define_method(cLSAPI, "<<", lsapi_addstr, 1); rb_define_method(cLSAPI, "flush", lsapi_flush, 0); rb_define_method(cLSAPI, "getc", lsapi_getc, 0); /* rb_define_method(cLSAPI, "ungetc", lsapi_ungetc, 1); */ rb_define_method(cLSAPI, "gets", lsapi_gets, 0); //TEST: adding readline function to make irb happy? /*rb_define_method(cLSAPI, "readline", lsapi_gets, 0); */ rb_define_method(cLSAPI, "read", lsapi_read, -1); rb_define_method(cLSAPI, "rewind", lsapi_rewind, 0); rb_define_method(cLSAPI, "each", lsapi_each, 0); rb_define_method(cLSAPI, "eof", lsapi_eof, 0); rb_define_method(cLSAPI, "eof?", lsapi_eof, 0); rb_define_method(cLSAPI, "close", lsapi_close, 0); /* rb_define_method(cLSAPI, "closed?", lsapi_closed, 0); */ rb_define_method(cLSAPI, "binmode", lsapi_binmode, 0); rb_define_method(cLSAPI, "isatty", lsapi_isatty, 0); rb_define_method(cLSAPI, "tty?", lsapi_isatty, 0); rb_define_method(cLSAPI, "sync", lsapi_sync, 0); rb_define_method(cLSAPI, "sync=", lsapi_setsync, 1); rb_define_method(cLSAPI, "reopen", lsapi_reopen, -1 ); s_req = Data_Make_Struct( cLSAPI, lsapi_data, lsapi_mark, free, s_req_data ); s_req_data->req = &g_req; s_req_data->fn_write = LSAPI_Write_r; rb_stdin = rb_stdout = s_req; #if defined( RUBY_VERSION_CODE ) && RUBY_VERSION_CODE < 180 rb_defout = s_req; #endif rb_global_variable(&s_req ); s_req_stderr = Data_Make_Struct( cLSAPI, lsapi_data, lsapi_mark, free, s_stderr_data ); s_stderr_data->req = &g_req; s_stderr_data->fn_write = LSAPI_Write_Stderr_r; rb_stderr = s_req_stderr; rb_global_variable(&s_req_stderr ); /* constant silence hack */ orig_verbose = (VALUE)ruby_verbose; ruby_verbose = Qnil; lsapi_env = rb_hash_new(); clear_env(); /* redefine ENV using a hash table, should be faster than char **environment */ rb_define_global_const("ENV", lsapi_env); rb_define_global_const("STDERR", rb_stderr); ruby_verbose = (VALUE)orig_verbose; return; } PK!x{<<3share/gems/gems/ruby-lsapi-5.7/ext/lsapi/extconf.rbnu[require 'mkmf' dir_config( 'lsapi' ) if ( have_library( "socket" )) have_library( "nsl" ) end if RUBY_VERSION =~ /1.8/ then $CPPFLAGS += " -DRUBY_18" end if RUBY_VERSION =~ /1.9/ then $CPPFLAGS += " -DRUBY_19" end if RUBY_VERSION =~ /2/ then $CPPFLAGS += " -DRUBY_2" end create_makefile( "lsapi" ) PK!0L;1share/gems/gems/ruby-lsapi-5.7/ext/lsapi/lsruby.onu[ELF>@@98 ,.+/*0)1fDHff.HHH+HHODH1f1fATIHUSHcHcLHH=HH[]A\ff.HH5dH%(HD$1HH$Ht-H=HHD$dH3%(u&H@H=HHfDHHH=HfHH=Hc5;5H=|6HHHfDf?IH=HH+9M1~+HHcHc5H5~Hfff.@HH=tHHHDHff.UHSH HHm t]uaHHHtT؃tJ tEHH؉уu5HM u@HHpH}HH[]HD@HuHHMH tHPHpfSHCH[ff.SHHH[ÐHH=HHHH=HHHH=tHHHUSHH=H=HtHH9t H5Ht[11ҿ1H?H-H;HHuHuH;HHHH[]fH=HHSHH\$Ht$HH1HH[ff.fAWAVAUAATIUSHHJfDmHHfKHHt -OkHHu-2 GA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobin GA*GOW*GA*GA+stack_clashGA*cf_protection GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobin GA*GOW*GA*GA+stack_clashGA*cf_protection GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign GA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobin GA*GOW*GA*GA+stack_clashGA*cf_protection GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign GA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobin GA*GOW*GA*GA+stack_clashGA*cf_protection GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign GA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobin GA*GOW*GA*GA+stack_clashGA*cf_protection GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignreplacesrand/QUERY_STRINGREQUEST_URIPATH_INFOREQUEST_PATHSCRIPT_NAMESTDERRreopen%s: %s ftruncate() failed. File mapping failed. Memory calloc error [...]nilLSAPI_MAX_BODYBUF_LENGTHLSAPI_TEMPFILEXXXXXXLSAPI_CHILDRENRACK_ROOTchdir()ENVto_hashCGI/1.2eval_string_wrapLSAPIacceptaccept_new_connectionpostfork_childpostfork_parentprocessputcwriteprintprintfputs<<flushgetcgetsreadrewindeacheofeof?closebinmodeisattytty?syncsync=RACK_ENVGATEWAY_Irewindable_input.rbNTERFACE/tmp/lsapi.XXXXXF 9%I'P(int)@ 9 1 3 6  7  8  9 : ( ; 0 < 8 = @ @ H A P B X D` Fh Hp It J x MP NW O Q Y [ \ ] ^ G _ - ` b  +  9  9 ? M     UJ U   U a}^q!$2 7 ;  f9:IDg9@4 @b     I  @`  @ @ @x@v#w :xF@@  :@5   Z :len ptr aux5Zary  9(as@2 W$Flen aux%2ptr&F'Wary( F 9(as)(sA tu L v L w G L !GA "L ::::::::::::::::::::::::::::::::::::::::::::::::: : : : : ::::::::::::::::::: :!:":#:%:&:':(:*:,:,:,(:G:H:I:J:K::  9 7 89:;<=>#@,     $q=%s%t k m n  o  p  u ,  =                $  ( D D  T4 T 9 d 9                "= " 4 6 7  /k 1 2  3  4 & : < = ? @ B C E( F0 G8 I@ JH KP L!X O` Ph Qp Rx T' V' W' X' Y' Z' \' ]' _ ` a b c d e f g h i'k''m'('n'8'oG    G  -=)d = 9 j(9qks)?!!!!!G-.P  W  c  9 c A W   F*WTQQ  )4?JU`Akv$  !{$$% $% 4% D 4 9 D 9 T 9 o  Too I 9  9@+%:+&:,': ,+: ,-: ,/: ,1  <-req>-env?: @)!!!-AQ,C: ,E: ,F ,H: +I,J~  Ly N O P QR7,Ty  (9,U  .  /7K$09 :1p: 0; 23]*K 4C5U 5T320^6^$0^23^K 4C5U 5T74C5Q05R02`0 :4C5TH5Q 5R|20:4C5TH5Q 5R|7 %=8-%?9:;%:F%8/: :;A:4C5Us5T05Q:<CY5U <Cw5Us5TM<C5Us5Tm<C5Us5TK4C5Us5Tk8%@9:!%8:+^;":;:4C5U 5Ts5Qv5R =9- ;9;9<C5U 4C5Us8/:C;A:4C5T05Q:> D<C@5U >D>$D<Cy5U >1D>>D<KD5U <XD5U 5T7<XD5U 5TA<eD5Q}??5U 5T 5Q1<rD^5U ?5T 5Q 5R0?5T 5Q 5R0?5T 5Q 5R1? 5T 5Q 5R1?@ 5T 5Q 5R ?n 5T 5Q 5R ? 5T 5Q 5R ? 5T 5Q 5R1? 5T 5Q 5R0?#!5T 5Q 5R0?P!5T 5Q 5R0?~!5T 5Q 5R ?!5T 5Q 5R0?!5T 5Q 5R0?"5T 5Q 5R0?2"5T 5Q 5R0?_"5T 5Q 5R0?"5T 5Q 5R0?"5T 5Q 5R0?"5T 5Q 5R0?#5T 5Q 5R0?@#5T 5Q 5R1?n#5T 5Q 5R <KD#5U <KD#5U >D>D>D>b4<D#5U <D$5U >D?X$5T 5Q 5R0?$5T 5Q 5R0?$5T 5Q 5R0<D$5U 4C5U  F$@%$A0 B% -%Cp'B R%Cn CpD:%E E-E9:6 :F3 *K G:g4&H :Iw+ >D>D>DG:v&J":UJ-:TK:&E:D:&E!:G:&J":UG:+C'J:UL8 M8G:Ua(H:1str :=a( ';s(7+ 8)S(;*9N*:+*N8*:C*<>D(O*s>,+>DD:(E!:G|:4)H|H|*H|6:1str~ :1n 0 0 89 w);9>D>D>,+<D)5Us $ &<O*)5U|< E)5U}5Qs $ &4 E5U}5Q| $ &DM:O*EM :CstrO :6PCnQ CpR G8 a+H8"P: 0; 0< 0= 6> 88>+M8>EQ3Q.R K+Cfd Rw+Cfd Csfn QG:2+H :1ch >%EG:%,H!:>DG:,Sout!:Sstr,:4/5Us5TTD:,EE*Tout6:Ci 6 :Do:2-Taryo#:Touto.:Eo7Ctmpq :Cir Gf:-HfHf,Soutf8:<1E-5UU5TT4/5UsGB:O/HBHB,SoutB8:1iD 3E :@8'9Tv.;99<XD.5U~5T3</.5Uv</.5Uv</.5Uv</.5Uv>>E>KEU6:0H6!:Sstr6-:081len9 89:/;94TE5Uv5T<8'9< /;994aE5UsG*:K1H*:Sc*+:Vch, W0-8G9,0;Y9W9f;9<D05Us>D89.$1;94TE5Uv5T<?=15TW5Q1>KEG: ~1J#:UG :32H +:Sstr 7:<nE15Us<{E15Us4E5T0X: S2Y,:>EX: 2Y+:>EX:-2Y,:>EX:H4Y$:Zpid 23[ + $[ 23, K 4C5U 5T54C5U85Q05R0\H4 4;U4>b4<E 45Qs4E5Qs>E>D>$D] b4^)_ z52 5`,*5``24,K 4C5U 5T74C5Q15Rw>KE F*5 95X B6Y)Y3YHYTaarg#G<E55UQ5T R $ &<E55U|5Ts $ &4eD5QvXn B8Yn(Yn2YnGYnSaargo"GZpq blenr <E65U|5T~<E65Us5Tv $ &<eD75Q|<E175U|5T?<EQ75U|5T<XDu75U 5T9<eD75Qw<E75U|5T<XD75U 5T<<eD75Qw<E 85U5T}<XD-85U 5T<4eD5Q}cd 8Yd&dEe8^?e8^<D8Ta:f !:D 9Ta$:Dy'9Tay:D?G9Tobj?:Dae9Txa:D:9Tx:EECDG9Tobj:D9Tx:g:^^g\/:^\^\hiO:Eigdz:^d!^d<ija(:ks(Uj&:k&UjR%;;d%;q%;~%N%WR%;~%;q%;d%9:%l%;4C5U 5T6>D>D<D;5U >DmC5QU5RTj,+>n>+=86<M8Iw+8,+ >9:>+8K+ =9:]+:i+8O: =;l:;`:4F5T15Q 5Rs<F7=5U <FO=5Us<,Fg=5Us<D=5Us>9F>EF4D5Us<RF=5Uv5Ts<_F=5U05Ts5Q35R15Xv5Y0<kF>5Uv<D6>5U <kFN>5Uv<Dm>5U 4kF5Uv<xF>5T14D5U j)?:*N+*:8*:C*;*I+b <O*E?5U <Fx?5U|"5Tv5Q 5R1<D?5Uv4 E5U|5Qvj)*@;*N*o+*N8*pC*>,+m>O*Uj,;B;,;,; -q-@:&-8 9z@;9=e9|@;9;9;w94F5Us88|ZA;8988 DA;84F5Us=,'o B;,; -;,r'q-@N&-<XDA5U 5T54F5U15Tw5Qv<F-B5U15Tw5Qv>KEj,PC;,;,;,N,N,s,qCM,M,M,9:,:,8'9B;99<FC5U 5Qs>aE</>C5Us5T~</VC5Us4XD5U|5T34/5Usttetutwvw/tmp/lsapi.XXXXXXvw .XXXXXXtu{tnttt tttt7ttt0t t  uuL t3 ttttt$u uttxtRttVtWtcttt}uut^tutuZ u Dt t9 u% tt u9ta ttqw lsruby.ctttYt% : ; 9 I$ >  $ > &I I7I I !I/  : ; 9  : ; 9 I8 : ; 9 <4: ; 9 I?<!4: ;9 I?<: ; 9 I> I: ;9 ( (((   : ;9  : ;9 I8  : ;9  : ;9 I : ;9  : ;9 I8  : ;9 I : ;9 I 8 '!I": ;9 I#> I: ; 9 $ : ; 9 % : ; 9 I& : ; 9 ' : ; 9 I8(!I/)'I* : ;9 +4: ; 9 I,4: ; 9 I- : ; 9 I8 .4: ; 9 I?/.?: ;9 @B04: ;9 IB14: ;9 IB2 U34: ;9 I415B64: ;9 I71RB UX YW 81RB UX YW 9 U:41B;1B<1=1RB X YW >1?@!I/ A.: ;9 B.: ;9 C4: ;9 ID.: ;9 'I E: ;9 IF G.: ;9 'I@BH: ;9 IBI1RB X YW J: ;9 IK.: ;9 'IL1RB X YW M1N41O1BP4: ;9 IQ.: ;9 I R.: ;9 I S: ;9 IBT: ;9 IU.: ;9 'I@BV4: ;9 IW1RB UX YW X.: ; 9 'I@BY: ; 9 IBZ4: ; 9 IB[4: ; 9 IB\1RB UX Y W ].: ; 9 ' ^: ; 9 I_.: ; 9 @B`4: ; 9 I a: ; 9 IBb4: ; 9 I c.: ; 9 '@BdB1e.: ; 9 'I f.?: ;9 '<g.?: ; 9 'I 4h.?: ;9 'I ij.1@Bk1l 1UmB1n41 o41p41 q41r s1UX YW t.?<n: ;9 u.?<n: ; 9 v.?<n: ; w6x.?<nOVOTpqPPqP0uVT0V0T0?0T0?0nPP PPSSPS,8P8HSHcTSSH\TpSH\ Tp vv vPUU U  S  P U U  S  P S  S      0  0 U S D UD g Sg u Uu  S U S U T V D TD a Va u Tu  V T V T Q Q P  ] + P+ C ]C D P ] S  SW u P \ v| v| $0 $+(  v $0 $+( ? v $0 $+( v $0 $+(  P PL V Uu | U U u@aUN $ &"^a $ &"O^PNQ^aQpUUPPpUU`lUlqSqrP`lTlrTUUTTQSQPUwwUw1PT]wTTWPQpVpwQwQV{0S8=S0 s $ &3$}") s $ &3$}"UVWUTS,AS&V,WV+PUVS,9S0 U V U V0 S TS S T S PP S TS S S S S U VU3UTUUUUU U!U!UkPP0000SU\UTSTQQRRXX@USSSS@TVTTVTVT_V@Q\3Q3\JQJ_\@{R{]R]RG]G^ R Z]Z_^@XX3X3XJXJ_X7PPP_JTPT__`hUhmU`USQUS`TVRTV`QQQQVRTVSQUS\\rV * Vg q  q V@Y YiPiV * V* 4 P4 VRVPVyS* q SN q U Z pZ ^ UR n Pn \ PD } S  P6 > P * U U T UT S U S U  U T TT V T V T  V T QT Q Q  QT ] } ] ]T _ S Sd  d  |  |d l Sl  S Sv  S S U  U Q  Q T  V1U1.U.:U:PU1T1.T.=T=PT1Q1SQ.S.AQACSCPQ10UP^P.^1_UU,8U 8U/09szsz@ @r0 g < K N _ L W x  X _ l  v  P 08_0cXH\\cXpv@` 0@ $@Lnf /opt/cpanel/ea-ruby27/root/usr/include/ruby/usr/include/bits/usr/include/usr/lib/gcc/x86_64-redhat-linux/8/include/usr/include/bits/types/usr/include/sys/usr/include/netinetlsruby.clsapilib.hruby.hstdio2.hstdlib.hstring_fortified.hstddef.htypes.hstruct_FILE.hFILE.hstdio.hsys_errlist.htypes.hstdint-intn.hstdint-uintn.hunistd.hgetopt_core.hmath.hintern.hversion.hlsapidef.htime.hstruct_iovec.herrno.hsockaddr.hsocket.hin.hsignal.hstring.hmman.hutil.h  JK?K| #t>iK>KK{KY;./*X **}( // RX} t     0Yf q\:>X. t" u t/u* uZ ^  %gfu Z3 X |t |< tXX uKt  .t.  X  f. f *8u t  X    o.@5< t-< ti JJ [X #JiX Y  L( ff#X< x9= t; K1 tQJ/f J L 2  =t<UMtUX&<< ` 0z X .    =Yl  rX[wt Z " h   m grtX  h fY:g< KXfKY sbXtv  SY|X |X<   L/$ eX< z < zt yt5Y|X |.X z  Z rh Y   *xp*suqwZ7Mt -uDXZ;467954644584236:8648: "u{ wt JvI ;tZvpJuI==[X=XvXuv0X>f~z t gz t ` X p((* uv #G< Y(%[$ rb_mWaitWritable_sys_errlistm_pScriptFileRUBY_Qnilrb_eNoMemError_unused2_filenorb_cMethodrb_obj_wb_unprotectrb_eSyntaxErrorm_cntUnknownHeadersH_AUTHORIZATIONsockaddr_isoblockSizem_pIovecEndstrcpym_pRespBufPosRUBY_FL_EXIVAR__uint8_tdmarkRUBY_DATA_FUNCm_pktHeaderrb_eIOErrorm_bytesm_pHeaderrb_data_object_get_shortbufsockaddr_inrb_cFilerb_eSignalunlinklsapi_dataRUBY_T_ARRAYrb_eKeyErroradd_env_rails__environlsapi_addstrsa_datauint16_tm_totalLensin_zeroRUBY_FL_UNTRUSTEDrb_eZeroDivErrorin_port_t_flagslsapi_getscallocm_respPktHeader__off_tcreateTempFiledfreeRUBY_T_IMEMOrb_global_variable_lockROBJECT_EMBED_LEN_MAXRUBY_T_UNDEFrb_cStringrb_eEOFErroratoim_pHttpHeaderLSAPI_GetReqBodyRemain_rm_pScriptNamerb_mKernelm_pEnvListrb_output_fsint32_t__fmtsa_familym_specialEnvListSizeGNU C17 8.5.0 20210514 (Red Hat 8.5.0-26) -mtune=generic -m64 -march=x86-64 -g -O2 -fexceptions -fstack-protector-strong -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection=full -fPIC -fplugin=gcc-annobinrb_cModulesockaddr_ns__u6_addr8RUBY_T_FALSEruby_robject_flagsrb_cIntegerRUBY_T_FILE_IO_write_endm_iLensockaddrrb_cTrueClasss_addrRUBY_FL_USER0RUBY_FL_USER1RUBY_FL_USER2RUBY_FL_USER3RUBY_FL_USER4RUBY_FL_USER5RUBY_FL_USER6RUBY_FL_USER7RUBY_FL_USER8RUBY_FL_USER9nameLenLSAPI_Postfork_Childfreerb_fsm_requestMethodOffRUBY_T_COMPLEXdata_struct_objrb_eEncCompatErrorruby_special_constsvalLenRSTRING_EMBED_LEN_SHIFT__stack_chk_failruby_rarray_flagsruby_descriptionsin_familyRStringm_fdListenMAX_BODYBUF_LENGTHlsapi_bodym_statusm_reqBodyLenrb_eNameErroroptargneedReadrb_eRegexpErrorrb_cBasicObjectRUBY_T_STRUCTrb_cRationalrb_cFloatrb_cClassrb_cStatsys_errlistin_addr_tbasicRUBY_QtrueLSAPI_ReqBodyGetChar_rpKey__uint16_tsin_portRUBY_T_STRINGrb_cContrb_cFalseClassm_flagRARRAY_EMBED_LEN_SHIFTreadMaxBodyBufLengthm_pQueryString_chainRUBY_T_MODULErb_eArgErrorrb_eInterruptrecurrb_funcallvRUBY_FL_SINGLETONsockaddr_ununsigned charcapanReadm_cntSpecialEnv_IO_lock_t__uint32_tRUBY_T_ZOMBIEfloatLSAPI_key_value_pairLSAPI_ForeachHeader_rrb_stderrlsapi_eachm_cntHeadersrb_str_catbodyBufRARRAY_EMBED_LEN_MAXRUBY_T_FIXNUMrb_eSecurityErrorisEofBodyBuflsapi_processlsapi_flushRARRAY_EMBED_FLAGROBJECT_EMBEDoff_tchild_statusRUBY_SYMBOL_FLAGrb_mComparableH_X_FORWARDED_FOR__fprintf_chkm_queryStringOffRUBY_FLONUM_FLAGrb_stdoutruby_rstring_flagsH_CONTENT_LENGTHrb_cTimeruby_engine_IO_write_ptrrb_output_rsROBJECT_ENUM_ENDlsapi_packet_headerLSAPI_ReadReqBody_rrb_eFatallsapi_http_header_indexrb_funcall_argcsTempFilerb_funcall_argsclosesharedlsapi_printfRUBY_T_OBJECTFILEH_COOKIEs_fn_add_envmunmapRSTRING_EMBED_LEN_MAXbodyCurrentLenLSAPI_Accept_Before_Forkrb_cNumerics_req_stderrrb_cHashsize_trb_array_const_ptrH_CONNECTIONrb_rsuint8_tH_CONTENT_TYPERArraylsapi_markm_headerLenRUBY_ELTS_SHAREDperrorlsapi_envruby_release_daterb_cDirsetup_cgi_env_IO_save_baseioveclsapi_eofrb_array_const_ptr_transientenvironlsapi_child_statusreadTempFileTemplaterb_str_newsockaddr_x25rb_eLoadErrorsin6_flowinfom_pIovecToWriteorig_stderrm_respHeaderLen_wide_dataH_IF_MATCHRUBY_FL_PROMOTED0RUBY_FL_PROMOTED1__in6_uH_ACC_CHARSETruby_versionorig_stdout__streamsigngamruby_copyrightm_reqBufSizerb_eExceptionrb_yieldadd_env_no_fixRUBY_T_FLOATRUBY_T_CLASSrb_cDataftruncateruby_fl_typelsapi_requestrb_cComplexfprintfrb_check_typeRUBY_T_HASHsyncRUBY_T_NODEchdir__ssize_t__srcrb_mErrnolsapi_closeH_IF_RANGEnameOffruby_api_versionstrerrorsa_family_tm_packetLenreadMoreRUBY_FL_WB_PROTECTEDin6_addrisBodyWriteToFilelinesin6_addrrb_mWaitReadablelsapi_setsyncm_respPktHeaderEndRUBY_FL_TAINTLSAPI_Postfork_Parentfn_add_envlsapi_printrb_eSystemCallErrorrb_intern2stderrm_pHeaderIndexprogram_invocation_short_namerb_cUnboundMethodrb_f_sprintf_IO_save_endrb_const_get__nptrLSAPI_InitLSAPI_Requestrb_eScriptErrorfn_writelsapi_syncm_bufProcessedstdoutreadBodyBufoptoptlsapi_reopenrb_mGCrb_eIndexErrorm_httpHeaderLencurPosH_IF_NO_MATCHlsapi_s_acceptpreforkRUBY_T_DATAbuffssizetypekeyLenRUBY_FL_DUPPED__builtin_strchrLSAPI_Flush_rshort unsigned intsigned charrb_array_lentz_dsttimefilenamelsruby.clsapi_header_offset__off64_tsockaddr_eon_IO_read_base_offsetm_pIovecrb_string_value_ptrrb_eFloatDomainError_IO_buf_endm_respInfoopterrlsapi_puts_ary_modeblkSize_IO_write_basevalueLenInit_lsapirb_eStandardErrorrb_cSymbolrb_argv0H_CACHE_CTRLH_COOKIE2__destrb_cMatchrb_cEncodinglsapi_isattyH_USERAGENTRARRAY_EMBED_LEN_MASKLSAPI_ForeachEnv_rlong intRUBY_T_NONErb_mProcessrb_mFileTestremain_IO_markerrb_cEnumeratorm_pRespBufEnd__builtin___memcpy_chkrb_io_putslsapi_s_postfork_childrb_define_global_constrb_obj_as_stringm_bufReadin_addruint32_tsockaddr_in6__pid_t_IO_codecvtrb_funcall_nargsH_RANGERDatastrtolg_reqlong doublerb_cRangeiov_lenlsapi_resp_inforb_cObjectlong unsigned intlsapi_req_headerRVALUE_EMBED_LEN_MAXrb_gc_markinitBodyBufruby_strdupm_headerOffrb_eNotImpError__errno_locationlsapi_s_postfork_parentcharsockaddr_inarpm_pSpecialEnvListsin6_scope_idrb_cIORSTRING_ENUM_ENDstdinsin_addrRUBY_T_BIGNUM_IO_buf_baseRSTRING_NOEMBEDRUBY_T_RATIONALRUBY_FL_PROMOTEDs_bodyrb_eTypeErrorRBasicrb_eNoMethodError_IO_read_endRUBY_T_ICLASSrb_num2intcLSAPIRUBY_SPECIAL_SHIFT_IO_FILEH_IF_UNMOD_SINCEm_fdRUBY_T_SYMBOLH_HOSTrb_num2char_inline_IO_wide_datastrlen__u6_addr16s_pidselfrb_eSystemExitisAllBodyReadm_respHeaderrb_cThreadRUBY_FL_SEEN_OBJ_IDm_envListSizem_pAppDataruby_platformsockaddr_ax25RSTRING_FSTRrb_eThreadError__pad5rb_str_new_staticshared_root__u6_addr32rb_cNilClassm_type_markersrb_stdinrb_eStopIterationm_scriptFileOffRUBY_FL_USHIFTklassrb_define_classH_VIA_codecvtm_pRespHeaderBufEndH_PRAGMARUBY_FL_FINALIZErb_cRandomdoublemkstemplsapi_putcargcssize_tstrcatlsapi_writelsapi_putsorig_stdinRUBY_FIXNUM_FLAGargvRARRAY_ENUM_ENDrb_eRuntimeErrorm_pRespHeaderBuf__int32_trb_cProc/opt/cpanel/ea-ruby27/root/usr/local/share/gems/gems/ruby-lsapi-5.7/ext/lsapiRUBY_IMMEDIATE_MASKrb_hash_asetdataH_REFERERrb_cStructLSAPI_Prefork_Accept_rheap_sys_siglistRARRAY_TRANSIENT_FLAGm_pUnknownHeaderrb_typem_reqStateRUBY_T_NILRUBY_T_MOVEDrb_eSysStackErrorm_pRespBufrb_num2int_inlineprogram_invocation_namerb_cArrayrb_eEncodingErrorrb_ruby_verbose_ptrrb_cBindingrb_intern_id_cacheH_TRANSFER_ENCODINGH_IF_MODIFIED_SINCErb_ary_detransientRUBY_FL_USER10RUBY_FL_USER11RUBY_FL_USER12RUBY_FL_USER13RUBY_FL_USER14RUBY_FL_USER15RUBY_FL_USER16RUBY_FL_USER17RUBY_FL_USER18RUBY_FL_USER19_freeres_bufRUBY_T_MATCHlong long unsigned intpid_t_cur_columnlsapi_rewinds_reqrb_eRangeErrorm_pRespHeaderBufPoss_stderr_datarb_eval_string_wrapgetpidm_cntEnvRUBY_T_MASKrb_lastline_getcreateBodyBuf_IO_backup_baseH_KEEP_ALIVE__memcpy_chk_IO_read_ptrrb_eMathDomainErrorrb_fix2intLSAPI_GetReqBodyLen_rrb_gc_writebarrier_unprotectrb_exec_recursivegetenv_freeres_listrb_eLocalJumpError_sys_nerrlsapi_readtimezonepReqlsapi_getcrb_hash_newclear_envrb_cRegexplsapi_binmode_old_offsetstrchrm_pReqBufrb_cNameErrorMesgvalueOffoptindH_ACC_LANGlong long intin6addr_loopback_flags2VALUErb_mMathRUBY_T_TRUEmemmemsin6_familysockaddr_atruby_value_typem_scriptNameOffH_ACCEPTm_lLastActiverb_eNoMatchingPatternErrorlsapi_resp_headersys_nerrin6addr_anym_pRequestMethods_req_dataiov_basem_lReqBeginruby_rvalue_flagsm_versionB0m_versionB1rb_str_buf_newRUBY_FLONUM_MASKruby_patchlevelRUBY_T_REGEXPm_pIovecCurLSAPI_Init_Env_Parametersorig_envm_reqBodyReadRUBY_Qundeflsapi_s_accept_new_connrb_eFrozenErrorsockaddr_dlRSTRING_EMBED_LEN_MASKRUBY_FL_FREEZEunsigned intbodyLensockaddr_ipxrb_default_rsshort intrb_string_value_vtable_offsetpValueenv_copymmaporig_verboserb_data_object_zallocrb_mEnumerableRUBY_Qfalseflagstz_minuteswestsys_siglistH_ACC_ENCODINGsin6_portlsapi_eval_string_wrapGCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)GNUzRx  0D+Xl(BFGA kFBzD O E  HUgHQ G $ayd<2HW I I(\EDL ] CAJ ELEY HW HW-Hd(EAD  DAJ 43ED hAHTFBB E(D0C8GPm 8F0A(B BBBG ,ZAD J ABL 4oAD  AAK pP \4FDA D(F0` (D ABBB j (D ABBE l(G DBBDhBBI B(A0A8D@8D0A(B BBB*HP H IUKI8FBA D(D@ (A ABBE ((<EDG0 AAI HhPFBB A(A0 (F BBBH {(F BBB@OFBB A(D0D@  0A(A BBBJ 8KFBA A(D0 (A ABBE   - )  ?.Yt/01 5 C _"y @"[0+[h` h)wCpPwmB pZz# < xEZ_mw` mpg0aIaUaop2WWr`r1KX   #J o-  X  ` 3D3[3x_@_`  3 N\ @f   4      '  *2  L  d  Uo     '   '   ' 0 2  L Pd Po P  PO          h "$%'./0123-4# ( - @2 )7 < 3A F K LP SU [ ba Zg xm s y           $ * f n s y             ! ' - 3 9 ? E 1K GQ VW ] c i u    ()*+,        & 4 ; @ T k y        /?Sgn% %0;BKhsK",7DWg}   .annobin_lsruby.c.annobin_lsruby.c_end.annobin_lsruby.c.hot.annobin_lsruby.c_end.hot.annobin_lsruby.c.unlikely.annobin_lsruby.c_end.unlikely.annobin_lsruby.c.startup.annobin_lsruby.c_end.startup.annobin_lsruby.c.exit.annobin_lsruby.c_end.exit.annobin_lsapi_process.start.annobin_lsapi_process.endlsapi_process.annobin_lsapi_rewind.start.annobin_lsapi_rewind.endlsapi_rewinds_body.annobin_lsapi_eof.start.annobin_lsapi_eof.endlsapi_eof.annobin_lsapi_binmode.start.annobin_lsapi_binmode.endlsapi_binmode.annobin_lsapi_isatty.start.annobin_lsapi_isatty.endlsapi_isatty.annobin_lsapi_setsync.start.annobin_lsapi_setsync.endlsapi_setsync.annobin_add_env_no_fix.start.annobin_add_env_no_fix.endadd_env_no_fixlsapi_env.annobin_clear_env.start.annobin_clear_env.endclear_envrb_intern_id_cache.15416env_copy.annobin_lsapi_mark.start.annobin_lsapi_mark.endlsapi_mark.annobin_lsapi_flush.start.annobin_lsapi_flush.endlsapi_flush.annobin_lsapi_close.start.annobin_lsapi_close.endlsapi_closeMAX_BODYBUF_LENGTH.annobin_readBodyBuf.start.annobin_readBodyBuf.endreadBodyBuf.annobin_lsapi_getc.start.annobin_lsapi_getc.endlsapi_getc.annobin_lsapi_write.start.annobin_lsapi_write.endlsapi_write.annobin_lsapi_addstr.start.annobin_lsapi_addstr.endlsapi_addstr.annobin_lsapi_printf.start.annobin_lsapi_printf.endlsapi_printf.annobin_lsapi_s_postfork_parent.start.annobin_lsapi_s_postfork_parent.endlsapi_s_postfork_parents_req.annobin_lsapi_s_postfork_child.start.annobin_lsapi_s_postfork_child.endlsapi_s_postfork_child.annobin_lsapi_s_accept_new_conn.start.annobin_lsapi_s_accept_new_conn.endlsapi_s_accept_new_conn.annobin_lsapi_s_accept.start.annobin_lsapi_s_accept.endlsapi_s_accepts_pidrb_intern_id_cache.15429s_req_data.annobin_lsapi_eval_string_wrap.start.annobin_lsapi_eval_string_wrap.endlsapi_eval_string_wrap.annobin_add_env_rails.start.annobin_add_env_rails.endadd_env_rails.annobin_lsapi_reopen.start.annobin_lsapi_reopen.endlsapi_reopens_req_stderrorig_stderrrb_intern_id_cache.15593.annobin_createBodyBuf.start.annobin_createBodyBuf.endcreateBodyBufsTempFile.annobin_lsapi_read.start.annobin_lsapi_read.endlsapi_read.annobin_lsapi_gets.part.2.start.annobin_lsapi_gets.part.2.endlsapi_gets.part.2.annobin_lsapi_gets.start.annobin_lsapi_gets.endlsapi_gets.annobin_lsapi_each.start.annobin_lsapi_each.endlsapi_each.annobin_lsapi_puts_ary.start.annobin_lsapi_puts_ary.endlsapi_puts_ary.annobin_lsapi_sync.start.annobin_lsapi_sync.endlsapi_sync.annobin_lsapi_putc.start.annobin_lsapi_putc.endlsapi_putc.annobin_lsapi_puts.start.annobin_lsapi_puts.endlsapi_puts.annobin_lsapi_print.start.annobin_lsapi_print.endlsapi_print.annobin_Init_lsapi.start.annobin_Init_lsapi.endrb_intern_id_cache.15609rb_intern_id_cache.15614orig_envcLSAPI.LC0.LC1.LC7.LC5.LC4.LC6.LC3.LC2.LC8.LC9.LC13.LC11.LC10.LC12.LC14.LC15.LC16.LC17.LC18.LC55.LC20.LC21.LC25.LC26.LC27.LC28.LC29.LC33.LC34.LC35.LC36.LC37.LC38.LC39.LC40.LC41.LC42.LC43.LC44.LC45.LC46.LC47.LC48.LC49.LC50.LC51.LC52.LC53.LC23.LC19.LC30.LC31.LC32.LC24.LC22.LC54.text.group.text.hot.group.text.unlikely.group.text.startup.group.text.exit.group_GLOBAL_OFFSET_TABLE_g_reqrb_str_newrb_hash_asetrb_funcallvrb_intern2__stack_chk_failrb_gc_markLSAPI_Flush_rmunmapfreeLSAPI_ReadReqBody_rLSAPI_ReqBodyGetChar_rrb_check_typerb_obj_as_stringrb_f_sprintfLSAPI_Postfork_ParentLSAPI_Postfork_ChildLSAPI_Accept_Before_ForkLSAPI_Prefork_Accept_rgetpids_fn_add_envLSAPI_ForeachHeader_rLSAPI_ForeachEnv_rrb_string_valuerb_string_value_ptrrb_eval_string_wrapstrchrrb_str_new_staticrb_ruby_verbose_ptrrb_define_global_construby_strdupmkstempunlinkftruncatemmapcallocperror__errno_locationstrerror__fprintf_chkrb_str_buf_newrb_str_catrb_num2intrb_fix2intmemmemrb_yieldrb_gc_writebarrier_unprotectrb_io_putsrb_ary_detransientrb_exec_recursiverb_default_rsrb_output_fsrb_output_rsrb_lastline_getInit_lsapiLSAPI_InitgetenvstrtolstrlenselectLSAPI_Init_Env_Parameterschdirrb_stderrrb_cObjectrb_const_getrb_global_variablerb_define_classrb_data_object_zallocLSAPI_Write_rrb_stdoutrb_stdinLSAPI_Write_Stderr_rrb_hash_new__memcpy_chkrb_define_global_functionrb_define_methodrb_define_singleton_methodH7*ltl@EOV{**D <8DH*?HF<KUH{*=****"7<AH8XD^HgmTv|T\*)~l0\hq|lllAg  C* D6 C<HSf nuD  <  < @    1 8 G Q *[ c t y    D L H  L <( . LS ] Lc Dy  L <  L < D H  L2 K Y Lc <k q L D H  D Lh           &v*3**@* "8DH#$ %#5%QXL_<fm#$*&'T#(**)** +|,3t:t?,KP\dktv5-d7d6d6d6&d9>6EdX]6ddw|6d6d6d6d6d 6d%*61dAF6Md]b6idy~6d6d6d6d6d 6d$)60dCH6O*Vdj.q*x*/\*0*1,d.*2, 3l"l).8=Bg<l4y<d7d7d7 %/6|HMWch{#  i  $, P X" ""["[[hD[Lhphxwhwww 08dlZZZm$Z,mPmXmaDLapaxaW W0W8rdWlrrr$,PX     D  L p x 3  3 3 _ 3 _0 _8 d _l        $  ,  P  X            D  L  p  x     '   ' 0 ' 8  d ' l   P  P P $P,PX     J  ) . . < C L S Z _ m r !~  1 m B  S l    ' A4 *A N [ h u r  `    N    * L  8+ 38 E R _ l y E  &  [  ,   ' 3 -? [ g #s       [   =    v   " J) u.  ; W j p v ,| z n    ?  n + v  n   a  5 /     w f  }    & K, 2 8 > _D J NP <V \ 6c v b|    Y   )            & 4  ! * "3 1< @E ON ^W m` |j q x  (     X         # r, @ M   !      D b  ) = J   r     % Y3 S ` m P z q        k  # C0 { = J W d Lq b~  %  k  V )    j' 4 A gN [ h u    a ;    k 8    + 8 E R _ l y      3 6 / ]  $  u" / b< I hV uc ] p }  { d  U   '# / ; VG S _  k  K     H  c      P  8    A   p x  _  - % 1 '>  K X e r [ M   * [  ;   j  -  B * 7 'e r  B     R }  ~ 8  * P7 D 9Q ^ l z )  T   .  6    <   2 # @0 = =J y W d /q ~  = 5 4          [' l4 A +N 2\ j x K        @ SL CX Ad q +~   d   V   ,' 4 R F` n | k    q   4    P   5   @   U wb u         c @x& 3p< 4IR }y  } gh  `   " /X8 GE R _ l :z G @ j @    N  # A' ;, ^8 < A `J X aQr1  Z    t  g F B  )10 % 1 5 ~:nP`a `j v z `  P P      @ <;P1Z x    vH    ' 7+ 30pA@cvlv    )19v 0  "q71AN[p1z CxT1 hz$11@U1$_p1*}1f1n0 #1s  B$ 1y1 PA aR 1_ o  1   1 `  1 p !1!p$!5!1B! Q!b!1o! !.!1!!J!1! !f!1!0""1$"03"D"1Q"`"q"1~"`""1"p""1"p""1# #-%#12#A#LR#1S_#`o#########2#1$A$1L$F,$=$11J$Y$j$1Gw$$ $1V$$l$1$$1% w % % 0 .% yS% e% r% % % N% %% %% % % %% &&'&5& A&X& g& w& & & +& & r&`& & &0 ' '4('4D' P' g' s' ?w' 9' ' ' ' ' ' ' ' ' ' @' ' ( @( :( 6"( z&( v+( E( T( b( t( ( -( ( ( ( ( ( ( ( ( h( d( ( ) 7) / ) }) ) !) -) ` 1) \ :)L C) T) X) ])W j)} x) ) ) ), ) * * ,* P* \*s* }* * * * r* ) * % * * * * Y* * * ** +O+ + -+ RL+ Jx+ + F+p+ + + + 7 + 3 ++ +p, , q , m ,&, 2,`U, Y, j, n, s,m, , , , ,  - 3- ?-V- b- : f- 6 k- w- w {- s - - --- -P- -  -  . . \ . R #. '. 6. R:. J?. S.\. m. q. w....8.U.// /2/ >/ B/ S/ ZW/ T\/ h/ l/ }/ / // / / /// / @/ </A0 00 '0 30 ~70 vF0 J0 ^0 j0 Fn0 Dw0P 0 0 o0 i0 0 00 0 0 0 0 0 `1 1  1 %1 >1 L1 X1o1 1 11 1 01 ,1 k1 i11#1-2 T222 =2 A2 F2T2 _2v2 2 2 22 22 2 2 22 O22  3 I 3 E3 !3 &3 0/3 Z :3 >3 C3 t O3 gZ3 ^3 c3 pl3 y3331333 3 63 433 4!4&.4E;4kI4 V4 c4 ]j44 4 Z 4 t 4 g4 @4 44I414 5Z05 R ;5R5 ]5 _a5 Yf5 q5 u5 z5 95 5 5 5 >5 :5 {5 w5566  6@76 B6 F6 K6 V6 ?Z6 -_6 9j6 n6 s6 ~6 6 6 y6 m6 6 6667427`R7ug71)v77771377 881.8C8 y J8`a8 l8 lp8 hu8m8 8 A8 8 A8 5 8 8 9 (9 H9 f9 a9 9 9 99 A9 9 9 : : #: 0: B: P: a:  m: %::p:`: : : +: !: :  ;; "; &; /; 3; <; @; ~E; N; R; [; d;u;1S;;;;1L;;;<<;<.D<.]<@f< Ps< P|< '< <@< < < < < < <N < < f< d< < <_ =1Z=L.=@8=WP=jh=r=5 =< =g ==>> ->1b7># O>} d>1xn> >>>1> > > > > > E> A? }? {? ? -? F?6 j?1y?O ?o ? ? ? ? ? @ /@ 3@ <@ @@ vI@  M@  ^@ y b@ q k@ t@ p@ @ @d @d @ !@ !@ Y!@ U!@ !@ !@l @l @ A !A !A !Av *A ;A !?A !EA _A hA A 2"A ."A o"A k"A "A "A A A1A B .B @B[B "_B "hB T#lB L#uB #yB #B B B a$B _$B $B $BB B %B $BzC C!C?CWCrCBC "C "C C C [C [C C C C C C C }C C D  D D D ID I%D &)D &2D 6D ?D CD LD lPD lYD ]D fD jD sD wD D D D QD QD D D D D D D D D _D _D I D I D \D \D D E E  E E E $ E $ &E *E 2E s6E s?E BCE BLE PE UE YE bE fE oE sE |E IE IE E E E E JE JE E E eE eE ZE ZE E E E E E E E E E F q F q F F  F |$F |-F v1F v:F C>F CFF 8JF 8SF WF `F IdF IlF pF yF +}F +F F F F F F F F F F  C  CJ@f@ C@< LM @k L| @y1Z(! F@! F u 4H0\`pp`p (@p`` 8X@`  l    , @0 lP.symtab.strtab.shstrtab.rela.text.data.bss.rela.gnu.build.attributes.text.hot.rela.gnu.build.attributes.hot.text.unlikely.rela.gnu.build.attributes.unlikely.text.startup.rela.gnu.build.attributes.startup.text.exit.rela.gnu.build.attributes.exit.rodata.str1.1.rodata.str1.8.rela.data.rel.local.rodata.cst16.rela.debug_info.debug_abbrev.rela.debug_loc.rela.debug_aranges.debug_ranges.rela.debug_line.debug_str.comment.text.hot.zzz.text.unlikely.zzz.text.startup.zzz.text.exit.zzz.note.GNU-stack.note.gnu.property.rela.eh_frame.group/@6/T6/l6/6/6 @x8"6&, 61@6 6 Lt'[t'V@C06 uH)H)@C06++@D06,,@0D062.20%'0"@`D670J0FE@xDx6Vw/i~8%d@86 y+0t@(06"[@X6%00.uL   %0 @p064 @7 `6PK!'ثث1share/gems/gems/ruby-lsapi-5.7/ext/lsapi/lsapi.sonuȯELF>S@X@8 @&% P P !P ! h h !h !888$$ Std PtdpppQtdRtdP P !P !GNỤLLis?C H‚3@(L`qCSlP*fRn}'3qѮl>&Sɶ ܮʼnSO`[is|&߱RD/y7řkՊ eY&09=By:%/=ejOzJ6'l#mNULCB1{!\$O#W23S=apbU06aD7jp#7ĴDIΊ=\4yݾCEкQuo rSѮIo|q%h6 󝵛 ' =qX[ u  f ! ysO[ |  [7 P + k & !\  2LRT s ? + q ux >A  # -r cH  "./  " "$7x n, 9  A 9 4, 2( F"Xf E  L r `G  |F pD   K 5 ti~ P 0z! b p. 8! ] @Z\ e n  v 1 p Y ` o@   Prl yj U P| 0- q]   n pY n  5 Po `w$ }l! s U T E @u qS m7 mT @(   Г  {F @qJ p @! |I   p  !b 0g ` P@$ '! l 6 0n  ` @!__gmon_start___ITM_deregisterTMCloneTable_ITM_registerTMCloneTable__cxa_finalizecompareValueLocationset_skip_writesigactionsigemptyset__stack_chk_failreallocfcntlacceptsetsockoptmmapmemsetsetsidread__errno_locationclosewritevkillgetppid__ctype_b_locstrncpystrchrstrcasecmpstrtolgetaddrinfomemcpyfreeaddrinfoinet_addrLSAPI_Log__vfprintf_chk__snprintf_chkgetuid__fprintf_chkgettimeofdaylocaltime_rwaitpidforksystemexitlsapi_perrorstrerrorLSAPI_is_suEXEC_DaemonLSAPI_StopLSAPI_IsRunningLSAPI_Register_Pgrp_Timer_CallbackLSAPI_InitRequestmallocgetpeernamedup2LSAPI_Initgeteuidsignalg_reqdlopendlsymLSAPI_Is_Listen_rLSAPI_Is_ListenLSAPI_Reset_rLSAPI_Release_rfreeLSAPI_GetHeader_rLSAPI_ReqBodyGetChar_rLSAPI_ReqBodyGetLine_rmemchrmemmoveLSAPI_ReadReqBody_rFlush_RespBuf_rLSAPI_GetEnv_rstrcmp__ctype_toupper_locLSAPI_ForeachOrgHeader_rqsortLSAPI_ForeachHeader_rLSAPI_ForeachEnv_rLSAPI_ForeachSpecialEnv_rLSAPI_FinalizeRespHeaders_rLSAPI_Flush_rLSAPI_Write_Stderr_rgetpidgetcwdmemccpy__realpath_chkLSAPI_Finish_rLSAPI_End_Response_rLSAPI_Write_rLSAPI_sendfile_rsendfileLSAPI_AppendRespHeader2_rstrlenLSAPI_AppendRespHeader_rLSAPI_CreateListenSock2socketbindlistenunlinkLSAPI_ParseSockAddrLSAPI_CreateListenSockLSAPI_Init_Prefork_ServercallocsetpgidsysconfLSAPI_Set_Server_fdLSAPI_reset_server_stateis_enough_free_memLSAPI_Postfork_ChildLSAPI_Postfork_ParenttimeLSAPI_Accept_Before_Fork__fdelt_chkusleepsched_yieldLSAPI_Set_Max_ReqsLSAPI_Set_Max_IdleLSAPI_Set_Max_ChildrenLSAPI_Set_Extra_ChildrenLSAPI_Set_Max_Process_TimeLSAPI_Set_Max_Idle_ChildrenLSAPI_Set_Server_Max_Idle_SecsLSAPI_Set_Slow_Req_MsecsLSAPI_Get_Slow_Req_MsecsLSAPI_No_Check_ppidLSAPI_Get_ppidLSAPI_Init_Env_Parametersgetenvgetpwnamdlerrorsetrlimit__fxstatsetreuidLSAPI_ErrResponse_rlsapi_MD5Initlsapi_MD5Updatelsapi_MD5FinalgetpwuidsetgidsetgroupssetuidstrtollprctlinitgroupsLSAPI_Accept_rLSAPI_Prefork_Accept_rsigaddsetsigprocmaskLSAPI_Set_Restored_Parent_PidLSAPI_Inc_Req_Processedselectrb_str_newrb_hash_asetrb_funcallvrb_intern2rb_gc_markmunmaprb_check_typerb_obj_as_stringrb_f_sprintfs_fn_add_envrb_string_valuerb_string_value_ptrrb_eval_string_wraprb_str_new_staticrb_ruby_verbose_ptrrb_define_global_construby_strdupmkstempftruncaterb_str_buf_newrb_str_catrb_num2intrb_fix2intmemmemrb_yieldrb_gc_writebarrier_unprotectrb_io_putsrb_ary_detransientrb_exec_recursiverb_default_rsrb_output_fsrb_output_rsrb_lastline_getInit_lsapichdirrb_stderrrb_cObjectrb_const_getrb_global_variablerb_define_classrb_data_object_zallocrb_stdoutrb_stdinrb_hash_new__memcpy_chkrb_define_global_functionrb_define_methodrb_define_singleton_methodlibruby.so.2.7libm.so.6libc.so.6__environ_edata__bss_start_endGLIBC_2.14GLIBC_2.15GLIBC_2.4GLIBC_2.3.4GLIBC_2.2.5GLIBC_2.3/opt/cpanel/ea-ruby27/root/usr/lib64 ) 4 ii ? ti I ui U ii a P !PTX !T` !` ! ! ! !A ! ! !# !) !. !4 !; !J !Z !j !x ! ! ! ! ! ! !( !0 !8 !@ !H !P !X ! ` !!h !p !,x !< !@ !R !^ !r ! ! ! ! ! ! ! ! ! !  ! !' !: !Q( !_0 !r8 !@ !H !P !X !` !!!!!!!!$#!8!X!`!h!p!x!!!!!2!!<!H!J!R!V!V!W!!!m!{!!! !(!0!8!@!H!P!X!`!h!p! x! ! ! ! !!!!!!!!!!!!!!!!! !(!0!8!@!H!P!X! `!"h!#p!x!$!%!&!!'!(!!)!!!!*!+!,!-!!!!!.!/ !0(!0!18!@!H!3P!4X!5`!6h!7p!8x!9!;!=!>!?!@!!A!B!C!D!E!F!!G!!I!K!L!M!N !O(!0!P8!Q@!H!SP!X!T`!Uh!Xp!Yx!Z![!\!]!^!!_!`!!a!b!c!d!e!f!g!h!i!!j!k !l(!0!8!n@!oH!pP!qX!r`!h!sp!tx!u!w!x!y!z!|!!}!~!!!!!!!!!!!! !(!0!8!@!H!P!HH) HtH5r %s hhhhhhhhqhah Qh Ah 1h !h hhhhhhhhhhqhahQhAh1h!hhhh h!h"h#h$h%h&h'qh(ah)Qh*Ah+1h,!h-h.h/h0h1h2h3h4h5h6h7qh8ah9Qh:Ah;1h<!h=h>h?h@hAhBhChDhEhFhGqhHahIQhJAhK1hL!hMhNhOhPhQhRhShThUhVhWqhXahYQhZAh[1h\!h]h^h_h`hahbhchdhehfhgqhhahiQhjAhk1hl!hmhnhohphqhrhshthuhvhwqhxahyQhzAh{1h|!h}h~hhhhhhhhhqhahQhAh1h!hhhhhhhhhhhqhahQhAh1h!hhhhhhhhhhhq% D% D% D% D% D% D% D% D% D% D% D% D% D% D%} D%u D%m D%e D%] D%U D%M D%E D%= D%5 D%- D%% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D%} D%u D%m D%e D%] D%U D%M D%E D%= D%5 D%- D%% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D%} D%u D%m D%e D%] D%U D%M D%E D%= D%5 D%- D%% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D%} D%u D%m D%e D%] D%U D%M D%E D%= D%5 D%- D%% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D% D%} D%u D%m D%e D%] D%U D%M D%E D%= D%5 D%- D%% D% D% D% D% D% D% D% D% D% D% D% D% D% D% DH= H H9tH Ht H=i H5b H)HHH?HHtH HtfD=% u+UH=ʻ Ht H=. d ]wff.N ÐHGH+FHcAVIH@AUATL$USHtQHHtIHIL9r 0HI9v'KHSMsH;Յ[]A\A]A^[D]A\A]A^øff.f=^ D ÐO AWDD_AVAUATUSD6^nAxj׋G3G D!3G V\$ЋW^$DD1\$!3WAʋN Fp $E‰L$A1A1DD^ !D1G;νD\$DEDVDT$A!A1EE|A 1AD!E1DD*ƇGD1D!A1A1DDN DL$E F0D!DnA1D1DGFEDf Dd$D^(A!A1EEؘiA 1AD!1DDDʋ^0D1D!A1DE [D 1!D1DDN,A1DL$G\EA!Df8A1ED"kA 1AD!1DDN4EqDD1!1DE CyD 1!D1DDV<1G!I!1DDD$ Eb%1!1DDD$E@@1!1DDD$ EQZ^&1!1DE6Ƕ1!1DD]/։ 1!1DESD1!1DE ؉ 1!1DDD$E01!1DDD$ E!1!1DE7É1!1DDD$ E 1!1DDD$A0ZEAA1A!A1AA㩉A AD1!1t$DD1!A ogD1 1D!FL*1DD$Ή1AA!B9A1DD$A AD1D$qDD11‹D$ 0"amD1G 81Ɖ11DDD$ ED꾤11DDD$AKAA1A5`KA1AЉApA 1AD1D1D1A ~(D 1G'111DDD$ A0AA1A1AЋT$A2A1D1֋T$ 9ىDD11D11C|A A1A1AD$A0eVĉA1D1AD")Dt$ D D1A *CDG# 1  1DD9Ή 1DDY[e\$  1DE Dt$ щ1DE3}D\$  1DDD$E] 1DEO~oA AD 1DE ,DT$ A1ADE6CDt$ AN 1A~SADEAA A1A5:ADA AD 1Љ3*\$D D1DFӆ[ ]A\A]A^ 1։ 1DƉA4A_ OW GOW ATI1USHdH%(H$1HHH<$t)H$dH3%(u TH=o 1XtIɲ tH=` -HcH5`HEHf [ÉD1?H= `HW(Hw`HLJHHLJ0HHWHVHWHWHWHWH)81HSHHHt:HHt)HHtH{@Ht 1[fDHtGwBLHcAT4t/HcApHHH€:t HH1ff.fHtPtJSHcH;}HSHH[~ Hcи[ÃAWAVAUATUSHZHHHD$H:GH%HIHIIILfDA)HcHL9HcIOIvI HLHtML)HLHXHHAIA$D)EH[]A\A]A^A_LHHHAL|$II)AM?DLLHcH~A-H1|v@AVAUATUSHIHHHHHH+E1HH9HcHO؋)HH~)H9HwHHNHHIELL)Ht6Eu@HHDjHu48u @ uMt-M[L]A\A]A^H~IHH)uIDHO(HW8HLJLSH)ʍBHGpH0HpH@Hwp~HcHHH HPHO8HGpAWAVAUATUSHHHT$HHH<$IH=\HcB$HH@H,H9rZf.HH9vGH3LluHCH[]A\A]A^A_HD$L9IM9f.1H[]A\A]A^A_H$1L={ L@Al4tI4LHHuHD$HcP 1~H $HLMtM9sHH$ID$HD$@IcMIcmH,$L| L9)A\$){H8HD$'-t _HHI9tHU:t8IcU IcEH$H€:H $HcHcAVHH€:@AVAUATUSL$HH $L9uHdH%(H$@1HHHHHHE1L LgfHHcHcT4t7 qHM HIcAHL EHT DT t HHuHHcP HHL L9IcIHLfHH I9HcHHc0AHLcP IHcHHBDBHJH H2JAuH  L$DIH Ic LEtaE1@AI E9~CAMIUIAuI}ӅH$@dH3%(u6H@[]A\A]A^D1@IcUL{8IHC0L)H9>Lt$L+{(LA@LLfIM)MK H@σLSLCpNIHDI0HI@HKpM~HC(MxIH E1I@HC8HL1HMLIHHKpH9eHmthILM)MUI9t HItDL+t$HL[]A\A]A^A_DM@@M)(KIHt$HLHk8f.HAVLAUIATIUSHu\H߉{AD${LǃLSHu0{L[L]A\A]A^k[H]A\A]A^Hff.AWAVAUATUSHHHHD$ 0xIHIH Lc\CHcT t u(HDLcLH t tLÅ~6HcAT t u#H@Å~ALH t tE<AG=I|$PHHTI9T$Hs7HI+t$@L2%))I|$PLHHcAMt$PHLIFID$PA:I|$P}MD$PII@ID$PAIc$0fET8HЃA$0D$ H[]A\A]A^A_D$ ff.H HB=0AUATUSHcHfDA< t< uH؅uH[]A\A]IHPHHDI9D$Hs3HI+t$@L2%))tQI|$PHHAPI\$PHCID$PIc$0fET8HЃA$0H1[]A\A]øSDAUATAUHSH?dH%(HD$1D$ff t1fHL$dH3 %(H[]A\A]ÐA1ҾÃtʼnǺ1HL$Aߺؿu#DH'uD o߻D HZDeOAkDH}An}NcHtff.USHdH%(H$1HHu/HH$dH3%(uHĘ[]Կ@1H= tAUATA'USH 'DNuD H@AHH HHtH- t iƉlj JUDk H DcEuD蟹jf.H=j>H=F 11H\$HCX= f= DH Htxff.H HtxxHe Ht~xHE Ht~xH% Htxff.= D D Ð DAUATUHH=0=SH8dH%(H$(1mHtH H= H=<FHE1 H边H=<Ht 1H薹x H=<HHt 1HmIAąWE1H=<Ht 1H<ߌ H=<蚳HtHǺ 1菳H=<sH H=<THtHǺ 1иYH=p< H1 H蘸OH=V<HtHǺ 1oH=D<̲HtHǺ 1H1H=5<襲HtHǺ 1!H="<~HtHǺ 1òH=<WHt]H=<AHt 1H轷 _H=;Ht 1H菷Ջ Dn ` R EH=;H=2 u P% 5 H=;蓱H 1H  …t Hw HHHHD L;L ;L;C HLt@HֹL€D t%HtAHHt9HLuHfDHJHHJHuHHu1ۉH$(dH3%(H8[]A\A]fD H趲D1 sAHc讲L%w HH a裮Åt= @R u \ 5b `HH5=uHH5y=1u HH5=Fff.AVIAUEATIUHSHt4Hu!(fDHH褭HLwH]HuMtEL[1]A\A]A^ÐIcLLH#EgHGHHܺvT2HGAWAVAAUIATUHoSH1HGO@ƉWDW?t;AĉDHH|@D)A9rhAGt4LLDHL9A?vWEfAIIIH޺@HH@ HLL9uA?DLHH[]A\A]A^A_ܱIATLfUHSFH?LHz?)ƒw=t19rLHfCAD$AD$ ID$071)2HCHLHCP?o H{1HMHHCPH)KXH[]A\ff.fAWAVAUATUSHdH%(H$1Ht^ IAfMcg IoA_@LHCHuMX8u =~ uٽH$dH3 %( HĨ[]A\A]A^A_f~AAuIALJf8LS|xr@tPHf@HPXN MgA;G ZA9~uEo)HHcIHLD2Hu$G85} uAMgA9ID$,HD$HcIIDhAh(A9}A /HcIH4@HeHAIIh$A9}A HcIH4@HHAIIHl$p(ILHIILp$hMIc@o9gIcP[9SIcpG9?IcH39+IHHHHIHT$IIc@ H)IHHIHHHIHIIcHIHHHD$I9E1DL4t9dfH "H IGAG IPH f@ f@ HHP P H HPPHHPPHHPPHHPPf@f@f@HH#PP H H'P#P$H$H+P'P(f@f@!f@%H(P+f@)I1 fDIHcȋL4t#fBIHT4 rfB@2JHHuMIcP IHHH9pH@ppHH@ppHH@ppHH@ppHH@ppHH@ppHH@ppHH@pHH9wMApIbIc@ IH0:| ALJt`{ { A{ 1LHcϩIHIGAo IuID%{ D-{ B(AA1IcH4IILI 9HqH=, IJDB(9xHqH=, XIJB($AD$IKAzHL$;Mbfo{ Lt$ LAoL$AT$Ml$)$踪 LL8HL$LH#LLH$ID$H$I3L$H1H D$$Dl$EDDl$H=Dz IHIDz MH=y t"LDLŃP|$臨Et$A9uHt$螤D=Ń5y $A?D5y t @AH5(L*HtHHy f)gy #AH5k 1KH@H5J*1YLH 1H菤IH5421H5Y21D%x x DD$4H=x IHtZEW7E1111H=e2H5)1耨E|$迦M2;|$藦E1H5)LuI}觧Ń1H5a)LKfD=w -w w ED$AIFH5(1覧HH)H5h0H1聧1H5(L 1H50LA#LH c2Hr 解1H5(Laff.AVAUATUSHdH%(H$1D$ HH ;1Ll$Ld$Lt$ HklRr {ul;LLD$CHv Ht@HDv Ht{1f|$=u u|H4tH舴H`q d1H$dH3 %(u}HĠ[]A\A]A^D賜 {H5 h \Hfы{LA; ff.AWAVAUATUSHD=Du dH%(H$1ExH@H-yt H}u ;>g DH-u Ht 1aHEDp EH$L|$PDcA:E1AfD Ep EDt EtHt Ht @fLH1HIc臝DHD$PHD$XA ?)ѺHH D9#11A|$MHo D9#Ht Ht @D9#f AD91葳fH$dH34%(' H[]A\A]A^A_KL$HDŽ$hMl$H$L̞H$LHHD$@迚AHLDŽ$hH$腞H$LHHD$0xPH$LHHD$8S+H$`L HHD$(.H$ LHHD$H ADžHD$PE1Ll$`HD$H$HD$H$`HD$fD%q EHq Ht H=m 1蔞IL9t<1ձL5EDu EME1VFHm LH1HHc}՚}LD$LHD$PHD$X ?)ѺH1H T`1Vm  '8Ht$(1ҿ 轘x=_5p tHq Ht @f,D9# DCHp Ht@Hp HtDc1DN 0l =o {H5b HH1p Ht*Hap HB(@HAp Ht@Ho H@˖8B-DAD9M=bk 譟=Fk Ho HtDH`o Ht A9HAo HtD҉T$$DE ~:E~5WT$$A˙A輙AuDE UM D9vHn AHtDH5Z&1ƞD$藕0 H=? gT$fD}蠩C1mH|$IH|$HT$Ht$1萔61E Mt AMgMg{E1cCHt$1ҿ;H=d(Gf;)>fDD$$菔0d T$$WH=ST$WT$fDD#AfD^m RDh EBH+m H29h {H5u_ ДH{wH=&f̓H=='0讖MAH… H{HLh H=:Ht$1ҿ贒Hk bl L=bl Hl H%l 'l Hk HtH\X 11L='l AGHk Ht{1蝦D-~g EuHk Ht!E9~Zg Xk ;t Ht$@1ҿL$ Ht$01ҿHt$H1ҿHt$81ҿ֒Ht$(1ҿ ŒkHLSH$&$ޒL$踒Yj j H=/"J%˚,H=$"QHj Ht*fC1CD$CCT$HC(HC tj fD=nj lj ff.@H%f f.ffDn Hff.HV HH+HHODH1f1fATIHUSHchHcLHZH=n HH[]A\ff.HH5ui dH%(HD$1Hm H$Ht-H=m HHD$dH3%(u&H@H= &跘HH i ffDHSHH=QU 謏HfHH=1U 茏Hc5l ;5d H=l |6Hl Hl l HfD蛎f?IH=T HH+9M1~+HHcHc5il H5Vl 聐~Sl Hfff.@HH=QT |tHHHDHff.UHSH H6Hm t]uaHHHtT؃tJ tEHH؉уu5HM u@HHpH}HH[]HD@HuHߎHMH tHPHpfSHCH[ff.SHSHH[ÐHH=!S LHmb HHH=S \HMb HHH=R 輑tH#b HHUSHH=R :H=ej HtKHPj HLj Jj 腍9Gj t H5e 8j Ht[11ҿ}1H$j ?H-Q H;HHu艔HuH;HjH[a HH[]fH="HHme SHH\$Ht$HH-1HH[ff.fAWAVAUAATIUSHHJfDmH{HfKHu{Ht -gN OkHU{Hu-JN 2HHAnonymous mmap() failedlocalhost%02d:%02d:%02d [%s] [UID:%d][%d] %.*syesnosystem()%s, errno: %d (%s) /dev/nulllibpthread.sopthread_atforkHTTP_[UID:%d][%d] %s:%s: %s LSAPI: jail() failure./etc/Can't set signalsaccept() failedLSAPI_STDERR_LOGPHP_LSAPI_MAX_REQUESTSLSAPI_MAX_REQSLSAPI_KEEP_LISTENLSAPI_AVOID_FORKLSAPI_ACCEPT_NOTIFYLSAPI_SLOW_REQ_MSECSLSAPI_ALLOW_CORE_DUMPLSAPI_MAX_IDLEPHP_LSAPI_CHILDRENLSAPI_EXTRA_CHILDRENLSAPI_MAX_IDLE_CHILDRENLSAPI_PGRP_MAX_IDLELSAPI_MAX_PROCESS_TIMELSAPI_PPID_NO_CHECKLSAPI_MAX_BUSY_WORKERLSAPI_DUMP_DEBUG_INFOnobodyLSAPI_DEFAULT_UIDLSAPI_DEFAULT_GIDLSAPI_SECRETLSAPI_LVE_ENABLEliblve.so.0lve_is_availablelve_instance_initlve_destroylve_enterlve_leavejailPHP_LSAPI_PHPRC=packetLen < 0 packetLen > %d Bad request header - ERROR#1 ParseRequest error SUEXEC_AUTHSUEXEC_UGIDLSAPI: setgid()LSAPI: initgroups()LSAPI: setgroups()LSAPI: setuid()Bad request header - ERROR#2 lsapi_accept() errorPragma: no-cacheRetry-After: 60Content-Type: text/htmlDEBUGNOTICEWARNERRORCRITFATALAcceptAccept-CharsetAccept-EncodingAccept-LanguageAuthorizationConnectionContent-TypeContent-LengthCookieCookie2HostPragmaRefererUser-AgentCache-ControlIf-Modified-SinceIf-MatchIf-None-MatchIf-RangeIf-Unmodified-SinceKeep-AliveX-Forwarded-ForViaTransfer-EncodingHTTP_ACCEPTHTTP_ACCEPT_CHARSETHTTP_ACCEPT_ENCODINGHTTP_ACCEPT_LANGUAGEHTTP_AUTHORIZATIONHTTP_CONNECTIONCONTENT_TYPECONTENT_LENGTHHTTP_COOKIEHTTP_COOKIE2HTTP_HOSTHTTP_PRAGMAHTTP_REFERERHTTP_USER_AGENTHTTP_CACHE_CONTROLHTTP_IF_MODIFIED_SINCEHTTP_IF_MATCHHTTP_IF_NONE_MATCHHTTP_IF_RANGEHTTP_IF_UNMODIFIED_SINCEHTTP_KEEP_ALIVEHTTP_RANGEHTTP_X_FORWARDED_FORHTTP_VIAHTTP_TRANSFER_ENCODING%04d-%02d-%02d %02d:%02d:%02d.%06d Child process with pid: %d was killed by signal: %d, core dumped: %s Possible runaway process, UID: %d, PPID: %d, PID: %d, reqCount: %d, process time: %ld, checkpoint time: %ld, start time: %ld gdb --batch -ex "attach %d" -ex "set height 0" -ex "bt" >&2;PATH=$PATH:/usr/sbin lsof -p %d >&2Force killing runaway process PID: %d with SIGKILL Killing runaway process PID: %d with SIGTERM Children tracking is wrong: Cur Children: %d, count: %d, idle: %d, dying: %d LSAPI: LVE jail(%d) result: %d, error: %s ! Invalid custom stderr log pathFailed to open custom stderr logCan't set signal handler for SIGCHILDReached max children process limit: %d, extra: %d, current: %d, busy: %d, please increase LSAPI_CHILDREN. LSAPI: failed to open secret file: %s! LSAPI: failed to check state of file: %s! LSAPI: file permission check failure: %s LSAPI: failed to read secret from secret file: %s LSAPI: Unable to initialize LVERequest header does match total size, total: %d, real: %ld LSAPI: missing SUEXEC_UGID env, use default user! LSAPI: SUEXEC_AUTH authentication failed, use default user! LSAPI: lve_enter() failure, reached resource limit.prctl: Failed to set dumpable, core dump may not be available!sigprocmask(SIG_BLOCK) to block SIGCHLDsigprocmask( SIG_SETMASK ) to restore SIGMASK in childfork() failed, please increase process limitsigprocmask( SIG_SETMASK ) to restore SIGMASKCache-Control: private, no-cache, no-store, must-revalidate, max-age=0PID 508 Resource Limit Is Reached

Resource Limit Is Reached

The website is temporarily unable to service your request as it exceeded resource limit. Please try again later.
          replacesrandQUERY_STRINGREQUEST_URIPATH_INFOREQUEST_PATHSCRIPT_NAMESTDERRreopenftruncate() failed. File mapping failed. Memory calloc error[...]nilLSAPI_MAX_BODYBUF_LENGTHLSAPI_TEMPFILEXXXXXXRACK_ROOTchdir()to_hashCGI/1.2eval_string_wrapLSAPIacceptaccept_new_connectionpostfork_childpostfork_parentprocessputcwriteprintprintfputs<<flushgetcgetsreadrewindeacheofeof?closebinmodeisattytty?syncsync=RACK_ENVGATEWAY_Irewindable_input.rbNTERFACE/tmp/lsapi.XXXXX;{ \f(q@rTrh r|rrr z8zl {p{{p|},p~| DЀl0,x0P px P$ `8 pL Ў` | P `@ ВT  @X l p p  0| xDЪX0lp @ P4`H\p 0@P<л|TPPp,@Th| p  8@X0Pp0P `d P$8d0zRx $X FJ w?:*3$"Db \mpmm LmsEIB E(A0z (A BBBI A (D BBBA m m@mYGJB B(A0A80F(B DBb0TtBFC G  AABK   AABG xEO D  A @$ T hY|hJEDS ]Ph H XAH$lFBB B(A0A8LP 8A0A(B BBBH <H FBB A(A0 (D BBBI \i`ptFBB B(A0A8DP~ 8A0A(B BBBA k 8A0A(B BBBH L0$FBB A(A0H Q D 0A(A BBBH L$FBB B(A0A8G 8A0A(B BBBF tFFX$nCXJLlFBB B(A0A8DA 8A0A(B BBBA `( ܏BBB B(A0A8G I K I L N N w 8A0A(B BBBI 0 xBMD GL  AABA < =BAA G L@I@U  AABG $ TWEHG ( \ag H SHL FBB B(A0A8DPS 8D0A(B BBBF T lbIE D(C0P (F BBBM Q(H BBBAH FBB B(A0A8DP 8A0A(B BBBA T< xCBA A(G0` (A ABBD  (C ABBA J8 @-FBD D(D@T (A ABBB  4( @lECGF AAI L !cBG A(D0 (A ABBE XD0` dt pZ 10 pFAA G@7  AABF  $@LsL HFBB B(A0A8G 8A0A(B BBBG < P  d x  ( 4 @ L  H  D@ << FBA K(G (A ABBG <X FEE D(D0M (C BBBB L(HhFBH E(A0E8I@ 8A0A(B BBBE ( FED ABH$ BBB B(A0A8G 8A0A(B BBBJ DpDFBB A(A0G 0A(A BBBF L FBB B(A0A8G  8A0A(B BBBA \h4p Hl\x+p(BFGA kFBzD O E   HU gHQ G <haydT2HW I I(tEDL ] CAJ dELhEYl HWt HW|-Hd( EAD  DAJ LX3ED hAHlxFBB E(D0C8GPm 8F0A(B BBBG ,LZAD J ABL 4oAD  AAK pP \ 4FDA D(F0` (D ABBB j (D ABBE l(G DBBDBBI B(A0A8D@8D0A(B BBBl*HP H I|UKI8FBA D(D@ (A ABBE @(TEDG0 AAI H$PFBB A(A0 (F BBBH {(F BBB@(OFBB A(D0D@  0A(A BBBJ 84KFBA A(D0 (A ABBE GNUPTT` !A#).4;JZjx !,<@R^r ':Q_r   k p> P !X !o` !.@&p o%oo($oDh !>>>>>>?? ?0?@?P?`?p?????????@@ @0@@@P@`@p@@@@@@@@@AA A0A@APA`ApAAAAAAAAABB B0B@BPB`BpBBBBBBBBBCC C0C@CPC`CpCCCCCCCCCDD D0D@DPD`DpDDDDDDDDDEE E0E@EPE`EpEEEEEEEEEFF F0F@FPF`FpFFFFFFFFFGG G0G@GPG`GpGGGGGGGGGHH H0H@HPH`HpHHHHHHHHHII,LSLSLSLS!$#!GCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)GA$3a1SSGA$3a1p>>GA$3a1GA$3a1SYT GA$3p1113`TGA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobin GA*GOW*GA*GA+stack_clashGA*cf_protection GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign GA*FORTIFY`TeTGA+GLIBCXX_ASSERTIONS`TeT GA*FORTIFYeTTGA+GLIBCXX_ASSERTIONSeTT GA*FORTIFYTTGA+GLIBCXX_ASSERTIONSTT GA*FORTIFYTUGA+GLIBCXX_ASSERTIONSTU GA*FORTIFYUUGA+GLIBCXX_ASSERTIONSUU GA*FORTIFYU/UGA+GLIBCXX_ASSERTIONSU/U GA*FORTIFY/U\GA+GLIBCXX_ASSERTIONS/U\ GA*FORTIFY\]GA+GLIBCXX_ASSERTIONS\] GA*FORTIFY]]GA+GLIBCXX_ASSERTIONS]] GA*FORTIFY]]GA+GLIBCXX_ASSERTIONS]] GA*FORTIFY]5^GA+GLIBCXX_ASSERTIONS]5^ GA*FORTIFY5^^GA+GLIBCXX_ASSERTIONS5^^ GA*FORTIFY^_GA+GLIBCXX_ASSERTIONS^_ GA*FORTIFY_`GA+GLIBCXX_ASSERTIONS_` GA*FORTIFY`aGA+GLIBCXX_ASSERTIONS`a GA*FORTIFYaaGA+GLIBCXX_ASSERTIONSaa GA*FORTIFYabGA+GLIBCXX_ASSERTIONSab GA*FORTIFYb?cGA+GLIBCXX_ASSERTIONSb?c GA*FORTIFY?ceGA+GLIBCXX_ASSERTIONS?ce GA*FORTIFYeahGA+GLIBCXX_ASSERTIONSeah GA*FORTIFYah$jGA+GLIBCXX_ASSERTIONSah$j GA*FORTIFY$j[kGA+GLIBCXX_ASSERTIONS$j[k GA*FORTIFY[kmGA+GLIBCXX_ASSERTIONS[km GA*FORTIFYmmGA+GLIBCXX_ASSERTIONSmm GA*FORTIFYmmGA+GLIBCXX_ASSERTIONSmm GA*FORTIFYmnGA+GLIBCXX_ASSERTIONSmn GA*FORTIFYnnGA+GLIBCXX_ASSERTIONSnn GA*FORTIFYn,nGA+GLIBCXX_ASSERTIONSn,n GA*FORTIFY,noGA+GLIBCXX_ASSERTIONS,no GA*FORTIFYopGA+GLIBCXX_ASSERTIONSop GA*FORTIFYppGA+GLIBCXX_ASSERTIONSpp GA*FORTIFYppGA+GLIBCXX_ASSERTIONSpp GA*FORTIFYp9qGA+GLIBCXX_ASSERTIONSp9q GA*FORTIFY9qqGA+GLIBCXX_ASSERTIONS9qq GA*FORTIFYqqGA+GLIBCXX_ASSERTIONSqq GA*FORTIFYqMrGA+GLIBCXX_ASSERTIONSqMr GA*FORTIFYMrsGA+GLIBCXX_ASSERTIONSMrs GA*FORTIFYstGA+GLIBCXX_ASSERTIONSst GA*FORTIFYt9uGA+GLIBCXX_ASSERTIONSt9u GA*FORTIFY9u\wGA+GLIBCXX_ASSERTIONS9u\w GA*FORTIFY\wyGA+GLIBCXX_ASSERTIONS\wy GA*FORTIFYy{GA+GLIBCXX_ASSERTIONSy{ GA*FORTIFY{{GA+GLIBCXX_ASSERTIONS{{ GA*FORTIFY{F|GA+GLIBCXX_ASSERTIONS{F| GA*FORTIFYF||GA+GLIBCXX_ASSERTIONSF|| GA*FORTIFY|}GA+GLIBCXX_ASSERTIONS|} GA*FORTIFY}\GA+GLIBCXX_ASSERTIONS}\ GA*FORTIFY\QGA+GLIBCXX_ASSERTIONS\Q GA*FORTIFYQGA+GLIBCXX_ASSERTIONSQ GA*FORTIFYMGA+GLIBCXX_ASSERTIONSM GA*FORTIFYMՃGA+GLIBCXX_ASSERTIONSMՃ GA*FORTIFYՃGA+GLIBCXX_ASSERTIONSՃ GA*FORTIFYVGA+GLIBCXX_ASSERTIONSV GA*FORTIFYV%GA+GLIBCXX_ASSERTIONSV% GA*FORTIFY%GA+GLIBCXX_ASSERTIONS% GA*FORTIFY+GA+GLIBCXX_ASSERTIONS+ GA*FORTIFY+]GA+GLIBCXX_ASSERTIONS+] GA*FORTIFY]tGA+GLIBCXX_ASSERTIONS]t GA*FORTIFYtGA+GLIBCXX_ASSERTIONSt GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFY3GA+GLIBCXX_ASSERTIONS3 GA*FORTIFY3GA+GLIBCXX_ASSERTIONS3 GA*FORTIFYэGA+GLIBCXX_ASSERTIONSэ GA*FORTIFYэPGA+GLIBCXX_ASSERTIONSэP GA*FORTIFYPGA+GLIBCXX_ASSERTIONSP GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFY˓GA+GLIBCXX_ASSERTIONS˓ GA*FORTIFY˓GA+GLIBCXX_ASSERTIONS˓ GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFY(GA+GLIBCXX_ASSERTIONS( GA*FORTIFY(HGA+GLIBCXX_ASSERTIONS(H GA*FORTIFYHdGA+GLIBCXX_ASSERTIONSHd GA*FORTIFYd{GA+GLIBCXX_ASSERTIONSd{ GA*FORTIFY{GA+GLIBCXX_ASSERTIONS{ GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFY@GA+GLIBCXX_ASSERTIONS@ GA*FORTIFY@hGA+GLIBCXX_ASSERTIONS@h GA*FORTIFYhYGA+GLIBCXX_ASSERTIONShY GA*FORTIFYY#GA+GLIBCXX_ASSERTIONSY# GA*FORTIFY#GA+GLIBCXX_ASSERTIONS# GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYѸGA+GLIBCXX_ASSERTIONSѸ GA*FORTIFYѸGA+GLIBCXX_ASSERTIONSѸ GA$3p1113SSGA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobin GA*GOW*GA*GA+stack_clashGA*cf_protection GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign GA$3p1113SSGA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobin GA*GOW*GA*GA+stack_clashGA*cf_protection GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign GA$3p1113SSGA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobin GA*GOW*GA*GA+stack_clashGA*cf_protection GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign GA$3p1113SSGA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobin GA*GOW*GA*GA+stack_clashGA*cf_protection GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign GA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobin GA*GOW*GA*GA+stack_clashGA*cf_protection GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign GA*FORTIFY GA+GLIBCXX_ASSERTIONS GA*FORTIFY "GA+GLIBCXX_ASSERTIONS " GA*FORTIFY"[GA+GLIBCXX_ASSERTIONS"[ GA*FORTIFY[hGA+GLIBCXX_ASSERTIONS[h GA*FORTIFYhwGA+GLIBCXX_ASSERTIONShw GA*FORTIFYwGA+GLIBCXX_ASSERTIONSw GA*FORTIFYҹGA+GLIBCXX_ASSERTIONSҹ GA*FORTIFYҹZGA+GLIBCXX_ASSERTIONSҹZ GA*FORTIFYZmGA+GLIBCXX_ASSERTIONSZm GA*FORTIFYmGA+GLIBCXX_ASSERTIONSm GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYaGA+GLIBCXX_ASSERTIONSa GA*FORTIFYaGA+GLIBCXX_ASSERTIONSa GA*FORTIFYWGA+GLIBCXX_ASSERTIONSW GA*FORTIFYWrGA+GLIBCXX_ASSERTIONSWr GA*FORTIFYrGA+GLIBCXX_ASSERTIONSr GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFY GA+GLIBCXX_ASSERTIONS GA*FORTIFY GA+GLIBCXX_ASSERTIONS GA*FORTIFY3GA+GLIBCXX_ASSERTIONS3 GA*FORTIFY3_GA+GLIBCXX_ASSERTIONS3_ GA*FORTIFY_GA+GLIBCXX_ASSERTIONS_ GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFY'GA+GLIBCXX_ASSERTIONS' GA*FORTIFY'GA+GLIBCXX_ASSERTIONS' GA*FORTIFYPGA+GLIBCXX_ASSERTIONSP GA*FORTIFYPGA+GLIBCXX_ASSERTIONSP GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA$3p1113SSGA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobin GA*GOW*GA*GA+stack_clashGA*cf_protection GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign GA$3p1113SSGA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobin GA*GOW*GA*GA+stack_clashGA*cf_protection GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign GA$3p1113SSGA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobin GA*GOW*GA*GA+stack_clashGA*cf_protection GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign GA$3p1113SSGA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobin GA*GOW*GA*GA+stack_clashGA*cf_protection GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignGA$3a1GA$3a1GA$3a1>>GA$3a1,`Td,^  )`Td/f 4-/x/W,/R,/h  %-/4Ga '9 ) (_intG )@/30G$ G @ + @u1 G @W G3  ! q W Gj , `@ A &C $(E (aJ 0NL8-PX@ [+H4\+X1 ]+h$j$xp4Gl- + - N1 ooGG X a4&c&  E18,:  ;1?2A .B 4C1GO,I  J4K1 O,Q  R:#S  ,T U1aIc E.d EC^&;e&P#g1 Ya[ E]ah 1l5'n,o 1tf v E( w x@ Cp3&5&j <&<Db_rtL&VO&+i&4p&y5G1$ +S&& f'( m* &0 |%{ fO/|AHCIRT Cv&d,"7&$ R  E+v"v!&T.S1 4 c G@4H*H*/.0/M,-Gld)y" m, -c 9 11;  CmG"Fy<d (eGf I@I8@IEIE"A%1 U3-6 |$7 |8 |9 | : |(; |0[$< |8C= |@@ |H-A |PB |X'D ` F hHpy0It2/J xx,M94NNiO Q 6/Y ![ c%\ ;.] +^ E'_ r`b g +J(   G J! J`%  G 4'3C  < 'E; 'p: 'F   T h4I '5 T X3@! $x(6x 2gb#;& 'm 9 g& 4 5g)OY!!"4! !  ! ":"F 2" Ex"" #!X.@$  = 8 ! i)0# %9"# ;# =# 4  G  "&4 i5&6  &7  < |"]0'1 '3 |Z'4 |'6 #'7 '8 |'9 | @2': |(jtm8(, ( ( %( &(  j( L (((( -( ((0|< G' ), ')) ')' ), ')) ')H**! B@,Hi13( '    ! v/* ,101$  5+,*X A!>/"#$&%"&'y3()0*+.,F-g .W / 0,123P-4,5k*6*78]19Z:^;(<<.=>*?@&AB$C5DWE!F"GH_Id"J%KLM/NO2PU(QiR$S2TU1VTWX!YkZ$%[\$]y$^"$_!"`dakbzcd-e *f1g'h.ij#k+1l mn opHqqrOst$ujv2w? xE&yz"4{"| }~ ##t2' 048,d+EwY/~  1w38 50i#0!"$$P~##4a A u qN5!+A3+6(u- @$>'[!%%20, "4_/w 6s&'6 -$|'/-2 'p-7 ' -; .U! .m .4J%/"p,/* /!B@/),4 S3- xm0!{)).h2/(2%33\,^b"glP1) a. 00t /{C/&S/ &%/ -&G'/ =-G=GMG"/h/ 4M'1/h'H0/h"s/ / 4 /o,//-GKC1/,+/ 5///M$/Ki005h$07M08X"09W0: _0; F 0<n0= | z+0>( ,"Q n1 1 .1 GkB@2,Nx5/%J Y% ) )  =`+Br.7-"(L+C2q&02s9&2t"2kP22m \22n _'2o 2p ~2u"",2<02 2 9! 2 9 '2 902 92 9 2 9C2 9 `-2 9$(,2 9("(222V#2 4G9G"]2K2 9,.2 9/2 92 9 "x2G2 9 2 9"12o<02"2"/C"" / 1 | 2 |U 3  4 k : <T% = ? 2 @u B| C * E|(s F|03% G|8( I|@"( J|H - K|P" L!VX* O ` P h3 Q p" R x T'\9 V'b W'h# X'h Y'E Z' \'nF* ]'t _| `| a|c b|1 c|* d`* e! f3 g h&! iL k'zL& m'G(L2 n'8L\& oE ""0pVr s  uh&vwx z { |(vGa=G q'=" s w9   EM4 X9    $EM x7=RH H"CXOYbufP = Q YinRG-G?]!NB@j/"~  H#!  @#!) !E  <#! 8#!% 4#! 0#!3 !'' ,#! (#!S $#!'  #!9    #!P H #!Y0 H #!*& H !N. !| #!* "!` !22 ! !9' !l !"G3 "!#* "!^G.N  !G t q#N  ! t G'  !MC>C+Q "!,2L "! L "!&@ "!d  "!J "!l E "!m  "! 9  "! * 9#!  9 9 #!o @! "!!9Z! #!  g!F!9! ! |' , ! "!m!/  "!      "! # !# !*"Go'&%" p!KS' "J2+.2Hm(  !K&@ V#T% U  *    + 5 &   (c 0 8M& " z# "!V# @ d! `!? x"!  !!$ # @!!O  -  !@   !  `!H,! x$2cnt!U$2pid'U  :B 0UYO%2buf'#!U#injU|T~Q} $ &o3k 9#fpk,pmchn no  tp 5К,4 }U4Tw T,"T0Q: ;  ,64JT0Q:dd,]YsUsT0Q:5-T0Q: -ʕT0Q: -T0Q:99.HT0Q:bb i.)'qT0Q: .NLT0Q: /sqT0Q:זז P/T0Q:/#T0Q:BB!/QT0Q: :W B3 : :E?N: %3:II0rpXT0Q:ss0T0Q: # 25 B}NrHM}1eYA;'UvT0Q S 14'ћ3U1TsQ}ʊg T2A?ۊom@UsT "!Q@ Ll2Us2U  L2UsU T QvDY2U MnY 3U _YU qfU F {@  5@ {ՌƗƗ3՗T0Q: zș  4>8>74 =rP"4TsqUsٙ]4U T 4UsT  [! 5 mZV04UsT I5UsT X,5UsT nQ5UsT v5UsT 5U "ʳY5U ~lYU ;W6%;O";#;Y2x6k4 2 %2w~}׳6U2T~Qw"Y7U 9 Y,7U 6YK7U *\Yj7U <Y7U MY7U aѕ;ݕY7U vY7U <yt0Y,8U ]YK8U xG<Yw8U ;Y8U Ɩ;ҖY8U <Y8U Q;Y'9U =YF9U 0^9Us/<DY9U dY9U Q;{X9TvQ | $0.MXe4] ":!p], (/_ ":3:=GE `: (/E- G %% :!p%) %%2| ]%= 2$' :len( end) |:=G'- ;i pw!)p70 2;env ! )del! D* TD55 ()p ;*$U(!P;**U(0<*I'U(5G<*I5&U(v<*\$U(0Г<*'#"U(3 <*I5U( = \ X )  H . -5+ fd !!!ret !! [4 ="/"W ~M( Et;=   0 5 >__d ""ɮU| $ &585> 8!## O EO($$O($$O$$Ow PyPz%P{2P|?P~LP%%YP0&&fP5'+'sP''P('PI)/)PtPtPuPvNPPr p?PW*S*{>QT?Q**?U  y @y++!y 9C@++++ ,,7@Ä1,/,W,U,},{,(*UvT|Q@Tԯ7@U}C AUAT|Qt7"AU}8CGAU?T|Qt]ClAU2T|QtCAU:T|QtCAU3T|Qt3AU ! OAU0+KQ BU|Z[%BUV3±KBT}Q0R0XtٱC|BU:TtQ0JBU T TBU [WVBUu7BUtϴhCUtTAtDCU0TtQtL5tCU2TtQICU q CU *CU 4B DU x8DU tiDU2TtQ0Զ߶3DU0T0Q  UCDT0LCDUATtQ0CEU?TtQ0ɷC8EU3TtQ0ڷC\EU2TtQ0CEU:TtQ0FEU pUQnU @ ?y j"FQy,,-?y0+Qy,,+y #/ y,,+y #  y--yB-@-*T !Q8ly 9G~yh-f-+y y--y--*T !Q8zqQGUs?OhGU03GU|TvQ0R0X_U[WGU|GU|T05sQi HU WLGHUs?Ãs_x_HUsrHUs?ÃszqpHUsOHU0/M M .M .5+-- O 4*.. P 4..WQ }M(R E} [4S a/Q/retT (00 BV z#00EactX ~; I   0 5RI__d 7131Z; 1J 3 1w1ے#JU ՏT7VJU| CJUATvQ `!57JU|ICJU?TvQ !!eCJU2TvQ  !CKU:TvQ  !C@KU3TvQ @!!3[KU !OrKU0KQKU}:[KUV3KT|Q0R0XӑC LUAT `!Q0C2LU?T !!Q0C[LU3T @!!Q0 CLU2T  !Q0CLU:T  !Q0LU T LU [W.Q )MU qHMU gMU pVMUu> P@N .> +5+2 25jN C 4a2_2qOU0LR  pO . *5+22 T  33 y 6 GOy*3(3 !y@  7NÄO3M3u3s333 P 9O333344 *UsTwQ@.>3rOU0T0Q  UOT05LEQP: Q B: @z# .; 95+act=  =  $= % O = / @>  >  "?  [4@ retA pidB  C 4 D 4 WE  M(F E H  I FP   0 FQ__d ) 3 D/ 1T'+  U: `k6R  ,G494  44 2 o5c5  65 & 66 T ^7X7  77l%RU T @l t Fv lY ' *==  5==  =X~ret X>T>pfd YSYUUTsZqYUsTv88 Z '8 ' 8 @ y&: Zp; | < |res=  != , N > 5? ZG? 0-[  6[>>  GJ?:?ret @?fd P@J@ D 83 @@ZT1Q0̊ZUsT2Q1[UsT1Q2RDX4?[UsTvQ} ][UsT|&LO,[Uv] 8| [ . /5+ * B!len LF[ch ) 3# _3 0^ . 05+@@ L C/A'A  ,AA ,. AA  LBFBlen BB;P \ch BB; \ch (C$C5H7] 3# dC^CqU|   x]CCCC+D)DTTQ~   ]TDPDDDDDT}Qv]UvU}x P|t^*. 25+U-| ÄDD)E'EQEME3 |F^ . 05+EE#fn !EE#arg ,EKFCF@=|p_QTRQt {Fp_ .t )5+FF#fnu !GF#argu ,EkGcG@{p_QTRQ6 a Ts` (a 6hGG#nb 6H.H#fnb (HH#argb 3E5I)I d #hIIrete JJqTX}6 yb . ,5+JJ#fn !KK#arg ,ELLi lLhLlen! LL " |LLret# 9M5M &$ }MoM;@ZbS7 Z}p8 |&NN  9 |NN : |NN U; 4O&O ~< &tOO < -tPP5z(achK cPaP%z O PPFa__cO z9 ̋zpF 1bPPQP݋/Q-Qr@{}U~T}#X|3*zbUv3$|"T v2$}"X|{`w$_d ./5+^QRQ#fn!QQ#arg,ER}Ri JS>Slen SS  |NTBTret TT & 5U#U!_d~5Gxc  |UU UcV[V ~&tVV -tVVxEdUwQ R TyE=dUwT| $ &Q R T32yQdXvyA"pd=GlT d2v1'U2v27T|@u'f .(5+EW3W K2; X X E4#h4X0X #h['f`f$Ff$9f`SfrXlX^fXXNkfelfXXwfRYJYfYYfYYf*Z&ZfdZ`ZUffZZUffZZv9EvRU|Ts3$"uRU|q|f .q-5+ K2q@is t |)p  | | U ~&t -t)ch) )__c8U< -g .</5+ *<B!len<O 1>  ?p@ A - *B -retC iovDg E  gGj|h .$5+e[Y[ret [[n o\g\ ^}.ph6\\$)]]h]f]CP]]]p}qTs@}hhUs}hUs?Ãs}^(%tiNi*.'5+U ;"\]]  T^R^-t Äy^w^^^^^ -`j .+5+^^ M5__#offBjy`i` N7a'a ;"\aa  jÄbbbbbbg5jUsچ*RjT~Q8Z^yjTTQQRR^8* - k .(5+ *;!lenH ;"\  p! " - ,# - $ - /%  -s l ..5+c c *;|cc Hcclen -ddXd /  ee Ht lneje$eeMtUvQ|-odt eeffAf=f{fwfʊhthtlffffۊffvt@U~TvQst%Prln .-5+*g g *:|gg Ghh THthjhlen -hh * -(i i y  |ii  |ii ~ |jjp |jj s  >nkkTkPkkks#nTQsYsTQsmoss nokk%s oolksU~rjUT:Qs q]mo .-5+TlHl+mo0r0roll%0roomm5rUs- o ..5+  len -|qSp*.+5+U (5;m7moff zmtm*y@qJqp .y&5+mmVqgqxqq(npYp .n%5+#nn-`$qtqnon}nn$qr Kzq .K*5+nn h-qUsMgEqUsVeqUs?Ãs^Us1-Pr .-%5+Do8ohqUsgqUsqpqUs̓^L4Ft .%5+oo/=X~ElenF ~+~ ?ypPPsQywpup-?yp`+Qypp+ypp / ypp+yp p   yppyqq*T !Q8OzqhsUstsT0sT|Q}߬sT0xsUssUv?ÃsqptUsM8tT6Q1R~X4` p yt*.(5+U pt@pFtU !'0n%w .(5+Eq;q#fd2qq  MrKr `{nTurrpr}rr$q n@ urrrr@ s snvT Y1o1o' >vkEsCs%1o'w~~Jo׳/vUvT~Q~So HovejshsYsso'U oT2nʳvU $ovUsT ovUvT1owU0owT0o(- n Sw2cb;*UDxn Tnox Ess p+pۄwU=T `T{ .1.5+ 82|!len2 !2+| 26 .4 5>{-N{G { .'5+!uid3L!gid>@ /Prv pw! { (6  `| .+5+ss#uid7LPtHt#pwL!ttret tt Tw3o|UQTs|U T Q|Xs}|UvT Q0  $} .,5+!uid8L) n%ret  r} .-5+!r} !.} @}G}=G#4}64{ ` .{,5+YuQu {?uu {R%vv1} ":_n~ uvqv i~ ~vvvv$zUvT Q1R X rf~U|TvJ*~U2QDI rm J [ t)J%stLSfdM ) zrc+ ,  )uid   .-5+ * i ) ~&t -t7# O .35+i F2bp|) ~&t -t7v ./5+pb7 &)Hp |b6O"t ^Y t4hww &tBjwfw*E4u! Q u#|ww 2*w#hx x Ux SxGx xxx&h!fdh /j=XlenkF ;R ف R<ف p SH S+ *U#hhr> ;>>\ >L)bF62 ]G .235+yy 2=Fz@zp4 |zz]vTv0$ Ă .$+5+!n$5p&  .05+ : * | i!fd \2i &< *Gret * n  .-!fd' *2E!len?ret -7D! у .35+# !fdret 6 ]U#fd#zz "+{{val &| |]UsT3Q0@.^UUT473wф ;wJ\ RDx&!lenx0t&R :!A \ V&Aw|o| g,A2||EsaC~\CWUvT0Qs\7oUs]CUvTsQ0]:&8 pTυ2sig8!U:+3 `T2sig3 UuP (0m7  E}=} \.}}mmUs@mU T [QURTv(evw~ ~xfmt'~~PVbuf Tvyp |\HzG 60Eap  u5gVtvEuVtm u{ihPևz܀ڀMhU|T Q1R X \igg/X/-zWUgU|T Q1R X "gõuUsT0gϵUsTu f+~zf۵T1Q}Ru\iff-GEznl gUsTdQ1R X 2Yv3$ !" i9gzSgUsTdQ1R X 8 >cg [[" OPNgT1Q FX|)grahW . :5+p D.E+|ʊJ-|.."-" J-"E"."%.= k|6ckkk.\|`c\\.p>Ec>E0>>.O'E̋c'E''.(EcG.q8 5I.18.rdid 5d<P.F A]__sA]__nA5AP.%|ՌI2%+%|sz' 8Jn n8 i i8* B   4 BS.0?)s)$)PW.1t+1W8-"mt+"m,mo`oto oHB-o1a @<0|vʊ8a8aDžŅۊFa@U~TvQ|Ta,aaq$ÃSуa G$%a 64aL8Usa+aa $Ã,b cY߆Ն)[Q6ه͇CmaP]=bUvQ|b,bOt c` Oc cfT05c,Y@cYY[SYY}Y&YY}Y}YYXRccG g)ʋȋcU|TsQ "dN ʑ),*SQzv*dUvT|Ql d dUsT0Q: `d Tٌ׌}q($ ̋eP ea݋͍ˍ1e Uv 6re\ SGmcc) U|T:c51U|T sd)OU}T]eAzU}T0Q}R}9eNU|Ie[U}e,UphUC?UUQUQVV[UC ה$UUU|UVJV؏VvpNVV+ViU T|QhgU TvQ33iVUui,f}lEf gg?1g,g9gDgQg^gkgxgfE~E~< gޒg51fqm%E~g,g9gԓ̓Dg<4Qg^gÔkgxg ~ e6)" HFnl CP]Ε̕~qTwQ2R} ~pZ Ä0.VTX~gU~U~?Ã~/*7U2T~\,9= :y:п `:Wb :y}: r::_:MG: `@, 2ԙҙmsUwT ہہ9 #^\%ہɌUsT|Q ҁјTvQ0* 3:pg 6E:pR:HGeY.'UsT AQ T^UsڙUvT2LUvU2T1C}U0T HQs9؂؂ ]  :ٛӛ%؂ :}U0T (QUM,jj1%jɜjjjjjjkQk j j0(jjjB6jɟşj j{jkJDk ES $Ä@@? c/-PUTQvÅg{UsgUs%^,[[`R[ [}[  [/#$[$[>[`,[>[3g[F@ljU|-щP  ޥTvQs,Y`8Y Y]WYYYYYQYY@ntUUTT,{X!#XXX-{X  X?5XX3-X՞U@T1|[UUߌ,x0 x|x<:x oO/c_תӪ ʊ  IGnlۊ@UsTvQ| x  A hx xx2*߁1V۠O 8 ۬٬o@iš%#JH%8qmʊέ̭ۊ@U}T|Qv yn y yz z~z^T((A ϯͯ%(Aˁ+445R DBig%45ˁKvT v $ &33$uuA ްܰ+)%uAˁ+5R SQxv%5ˁȱƱvT v $ &33$ ٣ wO D@>ecO X]%j v0Գҳ0" vˤp[GEpnl v٤ߴ  v CAjh v`6`޵ܵ v+)RP{w vEȦ۶ٶ vJ`(&`OMvt-vO÷Sw K$%w '#>#)a_&+v %ݸ۸O2¥3+%@xv v ۹׹ v0 ڨ$0:8 v#p $p_]-vA $*z1 ԩ$Ă/I޲*(ւTP%/vT ApfAOEu%u%3444E 6"6"0? bb  .v'v'*a 4.4.wD(D('t* *  585@((5R11  773  ' '= = 6 ##7% ~Y Y 81 1 * 9D C-C-*tCC*nD#D#  )K***k :*:* d?d?*%%**wk k p AC 9   ::f 44:96 }1}16 **6f  6p |'|'6 //*9 +Sn)n); y4y43 ;!b5b53[q$q$%dupdup* 1"1"* aa*!!X^^3&D i-i-)))] Z   <4A= 3 A((::uu+O#??3=t  0 ee0 >"?oE+%22((36tAtA3A  * cc55@ W*W*'nzz* A 00* OOA F ? )R9R,W,f xh %I4 'P )(int )@303!o  9 A% 1 U 3 - 6  $ 7   8   9  : (  ; 0 [$ < 8 C = @  @ H - A P  B X ' D` Fh Hp y0 It 2/ J x x, MP 4 NW i O  Q 6/ Y ! [ c% \ ;. ] + ^ G ' _ - r ` b  +(   9!`%  95 ? M3C E; p: F  UJ5 UF  5 U! a)}M,.0C"^! q *,!6 $/2 p7  ; g:H"\= Ff9:IDg98@tH95G4DCpG1;; WBG@b{@;=:=9G6=f9 A 7 i? E 8AWDF7jB:C7 7=7BY:bDE=I/> = 1=@A`pCu>6B36GKC 78 8@ 8.8<8J8X8f8t8  E@E+E:EIEXEgEvE E@Exn<@?<:Bv#Vw :ZCxFOG@CA7@-7; ; :L;@5A G8;B A ZN:; :len ptr aux54DZary  9 9(9as8@2:: e@99DCWN:C$Flen aux%2ptr&F4D'Wary( F 9\<(9as)(A(sA 9tB6u L 7v L @w G L !GA "H6L 7:";:eH: >:@:5?:F:@:V>:5:V9:8A:D:D:9:9:=:<:K@:@:9:v6:=:9::<:A:7:A@:5:7:F:#C:!<:C:C:.A:t9:F:9:P7:)D:-@:B:_;:7:>:s=:@:B:: :6 :; :: :[7 ::B:B:6:{A:5:%B:?:F:oD:F9 :D!:8":)G#:>%:/9&: 6':=(:F*:0C,:B;,:m:,(:8G:7H:V<I:HJ:t;K:8@:  9 >7 C=8<9B:G;8<d==h;>#@,Nx5/%J Y% ) )  =`+Br.7-"(L+$q=%0s%t k P2m \2n  _'o  p  ~u ", <0 =   !   '  0      C  `- $ (, ( (D 2D V# T4 T 9 d 9 ] K  ,.  /    x      1 <0"= " 4 i56 7  /k  1 2  U3  4 & : < T%= ? 2@ uB C *E( s F0 3%G8 (I@ "(JH -KP "L!X *O` Ph 3Qp "Rx T' 9V' W' #X' Y' EZ' \' F*]' _ ` a cb 1c *d `*e ! f 3g h &!i'k''&m'('2n'8'\&oG " : 2 G x" -=)d = 9 j(9qk="s)?!!!!!GD->.P  ;W = c  9 c GBG? sA W 4  o, F*C1+W5T$QQAH67Q   <)4?JU`Akv$J% p,  !{$$%S $%% 4%G' D 4 9 D 9 T 9 o  T1oH0o I 9  9@**+C%:+P=&:,=': '!,G+: '!,9H-: '!,</: '!,91 0! 6<-req>-env?: ?@)!!!-6AQ,PBC: '!,EE: (!,DGF '!,-<H:  !+EI,%J~ '! $9Ly :N =4O <P K?Q$9R7, BTy '! (9,;U  #!;.;  8!/@7K$0BH9 :1p: 0a?; C92 3D]*K #!4QC5U '5T32!0;^6;^$0A^2@!3D^K x#!4)C5U H5T740C5Q05R02!`08 :/-4nC5TH5Q `5R|2!08:TR4C5TH5Q `5R|7 %=8-%?9:;%yw:F%8/: :;A:4C5Us5T05Q:<CY5U < Cw5Us5TM<C5Us5Tm<C5Us5TK4C5Us5Tk8% @9 :!%/%8:HP +^;":;:4pC5U #!5Ts5Qv5R =9vv- ;90.;9ZX<)C5U  49C5Us8/:v C;A:4C5T05Q:> DD>$D<Cy5U 6>1D> >DD>D>D>b4<2D#5U 'FD?X$5T v5Q 5R0?$5T 5Q 5R0? $5T 5Q 5R0D>D>DGg>:v&JB":UJ?-:TK?:&EB:DX@:&EB!:GF:`&JB":UG<:0+C'JB:UL844 M8Gw::Ua(HB:1str :97=a( ';s(b\7+p 8)S(;*9N*:+*N8*:C*)%<>D(O*s>,+>DDE:(EB!:G.|:4)H;|saHC|*L:HB|6:1str~ :\P1n 0=9 LB0S:  89L@ w);9IE>WD>}D>,+<D)5Us $ &<O*)5U|<, E)5U}5Qs $ &4 E5U}5Q| $ &D6M:O*EBM :CstrO :6@PCnQ CpR G?8 a+H=98"P)6: 0u?; 0S:< HF0&>= ok6@> 88>+M8>OEQ:3QB.RF K+Cfd R6w+Cfd Csfn QD>GF:p2+HB :1ch >%EG::p%,HB!: >DG6:`,Sout!:_YSstr,:4m/5Us5TTDC:,E;EC*Tout6:Ci 6B :D?o:2-Taryo#:Touto.:E*:o7Ctmpq :Cir G;f:-H;fHCf,&"Soutf8:e_<1E-5UU5TT4/5UsG>B:PO/H;BHCB, SoutB8:}1iD 3BE :@8'9PTv.;99c_<XD.5U~5T3</.5Uv</.5Uv<8/.5Uv>E>KEUC6:0HB6!:Sstr6-: 0@8VR1len9 89 :/;94ʻTE5Uv5T<8'9λ`< /;994AaE5UsGC*:0K1HB*:-%Sc*+:Vch, W0@-8G9P`,0;Y9W9f;9kg<D05Us>D89.$1;94TE5Uv5T<?=15TW5Q1>KEG:: ~1JB#:UGH :32HB +:Sstr 7:<nE15Us<#{E15Us4-E5T0XA: S2YB,:A=>EX@: 2YB+:~z>ԼEXG:-2YB,:>EXR?:H4YB$:Zpid 5123[; ok+; $[A 23,D K h#!4C5U l5T54C5U85Q05R0\H4 4;U4>b4<E 45Qs4ƽE5Qs>&E>ED>k$D]< b4^@)_F z52` 5`;,;*5``A24,DK `#!4IC5U d5T74C5Q15Rw>ZKE F*5 95X= B6Y )YU3`ZYHY Taarg#G*&<E55UQ5T R $ &<E55U|5Ts $ &4ȹeD5QvX6n @B8Y n(mcYUn2YnGY nSN:aargo"G(Zpq blenr <E65U|5T~<E65Us5Tv $ &<ƾeD75Q|<4E175U|5T?<`EQ75U|5TD>D<D;5U >DmC5QU5RTj,+>n>+=86<M8Iw+..8,+@ >9:>+8K+@ =9:]+@4:i+8O:N =;l:;`:EA4_F5T15Q 5Rs59F><EF4gD5Us<RF=5Uv5Ts<_F=5U05Ts5Q35R15Xv5Y0<kF>5Uv<D6>5U <#kFN>5Uv<}Dm>5U 4kF5Uv<xF>5T14D5U j)?:*|N+*:8*:C*;*,*I+b <O*E?5U <6Fx?5U|"5Tv5Q 5R1,+m>O*Uj, ;B;,;,1%; -q-@:&-( 8 9z@;9=e9dd|@;9;9;w9FD4lF5Us88l|ZA;8mi988v0 DA;84F5Us=,'o B;,; -;,[Wr'q-@N&-<XDA5U 5T54F5U15Tw5Qv<F-B5U15Tw5Qv>KEj,PC;,;,;,seN,N,s,qCM,M,M,9:,:,>48'9 B;99aE</>C5Us5T~</VC5Us4XD5U|5T34B/5Ust>>t0:0:etOHOHu6"6"t4.4.wv??w/tmp/lsapi.XXXXXXv@@w .XXXXXXtu%u%u{t33ntC-C-tt>> t>>t77tCCtDD7t`C`CtDDtFF0t@@ t11  ujju;;L t773 t==tEBEBt2F2FtaGaGt::$u u t>>tFFxY Y t==RtAAt)H)HVt??WtEEcttR R t//}u66ut))^t<<u??tXAXAuZ uoAoA DtCC t//9 u##% t^^t== u449tv'v'a t tGGqw lsruby.ctSFSFtDDt@@YtpFpFB1B( 1 : ; 9 I8 41B11 4: ;9 I 1RBUX YW  : ;9 IB 4: ;9 IB : ;9 I I: ; 9 I4: ;9 I1RBX YW .?<n: ; 9 4: ;9 I4: ;9 IBI41 U.: ;9 'I : ; 9 I!I/ .?: ;9 'I@B4: ; 9 I41 : ;9 I8 .?<n: ;9 I!: ;9 I" : ; 9 #: ;9 IB$1% & : ; 9 I'4: ; 9 I?<(.?: ;9 '@B) *: ;9 I+1RBX YW ,.1@B-1RBUX YW ..?: ; 9 'I 4/$ > 0(1 : ; 9 2: ;9 I34&I5 6.: ;9 'I@B7.: ;9 ' 8.?: ;9 'I 9'I:.: ;9 '@B; U<7I=!I/> 1?1B@B1A.?<n: ; B> I: ; 9 C : ; 9 D.?: ;9 'I@BE4: ;9 IF G5IH4: ;9 I?<I : ; I8 J<K : ;9 L : ; 9 I8M: ;9 IN 1UO 1PQ41 R'S1X YW T.?: ;9 '@BU 1UV4: ; 9 IW.: ; 9 'I X> I: ; 9 Y : ; 9 I8 ZB1[1UX YW \1RBX Y W ]: ; 9 I^% _$ > ` a : ; 9 b : ; 9 Ic'd&eIf : ; g: ; 9 h!i(j : ; 9 k : ; 9 l4G: ; 9 m'InB1o.?: ;9 'I@Bp4: ;9 I qrBs.: ;9 'I t.: ;9 ' u.: ;9 I v.?: ; 9 '@Bw: ; 9 IBx: ; 9 IBy4: ; 9 IBz4: ; 9 IB{1RBUX Y W |4: ; 9 I}1UX YW ~.?<n.?<n: ;9 6% : ; 9 I$ >  $ > &I I7I I !I/  : ; 9  : ; 9 I8 : ; 9 <4: ; 9 I?<!4: ;9 I?<: ; 9 I> I: ;9 ( (((   : ;9  : ;9 I8  : ;9  : ;9 I : ;9  : ;9 I8  : ;9 I : ;9 I 8 '!I": ;9 I#> I: ; 9 $ : ; 9 % : ; 9 I& : ; 9 ' : ; 9 I8(!I/)'I* : ;9 +4: ; 9 I,4: ; 9 I- : ; 9 I8 .4: ; 9 I?/.?: ;9 @B04: ;9 IB14: ;9 IB2 U34: ;9 I415B64: ;9 I71RB UX YW 81RB UX YW 9 U:41B;1B<1=1RB X YW >1?@!I/ A.: ;9 B.: ;9 C4: ;9 ID.: ;9 'I E: ;9 IF G.: ;9 'I@BH: ;9 IBI1RB X YW J: ;9 IK.: ;9 'IL1RB X YW M1N41O1BP4: ;9 IQ.: ;9 I R.: ;9 I S: ;9 IBT: ;9 IU.: ;9 'I@BV4: ;9 IW1RB UX YW X.: ; 9 'I@BY: ; 9 IBZ4: ; 9 IB[4: ; 9 IB\1RB UX Y W ].: ; 9 ' ^: ; 9 I_.: ; 9 @B`4: ; 9 I a: ; 9 IBb4: ; 9 I c.: ; 9 '@BdB1e.: ; 9 'I f.?: ;9 '<g.?: ; 9 'I 4h.?: ;9 'I ij.1@Bk1l 1UmB1n41 o41p41 q41r s1UX YW t.?<n: ;9 u.?<n: ; 9 v.?<n: ; w6x.?<n R /usr/include/bits/usr/include/usr/include/sys/usr/lib/gcc/x86_64-redhat-linux/8/include/usr/include/bits/types/usr/include/netinet/usr/include/arpalsapilib.cstring_fortified.hunistd.hbyteswap.hstdlib.hstdio2.hfcntl2.hstdlib.hstat.hlsapilib.htypes.hstddef.hfcntl.hstruct_timespec.hstat.htime_t.h__sigset_t.hsigset_t.h__sigval_t.hsiginfo_t.hsignal.hsigaction.htypes.hstdint-intn.hstruct_timeval.hselect.hstdarg.hstruct_FILE.hFILE.hstdio.hsys_errlist.hresource.hstruct_iovec.hsocket.hsocket_type.hsockaddr.htime.hpwd.hstruct_tm.htime.hunistd.hctype.hconfname.hgetopt_core.hstdint-uintn.hin.hnetdb.hun.hlsapidef.hstring.hresource.hdlfcn.hsocket.herrno.hselect2.hsched.hmman.hsendfile.huio.hstrings.hinet.hwait.hprctl.hgrp.h `TKK.K5J/I#KK1 0 z zJ Z " OJJ = ...v <K gfJ.T2KxJ.n=@<YDw<<=:/;<;/u;=IK=H</փ-K-=>:X-=;=0:/;=I<//sf=H</[G-K-=18=;=0:X;=-/I=;/?Gf-K-=I<-=;=-/e=-/t0//-</-</-</-<///-<///-J=t=Y-</ȑ-</J>Xtu-=ttu;/K-=-/X-/t;/gK-=Y-=;=J;=/K-=-/X;/u-=ttu-=K;</f;=;/fu-=t.V>,>t;=/.K-=-/t-=-//-/-X.I</t.W=-/0,0,<.W=-/t/t;=;/H ># K# = l Z< < h u$I$K="IY<IJ =$J$<=;"<J = vXF.L L = /d f.L u /O7@p$tik<=<>V L a$f mX Xm< .>m<X N1+ pk " kJJ k.XX"~K k  [ X O(kX  < kX  b>= E<>:<Y<; = vk<q R< !l   l<lz/ f X< Kffkv ~*~ X$ rJ~ # .?f h ~~<  .<1 ~) < ~t)X ~<= jtt        Z-JJXft X L!s gf  fF J Y Y :"foXXXJlt0 hd/ L. XN6g J yi< X$   Z  4tKK  ;:|". < Z IY6t(f+K"JMX"X< mJ< & AJX0J XXXV$J)I!4f<9X!Jh  .$r.XX`KJ Jt5<uY"J q<% 3$x.`XYBW[$g   F x \ *2. F^ \t;:j KK-uYIX mKi+JJK2KKu\/ u  u  (tX |  x(9?JL6J9xX<u1tu6,XJK,@g L,K /sJK u XQy  X KEW \ g x. < %  /s u Z ptt  /t.X  o tK !f J/ kt Zs gY  Z Y g Y  #!xwJKxJK K!JK sJ  s< ! KJ9J!JK!s  f K =J YYt YYt YYJ YY<xK t<YL ,<W ue [A<v v .KXe#!CJ;Cg K E dX ` x DNK$ JG MY<," g <    =  &> t u X   Y r< f Kr  < r rJ huJL |   fX.X  ]u u<   Z = = y<kJK,&J"Irt &s=r< !rff  "yJD!IK L%; K%H K KKK.7 .XB#I1u#J Q  F Z  KNJ U  X  hJ.$ .Xhr / X L*~Jf-S. LKI u YZ .HJ K Y)%fX80JJ )X%<XX$%4HJL<0YBL=;B=Vv<)/Mt z0<6u  zt/  L4K"vI4H =" @"F %#K%W Yz Q*uJf  uJ K mJJ .I  <vJ uMF =0J u) Y%#K,K"9 =& =X YsJY FX:JJ Z L N*<xX<JX>tJ e < 7/t  L4K xH4 = K *vJfJ  uJ  Y.W mJt mX K t Km \x JYKWiX<JJz NS =;0WX Y)? K  LeJf<Ki*_8tK )^ ~tf<_K z.` ztf< XKJZfv*=gJ Z AK=%, =%H KM, tY,Lho!(fot(= -K l X|K<x < o.K Ms f sf tJt    Z 93JJM _< . jy 93JJ Kw ' K"f/ s XM X X mXL  f   yr rX' =P Yr J:h6t YGu  uf>= . f  K  ^tj  !tJ<   jF % =%H K  Z7)K LK)8 K! K 2%o = K%: K2 GK  _X#< ]< <& Y ZX [f<Ȃ _Xy q   KK&,N>:hZs"  [sf  "Ui Xi g Y .. - sX ... K fh00< =  h+< Y  u<   Y Jz   . L+< g  /.  L g J JK*X.X v6= Y; u/ Xl f? lJXY lf"Kl "K8G8=P.4XK%      J.Jp<J*<X v6= Y;. / Xl f lJXY"=8G8= I/..c<<jBz<  sX&`" f [Z M   L  Y 0 U= =Y K ^f 4I gYK$/ fY L y^ /K-%]  K+/X>0XX<uj Yv Xg Y IgZ$Hv&L<X(.= /.u.Z .fJOwX(WuO=.ft"<*w  <K t Y /?N&tuKK  h g G] t Y t YtM   t  Y IgYJvYY g r Y >v t YK, <Y ._ho<x }KYWJtbXK X 9    ft "u ; <u WY rXu WY X"0", XX LXJ<f?JfjK t Y*=K t ,=K t 0=K t .=K t Y,=KgjKK 2K zt/ Y Z  c    Zc  cf  Zc <<   a,<  Zci  Zc x    Zc w X     c       Yc  v    Yc  v    Zc  w    Yc  v  Z [    Zc   g     Yb  f }r       g {  g1J }  <1-u-).K.X UJ.< Z .)J KIK XxK +zz< O=>;g< 0:>< Y6 2 _< < Z    \_<   _X<   _ @ /        J       f :v ZYw Yu    Zv  .X t   tXI/ /    u ~ft  Zr> Z J  z  X/X < zX   tX /  `ggWK>X u ~X~ }XYX |X |<Y ^  X ./ XR XUJ Y   h.eX> tYvtYK   M U -/](tq $~Zv <Qyt/Z t   t Z*(t N   bX J| < y  !#J Y  Z+KZ)=1K- M< <Y v.u. }Jt ZY< gJ f"<  /  np < }2NX)     ~ |X}Y"Xg![qg!p'Y>tYK&CXK%.ZY&i fYp<x u   Zv X w ~9}5Xl t.Z7j.+"<g7/W5K/I Mu_Kg\K f /opt/cpanel/ea-ruby27/root/usr/include/ruby/usr/include/bits/usr/include/usr/lib/gcc/x86_64-redhat-linux/8/include/usr/include/bits/types/usr/include/sys/usr/include/netinetlsruby.clsapilib.hruby.hstdio2.hstdlib.hstring_fortified.hstddef.htypes.hstruct_FILE.hFILE.hstdio.hsys_errlist.htypes.hstdint-intn.hstdint-uintn.hunistd.hgetopt_core.hmath.hintern.hversion.hlsapidef.htime.hstruct_iovec.herrno.hsockaddr.hsocket.hin.hsignal.hstring.hmman.hutil.h  JK?K| #t>iK>KK{KY;./*X **}( // RX} t     0Yf q\:>X. t" u t/u* uZ ^  %gfu Z3 X |t |< tXX uKt  .t.  X  f. f *8u t  X    o.@5< t-< ti JJ [X #JiX Y  L( ff#X< x9= t; K1 tQJ/f J L 2  =t<UMtUX&<< ` 0z X .    =Yl  rX[wt Z " h   m grtX  h fY:g< KXfKY sbXtv  SY|X |X<   L/$ eX< z < zt yt5Y|X |.X z  Z rh Y   *xp*suqwZ7Mt -uDXZ;467954644584236:8648: "u{ wt JvI ;tZvpJuI==[X=XvXuv0X>f~z t gz t ` X p((* uv #G< Y(%[$ _SC_THREAD_SPORADIC_SERVERpthread_atfork_functotalLSAPI_Set_Max_Process_Timelsapi_parent_dead__fxstatparseContentLenFromHeaderugidLen_SC_2_SW_DEVm_pScriptFileLSAPI_Stopsi_addr_lsb_unused2_SC_TIMERSm_iReqCounter_fileno_SC_SHELL_SC_MEMORY_PROTECTION_SC_SCHAR_MAX__pathtm_secH_AUTHORIZATION_SC_THREAD_SAFE_FUNCTIONS_SC_UCHAR_MAXmax_lenfreeaddrinfoverifyHeader_SC_C_LANG_SUPPORTm_pIovecEndstrcpy__uint8_tIPPROTO_TPpw_uidwaitpidHTTP_HEADER_LEN_SC_TTY_NAME_MAX_SC_PASS_MAXLSAPI_ErrResponse_rsi_uidm_bytes_SC_2_PBS_TRACKfp_lve_destroym_pHeader_IO_buf_end__RLIM_NLIMITS_SC_SELECT_shortbufsockaddr_insa_family_tSOCK_DCCP_SC_BC_STRING_MAX_ISpunctis_enough_free_meminet_addr_SC_TRACE_INHERITinit_lve_exnewSizem_tmStartsetgroups_SC_SEMAPHORES_SC_EQUIV_CLASS_MAX__environ_sigpollsa_data__builtin_memmoveai_protocolm_pChildrenStatusCurIPPROTO_UDPoverflow_arg_areasin_zero_SC_DEVICE_SPECIFICin_port_tachMD5_SC_THREAD_THREADS_MAXerror_msg_SC_LEVEL3_CACHE_SIZE_SC_TRACEreg_save_area_archm_respPktHeaderg_running__off_t_addr_bndlsapi_cleanupachHeaderNamest_size_SC_THREAD_PROCESS_SHAREDallocateBuf_SC_JOB_CONTROLgetppidtm_isdstswapIntEndianlsapi_check_child_status_locks_max_idle_secslsapi_set_nblocks_schedule_notifysetUID_LVE_SC_NL_NMAX__RLIMIT_NPROCRLIMIT_DATApServeratolinitgroups_SC_POLLm_pHttpHeader_SC_V6_ILP32_OFF32_SC_TRACE_SYS_MAXm_pScriptName__builtin_va_listst_blksizeRLIMIT_NOFILEm_pEnvList_SC_BASE_sigchldLSAPI_Set_Max_Idle_Children_SC_LONG_BITfixEndianLSAPI_GetEnv_r_upper__fmtsa_familym_specialEnvListSizepw_passwd_SC_CLOCK_SELECTIONlsapi_resp_infoGNU C17 8.5.0 20210514 (Red Hat 8.5.0-26) -mtune=generic -m64 -march=x86-64 -g -O2 -fexceptions -fstack-protector-strong -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection=full -fPIC -fplugin=gcc-annobin__RLIMIT_RTTIME_SC_V7_LPBIG_OFFBIGbodyLeftfcntllastTime_SC_AIO_LISTIO_MAXLSAPI_Init_Prefork_ServerpErr1pErr2st_gidm_cntHeaderss_notify_scheduledm_envListSizegettimeofdayai_addrm_iAvoidForks_secret_timerlsapi_MD5Context__syscall_slong_t__builtin_memset_SC_FILE_SYSTEMsa_restorerm_pChildrenStatusEnd_IO_write_end_SC_SCHAR_MIN_SC_LINE_MAXLSAPI_SetRespStatus_rlsapi_MD5_CTX__resst_nlinks_addr_SC_TZNAME_MAX__va_list_tag_syscallst_ctim__builtin___snprintf_chkLSAPI_Postfork_Child_SC_2_VERSION_SC_2_PBS_CHECKPOINTIPPROTO_MPLS__sigset_tm_requestMethodOffm_tmWaitBeginreadSecretreadReq__tznameatoig_initedgetaddrinfovalLens_acklsapi_jailLVE__d0_SC_LEVEL4_CACHE_ASSOClsapi_MD5Final_SC_NL_LANGMAXdoAddrInfo__stack_chk_fail_killcurSizeRLIMIT_STACKIPPROTO_IPIPdlopenbacklogsin_family_SC_LEVEL1_ICACHE_ASSOCpIovrlim_maxm_iKillSentm_fdListen_SC_AIO_PRIO_DELTA_MAXvalidateHeadersst_atimm_statusm_reqBodyLensig_numoptargSOCK_RAWsnprintfold_int_SC_2_C_BINDs_enable_lve__clock_tparseRequestIPPROTO_RAWbufLen_SC_PRIORITY_SCHEDULING_SC_SS_REPL_MAXsival_ptrpStderrLogsetpgid__uid_tsi_stimeoptoptLSAPI_ReqBodyGetChar_rpKeysun_family__uint16_t_SC_FSYNCsin_portgetpeernameLSAPI_is_suEXEC_DaemonLSAPI_Is_Listen_rLSAPI_End_Response_r_SC_FILE_ATTRIBUTESsetreuidserverAddr_SC_NZEROm_pQueryString__gnuc_va_list_SC_2_C_DEV_chainpContentLen_call_addrEnvForeachnewfdm_iServerMaxIdleSOCK_NONBLOCKusleepSOCK_RDM_SC_SYMLOOP_MAXsockaddr_un_ISblankunsigned charIPPROTO_MAX_SC_MQ_OPEN_MAXSOCK_DGRAMm_tmReqBegin__fd_mask__blkcnt_tlsapi_enterLVE__builtin_calloc_IO_lock_t__uint32_tLSAPI_Is_ListenIPPROTO_COMPLSAPI_key_value_pairlsapi_check_pathLSAPI_ForeachHeader_rpHeaderName_SC_SEM_NSEMS_MAX_SC_USHRT_MAXLSAPI_FinalizeRespHeaders_r__read_alias__fdelt_chkshouldFixEndianpBody_SC_STREAM_MAX_SC_ASYNCHRONOUS_IOserverMaxIdle__open_alias_SC_READER_WRITER_LOCKS_SC_CPUTIME__getcwd_alias_SC_2_PBS_LOCATE_SC_DEVICE_IOsa_flagspVecgeteuid_SC_SIGNALS__ctype_b_loc_SC_V7_ILP32_OFFBIGs_notified_pids_max_reqsH_X_FORWARDED_FORs_pid_dump_debug_info_ISalpha__fprintf_chktm_zone__mode_tm_queryStringOff_SC_V7_LP64_OFF64_SC_NPROCESSORS_CONF__RLIMIT_SIGPENDINGfdInlsapi_changeUGidtv_usec_SC_XOPEN_XCU_VERSIONold_childold_termLSAPI_sendfile_rlsapi_lve_error_SC_MEMLOCKallocateRespHeaderBuf_ISprintsched_yieldpMessages_liblvepValueH_CONTENT_LENGTHm_tmLastCheckPoint__vfprintf_chk_ISalnum_SC_SEM_VALUE_MAXs_req_processedstrtoll_SC_XOPEN_XPG2_SC_XOPEN_XPG3_SC_XOPEN_XPG4LSAPI_STATE_CONNECTED_IO_write_ptr_SC_REALTIME_SIGNALSsystemlsapi_packet_headerIPPROTO_ENCAP_ISspacelsapi_suexec_authgetLFg_prefork_server__suseconds_texitLSAPI_CreateListenSock2__rlim_ts_ignore_pid__RLIMIT_MEMLOCKpCurpHeaderValue__sizes_slow_req_msecslsapi_init_children_statusgetuidH_COOKIELSAPI_ParseSockAddrdlsympthread_lib_SC_PII_INTERNET_DGRAM_SC_SINGLE_PROCESSbyteReverseLSAPI_Accept_Before_Fork_SC_SHRT_MAX_ISxdigit_SC_RAW_SOCKETSfp_lve_enterLSAPI_AppendRespHeader_rH_CONNECTIONLSAPI_GetHeader_r_SC_MULTI_PROCESSs_stderr_log_pathm_statefp_lve_instance_init_SC_BC_BASE_MAXH_CONTENT_TYPELSAPI_STATE_ACCEPTING_SC_RTSIG_MAX_SC_NETWORKINGachCmdH_ACCEPT_SC_GETGR_R_SIZE_MAXcompareValueLocation_SC_THREAD_ATTR_STACKADDR_SC_LEVEL2_CACHE_ASSOC_SC_IOV_MAX_SC_TRACE_EVENT_NAME_MAX_SC_PII_INTERNETIPPROTO_IGMPpServerAddrlsapi_acceptlsapi_initLVE_IO_save_baseLSAPI_Release_riovecold_usr1maxIdleChldm_iMaxChildren_SC_2_UPEai_canonnameIPPROTO_IPV6_SC_DELAYTIMER_MAXpw_dirsa_mask__sigval_tLSAPI_Set_Extra_Childrens_restored_ppidsin6_flowinfom_pid_SC_SYSTEM_DATABASElsapi_prefork_server_acceptm_pIovecToWritem_respHeaderLenH_IF_MATCHai_family__nlink_tsi_addrst_inost_modeLSAPI_IsRunning_SC_T_IOV_MAXCGI_HEADER_LENIPPROTO_DCCP__in6_uGetHeaderVarH_ACC_CHARSET__stream_SC_XOPEN_STREAMSm_iMaxIdleChildrensendfile_IScntrlm_reqBufSizelsapi_child_statusprctlallocateEnvList_ISupperpStatuserr_nosival_intsi_codem_pReqBufwait_timestrcasecmpH_IF_UNMOD_SINCEpw_name_SC_TRACE_USER_EVENT_MAX__socklen_tsend_notification_pktlsapi_requestpKeyEndcurTimelsapi_writev__ssize_t__srclsapi_closepChrootH_IF_RANGEtimespecnameOff__u6_addr8strerror__RLIMIT_RSSavoidForkm_packetLenLSAPI_ReadReqBody_rIPPROTO_MPTCP_SC_2_FORT_RUNbindfp_lve_leave__val_SC_ADVISORY_INFO__timezone__ctype_toupper_locsin6_addr_SC_TIMER_MAXpBufCur_SC_THREADSunset_lsapi_envs__sighandler_t_SC_USER_GROUPS_RLSAPI_Set_Server_fdLSAPI_CreateListenSock__RLIMIT_LOCKSm_respPktHeaderEndLSAPI_On_Timer_pfLSAPI_Set_Max_Reqs_SC_UINT_MAXst_uids_conn_close_pktLSAPI_Postfork_ParentpEndpktTypelsapilib.cset_skip_write_SC_TRACE_NAME_MAX_lowers_busy_workers_SC_THREAD_DESTRUCTOR_ITERATIONSm_flagm_pHeaderIndexidle_SC_CHILD_MAXlsapi_reopen_stderr2_IO_save_endtm_min__nptrLSAPI_InitLSAPI_Request_SC_V6_LP64_OFF64_SC_NGROUPS_MAXm_bufProcessedfixHeaderIndexEndianfp_offsetlsapi_MD5TransformLSAPI_Write_Stderr_r__time_t_SC_THREAD_ROBUST_PRIO_INHERITgp_offset_padLSAPI_ForeachOrgHeader_rsigaddsetLSAPI_Inc_Req_Processedm_httpHeaderLendyingrealpathtm_yday_SC_SSIZE_MAX_SC_PII_OSI_CLTS_SC_SYSTEM_DATABASE_RpAuth_SC_LEVEL1_DCACHE_SIZEkeyLenextraChildrenLSAPI_Flush_rshort unsigned intrlim_curLSAPI_Reset_rs_lveold_ppidLSAPI_CB_EnvHandler_valueLen__blksize_t_SC_STREAMSSOCK_STREAMdigest_SC_PAGESIZE_SC_THREAD_PRIORITY_SCHEDULINGcountsi_pidIPPROTO_MTPs_stop_SC_CHARCLASS_NAME_MAXlsapi_header_offsetvfprintfsetgid_boundstm_wday__off64_t__fd__lenachBuf_sigsys_IO_read_base_SC_XBS5_ILP32_OFFBIGsend_req_received_notificationIPPROTO_EGPLSAPI_reset_server_statesockaddrs_defaultGids_keep_listenerm_cntUnknownHeadersreadfdsai_addrlenlongsopterr_SC_DEVICE_SPECIFIC_RLSAPI_Set_Restored_Parent_Pidpw_gecosm_iExtraChildrenLSAPI_No_Check_ppid_SC_PIPE_IO_write_base_SC_XOPEN_CRYPTm_respInfotz_dsttime_SC_PHYS_PAGESlsapi_enable_core_dumpH_CACHE_CTRLH_COOKIE2_SC_ATEXIT_MAX__desttm_mon_SC_SHRT_MIN_SC_FIFOH_USERAGENTs_min_avail_pages_SC_USER_GROUPSm_lLastActiveLSAPI_ForeachEnv_rSOCK_PACKETsa_sigactionnotify_req_received_SC_XBS5_ILP32_OFF32s_worker_status_IO_marker__builtin_strncpys_ppidtm_yearmax_children_SC_2_PBS_MESSAGEm_pRespBufEndtimevalorig_masktmCur_SC_XOPEN_REALTIME_THREADSfp_lve_is_availablepAddrs_defaultUidm_pChildrenStatus__fds_bits_SC_SPIN_LOCKSLSAPI_Set_Server_Max_Idle_Secsm_bufRead_SC_SPORADIC_SERVERlsapi_close_connection_SC_LEVEL1_DCACHE_LINESIZE__sigaction_handlerlsapi_signal_SC_PRIORITIZED_IOSOCK_SEQPACKET__pid_t_IO_codecvt_SC_GETPW_R_SIZE_MAXpUgidheadershints_SC_XOPEN_VERSIONH_RANGE_SC_BC_SCALE_MAX_SC_2_C_VERSIONdup2strtolg_reqlong doubleparseEnvai_socktype_SC_THREAD_KEYS_MAXiov_len_SC_LEVEL4_CACHE_LINESIZEfd_setlsapi_MD5Init_SC_NL_TEXTMAXnonblocklsapi_req_header_SC_LOGIN_NAME_MAXfind_child_statusIPPROTO_PIM_SC_XBS5_LP64_OFF64_SC_SPAWNmaxChildrennewlensi_statussigemptyset_pkeym_headerOff__RLIMIT_OFILEHTTP_HEADERS_SC_2_PBSs_proc_group_timer_cbpw_gid__errno_location_SC_XBS5_LPBIG_OFFBIG_SC_WORD_BIT_SC_2_PBS_ACCOUNTINGm_pSpecialEnvListsin6_scope_id_SC_AIO_MAX__oflag_SC_2_CHAR_TERMresolved_path_SC_LEVEL1_ICACHE_LINESIZE_IO_buf_baseai_flagsrealloc_SC_XOPEN_SHM__dev_t_SC_XOPEN_ENH_I18Nold_quitRLIMIT_CPU__glibc_reserved_IO_read_end_SC_ULONG_MAX_SC_TYPED_MEMORY_OBJECTS_SC_TIMEOUTS_SC_LEVEL2_CACHE_SIZEfinal_SC_XOPEN_UNIXm_pRespBufPos_IO_FILEin_addr_tm_fdH_HOST_IO_wide_datacookiestrlen_sifields_SC_LEVEL2_CACHE_LINESIZE__u6_addr16s_pidIPPROTO_AHLSAPI_ReqBodyGetLine_rtm_hoursetsidFlush_RespBuf_r_SC_THREAD_STACK_MINisPipe_SC_PII_OSI_Mm_respHeaders_global_counterRLIMIT_AS_SC_NL_MSGMAXsi_signom_pAppData__RLIMIT_MSGQUEUEachAddrm_inProcess_SC_THREAD_ROBUST_PRIO_PROTECT_ISgraph_lsapi_prefork_servertm_mdaypIntegerlsapi_siguser1__pad0_SC_BC_DIM_MAX__pad5_SC_LEVEL1_DCACHE_ASSOCmallocs_dump_debug_infos_avail_pages__u6_addr32_headerInfom_typesi_errnofinish_closelisten_SC_XOPEN_REALTIME_markersLSAPI_InitRequest_SC_SAVED_IDSpBindm_scriptFileOff_SC_INT_MAXsi_bands_log_level_namess_skip_writeH_VIAmemccpyIPPROTO_ESPm_pRespHeaderBufEnd_SC_TRACE_LOGgetpwnamtimeout_SC_THREAD_PRIO_PROTECTg_fnSelectRLIMIT_FSIZE__builtin_memcpyst_rdevlsapi_http_header_indexpEnv_SC_OPEN_MAXst_devdlerrorheaderIndex_SC_UIO_MAXIOVLSAPI_Logm_pRespHeaderBuf__int32_tH_PRAGMA/opt/cpanel/ea-ruby27/root/usr/local/share/gems/gems/ruby-lsapi-5.7/ext/lsapiqsortpSecretFile__RLIMIT_NLIMITS__daylightIPPROTO_RSVPH_REFERERIPPROTO_UDPLITESOCK_CLOEXECLSAPI_Set_Slow_Req_MsecsLSAPI_Prefork_Accept_r_sys_siglist_SC_CHAR_MAXLSAPI_Get_ppid_ISlowerpEnvEndsigprocmaskm_pUnknownHeadergetpwuidm_reqState_SC_PII_XTIpRespHeadersleftsysconfm_pRespBufm_iCurChildrensocketLSAPI_Write_r_SC_PII_OSI_COTSm_totalLenm_pIovecs_stderr_is_pipefstat_SC_PII_SOCKET__gid_tlsapi_sigpipe_SC_V6_LPBIG_OFFBIG_SC_MQ_PRIO_MAXgetcwdH_TRANSFER_ENCODINGH_IF_MODIFIED_SINCE__bsxai_nexts_enable_core_dump_SC_TRACE_EVENT_FILTERnodelaysin6_family__resolved_freeres_buf_sigfaultm_iChildrenMaxIdleTime_SC_THREAD_CPUTIMEsi_utimetv_sec_SC_VERSIONm_cntSpecialEnv_SC_C_LANG_SUPPORT_Rlong long unsigned intsa_handlersin_addr_cur_columnlsapi_load_lve_libtoWrite_SC_PIIsi_fd_SC_MAPPED_FILES_SC_LEVEL4_CACHE_SIZEIPPROTO_BEETPHfp_lve_jail_SC_2_FORT_DEVIPPROTO_IPm_pRespHeaderBufPosst_blockslsapi_initSuEXEC__bswap_16getpid__buf_SC_2_LOCALEDEFm_cntEnvlocaltime_r_SC_LEVEL1_ICACHE_SIZEreadBodyToReqBuftm_gmtoffIPPROTO_PUP_IO_backup_baseH_KEEP_ALIVE_IO_read_ptr_SC_CHAR_BITLSAPI_Register_Pgrp_Timer_Callbackmd5ctx__socket_type__nbytes_nameLengetenv_freeres_list__aps_max_busy_workersIPPROTO_ETHERNETH_IF_NO_MATCHlsapi_readsun_pathCGI_HEADERSsi_overrun__bswap_32pReq_SC_INT_MINlsapi_MD5Update_SC_RE_DUP_MAX_SC_PII_INTERNET_STREAMachBodyachPeer_SC_THREAD_ATTR_STACKSIZEfull_path_old_offset_SC_SIGQUEUE_MAXsiginfo_t_SC_FD_MGMTexpect_connected_SC_SYNCHRONIZED_IOLSAPI_STATE_IDLEvalueOff_SC_V7_ILP32_OFF32skipunlinksend_conn_close_notificationoptinds_accept_notifyH_ACC_LANG_SC_EXPR_NEST_MAX_SC_LEVEL3_CACHE_LINESIZElong long intm_pktHeaderin6addr_loopbacks_accepting_workersIPPROTO_IDP_flags2allocateIovec_SC_MESSAGE_PASSING__ch_SC_REGEX_VERSIONm_iLenLSAPI_Set_Max_Children__d1setuidtv_nsecm_scriptNameOfflsapi_perror_SC_FILE_LOCKING_SC_AVPHYS_PAGES_SC_MB_LEN_MAX_ISdigitsockaddr_in6IPPROTO_SCTP_SC_PII_OSI_SC_ARG_MAX__ino_tsetsockopt_SC_MEMLOCK_RANGELSAPI_Finish_r_SC_SHARED_MEMORY_OBJECTSlsapi_resp_headerin6addr_anym_pRequestMethodachError_SC_CHAR_MIN__realpath_chkiov_basem_lReqBegins_uids_total_pagespw_shell__namem_versionB0m_versionB1IPPROTO_GRE_SC_XOPEN_LEGACY_SC_NL_ARGMAXRLIMIT_COREsi_tidtobekilled_SC_THREAD_PRIO_INHERIT_SC_LEVEL3_CACHE_ASSOC_SC_NPROCESSORS_ONLNm_headerLenexpect_acceptingm_pIovecCurLSAPI_Init_Env_Parametersaddr_len_SC_HOST_NAME_MAXIPPROTO_TCPLSAPI_AppendRespHeader2_r_SC_COLL_WEIGHTS_MAX_SC_MONOTONIC_CLOCK__rlimit_resourcem_reqBodyReadLSAPI_Set_Max_Idle_SC_CLK_TCKLSAPI_ForeachSpecialEnv_rlsapi_buildPacketHeaderLSAPI_perror_r_SC_NL_SETMAX_SC_BARRIERSbodyLenpBeginLSAPI_Accept_rwait_secslsapi_reopen_stderrstrcmpst_mtim__statbuf__RLIMIT_NICEfn_select_tshort intlsapi_notify_pidsi_sigvalsetrlimit_vtable_offset_SC_IPV6mmapIPPROTO_ICMPlsapi_sigchild_SC_REGEXPlsapi_schedule_notifyLSAPI_Get_Slow_Req_Msecs_SC_V6_ILP32_OFFBIGmemchrtz_minuteswestH_ACC_ENCODINGsin6_portm_iMaxReqProcessTime__RLIMIT_RTPRIOrb_mWaitWritable_sys_errlistRUBY_Qnilrb_eNoMemErrorrb_cMethodrb_obj_wb_unprotectrb_eSyntaxErrorsockaddr_isoblockSizeRUBY_FL_EXIVARdmarkRUBY_DATA_FUNCrb_eIOErrorrb_data_object_getrb_cFilerb_eSignallsapi_dataRUBY_T_ARRAYrb_eKeyErroradd_env_railslsapi_addstrRUBY_FL_UNTRUSTEDrb_eZeroDivErrorlsapi_getscreateTempFiledfreeRUBY_T_IMEMOrb_global_variableROBJECT_EMBED_LEN_MAXRUBY_T_UNDEFrb_cStringrb_eEOFErrorLSAPI_GetReqBodyRemain_rrb_mKernelrb_output_fsrb_cModulesockaddr_nsRUBY_T_FALSEruby_robject_flagsrb_cIntegerRUBY_T_FILErb_cTrueClassRUBY_FL_USER0RUBY_FL_USER1RUBY_FL_USER2RUBY_FL_USER3RUBY_FL_USER4RUBY_FL_USER5RUBY_FL_USER6RUBY_FL_USER7RUBY_FL_USER8RUBY_FL_USER9rb_fsRUBY_T_COMPLEXdata_struct_objrb_eEncCompatErrorruby_special_constsRSTRING_EMBED_LEN_SHIFTruby_rarray_flagsruby_descriptionRStringMAX_BODYBUF_LENGTHlsapi_bodyrb_eNameErrorneedReadrb_eRegexpErrorrb_cBasicObjectRUBY_T_STRUCTrb_cRationalrb_cFloatrb_cClassrb_cStatbasicRUBY_QtrueRUBY_T_STRINGrb_cContrb_cFalseClassRARRAY_EMBED_LEN_SHIFTreadMaxBodyBufLengthRUBY_T_MODULErb_eArgErrorrb_eInterruptrecurrb_funcallvRUBY_FL_SINGLETONcapanReadRUBY_T_ZOMBIEfloatrb_stderrlsapi_eachrb_str_catbodyBufRARRAY_EMBED_LEN_MAXRUBY_T_FIXNUMrb_eSecurityErrorisEofBodyBuflsapi_processlsapi_flushRARRAY_EMBED_FLAGROBJECT_EMBEDRUBY_SYMBOL_FLAGrb_mComparableRUBY_FLONUM_FLAGrb_stdoutruby_rstring_flagsrb_cTimeruby_enginerb_output_rsROBJECT_ENUM_ENDrb_eFatalrb_funcall_argcsTempFilerb_funcall_argssharedlsapi_printfRUBY_T_OBJECTs_fn_add_envmunmapRSTRING_EMBED_LEN_MAXbodyCurrentLenrb_cNumerics_req_stderrrb_cHashrb_array_const_ptrrb_rsRArraylsapi_markRUBY_ELTS_SHAREDlsapi_envruby_release_daterb_cDirsetup_cgi_envlsapi_eofrb_array_const_ptr_transientreadTempFileTemplaterb_str_newsockaddr_x25rb_eLoadErrororig_stderrRUBY_FL_PROMOTED0RUBY_FL_PROMOTED1ruby_versionorig_stdoutsigngamruby_copyrightrb_eExceptionrb_yieldadd_env_no_fixRUBY_T_FLOATRUBY_T_CLASSrb_cDataftruncateruby_fl_typerb_cComplexrb_check_typeRUBY_T_HASHRUBY_T_NODEchdirrb_mErrnoruby_api_versionreadMoreRUBY_FL_WB_PROTECTEDisBodyWriteToFilerb_mWaitReadablelsapi_setsyncRUBY_FL_TAINTlsapi_printrb_eSystemCallErrorrb_intern2program_invocation_short_namerb_cUnboundMethodrb_f_sprintfrb_const_getrb_eScriptErrorfn_writelsapi_syncreadBodyBuflsapi_reopenrb_mGCrb_eIndexErrorcurPoslsapi_s_acceptpreforkRUBY_T_DATAbuffssizetypeRUBY_FL_DUPPED__builtin_strchrrb_array_lenfilenamelsruby.csockaddr_eonrb_string_value_ptrrb_eFloatDomainErrorlsapi_puts_aryblkSizeInit_lsapirb_eStandardErrorrb_cSymbolrb_argv0rb_cMatchrb_cEncodinglsapi_isattyRARRAY_EMBED_LEN_MASKRUBY_T_NONErb_mProcessrb_mFileTestremainrb_cEnumerator__builtin___memcpy_chkrb_io_putslsapi_s_postfork_childrb_define_global_constrb_obj_as_stringrb_funcall_nargsRDatarb_cRangerb_cObjectRVALUE_EMBED_LEN_MAXrb_gc_markinitBodyBufruby_strduprb_eNotImpErrorlsapi_s_postfork_parentsockaddr_inarprb_cIORSTRING_ENUM_ENDRUBY_T_BIGNUMRSTRING_NOEMBEDRUBY_T_RATIONALRUBY_FL_PROMOTEDs_bodyrb_eTypeErrorRBasicrb_eNoMethodErrorRUBY_T_ICLASSrb_num2intcLSAPIRUBY_SPECIAL_SHIFTRUBY_T_SYMBOLrb_num2char_inlineselfrb_eSystemExitisAllBodyReadrb_cThreadRUBY_FL_SEEN_OBJ_IDruby_platformsockaddr_ax25RSTRING_FSTRrb_eThreadErrorrb_str_new_staticshared_rootrb_cNilClassrb_stdinrb_eStopIterationRUBY_FL_USHIFTklassrb_define_classRUBY_FL_FINALIZErb_cRandommkstemplsapi_putcstrcatlsapi_writelsapi_putsorig_stdinRUBY_FIXNUM_FLAGargvRARRAY_ENUM_ENDrb_eRuntimeErrorrb_cProcRUBY_IMMEDIATE_MASKrb_hash_asetrb_cStructheapRARRAY_TRANSIENT_FLAGrb_typeRUBY_T_NILRUBY_T_MOVEDrb_eSysStackErrorrb_num2int_inlineprogram_invocation_namerb_cArrayrb_eEncodingErrorrb_ruby_verbose_ptrrb_cBindingrb_intern_id_cacherb_ary_detransientRUBY_FL_USER10RUBY_FL_USER11RUBY_FL_USER12RUBY_FL_USER13RUBY_FL_USER14RUBY_FL_USER15RUBY_FL_USER16RUBY_FL_USER17RUBY_FL_USER18RUBY_FL_USER19RUBY_T_MATCHlsapi_rewinds_reqrb_eRangeErrors_stderr_datarb_eval_string_wrapRUBY_T_MASKrb_lastline_getcreateBodyBufrb_eMathDomainErrorrb_fix2intLSAPI_GetReqBodyLen_rrb_gc_writebarrier_unprotectrb_exec_recursiverb_eLocalJumpError_sys_nerrlsapi_getcrb_hash_newclear_envrb_cRegexplsapi_binmoderb_cNameErrorMesgVALUErb_mMathRUBY_T_TRUEmemmemsockaddr_atruby_value_typerb_eNoMatchingPatternErrors_req_dataruby_rvalue_flagsrb_str_buf_newRUBY_FLONUM_MASKruby_patchlevelRUBY_T_REGEXPorig_envRUBY_Qundeflsapi_s_accept_new_connrb_eFrozenErrorsockaddr_dlRSTRING_EMBED_LEN_MASKRUBY_FL_FREEZEsockaddr_ipxrb_default_rsrb_string_valueenv_copyorig_verboserb_data_object_zallocrb_mEnumerableRUBY_Qfalselsapi_eval_string_wrapddqd <#!T)TuPPP(PPsPPKP[P"R+RRJQ^Q5Q5<v <Q{ PTt _X ~XX[TiT2TAXX[P[aQxT4T@PP{P{t XRr t;# $  %!r"p;# $  %!r"u?[gRSRbRHRQRR {RTKTiQX%vXvzr TiTTQq Ru .Q2QHQ+Q4QQoQQ;QQXP iR~Rv FRFW{ _Rz QK$KU$KKVKKUKIKTIKKSKK|hKKTK.KP.KPKQpKuKQuK}K?p K$KQ$KLKUpK}KU3KFK q 3KFK03KFKUQKpK8QKpK0QKpK\pKyK 7p yK}KQpK~K0pK}KUKK@KKUKKSKKVKKXKK0KKSKK|hJlJUlJJ]JJUJJ]JJUJJUJ0JT0JJSJJTJJTJJSJJTJJs@JJSJJSJJQJJ^JJQJJQJJ^JJ^7JTJPWJZJp?ZJaJPaJtJ\tJJPJJ_lJJUJJ | v"|JJ_|JJSJJTJJT|JJUJJ | v"JJ@JJSJJTJJs@JJ}JJ ~ JJQJJ\JJu`IIUII\IIUII\`IITIIT`IIQIIVIIvxIIVIIV`IIRII^IIRII^`IIXII]IIXII]dIITdIIUP@c@Uc@CVCrDUrDEVE.EU.EeEVeElFUlF;GV;GTIU@@P@@P@@P@APA0AS0ACAPVAiAP}AAPAAPAAPABP$B7BPKB^BPrBBPBBPBBPrDDSDDPDEPEEPEESlFFPDDsp"1DDP@@P@@PjApAPAAPAA0AAPBBPDDPDD0.E4EP:EQEP~@A0A!AP$AC\rDDPDD\DD0DD\DE0EE\lFF\FF0FH\H@I\EITI\@@P@@PAAPAAS5ACAP[AiAPAAPAAPBBP)B7BPPB^BPwBBPBBPBBPFGP"G,GP'CQCPE#EP HQHPFFPG!GP;GPGPPGTGUTGGVHHVHHQHHVI;IVEITIVFFPG!GPDGPGPPGTGUTGGVHHVHHQHHVI;IVEITIVWGpGPpGGSHHSI%IS%I6IP6I@ISEITISDGWG0DGPGPPGTGUTGWGV`GeG}eGpGQpGqG}`GpGPpGqGSGG@GG "!GGS]CtCP{C}C0G HP H HPfCtCPHHPHIS]>,?0,?C?]p;u<0<<P<=]=>]>,?0,?C?]p;u<0u<`=}=>}>>T>>}>,?0,?,?},?C?0p;u<0u<@=V@=V=PV==V==P=>V>>V>,?0,?0?V>?C?0p;`=S=:?S<< s $ &<<U=>0Z>c>0c>{>^{>>~>>~~>>~: ;U ;/;S/;0;U;;P99U9:S::U::S::U9S:\::S::@::6::W::4::  ::H4U4U U $$6U404^^ $^$6040000T9r0? $0404_\_\mm_ $_$60404K\KV\V\ $V$60SS 6S]] 6]USUSUST.V.T  wS  P ' S' W v(d r Pr x S     p`# p`# <$ c ~`# <$d x ~`# <$ vv" P c ^d x ^  \  0  P  S89P8:9QP+ PQQ + Q # 0 # 0 # P  U s U ) P) > S> k Pk n Sn r Pr s S 7L7UL77U 7H7TH7w7Vw7x7Tx77VM7Z7Px77P55U56V6?6U?66V66U66V66U56T6?6T?6F6TF66\66T66T66\66T66P66P66\T6g6Pg66S66UF66]66n2(3U(34\44U223T23(4V(404T044T223Q234]44Q63Y3PY3c3pc3t3Pt3~3^33p33P33S34P4,4,4h4L3p3Qp3~3R33Q33R3 4T 4 4tp 44T414^4(4V(404T0414T404|I4R4QR4S4VI4R4TR4S4]I4R4|_(l(Pl(v(u_(v(3_(l(ul(v(P''U''U''U''T''Q''T''T''Q''R''Q''QP''U''U''UP''T''Q''T''TP''Q''R''Q''Q0`U`SSU0`T`^TT0`Q`VQVQQ0`R`]R]RRD\~1$~"3$U"T $ &33$U"\~1$~"3$U"T $ &33$U"\`iP{P0%%U%&S&&}&+'U+'9'}9'@'U@'E'U0%%T%&_&9'}9'@'T@'E'}0%%Q%9'|9'@'Q@'E'|%%V%%vb%%0%%p 9'@'0%%Q&&Q%%P&&Pb%%0%%^%%~%&^&'}+'9'}9'@'0c&u&}u&&]&&}&&}&&]+'9'}K&&_+'9'_c&&S+'9'SK&X&V_&u&Vu&&}&&t&&T&&}#+'9'V%'\+'9'\&&P&'}+'9'}&&V&&v8$8&2$p"&& v8$8&2$p"c&c&5c&c& c&c&^#|$U|$$U$$U$ %U %%U%$%U#w#Tw#$S$$T$%S%%T%$%T#w#Qw#$V$$Q$%V% %Q %%V%%Q%$%Q##P##p$$0$$0$$^$%^<#w#0##r ##t %%0##Q$$q$!$qpI$Y$RY$m$q %%qp$$P$$P$%P<#w#0w##\##|#,$\,$_$|_$$\$%\ %%\%%0$!$T3$m$T %%T%%q`$!$X>$B$RB$$X %%X#$P %%P#$Y %%Y !U!7!S7!p!wp!{!{!!U!!S!*"w*""U""w !T uF!q!S!!S!!s""S""P""P{!!|I"o"|o""P{!!VD""V""v""V{!!_I""_{!!}D"d"}{!!]""]{!!^""^o""q2$u"""q2$u"o""v8$8&2$u"""v8$8&2$u"""v8$8&2$u"((U(=)S=)>)U>)Q)UQ)b)Sb))U()0) )P!)&) &)<)P>))0(( uu@()Q>)Q) uu@b)|) uu@()P( )s ))T))s()s()Pt u T p p# p`# tp# Q P 4 T2D2UD22S22~~22U22S22~~22U22U2D2TD22V22T22T22T22V22T22T2D2QD22]22Q22Q22Q22]22Q22Q2D2RD22\22R22R22R22\22R22R2)2u)22^22U#22^22U#22uU2Z2|Z2u2PU2u24U2u2^`U< ]< H UH b ]b k U`T< VH b V`Q5 SH [ S[ ^ sp^ b SP}q $ &}} $ &P\H b PP0< \H b \P\V 0 SH H S 0 VH H V 0 ^H H ^ PH b P  S  V  ^ZUZ^UH^H\UQTQ]TH]H\TZQZHQH\QZRZ\RH\H\RlSHS?ZSZ_H_HRSP\QTQZ]ZVUVVUHVH\TT__PPSS__UVU(4^(3 p $ &37 s $ &USUSUUSss $ &0yTyTMYQYn t2$x"#4nyRU)S)*UUPU0//U/0S0 0U 0#0S#0)0U./U/[/S[/\/U\/a/Ua/o/So/u/UWWUWXSXXUXYSYYUYPYSPYUYUY#YsY#YsY#YsY0Y !Y#Ys U S"U"rSrU'T'V"]V]_P_rVrTdlP3  303}@3}S?LPL}\V]d2]d o3JP,2,U2,h,Vh,k,Uk,,V,<,T<,j,\j,k,Tk,,\,G,QG,,Q-,H,0H,L,Pk,,P,,R+:+U:++\++U++\+:+T:++^++T++^+:+Q:+V+SV++Q++P++p $  $-(q++ q++  U uh U T T q Rq w Rw y Ry R q Zw Z 0  [  p * X- q [q 0 0 T t  u|#- 4 T4 7 pD W T^ b tb q u|#q 00 C UC n Sn p Up w S0 G TG o Vo w TH _ P_ i sp u P U S U S U U S T V T V T V P P P0_U_VUV07T7\T\@JUJrVrvQvwU@UTUcScvRvwT@UV}U}V.U.VU@T|]|}T}.].5T5]v\S} S R.:v:\S\S P}Pv  \c "c c\SWRWXuSWQWX]SWs} 2}d}S 8dUS. F (s U  S  U  S $ U$ * U Q$ * Q P ) P) * u t $ & P  \  \ T  V  V  ^  ^ P ] $ P \ V ^G P P U V U VU T _ T _T Q \ Q \Q R ^ R z^zRR P S %P%XSXdPdS R ] ]R U SS(S T VT9V 4}4]}*\kPS(P(QS*S04^0QTPThSsS'<'<S',},<\l\UvFQSs0s0s}Q | Q|V\dUdU}P_U_/0/LPLn__UdSPnSSPSdnPPQQRX))U)*^**U**U**U**U))T)*~**T**~**T**~))Q))w)*Q**Q**Q**Q**Q))Q))w)*Q))T)*~))U)*^**S)*~*`*_`*v*v**_&*f*Qf****}x**Qj**]**P{**P**]{**2{**w{**~{**P**]{**2D*T*qT*j*PD*j*6D*j*\,-U--V-T.UT..V..Q..U..U..V..U..V..U,- T.q. .. .. .. ,-W--ST.q.S..S..S..S,-U-{-V{--ST.q.S..U..V..S..V,V-0V-h-U..0r--P..P- - - -W{--_--\{--S{-- -.S*.T.S..S--P--V*.;.P;.T.V..P..V-- A--Sq..V..Q..U000U01S11U11S11U11S000T0111T1111T1111T11000Q00V01Q11Q11V11Q11V00V01Q11Q11V01111101S11S11S00]0 1T 11x1b1Tn11T11T01V11V000F1^F1R1rpR11^11^0-1_-151x511_11_0b1Yq11Y11Y11Y00R11R11 @00400T11V1111_45U5%5U%5/5U/55\55U55\55U45T5%5T%5F5TF55V55T55V55T45Q5%5Q%5P5QP55Q55Q55S55s55}%55S55}55S55P55st"%575P75F5st"1F5f5vs"1K5`5T`5b5tpb5f5Tq55Sq55Vq55|7 7U 77U77U7 7T 77T77T77U78U88U88U77T78V88T88V88T88V77Q78]88Q88]88Q88]77Q78]88Q88]88]77T78V88T88V88V77U7^8\88\K LU LWL_WLLULP_P$PU$POW_OWTWUTWW_LLP,LWL\LL\,LWLVLLV,LWLSLLS=LGLPLLP,L=L\,L=LV,L=LSLP_OPOW_TWW_qMMPLPSOPDUS\UOWSTWWSLL1LLPLLQ8MqMV8MqM\.MqM]NMXMPqMMP8MNMV8MNM\8MNM]MPSOP,RS\UUSV0VSW/WSMP_OP,R_\UU_V0V_W/W_MM p1OPQ p1MP\OP,R\\UU\V0V\W/W\MNVMNMNMNVMNMNMNPNONVNONNON!NONV!NON!NON8NONPyOO_RiR_RDU_\UV_5VV_4WOW_TWW_yOO#R,R#\UhU#yO{O0{OOPOOpOOPOOROPQ_OPQPOPkPpOPQpSPkPQkPyPp kPQp oPyPQyPPpyPQp}PPQPPpPPpPQp PPpPPpPQp PPpPPpPQpPPQPPpPPp PQp PPp!PPp$PQp$ PPp%PPp(PQp(PPQPPp)QEQPEQIQp"Q'Qp1$q""Q.Qp1$q"3QEQQ3QEQQ6QEQRiQQPQQppQRPpQRQQQPQQppQQPQRppQQRQQRQQRQQR\UU_iUUPvRRVvRR_RRPRU_UV_5VV_4WOW_TWW_RDS\DSGSPGSSwST\UU\UU0UU\RKS]KSSPSS~ST]UU]TUPRU0UV05VV04WOW0TWW0R SZ SSzhUUzhUU0 SSZUUZRRpRSXUUX_SS__SSz|_SSRSS~_SSz_SSzSS\SS}pSS@SS "!SS]TT0UV05VV0VV04WJW0TWW0WW0T T~UUP8VXV\VVVTT_UV_5VV_VV_4WJW_TWW_WW_^TpTPyTTPTTPTTPUUPUVVAVXVPiVVPVVPVVPVVVVVP4WIWPWWPWWVT2TP2TT]UUP5V@VP@VXV]XVzV0VV]VV]VVPTWW] TT_UU_XVzV_VV_TWW_ T3T 3T;TPTWgWPhWW_UUHUU0UU "!U4UU4UU4UUDU !U4UPJP P$PU$PJP_.PJPPOVOTpqPPqP0uVT0V0T0?0T0?0nPP PPSSPS,8P8HSHcTSSH\TpSH\ #!Tp #!vv #!vPUU U  S  P U U  S  P S  S      0  0 U S D UD g Sg u Uu  S U S U T V D TD a Va u Tu  V T V T Q Q P  ] + P+ C ]C D P ] S  SW u P \ v| v| $0 $+(  v $0 $+( ? v $0 $+( v $0 $+(  P PL V Uu | U U u@aUN'! $ &'!"^a'! $ &'!"O^PNQ^aQpUUPPpUU`lUlqSqrP`lTlrTUUTTQSQPUwwUw1PT]wTTWPQpVpwQwQV{0S8=S0 s $ &3$}") s $ &3$}"UVWUTS,AS&V,WV+PUVS,9S0 U V U V0 S TS S T S PP S TS S S S S U VU3UTUUUUU U!U!UkPP0000SU\UTSTQQRRXX@USSSS@TVTTVTVT_V@Q\3Q3\JQJ_\@{R{]R]RG]G^ R Z]Z_^@XX3X3XJXJ_X7PPP_JTPT__`hUhmU`USQUS`TVRTV`QQQQVRTVSQUS\\rV * Vg q  q V@Y YiPiV * V* 4 P4 VRVPVyS* q SN q U Z pZ ^ UR n Pn \ PD } S  P6 > P * U U T UT S U S U  U T TT V T V T  V T QT Q Q  QT ] } ] ]T _ S Sd  d  |  |d l Sl  S Sv  S S U  U Q  Q T  V1U1.U.:U:PU1T1.T.=T=PT1Q1SQ.S.AQACSCPQ10UP^P.^1_UU       9>ACFQxx| *)SX 05:@nOh"'3"'3TY}O[]dRV] 0 P P  0 P P {!!!"""{!!""`"h"p""""`"h"""%'0'9'.&5&B&G&c&c&_(e(l(v(((() )))* **`*f*{**D*D*I*Q*;+>+c+n+q++,,,-X.x.....,,- --.0.X...0111110000U2U2`2j2D3c3k3~333334%4,41464<4I4S455+5555q5w5{55777 8 888888s:}:::s:}:::::::::O<T<<<<<=>`>>@@@@BQC E0EFH HXHHHI;IEITIFGHHI;IEITIDGGHHI;IEITIQCChEpFH HXHHHIhEEXHHHIEpFHHdIdIxII_JJJJ|J|JJJJJJJJJJJJJJJpKpKuKwKyK~KKKKKKKKK,LWLLL0LWLLLWL\LL POPiSiSUUUUOWTWWMPOP,R\UUV5VW4WyOyOOOOP\PaPdPhPkP\PaPdPhPkPrPvPyPrPvPyPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPQQQQQQQQQQQQQQQQQQQQQQQRiSiSUUV5VV4W@WEWOWTW`WcWWUSeSiSiSiSSSSUS_S_SeSiSiSiSSSSiSqSSSSSTTUV8VV4W@WEWOWTW`WcWWTTTTUUUV8VV4W@WEWOWTW`WcWW T;TUUTW`WcWW T;TTW`WcWWUUUUUDUYYYYY0YYYZ ZUZaZZZ@[]^_`_`8`` aHaaa0b > I S pXP !X !` !h !X!!`!@!'a !"  `T - SE Sa S~ S S S S S `T. eTI `TW eTu T pT! T T T  U" Ts- UJ Ue U sx"!z U /U #! /U \ 0UY \2 ]L \Y ]z ] ]k"! ] ] ]G ]: 5^X ]Ui 5^ ^ @^ ^ _ ^ _  `5 _P#!_#!s!! ` a ` a# aN aalH#!| a b b b ?c bO&<#!-8#!= ?ch e @cY e ah"! !@4#! ah$ $j@ phO(#!e!r $j [kU 0j+ [k m `k6 `!% ,#!7  mS  mm  m  m "! "!  m  n  n  n4  nf  ,n "!  ,n  o  o  p @#!' #!;  p\  p{  p  p  p  9q  9q  q+  qL  qk  q  Mr  Mr  s  s"  tC  tb  9u  9u  \w  !  \w  y ! d0 yU {xd { { { F| F|D |m | } } \#! \ Q7 `F Qc ~ `"!  M = M Ճ*p!7 Ճ[ }  V V % % C k + + ] ] t! tG k  !!!   3+ 3S y  э! э P$#!#!3"!B Pg   `!!! ! !@!! ' Gd!R t ˓ ˓   , V (~ ( H H d, dT {z0#! {    ; W  "!"!"!"!"!"!"!"!#"!0"!6 Y @z @ h h Y Y  #( #? T 0 \!b@$o!(|    ! > Ѹi Ѹ    S S  S( SG Sa S S S     "- :'!A "Z [q 0+{ [ h ` h w p w! < J h ҹ B'! ҹ Z z`#!'! Z  m+  ` 6  mQ  j  pv    g 0!   a  a ! a#! ;! p2F! a! Wz! ! W! r! `! r! !  " 3" X" p"(!v" " " " " ## -;# Y# u# '!#h#!#'!# # 3# 3 $ 3&$ _A$ @O$ _k$ $ `$ !$'!$p#!$ $ $  %#!% .% F% 4Q% r% % % % % *% % & U& ;& W& f& & '& & '& & 0& & P' P' P8' Q' PO]' w' '#!'x#!''!''!'' S' S' T(@!(X !=( PTI(P !'h(v( |(` !(h !(p(@!(! p>(( {F( )!) p :) n J)c)))) ))))*/*C*X* |f* **** P|* Prl* ti* n +4+?+R+i++ U+8!++++ 0+@!+ , q],7,H, p], pm, {, l,,, ,,,,-*- s >-R-d-x- --- `-- - . .2.6=.W. k. qS}. m7. p.... o../ / }l)/p>s>> ~ I I SSK} p ppXXL P !P X !X ` !`  h !h X!X!X`!` @!@ 0@-'ap@,8``;`G~^U@mfa0*Hlw!*=$ Hh8ѠPK! 3O8aa3share/gems/gems/ruby-lsapi-5.7/ext/lsapi/lsapilib.cnu[//#define LSAPI_DEBUG /* Copyright (c) 2002-2018, Lite Speed Technologies Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the Lite Speed Technologies Inc nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "lsapilib.h" #if defined(linux) || defined(__linux) || defined(__linux__) || defined(__gnu_linux__) #include #endif #if defined(__FreeBSD__ ) || defined(__NetBSD__) || defined(__OpenBSD__) \ || defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__) #include #endif #include #ifndef uint32 #define uint32 uint32_t #endif struct lsapi_MD5Context { uint32 buf[4]; uint32 bits[2]; unsigned char in[64]; }; void lsapi_MD5Init(struct lsapi_MD5Context *context); void lsapi_MD5Update(struct lsapi_MD5Context *context, unsigned char const *buf, unsigned len); void lsapi_MD5Final(unsigned char digest[16], struct lsapi_MD5Context *context); /* * This is needed to make RSAREF happy on some MS-DOS compilers. */ typedef struct lsapi_MD5Context lsapi_MD5_CTX; #define LSAPI_ST_REQ_HEADER 1 #define LSAPI_ST_REQ_BODY 2 #define LSAPI_ST_RESP_HEADER 4 #define LSAPI_ST_RESP_BODY 8 #define LSAPI_ST_BACKGROUND 16 #define LSAPI_RESP_BUF_SIZE 8192 #define LSAPI_INIT_RESP_HEADER_LEN 4096 enum { LSAPI_STATE_IDLE, LSAPI_STATE_CONNECTED, LSAPI_STATE_ACCEPTING, }; typedef struct lsapi_child_status { int m_pid; long m_tmStart; volatile short m_iKillSent; volatile char m_inProcess; volatile char m_state; volatile int m_iReqCounter; volatile long m_tmWaitBegin; volatile long m_tmReqBegin; volatile long m_tmLastCheckPoint; } lsapi_child_status; static lsapi_child_status * s_worker_status = NULL; static int g_inited = 0; static int g_running = 1; static int s_ppid; static int s_restored_ppid = 0; static int s_pid = 0; static int s_slow_req_msecs = 0; static int s_keep_listener = 1; static int s_dump_debug_info = 0; static int s_pid_dump_debug_info = 0; static int s_req_processed = 0; static int s_skip_write = 0; static int (*pthread_atfork_func)(void (*prepare)(void), void (*parent)(void), void (*child)(void)) = NULL; static int *s_busy_workers = NULL; static int *s_accepting_workers = NULL; static int *s_global_counter = &s_req_processed; static int s_max_busy_workers = -1; static char *s_stderr_log_path = NULL; static int s_stderr_is_pipe = 0; static int s_ignore_pid = -1; static size_t s_total_pages = 1; static size_t s_min_avail_pages = 256 * 1024; static size_t *s_avail_pages = &s_total_pages; LSAPI_Request g_req = { .m_fdListen = -1, .m_fd = -1 }; static char s_secret[24]; static LSAPI_On_Timer_pf s_proc_group_timer_cb = NULL; void Flush_RespBuf_r( LSAPI_Request * pReq ); static int lsapi_reopen_stderr(const char *p); static const char *CGI_HEADERS[H_TRANSFER_ENCODING+1] = { "HTTP_ACCEPT", "HTTP_ACCEPT_CHARSET", "HTTP_ACCEPT_ENCODING", "HTTP_ACCEPT_LANGUAGE", "HTTP_AUTHORIZATION", "HTTP_CONNECTION", "CONTENT_TYPE", "CONTENT_LENGTH", "HTTP_COOKIE", "HTTP_COOKIE2", "HTTP_HOST", "HTTP_PRAGMA", "HTTP_REFERER", "HTTP_USER_AGENT", "HTTP_CACHE_CONTROL", "HTTP_IF_MODIFIED_SINCE", "HTTP_IF_MATCH", "HTTP_IF_NONE_MATCH", "HTTP_IF_RANGE", "HTTP_IF_UNMODIFIED_SINCE", "HTTP_KEEP_ALIVE", "HTTP_RANGE", "HTTP_X_FORWARDED_FOR", "HTTP_VIA", "HTTP_TRANSFER_ENCODING" }; static int CGI_HEADER_LEN[H_TRANSFER_ENCODING+1] = { 11, 19, 20, 20, 18, 15, 12, 14, 11, 12, 9, 11, 12, 15, 18, 22, 13, 18, 13, 24, 15, 10, 20, 8, 22 }; static const char *HTTP_HEADERS[H_TRANSFER_ENCODING+1] = { "Accept", "Accept-Charset", "Accept-Encoding", "Accept-Language", "Authorization", "Connection", "Content-Type", "Content-Length", "Cookie", "Cookie2", "Host", "Pragma", "Referer", "User-Agent", "Cache-Control", "If-Modified-Since", "If-Match", "If-None-Match", "If-Range", "If-Unmodified-Since", "Keep-Alive", "Range", "X-Forwarded-For", "Via", "Transfer-Encoding" }; static int HTTP_HEADER_LEN[H_TRANSFER_ENCODING+1] = { 6, 14, 15, 15, 13, 10, 12, 14, 6, 7, 4, 6, 7, 10, //user-agent 13,17, 8, 13, 8, 19, 10, 5, 15, 3, 17 }; static const char *s_log_level_names[8] = { "", "DEBUG","INFO", "NOTICE", "WARN", "ERROR", "CRIT", "FATAL" }; void LSAPI_Log(int flag, const char * fmt, ...) { char buf[1024]; char *p = buf; if ((flag & LSAPI_LOG_TIMESTAMP_BITS) && !(s_stderr_is_pipe)) { struct timeval tv; struct tm tm; gettimeofday(&tv, NULL); localtime_r(&tv.tv_sec, &tm); if (flag & LSAPI_LOG_TIMESTAMP_FULL) { p += snprintf(p, 1024, "%04d-%02d-%02d %02d:%02d:%02d.%06d ", tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec, (int)tv.tv_usec); } else if (flag & LSAPI_LOG_TIMESTAMP_HMS) { p += snprintf(p, 1024, "%02d:%02d:%02d ", tm.tm_hour, tm.tm_min, tm.tm_sec); } } int level = flag & LSAPI_LOG_LEVEL_BITS; if (level && level <= LSAPI_LOG_FLAG_FATAL) { p += snprintf(p, 100, "[%s] ", s_log_level_names[level]); } if (flag & LSAPI_LOG_PID) { p += snprintf(p, 100, "[UID:%d][%d] ", getuid(), s_pid); } if (p > buf) fprintf(stderr, "%.*s", (int)(p - buf), buf); va_list ap; va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap); } #ifdef LSAPI_DEBUG #define DBGLOG_FLAG (LSAPI_LOG_TIMESTAMP_FULL|LSAPI_LOG_FLAG_DEBUG|LSAPI_LOG_PID) #define lsapi_dbg(...) LSAPI_Log(DBGLOG_FLAG, __VA_ARGS__) #else #define lsapi_dbg(...) #endif #define lsapi_log(...) LSAPI_Log(LSAPI_LOG_TIMESTAMP_FULL|LSAPI_LOG_PID, __VA_ARGS__) void lsapi_perror(const char * pMessage, int err_no) { lsapi_log("%s, errno: %d (%s)\n", pMessage, err_no, strerror(err_no)); } static int lsapi_parent_dead() { // Return non-zero if the parent is dead. 0 if still alive. if (!s_ppid) { // not checking, so not dead return(0); } if (s_restored_ppid) { if (kill(s_restored_ppid,0) == -1) { if (errno == EPERM) { return(0); // no permission, but it's still there. } return(1); // Dead } return(0); // it worked, so it's not dead } return(s_ppid != getppid()); } static void lsapi_sigpipe( int sig ) { } static void lsapi_siguser1( int sig ) { g_running = 0; } #ifndef sighandler_t typedef void (*sighandler_t)(int); #endif static void lsapi_signal(int signo, sighandler_t handler) { struct sigaction sa; sigaction(signo, NULL, &sa); if (sa.sa_handler == SIG_DFL) { sigemptyset(&sa.sa_mask); sa.sa_flags = 0; sa.sa_handler = handler; sigaction(signo, &sa, NULL); } } static int s_enable_core_dump = 0; static void lsapi_enable_core_dump(void) { #if defined(__FreeBSD__ ) || defined(__NetBSD__) || defined(__OpenBSD__) \ || defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__) int mib[2]; size_t len; #if !defined(__OpenBSD__) len = 2; if ( sysctlnametomib("kern.sugid_coredump", mib, &len) == 0 ) { len = sizeof(s_enable_core_dump); if (sysctl(mib, 2, NULL, 0, &s_enable_core_dump, len) == -1) perror( "sysctl: Failed to set 'kern.sugid_coredump', " "core dump may not be available!"); } #else int set = 3; len = sizeof(set); mib[0] = CTL_KERN; mib[1] = KERN_NOSUIDCOREDUMP; if (sysctl(mib, 2, NULL, 0, &set, len) == 0) { s_enable_core_dump = 1; } #endif #endif #if defined(linux) || defined(__linux) || defined(__linux__) || defined(__gnu_linux__) if (prctl(PR_SET_DUMPABLE, s_enable_core_dump,0,0,0) == -1) perror( "prctl: Failed to set dumpable, " "core dump may not be available!"); #endif } static inline void lsapi_buildPacketHeader( struct lsapi_packet_header * pHeader, char type, int len ) { pHeader->m_versionB0 = LSAPI_VERSION_B0; /* LSAPI protocol version */ pHeader->m_versionB1 = LSAPI_VERSION_B1; pHeader->m_type = type; pHeader->m_flag = LSAPI_ENDIAN; pHeader->m_packetLen.m_iLen = len; } static int lsapi_set_nblock( int fd, int nonblock ) { int val = fcntl( fd, F_GETFL, 0 ); if ( nonblock ) { if (!( val & O_NONBLOCK )) { return fcntl( fd, F_SETFL, val | O_NONBLOCK ); } } else { if ( val & O_NONBLOCK ) { return fcntl( fd, F_SETFL, val &(~O_NONBLOCK) ); } } return 0; } static int lsapi_close( int fd ) { int ret; while( 1 ) { ret = close( fd ); if (( ret == -1 )&&( errno == EINTR )&&(g_running)) continue; return ret; } } static void lsapi_close_connection(LSAPI_Request *pReq) { if (pReq->m_fd == -1) return; lsapi_close(pReq->m_fd); pReq->m_fd = -1; if (s_busy_workers) __atomic_fetch_sub(s_busy_workers, 1, __ATOMIC_SEQ_CST); if (s_worker_status) __atomic_store_n(&s_worker_status->m_state, LSAPI_STATE_IDLE, __ATOMIC_SEQ_CST); } static inline ssize_t lsapi_read( int fd, void * pBuf, size_t len ) { ssize_t ret; while( 1 ) { ret = read( fd, (char *)pBuf, len ); if (( ret == -1 )&&( errno == EINTR )&&(g_running)) continue; return ret; } } /* static int lsapi_write( int fd, const void * pBuf, int len ) { int ret; const char * pCur; const char * pEnd; if ( len == 0 ) return 0; pCur = (const char *)pBuf; pEnd = pCur + len; while( g_running && (pCur < pEnd) ) { ret = write( fd, pCur, pEnd - pCur ); if ( ret >= 0) pCur += ret; else if (( ret == -1 )&&( errno != EINTR )) return ret; } return pCur - (const char *)pBuf; } */ static int lsapi_writev( int fd, struct iovec ** pVec, int count, int totalLen ) { int ret; int left = totalLen; int n = count; if (s_skip_write) return totalLen; while(( left > 0 )&&g_running ) { ret = writev( fd, *pVec, n ); if ( ret > 0 ) { left -= ret; if (( left <= 0)||( !g_running )) return totalLen - left; while( ret > 0 ) { if ( (*pVec)->iov_len <= (unsigned int )ret ) { ret -= (*pVec)->iov_len; ++(*pVec); } else { (*pVec)->iov_base = (char *)(*pVec)->iov_base + ret; (*pVec)->iov_len -= ret; break; } } } else if ( ret == -1 ) { if ( errno == EAGAIN ) { if ( totalLen - left > 0 ) return totalLen - left; else return -1; } else if ( errno != EINTR ) return ret; } } return totalLen - left; } /* static int getTotalLen( struct iovec * pVec, int count ) { struct iovec * pEnd = pVec + count; int total = 0; while( pVec < pEnd ) { total += pVec->iov_len; ++pVec; } return total; } */ static inline int allocateBuf( LSAPI_Request * pReq, int size ) { char * pBuf = (char *)realloc( pReq->m_pReqBuf, size ); if ( pBuf ) { pReq->m_pReqBuf = pBuf; pReq->m_reqBufSize = size; pReq->m_pHeader = (struct lsapi_req_header *)pReq->m_pReqBuf; return 0; } return -1; } static int allocateIovec( LSAPI_Request * pReq, int n ) { struct iovec * p = (struct iovec *)realloc( pReq->m_pIovec, sizeof(struct iovec) * n ); if ( !p ) return -1; pReq->m_pIovecToWrite = p + ( pReq->m_pIovecToWrite - pReq->m_pIovec ); pReq->m_pIovecCur = p + ( pReq->m_pIovecCur - pReq->m_pIovec ); pReq->m_pIovec = p; pReq->m_pIovecEnd = p + n; return 0; } static int allocateRespHeaderBuf( LSAPI_Request * pReq, int size ) { char * p = (char *)realloc( pReq->m_pRespHeaderBuf, size ); if ( !p ) return -1; pReq->m_pRespHeaderBufPos = p + ( pReq->m_pRespHeaderBufPos - pReq->m_pRespHeaderBuf ); pReq->m_pRespHeaderBuf = p; pReq->m_pRespHeaderBufEnd = p + size; return 0; } static inline int verifyHeader( struct lsapi_packet_header * pHeader, char pktType ) { if (( LSAPI_VERSION_B0 != pHeader->m_versionB0 )|| ( LSAPI_VERSION_B1 != pHeader->m_versionB1 )|| ( pktType != pHeader->m_type )) return -1; if ( LSAPI_ENDIAN != (pHeader->m_flag & LSAPI_ENDIAN_BIT )) { register char b; b = pHeader->m_packetLen.m_bytes[0]; pHeader->m_packetLen.m_bytes[0] = pHeader->m_packetLen.m_bytes[3]; pHeader->m_packetLen.m_bytes[3] = b; b = pHeader->m_packetLen.m_bytes[1]; pHeader->m_packetLen.m_bytes[1] = pHeader->m_packetLen.m_bytes[2]; pHeader->m_packetLen.m_bytes[2] = b; } return pHeader->m_packetLen.m_iLen; } static int allocateEnvList( struct LSAPI_key_value_pair ** pEnvList, int *curSize, int newSize ) { struct LSAPI_key_value_pair * pBuf; if ( *curSize >= newSize ) return 0; if ( newSize > 8192 ) return -1; pBuf = (struct LSAPI_key_value_pair *)realloc( *pEnvList, newSize * sizeof(struct LSAPI_key_value_pair) ); if ( pBuf ) { *pEnvList = pBuf; *curSize = newSize; return 0; } else return -1; } static inline int isPipe( int fd ) { char achPeer[128]; socklen_t len = 128; if (( getpeername( fd, (struct sockaddr *)achPeer, &len ) != 0 )&& ( errno == ENOTCONN )) return 0; else return 1; } static int parseEnv( struct LSAPI_key_value_pair * pEnvList, int count, char **pBegin, char * pEnd ) { struct LSAPI_key_value_pair * pEnvEnd; int keyLen = 0, valLen = 0; if ( count > 8192 ) return -1; pEnvEnd = pEnvList + count; while( pEnvList != pEnvEnd ) { if ( pEnd - *pBegin < 4 ) return -1; keyLen = *((unsigned char *)((*pBegin)++)); keyLen = (keyLen << 8) + *((unsigned char *)((*pBegin)++)); valLen = *((unsigned char *)((*pBegin)++)); valLen = (valLen << 8) + *((unsigned char *)((*pBegin)++)); if ( *pBegin + keyLen + valLen > pEnd ) return -1; if (( !keyLen )||( !valLen )) return -1; pEnvList->pKey = *pBegin; *pBegin += keyLen; pEnvList->pValue = *pBegin; *pBegin += valLen; pEnvList->keyLen = keyLen - 1; pEnvList->valLen = valLen - 1; ++pEnvList; } if ( memcmp( *pBegin, "\0\0\0\0", 4 ) != 0 ) return -1; *pBegin += 4; return 0; } static inline void swapIntEndian( int * pInteger ) { char * p = (char *)pInteger; register char b; b = p[0]; p[0] = p[3]; p[3] = b; b = p[1]; p[1] = p[2]; p[2] = b; } static inline void fixEndian( LSAPI_Request * pReq ) { struct lsapi_req_header *p= pReq->m_pHeader; swapIntEndian( &p->m_httpHeaderLen ); swapIntEndian( &p->m_reqBodyLen ); swapIntEndian( &p->m_scriptFileOff ); swapIntEndian( &p->m_scriptNameOff ); swapIntEndian( &p->m_queryStringOff ); swapIntEndian( &p->m_requestMethodOff ); swapIntEndian( &p->m_cntUnknownHeaders ); swapIntEndian( &p->m_cntEnv ); swapIntEndian( &p->m_cntSpecialEnv ); } static void fixHeaderIndexEndian( LSAPI_Request * pReq ) { int i; for( i = 0; i < H_TRANSFER_ENCODING; ++i ) { if ( pReq->m_pHeaderIndex->m_headerOff[i] ) { register char b; char * p = (char *)(&pReq->m_pHeaderIndex->m_headerLen[i]); b = p[0]; p[0] = p[1]; p[1] = b; swapIntEndian( &pReq->m_pHeaderIndex->m_headerOff[i] ); } } if ( pReq->m_pHeader->m_cntUnknownHeaders > 0 ) { struct lsapi_header_offset * pCur, *pEnd; pCur = pReq->m_pUnknownHeader; pEnd = pCur + pReq->m_pHeader->m_cntUnknownHeaders; while( pCur < pEnd ) { swapIntEndian( &pCur->nameOff ); swapIntEndian( &pCur->nameLen ); swapIntEndian( &pCur->valueOff ); swapIntEndian( &pCur->valueLen ); ++pCur; } } } static int validateHeaders( LSAPI_Request * pReq ) { int totalLen = pReq->m_pHeader->m_httpHeaderLen; int i; for(i = 0; i < H_TRANSFER_ENCODING; ++i) { if ( pReq->m_pHeaderIndex->m_headerOff[i] ) { if (pReq->m_pHeaderIndex->m_headerOff[i] > totalLen || pReq->m_pHeaderIndex->m_headerLen[i] + pReq->m_pHeaderIndex->m_headerOff[i] > totalLen) return -1; } } if (pReq->m_pHeader->m_cntUnknownHeaders > 0) { struct lsapi_header_offset * pCur, *pEnd; pCur = pReq->m_pUnknownHeader; pEnd = pCur + pReq->m_pHeader->m_cntUnknownHeaders; while( pCur < pEnd ) { if (pCur->nameOff > totalLen || pCur->nameOff + pCur->nameLen > totalLen || pCur->valueOff > totalLen || pCur->valueOff + pCur->valueLen > totalLen) return -1; ++pCur; } } return 0; } static uid_t s_uid = 0; static uid_t s_defaultUid; //web server need set this static gid_t s_defaultGid; #if defined(linux) || defined(__linux) || defined(__linux__) || defined(__gnu_linux__) #define LSAPI_LVE_DISABLED 0 #define LSAPI_LVE_ENABLED 1 #define LSAPI_CAGEFS_ENABLED 2 #define LSAPI_CAGEFS_NO_SUEXEC 3 struct liblve; static int s_enable_lve = LSAPI_LVE_DISABLED; static struct liblve * s_lve = NULL; static void *s_liblve; static int (*fp_lve_is_available)(void) = NULL; static int (*fp_lve_instance_init)(struct liblve *) = NULL; static int (*fp_lve_destroy)(struct liblve *) = NULL; static int (*fp_lve_enter)(struct liblve *, uint32_t, int32_t, int32_t, uint32_t *) = NULL; static int (*fp_lve_leave)(struct liblve *, uint32_t *) = NULL; static int (*fp_lve_jail)( struct passwd *, char *) = NULL; static int lsapi_load_lve_lib(void) { s_liblve = dlopen("liblve.so.0", RTLD_NOW | RTLD_GLOBAL); if (s_liblve) { fp_lve_is_available = dlsym(s_liblve, "lve_is_available"); if (dlerror() == NULL) { if ( !(*fp_lve_is_available)() ) { int uid = getuid(); if ( uid ) { if (setreuid( s_uid, uid )) {}; if ( !(*fp_lve_is_available)() ) s_enable_lve = 0; if (setreuid( uid, s_uid )) {}; } } } } else { s_enable_lve = LSAPI_LVE_DISABLED; } return (s_liblve)? 0 : -1; } static int init_lve_ex(void) { int rc; if ( !s_liblve ) return -1; fp_lve_instance_init = dlsym(s_liblve, "lve_instance_init"); fp_lve_destroy = dlsym(s_liblve, "lve_destroy"); fp_lve_enter = dlsym(s_liblve, "lve_enter"); fp_lve_leave = dlsym(s_liblve, "lve_leave"); if ( s_enable_lve >= LSAPI_CAGEFS_ENABLED ) fp_lve_jail = dlsym(s_liblve, "jail" ); if ( s_lve == NULL ) { rc = (*fp_lve_instance_init)(NULL); s_lve = malloc(rc); } rc = (*fp_lve_instance_init)(s_lve); if (rc != 0) { perror( "LSAPI: Unable to initialize LVE" ); free( s_lve ); s_lve = NULL; return -1; } return 0; } #endif static int readSecret( const char * pSecretFile ) { struct stat st; int fd = open( pSecretFile, O_RDONLY , 0600 ); if ( fd == -1 ) { lsapi_log("LSAPI: failed to open secret file: %s!\n", pSecretFile ); return -1; } if ( fstat( fd, &st ) == -1 ) { lsapi_log("LSAPI: failed to check state of file: %s!\n", pSecretFile ); close( fd ); return -1; } /* if ( st.st_uid != s_uid ) { lsapi_log("LSAPI: file owner check failure: %s!\n", pSecretFile ); close( fd ); return -1; } */ if ( st.st_mode & 0077 ) { lsapi_log("LSAPI: file permission check failure: %s\n", pSecretFile ); close( fd ); return -1; } if ( read( fd, s_secret, 16 ) < 16 ) { lsapi_log("LSAPI: failed to read secret from secret file: %s\n", pSecretFile ); close( fd ); return -1; } close( fd ); return 0; } int LSAPI_is_suEXEC_Daemon(void) { if (( !s_uid )&&( s_secret[0] )) return 1; else return 0; } static int LSAPI_perror_r( LSAPI_Request * pReq, const char * pErr1, const char *pErr2 ) { char achError[4096]; int n = snprintf(achError, sizeof(achError), "[UID:%d][%d] %s:%s: %s\n", getuid(), getpid(), pErr1, (pErr2)?pErr2:"", strerror(errno)); if (n > (int)sizeof(achError)) n = sizeof(achError); if ( pReq ) LSAPI_Write_Stderr_r( pReq, achError, n ); else if (write( STDERR_FILENO, achError, n )) {}; return 0; } #if defined(linux) || defined(__linux) || defined(__linux__) || defined(__gnu_linux__) static int lsapi_lve_error( LSAPI_Request * pReq ) { static const char * headers[] = { "Cache-Control: private, no-cache, no-store, must-revalidate, max-age=0", "Pragma: no-cache", "Retry-After: 60", "Content-Type: text/html", NULL }; static const char achBody[] = "\n" "\n508 Resource Limit Is Reached\n" "\n" "

Resource Limit Is Reached

\n" "The website is temporarily unable to service your request as it exceeded resource limit.\n" "Please try again later.\n" "
\n" "\n"; LSAPI_ErrResponse_r( pReq, 508, headers, achBody, sizeof( achBody ) - 1 ); return 0; } static int lsapi_enterLVE( LSAPI_Request * pReq, uid_t uid ) { if ( s_lve && uid ) //root user should not do that { uint32_t cookie; int ret = -1; ret = (*fp_lve_enter)(s_lve, uid, -1, -1, &cookie); if ( ret < 0 ) { //lsapi_log("enter LVE (%d) : result: %d !\n", uid, ret ); LSAPI_perror_r(pReq, "LSAPI: lve_enter() failure, reached resource limit.", NULL ); lsapi_lve_error( pReq ); return -1; } } return 0; } static int lsapi_jailLVE( LSAPI_Request * pReq, uid_t uid, struct passwd * pw ) { int ret = 0; char error_msg[1024] = ""; ret = (*fp_lve_jail)( pw, error_msg ); if ( ret < 0 ) { lsapi_log("LSAPI: LVE jail(%d) result: %d, error: %s !\n", uid, ret, error_msg ); LSAPI_perror_r( pReq, "LSAPI: jail() failure.", NULL ); return -1; } return ret; } static int lsapi_initLVE(void) { const char * pEnv; if ( (pEnv = getenv( "LSAPI_LVE_ENABLE" ))!= NULL ) { s_enable_lve = atol( pEnv ); pEnv = NULL; } else if ( (pEnv = getenv( "LVE_ENABLE" ))!= NULL ) { s_enable_lve = atol( pEnv ); pEnv = NULL; } if ( s_enable_lve && !s_uid ) { lsapi_load_lve_lib(); if ( s_enable_lve ) { return init_lve_ex(); } } return 0; } #endif static int setUID_LVE(LSAPI_Request * pReq, uid_t uid, gid_t gid, const char * pChroot) { int rv; struct passwd * pw; pw = getpwuid( uid ); #if defined(linux) || defined(__linux) || defined(__linux__) || defined(__gnu_linux__) if ( s_lve ) { if( lsapi_enterLVE( pReq, uid ) == -1 ) return -1; if ( pw && fp_lve_jail) { rv = lsapi_jailLVE( pReq, uid, pw ); if ( rv == -1 ) return -1; if (( rv == 1 )&&(s_enable_lve == LSAPI_CAGEFS_NO_SUEXEC )) //this mode only use cageFS, does not use suEXEC { uid = s_defaultUid; gid = s_defaultGid; pw = getpwuid( uid ); } } } #endif //if ( !uid || !gid ) //do not allow root //{ // return -1; //} #if defined(__FreeBSD__ ) || defined(__NetBSD__) || defined(__OpenBSD__) \ || defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__) if ( s_enable_core_dump ) lsapi_enable_core_dump(); #endif rv = setgid(gid); if (rv == -1) { LSAPI_perror_r(pReq, "LSAPI: setgid()", NULL); return -1; } if ( pw && (pw->pw_gid == gid )) { rv = initgroups( pw->pw_name, gid ); if (rv == -1) { LSAPI_perror_r(pReq, "LSAPI: initgroups()", NULL); return -1; } } else { rv = setgroups(1, &gid); if (rv == -1) { LSAPI_perror_r(pReq, "LSAPI: setgroups()", NULL); } } if ( pChroot ) { rv = chroot( pChroot ); if ( rv == -1 ) { LSAPI_perror_r(pReq, "LSAPI: chroot()", NULL); return -1; } } rv = setuid(uid); if (rv == -1) { LSAPI_perror_r(pReq, "LSAPI: setuid()", NULL); return -1; } #if defined(linux) || defined(__linux) || defined(__linux__) || defined(__gnu_linux__) if ( s_enable_core_dump ) lsapi_enable_core_dump(); #endif return 0; } static int lsapi_suexec_auth( LSAPI_Request *pReq, char * pAuth, int len, char * pUgid, int ugidLen ) { lsapi_MD5_CTX md5ctx; unsigned char achMD5[16]; if ( len < 32 ) return -1; memmove( achMD5, pAuth + 16, 16 ); memmove( pAuth + 16, s_secret, 16 ); lsapi_MD5Init( &md5ctx ); lsapi_MD5Update( &md5ctx, (unsigned char *)pAuth, 32 ); lsapi_MD5Update( &md5ctx, (unsigned char *)pUgid, 8 ); lsapi_MD5Final( (unsigned char *)pAuth + 16, &md5ctx); if ( memcmp( achMD5, pAuth + 16, 16 ) == 0 ) return 0; return 1; } static int lsapi_changeUGid( LSAPI_Request * pReq ) { int uid = s_defaultUid; int gid = s_defaultGid; const char *pStderrLog; const char *pChroot = NULL; struct LSAPI_key_value_pair * pEnv; struct LSAPI_key_value_pair * pAuth; int i; if ( s_uid ) return 0; //with special ID 0x00 //authenticate the suEXEC request; //first one should be MD5( nonce + lscgid secret ) //remember to clear the secret after verification //it should be set at the end of special env i = pReq->m_pHeader->m_cntSpecialEnv - 1; if ( i >= 0 ) { pEnv = pReq->m_pSpecialEnvList + i; if (( *pEnv->pKey == '\000' )&& ( strcmp( pEnv->pKey+1, "SUEXEC_AUTH" ) == 0 )) { --pReq->m_pHeader->m_cntSpecialEnv; pAuth = pEnv--; if (( *pEnv->pKey == '\000' )&& ( strcmp( pEnv->pKey+1, "SUEXEC_UGID" ) == 0 )) { --pReq->m_pHeader->m_cntSpecialEnv; uid = *(uint32_t *)pEnv->pValue; gid = *(((uint32_t *)pEnv->pValue) + 1 ); //lsapi_log("LSAPI: SUEXEC_UGID set UID: %d, GID: %d\n", uid, gid ); } else { lsapi_log("LSAPI: missing SUEXEC_UGID env, use default user!\n" ); pEnv = NULL; } if ( pEnv&& lsapi_suexec_auth( pReq, pAuth->pValue, pAuth->valLen, pEnv->pValue, pEnv->valLen ) == 0 ) { //read UID, GID from specialEnv } else { //authentication error lsapi_log("LSAPI: SUEXEC_AUTH authentication failed, use default user!\n" ); uid = 0; } } else { //lsapi_log("LSAPI: no SUEXEC_AUTH env, use default user!\n" ); } } if ( !uid ) { uid = s_defaultUid; gid = s_defaultGid; } //change uid if ( setUID_LVE( pReq, uid, gid, pChroot ) == -1 ) { return -1; } s_uid = uid; if ( pReq->m_fdListen != -1 ) { close( pReq->m_fdListen ); pReq->m_fdListen = -1; } pStderrLog = LSAPI_GetEnv_r( pReq, "LSAPI_STDERR_LOG"); if (pStderrLog) lsapi_reopen_stderr(pStderrLog); return 0; } static int parseContentLenFromHeader(LSAPI_Request * pReq) { const char * pContentLen = LSAPI_GetHeader_r( pReq, H_CONTENT_LENGTH ); if ( pContentLen ) pReq->m_reqBodyLen = strtoll( pContentLen, NULL, 10 ); return 0; } static int parseRequest( LSAPI_Request * pReq, int totalLen ) { int shouldFixEndian; char * pBegin = pReq->m_pReqBuf + sizeof( struct lsapi_req_header ); char * pEnd = pReq->m_pReqBuf + totalLen; shouldFixEndian = ( LSAPI_ENDIAN != ( pReq->m_pHeader->m_pktHeader.m_flag & LSAPI_ENDIAN_BIT ) ); if ( shouldFixEndian ) { fixEndian( pReq ); } if ( (pReq->m_specialEnvListSize < pReq->m_pHeader->m_cntSpecialEnv )&& allocateEnvList( &pReq->m_pSpecialEnvList, &pReq->m_specialEnvListSize, pReq->m_pHeader->m_cntSpecialEnv ) == -1 ) return -1; if ( (pReq->m_envListSize < pReq->m_pHeader->m_cntEnv )&& allocateEnvList( &pReq->m_pEnvList, &pReq->m_envListSize, pReq->m_pHeader->m_cntEnv ) == -1 ) return -1; if ( parseEnv( pReq->m_pSpecialEnvList, pReq->m_pHeader->m_cntSpecialEnv, &pBegin, pEnd ) == -1 ) return -1; if ( parseEnv( pReq->m_pEnvList, pReq->m_pHeader->m_cntEnv, &pBegin, pEnd ) == -1 ) return -1; if (pReq->m_pHeader->m_scriptFileOff < 0 || pReq->m_pHeader->m_scriptFileOff >= totalLen || pReq->m_pHeader->m_scriptNameOff < 0 || pReq->m_pHeader->m_scriptNameOff >= totalLen || pReq->m_pHeader->m_queryStringOff < 0 || pReq->m_pHeader->m_queryStringOff >= totalLen || pReq->m_pHeader->m_requestMethodOff < 0 || pReq->m_pHeader->m_requestMethodOff >= totalLen) { lsapi_log("Bad request header - ERROR#1\n"); return -1; } pReq->m_pScriptFile = pReq->m_pReqBuf + pReq->m_pHeader->m_scriptFileOff; pReq->m_pScriptName = pReq->m_pReqBuf + pReq->m_pHeader->m_scriptNameOff; pReq->m_pQueryString = pReq->m_pReqBuf + pReq->m_pHeader->m_queryStringOff; pReq->m_pRequestMethod = pReq->m_pReqBuf + pReq->m_pHeader->m_requestMethodOff; pBegin = pReq->m_pReqBuf + (( pBegin - pReq->m_pReqBuf + 7 ) & (~0x7)); pReq->m_pHeaderIndex = ( struct lsapi_http_header_index * )pBegin; pBegin += sizeof( struct lsapi_http_header_index ); pReq->m_pUnknownHeader = (struct lsapi_header_offset *)pBegin; pBegin += sizeof( struct lsapi_header_offset) * pReq->m_pHeader->m_cntUnknownHeaders; pReq->m_pHttpHeader = pBegin; pBegin += pReq->m_pHeader->m_httpHeaderLen; if ( pBegin != pEnd ) { lsapi_log("Request header does match total size, total: %d, " "real: %ld\n", totalLen, pBegin - pReq->m_pReqBuf ); return -1; } if ( shouldFixEndian ) { fixHeaderIndexEndian( pReq ); } if (validateHeaders(pReq) == -1) { lsapi_log("Bad request header - ERROR#2\n"); return -1; } pReq->m_reqBodyLen = pReq->m_pHeader->m_reqBodyLen; if ( pReq->m_reqBodyLen == -2 ) { parseContentLenFromHeader(pReq); } return 0; } //OPTIMIZATION static char s_accept_notify = 0; static char s_schedule_notify = 0; static char s_notify_scheduled = 0; static char s_notified_pid = 0; static struct lsapi_packet_header s_ack = {'L', 'S', LSAPI_REQ_RECEIVED, LSAPI_ENDIAN, {LSAPI_PACKET_HEADER_LEN} }; static struct lsapi_packet_header s_conn_close_pkt = {'L', 'S', LSAPI_CONN_CLOSE, LSAPI_ENDIAN, {LSAPI_PACKET_HEADER_LEN} }; static inline int send_notification_pkt( int fd, struct lsapi_packet_header *pkt ) { if ( write( fd, pkt, LSAPI_PACKET_HEADER_LEN ) < LSAPI_PACKET_HEADER_LEN ) return -1; return 0; } static inline int send_req_received_notification( int fd ) { return send_notification_pkt(fd, &s_ack); } static inline int send_conn_close_notification( int fd ) { return send_notification_pkt(fd, &s_conn_close_pkt); } //static void lsapi_sigalarm( int sig ) //{ // if ( s_notify_scheduled ) // { // s_notify_scheduled = 0; // if ( g_req.m_fd != -1 ) // write_req_received_notification( g_req.m_fd ); // } //} static inline int lsapi_schedule_notify(void) { if ( !s_notify_scheduled ) { alarm( 2 ); s_notify_scheduled = 1; } return 0; } static inline int notify_req_received( int fd ) { if ( s_schedule_notify ) return lsapi_schedule_notify(); return send_req_received_notification( fd ); } static inline int lsapi_notify_pid( int fd ) { char achBuf[16]; lsapi_buildPacketHeader( (struct lsapi_packet_header *)achBuf, LSAPI_STDERR_STREAM, 8 + LSAPI_PACKET_HEADER_LEN ); memmove( &achBuf[8], "\0PID", 4 ); *((int *)&achBuf[12]) = getpid(); if ( write( fd, achBuf, 16 ) < 16 ) return -1; return 0; } static int readReq( LSAPI_Request * pReq ) { int len; int packetLen; if ( !pReq ) return -1; if ( pReq->m_reqBufSize < 8192 ) { if ( allocateBuf( pReq, 8192 ) == -1 ) return -1; } while ( pReq->m_bufRead < LSAPI_PACKET_HEADER_LEN ) { len = lsapi_read( pReq->m_fd, pReq->m_pReqBuf, pReq->m_reqBufSize ); if ( len <= 0 ) return -1; pReq->m_bufRead += len; } pReq->m_reqState = LSAPI_ST_REQ_HEADER; packetLen = verifyHeader( &pReq->m_pHeader->m_pktHeader, LSAPI_BEGIN_REQUEST ); if ( packetLen < 0 ) { lsapi_log("packetLen < 0\n"); return -1; } if ( packetLen > LSAPI_MAX_HEADER_LEN ) { lsapi_log("packetLen > %d\n", LSAPI_MAX_HEADER_LEN ); return -1; } if ( packetLen + 1024 > pReq->m_reqBufSize ) { if ( allocateBuf( pReq, packetLen + 1024 ) == -1 ) return -1; } while( packetLen > pReq->m_bufRead ) { len = lsapi_read( pReq->m_fd, pReq->m_pReqBuf + pReq->m_bufRead, packetLen - pReq->m_bufRead ); if ( len <= 0 ) return -1; pReq->m_bufRead += len; } if ( parseRequest( pReq, packetLen ) < 0 ) { lsapi_log("ParseRequest error\n"); return -1; } pReq->m_reqState = LSAPI_ST_REQ_BODY | LSAPI_ST_RESP_HEADER; if ( !s_uid ) { if ( lsapi_changeUGid( pReq ) ) return -1; memset(s_secret, 0, sizeof(s_secret)); } pReq->m_bufProcessed = packetLen; //OPTIMIZATION if ( !s_accept_notify && !s_notified_pid ) return notify_req_received( pReq->m_fd ); else { s_notified_pid = 0; return 0; } } int LSAPI_Init(void) { if ( !g_inited ) { s_uid = geteuid(); s_secret[0] = 0; lsapi_signal(SIGPIPE, lsapi_sigpipe); lsapi_signal(SIGUSR1, lsapi_siguser1); #if defined(SIGXFSZ) && defined(SIG_IGN) signal(SIGXFSZ, SIG_IGN); #endif /* let STDOUT function as STDERR, just in case writing to STDOUT directly */ dup2( 2, 1 ); if ( LSAPI_InitRequest( &g_req, LSAPI_SOCK_FILENO ) == -1 ) return -1; g_inited = 1; s_ppid = getppid(); void *pthread_lib = dlopen("libpthread.so", RTLD_LAZY); if (pthread_lib) pthread_atfork_func = dlsym(pthread_lib, "pthread_atfork"); } return 0; } void LSAPI_Stop(void) { g_running = 0; } int LSAPI_IsRunning(void) { return g_running; } void LSAPI_Register_Pgrp_Timer_Callback(LSAPI_On_Timer_pf cb) { s_proc_group_timer_cb = cb; } int LSAPI_InitRequest( LSAPI_Request * pReq, int fd ) { int newfd; if ( !pReq ) return -1; memset( pReq, 0, sizeof( LSAPI_Request ) ); if ( allocateIovec( pReq, 16 ) == -1 ) return -1; pReq->m_pRespBuf = pReq->m_pRespBufPos = (char *)malloc( LSAPI_RESP_BUF_SIZE ); if ( !pReq->m_pRespBuf ) return -1; pReq->m_pRespBufEnd = pReq->m_pRespBuf + LSAPI_RESP_BUF_SIZE; pReq->m_pIovecCur = pReq->m_pIovecToWrite = pReq->m_pIovec + 1; pReq->m_respPktHeaderEnd = &pReq->m_respPktHeader[5]; if ( allocateRespHeaderBuf( pReq, LSAPI_INIT_RESP_HEADER_LEN ) == -1 ) return -1; if ( fd == STDIN_FILENO ) { fd = dup( fd ); newfd = open( "/dev/null", O_RDWR ); dup2( newfd, STDIN_FILENO ); } if ( isPipe( fd ) ) { pReq->m_fdListen = -1; pReq->m_fd = fd; } else { pReq->m_fdListen = fd; pReq->m_fd = -1; lsapi_set_nblock( fd, 1 ); } return 0; } int LSAPI_Is_Listen( void ) { return LSAPI_Is_Listen_r( &g_req ); } int LSAPI_Is_Listen_r( LSAPI_Request * pReq) { return pReq->m_fdListen != -1; } int LSAPI_Accept_r( LSAPI_Request * pReq ) { char achPeer[128]; socklen_t len; int nodelay = 1; if ( !pReq ) return -1; if ( LSAPI_Finish_r( pReq ) == -1 ) return -1; lsapi_set_nblock( pReq->m_fdListen , 0 ); while( g_running ) { if ( pReq->m_fd == -1 ) { if ( pReq->m_fdListen != -1) { len = sizeof( achPeer ); pReq->m_fd = accept( pReq->m_fdListen, (struct sockaddr *)&achPeer, &len ); if ( pReq->m_fd == -1 ) { if (( errno == EINTR )||( errno == EAGAIN)) continue; else return -1; } else { if (s_worker_status) __atomic_store_n(&s_worker_status->m_state, LSAPI_STATE_CONNECTED, __ATOMIC_SEQ_CST); if (s_busy_workers) __atomic_fetch_add(s_busy_workers, 1, __ATOMIC_SEQ_CST); lsapi_set_nblock( pReq->m_fd , 0 ); if (((struct sockaddr *)&achPeer)->sa_family == AF_INET ) { setsockopt(pReq->m_fd, IPPROTO_TCP, TCP_NODELAY, (char *)&nodelay, sizeof(nodelay)); } //init_conn_key( pReq->m_fd ); //OPTIMIZATION if ( s_accept_notify ) if ( notify_req_received( pReq->m_fd ) == -1 ) return -1; } } else return -1; } if ( !readReq( pReq ) ) break; //abort(); lsapi_close_connection(pReq); LSAPI_Reset_r( pReq ); } return 0; } static struct lsapi_packet_header finish_close[2] = { {'L', 'S', LSAPI_RESP_END, LSAPI_ENDIAN, {LSAPI_PACKET_HEADER_LEN} }, {'L', 'S', LSAPI_CONN_CLOSE, LSAPI_ENDIAN, {LSAPI_PACKET_HEADER_LEN} } }; int LSAPI_Finish_r( LSAPI_Request * pReq ) { /* finish req body */ if ( !pReq ) return -1; if (pReq->m_reqState) { if ( pReq->m_fd != -1 ) { if ( pReq->m_reqState & LSAPI_ST_RESP_HEADER ) { LSAPI_FinalizeRespHeaders_r( pReq ); } if ( pReq->m_pRespBufPos != pReq->m_pRespBuf ) { Flush_RespBuf_r( pReq ); } pReq->m_pIovecCur->iov_base = (void *)finish_close; pReq->m_pIovecCur->iov_len = LSAPI_PACKET_HEADER_LEN; pReq->m_totalLen += LSAPI_PACKET_HEADER_LEN; ++pReq->m_pIovecCur; LSAPI_Flush_r( pReq ); } LSAPI_Reset_r( pReq ); } return 0; } int LSAPI_End_Response_r(LSAPI_Request * pReq) { if (!pReq) return -1; if (pReq->m_reqState & LSAPI_ST_BACKGROUND) return 0; if (pReq->m_reqState) { if ( pReq->m_fd != -1 ) { if ( pReq->m_reqState & LSAPI_ST_RESP_HEADER ) { if ( pReq->m_pRespHeaderBufPos <= pReq->m_pRespHeaderBuf ) return 0; LSAPI_FinalizeRespHeaders_r( pReq ); } if ( pReq->m_pRespBufPos != pReq->m_pRespBuf ) { Flush_RespBuf_r( pReq ); } pReq->m_pIovecCur->iov_base = (void *)finish_close; pReq->m_pIovecCur->iov_len = LSAPI_PACKET_HEADER_LEN << 1; pReq->m_totalLen += LSAPI_PACKET_HEADER_LEN << 1; ++pReq->m_pIovecCur; LSAPI_Flush_r( pReq ); lsapi_close_connection(pReq); } pReq->m_reqState |= LSAPI_ST_BACKGROUND; } return 0; } void LSAPI_Reset_r( LSAPI_Request * pReq ) { pReq->m_pRespBufPos = pReq->m_pRespBuf; pReq->m_pIovecCur = pReq->m_pIovecToWrite = pReq->m_pIovec + 1; pReq->m_pRespHeaderBufPos = pReq->m_pRespHeaderBuf; memset( &pReq->m_pHeaderIndex, 0, (char *)(pReq->m_respHeaderLen) - (char *)&pReq->m_pHeaderIndex ); } int LSAPI_Release_r( LSAPI_Request * pReq ) { if ( pReq->m_pReqBuf ) free( pReq->m_pReqBuf ); if ( pReq->m_pSpecialEnvList ) free( pReq->m_pSpecialEnvList ); if ( pReq->m_pEnvList ) free( pReq->m_pEnvList ); if ( pReq->m_pRespHeaderBuf ) free( pReq->m_pRespHeaderBuf ); return 0; } char * LSAPI_GetHeader_r( LSAPI_Request * pReq, int headerIndex ) { int off; if ( !pReq || ((unsigned int)headerIndex > H_TRANSFER_ENCODING) ) return NULL; off = pReq->m_pHeaderIndex->m_headerOff[ headerIndex ]; if ( !off ) return NULL; if ( *(pReq->m_pHttpHeader + off + pReq->m_pHeaderIndex->m_headerLen[ headerIndex ]) ) { *( pReq->m_pHttpHeader + off + pReq->m_pHeaderIndex->m_headerLen[ headerIndex ]) = 0; } return pReq->m_pHttpHeader + off; } static int readBodyToReqBuf( LSAPI_Request * pReq ) { off_t bodyLeft; ssize_t len = pReq->m_bufRead - pReq->m_bufProcessed; if ( len > 0 ) return len; pReq->m_bufRead = pReq->m_bufProcessed = pReq->m_pHeader->m_pktHeader.m_packetLen.m_iLen; bodyLeft = pReq->m_reqBodyLen - pReq->m_reqBodyRead; len = pReq->m_reqBufSize - pReq->m_bufRead; if ( len < 0 ) return -1; if ( len > bodyLeft ) len = bodyLeft; len = lsapi_read( pReq->m_fd, pReq->m_pReqBuf + pReq->m_bufRead, len ); if ( len > 0 ) pReq->m_bufRead += len; return len; } int LSAPI_ReqBodyGetChar_r( LSAPI_Request * pReq ) { if (!pReq || (pReq->m_fd ==-1) ) return EOF; if ( pReq->m_bufProcessed >= pReq->m_bufRead ) { if ( readBodyToReqBuf( pReq ) <= 0 ) return EOF; } ++pReq->m_reqBodyRead; return (unsigned char)*(pReq->m_pReqBuf + pReq->m_bufProcessed++); } int LSAPI_ReqBodyGetLine_r( LSAPI_Request * pReq, char * pBuf, size_t bufLen, int *getLF ) { ssize_t len; ssize_t left; char * pBufEnd = pBuf + bufLen - 1; char * pBufCur = pBuf; char * pCur; char * p; if (!pReq || pReq->m_fd == -1 || !pBuf || !getLF) return -1; *getLF = 0; while( (left = pBufEnd - pBufCur ) > 0 ) { len = pReq->m_bufRead - pReq->m_bufProcessed; if ( len <= 0 ) { if ( (len = readBodyToReqBuf( pReq )) <= 0 ) { *getLF = 1; break; } } if ( len > left ) len = left; pCur = pReq->m_pReqBuf + pReq->m_bufProcessed; p = memchr( pCur, '\n', len ); if ( p ) len = p - pCur + 1; memmove( pBufCur, pCur, len ); pBufCur += len; pReq->m_bufProcessed += len; pReq->m_reqBodyRead += len; if ( p ) { *getLF = 1; break; } } *pBufCur = 0; return pBufCur - pBuf; } ssize_t LSAPI_ReadReqBody_r( LSAPI_Request * pReq, char * pBuf, size_t bufLen ) { ssize_t len; off_t total; /* char *pOldBuf = pBuf; */ if (!pReq || pReq->m_fd == -1 || !pBuf || (ssize_t)bufLen < 0) return -1; total = pReq->m_reqBodyLen - pReq->m_reqBodyRead; if ( total <= 0 ) return 0; if ( total < (ssize_t)bufLen ) bufLen = total; total = 0; len = pReq->m_bufRead - pReq->m_bufProcessed; if ( len > 0 ) { if ( len > (ssize_t)bufLen ) len = bufLen; memmove( pBuf, pReq->m_pReqBuf + pReq->m_bufProcessed, len ); pReq->m_bufProcessed += len; total += len; pBuf += len; bufLen -= len; } while( bufLen > 0 ) { len = lsapi_read( pReq->m_fd, pBuf, bufLen ); if ( len > 0 ) { total += len; pBuf += len; bufLen -= len; } else if ( len <= 0 ) { if ( !total) return -1; break; } } pReq->m_reqBodyRead += total; return total; } ssize_t LSAPI_Write_r( LSAPI_Request * pReq, const char * pBuf, size_t len ) { struct lsapi_packet_header * pHeader; const char * pEnd; const char * p; ssize_t bufLen; ssize_t toWrite; ssize_t packetLen; int skip = 0; if (!pReq || !pBuf) return -1; if (pReq->m_reqState & LSAPI_ST_BACKGROUND) return len; if (pReq->m_fd == -1) return -1; if ( pReq->m_reqState & LSAPI_ST_RESP_HEADER ) { LSAPI_FinalizeRespHeaders_r( pReq ); /* if ( *pBuf == '\r' ) { ++skip; } if ( *pBuf == '\n' ) { ++skip; } */ } pReq->m_reqState |= LSAPI_ST_RESP_BODY; if ( ((ssize_t)len - skip) < pReq->m_pRespBufEnd - pReq->m_pRespBufPos ) { memmove( pReq->m_pRespBufPos, pBuf + skip, len - skip ); pReq->m_pRespBufPos += len - skip; return len; } pHeader = pReq->m_respPktHeader; p = pBuf + skip; pEnd = pBuf + len; bufLen = pReq->m_pRespBufPos - pReq->m_pRespBuf; while( ( toWrite = pEnd - p ) > 0 ) { packetLen = toWrite + bufLen; if ( LSAPI_MAX_DATA_PACKET_LEN < packetLen) { packetLen = LSAPI_MAX_DATA_PACKET_LEN; toWrite = packetLen - bufLen; } lsapi_buildPacketHeader( pHeader, LSAPI_RESP_STREAM, packetLen + LSAPI_PACKET_HEADER_LEN ); pReq->m_totalLen += packetLen + LSAPI_PACKET_HEADER_LEN; pReq->m_pIovecCur->iov_base = (void *)pHeader; pReq->m_pIovecCur->iov_len = LSAPI_PACKET_HEADER_LEN; ++pReq->m_pIovecCur; ++pHeader; if ( bufLen > 0 ) { pReq->m_pIovecCur->iov_base = (void *)pReq->m_pRespBuf; pReq->m_pIovecCur->iov_len = bufLen; pReq->m_pRespBufPos = pReq->m_pRespBuf; ++pReq->m_pIovecCur; bufLen = 0; } pReq->m_pIovecCur->iov_base = (void *)p; pReq->m_pIovecCur->iov_len = toWrite; ++pReq->m_pIovecCur; p += toWrite; if ( pHeader >= pReq->m_respPktHeaderEnd - 1) { if ( LSAPI_Flush_r( pReq ) == -1 ) return -1; pHeader = pReq->m_respPktHeader; } } if ( pHeader != pReq->m_respPktHeader ) if ( LSAPI_Flush_r( pReq ) == -1 ) return -1; return p - pBuf; } #if defined(__FreeBSD__ ) ssize_t gsendfile( int fdOut, int fdIn, off_t* off, size_t size ) { ssize_t ret; off_t written; ret = sendfile( fdIn, fdOut, *off, size, NULL, &written, 0 ); if ( written > 0 ) { ret = written; *off += ret; } return ret; } #endif #if defined(__OpenBSD__) || defined(__NetBSD__) ssize_t gsendfile( int fdOut, int fdIn, off_t* off, size_t size ) { ssize_t ret; off_t written = 0; const size_t bufsiz = 16384; unsigned char in[bufsiz] = {0}; if (lseek(fdIn, *off, SEEK_SET) == -1) { return -1; } while (size > 0) { size_t tor = size > sizeof(in) ? sizeof(in) : size; ssize_t c = read(fdIn, in, tor); if (c <= 0) { goto end; } ssize_t w = write(fdOut, in, c); if (w > 0) written += w; if (w != c) { goto end; } size -= c; } end: *off += written; return 0; } #endif #if defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__) ssize_t gsendfile( int fdOut, int fdIn, off_t* off, size_t size ) { ssize_t ret; off_t len = size; ret = sendfile( fdIn, fdOut, *off, &len, NULL, 0 ); if (( ret == 0 )&&( len > 0 )) { ret = len; *off += len; } return ret; } #endif #if defined(sun) || defined(__sun) #include ssize_t gsendfile( int fdOut, int fdIn, off_t *off, size_t size ) { int n = 0 ; sendfilevec_t vec[1]; vec[n].sfv_fd = fdIn; vec[n].sfv_flag = 0; vec[n].sfv_off = *off; vec[n].sfv_len = size; ++n; size_t written; ssize_t ret = sendfilev( fdOut, vec, n, &written ); if (( !ret )||( errno == EAGAIN )) ret = written; if ( ret > 0 ) *off += ret; return ret; } #endif #if defined(linux) || defined(__linux) || defined(__linux__) || \ defined(__gnu_linux__) #include #define gsendfile sendfile #endif #if defined(HPUX) ssize_t gsendfile( int fdOut, int fdIn, off_t * off, size_t size ) { return sendfile( fdOut, fdIn, off, size, NULL, 0 ); } #endif ssize_t LSAPI_sendfile_r( LSAPI_Request * pReq, int fdIn, off_t* off, size_t size ) { struct lsapi_packet_header * pHeader = pReq->m_respPktHeader; if ( !pReq || (pReq->m_fd == -1) || fdIn == -1 ) return -1; if ( pReq->m_reqState & LSAPI_ST_RESP_HEADER ) { LSAPI_FinalizeRespHeaders_r( pReq ); } pReq->m_reqState |= LSAPI_ST_RESP_BODY; LSAPI_Flush_r(pReq); lsapi_buildPacketHeader( pHeader, LSAPI_RESP_STREAM, size + LSAPI_PACKET_HEADER_LEN ); if (write(pReq->m_fd, (const char *) pHeader, LSAPI_PACKET_HEADER_LEN ) != LSAPI_PACKET_HEADER_LEN) return -1; return gsendfile( pReq->m_fd, fdIn, off, size ); } void Flush_RespBuf_r( LSAPI_Request * pReq ) { struct lsapi_packet_header * pHeader = pReq->m_respPktHeader; int bufLen = pReq->m_pRespBufPos - pReq->m_pRespBuf; pReq->m_reqState |= LSAPI_ST_RESP_BODY; lsapi_buildPacketHeader( pHeader, LSAPI_RESP_STREAM, bufLen + LSAPI_PACKET_HEADER_LEN ); pReq->m_totalLen += bufLen + LSAPI_PACKET_HEADER_LEN; pReq->m_pIovecCur->iov_base = (void *)pHeader; pReq->m_pIovecCur->iov_len = LSAPI_PACKET_HEADER_LEN; ++pReq->m_pIovecCur; ++pHeader; if ( bufLen > 0 ) { pReq->m_pIovecCur->iov_base = (void *)pReq->m_pRespBuf; pReq->m_pIovecCur->iov_len = bufLen; pReq->m_pRespBufPos = pReq->m_pRespBuf; ++pReq->m_pIovecCur; bufLen = 0; } } int LSAPI_Flush_r( LSAPI_Request * pReq ) { int ret = 0; int n; if ( !pReq ) return -1; n = pReq->m_pIovecCur - pReq->m_pIovecToWrite; if (( 0 == n )&&( pReq->m_pRespBufPos == pReq->m_pRespBuf )) return 0; if ( pReq->m_fd == -1 ) { pReq->m_pRespBufPos = pReq->m_pRespBuf; pReq->m_totalLen = 0; pReq->m_pIovecCur = pReq->m_pIovecToWrite = pReq->m_pIovec; return -1; } if ( pReq->m_reqState & LSAPI_ST_RESP_HEADER ) { LSAPI_FinalizeRespHeaders_r( pReq ); } if ( pReq->m_pRespBufPos != pReq->m_pRespBuf ) { Flush_RespBuf_r( pReq ); } n = pReq->m_pIovecCur - pReq->m_pIovecToWrite; if ( n > 0 ) { ret = lsapi_writev( pReq->m_fd, &pReq->m_pIovecToWrite, n, pReq->m_totalLen ); if ( ret < pReq->m_totalLen ) { lsapi_close_connection(pReq); ret = -1; } pReq->m_totalLen = 0; pReq->m_pIovecCur = pReq->m_pIovecToWrite = pReq->m_pIovec; } return ret; } ssize_t LSAPI_Write_Stderr_r( LSAPI_Request * pReq, const char * pBuf, size_t len ) { struct lsapi_packet_header header; const char * pEnd; const char * p; ssize_t packetLen; ssize_t totalLen; int ret; struct iovec iov[2]; struct iovec *pIov; if ( !pReq ) return -1; if (s_stderr_log_path || pReq->m_fd == -1 || pReq->m_fd == pReq->m_fdListen) return write( 2, pBuf, len ); if ( pReq->m_pRespBufPos != pReq->m_pRespBuf ) { LSAPI_Flush_r( pReq ); } p = pBuf; pEnd = pBuf + len; while( ( packetLen = pEnd - p ) > 0 ) { if ( LSAPI_MAX_DATA_PACKET_LEN < packetLen) { packetLen = LSAPI_MAX_DATA_PACKET_LEN; } lsapi_buildPacketHeader( &header, LSAPI_STDERR_STREAM, packetLen + LSAPI_PACKET_HEADER_LEN ); totalLen = packetLen + LSAPI_PACKET_HEADER_LEN; iov[0].iov_base = (void *)&header; iov[0].iov_len = LSAPI_PACKET_HEADER_LEN; iov[1].iov_base = (void *)p; iov[1].iov_len = packetLen; p += packetLen; pIov = iov; ret = lsapi_writev( pReq->m_fd, &pIov, 2, totalLen ); if ( ret < totalLen ) { lsapi_close_connection(pReq); ret = -1; } } return p - pBuf; } static char * GetHeaderVar( LSAPI_Request * pReq, const char * name ) { int i; char * pValue; for( i = 0; i < H_TRANSFER_ENCODING; ++i ) { if ( pReq->m_pHeaderIndex->m_headerOff[i] ) { if ( strcmp( name, CGI_HEADERS[i] ) == 0 ) { pValue = pReq->m_pHttpHeader + pReq->m_pHeaderIndex->m_headerOff[i]; if ( *(pValue + pReq->m_pHeaderIndex->m_headerLen[i]) != '\0') { *(pValue + pReq->m_pHeaderIndex->m_headerLen[i]) = '\0'; } return pValue; } } } if ( pReq->m_pHeader->m_cntUnknownHeaders > 0 ) { const char *p; char *pKey; char *pKeyEnd; int keyLen; struct lsapi_header_offset * pCur, *pEnd; pCur = pReq->m_pUnknownHeader; pEnd = pCur + pReq->m_pHeader->m_cntUnknownHeaders; while( pCur < pEnd ) { pKey = pReq->m_pHttpHeader + pCur->nameOff; keyLen = pCur->nameLen; pKeyEnd = pKey + keyLen; p = &name[5]; while(( pKey < pKeyEnd )&&( *p )) { char ch = toupper( *pKey ); if ((ch != *p )||(( *p == '_' )&&( ch != '-'))) break; ++p; ++pKey; } if (( pKey == pKeyEnd )&& (!*p )) { pValue = pReq->m_pHttpHeader + pCur->valueOff; if ( *(pValue + pCur->valueLen) != '\0') { *(pValue + pCur->valueLen) = '\0'; } return pValue; } ++pCur; } } return NULL; } char * LSAPI_GetEnv_r( LSAPI_Request * pReq, const char * name ) { struct LSAPI_key_value_pair * pBegin = pReq->m_pEnvList; struct LSAPI_key_value_pair * pEnd = pBegin + pReq->m_pHeader->m_cntEnv; if ( !pReq || !name ) return NULL; if ( strncmp( name, "HTTP_", 5 ) == 0 ) { return GetHeaderVar( pReq, name ); } while( pBegin < pEnd ) { if ( strcmp( name, pBegin->pKey ) == 0 ) return pBegin->pValue; ++pBegin; } return NULL; } struct _headerInfo { const char * _name; int _nameLen; const char * _value; int _valueLen; }; int compareValueLocation(const void * v1, const void *v2 ) { return ((const struct _headerInfo *)v1)->_value - ((const struct _headerInfo *)v2)->_value; } int LSAPI_ForeachOrgHeader_r( LSAPI_Request * pReq, LSAPI_CB_EnvHandler fn, void * arg ) { int i; int len = 0; char * pValue; int ret; int count = 0; struct _headerInfo headers[512]; if ( !pReq || !fn ) return -1; if ( !pReq->m_pHeaderIndex ) return 0; for( i = 0; i < H_TRANSFER_ENCODING; ++i ) { if ( pReq->m_pHeaderIndex->m_headerOff[i] ) { len = pReq->m_pHeaderIndex->m_headerLen[i]; pValue = pReq->m_pHttpHeader + pReq->m_pHeaderIndex->m_headerOff[i]; *(pValue + len ) = 0; headers[count]._name = HTTP_HEADERS[i]; headers[count]._nameLen = HTTP_HEADER_LEN[i]; headers[count]._value = pValue; headers[count]._valueLen = len; ++count; //ret = (*fn)( HTTP_HEADERS[i], HTTP_HEADER_LEN[i], // pValue, len, arg ); //if ( ret <= 0 ) // return ret; } } if ( pReq->m_pHeader->m_cntUnknownHeaders > 0 ) { char *pKey; int keyLen; struct lsapi_header_offset * pCur, *pEnd; pCur = pReq->m_pUnknownHeader; pEnd = pCur + pReq->m_pHeader->m_cntUnknownHeaders; while( pCur < pEnd ) { pKey = pReq->m_pHttpHeader + pCur->nameOff; keyLen = pCur->nameLen; *(pKey + keyLen ) = 0; pValue = pReq->m_pHttpHeader + pCur->valueOff; *(pValue + pCur->valueLen ) = 0; headers[count]._name = pKey; headers[count]._nameLen = keyLen; headers[count]._value = pValue; headers[count]._valueLen = pCur->valueLen; ++count; if ( count == 512 ) break; //ret = (*fn)( pKey, keyLen, // pValue, pCur->valueLen, arg ); //if ( ret <= 0 ) // return ret; ++pCur; } } qsort( headers, count, sizeof( struct _headerInfo ), compareValueLocation ); for( i = 0; i < count; ++i ) { ret = (*fn)( headers[i]._name, headers[i]._nameLen, headers[i]._value, headers[i]._valueLen, arg ); if ( ret <= 0 ) return ret; } return count; } int LSAPI_ForeachHeader_r( LSAPI_Request * pReq, LSAPI_CB_EnvHandler fn, void * arg ) { int i; int len = 0; char * pValue; int ret; int count = 0; if ( !pReq || !fn ) return -1; for( i = 0; i < H_TRANSFER_ENCODING; ++i ) { if ( pReq->m_pHeaderIndex->m_headerOff[i] ) { len = pReq->m_pHeaderIndex->m_headerLen[i]; pValue = pReq->m_pHttpHeader + pReq->m_pHeaderIndex->m_headerOff[i]; *(pValue + len ) = 0; ret = (*fn)( CGI_HEADERS[i], CGI_HEADER_LEN[i], pValue, len, arg ); ++count; if ( ret <= 0 ) return ret; } } if ( pReq->m_pHeader->m_cntUnknownHeaders > 0 ) { char achHeaderName[256]; char *p; char *pKey; char *pKeyEnd ; int keyLen; struct lsapi_header_offset * pCur, *pEnd; pCur = pReq->m_pUnknownHeader; pEnd = pCur + pReq->m_pHeader->m_cntUnknownHeaders; while( pCur < pEnd ) { pKey = pReq->m_pHttpHeader + pCur->nameOff; keyLen = pCur->nameLen; if ( keyLen > 250 ) keyLen = 250; pKeyEnd = pKey + keyLen; memcpy( achHeaderName, "HTTP_", 5 ); p = &achHeaderName[5]; while( pKey < pKeyEnd ) { char ch = *pKey++; if ( ch == '-' ) *p++ = '_'; else *p++ = toupper( ch ); } *p = 0; keyLen += 5; pValue = pReq->m_pHttpHeader + pCur->valueOff; *(pValue + pCur->valueLen ) = 0; ret = (*fn)( achHeaderName, keyLen, pValue, pCur->valueLen, arg ); if ( ret <= 0 ) return ret; ++pCur; } } return count + pReq->m_pHeader->m_cntUnknownHeaders; } static int EnvForeach( struct LSAPI_key_value_pair * pEnv, int n, LSAPI_CB_EnvHandler fn, void * arg ) { struct LSAPI_key_value_pair * pEnd = pEnv + n; int ret; if ( !pEnv || !fn ) return -1; while( pEnv < pEnd ) { ret = (*fn)( pEnv->pKey, pEnv->keyLen, pEnv->pValue, pEnv->valLen, arg ); if ( ret <= 0 ) return ret; ++pEnv; } return n; } int LSAPI_ForeachEnv_r( LSAPI_Request * pReq, LSAPI_CB_EnvHandler fn, void * arg ) { if ( !pReq || !fn ) return -1; if ( pReq->m_pHeader->m_cntEnv > 0 ) { return EnvForeach( pReq->m_pEnvList, pReq->m_pHeader->m_cntEnv, fn, arg ); } return 0; } int LSAPI_ForeachSpecialEnv_r( LSAPI_Request * pReq, LSAPI_CB_EnvHandler fn, void * arg ) { if ( !pReq || !fn ) return -1; if ( pReq->m_pHeader->m_cntSpecialEnv > 0 ) { return EnvForeach( pReq->m_pSpecialEnvList, pReq->m_pHeader->m_cntSpecialEnv, fn, arg ); } return 0; } int LSAPI_FinalizeRespHeaders_r( LSAPI_Request * pReq ) { if ( !pReq || !pReq->m_pIovec ) return -1; if ( !( pReq->m_reqState & LSAPI_ST_RESP_HEADER ) ) return 0; pReq->m_reqState &= ~LSAPI_ST_RESP_HEADER; if ( pReq->m_pRespHeaderBufPos > pReq->m_pRespHeaderBuf ) { pReq->m_pIovecCur->iov_base = (void *)pReq->m_pRespHeaderBuf; pReq->m_pIovecCur->iov_len = pReq->m_pRespHeaderBufPos - pReq->m_pRespHeaderBuf; pReq->m_totalLen += pReq->m_pIovecCur->iov_len; ++pReq->m_pIovecCur; } pReq->m_pIovec->iov_len = sizeof( struct lsapi_resp_header) + pReq->m_respHeader.m_respInfo.m_cntHeaders * sizeof( short ); pReq->m_totalLen += pReq->m_pIovec->iov_len; lsapi_buildPacketHeader( &pReq->m_respHeader.m_pktHeader, LSAPI_RESP_HEADER, pReq->m_totalLen ); pReq->m_pIovec->iov_base = (void *)&pReq->m_respHeader; pReq->m_pIovecToWrite = pReq->m_pIovec; return 0; } int LSAPI_AppendRespHeader2_r( LSAPI_Request * pReq, const char * pHeaderName, const char * pHeaderValue ) { int nameLen, valLen, len; if ( !pReq || !pHeaderName || !pHeaderValue ) return -1; if ( pReq->m_reqState & LSAPI_ST_RESP_BODY ) return -1; if ( pReq->m_respHeader.m_respInfo.m_cntHeaders >= LSAPI_MAX_RESP_HEADERS ) return -1; nameLen = strlen( pHeaderName ); valLen = strlen( pHeaderValue ); if ( nameLen == 0 ) return -1; while( nameLen > 0 ) { char ch = *(pHeaderName + nameLen - 1 ); if (( ch == '\n' )||( ch == '\r' )) --nameLen; else break; } if ( nameLen <= 0 ) return 0; while( valLen > 0 ) { char ch = *(pHeaderValue + valLen - 1 ); if (( ch == '\n' )||( ch == '\r' )) --valLen; else break; } len = nameLen + valLen + 1; if ( len > LSAPI_RESP_HTTP_HEADER_MAX ) return -1; if ( pReq->m_pRespHeaderBufPos + len + 1 > pReq->m_pRespHeaderBufEnd ) { int newlen = pReq->m_pRespHeaderBufPos + len + 4096 - pReq->m_pRespHeaderBuf; newlen -= newlen % 4096; if ( allocateRespHeaderBuf( pReq, newlen ) == -1 ) return -1; } memmove( pReq->m_pRespHeaderBufPos, pHeaderName, nameLen ); pReq->m_pRespHeaderBufPos += nameLen; *pReq->m_pRespHeaderBufPos++ = ':'; memmove( pReq->m_pRespHeaderBufPos, pHeaderValue, valLen ); pReq->m_pRespHeaderBufPos += valLen; *pReq->m_pRespHeaderBufPos++ = 0; ++len; /* add one byte padding for \0 */ pReq->m_respHeaderLen[pReq->m_respHeader.m_respInfo.m_cntHeaders] = len; ++pReq->m_respHeader.m_respInfo.m_cntHeaders; return 0; } int LSAPI_AppendRespHeader_r( LSAPI_Request * pReq, const char * pBuf, int len ) { if ( !pReq || !pBuf || len <= 0 || len > LSAPI_RESP_HTTP_HEADER_MAX ) return -1; if ( pReq->m_reqState & LSAPI_ST_RESP_BODY ) return -1; if ( pReq->m_respHeader.m_respInfo.m_cntHeaders >= LSAPI_MAX_RESP_HEADERS ) return -1; while( len > 0 ) { char ch = *(pBuf + len - 1 ); if (( ch == '\n' )||( ch == '\r' )) --len; else break; } if ( len <= 0 ) return 0; if ( pReq->m_pRespHeaderBufPos + len + 1 > pReq->m_pRespHeaderBufEnd ) { int newlen = pReq->m_pRespHeaderBufPos + len + 4096 - pReq->m_pRespHeaderBuf; newlen -= newlen % 4096; if ( allocateRespHeaderBuf( pReq, newlen ) == -1 ) return -1; } memmove( pReq->m_pRespHeaderBufPos, pBuf, len ); pReq->m_pRespHeaderBufPos += len; *pReq->m_pRespHeaderBufPos++ = 0; ++len; /* add one byte padding for \0 */ pReq->m_respHeaderLen[pReq->m_respHeader.m_respInfo.m_cntHeaders] = len; ++pReq->m_respHeader.m_respInfo.m_cntHeaders; return 0; } int LSAPI_CreateListenSock2( const struct sockaddr * pServerAddr, int backlog ) { int ret; int fd; int flag = 1; int addr_len; switch( pServerAddr->sa_family ) { case AF_INET: addr_len = 16; break; case AF_INET6: addr_len = sizeof( struct sockaddr_in6 ); break; case AF_UNIX: addr_len = sizeof( struct sockaddr_un ); unlink( ((struct sockaddr_un *)pServerAddr)->sun_path ); break; default: return -1; } fd = socket( pServerAddr->sa_family, SOCK_STREAM, 0 ); if ( fd == -1 ) return -1; fcntl( fd, F_SETFD, FD_CLOEXEC ); if(setsockopt( fd, SOL_SOCKET, SO_REUSEADDR, (char *)( &flag ), sizeof(flag)) == 0) { ret = bind( fd, pServerAddr, addr_len ); if ( !ret ) { ret = listen( fd, backlog ); if ( !ret ) return fd; } } ret = errno; close(fd); errno = ret; return -1; } int LSAPI_ParseSockAddr( const char * pBind, struct sockaddr * pAddr ) { char achAddr[256]; char * p = achAddr; char * pEnd; struct addrinfo *res, hints; int doAddrInfo = 0; int port; if ( !pBind ) return -1; while( isspace( *pBind ) ) ++pBind; strncpy(achAddr, pBind, 255); achAddr[255] = 0; switch( *p ) { case '/': pAddr->sa_family = AF_UNIX; strncpy( ((struct sockaddr_un *)pAddr)->sun_path, p, sizeof(((struct sockaddr_un *)pAddr)->sun_path) ); return 0; case '[': pAddr->sa_family = AF_INET6; ++p; pEnd = strchr( p, ']' ); if ( !pEnd ) return -1; *pEnd++ = 0; if ( *p == '*' ) { strcpy( achAddr, "::" ); p = achAddr; } doAddrInfo = 1; break; default: pAddr->sa_family = AF_INET; pEnd = strchr( p, ':' ); if ( !pEnd ) return -1; *pEnd++ = 0; doAddrInfo = 0; if ( *p == '*' ) { ((struct sockaddr_in *)pAddr)->sin_addr.s_addr = htonl(INADDR_ANY); } else if (!strcasecmp( p, "localhost" ) ) ((struct sockaddr_in *)pAddr)->sin_addr.s_addr = htonl( INADDR_LOOPBACK ); else { #ifdef HAVE_INET_PTON if (!inet_pton(AF_INET, p, &((struct sockaddr_in *)pAddr)->sin_addr)) #else ((struct sockaddr_in *)pAddr)->sin_addr.s_addr = inet_addr( p ); if ( ((struct sockaddr_in *)pAddr)->sin_addr.s_addr == INADDR_BROADCAST) #endif { doAddrInfo = 1; } } break; } if ( *pEnd == ':' ) ++pEnd; port = atoi( pEnd ); if (( port <= 0 )||( port > 65535 )) return -1; if ( doAddrInfo ) { memset(&hints, 0, sizeof(hints)); hints.ai_family = pAddr->sa_family; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; if ( getaddrinfo(p, NULL, &hints, &res) ) { return -1; } memcpy(pAddr, res->ai_addr, res->ai_addrlen); freeaddrinfo(res); } if ( pAddr->sa_family == AF_INET ) ((struct sockaddr_in *)pAddr)->sin_port = htons( port ); else ((struct sockaddr_in6 *)pAddr)->sin6_port = htons( port ); return 0; } int LSAPI_CreateListenSock( const char * pBind, int backlog ) { char serverAddr[128]; int ret; int fd = -1; ret = LSAPI_ParseSockAddr( pBind, (struct sockaddr *)serverAddr ); if ( !ret ) { fd = LSAPI_CreateListenSock2( (struct sockaddr *)serverAddr, backlog ); } return fd; } static fn_select_t g_fnSelect = select; typedef struct _lsapi_prefork_server { int m_fd; int m_iMaxChildren; int m_iExtraChildren; int m_iCurChildren; int m_iMaxIdleChildren; int m_iServerMaxIdle; int m_iChildrenMaxIdleTime; int m_iMaxReqProcessTime; int m_iAvoidFork; lsapi_child_status * m_pChildrenStatus; lsapi_child_status * m_pChildrenStatusCur; lsapi_child_status * m_pChildrenStatusEnd; }lsapi_prefork_server; static lsapi_prefork_server * g_prefork_server = NULL; int LSAPI_Init_Prefork_Server( int max_children, fn_select_t fp, int avoidFork ) { if ( g_prefork_server ) return 0; if ( max_children <= 1 ) return -1; if ( max_children >= 10000) max_children = 10000; if (s_max_busy_workers == 0) s_max_busy_workers = max_children / 2 + 1; g_prefork_server = (lsapi_prefork_server *)malloc( sizeof( lsapi_prefork_server ) ); if ( !g_prefork_server ) return -1; memset( g_prefork_server, 0, sizeof( lsapi_prefork_server ) ); if ( fp != NULL ) g_fnSelect = fp; s_ppid = getppid(); s_pid = getpid(); setpgid( s_pid, s_pid ); #if defined(linux) || defined(__linux) || defined(__linux__) || defined(__gnu_linux__) s_total_pages = sysconf(_SC_PHYS_PAGES); #endif g_prefork_server->m_iAvoidFork = avoidFork; g_prefork_server->m_iMaxChildren = max_children; g_prefork_server->m_iExtraChildren = ( avoidFork ) ? 0 : (max_children / 3) ; g_prefork_server->m_iMaxIdleChildren = ( avoidFork ) ? (max_children + 1) : (max_children / 3); if ( g_prefork_server->m_iMaxIdleChildren == 0 ) g_prefork_server->m_iMaxIdleChildren = 1; g_prefork_server->m_iChildrenMaxIdleTime = 300; g_prefork_server->m_iMaxReqProcessTime = 3600; setsid(); return 0; } void LSAPI_Set_Server_fd( int fd ) { if( g_prefork_server ) g_prefork_server->m_fd = fd; } static int lsapi_accept( int fdListen ) { int fd; int nodelay = 1; socklen_t len; char achPeer[128]; len = sizeof( achPeer ); fd = accept( fdListen, (struct sockaddr *)&achPeer, &len ); if ( fd != -1 ) { if (((struct sockaddr *)&achPeer)->sa_family == AF_INET ) { setsockopt( fd, IPPROTO_TCP, TCP_NODELAY, (char *)&nodelay, sizeof(nodelay)); } //OPTIMIZATION //if ( s_accept_notify ) // notify_req_received( fd ); } return fd; } static unsigned int s_max_reqs = UINT_MAX; static int s_max_idle_secs = 300; static int s_stop; static void lsapi_cleanup(int signal) { s_stop = signal; } static lsapi_child_status * find_child_status( int pid ) { lsapi_child_status * pStatus = g_prefork_server->m_pChildrenStatus; lsapi_child_status * pEnd = g_prefork_server->m_pChildrenStatusEnd; while( pStatus < pEnd ) { if ( pStatus->m_pid == pid ) { if (pid == 0) { memset(pStatus, 0, sizeof( *pStatus ) ); pStatus->m_pid = -1; } if ( pStatus + 1 > g_prefork_server->m_pChildrenStatusCur ) g_prefork_server->m_pChildrenStatusCur = pStatus + 1; return pStatus; } ++pStatus; } return NULL; } void LSAPI_reset_server_state( void ) { /* Reset child status */ g_prefork_server->m_iCurChildren = 0; lsapi_child_status * pStatus = g_prefork_server->m_pChildrenStatus; lsapi_child_status * pEnd = g_prefork_server->m_pChildrenStatusEnd; while( pStatus < pEnd ) { pStatus->m_pid = 0; ++pStatus; } if (s_busy_workers) __atomic_store_n(s_busy_workers, 0, __ATOMIC_SEQ_CST); if (s_accepting_workers) __atomic_store_n(s_accepting_workers, 0, __ATOMIC_SEQ_CST); } static void lsapi_sigchild( int signal ) { int status, pid; char expect_connected = LSAPI_STATE_CONNECTED; char expect_accepting = LSAPI_STATE_ACCEPTING; lsapi_child_status * child_status; if (g_prefork_server == NULL) return; while( 1 ) { pid = waitpid( -1, &status, WNOHANG|WUNTRACED ); if ( pid <= 0 ) { break; } if ( WIFSIGNALED( status )) { int sig_num = WTERMSIG( status ); #ifdef WCOREDUMP const char * dump = WCOREDUMP( status ) ? "yes" : "no"; #else const char * dump = "unknown"; #endif lsapi_log("Child process with pid: %d was killed by signal: " "%d, core dumped: %s\n", pid, sig_num, dump ); } if ( pid == s_pid_dump_debug_info ) { pid = 0; continue; } if ( pid == s_ignore_pid ) { pid = 0; s_ignore_pid = -1; continue; } child_status = find_child_status( pid ); if ( child_status ) { if (__atomic_compare_exchange_n(&child_status->m_state, &expect_connected, LSAPI_STATE_IDLE, 1, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) { if (s_busy_workers) __atomic_fetch_sub(s_busy_workers, 1, __ATOMIC_SEQ_CST); } else if (__atomic_compare_exchange_n(&child_status->m_state, &expect_accepting, LSAPI_STATE_IDLE, 1, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST)) { if (s_accepting_workers) __atomic_fetch_sub(s_accepting_workers, 1, __ATOMIC_SEQ_CST); } child_status->m_pid = 0; --g_prefork_server->m_iCurChildren; } } while(( g_prefork_server->m_pChildrenStatusCur > g_prefork_server->m_pChildrenStatus ) &&( g_prefork_server->m_pChildrenStatusCur[-1].m_pid == 0 )) --g_prefork_server->m_pChildrenStatusCur; } static int lsapi_init_children_status(void) { char * pBuf; int size = 4096; int max_children; if (g_prefork_server->m_pChildrenStatus) return 0; max_children = g_prefork_server->m_iMaxChildren + g_prefork_server->m_iExtraChildren; size = max_children * sizeof( lsapi_child_status ) * 2 + 3 * sizeof(int); size = (size + 4095) / 4096 * 4096; pBuf =( char*) mmap( NULL, size, PROT_READ | PROT_WRITE, MAP_ANON | MAP_SHARED, -1, 0 ); if ( pBuf == MAP_FAILED ) { perror( "Anonymous mmap() failed" ); return -1; } memset( pBuf, 0, size ); g_prefork_server->m_pChildrenStatus = (lsapi_child_status *)pBuf; g_prefork_server->m_pChildrenStatusCur = (lsapi_child_status *)pBuf; g_prefork_server->m_pChildrenStatusEnd = (lsapi_child_status *)pBuf + max_children; s_busy_workers = (int *)g_prefork_server->m_pChildrenStatusEnd; s_accepting_workers = s_busy_workers + 1; s_global_counter = s_accepting_workers + 1; s_avail_pages = (size_t *)(s_global_counter + 1); setsid(); return 0; } static void dump_debug_info( lsapi_child_status * pStatus, long tmCur ) { char achCmd[1024]; if ( s_pid_dump_debug_info ) { if ( kill( s_pid_dump_debug_info, 0 ) == 0 ) return; } lsapi_log("Possible runaway process, UID: %d, PPID: %d, PID: %d, " "reqCount: %d, process time: %ld, checkpoint time: %ld, start " "time: %ld\n", getuid(), getppid(), pStatus->m_pid, pStatus->m_iReqCounter, tmCur - pStatus->m_tmReqBegin, tmCur - pStatus->m_tmLastCheckPoint, tmCur - pStatus->m_tmStart ); s_pid_dump_debug_info = fork(); if (s_pid_dump_debug_info == 0) { snprintf( achCmd, 1024, "gdb --batch -ex \"attach %d\" -ex \"set height 0\" " "-ex \"bt\" >&2;PATH=$PATH:/usr/sbin lsof -p %d >&2", pStatus->m_pid, pStatus->m_pid ); if ( system( achCmd ) == -1 ) perror( "system()" ); exit( 0 ); } } static void lsapi_check_child_status( long tmCur ) { int idle = 0; int tobekilled; int dying = 0; int count = 0; lsapi_child_status * pStatus = g_prefork_server->m_pChildrenStatus; lsapi_child_status * pEnd = g_prefork_server->m_pChildrenStatusCur; while( pStatus < pEnd ) { tobekilled = 0; if ( pStatus->m_pid != 0 && pStatus->m_pid != -1) { ++count; if ( !pStatus->m_inProcess ) { if (g_prefork_server->m_iCurChildren - dying > g_prefork_server->m_iMaxChildren || idle > g_prefork_server->m_iMaxIdleChildren) { ++pStatus->m_iKillSent; //tobekilled = SIGUSR1; } else { if (s_max_idle_secs> 0 && tmCur - pStatus->m_tmWaitBegin > s_max_idle_secs + 5) { ++pStatus->m_iKillSent; //tobekilled = SIGUSR1; } } if (!pStatus->m_iKillSent) ++idle; } else { if (tmCur - pStatus->m_tmReqBegin > g_prefork_server->m_iMaxReqProcessTime) { if ((pStatus->m_iKillSent % 5) == 0 && s_dump_debug_info) dump_debug_info( pStatus, tmCur ); if ( pStatus->m_iKillSent > 5 ) { tobekilled = SIGKILL; lsapi_log("Force killing runaway process PID: %d" " with SIGKILL\n", pStatus->m_pid ); } else { tobekilled = SIGTERM; lsapi_log("Killing runaway process PID: %d with " "SIGTERM\n", pStatus->m_pid ); } } } if ( tobekilled ) { if (( kill( pStatus->m_pid, tobekilled ) == -1 ) && ( errno == ESRCH )) { pStatus->m_pid = 0; --count; } else { ++pStatus->m_iKillSent; ++dying; } } } ++pStatus; } if ( abs( g_prefork_server->m_iCurChildren - count ) > 1 ) { lsapi_log("Children tracking is wrong: Cur Children: %d," " count: %d, idle: %d, dying: %d\n", g_prefork_server->m_iCurChildren, count, idle, dying ); } } //static int lsapi_all_children_must_die(void) //{ // int maxWait; // int sec =0; // g_prefork_server->m_iMaxReqProcessTime = 10; // g_prefork_server->m_iMaxIdleChildren = -1; // maxWait = 15; // // while( g_prefork_server->m_iCurChildren && (sec < maxWait) ) // { // lsapi_check_child_status(time(NULL)); // sleep( 1 ); // sec++; // } // if ( g_prefork_server->m_iCurChildren != 0 ) // kill( -getpgrp(), SIGKILL ); // return 0; //} void set_skip_write(void) { s_skip_write = 1; } int is_enough_free_mem(void) { #if defined(linux) || defined(__linux) || defined(__linux__) || defined(__gnu_linux__) //minimum 1GB or 10% available free memory return (*s_avail_pages > s_min_avail_pages || (*s_avail_pages * 10) / s_total_pages > 0); #endif return 1; } static int lsapi_prefork_server_accept( lsapi_prefork_server * pServer, LSAPI_Request * pReq ) { struct sigaction act, old_term, old_quit, old_int, old_usr1, old_child; lsapi_child_status * child_status; int wait_secs = 0; int ret = 0; int pid; time_t lastTime = 0; time_t curTime = 0; fd_set readfds; struct timeval timeout; sigset_t mask; sigset_t orig_mask; lsapi_init_children_status(); act.sa_flags = 0; act.sa_handler = lsapi_sigchild; sigemptyset(&(act.sa_mask)); if( sigaction( SIGCHLD, &act, &old_child ) ) { perror( "Can't set signal handler for SIGCHILD" ); return -1; } /* Set up handler to kill children upon exit */ act.sa_flags = 0; act.sa_handler = lsapi_cleanup; sigemptyset(&(act.sa_mask)); if( sigaction( SIGTERM, &act, &old_term ) || sigaction( SIGINT, &act, &old_int ) || sigaction( SIGUSR1, &act, &old_usr1 ) || sigaction( SIGQUIT, &act, &old_quit )) { perror( "Can't set signals" ); return -1; } while( !s_stop ) { if (s_proc_group_timer_cb != NULL) { s_proc_group_timer_cb(&s_ignore_pid); } curTime = time( NULL ); if (curTime != lastTime ) { lastTime = curTime; if (lsapi_parent_dead()) break; lsapi_check_child_status(curTime ); if (pServer->m_iServerMaxIdle) { if ( pServer->m_iCurChildren <= 0 ) { ++wait_secs; if ( wait_secs > pServer->m_iServerMaxIdle ) return -1; } else wait_secs = 0; } } #if defined(linux) || defined(__linux) || defined(__linux__) || defined(__gnu_linux__) *s_avail_pages = sysconf(_SC_AVPHYS_PAGES); // lsapi_log("Memory total: %zd, free: %zd, free %%%zd\n", // s_total_pages, *s_avail_pages, *s_avail_pages * 100 / s_total_pages); #endif FD_ZERO( &readfds ); FD_SET( pServer->m_fd, &readfds ); timeout.tv_sec = 1; timeout.tv_usec = 0; ret = (*g_fnSelect)(pServer->m_fd+1, &readfds, NULL, NULL, &timeout); if (ret == 1 ) { int accepting = 0; if (s_accepting_workers) accepting = __atomic_load_n(s_accepting_workers, __ATOMIC_SEQ_CST); if (pServer->m_iCurChildren > 0 && accepting > 0) { usleep(400); while(accepting-- > 0) sched_yield(); continue; } } else if ( ret == -1 ) { if ( errno == EINTR ) continue; /* perror( "select()" ); */ break; } else { continue; } if (pServer->m_iCurChildren >= pServer->m_iMaxChildren + pServer->m_iExtraChildren) { lsapi_log("Reached max children process limit: %d, extra: %d," " current: %d, busy: %d, please increase LSAPI_CHILDREN.\n", pServer->m_iMaxChildren, pServer->m_iExtraChildren, pServer->m_iCurChildren, s_busy_workers ? *s_busy_workers : -1 ); usleep( 100000 ); continue; } pReq->m_fd = lsapi_accept( pServer->m_fd ); if ( pReq->m_fd != -1 ) { wait_secs = 0; child_status = find_child_status( 0 ); sigemptyset( &mask ); sigaddset( &mask, SIGCHLD ); if ( sigprocmask(SIG_BLOCK, &mask, &orig_mask) < 0 ) { perror( "sigprocmask(SIG_BLOCK) to block SIGCHLD" ); } pid = fork(); if ( !pid ) { setsid(); if (sigprocmask(SIG_SETMASK, &orig_mask, NULL) < 0) perror( "sigprocmask( SIG_SETMASK ) to restore SIGMASK in child" ); g_prefork_server = NULL; s_ppid = getppid(); s_pid = getpid(); s_req_processed = 0; s_proc_group_timer_cb = NULL; s_worker_status = child_status; if (pthread_atfork_func) (*pthread_atfork_func)(NULL, NULL, set_skip_write); __atomic_store_n(&s_worker_status->m_state, LSAPI_STATE_CONNECTED, __ATOMIC_SEQ_CST); if (s_busy_workers) __atomic_add_fetch(s_busy_workers, 1, __ATOMIC_SEQ_CST); lsapi_set_nblock( pReq->m_fd, 0 ); //keep it open if busy_count is used. if (!s_keep_listener && s_busy_workers && *s_busy_workers > (pServer->m_iMaxChildren >> 1)) s_keep_listener = 1; if ((s_uid == 0 || !s_keep_listener || !is_enough_free_mem()) && pReq->m_fdListen != -1 ) { close( pReq->m_fdListen ); pReq->m_fdListen = -1; } /* don't catch our signals */ sigaction( SIGCHLD, &old_child, 0 ); sigaction( SIGTERM, &old_term, 0 ); sigaction( SIGQUIT, &old_quit, 0 ); sigaction( SIGINT, &old_int, 0 ); sigaction( SIGUSR1, &old_usr1, 0 ); //init_conn_key( pReq->m_fd ); lsapi_notify_pid( pReq->m_fd ); s_notified_pid = 1; //if ( s_accept_notify ) // return notify_req_received( pReq->m_fd ); return 0; } else if ( pid == -1 ) { lsapi_perror("fork() failed, please increase process limit", errno); if (child_status) child_status->m_pid = 0; } else { ++pServer->m_iCurChildren; if ( child_status ) { child_status->m_pid = pid; child_status->m_tmWaitBegin = curTime; child_status->m_tmStart = curTime; } } close( pReq->m_fd ); pReq->m_fd = -1; if (sigprocmask(SIG_SETMASK, &orig_mask, NULL) < 0) perror( "sigprocmask( SIG_SETMASK ) to restore SIGMASK" ); } else { if (( errno == EINTR )||( errno == EAGAIN)) continue; lsapi_perror("accept() failed", errno); return -1; } } sigaction( SIGUSR1, &old_usr1, 0 ); //kill( -getpgrp(), SIGUSR1 ); //lsapi_all_children_must_die(); /* Sorry, children ;-) */ return -1; } static struct sigaction old_term, old_quit, old_int, old_usr1, old_child; int LSAPI_Postfork_Child(LSAPI_Request * pReq) { int max_children = g_prefork_server->m_iMaxChildren; s_pid = getpid(); __atomic_store_n(&pReq->child_status->m_pid, s_pid, __ATOMIC_SEQ_CST); s_worker_status = pReq->child_status; setsid(); g_prefork_server = NULL; s_ppid = getppid(); s_req_processed = 0; s_proc_group_timer_cb = NULL; if (pthread_atfork_func) (*pthread_atfork_func)(NULL, NULL, set_skip_write); __atomic_store_n(&s_worker_status->m_state, LSAPI_STATE_CONNECTED, __ATOMIC_SEQ_CST); if (s_busy_workers) __atomic_add_fetch(s_busy_workers, 1, __ATOMIC_SEQ_CST); lsapi_set_nblock( pReq->m_fd, 0 ); //keep it open if busy_count is used. if (!s_keep_listener && s_busy_workers && *s_busy_workers > (max_children >> 1)) s_keep_listener = 1; if ((s_uid == 0 || !s_keep_listener || !is_enough_free_mem()) && pReq->m_fdListen != -1 ) { close(pReq->m_fdListen); pReq->m_fdListen = -1; } //init_conn_key( pReq->m_fd ); lsapi_notify_pid(pReq->m_fd); s_notified_pid = 1; //if ( s_accept_notify ) // return notify_req_received( pReq->m_fd ); return 0; } int LSAPI_Postfork_Parent(LSAPI_Request * pReq) { ++g_prefork_server->m_iCurChildren; if (pReq->child_status) { time_t curTime = time( NULL ); pReq->child_status->m_tmWaitBegin = curTime; pReq->child_status->m_tmStart = curTime; } close(pReq->m_fd); pReq->m_fd = -1; return 0; } int LSAPI_Accept_Before_Fork(LSAPI_Request * pReq) { time_t lastTime = 0; time_t curTime = 0; fd_set readfds; struct timeval timeout; int wait_secs = 0; int ret = 0; lsapi_prefork_server * pServer = g_prefork_server; struct sigaction act; lsapi_init_children_status(); act.sa_flags = 0; act.sa_handler = lsapi_sigchild; sigemptyset(&(act.sa_mask)); if (sigaction(SIGCHLD, &act, &old_child)) { perror( "Can't set signal handler for SIGCHILD" ); return -1; } /* Set up handler to kill children upon exit */ act.sa_flags = 0; act.sa_handler = lsapi_cleanup; sigemptyset(&(act.sa_mask)); if (sigaction(SIGTERM, &act, &old_term) || sigaction(SIGINT, &act, &old_int ) || sigaction(SIGUSR1, &act, &old_usr1) || sigaction(SIGQUIT, &act, &old_quit)) { perror( "Can't set signals" ); return -1; } s_stop = 0; pReq->m_reqState = 0; while(!s_stop) { if (s_proc_group_timer_cb != NULL) { s_proc_group_timer_cb(&s_ignore_pid); } curTime = time(NULL); if (curTime != lastTime) { lastTime = curTime; if (lsapi_parent_dead()) break; lsapi_check_child_status(curTime); if (pServer->m_iServerMaxIdle) { if (pServer->m_iCurChildren <= 0) { ++wait_secs; if ( wait_secs > pServer->m_iServerMaxIdle ) return -1; } else wait_secs = 0; } } #if defined(linux) || defined(__linux) || defined(__linux__) || defined(__gnu_linux__) *s_avail_pages = sysconf(_SC_AVPHYS_PAGES); // lsapi_log("Memory total: %zd, free: %zd, free %%%zd\n", // s_total_pages, *s_avail_pages, *s_avail_pages * 100 / s_total_pages); #endif FD_ZERO(&readfds); FD_SET(pServer->m_fd, &readfds); timeout.tv_sec = 1; timeout.tv_usec = 0; ret = (*g_fnSelect)(pServer->m_fd+1, &readfds, NULL, NULL, &timeout); if (ret == 1 ) { int accepting = 0; if (s_accepting_workers) accepting = __atomic_load_n(s_accepting_workers, __ATOMIC_SEQ_CST); if (pServer->m_iCurChildren > 0 && accepting > 0) { usleep( 400); while(accepting-- > 0) sched_yield(); continue; } } else if (ret == -1) { if (errno == EINTR) continue; /* perror( "select()" ); */ break; } else { continue; } if (pServer->m_iCurChildren >= pServer->m_iMaxChildren + pServer->m_iExtraChildren) { lsapi_log("Reached max children process limit: %d, extra: %d," " current: %d, busy: %d, please increase LSAPI_CHILDREN.\n", pServer->m_iMaxChildren, pServer->m_iExtraChildren, pServer->m_iCurChildren, s_busy_workers ? *s_busy_workers : -1); usleep(100000); continue; } pReq->m_fd = lsapi_accept(pServer->m_fd); if (pReq->m_fd != -1) { wait_secs = 0; pReq->child_status = find_child_status(0); ret = 0; break; } else { if ((errno == EINTR) || (errno == EAGAIN)) continue; lsapi_perror("accept() failed", errno); ret = -1; break; } } sigaction(SIGCHLD, &old_child, 0); sigaction(SIGTERM, &old_term, 0); sigaction(SIGQUIT, &old_quit, 0); sigaction(SIGINT, &old_int, 0); sigaction(SIGUSR1, &old_usr1, 0); return ret; } int LSAPI_Prefork_Accept_r( LSAPI_Request * pReq ) { int fd; int ret; int wait_secs; fd_set readfds; struct timeval timeout; if (s_skip_write) return -1; LSAPI_Finish_r( pReq ); if ( g_prefork_server ) { if ( g_prefork_server->m_fd != -1 ) if ( lsapi_prefork_server_accept( g_prefork_server, pReq ) == -1 ) return -1; } else if (s_req_processed > 0 && s_max_busy_workers > 0 && s_busy_workers) { ret = __atomic_load_n(s_busy_workers, __ATOMIC_SEQ_CST); if (ret >= s_max_busy_workers) { send_conn_close_notification(pReq->m_fd); lsapi_close_connection(pReq); } } if ( (unsigned int)s_req_processed > s_max_reqs ) return -1; if ( s_worker_status ) { s_worker_status->m_tmWaitBegin = time( NULL ); } while( g_running ) { if ( pReq->m_fd != -1 ) { fd = pReq->m_fd; } else if ( pReq->m_fdListen != -1 ) fd = pReq->m_fdListen; else { break; } wait_secs = 0; while( 1 ) { if ( !g_running ) return -1; if (s_req_processed && s_worker_status && s_worker_status->m_iKillSent) return -1; FD_ZERO( &readfds ); FD_SET( fd, &readfds ); timeout.tv_sec = 1; timeout.tv_usec = 0; if (fd == pReq->m_fdListen) { if (s_worker_status) __atomic_store_n(&s_worker_status->m_state, LSAPI_STATE_ACCEPTING, __ATOMIC_SEQ_CST); if (s_accepting_workers) __atomic_fetch_add(s_accepting_workers, 1, __ATOMIC_SEQ_CST); } ret = (*g_fnSelect)(fd+1, &readfds, NULL, NULL, &timeout); if (fd == pReq->m_fdListen) { if (s_accepting_workers) __atomic_fetch_sub(s_accepting_workers, 1, __ATOMIC_SEQ_CST); if (s_worker_status) __atomic_store_n(&s_worker_status->m_state, LSAPI_STATE_IDLE, __ATOMIC_SEQ_CST); } if ( ret == 0 ) { if ( s_worker_status ) { s_worker_status->m_inProcess = 0; if (fd == pReq->m_fdListen) { if (s_keep_listener == 0 || !is_enough_free_mem()) return -1; if (s_keep_listener == 1) { int wait_time = 10; if (s_busy_workers) wait_time += *s_busy_workers * 10; if (s_accepting_workers) wait_time >>= (*s_accepting_workers); if (wait_secs >= wait_time) return -1; } } } ++wait_secs; if (( s_max_idle_secs > 0 )&&(wait_secs >= s_max_idle_secs )) return -1; if ( lsapi_parent_dead() ) return -1; } else if ( ret == -1 ) { if ( errno == EINTR ) continue; else return -1; } else if ( ret >= 1 ) { if (s_req_processed && s_worker_status && s_worker_status->m_iKillSent) return -1; if ( fd == pReq->m_fdListen ) { pReq->m_fd = lsapi_accept( pReq->m_fdListen ); if ( pReq->m_fd != -1 ) { if (s_worker_status) __atomic_store_n(&s_worker_status->m_state, LSAPI_STATE_CONNECTED, __ATOMIC_SEQ_CST); if (s_busy_workers) __atomic_fetch_add(s_busy_workers, 1, __ATOMIC_SEQ_CST); fd = pReq->m_fd; lsapi_set_nblock( fd, 0 ); //init_conn_key( pReq->m_fd ); if (!s_keep_listener) { close( pReq->m_fdListen ); pReq->m_fdListen = -1; } if ( s_accept_notify ) if ( notify_req_received( pReq->m_fd ) == -1 ) return -1; } else { if (( errno == EINTR )||( errno == EAGAIN)) continue; lsapi_perror( "lsapi_accept() error", errno ); return -1; } } else break; } } if ( !readReq( pReq ) ) { if ( s_worker_status ) { s_worker_status->m_iKillSent = 0; s_worker_status->m_inProcess = 1; ++s_worker_status->m_iReqCounter; s_worker_status->m_tmReqBegin = s_worker_status->m_tmLastCheckPoint = time(NULL); } ++s_req_processed; return 0; } lsapi_close_connection(pReq); LSAPI_Reset_r( pReq ); } return -1; } void LSAPI_Set_Max_Reqs( int reqs ) { s_max_reqs = reqs - 1; } void LSAPI_Set_Max_Idle( int secs ) { s_max_idle_secs = secs; } void LSAPI_Set_Max_Children( int maxChildren ) { if ( g_prefork_server ) g_prefork_server->m_iMaxChildren = maxChildren; } void LSAPI_Set_Extra_Children( int extraChildren ) { if (( g_prefork_server )&&( extraChildren >= 0 )) g_prefork_server->m_iExtraChildren = extraChildren; } void LSAPI_Set_Max_Process_Time( int secs ) { if (( g_prefork_server )&&( secs > 0 )) g_prefork_server->m_iMaxReqProcessTime = secs; } void LSAPI_Set_Max_Idle_Children( int maxIdleChld ) { if (( g_prefork_server )&&( maxIdleChld > 0 )) g_prefork_server->m_iMaxIdleChildren = maxIdleChld; } void LSAPI_Set_Server_Max_Idle_Secs( int serverMaxIdle ) { if ( g_prefork_server ) g_prefork_server->m_iServerMaxIdle = serverMaxIdle; } void LSAPI_Set_Slow_Req_Msecs( int msecs ) { s_slow_req_msecs = msecs; } int LSAPI_Get_Slow_Req_Msecs(void) { return s_slow_req_msecs; } void LSAPI_No_Check_ppid(void) { s_ppid = 0; } int LSAPI_Get_ppid(void) { return(s_ppid); } #if defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__) #include #else extern char ** environ; #endif static void unset_lsapi_envs(void) { char **env; #if defined(macintosh) || defined(__APPLE__) || defined(__APPLE_CC__) env = *_NSGetEnviron(); #else env = environ; #endif while( env != NULL && *env != NULL ) { if (!strncmp(*env, "LSAPI_", 6) || !strncmp( *env, "PHP_LSAPI_", 10 ) || (!strncmp( *env, "PHPRC=", 6 )&&(!s_uid))) { char ** del = env; do *del = del[1]; while( *del++ ); } else ++env; } } static int lsapi_initSuEXEC(void) { int i; struct passwd * pw; s_defaultUid = 0; s_defaultGid = 0; if ( s_uid == 0 ) { const char * p = getenv( "LSAPI_DEFAULT_UID" ); if ( p ) { i = atoi( p ); if ( i > 0 ) s_defaultUid = i; } p = getenv( "LSAPI_DEFAULT_GID" ); if ( p ) { i = atoi( p ); if ( i > 0 ) s_defaultGid = i; } p = getenv( "LSAPI_SECRET" ); if (( !p )||( readSecret(p) == -1 )) return -1; if ( g_prefork_server ) { if ( g_prefork_server->m_iMaxChildren < 100 ) g_prefork_server->m_iMaxChildren = 100; if ( g_prefork_server->m_iExtraChildren < 1000 ) g_prefork_server->m_iExtraChildren = 1000; } } if ( !s_defaultUid || !s_defaultGid ) { pw = getpwnam( "nobody" ); if ( pw ) { if ( !s_defaultUid ) s_defaultUid = pw->pw_uid; if ( !s_defaultGid ) s_defaultGid = pw->pw_gid; } else { if ( !s_defaultUid ) s_defaultUid = 10000; if ( !s_defaultGid ) s_defaultGid = 10000; } } return 0; } static int lsapi_check_path(const char *p, char *final, int max_len) { char resolved_path[PATH_MAX+1]; int len = 0; char *end; if (*p != '/') { if (getcwd(final, max_len) == NULL) return -1; len = strlen(final); *(final + len) = '/'; ++len; } end = memccpy(&final[len], p, '\0', PATH_MAX - len); if (!end) { errno = EINVAL; return -1; } p = final; if (realpath(p, resolved_path) == NULL && errno != ENOENT && errno != EACCES) return -1; if (strncmp(resolved_path, "/etc/", 5) == 0) { errno = EPERM; return -1; } return 0; } static int lsapi_reopen_stderr2(const char *full_path) { int newfd = open(full_path, O_WRONLY | O_CREAT | O_APPEND, 0644); if (newfd == -1) { LSAPI_perror_r(NULL, "Failed to open custom stderr log", full_path); return -1; } if (newfd != 2) { dup2(newfd, 2); close(newfd); dup2(2, 1); } if (s_stderr_log_path && full_path != s_stderr_log_path) { free(s_stderr_log_path); s_stderr_log_path = NULL; } s_stderr_log_path = strdup(full_path); return 0; } static int lsapi_reopen_stderr(const char *p) { char full_path[PATH_MAX]; if (s_uid == 0) return -1; if (lsapi_check_path(p, full_path, PATH_MAX) == -1) { LSAPI_perror_r(NULL, "Invalid custom stderr log path", p); return -1; } return lsapi_reopen_stderr2(full_path); } int LSAPI_Init_Env_Parameters( fn_select_t fp ) { const char *p; char ch; int n; int avoidFork = 0; p = getenv("LSAPI_STDERR_LOG"); if (p) { lsapi_reopen_stderr(p); } if (!s_stderr_log_path) s_stderr_is_pipe = isPipe(STDERR_FILENO); p = getenv( "PHP_LSAPI_MAX_REQUESTS" ); if ( !p ) p = getenv( "LSAPI_MAX_REQS" ); if ( p ) { n = atoi( p ); if ( n > 0 ) LSAPI_Set_Max_Reqs( n ); } p = getenv( "LSAPI_KEEP_LISTEN" ); if ( p ) { n = atoi( p ); s_keep_listener = n; } p = getenv( "LSAPI_AVOID_FORK" ); if ( p ) { avoidFork = atoi( p ); if (avoidFork) { s_keep_listener = 2; ch = *(p + strlen(p) - 1); if ( ch == 'G' || ch == 'g' ) avoidFork *= 1024 * 1024 * 1024; else if ( ch == 'M' || ch == 'm' ) avoidFork *= 1024 * 1024; if (avoidFork >= 1024 * 10240) s_min_avail_pages = avoidFork / 4096; } } p = getenv( "LSAPI_ACCEPT_NOTIFY" ); if ( p ) { s_accept_notify = atoi( p ); } p = getenv( "LSAPI_SLOW_REQ_MSECS" ); if ( p ) { n = atoi( p ); LSAPI_Set_Slow_Req_Msecs( n ); } #if defined( RLIMIT_CORE ) p = getenv( "LSAPI_ALLOW_CORE_DUMP" ); if ( !p ) { struct rlimit limit = { 0, 0 }; setrlimit( RLIMIT_CORE, &limit ); } else s_enable_core_dump = 1; #endif p = getenv( "LSAPI_MAX_IDLE" ); if ( p ) { n = atoi( p ); LSAPI_Set_Max_Idle( n ); } if ( LSAPI_Is_Listen() ) { n = 0; p = getenv( "PHP_LSAPI_CHILDREN" ); if ( !p ) p = getenv( "LSAPI_CHILDREN" ); if ( p ) n = atoi( p ); if ( n > 1 ) { LSAPI_Init_Prefork_Server( n, fp, avoidFork != 0 ); LSAPI_Set_Server_fd( g_req.m_fdListen ); } p = getenv( "LSAPI_EXTRA_CHILDREN" ); if ( p ) LSAPI_Set_Extra_Children( atoi( p ) ); p = getenv( "LSAPI_MAX_IDLE_CHILDREN" ); if ( p ) LSAPI_Set_Max_Idle_Children( atoi( p ) ); p = getenv( "LSAPI_PGRP_MAX_IDLE" ); if ( p ) { LSAPI_Set_Server_Max_Idle_Secs( atoi( p ) ); } p = getenv( "LSAPI_MAX_PROCESS_TIME" ); if ( p ) LSAPI_Set_Max_Process_Time( atoi( p ) ); if ( getenv( "LSAPI_PPID_NO_CHECK" ) ) { LSAPI_No_Check_ppid(); } p = getenv("LSAPI_MAX_BUSY_WORKER"); if (p) { n = atoi(p); s_max_busy_workers = n; if (n >= 0) LSAPI_No_Check_ppid(); } p = getenv( "LSAPI_DUMP_DEBUG_INFO" ); if ( p ) s_dump_debug_info = atoi( p ); if ( lsapi_initSuEXEC() == -1 ) return -1; #if defined(linux) || defined(__linux) || defined(__linux__) || defined(__gnu_linux__) lsapi_initLVE(); #endif } unset_lsapi_envs(); return 0; } int LSAPI_ErrResponse_r( LSAPI_Request * pReq, int code, const char ** pRespHeaders, const char * pBody, int bodyLen ) { LSAPI_SetRespStatus_r( pReq, code ); if ( pRespHeaders ) { while( *pRespHeaders ) { LSAPI_AppendRespHeader_r( pReq, *pRespHeaders, strlen( *pRespHeaders ) ); ++pRespHeaders; } } if ( pBody &&( bodyLen > 0 )) { LSAPI_Write_r( pReq, pBody, bodyLen ); } LSAPI_Finish_r( pReq ); return 0; } static void lsapi_MD5Transform(uint32 buf[4], uint32 const in[16]); /* * Note: this code is harmless on little-endian machines. */ static void byteReverse(unsigned char *buf, unsigned longs) { uint32 t; do { t = (uint32) ((unsigned) buf[3] << 8 | buf[2]) << 16 | ((unsigned) buf[1] << 8 | buf[0]); *(uint32 *) buf = t; buf += 4; } while (--longs); } /* * Start MD5 accumulation. Set bit count to 0 and buffer to mysterious * initialization constants. */ void lsapi_MD5Init(struct lsapi_MD5Context *ctx) { ctx->buf[0] = 0x67452301; ctx->buf[1] = 0xefcdab89; ctx->buf[2] = 0x98badcfe; ctx->buf[3] = 0x10325476; ctx->bits[0] = 0; ctx->bits[1] = 0; } /* * Update context to reflect the concatenation of another buffer full * of bytes. */ void lsapi_MD5Update(struct lsapi_MD5Context *ctx, unsigned char const *buf, unsigned len) { register uint32 t; /* Update bitcount */ t = ctx->bits[0]; if ((ctx->bits[0] = t + ((uint32) len << 3)) < t) ctx->bits[1]++; /* Carry from low to high */ ctx->bits[1] += len >> 29; t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */ /* Handle any leading odd-sized chunks */ if (t) { unsigned char *p = (unsigned char *) ctx->in + t; t = 64 - t; if (len < t) { memmove(p, buf, len); return; } memmove(p, buf, t); byteReverse(ctx->in, 16); lsapi_MD5Transform(ctx->buf, (uint32 *) ctx->in); buf += t; len -= t; } /* Process data in 64-byte chunks */ while (len >= 64) { memmove(ctx->in, buf, 64); byteReverse(ctx->in, 16); lsapi_MD5Transform(ctx->buf, (uint32 *) ctx->in); buf += 64; len -= 64; } /* Handle any remaining bytes of data. */ memmove(ctx->in, buf, len); } /* * Final wrap-up - pad to 64-byte boundary with the bit pattern * 1 0* (64-bit count of bits processed, MSB-first) */ void lsapi_MD5Final(unsigned char digest[16], struct lsapi_MD5Context *ctx) { unsigned int count; unsigned char *p; /* Compute number of bytes mod 64 */ count = (ctx->bits[0] >> 3) & 0x3F; /* Set the first char of padding to 0x80. This is safe since there is always at least one byte free */ p = ctx->in + count; *p++ = 0x80; /* Bytes of padding needed to make 64 bytes */ count = 64 - 1 - count; /* Pad out to 56 mod 64 */ if (count < 8) { /* Two lots of padding: Pad the first block to 64 bytes */ memset(p, 0, count); byteReverse(ctx->in, 16); lsapi_MD5Transform(ctx->buf, (uint32 *) ctx->in); /* Now fill the next block with 56 bytes */ memset(ctx->in, 0, 56); } else { /* Pad block to 56 bytes */ memset(p, 0, count - 8); } byteReverse(ctx->in, 14); /* Append length in bits and transform */ ((uint32 *) ctx->in)[14] = ctx->bits[0]; ((uint32 *) ctx->in)[15] = ctx->bits[1]; lsapi_MD5Transform(ctx->buf, (uint32 *) ctx->in); byteReverse((unsigned char *) ctx->buf, 4); memmove(digest, ctx->buf, 16); memset(ctx, 0, sizeof(*ctx)); /* In case it's sensitive */ } /* The four core functions - F1 is optimized somewhat */ /* #define F1(x, y, z) (x & y | ~x & z) */ #define F1(x, y, z) (z ^ (x & (y ^ z))) #define F2(x, y, z) F1(z, x, y) #define F3(x, y, z) (x ^ y ^ z) #define F4(x, y, z) (y ^ (x | ~z)) /* This is the central step in the MD5 algorithm. */ #define MD5STEP(f, w, x, y, z, data, s) \ ( w += f(x, y, z) + data, w = w<>(32-s), w += x ) /* * The core of the MD5 algorithm, this alters an existing MD5 hash to * reflect the addition of 16 longwords of new data. MD5Update blocks * the data and converts bytes into longwords for this routine. */ static void lsapi_MD5Transform(uint32 buf[4], uint32 const in[16]) { register uint32 a, b, c, d; a = buf[0]; b = buf[1]; c = buf[2]; d = buf[3]; MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7); MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12); MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17); MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22); MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7); MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12); MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17); MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22); MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7); MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12); MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17); MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22); MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7); MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12); MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17); MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22); MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5); MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9); MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14); MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20); MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5); MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9); MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14); MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20); MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5); MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9); MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14); MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20); MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5); MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9); MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14); MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20); MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4); MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11); MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16); MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23); MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4); MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11); MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16); MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23); MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4); MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11); MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16); MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23); MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4); MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11); MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16); MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23); MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6); MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10); MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15); MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21); MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6); MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10); MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15); MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21); MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6); MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10); MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15); MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21); MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6); MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10); MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15); MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21); buf[0] += a; buf[1] += b; buf[2] += c; buf[3] += d; } int LSAPI_Set_Restored_Parent_Pid(int pid) { int old_ppid = s_ppid; s_restored_ppid = pid; return old_ppid; } int LSAPI_Inc_Req_Processed(int cnt) { return __atomic_add_fetch(s_global_counter, cnt, __ATOMIC_SEQ_CST); } PK!Y//3share/gems/gems/ruby-lsapi-5.7/ext/lsapi/lsapilib.hnu[/* Copyright (c) 2002-2018, Lite Speed Technologies Inc. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the Lite Speed Technologies Inc nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef _LSAPILIB_H_ #define _LSAPILIB_H_ #if defined (c_plusplus) || defined (__cplusplus) extern "C" { #endif #include "lsapidef.h" #include #include #include struct LSAPI_key_value_pair { char * pKey; char * pValue; int keyLen; int valLen; }; struct lsapi_child_status; #define LSAPI_MAX_RESP_HEADERS 1000 typedef struct lsapi_request { int m_fdListen; int m_fd; long m_lLastActive; long m_lReqBegin; char * m_pReqBuf; int m_reqBufSize; char * m_pRespBuf; char * m_pRespBufEnd; char * m_pRespBufPos; char * m_pRespHeaderBuf; char * m_pRespHeaderBufEnd; char * m_pRespHeaderBufPos; struct lsapi_child_status * child_status; struct iovec * m_pIovec; struct iovec * m_pIovecEnd; struct iovec * m_pIovecCur; struct iovec * m_pIovecToWrite; struct lsapi_packet_header * m_respPktHeaderEnd; struct lsapi_req_header * m_pHeader; struct LSAPI_key_value_pair * m_pEnvList; struct LSAPI_key_value_pair * m_pSpecialEnvList; int m_envListSize; int m_specialEnvListSize; struct lsapi_http_header_index * m_pHeaderIndex; struct lsapi_header_offset * m_pUnknownHeader; char * m_pScriptFile; char * m_pScriptName; char * m_pQueryString; char * m_pHttpHeader; char * m_pRequestMethod; int m_totalLen; int m_reqState; off_t m_reqBodyLen; off_t m_reqBodyRead; int m_bufProcessed; int m_bufRead; struct lsapi_packet_header m_respPktHeader[5]; struct lsapi_resp_header m_respHeader; short m_respHeaderLen[LSAPI_MAX_RESP_HEADERS]; void * m_pAppData; }LSAPI_Request; extern LSAPI_Request g_req; /* return: >0 continue, ==0 stop, -1 failed */ typedef int (*LSAPI_CB_EnvHandler )( const char * pKey, int keyLen, const char * pValue, int valLen, void * arg ); int LSAPI_Init(void); void LSAPI_Stop(void); int LSAPI_Is_Listen_r( LSAPI_Request * pReq); int LSAPI_InitRequest( LSAPI_Request * pReq, int fd ); int LSAPI_Accept_r( LSAPI_Request * pReq ); void LSAPI_Reset_r( LSAPI_Request * pReq ); int LSAPI_Finish_r( LSAPI_Request * pReq ); int LSAPI_Release_r( LSAPI_Request * pReq ); char * LSAPI_GetHeader_r( LSAPI_Request * pReq, int headerIndex ); int LSAPI_ForeachHeader_r( LSAPI_Request * pReq, LSAPI_CB_EnvHandler fn, void * arg ); int LSAPI_ForeachOrgHeader_r( LSAPI_Request * pReq, LSAPI_CB_EnvHandler fn, void * arg ); int LSAPI_ForeachEnv_r( LSAPI_Request * pReq, LSAPI_CB_EnvHandler fn, void * arg ); int LSAPI_ForeachSpecialEnv_r( LSAPI_Request * pReq, LSAPI_CB_EnvHandler fn, void * arg ); char * LSAPI_GetEnv_r( LSAPI_Request * pReq, const char * name ); ssize_t LSAPI_ReadReqBody_r( LSAPI_Request * pReq, char * pBuf, size_t len ); int LSAPI_ReqBodyGetChar_r( LSAPI_Request * pReq ); int LSAPI_ReqBodyGetLine_r( LSAPI_Request * pReq, char * pBuf, size_t bufLen, int *getLF ); int LSAPI_FinalizeRespHeaders_r( LSAPI_Request * pReq ); ssize_t LSAPI_Write_r( LSAPI_Request * pReq, const char * pBuf, size_t len ); ssize_t LSAPI_sendfile_r( LSAPI_Request * pReq, int fdIn, off_t* off, size_t size ); ssize_t LSAPI_Write_Stderr_r( LSAPI_Request * pReq, const char * pBuf, size_t len ); int LSAPI_Flush_r( LSAPI_Request * pReq ); int LSAPI_AppendRespHeader_r( LSAPI_Request * pReq, const char * pBuf, int len ); int LSAPI_AppendRespHeader2_r( LSAPI_Request * pReq, const char * pHeaderName, const char * pHeaderValue ); int LSAPI_ErrResponse_r( LSAPI_Request * pReq, int code, const char ** pRespHeaders, const char * pBody, int bodyLen ); static inline int LSAPI_SetRespStatus_r( LSAPI_Request * pReq, int code ) { if ( !pReq ) return -1; pReq->m_respHeader.m_respInfo.m_status = code; return 0; } static inline int LSAPI_SetAppData_r( LSAPI_Request * pReq, void * data ) { if ( !pReq ) return -1; pReq->m_pAppData = data; return 0; } static inline void * LSAPI_GetAppData_r( LSAPI_Request * pReq ) { if ( !pReq ) return NULL; return pReq->m_pAppData; } static inline char * LSAPI_GetQueryString_r( LSAPI_Request * pReq ) { if ( pReq ) return pReq->m_pQueryString; return NULL; } static inline char * LSAPI_GetScriptFileName_r( LSAPI_Request * pReq ) { if ( pReq ) return pReq->m_pScriptFile; return NULL; } static inline char * LSAPI_GetScriptName_r( LSAPI_Request * pReq ) { if ( pReq ) return pReq->m_pScriptName; return NULL; } static inline char * LSAPI_GetRequestMethod_r( LSAPI_Request * pReq) { if ( pReq ) return pReq->m_pRequestMethod; return NULL; } static inline off_t LSAPI_GetReqBodyLen_r( LSAPI_Request * pReq ) { if ( pReq ) return pReq->m_reqBodyLen; return -1; } static inline off_t LSAPI_GetReqBodyRemain_r( LSAPI_Request * pReq ) { if ( pReq ) return pReq->m_reqBodyLen - pReq->m_reqBodyRead; return -1; } int LSAPI_End_Response_r(LSAPI_Request * pReq); int LSAPI_Is_Listen(void); static inline int LSAPI_Accept( void ) { return LSAPI_Accept_r( &g_req ); } static inline int LSAPI_Finish(void) { return LSAPI_Finish_r( &g_req ); } static inline char * LSAPI_GetHeader( int headerIndex ) { return LSAPI_GetHeader_r( &g_req, headerIndex ); } static inline int LSAPI_ForeachHeader( LSAPI_CB_EnvHandler fn, void * arg ) { return LSAPI_ForeachHeader_r( &g_req, fn, arg ); } static inline int LSAPI_ForeachOrgHeader( LSAPI_CB_EnvHandler fn, void * arg ) { return LSAPI_ForeachOrgHeader_r( &g_req, fn, arg ); } static inline int LSAPI_ForeachEnv( LSAPI_CB_EnvHandler fn, void * arg ) { return LSAPI_ForeachEnv_r( &g_req, fn, arg ); } static inline int LSAPI_ForeachSpecialEnv( LSAPI_CB_EnvHandler fn, void * arg ) { return LSAPI_ForeachSpecialEnv_r( &g_req, fn, arg ); } static inline char * LSAPI_GetEnv( const char * name ) { return LSAPI_GetEnv_r( &g_req, name ); } static inline char * LSAPI_GetQueryString(void) { return LSAPI_GetQueryString_r( &g_req ); } static inline char * LSAPI_GetScriptFileName(void) { return LSAPI_GetScriptFileName_r( &g_req ); } static inline char * LSAPI_GetScriptName(void) { return LSAPI_GetScriptName_r( &g_req ); } static inline char * LSAPI_GetRequestMethod(void) { return LSAPI_GetRequestMethod_r( &g_req ); } static inline off_t LSAPI_GetReqBodyLen(void) { return LSAPI_GetReqBodyLen_r( &g_req ); } static inline off_t LSAPI_GetReqBodyRemain(void) { return LSAPI_GetReqBodyRemain_r( &g_req ); } static inline ssize_t LSAPI_ReadReqBody( char * pBuf, size_t len ) { return LSAPI_ReadReqBody_r( &g_req, pBuf, len ); } static inline int LSAPI_ReqBodyGetChar(void) { return LSAPI_ReqBodyGetChar_r( &g_req ); } static inline int LSAPI_ReqBodyGetLine( char * pBuf, int len, int *getLF ) { return LSAPI_ReqBodyGetLine_r( &g_req, pBuf, len, getLF ); } static inline int LSAPI_FinalizeRespHeaders(void) { return LSAPI_FinalizeRespHeaders_r( &g_req ); } static inline ssize_t LSAPI_Write( const char * pBuf, ssize_t len ) { return LSAPI_Write_r( &g_req, pBuf, len ); } static inline ssize_t LSAPI_sendfile( int fdIn, off_t* off, size_t size ) { return LSAPI_sendfile_r(&g_req, fdIn, off, size ); } static inline ssize_t LSAPI_Write_Stderr( const char * pBuf, ssize_t len ) { return LSAPI_Write_Stderr_r( &g_req, pBuf, len ); } static inline int LSAPI_Flush(void) { return LSAPI_Flush_r( &g_req ); } static inline int LSAPI_AppendRespHeader( char * pBuf, int len ) { return LSAPI_AppendRespHeader_r( &g_req, pBuf, len ); } static inline int LSAPI_SetRespStatus( int code ) { return LSAPI_SetRespStatus_r( &g_req, code ); } static inline int LSAPI_ErrResponse( int code, const char ** pRespHeaders, const char * pBody, int bodyLen ) { return LSAPI_ErrResponse_r( &g_req, code, pRespHeaders, pBody, bodyLen ); } static inline int LSAPI_End_Response(void) { return LSAPI_End_Response_r( &g_req ); } int LSAPI_IsRunning(void); int LSAPI_CreateListenSock( const char * pBind, int backlog ); typedef int (*fn_select_t)( int, fd_set *, fd_set *, fd_set *, struct timeval * ); int LSAPI_Init_Prefork_Server( int max_children, fn_select_t fp, int avoidFork ); void LSAPI_Set_Server_fd( int fd ); int LSAPI_Prefork_Accept_r( LSAPI_Request * pReq ); void LSAPI_No_Check_ppid(void); void LSAPI_Set_Max_Reqs( int reqs ); void LSAPI_Set_Max_Idle( int secs ); void LSAPI_Set_Max_Children( int maxChildren ); void LSAPI_Set_Max_Idle_Children( int maxIdleChld ); void LSAPI_Set_Server_Max_Idle_Secs( int serverMaxIdle ); void LSAPI_Set_Max_Process_Time( int secs ); int LSAPI_Init_Env_Parameters( fn_select_t fp ); void LSAPI_Set_Slow_Req_Msecs( int msecs ); int LSAPI_Get_Slow_Req_Msecs(void); int LSAPI_is_suEXEC_Daemon(void); int LSAPI_Set_Restored_Parent_Pid(int pid); typedef void (*LSAPI_On_Timer_pf)(int *forked_child_pid); void LSAPI_Register_Pgrp_Timer_Callback(LSAPI_On_Timer_pf); int LSAPI_Inc_Req_Processed(int cnt); int LSAPI_Accept_Before_Fork(LSAPI_Request * pReq); int LSAPI_Postfork_Child(LSAPI_Request * pReq); int LSAPI_Postfork_Parent(LSAPI_Request * pReq); #define LSAPI_LOG_LEVEL_BITS 0xff #define LSAPI_LOG_FLAG_NONE 0 #define LSAPI_LOG_FLAG_DEBUG 1 #define LSAPI_LOG_FLAG_INFO 2 #define LSAPI_LOG_FLAG_NOTICE 3 #define LSAPI_LOG_FLAG_WARN 4 #define LSAPI_LOG_FLAG_ERROR 5 #define LSAPI_LOG_FLAG_CRIT 6 #define LSAPI_LOG_FLAG_FATAL 7 #define LSAPI_LOG_TIMESTAMP_BITS (0xff00) #define LSAPI_LOG_TIMESTAMP_FULL (0x100) #define LSAPI_LOG_TIMESTAMP_HMS (0x200) #define LSAPI_LOG_TIMESTAMP_STDERR (0x400) #define LSAPI_LOG_PID (0x10000) void LSAPI_Log(int flag, const char * fmt, ...) #if __GNUC__ __attribute__((format(printf, 2, 3))) #endif ; #if defined (c_plusplus) || defined (__cplusplus) } #endif #endif PK!b@((3share/gems/gems/ruby-lsapi-5.7/ext/lsapi/lsapilib.onu[ELF>@@=< 02/3.4-5ff.ÐHGH+FHcAVIH@AUATL$USHtQHHtIHIL9r 0HI9v'KHSMsH;Յ[]A\A]A^[D]A\A]A^øff.f=DÐO AWDD_AVAUATUSD6^nAxj׋G3G D!3G V\$ЋW^$DD1\$!3WAʋN Fp $E‰L$A1A1DD^ !D1G;νD\$DEDVDT$A!A1EE|A 1AD!E1DD*ƇGD1D!A1A1DDN DL$E F0D!DnA1D1DGFEDf Dd$D^(A!A1EEؘiA 1AD!1DDDʋ^0D1D!A1DE [D 1!D1DDN,A1DL$G\EA!Df8A1ED"kA 1AD!1DDN4EqDD1!1DE CyD 1!D1DDV<1G!I!1DDD$ Eb%1!1DDD$E@@1!1DDD$ EQZ^&1!1DE6Ƕ1!1DD]/։ 1!1DESD1!1DE ؉ 1!1DDD$E01!1DDD$ E!1!1DE7É1!1DDD$ E 1!1DDD$A0ZEAA1A!A1AA㩉A AD1!1t$DD1!A ogD1 1D!FL*1DD$Ή1AA!B9A1DD$A AD1D$qDD11‹D$ 0"amD1G 81Ɖ11DDD$ ED꾤11DDD$AKAA1A5`KA1AЉApA 1AD1D1D1A ~(D 1G'111DDD$ A0AA1A1AЋT$A2A1D1֋T$ 9ىDD11D11C|A A1A1AD$A0eVĉA1D1AD")Dt$ D D1A *CDG# 1  1DD9Ή 1DDY[e\$  1DE Dt$ щ1DE3}D\$  1DDD$E] 1DEO~oA AD 1DE ,DT$ A1ADE6CDt$ AN 1A~SADEAA A1A5:ADA AD 1Љ3*\$D D1DFӆ[ ]A\A]A^ 1։ 1DƉA4A_ OW GOW ATI1USHdH%(H$1HHH<$t)H$dH3%(u TH=1tIH=HcH5HH[ÉD1?H=HW(Hw`HLJHHLJ0HHWHVHWHWHWHWH)81HSHHHtHHtHHtH{@Ht1[fDHtGwBLHcAT4t/HcApHHH€:t HH1ff.fHtPtJSHcH;}HSHH[~ Hcи[ÃAWAVAUATUSHZHHHD$H:GH%HIHIIILfDA)HcHL9HcIOIvI HLHtML)HLHXHHAIA$D)EH[]A\A]A^A_LHHHAL|$II)AM?DLLHcH~A-H1|v@AVAUATUSHIHHHHHH+E1HH9HcHO؋)HH~)H9HwHHNHHIELL)Ht6Eu@HHDHu48u uMt-M[L]A\A]A^H~IHH)uIDHO(HW8HLJLSH)ʍBHGpH0HpH@Hwp~HcHHH HPHO8HGpAWAVAUATUSHHHT$HHH<$IH=HcB$HH@H,H9rZf.HH9vGH3LuHCH[]A\A]A^A_HD$L9IM9f.1H[]A\A]A^A_H$1L=L@Al4tI4LHHuHD$HcP 1~H $HLMtM9sHH$ID$HD$@IcMIcmH,$L| L9)A\$)H8HD$'-t _HHI9tHU:t8IcU IcEH$H€:H $HcHcAVHH€:@AVAUATUSL$HH $L9uHdH%(H$@1HHHHHHE1L LfHHcHcT4t7 qHM HIcAHL EHT DT t HHuHHcP HHL L9IcIHLfHH I9HcHHc0AHLcP IHcHHBDBHJH H2JAuH L$DIH Ic LEtaE1@AI E9~CAMIUIAuI}ӅH$@dH3%(u6H@[]A\A]A^D1@IcUff.AWAVAUATUSHXHt$ HT$dH%(H$H1HIH1E1L-HL%HHHcHcT4t/HHAAtIL{8IHC0L)H9>Lt$L+{(LA@LLfIM)MK H@σLSLCpNIHDI0HI@HKpM~HC(MxIH E1I@HC8HL1HMLIHHKpH9eHthILM)MUI9t HtDL+t$HL[]A\A]A^A_DM@@M)(IHt$HLHk8f.HAVLAUIATIUSHu\H߉AD${LǃLSHu0{L[L]A\A]A^[H]A\A]A^Hff.AWAVAUATUSHHHHD$ 0xIHIHLc\CHcT t u(HDLcLH t tLÅ~6HcAT t u#H@Å~ALH t tE<AG=I|$PHHTI9T$Hs7HI+t$@L2%))I|$PLHHcAMt$PHLIFID$PA:I|$PMD$PII@ID$PAIc$0fET8HЃA$0D$ H[]A\A]A^A_D$ ff.H HB=0AUATUSHcHfDA< t< uH؅uH[]A\A]IHPHHDI9D$Hs3HI+t$@L2%))tQI|$PHHAI\$PHCID$PIc$0fET8HЃA$0H1[]A\A]øSDAUATAUHSH?dH%(HD$1D$ff t1fHL$dH3 %(H[]A\A]ÐA1ҾÃtʼnǺ1HL$Aߺu#DHuDo߻D HDeOAkDH}An}NHtff.USHdH%(H$1HHu/HH$dH3%(uHĘ[]@1H=tAUATA'USH'DNuDH@AHHHHtH-ƉljUDk HDcEufH H IGAG IPH f@ f@ HHP P H HPPHHPPHHPPHHPPf@f@f@HH#PP H H'P#P$H$H+P'P(f@f@!f@%H(P+f@)I1 fDIHcȋL4t#fBIHT4 rfB@2JHHuMIcP IHHH9pH@ppHH@ppHH@ppHH@ppHH@ppHH@ppHH@ppHH@pHH9wMApIbIc@ IH0ALJt` A1LHcIHIGAo IuID%D-B(AA1IcH4IILI 9HqH= IJDB(9xHqH= XIJB($AD$IKAzHL$;MbfoLt$ LAoL$AT$Ml$)$ LLHL$LHLLH$ID$H$I3L$H1H D$$Dl$EDDl$H=IHIDMH=t"LDLŃP|$Et$A9uHt$DŃ5$A?D5t AH5LHtHHf)#AH51H@H51LH 1HIH51H51D%DD$H=IHtZEW7E1111H=H51E|$M2;|$E1H5LuI}Ń1H5LKfD=-ED$AIFH51HH)H5H11H5L 1H5LA#LH H1H5Laff.AVAUATUSHdH%(H$1D$ HH ;1Ll$Ld$Lt$ Hkl{ul;LLD$CHHt@HHt{1f|$=u|H4tH舴Hd1H$dH3 %(u}HĠ[]A\A]A^D {H5Hfы{LA;ff.AWAVAUATUSHD=dH%(H$1ExHH-H};DH-Ht 1HEDEH$L|$PDcA:E1AfD EDEtHHt @fLH1HIcDHD$PHD$XA ?)ѺHH D9#11A|$MHD9#HHt @D9#AD91葳fH$dH34%(' H[]A\A]A^A_KL$HDŽ$hMl$H$LH$LHHD$@AHLDŽ$hH$H$LHHD$0PH$LHHD$8+H$`L HHD$(H$ LHHD$HADžHD$PE1Ll$`HD$H$HD$H$`HD$fD%EHHt H=1IL9t<1ձL5EDu EME1VHLH1HHc}}LD$LHD$PHD$X ?)ѺH1H T`1 8Ht$(1ҿ x=_5tHHt @f,D9# DCHHt@HHtDc1DN ={H5HHHt*HHB(@HHt@HH@8B-DAD9M==H HtDHHt A9HHtD҉T$$DE ~:E~5T$$AAAuDE UM D9vHAHtDH51D$0 H=T$fD}蠩C1mH|$IH|$HT$Ht$161E Mt AMgMg{E1CHt$1ҿH=f;>fDD$$0d T$$WH=T$T$fDD#AfDRDEBHH29{H5H{wH=H=0MAH… H{HH=Ht$1ҿHL=HHHtH11L=AGHHt{1蝦D-EuHHt!E9~;t Ht$@1ҿL$Ht$01ҿHt$H1ҿHt$81ҿHt$(1ҿ kHLSH$$L$H=%,H=QHHt*fC1CD$CCT$HC(HC fD=ff.@H,LSLSLSLS GA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobin GA*GOW*GA*GA+stack_clashGA*cf_protection GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA*FORTIFYGA+GLIBCXX_ASSERTIONS GA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobin GA*GOW*GA*GA+stack_clashGA*cf_protection GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign GA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobin GA*GOW*GA*GA+stack_clashGA*cf_protection GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign GA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobin GA*GOW*GA*GA+stack_clashGA*cf_protection GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realign GA$3p1113GA$running gcc 8.5.0 20210514GA$annobin gcc 8.5.0 20210514GA$plugin name: gcc-annobin GA*GOW*GA*GA+stack_clashGA*cf_protection GA*FORTIFYGA+GLIBCXX_ASSERTIONSGA*GA!GA+omit_frame_pointerGA*GA!stack_realignAnonymous mmap() failedlocalhost%02d:%02d:%02d [%s] [UID:%d][%d] %.*syesnosystem()%s, errno: %d (%s) /dev/nulllibpthread.sopthread_atforkHTTP_[UID:%d][%d] %s:%s: %s LSAPI: jail() failure./etc/Can't set signalsaccept() failedLSAPI_STDERR_LOGPHP_LSAPI_MAX_REQUESTSLSAPI_MAX_REQSLSAPI_KEEP_LISTENLSAPI_AVOID_FORKLSAPI_ACCEPT_NOTIFYLSAPI_SLOW_REQ_MSECSLSAPI_ALLOW_CORE_DUMPLSAPI_MAX_IDLEPHP_LSAPI_CHILDRENLSAPI_CHILDRENLSAPI_EXTRA_CHILDRENLSAPI_MAX_IDLE_CHILDRENLSAPI_PGRP_MAX_IDLELSAPI_MAX_PROCESS_TIMELSAPI_PPID_NO_CHECKLSAPI_MAX_BUSY_WORKERLSAPI_DUMP_DEBUG_INFOnobodyLSAPI_DEFAULT_UIDLSAPI_DEFAULT_GIDLSAPI_SECRETLSAPI_LVE_ENABLELVE_ENABLEliblve.so.0lve_is_availablelve_instance_initlve_destroylve_enterlve_leavejailLSAPI_PHP_LSAPI_PHPRC=packetLen < 0 packetLen > %d Bad request header - ERROR#1 ParseRequest error SUEXEC_AUTHSUEXEC_UGIDLSAPI: setgid()LSAPI: initgroups()LSAPI: setgroups()LSAPI: setuid()Bad request header - ERROR#2 lsapi_accept() errorPragma: no-cacheRetry-After: 60Content-Type: text/htmlDEBUGINFONOTICEWARNERRORCRITFATALAcceptAccept-CharsetAccept-EncodingAccept-LanguageAuthorizationConnectionContent-TypeContent-LengthCookieCookie2HostPragmaRefererUser-AgentCache-ControlIf-Modified-SinceIf-MatchIf-None-MatchIf-RangeIf-Unmodified-SinceKeep-AliveRangeX-Forwarded-ForViaTransfer-EncodingHTTP_ACCEPTHTTP_ACCEPT_CHARSETHTTP_ACCEPT_ENCODINGHTTP_ACCEPT_LANGUAGEHTTP_AUTHORIZATIONHTTP_CONNECTIONCONTENT_TYPECONTENT_LENGTHHTTP_COOKIEHTTP_COOKIE2HTTP_HOSTHTTP_PRAGMAHTTP_REFERERHTTP_USER_AGENTHTTP_CACHE_CONTROLHTTP_IF_MODIFIED_SINCEHTTP_IF_MATCHHTTP_IF_NONE_MATCHHTTP_IF_RANGEHTTP_IF_UNMODIFIED_SINCEHTTP_KEEP_ALIVEHTTP_RANGEHTTP_X_FORWARDED_FORHTTP_VIAHTTP_TRANSFER_ENCODING%04d-%02d-%02d %02d:%02d:%02d.%06d Child process with pid: %d was killed by signal: %d, core dumped: %s Possible runaway process, UID: %d, PPID: %d, PID: %d, reqCount: %d, process time: %ld, checkpoint time: %ld, start time: %ld gdb --batch -ex "attach %d" -ex "set height 0" -ex "bt" >&2;PATH=$PATH:/usr/sbin lsof -p %d >&2Force killing runaway process PID: %d with SIGKILL Killing runaway process PID: %d with SIGTERM Children tracking is wrong: Cur Children: %d, count: %d, idle: %d, dying: %d LSAPI: LVE jail(%d) result: %d, error: %s ! Invalid custom stderr log pathFailed to open custom stderr logCan't set signal handler for SIGCHILDReached max children process limit: %d, extra: %d, current: %d, busy: %d, please increase LSAPI_CHILDREN. LSAPI: failed to open secret file: %s! LSAPI: failed to check state of file: %s! LSAPI: file permission check failure: %s LSAPI: failed to read secret from secret file: %s LSAPI: Unable to initialize LVERequest header does match total size, total: %d, real: %ld LSAPI: missing SUEXEC_UGID env, use default user! LSAPI: SUEXEC_AUTH authentication failed, use default user! LSAPI: lve_enter() failure, reached resource limit.prctl: Failed to set dumpable, core dump may not be available!sigprocmask(SIG_BLOCK) to block SIGCHLDsigprocmask( SIG_SETMASK ) to restore SIGMASK in childfork() failed, please increase process limitsigprocmask( SIG_SETMASK ) to restore SIGMASKCache-Control: private, no-cache, no-store, must-revalidate, max-age=0PID 508 Resource Limit Is Reached

Resource Limit Is Reached

The website is temporarily unable to service your request as it exceeded resource limit. Please try again later.
          ^ d/4-//// %-/Ga '9 (_intG )@/G G @ @ G @ G     G  `@ A C $E (J 0NL8PX@[+H\+X]+hj$xp4G- - N1 ooGGXa&& E18: ;1?A B C1GOI JK1 OQ RS TU1ac Ed EC^&e&g1 Y[ E]ah 1l5no 1tfv Ew x@ Cp3&5&<&Db_rtL&VO&i&p&y5G1$ +& ( * 0 { f|HCIRT Cv&"7&$ R  E+v"&T.1 4 c G@4HH//-Gldy"m - 911; CmGFy<d(eGfI@I@IEIE"1 36 |7 |8 |9 | : |(; |0< |8= |@@ |HA |PB |XD `F hHpItJ xM9NNO Q Y [ \ ] ^ E_ `b g+J  G J J  G4'  < ' ' '   T h4I ' T X@!      !!"! ! ! ""F " E" #!X@$  i0%9"# # # 4  G  "&4 &6 &7  < |"0'1 '3 |'4 |'6 '7 '8 |'9 | ': |(jtm8(, ( ( ( (  ( (((( ( ((0|< G'), ') ')'), ') ')H*! B@,H      !"#$%&'()*+,-./0123456789:;<<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~'-$|'-2 '-7 '-; .U.m.4/"/*/!B@/) !)./23\^bgl00/{C/&/ &/ -&/ =-G=GMG"/h/ 4M'/h'/h"// ///-GK/,/ ///M/K0050708090: 0; F 0<0= | 0>( ,"n11 1 GkB@2,     C2q&2s9&2t"2k2m 2n 2o 2p 2u",22 2 92 9 2 92 92 92 92 9 2 9$2 9("222 4G9G"22 92 92 92 9 "2G2 92 9"2o2"2"/" / 1 | 2 | 3  4 k : < = ? @ B| C  E|( F|0 G|8 I|@ J|H K|P L!VX O ` P h Q p R x T'\ V'b W'h X'h Y' Z' \'n ]'t _| `| a| b| c| d e f g h iL k'zL m'G(L n'8L oE "0pVr s uhvwxz{ |(vGa=G q' s w9   EM X9    $EM x7=RH H"XOYbufP =Q YinRG-G?]!NB@j~            9     H  H  H  |      l "G * ^GN G t N  t G M>CQ L L @  J l E m  9    9#!  9 9 #! @! !9Z! #!  g!F!9! ! |'  ! m!        # # *"G&%" K "  K@ V#          ( 0 8M " z# V# @      #  -     H! x$2cnt!U$2pid'U  : YO%2buf'#!U#in>74r"4TsUs]4U T 4UsT  [5m4UsT 5UsT ,5UsT Q5UsT v5UsT 5U ʳY5U YU ;W6%;O";#;Y2x6k%2w~}׳6U2T~QwY7U 9Y,7U YK7U Yj7U Y7U Y7U ;Y7U Y7U <ytY,8U YK8U G<Yw8U ;Y8U ;Y8U <Y8U Q;Y'9U YF9U ^9Us<Y9U Y9U Q;{X9TvQ | $0.MX] ":!p], _ ":3:=GE `: E- G % :!p%) %2| %= ' :len( end) |:=G ;i pw!)p7 2;env ! )del! D TD ( ;*$U(;**U(<*'U(G<*&U(v<*$U(<*"U( <*U( =   H  -5+fd ret    ~ Et;=   5 >__d U| $ &585> 8! O EOOOOw PyPz%P{2P|?P~LPYPfPsPPPPtPtPuPvNPP p?P>QT?Q?U  y @y!y 9C@7@Ä*UvT|Q@T7@U}C AUAT|Qt7"AU}CGAU?T|QtClAU2T|QtCAU:T|QtCAU3T|Qt3AU OAU0KQ BU|[%BUV3KBT}Q0R0XtC|BU:TtQ0BU T BU [WVBUu7BUthCUtTAtDCU0TtQtLtCU2TtQCU  CU CU  DU 8DU tiDU2TtQ03DU0T0Q DT0LCDUATtQ0CEU?TtQ0C8EU3TtQ0C\EU2TtQ0CEU:TtQ0EU QU  ?yj"FQy-?y+Qy+y #/ y+y #  yy*T Q8ly 9G~y+y yy*T Q8zqQGUsOhGU03GU|TvQ0R0X[WGU|GU|T0Q HU LGHUs?Ãsx_HUsHUs?ÃsqpHUsOHU0M M M .5+ O 4 P 4Q }R E} S retT  V z#EactX ~;I   5I__d ;1J  #JU T7VJU|CJUATvQ 7JU|CJU?TvQ CJU2TvQ CKU:TvQ C@KU3TvQ 3[KU OrKU0KQKU}[KUV3KT|Q0R0XC LUAT Q0C2LU?T Q0C[LU3T Q0CLU2T Q0CLU:T Q0LU T LU [W )MU HMU gMU VMUu> @N > +5+5N C 4OU0L pO  *5+  y6 GOy!y@ 7NÄ 9O*UsTwQ@3OU0T0Q OT0LQ: Q : @z# ; 95+act=  =  = % = / >  >  ?  @ retA pidB  C 4 D 4 E  F E H  I FP   FQ__d )  D/ 1T+ : 6R  ,        %RU T   F lY  *  5 =X~ret pfd YSYUUTsZqYUsTv88 Z 8 ' 8 @ : Zp; | < |res=  = , > ? ZG -[  6[  Gret fd  D  ZT1Q0ZUsT2Q1[UsT1Q2RDX4?[UsTvQ} ][UsT|L,[Uv 8 [  /5+  B!len LF[ch )   ^  05+  C  ,   len ;\ch ;\ch 57]  U|  x]TTQ~  ]T}Qv]UvU} t^* 25+U- Ä F^  05+#fn !#arg ,E@p_QTRQt Fp_ t )5+#fnu !#argu ,E@p_QTRQ6a s` a 6h#nb #fnb (#argb 3E d #hrete qX} b  ,5+#fn !#arg ,Ei len! " |ret# $ ;Zb7 Z}p8 | 9 | : | ;  < &t < -t5(achK % O Fa__cO 9 ̋F 1b݋r}U~T}#X|3bUv3$|"T v2$}"X|$_d /5+#fn!#arg,Ei len  |ret  _d~5c |  &t -tEdUwQ R E=dUwT| $ &Q R 3QdXvA"pd=G d2v1'U2v27T|'f (5+ ; #h #h['ff$Ff$9fSf^fNkfelfwfffffUffUff9RU|Ts3$"RU|q|f q-5+ q@is t |)p | |  &t -t)ch) )__c8< -g </5+ <B!len<O >  ?p@ A - B -retC iovDg E  gGh $5+ret n .ph6$)CP]qTshhUshUs?Ãs^(iNi*'5+U "\  -Ä -j +5+ 5#offBj N "\ jÄg5jUs*RjT~Q8Z^yjTTQQRR^8 - k (5+ ;!lenH "\  p! " - # - $ - %  - l .5+ ;| Hlen -    l$UvQ|-o ʊlۊ@U~TvQsln -5+ :| G THlen -  -  |  |  |p |  >n#nTQsTQsmo no% ooU~jUT:Qs]mo -5++moo%ooUs o .5+  len -|Sp*+5+U 5off yJqp y&5+(nYp n%5+-`t}$qKzq K*5+h-qUsgEqUseqUs?Ãs^Us-r -%5+hqUsgqUsqpqUs^Ft %5+=X~ElenF ~~ ?yPsQy-?y+Qy+y / y+y   yy*T Q8zqhsUssT0sT|Q}sT0xsUssUv?ÃsqptUs8tT6Q1R~X4 yt*(5+Ut@FtU %w (5+#fd2  `Tu}$q  uvT Y' >vk%'w~~׳/vUvT~Q~ HveY'U T2ʳvU vUsT vUvT1wU0wT0( Sw2cb;*UD Tx EۄwU=T ۄxU:T ;xUIT1WxU2T1t{xU T0xU T1T A y A%5+lenC D 4/y!fd4) 6 /y?yG+^y!fd+,s y!fd5 y!fd 7y!fd.!pktN\ *z *5+ 4   |  | Wz 65+ D z D.5+uidF gidG H I J#h K#hiL 1 >{ 1.5+ 2|!len2 2+| 26 4 5>{-N{G { '5+!uid3L!gid>@ Prv pw! { 6 | +5+#uid7L#pwL!ret  Tw3o|UQTs|U T Q|Xs}|UvT Q0 $} ,5+!uid8L) ret  r} -5+r} } }G}=G#4}6{  {,5+ {? {R} ":_n~ i~ ~$zUvT Q1R X rf~U|Tv*~U2DrJ [ J%stLSfdM ) zrc+   )uid  -5+  i ) &t -t7 O 35+i F2bp|) &t -t7v /5+pb7 )Hp |b6t Y t4h tB*u! Q u#| w#h x xh!fdh j=XlenkF R ف R<ف SH S+ U#hh> >>\ >L)bF62 G 235+ 2=p4 |vTv$ Ă $+5+!n$5p&  05+ :  | i!fd 2i < Gret  n  -!fd' 2E!len?ret -7 у 35+ !fdret 6 U#fd# +val UsT3Q0@UUT47wф wJ\ x&!lenx0tR :A  A A2EsaC~CWUvT0Qs7oUsCUvTsQ0:8 υ2sig8!U:3 2sig3 Uu (7   .mUs@U T QURTvvwxfmt'PVbuf Tvyp |z Eap  u5VtvEuVtm u{iևzU|T Q1R X \i/XzU|T Q1R X õuUsT0ϵUsTu +۵T1Q}Ru\i-zUsTdQ1R X Yv3$" izUsTdQ1R X  > [[OT1Q X|rW  :5+ D.|ʊ|."-" "E"%.k|6kkk.\|`\\.>E>E>>.'E̋'E''.EG.8 18.did d<P.A]__sA]__nAAP.%|Ռ%%|sz' 8n n8i i8 B  BS.)s))PW11W"m"m,moooo-o ʊۊ@U~TvQ|,aq$ÃSу G$% L8Us+ $Ã, )6CP]UvQ|,Ot  OfT0,YYYYY}YYY}Y}YYG g)U|TsQ N ʑ)UvT|Ql  UsT0Q: ` T}q ̋ ݋ Uv 6\ SG) U|T:51U|T )OU}T]AzU}T0Q}R}NU|[U},UUUUQUQVV[UC ה$UUUUVVNVV+VU T|QgU TvQ3VUu,flEfggg,g9gDgQg^gkgxgf< ggf%g,g9gDgQg^gkgxg e6)CP]qTwQ2R} Z ÄgU~U~?Ã~*7U2T~,9= ::п `:b :}:r::_:: , 2sUwT 9 %ɌUsT|Q јTvQ0 3:g 6E:R:HGeY'UsT AQ UsڙUvT2LUvU2T1}U0T Qs9 ]  :% :}U0T QU,jjjjjjjjjkQk j jjjjjjjjkk S $Ä? cUTQvg{UsgUs^,[[[[}[ [$[$[>[,[>[3g[U|- TvQs,Y8YYYYYYYQYY@tUUTT,{X!#XXX-{X XXX՞U@T1[UU,x xxx oO/ʊ  ۊ@UsTvQ| xA hxxx߁1V۠O  o@iš%8ʊۊ@U}T|Qv yn yyzz~zA %Aˁ+5R %5ˁvT v $ &33$A %Aˁ+5R %5ˁvT v $ &33$  wODO X]%j v v[ v v v6 v vȦ v-vS K$% >#)&+v %O23@ v  v ڨ$ v $-v $*z1 ԩ$Ă/I޲ւ%/vT AA34E    *a w't** 585@5R  3 6 7% ~8* 9D *t*n  )K*k  ***wp A  f :96 6 6f  6p 6 *9 +S; 3 ;!3[%dupdup* * *X3&D )] Z <4AA::+O#3=t 0 0 >"?o363A* @ 'n* A * A B1B( 1 : ; 9 I8 41B11 4: ;9 I 1RBUX YW  : ;9 IB 4: ;9 IB : ;9 I I: ; 9 I4: ;9 I1RBX YW .?<n: ; 9 4: ;9 I4: ;9 IBI41 U.: ;9 'I : ; 9 I!I/ .?: ;9 'I@B4: ; 9 I41 : ;9 I8 .?<n: ;9 I!: ;9 I" : ; 9 #: ;9 IB$1% & : ; 9 I'4: ; 9 I?<(.?: ;9 '@B) *: ;9 I+1RBX YW ,.1@B-1RBUX YW ..?: ; 9 'I 4/$ > 0(1 : ; 9 2: ;9 I34&I5 6.: ;9 'I@B7.: ;9 ' 8.?: ;9 'I 9'I:.: ;9 '@B; U<7I=!I/> 1?1B@B1A.?<n: ; B> I: ; 9 C : ; 9 D.?: ;9 'I@BE4: ;9 IF G5IH4: ;9 I?<I : ; I8 J<K : ;9 L : ; 9 I8M: ;9 IN 1UO 1PQ41 R'S1X YW T.?: ;9 '@BU 1UV4: ; 9 IW.: ; 9 'I X> I: ; 9 Y : ; 9 I8 ZB1[1UX YW \1RBX Y W ]: ; 9 I^% _$ > ` a : ; 9 b : ; 9 Ic'd&eIf : ; g: ; 9 h!i(j : ; 9 k : ; 9 l4G: ; 9 m'InB1o.?: ;9 'I@Bp4: ;9 I qrBs.: ;9 'I t.: ;9 ' u.: ;9 I v.?: ; 9 '@Bw: ; 9 IBx: ; 9 IBy4: ; 9 IBz4: ; 9 IB{1RBUX Y W |4: ; 9 I}1UX YW ~.?<n.?<n: ;9 6ddqd T)TuPPP(PPsPPKP[P"R+RRJQ^Q5Q5<v <Q{ PTt _X ~XX[TiT2TAXX[P[aQxT4T@PP{P{t XRr t;# $  %!r"p;# $  %!r"u?[gRSRbRHRQRR {RTKTiQX%vXvzr TiTTQq Ru .Q2QHQ+Q4QQoQQ;QQXP iR~Rv FRFW{ _Rz QK$KU$KKVKKUKIKTIKKSKK|hKKTK.KP.KPKQpKuKQuK}K?p K$KQ$KLKUpK}KU3KFK q 3KFK03KFKUQKpK8QKpK0QKpK\pKyK 7p yK}KQpK~K0pK}KUKK@KKUKKSKKVKKXKK0KKSKK|hJlJUlJJ]JJUJJ]JJUJJUJ0JT0JJSJJTJJTJJSJJTJJs@JJSJJSJJQJJ^JJQJJQJJ^JJ^7JTJPWJZJp?ZJaJPaJtJ\tJJPJJ_lJJUJJ | v"|JJ_|JJSJJTJJT|JJUJJ | v"JJ@JJSJJTJJs@JJ}JJ ~ JJQJJ\JJu`IIUII\IIUII\`IITIIT`IIQIIVIIvxIIVIIV`IIRII^IIRII^`IIXII]IIXII]dIITdIIUP@c@Uc@CVCrDUrDEVE.EU.EeEVeElFUlF;GV;GTIU@@P@@P@@P@APA0AS0ACAPVAiAP}AAPAAPAAPABP$B7BPKB^BPrBBPBBPBBPrDDSDDPDEPEEPEESlFFPDDsp"1DDP@@P@@PjApAPAAPAA0AAPBBPDDPDD0.E4EP:EQEP~@A0A!AP$AC\rDDPDD\DD0DD\DE0EE\lFF\FF0FH\H@I\EITI\@@P@@PAAPAAS5ACAP[AiAPAAPAAPBBP)B7BPPB^BPwBBPBBPBBPFGP"G,GP'CQCPE#EP HQHPFFPG!GP;GPGPPGTGUTGGVHHVHHQHHVI;IVEITIVFFPG!GPDGPGPPGTGUTGGVHHVHHQHHVI;IVEITIVWGpGPpGGSHHSI%IS%I6IP6I@ISEITISDGWG0DGPGPPGTGUTGWGV`GeG}eGpGQpGqG}`GpGPpGqGSGG@GG GGS]CtCP{C}C0G HP H HPfCtCPHHPHIS]>,?0,?C?]p;u<0<<P<=]=>]>,?0,?C?]p;u<0u<`=}=>}>>T>>}>,?0,?,?},?C?0p;u<0u<@=V@=V=PV==V==P=>V>>V>,?0,?0?V>?C?0p;`=S=:?S<< s $ &<<U=>0Z>c>0c>{>^{>>~>>~~>>~: ;U ;/;S/;0;U;;P99U9:S::U::S::U9S:\::S::@::6::W::4:: ::H4U4U U $$6U404^^ $^$6040000T9r0? $0404_\_\mm_ $_$60404K\KV\V\ $V$60SS 6S]] 6]USUSUST.V.T  wS  P ' S' W v(d r Pr x S     p`# p`# <$ c ~`# <$d x ~`# <$ vv" P c ^d x ^  \  0  P  S89P8:9QP+ PQQ + Q # 0 # 0 # P  U s U ) P) > S> k Pk n Sn r Pr s S 7L7UL77U 7H7TH7w7Vw7x7Tx77VM7Z7Px77P55U56V6?6U?66V66U66V66U56T6?6T?6F6TF66\66T66T66\66T66P66P66\T6g6Pg66S66UF66]66n2(3U(34\44U223T23(4V(404T044T223Q234]44Q63Y3PY3c3pc3t3Pt3~3^33p33P33S34P4,4,4h4L3p3Qp3~3R33Q33R3 4T 4 4tp 44T414^4(4V(404T0414T404|I4R4QR4S4VI4R4TR4S4]I4R4|_(l(Pl(v(u_(v(3_(l(ul(v(P''U''U''U''T''Q''T''T''Q''R''Q''QP''U''U''UP''T''Q''T''TP''Q''R''Q''Q0`U`SSU0`T`^TT0`Q`VQVQQ0`R`]R]RRD\~1$~"3$U"T $ &33$U"\~1$~"3$U"T $ &33$U"\`iP{P0%%U%&S&&}&+'U+'9'}9'@'U@'E'U0%%T%&_&9'}9'@'T@'E'}0%%Q%9'|9'@'Q@'E'|%%V%%vb%%0%%p 9'@'0%%Q&&Q%%P&&Pb%%0%%^%%~%&^&'}+'9'}9'@'0c&u&}u&&]&&}&&}&&]+'9'}K&&_+'9'_c&&S+'9'SK&X&V_&u&Vu&&}&&t&&T&&}#+'9'V%'\+'9'\&&P&'}+'9'}&&V&&v8$8&2$p"&& v8$8&2$p"c&c&5c&c& c&c&^#|$U|$$U$$U$ %U %%U%$%U#w#Tw#$S$$T$%S%%T%$%T#w#Qw#$V$$Q$%V% %Q %%V%%Q%$%Q##P##p$$0$$0$$^$%^<#w#0##r ##t %%0##Q$$q$!$qpI$Y$RY$m$q %%qp$$P$$P$%P<#w#0w##\##|#,$\,$_$|_$$\$%\ %%\%%0$!$T3$m$T %%T%%q`$!$X>$B$RB$$X %%X#$P %%P#$Y %%Y !U!7!S7!p!wp!{!{!!U!!S!*"w*""U""w !T uF!q!S!!S!!s""S""P""P{!!|I"o"|o""P{!!VD""V""v""V{!!_I""_{!!}D"d"}{!!]""]{!!^""^o""q2$u"""q2$u"o""v8$8&2$u"""v8$8&2$u"""v8$8&2$u"((U(=)S=)>)U>)Q)UQ)b)Sb))U()0) )P!)&) &)<)P>))0(( uu@()Q>)Q) uu@b)|) uu@()P( )s ))T))s()s()Pt u T p p# p`# tp# Q P 4 T2D2UD22S22~~22U22S22~~22U22U2D2TD22V22T22T22T22V22T22T2D2QD22]22Q22Q22Q22]22Q22Q2D2RD22\22R22R22R22\22R22R2)2u)22^22U#22^22U#22uU2Z2|Z2u2PU2u24U2u2^`U< ]< H UH b ]b k U`T< VH b V`Q5 SH [ S[ ^ sp^ b SP}q $ &}} $ &P\H b PP0< \H b \P\V 0 SH H S 0 VH H V 0 ^H H ^ PH b P  S  V  ^ZUZ^UH^H\UQTQ]TH]H\TZQZHQH\QZRZ\RH\H\RlSHS?ZSZ_H_HRSP\QTQZ]ZVUVVUHVH\TT__PPSS__UVU(4^(3 p $ &37 s $ &USUSUUSss $ &0yTyTMYQYn t2$x"#4nyRU)S)*UUPU0//U/0S0 0U 0#0S#0)0U./U/[/S[/\/U\/a/Ua/o/So/u/UWWUWXSXXUXYSYYUYPYSPYUYUY#YsY#YsY#YsY0Y Y#Ys U S"U"rSrU'T'V"]V]_P_rVrTdlP3  303}@3}S?LPL}\V]d2]d 3JP,2,U2,h,Vh,k,Uk,,V,<,T<,j,\j,k,Tk,,\,G,QG,,Q-,H,0H,L,Pk,,P,,R+:+U:++\++U++\+:+T:++^++T++^+:+Q:+V+SV++Q++P++p $  $-(q++ q++  U uh U T T q Rq w Rw y Ry R q Zw Z 0  [  p * X- q [q 0 0 T t  u|#- 4 T4 7 pD W T^ b tb q u|#q 00 C UC n Sn p Up w S0 G TG o Vo w TH _ P_ i sp u P U S U S U U S T V T V T V P P P0_U_VUV07T7\T\@JUJrVrvQvwU@UTUcScvRvwT@UV}U}V.U.VU@T|]|}T}.].5T5]v\S} S R.:v:\S\S P}Pv  \c c c\SWRWXuSWQWX]SWs} }d}S dUS.  (s U  S  U  S $ U$ * U Q$ * Q P ) P) * u t $ & P  \  \ T  V  V  ^  ^ P ] $ P \ V ^G P P U V U VU T _ T _T Q \ Q \Q R ^ R z^zRR P S %P%XSXdPdS R ] ]R U SS(S T VT9V 4}4]}*\kPS(P(QS*S04^0QTPThSsS'<'<S',},<\l\UvFQSs0s0s}Q | Q|V\dUdU}P_U_/0/LPLn__UdSPnSSPSdnPPQQRX))U)*^**U**U**U**U))T)*~**T**~**T**~))Q))w)*Q**Q**Q**Q**Q))Q))w)*Q))T)*~))U)*^**S)*~*`*_`*v*v**_&*f*Qf****}x**Qj**]**P{**P**]{**2{**w{**~{**P**]{**2D*T*qT*j*PD*j*6D*j*\,-U--V-T.UT..V..Q..U..U..V..U..V..U,- T.q. .. .. .. ,-W--ST.q.S..S..S..S,-U-{-V{--ST.q.S..U..V..S..V,V-0V-h-U..0r--P..P- - - -W{--_--\{--S{-- -.S*.T.S..S--P--V*.;.P;.T.V..P..V-- A--Sq..V..Q..U000U01S11U11S11U11S000T0111T1111T1111T11000Q00V01Q11Q11V11Q11V00V01Q11Q11V01111101S11S11S00]0 1T 11x1b1Tn11T11T01V11V000F1^F1R1rpR11^11^0-1_-151x511_11_0b1Yq11Y11Y11Y00R11R11 @00400T11V1111_45U5%5U%5/5U/55\55U55\55U45T5%5T%5F5TF55V55T55V55T45Q5%5Q%5P5QP55Q55Q55S55s55}%55S55}55S55P55st"%575P75F5st"1F5f5vs"1K5`5T`5b5tpb5f5Tq55Sq55Vq55|7 7U 77U77U7 7T 77T77T77U78U88U88U77T78V88T88V88T88V77Q78]88Q88]88Q88]77Q78]88Q88]88]77T78V88T88V88V77U7^8\88\K LU LWL_WLLULP_P$PU$POW_OWTWUTWW_LLP,LWL\LL\,LWLVLLV,LWLSLLS=LGLPLLP,L=L\,L=LV,L=LSLP_OPOW_TWW_qMMPLPSOPDUS\UOWSTWWSLL1LLPLLQ8MqMV8MqM\.MqM]NMXMPqMMP8MNMV8MNM\8MNM]MPSOP,RS\UUSV0VSW/WSMP_OP,R_\UU_V0V_W/W_MM p1OPQ p1MP\OP,R\\UU\V0V\W/W\MNVMNMNMNVMNMNMNPNONVNONNON!NONV!NON!NON8NONPyOO_RiR_RDU_\UV_5VV_4WOW_TWW_yOO#R,R#\UhU#yO{O0{OOPOOpOOPOOROPQ_OPQPOPkPpOPQpSPkPQkPyPp kPQp oPyPQyPPpyPQp}PPQPPpPPpPQp PPpPPpPQp PPpPPpPQpPPQPPpPPp PQp PPp!PPp$PQp$ PPp%PPp(PQp(PPQPPp)QEQPEQIQp"Q'Qp1$q""Q.Qp1$q"3QEQQ3QEQQ6QEQRiQQPQQppQRPpQRQQQPQQppQQPQRppQQRQQRQQRQQR\UU_iUUPvRRVvRR_RRPRU_UV_5VV_4WOW_TWW_RDS\DSGSPGSSwST\UU\UU0UU\RKS]KSSPSS~ST]UU]TUPRU0UV05VV04WOW0TWW0R SZ SSzhUUzhUU0 SSZUUZRRpRSXUUX_SS__SSz|_SSRSS~_SSz_SSzSS\SS}pSS@SS SS]TT0UV05VV0VV04WJW0TWW0WW0T T~UUP8VXV\VVVTT_UV_5VV_VV_4WJW_TWW_WW_^TpTPyTTPTTPTTPUUPUVVAVXVPiVVPVVPVVPVVVVVP4WIWPWWPWWVT2TP2TT]UUP5V@VP@VXV]XVzV0VV]VV]VVPTWW] TT_UU_XVzV_VV_TWW_ T3T 3T;TPTWgWPhWW_UUHUU0UU U4UU4UU4UUDU U4UPJP P$PU$PJP_.PJPP,d       9>ACFQxx| *)SX 05:@nOh"'3"'3TY}O[]dRV] 0 P P  0 P P {!!!"""{!!""`"h"p""""`"h"""%'0'9'.&5&B&G&c&c&_(e(l(v(((() )))* **`*f*{**D*D*I*Q*;+>+c+n+q++,,,-X.x.....,,- --.0.X...0111110000U2U2`2j2D3c3k3~333334%4,41464<4I4S455+5555q5w5{55777 8 888888s:}:::s:}:::::::::O<T<<<<<=>`>>@@@@BQC E0EFH HXHHHI;IEITIFGHHI;IEITIDGGHHI;IEITIQCChEpFH HXHHHIhEEXHHHIEpFHHdIdIxII_JJJJ|J|JJJJJJJJJJJJJJJpKpKuKwKyK~KKKKKKKKK,LWLLL0LWLLLWL\LL POPiSiSUUUUOWTWWMPOP,R\UUV5VW4WyOyOOOOP\PaPdPhPkP\PaPdPhPkPrPvPyPrPvPyPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPQQQQQQQQQQQQQQQQQQQQQQQRiSiSUUV5VV4W@WEWOWTW`WcWWUSeSiSiSiSSSSUS_S_SeSiSiSiSSSSiSqSSSSSTTUV8VV4W@WEWOWTW`WcWWTTTTUUUV8VV4W@WEWOWTW`WcWW T;TUUTW`WcWW T;TTW`WcWWUUUUUDUYYYYY0YYYZ ZUZaZZZ@[]^_`_`8`` aHaaa0bstruct_FILE.hFILE.hstdio.hsys_errlist.hresource.hstruct_iovec.hsocket.hsocket_type.hsockaddr.htime.hpwd.hstruct_tm.htime.hunistd.hctype.hconfname.hgetopt_core.hstdint-uintn.hin.hnetdb.hun.hlsapidef.hstring.hresource.hdlfcn.hsocket.herrno.hselect2.hsched.hmman.hsendfile.huio.hstrings.hinet.hwait.hprctl.hgrp.h KK.K5J/I#KK1 0 z zJ Z " OJJ = ...v <K gfJ.T2KxJ.n=@<YDw<<=:/;<;/u;=IK=H</փ-K-=>:X-=;=0:/;=I<//sf=H</[G-K-=18=;=0:X;=-/I=;/?Gf-K-=I<-=;=-/e=-/t0//-</-</-</-<///-<///-J=t=Y-</ȑ-</J>Xtu-=ttu;/K-=-/X-/t;/gK-=Y-=;=J;=/K-=-/X;/u-=ttu-=K;</f;=;/fu-=t.V>,>t;=/.K-=-/t-=-//-/-X.I</t.W=-/0,0,<.W=-/t/t;=;/H ># K# = l Z< < h u$I$K="IY<IJ =$J$<=;"<J = vXF.L L = /d f.L u /O7@p$tik<=<>V L a$f mX Xm< .>m<X N1+ pk " kJJ k.XX"~K k  [ X O(kX  < kX  b>= E<>:<Y<; = vk<q R< !l   l<lz/ f X< Kffkv ~*~ X$ rJ~ # .?f h ~~<  .<1 ~) < ~t)X ~<= jtt        Z-JJXft X L!s gf  fF J Y Y :"foXXXJlt0 hd/ L. XN6g J yi< X$   Z  4tKK  ;:|". < Z IY6t(f+K"JMX"X< mJ< & AJX0J XXXV$J)I!4f<9X!Jh  .$r.XX`KJ Jt5<uY"J q<% 3$x.`XYBW[$g   F x \ *2. F^ \t;:j KK-uYIX Ki+JJK2KKu\/ u  u  (tX |  x(9?JL6J9xX<u1tu6,XJK,@g L,K /sJK u XQy  X KEW \ g x. < %  /s u Z ptt  /t.X  o tK !f J/ kt Zs gY  Z Y g Y  #!xwJKxJK K!JK sJ  s< ! KJ9J!JK!s  f K =J YYt YYt YYJ YY<xK t<YL ,<W ue [A<v v .KXe#!CJ;Cg K E dX ` x DNK$ JG MY<," g <    =  &> t u X   Y r< f Kr  < r rJ huJL |   fX.X  ]u u<   Z = = y<kJK,&J"Irt &s=r< !rff  "yJD!IK L%; K%H K KKK.7 .XB#I1u#J Q  F Z  KNJ U  X  hJ.$ .Xhr / X L*~Jf-S. LKI u YZ .HJ K Y)%fX80JJ )X%<XX$%4HJL<0YBL=;B=Vv<)/Mt z0<6u  zt/  L4K"vI4H =" @"F %#K%W Yz Q*uJf  uJ K mJJ .I  <vJ uMF =0J u) Y%#K,K"9 =& =X YsJY FX:JJ Z L N*<xX<JX>tJ e < 7/t  L4K xH4 = K *vJfJ  uJ  Y.W mJt mX K t Km \x JYKWiX<JJz NS =;0WX Y)? K  LeJf<Ki*_8tK )^ ~tf<_K z.` ztf< XKJZfv*=gJ Z AK=%, =%H KM, tY,Lho!(fot(= -K l X|K<x < o.K Ms f sf tJt    Z 93JJM _< . jy 93JJ Kw ' K"f/ s XM X X mXL  f   yr rX' =P Yr J:h6t YGu  uf>= . f  K  ^tj  !tJ<   jF % =%H K  Z7)K LK)8 K! K 2%o = K%: K2 GK  _X#< ]< <& Y ZX [f<Ȃ _Xy q   KK&,N>:hZs"  [sf  "Ui Xi g Y .. - sX ... K fh00< =  h+< Y  u<   Y Jz   . L+< g  /.  L g J JK*X.X v6= Y; u/ Xl f? lJXY lf"Kl "K8G8=P.4XK%      J.Jp<J*<X v6= Y;. / Xl f lJXY"=8G8= I/..c<<jBz<  sX&`" f [Z M   L  Y 0 U= =Y K ^f 4I gYK$/ fY L y^ /K-%]  K+/X>0XX<uj Yv Xg Y IgZ$Hv&L<X(.= /.u.Z .fJOwX(WuO=.ft"<*w  <K t Y /?N&tuKK  h g G] t Y t YtM   t  Y IgYJvYY g r Y >v t YK, <Y ._ho<x }KYWJtbXK X 9    ft "u ; <u WY rXu WY X"0", XX LXJ<f?JfjK t Y*=K t ,=K t 0=K t .=K t Y,=KgjKK 2K zt/ Y Z  c    Zc  cf  Zc <<   a,<  Zci  Zc x    Zc w X     c       Yc  v    Yc  v    Zc  w    Yc  v  Z [    Zc   g     Yb  f }r       g {  g1J }  <1-u-).K.X UJ.< Z .)J KIK XxK +zz< O=>;g< 0:>< Y6 2 _< < Z    \_<   _X<   _ @ /        J       f :v ZYw Yu    Zv  .X t   tXI/ /    u ~ft  Zr> Z J  z  X/X < zX   tX /  `ggWK>X u ~X~ }XYX |X |<Y ^  X ./ XR XUJ Y   h.eX> tYvtYK   M U -/](tq $~Zv <Qyt/Z t   t Z*(t N   bX J| < y  !#J Y  Z+KZ)=1K- M< <Y v.u. }Jt ZY< gJ f"<  /  np < }2NX)     ~ |X}Y"Xg![qg!p'Y>tYK&CXK%.ZY&i fYp<x u   Zv X w ~9}5Xl t.Z7j.+"<g7/W5K/I Mu_Kg\K _SC_THREAD_SPORADIC_SERVERpthread_atfork_functotalLSAPI_Set_Max_Process_Timelsapi_parent_dead__fxstatparseContentLenFromHeaderugidLen_SC_2_SW_DEVm_pScriptFileLSAPI_Stopsi_addr_lsb_unused2_SC_TIMERSm_iReqCounter_fileno_SC_SHELL_SC_MEMORY_PROTECTION_SC_SCHAR_MAX__pathtm_secH_AUTHORIZATION_SC_THREAD_SAFE_FUNCTIONS_SC_UCHAR_MAXmax_lenfreeaddrinfogid_tverifyHeader_SC_C_LANG_SUPPORTm_pIovecEndstrcpy__uint8_tIPPROTO_TPpw_uidwaitpidHTTP_HEADER_LEN_SC_TTY_NAME_MAX_SC_PASS_MAXLSAPI_ErrResponse_rsi_uidm_bytes_SC_2_PBS_TRACKfp_lve_destroym_pHeader_IO_buf_end__RLIM_NLIMITS_SC_SELECT_shortbufrlimitsockaddr_insa_family_tSOCK_DCCP_SC_BC_STRING_MAX_ISpunctis_enough_free_meminet_addr_SC_TRACE_INHERITinit_lve_exnewSizem_tmStartliblvesetgroups_SC_SEMAPHORES_SC_EQUIV_CLASS_MAXread__environ_sigpollsa_datauint16_t__builtin_memmoveai_protocol_valuem_pChildrenStatusCurIPPROTO_UDPoverflow_arg_areatime_tsin_zero_SC_DEVICE_SPECIFICin_port_t_flagsachMD5_SC_THREAD_THREADS_MAXerror_msg_SC_LEVEL3_CACHE_SIZE_SC_TRACEreg_save_areacalloc_archm_respPktHeaderg_running__off_t_addr_bndlsapi_cleanupachHeaderNamest_size_SC_THREAD_PROCESS_SHAREDallocateBuf_SC_JOB_CONTROLgetppidtm_isdstswapIntEndianlsapi_check_child_statussignal_locks_max_idle_secslsapi_set_nblockenvirons_schedule_notifysetUID_LVE_SC_NL_NMAX__RLIMIT_NPROCRLIMIT_DATApServeratoluint32_tinitgroups_SC_POLLm_pHttpHeader_SC_V6_ILP32_OFF32_SC_TRACE_SYS_MAXm_pScriptName__builtin_va_listst_blksizeRLIMIT_NOFILEm_pEnvList_SC_BASE_sigchldLSAPI_Set_Max_Idle_Childrenint32_t_SC_LONG_BITfixEndianLSAPI_GetEnv_r_upper__fmtsa_familym_specialEnvListSizepw_passwd_SC_CLOCK_SELECTIONmasklsapi_resp_infoGNU C17 8.5.0 20210514 (Red Hat 8.5.0-26) -mtune=generic -m64 -march=x86-64 -g -O2 -fexceptions -fstack-protector-strong -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection=full -fPIC -fplugin=gcc-annobinsigaction__RLIMIT_RTTIME_SC_V7_LPBIG_OFFBIGbodyLeftfcntllastTime_SC_AIO_LISTIO_MAXLSAPI_Init_Prefork_ServerpErr1pErr2st_gidm_cntHeaderss_notify_scheduledm_envListSizeacceptinggettimeofdaypBufai_addrm_iAvoidForks_secret_timerlsapi_MD5Context__syscall_slong_t__builtin_memset_SC_FILE_SYSTEMsa_restorerm_pChildrenStatusEnd_IO_write_endtype_SC_SCHAR_MIN_SC_LINE_MAXLSAPI_SetRespStatus_rlsapi_MD5_CTX__resst_nlinks_addr_SC_TZNAME_MAX__va_list_tag_syscallst_ctimnameLen__builtin___snprintf_chkLSAPI_Postfork_Child_SC_2_VERSIONfree_SC_2_PBS_CHECKPOINTIPPROTO_MPLS__sigset_tm_requestMethodOffm_tmWaitBeginreadSecretreadReq__tznameatoig_initedgetaddrinfovalLens_acklsapi_jailLVE__d0_SC_LEVEL4_CACHE_ASSOClsapi_MD5Final_SC_NL_LANGMAXdoAddrInfo__stack_chk_failmemcpy_killcurSizeRLIMIT_STACKIPPROTO_IPIPdlopenbacklogsin_family_SC_LEVEL1_ICACHE_ASSOCpIovrlim_maxm_iKillSentm_fdListen_SC_AIO_PRIO_DELTA_MAXvalidateHeadersst_atimm_statusm_reqBodyLensig_numoptargSOCK_RAWsnprintfold_int_SC_2_C_BINDs_enable_lve__clock_tparseRequestIPPROTO_RAWstrdupbufLen_SC_PRIORITY_SCHEDULING_SC_SS_REPL_MAXsys_errlistsival_ptrpStderrLogsetpgid__uid_tdaylightsi_stimeoptoptLSAPI_ReqBodyGetChar_rpKeysun_family__uint16_t_SC_FSYNCsin_portgetpeernameLSAPI_is_suEXEC_DaemonLSAPI_Is_Listen_rLSAPI_End_Response_r_SC_FILE_ATTRIBUTESsetreuidserverAddr_SC_NZEROm_pQueryString__gnuc_va_list_SC_2_C_DEV_chainpContentLen_call_addrEnvForeachnewfdm_iServerMaxIdleSOCK_NONBLOCKusleepSOCK_RDM_SC_SYMLOOP_MAXsockaddr_un_ISblankunsigned charIPPROTO_MAX_SC_MQ_OPEN_MAXSOCK_DGRAMm_tmReqBegin__fd_mask__blkcnt_tlsapi_enterLVE__builtin_calloc_IO_lock_t__uint32_tLSAPI_Is_ListenIPPROTO_COMPLSAPI_key_value_pairlsapi_check_pathLSAPI_ForeachHeader_rpHeaderName_SC_SEM_NSEMS_MAX_SC_USHRT_MAXLSAPI_FinalizeRespHeaders_r__read_alias__fdelt_chkshouldFixEndianpBody_SC_STREAM_MAX_SC_ASYNCHRONOUS_IOserverMaxIdle__open_alias_SC_READER_WRITER_LOCKS_SC_CPUTIME__getcwd_alias_SC_2_PBS_LOCATE_SC_DEVICE_IOsa_flagspVecgeteuid_SC_SIGNALS__ctype_b_loc_SC_V7_ILP32_OFFBIGstatusoff_tchild_statuss_notified_pids_max_reqsH_X_FORWARDED_FORs_pid_dump_debug_info_ISalpha__fprintf_chktm_zone__mode_tm_queryStringOff_SC_V7_LP64_OFF64_SC_NPROCESSORS_CONF__RLIMIT_SIGPENDINGfdInlsapi_changeUGidtv_usec_SC_XOPEN_XCU_VERSIONold_childold_termLSAPI_sendfile_rlsapi_lve_erroraccept_SC_MEMLOCKallocateRespHeaderBuf_ISprintsched_yieldpMessages_liblvepValueH_CONTENT_LENGTHm_tmLastCheckPoint__vfprintf_chk_ISalnum_SC_SEM_VALUE_MAXs_req_processedstrtollopen_SC_XOPEN_XPG2_SC_XOPEN_XPG3_SC_XOPEN_XPG4LSAPI_STATE_CONNECTED_IO_write_ptr_SC_REALTIME_SIGNALSsystemlsapi_packet_headerIPPROTO_ENCAP_ISspacelsapi_suexec_authgetLFg_prefork_serverva_list__suseconds_treqsexitLSAPI_CreateListenSock2__rlim_ts_ignore_pid__RLIMIT_MEMLOCKpCurpHeaderValue__sizesizes_slow_req_msecslsapi_init_children_statusgetuidFILEH_COOKIELSAPI_ParseSockAddrdlsympthread_lib_SC_PII_INTERNET_DGRAM_SC_SINGLE_PROCESSbyteReversedump_debug_infoLSAPI_Accept_Before_Fork_SC_SHRT_MAX_ISxdigit_SC_RAW_SOCKETSfp_lve_enterLSAPI_AppendRespHeader_rsize_tH_CONNECTIONLSAPI_GetHeader_r_SC_MULTI_PROCESSs_stderr_log_pathm_statefp_lve_instance_init_SC_BC_BASE_MAXH_CONTENT_TYPELSAPI_STATE_ACCEPTING_SC_RTSIG_MAX_SC_NETWORKINGachCmdH_ACCEPT_SC_GETGR_R_SIZE_MAXperrorcompareValueLocation_SC_THREAD_ATTR_STACKADDR_SC_LEVEL2_CACHE_ASSOC_SC_IOV_MAX_SC_TRACE_EVENT_NAME_MAX_SC_PII_INTERNETIPPROTO_IGMPpServerAddrlsapi_acceptlsapi_initLVE_IO_save_baseLSAPI_Release_riovecold_usr1maxIdleChldsocklen_tm_iMaxChildren_SC_2_UPEai_canonnameIPPROTO_IPV6_SC_DELAYTIMER_MAXpw_dirsa_mask__sigval_tLSAPI_Set_Extra_Childrens_restored_ppidsin6_flowinfototalLenm_pid_SC_SYSTEM_DATABASElsapi_prefork_server_acceptm_pIovecToWritecodem_respHeaderLen_wide_dataH_IF_MATCHai_family__nlink_tsi_addrst_inost_modeLSAPI_IsRunning_SC_T_IOV_MAXCGI_HEADER_LENIPPROTO_DCCP__in6_uGetHeaderVarH_ACC_CHARSET__stream_SC_XOPEN_STREAMSm_iMaxIdleChildrensendfile_IScntrlm_reqBufSizelsapi_child_statusprctlallocateEnvList_ISupperpStatuserr_nosival_intsi_codem_pReqBufwait_timestrcasecmpH_IF_UNMOD_SINCEpw_name_SC_TRACE_USER_EVENT_MAX__socklen_tsend_notification_pktlsapi_requestpKeyEndcurTimefprintflsapi_writev__ssize_t__srclsapi_closepChrootH_IF_RANGEtimespecnameOff__u6_addr8strerror__RLIMIT_RSSavoidForkm_packetLenLSAPI_ReadReqBody_rIPPROTO_MPTCP_SC_2_FORT_RUNbindfp_lve_leave__valin6_addr_SC_ADVISORY_INFOpacketLen__timezone__ctype_toupper_locsin6_addr_SC_TIMER_MAXpBufCur_SC_THREADSunset_lsapi_envs__sighandler_t_SC_USER_GROUPS_RLSAPI_Set_Server_fdLSAPI_CreateListenSock__RLIMIT_LOCKSm_respPktHeaderEndLSAPI_On_Timer_pfLSAPI_Set_Max_Reqs_SC_UINT_MAXst_uids_conn_close_pktLSAPI_Postfork_ParentpEndpktTypelsapilib.cset_skip_write_SC_TRACE_NAME_MAX_lowers_busy_workers_SC_THREAD_DESTRUCTOR_ITERATIONSm_flagmemsetlevelstderrm_pHeaderIndexnameidle_SC_CHILD_MAXlsapi_reopen_stderr2_IO_save_endtm_min__nptrLSAPI_InitLSAPI_Request_SC_V6_LP64_OFF64flag_SC_NGROUPS_MAXm_bufProcessedfixHeaderIndexEndianstdoutfp_offsetlsapi_MD5TransformLSAPI_Write_Stderr_r__time_t_SC_THREAD_ROBUST_PRIO_INHERITgp_offset_padLSAPI_ForeachOrgHeader_rsigaddsetLSAPI_Inc_Req_Processedm_httpHeaderLendyingrealpathtm_yday_SC_SSIZE_MAX_SC_PII_OSI_CLTS_SC_SYSTEM_DATABASE_RmsecspAuth_SC_LEVEL1_DCACHE_SIZEkeyLenextraChildrenLSAPI_Flush_rshort unsigned intrlim_cursigned charLSAPI_Reset_rs_lveold_ppidLSAPI_CB_EnvHandler_valueLen__blksize_t_SC_STREAMSSOCK_STREAMdigestpBufEnd_SC_PAGESIZE_SC_THREAD_PRIORITY_SCHEDULINGcountsi_pidIPPROTO_MTPs_stop_SC_CHARCLASS_NAME_MAXlsapi_header_offsetstrchrvfprintfsetgid_boundstm_wday__off64_t__fd__lenachBuf_sigsys_IO_read_base_SC_XBS5_ILP32_OFFBIGsend_req_received_notification_offsetIPPROTO_EGPLSAPI_reset_server_statesockaddrsigset_ts_defaultGids_keep_listenersecsm_cntUnknownHeadersreadfdsai_addrlenlongsopterr_SC_DEVICE_SPECIFIC_RLSAPI_Set_Restored_Parent_Pidpw_gecos_modem_iExtraChildrenLSAPI_No_Check_ppid_SC_PIPE_IO_write_base_SC_XOPEN_CRYPTvalueLenm_respInfotz_dsttime_SC_PHYS_PAGESlsapi_enable_core_dumpH_CACHE_CTRLH_COOKIE2_SC_ATEXIT_MAX__desttm_monclose_SC_SHRT_MIN_SC_FIFObitstimeH_USERAGENTs_min_avail_pages_SC_USER_GROUPSm_lLastActiveLSAPI_ForeachEnv_rlong intSOCK_PACKETsa_sigactionnotify_req_received_SC_XBS5_ILP32_OFF32dumps_worker_status_IO_marker__builtin_strncpys_ppidtm_yearlimitmax_children_SC_2_PBS_MESSAGEm_pRespBufEndtimevalorig_masktmCur_SC_XOPEN_REALTIME_THREADSfp_lve_is_availablepAddrs_defaultUidm_pChildrenStatus__fds_bits_SC_SPIN_LOCKSLSAPI_Set_Server_Max_Idle_Secswritem_bufRead_SC_SPORADIC_SERVERlsapi_close_connectionuint8_t_SC_LEVEL1_DCACHE_LINESIZE__sigaction_handlerlsapi_signal_SC_PRIORITIZED_IOin_addrSOCK_SEQPACKET__pid_t_IO_codecvt_SC_GETPW_R_SIZE_MAXpUgidheadershints_SC_XOPEN_VERSIONH_RANGE_SC_BC_SCALE_MAX_SC_2_C_VERSIONdup2strtolg_reqlong doubleparseEnvai_socktype_SC_THREAD_KEYS_MAXiov_len_SC_LEVEL4_CACHE_LINESIZEfd_setlsapi_MD5Init_SC_NL_TEXTMAXnonblocklong unsigned intlsapi_req_header_SC_LOGIN_NAME_MAXfind_child_statusIPPROTO_PIM_SC_XBS5_LP64_OFF64_SC_SPAWNmaxChildrennewlensi_statussigemptyset_pkeym_headerOff__RLIMIT_OFILEHTTP_HEADERS_SC_2_PBSs_proc_group_timer_cbpw_gid__errno_location_SC_XBS5_LPBIG_OFFBIG_SC_WORD_BITchar_SC_2_PBS_ACCOUNTINGm_pSpecialEnvListsin6_scope_idstdin_SC_AIO_MAX__oflag_SC_2_CHAR_TERMresolved_path_SC_LEVEL1_ICACHE_LINESIZE_IO_buf_baseai_flagsrealloc_SC_XOPEN_SHM__dev_t_SC_XOPEN_ENH_I18Nold_quitRLIMIT_CPU__glibc_reserved_IO_read_end_SC_ULONG_MAX_SC_TYPED_MEMORY_OBJECTS_SC_TIMEOUTS_SC_LEVEL2_CACHE_SIZEfinal_SC_XOPEN_UNIXm_pRespBufPos_IO_FILEin_addr_tm_fdH_HOST_IO_wide_datacookiestrlentzname_sifields_SC_LEVEL2_CACHE_LINESIZE__u6_addr16s_pidIPPROTO_AHLSAPI_ReqBodyGetLine_rtm_hoursetsidFlush_RespBuf_r_SC_THREAD_STACK_MINisPipe_SC_PII_OSI_Mm_respHeaders_global_counterRLIMIT_AS_SC_NL_MSGMAXsi_signom_pAppData__RLIMIT_MSGQUEUEachAddrm_inProcess_SC_THREAD_ROBUST_PRIO_PROTECT_ISgraph_lsapi_prefork_servertm_mdaypIntegerlsapi_siguser1__pad0_SC_BC_DIM_MAX__pad5_SC_LEVEL1_DCACHE_ASSOCmallocs_dump_debug_infos_avail_pages__u6_addr32_headerInfom_typesi_errnofinish_closelistensigno_SC_XOPEN_REALTIME_markersLSAPI_InitRequest_SC_SAVED_IDSpBindm_scriptFileOff_SC_INT_MAXsi_bands_log_level_namess_skip_writeH_VIAmemccpy_codecvtforkIPPROTO_ESPm_pRespHeaderBufEnd_SC_TRACE_LOGgetpwnamtimeout_SC_THREAD_PRIO_PROTECTg_fnSelectRLIMIT_FSIZE__builtin_memcpyst_rdevlsapi_http_header_indexpEnv_SC_OPEN_MAXst_devssize_tdlerrorheaderIndex_SC_UIO_MAXIOVLSAPI_Logm_pRespHeaderBuf__int32_tH_PRAGMA/opt/cpanel/ea-ruby27/root/usr/local/share/gems/gems/ruby-lsapi-5.7/ext/lsapiqsortpSecretFile__RLIMIT_NLIMITS__daylightIPPROTO_RSVPstrncpyH_REFERERIPPROTO_UDPLITESOCK_CLOEXECLSAPI_Set_Slow_Req_MsecsLSAPI_Prefork_Accept_r_sys_siglisthandler_SC_CHAR_MAXLSAPI_Get_ppid_ISlowerpEnvEndsigprocmaskm_pUnknownHeadergetpwuidm_reqState_SC_PII_XTIpRespHeadersleftkillsysconfm_pRespBufm_iCurChildrensocketLSAPI_Write_r_SC_PII_OSI_COTSm_totalLenpasswdm_pIovecs_stderr_is_pipefstat__snprintf_chk_SC_PII_SOCKET__gid_tlsapi_sigpipe_SC_V6_LPBIG_OFFBIG_SC_MQ_PRIO_MAXgetcwdH_TRANSFER_ENCODINGH_IF_MODIFIED_SINCE__bsxai_nexts_enable_core_dump_SC_TRACE_EVENT_FILTERnodelaysin6_family__resolved_freeres_buf_sigfaultm_iChildrenMaxIdleTime_SC_THREAD_CPUTIMEsi_utimetv_sec_SC_VERSIONm_cntSpecialEnv_SC_C_LANG_SUPPORT_Rlong long unsigned intmemmovesa_handlersin_addr_cur_columnlsapi_load_lve_libtoWriteuid_t_SC_PIIsi_fd_SC_MAPPED_FILES_SC_LEVEL4_CACHE_SIZEIPPROTO_BEETPHfp_lve_jail_SC_2_FORT_DEVIPPROTO_IPm_pRespHeaderBufPosst_blockslsapi_initSuEXEC__bswap_16getpid__buf_SC_2_LOCALEDEFm_cntEnvlocaltime_r_SC_LEVEL1_ICACHE_SIZEreadBodyToReqBuftm_gmtoffIPPROTO_PUP_namesigval_IO_backup_baseH_KEEP_ALIVE_IO_read_ptr_SC_CHAR_BITLSAPI_Register_Pgrp_Timer_Callbackmd5ctx__socket_type__nbytes_nameLengetenv_freeres_list__aps_max_busy_workersIPPROTO_ETHERNETH_IF_NO_MATCHpEnvListrlim_tlsapi_readsun_pathtimezoneCGI_HEADERSsi_overrun__bswap_32pReq_SC_INT_MINlsapi_MD5Update_SC_RE_DUP_MAX_SC_PII_INTERNET_STREAMachBodyachPeerheader_SC_THREAD_ATTR_STACKSIZEfull_path_old_offset_SC_SIGQUEUE_MAXsiginfo_t_SC_FD_MGMTexpect_connected_SC_SYNCHRONIZED_IOLSAPI_STATE_IDLEvalueOffsighandler_t_SC_V7_ILP32_OFF32skipunlinksend_conn_close_notificationoptinds_accept_notifywritevH_ACC_LANG_SC_EXPR_NEST_MAX_SC_LEVEL3_CACHE_LINESIZElong long intm_pktHeaderin6addr_loopbackports_accepting_workersIPPROTO_IDP_flags2lsapi_prefork_serverallocateIovec_SC_MESSAGE_PASSING__ch_SC_REGEX_VERSIONm_iLenLSAPI_Set_Max_Children__d1setuidtv_nsecm_scriptNameOfflsapi_perror_SC_FILE_LOCKING_SC_AVPHYS_PAGES_SC_MB_LEN_MAXpHeader_ISdigitsockaddr_in6IPPROTO_SCTP_SC_PII_OSI_SC_ARG_MAX__ino_tsetsockopt_SC_MEMLOCK_RANGELSAPI_Finish_r_SC_SHARED_MEMORY_OBJECTSlsapi_resp_headersys_nerrin6addr_anym_pRequestMethodachError_SC_CHAR_MIN__realpath_chkiov_basem_lReqBegins_uids_total_pagespw_shell__namem_versionB0m_versionB1IPPROTO_GRE_SC_XOPEN_LEGACY_SC_NL_ARGMAXRLIMIT_COREsi_tidtobekilled_SC_THREAD_PRIO_INHERIT_SC_LEVEL3_CACHE_ASSOC_SC_NPROCESSORS_ONLNm_headerLenexpect_acceptingm_pIovecCurfdListenLSAPI_Init_Env_Parametersaddr_len_SC_HOST_NAME_MAXIPPROTO_TCPLSAPI_AppendRespHeader2_r_SC_COLL_WEIGHTS_MAX_SC_MONOTONIC_CLOCK__rlimit_resourcem_reqBodyReadLSAPI_Set_Max_Idle_SC_CLK_TCKLSAPI_ForeachSpecialEnv_rlsapi_buildPacketHeaderLSAPI_perror_r_SC_NL_SETMAXunsigned int_SC_BARRIERSbodyLenpBeginLSAPI_Accept_rwait_secslsapi_reopen_stderrstrcmpst_mtim__statbuf__RLIMIT_NICEfn_select_tshort intlsapi_notify_pidsi_sigvalsetrlimit_vtable_offsetaddrinfo_SC_IPV6mmapIPPROTO_ICMPlsapi_sigchild_SC_REGEXPlsapi_schedule_notifyLSAPI_Get_Slow_Req_Msecs_SC_V6_ILP32_OFFBIGstatmemchrtz_minuteswestsys_siglistH_ACC_ENCODINGsin6_portm_iMaxReqProcessTime__RLIMIT_RTPRIOGCC: (GNU) 8.5.0 20210514 (Red Hat 8.5.0-26)GNUzRx 0D LXsEIB E(A0z (A BBBI A (D BBBA  @YGJB B(A0A80F(B DBb0BFC G  AABK Hk(\GADJ n AAA 4UAGK R CAG L JCG AG] AJ t C KFLBBE A(H0H (D BBBD  (D BBBA PXvFB A(D0D (A BBBB L(A BBBA$aAAD XAAHBBB B(A0A8D@N 8C0A(B BBBH $ OAf Q C E H@HYBBB A(D0J 0A(A BBBF xFEA C(G   (A ABBD M I c A  E M A k E E E E H V HFBB B(A0A8D`` 8A0A(B BBBD lT+BBB B(A0D8JYHPC Mi 8A0A(B BBBE LTMDd6BBB B(A0A8DP 8A0A(B BBBG  8J0H(G DBBK $,7EFF IIOTh|  4FAA G>  AABG EO D  A  (Y<JEDXS l]Ph H XAHlFBB B(A0A8LP 8A0A(B BBBH < FBB A(A0 (D BBBI i`0FBB B(A0A8DP~ 8A0A(B BBBA k 8A0A(B BBBH L$FBB A(A0H Q D 0A(A BBBH LFBB B(A0A8G 8A0A(B BBBF 4FHF\$pnCXJLlFBB B(A0A8DA 8A0A(B BBBA `BBB B(A0A8G I K I L N N w 8A0A(B BBBI 0L BMD GL  AABA < =BAA G L@I@U  AABG $ TWEHG ag H SH FBB B(A0A8DPS 8D0A(B BBBF TX bIE D(C0P (F BBBM Q(H BBBAH FBB B(A0A8DP 8A0A(B BBBA T CBA A(G0` (A ABBD  (C ABBA J8T -FBD D(D@T (A ABBB  ( lECGF AAI L !cBG A(D0 (A ABBE XD0 4 ZH 10\ pFAA G@7  AABF  @LsL FBB B(A0A8G 8A0A(B BBBG   $ 8 L ` t     <  FBA K(G (A ABBG <FEE D(D0M (C BBBB X(HlFBH E(A0E8I@ 8A0A(B BBBE (FED ABH BBB B(A0A8G 8A0A(B BBBJ D0FBB A(A0G 0A(A BBBF Lx FBB B(A0A8G  8A0A(B BBBA    1 -  E2a~345.IWul -- "0s-Je s z )Y)2L0Yz+ k + w 0 Gw : X Ui s  s    x 5 P _ s(0x *  * # N0 al |  O& - =h9Y9 @ $@O e` rU+66 %  7 6S wm w   l      4 f   x    ]  '  ; ]\ m{ m     *+ *L k    \ \" k C k b    "   " $%@ `d0$%UE'xdE'''''D(m())* *+7+F+c,~, 0,.,=.u/*7u/[)0})011224C4k55667!7G7k78d X 8 8+8S:9y:9q9P q9: #h 3 (B:g0;0;H?   @  H?'^?GR^?tk?k????,?V?~???@,@T@z @+@+@?@?@;K@WK@TI ) p h d ` P H @# 80 X6TIYIzIJJJJ K(K?WTK \(b $o(|WUYUYZd Zd>qdiqdd!#$&()+2345671828F"KO(pRP [oy#)/5;AG8MXSY_ekqw+}=Nbw*@V %]+o17=CpIO@U[Tahgtms8yp6&(P,-./0) >Mcmy 1   " / 9 @C R a h v      @7      ! !'! #S!3!8!C!RK!@ Q!X!^!` p!p!Y!J!!0S!]!l!!!` "p i" %","@"#$Y"_"0%u"P'F"'F"'"(")l""""# #.#/1#00?#2P#Y#2s#z#4#5-#####7# 7l#7! $$$!$85$8ZN$@91a$9pv$:@$$0;$$$$P?$`? $p?%?%?:%?V%?u%@ % @ %0@%@@ %P@ %%%%&&& &`I4&I(B&JR&Ka&j&q&{&&&&&W&`Y &&&`d&d '.annobin_lsapilib.c.annobin_lsapilib.c_end.annobin_lsapilib.c.hot.annobin_lsapilib.c_end.hot.annobin_lsapilib.c.unlikely.annobin_lsapilib.c_end.unlikely.annobin_lsapilib.c.startup.annobin_lsapilib.c_end.startup.annobin_lsapilib.c.exit.annobin_lsapilib.c_end.exit.annobin_lsapi_sigpipe.start.annobin_lsapi_sigpipe.endlsapi_sigpipe.annobin_lsapi_siguser1.start.annobin_lsapi_siguser1.endlsapi_siguser1g_running.annobin_compareValueLocation.start.annobin_compareValueLocation.end.annobin_EnvForeach.start.annobin_EnvForeach.endEnvForeach.annobin_lsapi_cleanup.start.annobin_lsapi_cleanup.endlsapi_cleanups_stop.annobin_set_skip_write.start.annobin_set_skip_write.ends_skip_write.annobin_lsapi_MD5Transform.start.annobin_lsapi_MD5Transform.endlsapi_MD5Transform.annobin_lsapi_signal.start.annobin_lsapi_signal.endlsapi_signal.annobin_find_child_status.start.annobin_find_child_status.endfind_child_statusg_prefork_server.annobin_allocateRespHeaderBuf.start.annobin_allocateRespHeaderBuf.endallocateRespHeaderBuf.annobin_lsapi_set_nblock.start.annobin_lsapi_set_nblock.endlsapi_set_nblock.annobin_lsapi_accept.start.annobin_lsapi_accept.endlsapi_accept.annobin_parseEnv.start.annobin_parseEnv.endparseEnv.annobin_lsapi_init_children_status.start.annobin_lsapi_init_children_status.endlsapi_init_children_statuss_busy_workerss_accepting_workerss_avail_pagess_global_counter.annobin_readBodyToReqBuf.part.2.start.annobin_readBodyToReqBuf.part.2.endreadBodyToReqBuf.part.2.annobin_lsapi_close_connection.isra.4.start.annobin_lsapi_close_connection.isra.4.endlsapi_close_connection.isra.4s_worker_status.annobin_lsapi_writev.part.6.start.annobin_lsapi_writev.part.6.endlsapi_writev.part.6.annobin_lsapi_parent_dead.start.annobin_lsapi_parent_dead.endlsapi_parent_deads_ppids_restored_ppid.annobin_LSAPI_ParseSockAddr.part.13.start.annobin_LSAPI_ParseSockAddr.part.13.endLSAPI_ParseSockAddr.part.13.annobin_LSAPI_Log.start.annobin_LSAPI_Log.ends_stderr_is_pipes_log_level_namess_pid.annobin_lsapi_sigchild.start.annobin_lsapi_sigchild.endlsapi_sigchilds_pid_dump_debug_infos_ignore_pid.annobin_dump_debug_info.start.annobin_dump_debug_info.end.annobin_lsapi_check_child_status.start.annobin_lsapi_check_child_status.endlsapi_check_child_statuss_max_idle_secss_dump_debug_info.annobin_lsapi_perror.start.annobin_lsapi_perror.end.annobin_LSAPI_is_suEXEC_Daemon.start.annobin_LSAPI_is_suEXEC_Daemon.ends_uids_secret.annobin_LSAPI_Stop.start.annobin_LSAPI_Stop.end.annobin_LSAPI_IsRunning.start.annobin_LSAPI_IsRunning.end.annobin_LSAPI_Register_Pgrp_Timer_Callback.start.annobin_LSAPI_Register_Pgrp_Timer_Callback.ends_proc_group_timer_cb.annobin_LSAPI_InitRequest.start.annobin_LSAPI_InitRequest.end.annobin_LSAPI_Init.start.annobin_LSAPI_Init.endg_initedpthread_atfork_func.annobin_LSAPI_Is_Listen_r.start.annobin_LSAPI_Is_Listen_r.end.annobin_LSAPI_Is_Listen.start.annobin_LSAPI_Is_Listen.end.annobin_LSAPI_Reset_r.start.annobin_LSAPI_Reset_r.end.annobin_LSAPI_Release_r.start.annobin_LSAPI_Release_r.end.annobin_LSAPI_GetHeader_r.start.annobin_LSAPI_GetHeader_r.end.annobin_LSAPI_ReqBodyGetChar_r.start.annobin_LSAPI_ReqBodyGetChar_r.end.annobin_LSAPI_ReqBodyGetLine_r.start.annobin_LSAPI_ReqBodyGetLine_r.end.annobin_LSAPI_ReadReqBody_r.start.annobin_LSAPI_ReadReqBody_r.end.annobin_Flush_RespBuf_r.start.annobin_Flush_RespBuf_r.end.annobin_LSAPI_GetEnv_r.start.annobin_LSAPI_GetEnv_r.endCGI_HEADERS.annobin_LSAPI_ForeachOrgHeader_r.start.annobin_LSAPI_ForeachOrgHeader_r.endHTTP_HEADERSHTTP_HEADER_LEN.annobin_LSAPI_ForeachHeader_r.start.annobin_LSAPI_ForeachHeader_r.endCGI_HEADER_LEN.annobin_LSAPI_ForeachEnv_r.start.annobin_LSAPI_ForeachEnv_r.end.annobin_LSAPI_ForeachSpecialEnv_r.start.annobin_LSAPI_ForeachSpecialEnv_r.end.annobin_LSAPI_FinalizeRespHeaders_r.start.annobin_LSAPI_FinalizeRespHeaders_r.end.annobin_LSAPI_Flush_r.start.annobin_LSAPI_Flush_r.end.annobin_LSAPI_Write_Stderr_r.start.annobin_LSAPI_Write_Stderr_r.ends_stderr_log_path.annobin_LSAPI_perror_r.start.annobin_LSAPI_perror_r.endLSAPI_perror_r.annobin_lsapi_jailLVE.start.annobin_lsapi_jailLVE.endlsapi_jailLVEfp_lve_jail.annobin_lsapi_reopen_stderr.start.annobin_lsapi_reopen_stderr.endlsapi_reopen_stderr.annobin_LSAPI_Finish_r.start.annobin_LSAPI_Finish_r.endfinish_close.annobin_LSAPI_End_Response_r.start.annobin_LSAPI_End_Response_r.end.annobin_LSAPI_Write_r.start.annobin_LSAPI_Write_r.end.annobin_LSAPI_sendfile_r.start.annobin_LSAPI_sendfile_r.end.annobin_LSAPI_AppendRespHeader2_r.start.annobin_LSAPI_AppendRespHeader2_r.end.annobin_LSAPI_AppendRespHeader_r.start.annobin_LSAPI_AppendRespHeader_r.end.annobin_LSAPI_CreateListenSock2.start.annobin_LSAPI_CreateListenSock2.end.annobin_LSAPI_ParseSockAddr.start.annobin_LSAPI_ParseSockAddr.end.annobin_LSAPI_CreateListenSock.start.annobin_LSAPI_CreateListenSock.end.annobin_LSAPI_Init_Prefork_Server.start.annobin_LSAPI_Init_Prefork_Server.ends_max_busy_workersg_fnSelects_total_pages.annobin_LSAPI_Set_Server_fd.start.annobin_LSAPI_Set_Server_fd.end.annobin_LSAPI_reset_server_state.start.annobin_LSAPI_reset_server_state.end.annobin_is_enough_free_mem.start.annobin_is_enough_free_mem.ends_min_avail_pages.annobin_LSAPI_Postfork_Child.start.annobin_LSAPI_Postfork_Child.ends_req_processeds_keep_listeners_notified_pid.annobin_LSAPI_Postfork_Parent.start.annobin_LSAPI_Postfork_Parent.end.annobin_LSAPI_Accept_Before_Fork.start.annobin_LSAPI_Accept_Before_Fork.endold_childold_termold_intold_usr1old_quit.annobin_LSAPI_Set_Max_Reqs.start.annobin_LSAPI_Set_Max_Reqs.ends_max_reqs.annobin_LSAPI_Set_Max_Idle.start.annobin_LSAPI_Set_Max_Idle.end.annobin_LSAPI_Set_Max_Children.start.annobin_LSAPI_Set_Max_Children.end.annobin_LSAPI_Set_Extra_Children.start.annobin_LSAPI_Set_Extra_Children.end.annobin_LSAPI_Set_Max_Process_Time.start.annobin_LSAPI_Set_Max_Process_Time.end.annobin_LSAPI_Set_Max_Idle_Children.start.annobin_LSAPI_Set_Max_Idle_Children.end.annobin_LSAPI_Set_Server_Max_Idle_Secs.start.annobin_LSAPI_Set_Server_Max_Idle_Secs.end.annobin_LSAPI_Set_Slow_Req_Msecs.start.annobin_LSAPI_Set_Slow_Req_Msecs.ends_slow_req_msecs.annobin_LSAPI_Get_Slow_Req_Msecs.start.annobin_LSAPI_Get_Slow_Req_Msecs.end.annobin_LSAPI_No_Check_ppid.start.annobin_LSAPI_No_Check_ppid.end.annobin_LSAPI_Get_ppid.start.annobin_LSAPI_Get_ppid.end.annobin_LSAPI_Init_Env_Parameters.start.annobin_LSAPI_Init_Env_Parameters.ends_accept_notifys_enable_core_dumps_defaultUids_defaultGids_enable_lves_liblvefp_lve_is_availablefp_lve_instance_initfp_lve_enters_lve.annobin_LSAPI_ErrResponse_r.start.annobin_LSAPI_ErrResponse_r.end.annobin_lsapi_MD5Init.start.annobin_lsapi_MD5Init.end.annobin_lsapi_MD5Update.start.annobin_lsapi_MD5Update.end.annobin_lsapi_MD5Final.start.annobin_lsapi_MD5Final.end.annobin_readReq.start.annobin_readReq.endreadReqs_ackachBody.7025headers.7024.annobin_LSAPI_Accept_r.start.annobin_LSAPI_Accept_r.end.annobin_LSAPI_Prefork_Accept_r.start.annobin_LSAPI_Prefork_Accept_r.ends_conn_close_pkt.annobin_LSAPI_Set_Restored_Parent_Pid.start.annobin_LSAPI_Set_Restored_Parent_Pid.end.annobin_LSAPI_Inc_Req_Processed.start.annobin_LSAPI_Inc_Req_Processed.end.LC0.LC1.LC4.LC5.LC6.LC3.LC2.LC7.LC8.LC9.LC10.LC11.LC12.LC13.LC14.LC15.LC16.LC17.LC18.LC19.LC20.LC21.LC22.LC23.LC24.LC25.LC26.LC27.LC31.LC32.LC30.LC29.LC33.LC34.LC36.LC37.LC38.LC39.LC40.LC41.LC42.LC44.LC45.LC46.LC47.LC48.LC49.LC50.LC51.LC59.LC69.LC70.LC71.LC43.LC35.LC61.LC62.LC63.LC64.LC65.LC66.LC67.LC68.LC52.LC53.LC54.LC60.LC58.LC57.LC55.LC56.LC87.LC76.LC77.LC78.LC72.LC79.LC80.LC86.LC74.LC84.LC83.LC73.LC75.LC82.LC81.LC85.LC92.LC91.LC88.LC90.LC89.text.group.text.hot.group.text.unlikely.group.text.startup.group.text.exit.groupcompareValueLocationset_skip_write_GLOBAL_OFFSET_TABLE_sigactionsigemptyset__stack_chk_failreallocfcntlsetsockoptmmapmemsetsetsidread__errno_locationwritevkillgetppid__ctype_b_locstrncpystrchrstrcasecmpstrtolgetaddrinfomemcpyfreeaddrinfoinet_addrLSAPI_Log__vfprintf_chk__snprintf_chkgetuid__fprintf_chkgettimeofdaylocaltime_rwaitpidforksystemlsapi_perrorstrerrorLSAPI_is_suEXEC_DaemonLSAPI_StopLSAPI_IsRunningLSAPI_Register_Pgrp_Timer_CallbackLSAPI_InitRequestmallocgetpeernamedup2LSAPI_Initgeteuidg_reqdlopendlsymLSAPI_Is_Listen_rLSAPI_Is_ListenLSAPI_Reset_rLSAPI_Release_rfreeLSAPI_GetHeader_rLSAPI_ReqBodyGetChar_rLSAPI_ReqBodyGetLine_rmemchrmemmoveLSAPI_ReadReqBody_rFlush_RespBuf_rLSAPI_GetEnv_rstrcmp__ctype_toupper_locLSAPI_ForeachOrgHeader_rqsortLSAPI_ForeachHeader_rLSAPI_ForeachEnv_rLSAPI_ForeachSpecialEnv_rLSAPI_FinalizeRespHeaders_rLSAPI_Flush_rLSAPI_Write_Stderr_rgetpidgetcwdmemccpy__realpath_chkstrdupLSAPI_Finish_rLSAPI_End_Response_rLSAPI_Write_rLSAPI_sendfile_rsendfileLSAPI_AppendRespHeader2_rstrlenLSAPI_AppendRespHeader_rLSAPI_CreateListenSock2socketbindlistenunlinkLSAPI_ParseSockAddrLSAPI_CreateListenSockLSAPI_Init_Prefork_ServercallocsetpgidsysconfLSAPI_Set_Server_fdLSAPI_reset_server_stateis_enough_free_memLSAPI_Postfork_ChildLSAPI_Postfork_ParenttimeLSAPI_Accept_Before_Fork__fdelt_chkusleepsched_yieldLSAPI_Set_Max_ReqsLSAPI_Set_Max_IdleLSAPI_Set_Max_ChildrenLSAPI_Set_Extra_ChildrenLSAPI_Set_Max_Process_TimeLSAPI_Set_Max_Idle_ChildrenLSAPI_Set_Server_Max_Idle_SecsLSAPI_Set_Slow_Req_MsecsLSAPI_Get_Slow_Req_MsecsLSAPI_No_Check_ppidLSAPI_Get_ppidLSAPI_Init_Env_Parametersgetenvgetpwnamenvirondlerrorsetrlimit__fxstatsetreuidLSAPI_ErrResponse_rlsapi_MD5Initlsapi_MD5Updatelsapi_MD5FinalgetpwuidsetgidsetgroupssetuidstrtollprctlinitgroupsLSAPI_Accept_rLSAPI_Prefork_Accept_rsigaddsetsigprocmaskLSAPI_Set_Restored_Parent_PidLSAPI_Inc_Req_Processedselectd \D   h o    2 9 H $O ,T g -o    h C M X h c z  h  h h a 8g.J5*T/0 *1%>Kw235R4Y5`6v\  "X 3/8M7`io89p3:?K_;<Rf=h{d h t8~KW>`i{h*$?*/?@GNw*"  ( h !A`!!!a"j#<q#\p$*}$$*$ %%%&A'((Y)))b***7+A+N+BW+_+}+C++++D,,{,D,,E,,h -n---F----.8.?.N.Y.~.G...H./*/ L/T/i/// /0_1111Q2v22/33-4O4|5N6h66666666I7W7777` 7` 77888#8-828<8G8T {8889'9G9$Q9L f9T 99999999999p:*:#:<:d G:Z:` d:h::::#:::: ;!;H;;;;;;|;;<<<<,<9<V<x<t<\ <<<$< :=S=e=o=}=|====<====>/>I6>@> F>w> > >>J>?K ??L#?D?Y?f?w?????@&@6@F@_@M@@@N@@@O@@@d @P@A'AQ,A@AFA%MARRAfAmAtASyAAhATAAAAAUAAAVA BBBW B4B;BBBXGB[BbBiBYnBBBBZBBB[BBB` B\BBBBhC` C\C]#C2Cd?CdEC`TC^YCqCwC\ChC*ChC_C`CazD` DDL D DbDDcE%E`1ENEUE*\EpEduEELEeEEDEE\EfEEgE<EEhEEiF4 FFjF%F,,FTGFkLFSFTXF_FPFFFFFlFFFdGm GG(G`/Gn4GQGmGG|GGGGdG`HoHH\"Hd,H`6H`DH\ZHXyHLHpHHHH<HTHHhHHDHXIh IIq+Ir7IAIKIsIIIIJJzK9LDLOLh JMUMdMh M4NOtOPuP*P.RhDR%JR$]R#}RRdR`RvSwmS|S!S"S"S# T$TT/T4GT+uT%T&T'TlThTTMTUU|*U$1UGUxSUeU}U(UyUUzUUdU`U$UTU)V{V V|,V=V%eV%V}V*V~V[VdV`V$VWW+W9WPWYWyWWW WWXh BXUXhXX$XXh XY$ YGYQYxYYYYYYYYh #Zh 3Z?ZeZ ZZZp[[[[[\C\\\t\\ \\\$] ^]u]]]]^^4^d B^$X^$]^s^^^^^_d __c +_D_c__ _ _ __I__ ` `%`\`k`-|`.```.``` a,aJ5abaqa` aa` aaaaaaabbh 3bK8bGbXb.gbpbvb{bbbbbbpb*bbbd bc` ch$cCcTcecvcccccc#ccLccd dd9dKdVdfdldd, s|2J +$,PX---D-Lpx 08)dl)))+ $,+ P+ Xw + w w  w   s D Ls ps x s   x  x 0x 8* dx l* *  *   $ ,PX99 9 D 9L p x       0 8 6d l 6 6 w 6 w w $ w, P X         D L p x     ]  ]0 ]8 md ]l m m  m   $,PX****DLpx\\\k \ k 0k 8 dk l  " ""$%$",$%P$%XE'$%E'E''E''''D'L'p'x('(()( )0)8*d)l**+*++,$+,,P,X.,..u/.u/u/)0Du/L)0p)0x1)01121 20284d2l4454556$5,6P6X767777778D7L8p8x8888:98 :90:98q9d:9lq9q9:q9::0;$:,0;P0;XH?0;H?H?^?H?^?^?k?D^?Lk?pk?x?k????? ?0?8?d?l??????@$?,@P@X@@@@+@@+@+@?@D+@L?@p?@xK@?@K@K@TIK@ TI0TI8IdTIlIIJIJJJ$ J, JP JX K J K K W K W!W!UYD!WL!UYp!UYx!Zd!UY!Zd!Zd!qd"Zd "qd0"qd8"dd"qdl"d % & ' (]CC C(X 01CC3C9C> CE(CJ0CP8CU@C[HCbPCqXC`ChCpCxCCCCCCCCCCCC+C4CHCSCYCiCm C(C0C8C@CHCPCXC`ChCpC!xC+C7CDCTCgC~CCCCCCCC  $ $f $O+) #0 $< $C $ 7J $$Q $ V $d $7n $ z $<+ $ $! $& $ $e- $@4 $ $ $q $!  $# $ " $;. $: $ M $PY $ce $Jq $ $% $ $z $h, $ $4 $S $ $ $( $ $; $ $  $  $O, $y9 $o.F $3T $U8a $*n ${ $|  $ $+ $I $( $* $ $  $/ $  $j7  $  $&5 $A $rM $/b $ $%  $ $!0 $ $k  $ $ $ $s5 $.1 $7( $5 $B $7Y $f $s $;% $f. $  $ $ $y $Q% $ $ $ $)( $/? $ L $ Y $Qp $ | $  $ $9 $2. $M $= $f( $y) $ $( $', $18 $^ $.j $! $ $]# $ $ $  $7, $p8 $2 $.. $*: $^F $Z"S $o.` $.n $Y $" $$ $y  $ $  $ $ $ $< $M'( $5 $E0B $&O $E\ $ i $v $$  $g& $I $( $(0 $! $) $  $ $'3 $1 $. $7 $o, $9 $F $/*S $f` $0m $%.z $) $Z $ $ $ $! $# $l' $ $&& $2 $> $4Z $_ f $6x $&~ $* $ $ $g5 $ $ $c% $N( $t $Q $ $ $z( $|7 $8 $ $+ $U $0 $y $ $^  $F, $49 $g$G $aS $0e $hk $Aq $ w $ } $# $ $! $+ $ $ $ $ $V $1 $a8 $ ( $ -5 $B $O $\ $%i $Q v $ $5 $ $. $' $( $! $" $ $j $ $0 $= $d I $+U $/a $'m $ y $1 $C $44 $ $6 $l $* $t $ $ $) $ $7 $ $ $~# $ 2 $  $/ $  $S4 $ $R3 $$ $t4* $0 $&6 $~ < $B $1H $-N $v.T $Z $/` $ f $l $1r $Xx $~ $) $# $ $V6 $* $2 $E  $e1 $ $  $  $  $W/ $ $ $/ $/ $, $V- $ $(4 $ $d $+ $ $t1 $  $-& $, $"(2 $8 $n> $5D $\J $#P $$V $\ $b $S$h $(n $t $z $1 $ $5 $|* $ $ $5 $  $3 $ ! $ $# $6 $0' $  $& $& $.& $$ $z $B $Q $` $R0  $L, $4 $) $I1" $f( $%. $34 $` : $r@ $ F $7 L $FR $,!X $O^ $d $&j $p $Y5v $ | $X( $h $6 $$ $! $S $ % $% $H5 $) $r" $ $7 $0 $ $. $ $ $S. $ $ $  $1 $9!  $  $8  $3 $$ $k6* $0 $6 $=< $B $"H $8N $k3T $Z $` $%f $#l $r $x $~ $' $& $j! $ $% $% $ $:" $  $  $\ $  $ $A8 $U ${- $6 $2 $- $ $]* $/ $A  $L& $ $) $B#  $'& $, $'2 $8 $5> $2D $&/J $ P $o$V $7\ $]b $F2h $4n $t $z $O  $ $ $ $ $  $ $( $  $2 $  $  $:# $^ $ $V' $# $ 9 $f/? $7E $K $ Q $06W $] $0c $i $3o $u ${ $ $+ $<5 $=* $' $ $&: $/; $z3; $Y,?;@@R; $q Z;0@m; $(8y; @; $,;@; $; $";?; $; $B;? < $U< $5!<?8< $H< $P<?g< $w< $3<p?< $(%< $6<`?< $< $ <P?< $= \ = X = $ ,=`Y-= $D19=  ==  M= !!Q= !b= !f= !k= $E7w= ="{= /"= $= $t*= "= $ = $3=aZ= "= "=iZ >(_ > $,> #0> #:>@[D> "U> ($Y> $b> ($f> $o> $s> $x> "> %> %> 0&> &> 5'> +'> '> '> (> '> I)> /))? "A?]Z? W*^? S*c?]u?`_? *? *?_?_?_?c? "? +? +? "@c@ " @ +$@ +-@ +1@ +:@  ,>@ ,H@cR@co@ 1,s@ /,|@ W,@ U,@ },@ {,@c@c@E[@t[@[ A[#A[HA[mA"\AG\A\A` A\A\A\B\&Bb]LBy]YB]}B_B]B_B@`BS`B``Bo`C`EC`RC`_C`C`C]CaC9aCCCaC](CaCaD]D$J>2Ju;?J;WJ;wJJ;J;JJ<J@J!< KK=<7KAK<RK` \K<sK<K<K<K>=KW=Ks=K L=$L3L=ML\L=vL@L=LL:>L]LD>L>L> M> MC*M??MCIM'?^M]hM5?MH?M $CM:M $D1M 2M  2M ;M $-M a2M _2M;N%;N $ N95N $D1AN 2EN 2JN $-"VN 3ZN 3cN:mN " ~N *3N (3N " N:N " N O3N M3N u3N s3N 3N 3N:N "P N 3N 3O 3O 3O 4O 4O:'O:HO9UO9bO9oO:OO::O:O:O:O $%O $O $D1 P $VP $&&P $ 3P $L@P $LMP $UZP $E7P $P $-P $P $t*P $P $b"P $ P $3Q $~Q $Q@91Q $q9QLQ $TQkQ $l"wQ G4{Q 94Q $Q 4Q 4Q $z5Q o5Q c5Q $[Q 6Q 5Q $Q 6Q 6Q $Q ^7Q X7Q $YQ 7Q 7QCR]P&RO=R[R]eR|RR R]RR $RR $R 8R 7S $l"S 8S 8S $L,S6SSS 8WS 8`S  9dS  9mS 69qS 29vSS]S S3S<SdS]pTm&T>TUTjTCRtTT $T T $T y9T o9T ${T 9T 9T $-"T :T :T U U ;$U ;-U B;1U @;:U j;>U f;CU dU UX Us UCU $7U $U $HU $1V $5V $UV $ ,V $!;V $CV8ZV $fV ;jV ;oV $Y{V ;V ;V $$VV $V ;V ;V $YV *<V $<V V W u< W s<W <W <"W <&W <-W $5WLW $\W $ hW W $5W <W <W .=W "=W $.W $1W Xl 0Xs NX $VX8|X $#X $-"X $X $X 7X $)X =X =X $. X =X =Y $U Y X>#Y T>5YM7TY[7rY7Y $Y $)Y $"Y $(Y $YY $#Y $ Y $3Z $#"Z59Z $EZ >IZ >NZ $. ZZ J?^Z :?oZ @sZ ?Z P@Z J@Z $gZ $6Z @Z @ZR6Zl6Z6[6@[6^[6k[6x[6[6[ $z[ $D1[ $[ $4%[ $<6 \2"\ $D1.\ @2\ @7\ $C\ /AG\ 'AL\ $gX\ A\\ Aa\ $ m\ Aq\ Av\ $ \ LB\ FB\ B\ B\ "P \ B\ B\ " \ (C\ $C\3\ $4%\ dC] ^C]4]4)] " :] C>] CG] CK] CT] +DX] )D]]14}]I4] " ] TD] PD] D] D] D] D]S4]33]3^ $)^'&^ $D19^_(C^ "P^ DT^ D]^ )Ea^ 'Ej^ QEn^ MEu^ $6^'^ $D1^ E^ E^ E^ E^ KF^ CF^'^ $!^P'_ $D1"_ F&_ F6_ G:_ FK_ kGO_ cGT_'q_ $ }_0_ $*_ G_ G_ 6H_ .H_ H_ H_ 5I_ )I_ $Y_ I_ I` J ` J`{ ` $,`0%C` $D1O` JS` Jc` Kg` Kx` L|` L` lL` hL` L` L` $` L` L` 9M` 5M` $` }M` oM` "@` $ a &Na Na $ !a N%a N*a $%6a N:a N?a $Ka 4OOa &OTa $b`a Oda Oia $Yua Pya P~ax&a cPa aPa&a $v a Pa Pa&ac&a "pb Pb Pb Qb P(b /Q,b -Q2b&[b%bE'b $b#b $D1b ^Qb RQb Qb Qb Rb }Rc JSc >Sc Sc S!c $-c NT1c BTBc TFc TKc $Wc 5U[c #U`c $#rc#c $ c Uc Uc $c cVc [Vc $bc Vc Vc $Yc Vc Vc$cd$4d>d$Rd$%qd $x}d d $}d d $D1d EWd 3Wd $d  Xd  Xd $/7 e 4Xe 0Xe $Y$e "`;e "`De rXHe lXQe XUe X^e "ke Xoe Xxe RY|e JYe Ye Ye Ye Ye *Ze &Ze dZe `Ze "e Ze Ze "e Ze Zee"e!fd!(f $:f $D1Gf $_f $xf $ f $%f $f $bf $Yf $v f $f $D1g $ g $1-g $YEg $%Rg $yg $Y g $g(g $D1g e[g Y[g [g [g o\g g\g(h "h \h \(h ],h ]5h h]9h f]>h "Lh ]Ph ]Zh)qh(h!)h])h $'hp h $D1h $3h ]h ]h $0 i T^ i R^i i " *i y^.i w^7i ^;i ^Di ^Hi ^Oi $_[i2ri $D1~i ^i ^i $i _i _i y`i i`i ${i 7ai 'ai $3i ai aiU2i " i bi bj b j bj bj bjU26jz2Sj2zj2j $,j $D1j $j $3j $Yj $0 j $.k $%k $Y2!k $-k`Dk $D1Pk cTk  cYk $ek cik cnk $0 zk c~k ck ddk Xdk $/k  ek ekk "k nek jek ek ekl l "l e!l e*l f.l f7l Af;l =f@l "Il {fMl wfVl `l }l fl fl fl fl fl fl l! l $'ll $D1m *gm  g m $m gm gm $0 *m h.m h3m $?m thCm jhTm hXm h]m $,im (imm  irm ${~m im im $fm im im $bm jm jm jm jmm " m km km Tkm Pkm kn kn$nCn(Mn(jn knn ksn(n ln kn4nn $ nn $D1n Tln Hloo+o l/o l4oNo mRo mWono $/o $D1o $o $o0o $D1o $+o ;mo 7mo zmo tmp $6p(p $D14p m8p m=pJpWpdp&rp $zpp $D1p #np npp "p qnp onp np np $# p/q $D1 q nq nq/.q/Fq/fq!0{q $e4q.q $D1q Doq 8oq#/qP/qX/qm/ r $67rW,r $D18r os(QsWisXsFXsXsXsXsXtXtKY9tUYGt $ St`jt $D1zt $tpttt $)tt $D1t Eqt ;qt qu qu $ u Mru Kru(u "9u rr=u prFu rJu rYu3cu "@tu rxu ru ru ru "@u  su  su<uuu Esu Csu v0vCv]Mv "^v jsbv hskv sov stvdvCovvv=vOwmw&w $_0.wTw $`wsw ${ww $<ww "w $w sw swwwwx x~ vB~ vK~ vO~ vY~+~C~;+~E+~[+~c+~+~+~+ $ $ $Q 6 $+\ ${ $. $  $D1 $ $b $Y $ $D14 $bA $YP $s^ $D1w $ $( $>$ ̀ $0؀ w܀ w $ jw fw $/7 $Y w w $q,& x*  x/ $; Sx? GxD $ P xT xZ $(x $1 $j $0 $ $́ $ $x $3 $^ $&0 = $D1I yM yR ${^ Fzb @zq zu zzH $D3 $D1ł $ׂ $D1 ${ $ $= $ * $7 $Q $,p $1 $ $##ă $D1҃ $Z $2  , z0 z5 $$A {E {V &|Z  |_  $6 $3 $2 ҄ $ ܄ $q#0 $) w| o| $D, | |5`Xp $(Ѕ $m-؅ $P $3@, $8 E}< =}A $M }Q }VVnwC[ $!+@ $gʆ ~Ά  ~ކ ~ ~ \ H $ 6 0.0eo "P     ܀ ڀ̇]ۇcc   / - W U$NC"YBvOS " ~ z ˆ ˈ ψ ԈX # , G0 E9 n= lBjC2~ "    ĉ ȉ ͉C8 " "#  , P0 N5)KCF\iw $R $D1 $Q $- $/ $tˊ $>܊ $+ $/ $0 $+ $! $T* $07 $H $!T $Ta $r $!~ $f3 $0 $. $! $T $0͋ $ ދ $! $T $0 $ $ $, $0? $5P $\ $j $ $ $a $5 $.֌ $ $5 $m  $5 $A-( $+5 $r7I $=Z $f $&&t $91 $- $/ $- ύ Ӎ t܍   H B "    ' @+ <0 "09 |= vF P m Džq Ņz ~     Ŏ0 @ @  6 4!G 9Q Lw Vw v c Y ߆ Ն [ Q ه ͇ŏ mɏ aҏ ֏  e+5 "`BPgy [ S   & Đ Ȑ    X R''$ ( 1 ʋ5 ȋ> B G<lv " , * S Q z vϑFّ "  Nx "1 ٌ5 ׌> B K (O $Yc "Pt ex a   ͍ ˍ "˒ ϒ ؒ ܒ  k (C2P{9ؓ Cܓ ? " "$ ( |1 V5 J> B ؏K vO pX "e i r v {z”ؔ)      ?# 1T)^){  ޒ 5 1 q m)  ɕ ԓ͕ ̓֕ <ڕ 4   Ô {* " * . 7 ";  D HH FQ nU lZ " h l u Εy ̕~*D* "p Ö ̖ 0Ж .ٖ Vݖ T)**8*J,e i y|, "  y     "̗ MЗ Gٗ ݗ - "@ ԙ ҙ   -7{-A{-^ #b k ^o \t{-  -r-Ҙ].ߘ..- "p  # "p, 0 9-C-` d m q v---<.ۙC.R..%]X;x.Ex.b ٛf ӛkx..]8.00ך 1ۚ % ɜ   "0, "= 0A (J N W [ ` "i Bm 6v ɟz ş    {   J D0ƛ "ܛ    11 " + / 8 /< -A1dc1|114 `Ü R̜  М ٜ ݜ  " / # 5# ' 1>5J FN @Sg5lq5v "P      ޥ5ǝ7   ] W7=7X \ e i r v 7 " ? 5   3 -7֞8'868@88(KC G |P <T :b,Ll "} c _   ת Ӫ "   0L0Lݟ I G n l  =L!HL4L> " O S X " a e n 2r *{LL    LѠ ۬ՠ ٬8M8M   % #! J% H*@M? qC mL@MV@Ms w  έ ̭  NMYMʡMԡ "     "    ^ T'M1MN ϯR ͯ[ _ h l qMMM D B i gȢ ̢ ѢM  MNN< ް@ ܰI M V +Z )_Ny!N!N S Q x v  !Nԣ ȱأ Ʊݣ8NyO " " ' "0 4 = A JO_ @c >l ep c|OPOP  OP Ť ΤOPؤ "0 Գ ҳ "0   "  kP! "p2 G6 E; "pD nH lQ U `yPj "{   "  ߴ  P "ĥ Cȥ Aͥ "֥ jڥ h  P "`   "` ޵# ܵ, 0 ;PE "V +Z )_ "h Rl Pu {y wP "   " ۶ ٶ ¦ ͦPצ "` ( & "` O M v tP "- 1 6 "? ÷C L P ]Q{Q ' #"Q a _ç ǧ Ч3Qڧ3Q  3Q ݸ ۸ " .bQC +G %P xT v]Qg "x |  " ۹ ׹  Q "0¨ "0Ш :Ԩ 8ߨQ "p "p _ ]Q" "0 "> B P\UZ\Uw { \U κ ̺iUUթpNN P)C30VQC6[/Wu]vRvR   ê ȪvRݪ = ;R R "' j+ `0 "9 = ٻF J ~S W ` (d m q z  ~  E ?_S "p    ɫ ߾ͫ ۾֫ ګ  C = "S " " & / 3 < @ FS^SSSǬTѬ "`       6 ( "  ( *, 5U? "U Y b "t xx rhWhW  hW­W 3T&hW=]RU\UuVV] TϮ\TyTTT6UNAV[iVhVCVVCɯVJWC W"C3T@T[CeUrU]8U]pİUΰU     6 4U ". d2 b;UE " R V _UiU  UU   ñ ȱ5Uٱ(P CTWU2C< WVC&m Pw P * ( T P P ò Ȳ.P߲TW $ $ $. $g $' $' $7 $7 $%$ $%$( $=, $4 $b8 $bA $>E $EM $&!Q $&!Z $0^ $0g $k*k $k*s $w $ $L $L $' $' $ $ $* $* $q $q $ ³ $ ˳ $3)ϳ $3)س $ ܳ $ $% $% $ $ $R $R $ $  $ $ $/" $/+ $"/ $"8 $E%< $E%D $H $P $G!T $G!\ $,` $,i $)m $)u $y,y $y, $8* $8* $' $' $ $ $, $, $G- $ $ô $̴ $д $ٴ $7ݴ $7 $ $ $H4 $H4 $, $, $ $ $ $! $)% $)- $^21 $^2: $:> $:F $+J $+S $c7W $c7_ $2c $2k $Z8o $Z8w $}&{ $}& $ $ $ $ $ $ $ $ $ $ĵ $ȵ $е $/Ե $/ܵ $ $ $ $ $2 $2 $+ $" $  $* $&" $&* $. $6 $: $B ${ F ${ O $eS $e\ $` $h $l $t $-x $ $4 $4 $'* $'* $) $) $J $} $ $ $5 $5ȶ $d̶ $dԶ $,ض $, $  $  $ $ $3 $3 $ $T+'-(- 38]QCp(sCovC]C",C2C85CF ʿI(   4H \00L`0     \ 0  $L@ X0@Xl`p,@\0p` p 4 #0%8P'L'`'t()+P , , . / 00\ 2 2 4X 5 7  7 7$ 88 8L @9` 9 : 0; P? `?( p?< ?P ?d ?x ? @  @ 0@ @@ P@`I\IpJKK4W|`Y`dd.symtab.strtab.shstrtab.rela.text.data.bss.rela.gnu.build.attributes.text.hot.rela.gnu.build.attributes.hot.text.unlikely.rela.gnu.build.attributes.unlikely.text.startup.rela.gnu.build.attributes.startup.text.exit.rela.gnu.build.attributes.exit.rodata.str1.1.rodata.str1.8.rodata.rela.data.rel.local.rela.data.rel.rela.data.rel.ro.local.rela.debug_info.debug_abbrev.rela.debug_loc.rela.debug_aranges.debug_ranges.rela.debug_line.debug_str.comment.text.hot.zzz.text.unlikely.zzz.text.startup.zzz.text.exit.zzz.note.GNU-stack.note.gnu.property.rela.eh_frame.groupP@:PT:Pl:P:P: d@@A@G:&`ep ,n 6nt"1@ : LT[TV@P0: u((@0:@0:ЖЖ@0:22/"D /`8 *@:D?@:S N@p:kf@(\:!wa-i@ :$/0@0:& 0`lJR@H:)0}807.eeueLe eeeeee.h FA@((:8x4; ('PWPK!3share/gems/gems/ruby-lsapi-5.7/rails/dispatch.lsapinuȯ#!/usr/local/bin/ruby if GC.respond_to?(:copy_on_write_friendly=) GC.copy_on_write_friendly = true end require File.dirname(__FILE__) + "/../config/environment" unless defined?(RAILS_ROOT) # If you're using RubyGems and mod_ruby, this require should be changed to an absolute path one, like: # "/usr/local/lib/ruby/gems/1.8/gems/rails-0.8.0/lib/dispatcher" -- otherwise performance is severely impaired require "dispatcher" require "lsapi" while LSAPI.accept != nil Dispatcher.dispatch end PK!G9share/gems/gems/ruby-lsapi-5.7/examples/lsapi_with_cgi.rbnuȯ#!/usr/local/bin/ruby require 'lsapi' require 'cgi' while LSAPI.accept != nil cgi = CGI.new name = cgi['name'] puts cgi.header puts "Hello #{name}!
" if name puts "You are from #{cgi.remote_addr}
" end PK!M4share/gems/gems/ruby-lsapi-5.7/examples/testlsapi.rbnuȯ#!/usr/local/bin/ruby require 'lsapi' $count = 0; while LSAPI.accept != nil print "HTTP/1.0 200 OK\r\nContent-type: text/html\r\n\r\nHello World! \##{$count}
\r\n" ENV.each_pair {|key, value| print "#{key} is #{value}
\r\n" } $count = $count + 1 end PK!{8,share/gems/gems/ruby-lsapi-5.7/lsapi.gemspecnu[Gem::Specification.new do |s| s.name = %q{ruby-lsapi} s.version = "5.7" s.date = %q{2024-03-13} s.description = "This is a ruby extension for fast communication with LiteSpeed Web Server." s.summary = %q{A ruby extension for fast communication with LiteSpeed Web Server.} s.has_rdoc = false s.authors = ["LiteSpeed Technologies Inc."] s.email = "info@litespeedtech.com" s.homepage = "http://www.litespeedtech.com/" s.rubyforge_project = "ruby-lsapi" s.files = ["lsapi.gemspec", "README", "examples", "examples/testlsapi.rb", "examples/lsapi_with_cgi.rb", "ext", "ext/lsapi", "ext/lsapi/extconf.rb", "ext/lsapi/lsapidef.h", "ext/lsapi/lsapilib.c", "ext/lsapi/lsapilib.h", "ext/lsapi/lsruby.c", "rails", "rails/dispatch.lsapi", "scripts", "scripts/lsruby_runner.rb", "setup.rb"] s.extra_rdoc_files = ["README"] s.extensions << "ext/lsapi/extconf.rb" s.require_paths << "lib" end PK!^wͱ%share/gems/gems/ruby-lsapi-5.7/READMEnu[ lsapi - LSAPI extension for Ruby ================================ INSTALL ------- $ ruby setup.rb config $ ruby setup.rb setup # ruby setup.rb install USAGE ----- General CGI scripts ^^^^^^^^^^^^^^^^^^^ The most efficient way to use LSAPI interface is to modify your CGI scripts. You need to add the following code to your CGI scripts: require 'lsapi' while LSAPI.accept != nil ... end There is no need to change the way that how CGI environment variables are being accessed in your scripts. You can find some examples under examples/ folder. Ruby Script Runner ^^^^^^^^^^^^^^^^^^ If you don't want to change your existing Ruby CGI code, you can use our Ruby script runner under scripts/ folder. You need to configure lsruby_runner.rb as a LSAPI application, then add a script handler for "rb" suffix. Rails dispatcher ^^^^^^^^^^^^^^^^ With Ruby LSAPI, we proudly provide a optimum platform for Rails application deployment. Ruby LSAPI has the following advantages over other solutions. * Easy configuration, deploy a Rails application only take a few clicks with our Rails easy configuration * Fast startup, the expensive Rails framework initialization only takes place once when multiple processes need to be started * Resource efficience, ruby processes can be started on demand, idle process will be stop. To use LSAPI with Ruby on Rails, please check out our toturial http://www.litespeedtech.com/support/wiki/doku.php There are a few environment variables that can be tweaked to tune ruby LSAPI process. * LSAPI_CHILDREN (default: 0) LSAPI_CHILDREN controls the maximum number of children processes can be started by the first ruby process started by web server. When set to <=1, the first ruby process will handle request by itself, without starting any child process. When LSAPI_CHILDREN is >1, the LSAPI application is stared in "Self Managed Mode", which will start children processes based on demand. With Rails easy configuration, LSAPI_CHILDREN is set to the value of "Max Connections" by web server, no need to set it explicitly. Usually, there is no need to set value of LSAPI_CHILDREN over 100 in most server environment. * LSAPI_AVOID_FORK (default: 0) LSAPI_AVOID_FORK specifies the policy of the internal process manager in "Self Managed Mode". When set to 0, the internal process manager will stop and start children process on demand to save system resource. This is preferred in a shared hosting environment. When set to 1, the internal process manager will try to avoid freqently stopping and starting children process. This might be preferred in a dedicate hosting environment. * LSAPI_EXTRA_CHILDREN (default: 1/3 of LSAPI_CHILDREN or 0) LSAPI_EXTRA_CHILDREN controls the maximum number of extra children processes can be started when some or all existing children processes are in malfunctioning state. Total number of children processes will be reduced to LSAPI_CHILDREN level as soon as service is back to normal. When LSAPI_AVOID_FORK is set to 0, the default value is 1/3 of LSAPI_CHIDLREN, When LSAPI_AVOID_FORK is set to 1, the default value is 0. * LSAPI_MAX_REQS (default value: 10000) LSAPI_MAX_REQS specifies the maximum number of requests each child process will handle before it exits automatically. This parameter can help reducing memory usage when there are memory leaks in the application. * LSAPI_MAX_IDLE (default value: 300 seconds) In Self Managed Mode, LSAPI_MAX_IDLE controls how long a idle child process will wait for a new request before exit. This option help releasing system resources taken by idle processes. * LSAPI_MAX_IDLE_CHILDREN (default value: 1/3 of LSAPI_CHILDREN or LSAPI_CHILDREN) In Self Managed Mode, LSAI_MAX_IDLE_CHILDREN controls how many idle children processes are allowed. Excessive idle children processes will be killed by the parent process. When LSAPI_AVOID_FORK is set to 0, the default value is 1/3 of LSAPI_CHIDLREN, When LSAPI_AVOID_FORK is set to 1, the default value is LSAPI_CHILDREN. * LSAPI_MAX_PROCESS_TIME (default value: 300 seconds) In Self Managed Mode, LSAPI_MAX_PROCESS_TIME controls the maximum processing time allowed when processing a request. If a child process can not finish processing of a request in the given time period, it will be killed by the parent process. This option can help getting rid of dead or runaway child process. * LSAPI_PGRP_MAX_IDLE (default value: FOREVER ) In Self Managed Mode, LSAPI_PGRP_MAX_IDLE controls how long the parent process will wait before exiting when there is no child process. This option help releasing system resources taken by an idle parent process. * LSAPI_PPID_NO_CHECK By default a LSAPI application check the existence of its parent process and exits automatically if the parent process died. This is to reduce orphan process when web server is restarted. However, it is desireable to disable this feature, such as when a LSAPI process was started manually from command line. LSAPI_PPID_NO_CHECK should be set when you want to disable the checking of existence of parent process. License ------- LSAPI library code is under BSD license LSAPI ruby extension code is under Ruby license * (()) (Japanese) * (()) (English) Copyright --------- Copyright (C) 2006 Lite Speed Technologies Inc. PK!9ʹPPshare/gems/cache/rack-2.2.4.gemnu[metadata.gz0000444000000000000000000000250614257420603013444 0ustar00wheelwheel00000000000000!bX[o6~ׯ %/m``4hif{0x,q&E8}$dg.}i$9ѓɄ}eCL~lReɽ4MpM3fyH:f#{~Zni*j_fɄ!^ i˚2~⼤v7)_~M8OMLt:~jԔ6J`Z6ғ lL _ޱ!#"eG>-_{,>ٯZX5tMʴZKq֜+Gw^wLf'\O:)ew_|}'-ȕV#K"l%Xw:bڈe z^(b-d$967MMK*o[uƥŊ--XcwBN%BԚU`KbqN#&= )7 Tu[Nޟw& (qd㵏:y4vu/a%Qþ5+EBQ&^50uiBK5cwu UB7T_ݰ>zjb$\7x<”\n$/N^=K#'޼{j.._xu~Qnw= 7aoϯ&oO.> D5EM-H!=aiEGH[Gr}RLethNK@y:Sj="#IrܸWmMd,C+#1;Y1%nc[,u-+XͪReKJ.vuh$T5z"Y X}!w.!sEM=Q,Kl+hL<hIbl+y.0t1V/6QjVVrgΝUnka Z9(x? O_uyIH>u RHuP^n>zVQC#J*zHB4A@ZTje8;h(>Vۉ9 /΋c'MB~uW#[u-#QI=gfPR\}'B~xc1ҼepF_VH;<hjyW{ߺYUסHQ7(Q=NPYGW*.^̓5e9d YTȤol*Pٙ汸uq"ڌs\6s{J^&ؒz؆#W&F;%(2XwXiQR(l"6>NE}L>yNw a"zl`&NV l\uo{ I| oPlvsmց&s1ΉO66 119 }>;-{womݪv@? WV.,OW^X\YZpya_^\]-\"Oh*g ۽^oioGJNNj̯uΏS/^/_ wGk~7ᅑ| ;Aջ'{q3tЌy>l~x~fa~xI ރ|8β^6?Boy^ _.T窥`T]yUBTnY$^$N|FO I}~u跎nht3?E>^x-M+"6^әwseG62/h~hu̸A;Ŗ^$Id._}w<4cMnru1z? K[`yaqiw3|퀎;H~/Z^[w K ͒ VijI|Dޝ;[etԙqTY\<Džū{Qg@Xq|ީNK t5Q=N 5"niv,^[|V Ga;K7 [t*Wl*Wy*US?JǶs6>a+t^mDA |AWдySS? yjiA/D^?j&c Ԑ?fu?" '?Sm Ʈ: rU6Api2P^?] T>VNaw;t]i{_?]U6?ݾ}xxB'DdFC!OЭ$[BBfq%9k!+w?i1g>V aTghQ~g1S~ҎZJIO:XzcGn[im^c`mU: !sxafa}&Xسt@/e}zgNkalOٶg{ 63aq&e;eG٠T-dphN&@qʿ;T|b|Lf;^ `c{!x/l.ֵPLpt#l?[Ӡ~Rx+LA*!Taiٰr61<9G6GGñ{ kǍcL'`O 3TZcq' H[akaP6C1h= Ƃ6+i]ˈ 0݀e0!bSd:tHӮ /N3KRg82Wa=4> ! ":b^ 7Zf+" R &4;8bpmR = 7Cg,-/9 pD-!8 *w$B0hTB|kVZOͰXDhQq+~$cvFyHGcGWʀHҮ,1n_T|e9{h9/"d/ icp)Yw8޳<+3BA-% ҹgSnGvn>éAgiMqOmZ'{-SRB (jRe:P}=t軧/|y*TQ loNBա*Jy`xc0],}4~&d ꢕ'T<=OTYd{Ec;S&13ѳ(<vAn?LDCIR?ݫsx}:ת6;~omm{ ֭헶2mr$9yb}!;y%ZY=b$4 0zێYǂ N#/\]Q&Һ?VI9I(@ xkA'yJ^A ]S:m#|РYC/EOZK/ST>퐘y54>t+@egn*,?fWtpG8Q&viu$o?a>hd&*BҲl?OCsB T!#p:A.80a=uqd ʥQBcYU\cT>7!= "twvP?I$ _%8%1bP($ Pq#d3N/? \ K\zwYi,ԡo`+;c %FYHL8(!mQꑤ'ϭKԬ"),~ |zl] B"J-A3^' lLLPI)5Ut¼"vbfa_$ ;M۝ tS{b@ףYS}A{Xndiz9و2n-jUT<^nT#@2`_E$Xhhi-B&qF{fZQSƺum]QΰSPݽCLӰ] h`GA{-y ٖV :TMƗ@GB=aÚ=h.+li;[͈:ew'mґ ?ZIĕj<%^3~XN؅"Xz6,A2o㯸rw# <zSؠȣMjny@=J|'^ŸC܀p#}&9 0I? 2B1 :<Kv4{L䕨qaZlo߸w{W]։'cWǢ#ȾaZHġ&jJ` B踲 }k]yjiʎO"tp*A~bQT:tI)SG1쪦zi07=aFeyQxw'JGx8(~£8PUO]`oYSEJ#v?: Hxj&q<4S#n+W>L= %<Nk" ۍi:Y? Y\39> z@:,Hc“~gŊ_ $`UPu8m?y8艚փU3 m }YhG;ܸdA}<_ێmŅ9v>O]l`2&0=rveiuBgogJ4n.ųAi1pmB}1;]}gCW!0) p^kqU)3~ϯѯY(4ø x :tǎ'dN\MrG^eUY2mO $7?D5wҜԋK"λO(=?8_$G4>-:aE+qWsL,)_6G;dXt~z$&uX!zfd8o-;-FS4 oL[ZaYm > iq'^E.+/1Ϗj ~4xVD8 !v?!:A VS''x,\NEARJYH+pm \FaOz[G1C?=NHʉhSƯž/dDjesK$NollnLؑ~tW;{軂d({7+WpKԸgoݙæI_$hO@߹M,ߔgc[F/ 3V!ai| ADCg*~YUݟyȏx!E#ǭb~rB8{[;`IR.,j~8$1ľ֫©Q$o޺utz}gg|vp\ r|Hw #Vpcұ:υ G}TW iRũ%@f<qOT(1ۛ68Ӓ,߫\t tb:afB . 6/,<?T7LwPΆuUz29o3z@=Jc`Q{&rPKR d$\BX]# 1 aP*ʢ}F?j#|RgtڨFtV|:D󍀘|C VZ|E&@qvɬg{ލwo&Y}qgYGnJ, 2~r{Z/;[yR +GF?ٕGBF㲸p qVr_;8/8|a\x6۾[/,4lIMd1mݜ˺9W+աͱF/\YxrXsn4rt7s Y܉[#</:CG4iDt<-LmzI̎nC,W<[|[&I "md:@k0ώ Έ8KCDF@:I'.ܬZKg ̝z3/,G?Ig Yr7İc)C3.d =5GnȨ ƃhϋ*l~)%.HQN'XaB,$-Ъg&o%eەqt^;a~_7S ,K PE[yL4J"0tslF9{ogsF(˯&aڜt\,}VuCՓ*|SjWqlm݄UUvP1¾,,{0h .93$.Y !3!bMb#Þamqd'c:. 50:׺t;~9k Q>GҲNU c4]9j%TCW? O`G:GCcYV2; ;I<5{ ݚՎ>=CJ~f"Wa}(t0gfPB ⶗^?mp12 ^\4qJ³$?,I#9OPKI_ـAOҷHx|aǏFTY08ґWFC/I *bLAB؝naBNE;ƌЅ0! ;gx"yDc GGZd+.j<}mnX?ڤW:& Z 2цh_Һ{ciC[/=^"6l'lbA|ġcPej:uG"ܭVwTS&XHt(ޝ; r#@Fz1'gdϭM0ƩDTGG BHd,C (Bzdz47b'1ȍWr$2|*eSl:.f|b}|M*j||v){g 0{u^Dd|-M,;UŠ3XpIث _, :q=̾2<֢^_]PRj 0Υ`gO`jQ\V&LJ< J4@4&[+yS]LMVxpc^Ԩ=}R@:J426q8 e8>L}QFcp3r!Aȇwx\ >Ld۪ߌ10KV'3$r^KO|Iy瞘vFS0 -xE-AJl@2C؄ ]ݗ&܉XI{ 'fюL0E~DHå%~[zz*<l '[yp}SFp. >Mz+uRgC_8H[4ֽE#/IO~ =mz^W$t3)#XүaLIF>$a2mib&l4,G&s AKN K"o 9-VoF$ 6D8"0~OrOȖ/ݹs}w}hggئE,fSߢ/VTc*,+AXI0HˠQ,4ı < \0Ԣ8h A,qf!j},n/1hbJ`#V ]B@NRAm:KeyU.m 0ZغKC->IԢ}NIDW7`c;8n \~wu|3?Vm5ԡU!./ʱsrjػ j"Zڎ\(p'#@JpRFєƏ*PTIXQV󖰞֚?wDe(^ւDRKRZ `5w3 W?AG,JyWn#<3q5J9`M8Sa- \d5(Ĕ)p&)9JO;i 9f1@P Qf[G6ܺ - tz#EJHGJ 8:+2mR*Y..|'iŢy -d%8R +Jq0%f DB+]EKD|0x?DE{1VuO؈1Ųь?nP& Xtv49 %A+p5qc]CNwDs-RfFj.y5ov\f?}4T&0LЭKKjxqh$Ufv[f `v:57S68\!!2,wwɴ"!I7nWOUh[[iL/X{F$'enq/hqݍ! I|׏P{HRЖF>΢Z1wZ&5&|]RqQ%µinKt_ZԖZXZJDdI]$.m/cb "P+g1$,6P:avo&i$fhHZQg$8YՐ%~CccCnˈtsFg=p4z#fa.o5]%* 0.F~i-*5[9ZSH)F3s'ꁙSV3?3{%M3I9_Il#g5R>fWNנ0IIhm8JpPE2i",sNuM g\B )e_ظI\]~&x>*ºI}nIq͸伵qg]SC)3E 3BSo*Woa pmik2Wv^u\YX'b+, 4Mָ" {Þ]c-Y#A3֟y@g8h3ѰW sOb\'V֌ cZIC9νFoʠ%İG^ʹPHي;PX tREwV'rQ?ygA=β:YTyN1Vc3YDy hQjlWSnDáyAǜ\yC_]Y}YbuȒ,UAߠz\u2*[lIa.t SsճUqJB6q Pկ8hxS_=PINJ?:ubչq: #,\\:Jh_-7YyEhqUN!e; $TfF;jPd#ΔPf3BOj 3diX!p :{ X(4IN!-d4o) G΅;Et=,s2"^`&|4~VNt EYm ЪQsqٸsM&a}bXH#RZ6UeR"=RKx NJnM|!tW#\aWxS5Qӻz 3W9'x\sXSTbct:FOI)6zT9idwXT7s}l_DPU\bąAWT a :'vG!pFy*gVk??M2vœap9`ycSك &=-qlͽ6p},1 K(gB>/\nA7UFԵj\'ɉi,6+r~v$v^JUɀ{Cť+X\Y,Be170gDm20=+y+y EY\['uk9.d;N0v|93%ܮeRx Ʃɣ Ua%/ Sc1#tO2/Gt} &N|.v\0mcMŜcՆ:3urhu(m #x2ͤ =݇"qLL:⑌]Z2t%U FIR.(<^^mEGyS:K}ōͭdoHٺyMu[O}{2!A1 s{ؼJW/VTN&wK ǣ(+3b2/sEw4eTqށwS0 \58jxNjS( r')EUˎ0ұ zA3Y. }Lz1JS5X+Z@P+TY7gso$ trT3에(w+\m<4 _ź:$Bn-:a/GJLhC Ĭm Qvq~r;{DHN]oWQ:"-jcbpǼsvzدwÓNaym;3O,Qr/ 92~x2{!Q-G|r ]<;Q¤6ٛBDIF8lv Pm+~"I3(bl#6'b +h~Ah2$piJx3vT[ 3&%bY&HPYhlq˓N]Z@-~)'rlZ}[DX_<66#`nX;VR晨G7h0Rvp"0` 1zF= S瞛 &գ7JqvO2.Kн J0ԇ)Cl;;z;P쩊p  pu) u˪zsv|X^xXmE\-4QV L=J45!@.AeK('BiR0_3K9?lcNhPIYqF-_6rY-ce8tpVf{ ({r:<$:[2j(jM5lC^h:z iY $LIyj/N=4 E)߻'sz'=?bݴ0>Wu ?"KFW6| ԏ#YzqqV(ieOy X4keE-sDe]6TYİCA/H|IH9Z"^ίInq= e)-WQbJ s.v赵2q{V ۍ,1Zςϛ='eN\C j膙:.,W4%SZ}Trsg]$˽f\A᪣5O#s=BdžTF6KY]*X +x6>Ex RSZ YN^YiЁھݩESк]pa/啕 3+W.,,^YYZL/^Y-\"AS!(۽^o ѬM"<kRpY$59n:'d맶H|inrG Pלi(j=l|krQ|?;Ɵ$fl>j81x]r0O lhR >$G6?JJuqK@h#̠wl +܀qP  iJg!J*Y\adgܸƍJ+9m)]1!Ö]~\yAE;Ȁjna[|xCO3qd| W!TrOч Z*ÃԤ{u*ǹ7ko|N$k3~ČPST3-L}8/Hnh4ȑdzPU5E:VE4dwIOBjrȀrM8;QØ3+Jqe> k%"f/\Hី1l]ÛYh%ťERz:֙yz@W垌Dӧxjiwf@8LlBHOͽph2,4bB[U@ҾlhX!,zQӢ:r nOM^yaq]3x$ ShpbT$;G,T`~t;(>%7@#`BeC6#hUu1W?qK@YժN8(n?mB7iEӼ$4[\ Hzlt *T#nwd՚@ &/U\W4$1RT38#1u45y}cO 0,7/9Nf+CmJs z鼷& 0f.mo+=6S<%#@7@L93IX ~fc-aV\3Jc7:׍*< t=zQ`~A%صF|xYηTjXF * ZF_M`Ab@z5!pRÛ0?=a4-{\8" [!i/L$Ζ{,J%K=jLM8t ̙vr`BXxO]YWKsg{mť!;L;)s ws2BFo'n? :DT+ڎc@8Jcqts0 խ̅XF:ID Njl>˰%6|v}; 5u-0H Ye g^YX+ *7\19p׬hAˤ-{/monmzSTٻ}x{ޡG_w_^,{[up헶ޢgۻ;6Q=#G2QpÀ:~p]yso[d#޸ݽw`ߤnwwo([wv4*=^?;;{4MbΖJY߾S6D=jϟDD]o_f ]L ?MolunnI/U wesk}:܏!~i_xyyXb\^Zl*?Z,iuN$g\%%_2QBly$gF־>0S,D3[1>N hێ9=m7|.4F f0fG1n]%ḃn~/Bn&U'Q ut5=1]I,uHiХ':<2_/nЄ 3LNt;uDbI3Ph 9sHW!撵0񡛣-:$_y=EBsabyPB% 4wɰmuynx#Nd"7A+6Qnh&5 wŦǞ~ g/ }ðLO͛u'wu[\/ԆM|3TtpVl܋O_$۬Îs)KSWZ _'9r`Չ Zr[xNfU]w f*$@P5ENC0*VN)sgPa2 Kb4~RIyy%}T-W._Ȼޗ2kWXD@=7T֣ed#f\)LhMṶo̯8=H9ÕrdȶG;?›]Xsw?*4&OpLl3FAG 7͍~W5gsvd4ɈDV9<:lL`w`\OZbLh{6/.ͦ.y0HMKCWZ'!BT&oW:0֝H`+x[\J\3.EB\ƐtΜ E/{ȎQh0T{$7`Kt8u0ɵ4$le .<7wX8'nHn'JF)4D˘T8&-Wrݩ!{CB4QAF"S]\6I5@Č3~g}RzltRZKxssr݊~T2)0!ڠ.W ,v̓|sf٭٢>K.fNŚzqKs%%ˆ%]=KKr-=-RgJj SSH / $Ӝ*S_QG>X*mIZ ]vPtnxp6ҕڟ6bjOF07Œ zcHZv;S*<cUb*][$TkˠApS{0 Xe٩]( YR[}R.PŸ FV$WĨ6eRʊ3 ~f`a_$.FPVd7%ơeǠ/D)QfԟƘW6O 7WI`q!Ca qA5< G0\ ?^b>׽WWD 4ϋw sF>r˅>(B.Ҧ&sh6)#_43qk5i.h$e)h1e5ĕ:EAh6DWW/Ҷ$BK $mwLLKזnEi~sgP-O̴ 1h_z/j^oJ5Ʒ5R ˫3[ clECDDa;+‚n޸{JՒRXyc| |[M5DRNPfZ-7 ]C8,Vj87Vt# f@vAlz @-fqŗ VD u74FՈEQ6t^|-!|.y[HgaNŸlDhdz|P6qh~ i^8Ml1MAAÍ2y{m$Vμߝ^<ϱ.每HmMͤ}i({իަl=5nJShG+og1(|6HP`VZ\Nx#&r-͔v< r*O,?O:ՐEYT= h|skoǛ ;sĵ= :XѼdmGA3'*Q#BL=ոJ1H~–K(~H"E͆k}b7kkqK7m7똺ƍ yG'$}y?:p^swhm6(¼ٮּ~ӧL{ ݄o?/暑1X F!kpk&Q ^(k ;ñ:ym]g79r>#IڎV+BĤq2Y{|^ M/QX>&^"'?`~ oV [>JI%U-w֝C&'cIGqctwMQvG@E2&KB2.IԅniovLet6P:^!׽A%6sMdcOMɡhi5Z24O~WϦqnBZc?}L+ Lo7Z>8u"St ڼudI:ޤ}~_o!~dmB5D-r6Q+&<6q(^w#uxo);$&?INB? 7+2Jģׁh+2#Mtۃ~M?tGuIȞ5W8Q~?f7'D}kG@(gGcA %V[إ64 ز(Nw7lШVme^1ek2Rl^LDdݏ1m'!M֫Šk%X0s$3mv.e ? "T3$59lxäSr]åb2&_K_dAq~ZW9HRă@z#l [4Pqké26|Dn͘.9؆sػt]<"aMA jasng~\aRJ\jIxǮ;H}uFy0phb-Z@l,g* BJ*$m|5BP`Xˏ +r?r9!wK62aU?z|JEϗrV?97$cuĎrY$d|C-M<}?4rtyyy$ʕw??н>#??9;kDGt&}Jab8$! zq)]A >N=.*檏,BȘ3i䬮5PzRC,^a+vA\>(noT1S,u$Lws*!UqKnhu`ЫҽS5Aݍy={(CR'О*v? ]~]ɛgI=SaUW|URofkלf8y1~u'3T\0sJӫ\G;j8sS7kNY^@L`jU3U/jS6JJ%mHQ-~Qo|ɑ90wOZG"Vuxf`:p@N]ot8vfc=NjUK\gg-W㇪Imfwwi+S<rJ᥹WÑ3`38lɃ)/N=4Cf.\Y]-k9MӒ뭐QSvLHacZ'ko7+Z`<{dT[i6;_ ̗VX^qgfT6*buM"ˢߜI;LwTddG?1Upu'HxBZjA.[%g#P7З@ hvj3¦}%8=0VvC0 *Ug.Tl >Ȫ4{9?GH,y;2?\8a e>^]td<|kUQw{fQC9 dc\ GpJNek3{/mښyH,ݠ&f]yX ddH 6}qEB2ܣ%-n'HrmlZ>ͣB,BNsCI"<^͸^T 7be,ug3RwgkNR b6zŋgUrϫp-7KCQwVmcF;̟Vq_E汋O=VnWi _MG|JAD>ƪ4X6'Roo, $ kmYљ>xiLS}Q?{啥+w/N'D.Yn 鿭q=T=NߝYv`'9)נN@3Ezk&g})1oJ=α {#g+5=nlԚci{p 팽Rr T&)s$*sue7El8Bڣ BՊا$ϿXfMNED]/BmIfdJ !'{rܦ4صĸM6nmW\j9Hdx8M|9zqM&׃8u*-6`]B\7TZqJ}uwyyyqD6o0>uJ 4J5j,{~cDl|n:\ L?%Q:Dܟ[[SB)#&8պOdݪ}&796r%?wYd2~EIߙIUSMqsBPYމѓ4tCpIAk(ĶpP <)ޘDZW(Ig58PT}apƝN6RS63D4Ύco%stW^"^MQ9rn$[m~}fjP-;w֎sGɢ-9:kkS@vm#Wy1sftJH 8Vs{}+flR].^, & |ҬʹHÑ*ؼijG6T-T9 Fkqw۩=5v`KG9'J>špʕI ~jywV:xhIΑ\3øKe6+BN1fyt})~*\&bFGppԓ3 =JUQtGAO;2IɈvF#eQ܇ .aZx8jjdM0vo{y%$3BczG\5xP5W9;t/uY8ټ]+_'wA3H!KoK`R9A0Ɵ|_68 &onF vd9v*9ENies)i= IO`GyкLE[ d {m] ~D6kۤ(@CD3Df)eEk\hvPvhSWaL V S&LqZGsmɹ;{p lA3=4S 8"Ӿ~w]h 'b NC1m{OT:I{N&4QiIâj*]-]gF|ڰՏ9C܃Ff L6# {Φ `KJy%) p:5DD1Z8_%[7tSCB$= `˳nh O!(1g7mRtpSLZCD~v)6*3]{@|wU!Cy{mdRq-W7s4o,I7dLV$XH%qbSNۧYWDAmQs4QzcIyj.LD)$9_ή7f2@"4Ix$#Ɣҋ!4+h#:UW׺i8Ȝ2qhX_˪OΙGV>Cca|\8F؂a oZXq@,wu.AHiJ%o8W'} q=\]kk`8n,ir01DH\ՄkJQ*;j|2>͋[kh*Sd%O 5cKbW P] etZt]ÿ`.ȗ,UrCz3P1 Coe RvxOqԙ\=I'|t4>ӛ^C ЗK ŕ[jœIKzI:w+BlC [NCO2d-fUmiv4Sאnt,xȑ2y(, R jG΢&Cdm.[j/8ǬTwͮ/ ֙65p}Lpoq)@NN.4k`TQC>N,yJF9˓9$Qupw%qI9kč=1Bx*4Ʌ 5yVYos};u s*83(E -y%Н/?QuA[LQ)G\XQӶ 5~=EGeK$S kcI{I=8?['r)p1Dx_b9n~Q͏ͿmTK뺩ͪO\Sevތմ0 un sZSJk\ KsQ *#",So>[.?G^~^K* v!}\87uHO {4 e;rAvdHDJWu FW"؄]Nh%i5 p+}7J@ P bi6 * @omWIxfHU}ɝ  z{omft<'4QNB G$p4zId éݚ\}؉S\YTEAUGMVtXCd\mC4:ӷ KsI'htKCN)x+~H9qG0ܐLm(($kǝ)P-vyz ^iɜۉC dbvý@fv&AVb%· AUFh D S'n4V^ x[1a~KGdU~ cݓ@)KnzP@ q]bBKuQ]Mt_9\1V|#rwIf;m^bۿqeiyAC =j @U`^R+{wŪٹڇ yߜ͆&bTH17˸ז] $Λd%wYD&`5OJAF0ˇ|%.AѠ[-TUj-AfGʥl(RmǑdզ֎W7 %˄R:[s`FaT;~b*B* cf:./]23p nJv^\eGb'Bnw)Y7~ !@RᬎW6 ySWʄFxFSv5`emC)Sٞwkkz~9Ըk-#If=cEy ďR[i1'u9hCg\0P,̘,Ck;:ilXUtX5|o%,wPֶm+E.VY\do#8,Ps{3C:K0$sjF!NO^ {euuRť;__<|?Ty' *t,fIwox/j}W//_++ /'߇+;oo_>}ѓOe]~_? _qzSjs߻nGw/??vwa{s+?1foKӿ[ηzϾ?ww_x͇S_O~Ox/___c?9տ/;La{ȿtox/c[lp|7Ͽ{czjj/|o]O7N{w}5OVI޻w_~}歟={. o׿~ox?־7~w}_??0O.y__/Cy{?Ww}6NިOs^!oכǷ˗?Mk1?M>r ~Ÿ?syhwc>o䍯_Z>ʧSo\?>47|w}KeW}+^WNoT/_&xS}g_ؽUʅYfӯo}_N0K{yү}}?W?4ɗֵh 7_¯O}o?cП/{7|wS?Oo?}WO;/?o|>]?wǪ[?*7y}{'wS𛎿v;~ڍї7W־_̯~O|7fh{)2iFwHt C:;F4*tH>{gy}@mgI ٜӗa*Z2z;#$|P9ss#C=.q>zͷx F@'N虇 NOjVfLt3/SNn}8+c45rxCk-a8L_O:9Լ\ MT,^y=˱ek|:Wӂ(tɹb FSAp)lfBocςL#"ewKƺ(u|Pp|N_E}ic(4b`}cadj1%d^2=wt%jE_21?w{t߱u&7`Y-=To5/tS.SoRQlB]x:x8n.ƍ<0_@} isr ZeXD\04LkDD#\d&}/zqMvۄG8{،D"3 `B|Z22,c;;o_2Guم;^ϕxf=9[?=*W }ݏ29윹<:jl|L<6:} _RyvMqs'd1V%.,O!*IWh}-\CC.IB{Q%,|峞LZjٽ1e :wAoBxNKRI޴1Qlu })pzvZ:((*i=pJ'O+8C=+\!vY@|N^9g;5~NvsOG :4Ǫ_]V9 'c^9(wp9F =.7鼭D>JKbfI2BKғLUjm/kvoyCvFsХdSܓt ˹?RB6b fl{ǜde]d0)M>fC$_ sFR[ur&?Պب,{ Cg5nθtNںFnhy_ OPURRA2*}&?X ֧iUEFّK^d*9+1@Χ2Gj}20D FpZp|+RgOS- _(5'6pcѯR5Qjx!2:pu=r%D"%!6tʿ%1XW0,ijh=fV-$e";KvpS4`CF ,?뵫"֥?HNHdDQfX{N<?;dR!8]3lۥHD !Df)jdxF Io¾keRR+Ιd| |ŰA-2s:LEB.ݲWેQ,tu¬PdO9AyN* Ilq'z%$eɗxgzc3iE$Wݣ&mJ`E}(ѓ PMS 7KZmb*õ!ZtECCd!G^Gv+FZY s;z WFEs'61d } :zjQ]=pXCeM)YLYsv7܋h[D(#p? X{bE]DP@yv`u2ֲ6ZVhbk A~2wn{mI / %&lhF=\e,.{4y);ؾ}[y. a}L`a$oKŅHP pxu+,(JmЌR^ܰwjQd^}y>MEEq#`3I>/BUVcQ9dw $י<&.fZ٪j񼿏}JޗZᗕS OR>SUdZ.]r*̫?{  h3YN٩]eaq +K)MVm5 ^ Ƃzşf{ŦX+ibuɊid;')]+S7N $WmVl%!L:Mc#MS,W1s {׸-.7PchMPßt~Ed}Kjm+(p0xO2J8z"8AB5"l@$vsPq|U v>]uۧ{+LB zI7ߟsNܝ&,yU^0 xïgD kvEc倔-j_' k6;bam^Y+8824G a>f_DCӍ5NpNgcE-xyg3)‡\㣘ҹO/QɱlOBY D_RBIKnLfd,HYm;F'N$T>"nʕ)gy_"ilo?=_,-x:8B}J' D.i6$1ʄNQ-p!X-bS\:_x9 h5{EXVgզ٫gS)MBDȱ4XOmc7ɟ&̒ͅ J/LPrb7t~uR4_Yىas>MH;A glae{[>$}QipKd ^|J9\e0VoXhvm$@,S%O @Mim%^&f/-W8vRf@:Z秬ݹS+F(khZ)h!]=aq&Az=b̶ ~eeG.#kceMGHǍdw:!T$N+O 3 ,x)p ހN[ہVɭdYLͲXtb]5 d qvSO!E ~.[%ZlXdMcv!rDAB.\v"5^g9.2 >.JjLXL&.^:NRdri[ZAXv.vec6|ajWCRhHyX};?aA#N3L3;VJWIƋjF#ʽSXKD.i͢.㯋c05v ";<\/z>fĢi" Q^~>H!DO[4=o̲S14@/~(*~ӬcA ˯Gah.,9rr|SFH]F+Cy-7Y2ɘr<_ZoR $j%I~(hIzp"h{NAoK7,_ SkP~ks} )!,hfxEϓhuV$2ջ |Qmyv5 &|r͞xÄւO.m:̱*7)s1Ix;H[j&[hewc! = 穕?!"*:gT .9^_rZ#$8nY&/ cKT+9 ݹ^7}|8^'w2 U;AθX^ .CY2|/'0] eU3by%+91TNyb m_9Ao@uX ח,.$/!*HlYKD"%\mNA ˘$%70+`ƢV×vb0[kb-/%&Qx$ڴBcv!PX@ T$q8+A/6<8/2d{Ӈ+&@Wڱa (+Ԁ:1w#0rf)}9đ<<NHm4$!* Е*[Ǚ#/@xᗹ&o0SN}!8yo ՐM;D_xc,Y. HW(ϋ9^1/AT@Ž /y;% ?LPOG-Z G_URdX DbxRPN 22LϧMdAQ|m:FiLD%xE'g:GaJ}#nl @,(V ˇmG`X" @>ǽ|~uǀƓsRYZZ-&ҧS t /#UegLґI'393Ն%Bp\,sӟ }?ux~:v]'({z:f̲#.ހmS?1^Z=n:Q5!Cg~ [f<3^ ː `8ʨqѺjmfEze=ka#yt#VzF:i)1,$a] '>>j~/#ك4#Laoβa\٭ϿZ$49۱2H#>k–t%e4瞧(Z6J=LvFI/ Ebߐ̺ƯIolW_}>4#t1sScA}釹n9.-"%JqNIe&Ez'_H .=~I[7$GM׏w76M8e9CCzGj ~D'"9j}5NVy6[@FC@ή]~Wߟ`Z1iőm;~~I&6.uS)]xWwćg\cl W?σmTwBÒdUS+4;Ot3\ ) y uL0ϸey=)vc0Z\ ]+eR4O̴Ն휀.U4~^Bݣkи)s"gvdԽQظgrtˑ\?!e*rc͑:7J^[ C=O̓jOv#e_hW(F8$YȩZw-<b9gixHH'Hqx |?3F9.Qz4E-x Č!zU֋Wk۞%+Ams+flg'>E8kBo^jfUCF̓ yBSқقzFY1ouwBL ^߼@-o|4}iU"N@,8K O)L(Wv<&˳ p60^>H`j22q:=1s@ZҶԤJϩg Cqe(C\a:HtiNH7@~4'Ƿ*ۓZ﵍o")b[TvXyVpSthGlZDԛ/+ sKxXl8=<{dT[foF,Ĥ( -h.ȿ8KCokyDS4 @`|Oa*J](oQz RQC{IY'jYh=;\'ws ۏ7Y~,!4P316<':aɟRdZ`ҮB o'aź:h!Ii%r,~F(#hhbc{2/g:`&\9zrz^F"wЍ} ]ze!74/3eFkuc2Y+ÐnmRfsG.,PѓL { 2Inf(j@%24?lS-m7JaK8RC.6;)Vġ yM*l}{uuU}@Bh2{g|}I*VT^5{iOU@;Qb씫!q 3gLJ9y %ފx/%MhԬ";?gn+b8 ';bWxvt_ѳa:.v t0jhn/Ssl|u8c2*J1s( }SJWnCIXD x9tfq}*q&e:~3;a3 rAߝls+?~'BE^Wj , $IUO hoz/% ݻ]8P_؉ң6MLnr~.mm<{q&UB3<ۯƷgr"C ɞJ.) Zdd(ZxVNKwwF3t+2-bJGN\R.ou:XuXðPaԛ~SÆ5:[ y?lxn_Sv+#oXL̂ýދσG uK@^.dt7I)"tv4O'JR8j~R06`S03) lt:XTa퉽Mm[t͘vY;54> PUjk{~d6tp<XV9[j*in>_^3w3L0gQ'wb_w5&طCJaomRn]ܙߪ E{Hr":Sʙ6n5]i10b% *4 rv/@{i)@:@Ab[?BUByNځ Mb~49OOT(NפfW7n^ p+g αN| cC2)ڤ"=OQ_Ą?_}[!p;s[mHpr%,h'0#?DRf“!&&ۛq %:}I)k pyw@F.($܎!^x-iŊ},8(`q^IP0s #*+mP\ OP7Py 5-I^Xs"cwQbН}Hԛ{H_{XBzGc-]A_wz穪!y9oRr&GK}Cc-q^v$Yg9 g>3 *e)dܞU`:ETѣ2.}GqxD  Xo=O~)r2qA=E2ϩzH> }@mS!JÔ8,T-(sќ?|olW0+e\CM.V]BtUnZ僈^y :w׽t28?&(F]JF`Kzyl9D D?(aӔTQC&/T 3OwP'DMBt*TE"E ݥa!REY {i(Ij}ǓQJ1]y%+'Bd{*r+)L *j=Yt#-EϘA~&/IJ." $Ry47M;[ln}3M]=PໜgNYf<.ڒ[ ]Y`l2qeHfsYVanJrMYQm|%I$D?'HTz86> ؈q ?_i"n,]T2ǜ#h&.ߛ">ed(Ճ%Ԥ*|n|uR6+CP%w%J+|eX&%j8_R7ߒm=gP5>sG N $=oRb ZXt/<Za_-3~7ibKݪ/!NdS>\kB$FKӍaf8 =xoſqL@T,{&4-9e&lp ,r2 V|kmGcZz`T:%4sOeVعl+~6+ݜ)7{wP+/'7&tC8%j& fP; &v6CyXUca{Z|—+ǙdB> uUP>&dgǔ lفF('=\J3`1ЊzT\!N B]$ 7%^䘘cWwl=%bxv4ˆ1nD{IB0]dDbǵ6zŜԃtN\1n wD,~Kҝ7y"fC4G7WvT2CcjO+P0#R*; VIEz;ɮh+EuYIF\ӹQ? ZE1`OQ/TAp:r 9彝$GNݽ_.9ޅn~ hDh(rnn葮gXl.ݺaE@{pd:$?"ye2Tr33ѭ$S>/De`dz@"&Mtn**;g.Ors] #BKѕu؞`O_b gc$=mvV#PdT9V9g>Pw(ZeV1q:v< jYO r|.ṗ^8*oԕڌ)F&D<&QM T43&9g%y~Ž;SJmdNC'Wb}nה'6Ku;k?ލ_j.{OC%bSJU鲶ySLpʠѹRL)qS,RMNtlǺ-8^nUri'W:Gm }˽o'U(ޅn seDZ0VExwoKEE`-Go y?'X7M׮IIh ~%zNf2%eID3A$_L6 $?G"j3dCoF8Ol F Y}RO=t0$je}W7K# I6"Fg +^I6 k>;L?Rȱ21dL"D)|Lͪl̛ TjO ,aɨ,q%xN/ɾי yR8Gkx,i`Xlnro(cv\g[N6ϼ/^`OH:nͤ(YjTҍ [D)tjM>UAnKhCL_̱|eKSy]y8sfOn;|CEz݌70YP҂ k_eE>j|QHrer6CeW5{] n1xӶ}j<&,gy*WJ@qwA>qSWK??0cgq>+d;cF8۝&FU@ G\KqyxEV}N&86C)p"5ss1z!Ar^]FC7pv8@<:$ti)eqɔzVoӡuag'O^} jZyE}(0-Dd̡a6&wK?㑭{OI^6.\'%PliR;H0=3Zl8V6L eP =E't h9cKdYDb?*y_HCzݕ]P9̯Zm]QBq$_Bo_c.ȒgRɲnQYT%تy誛a;f:֮e|guXؠ]&t3Jp$?dNj믤fu442̉$u[~eG_ahN9V)2Sm fRWH+6xuaW$W&Y|wiaJDx>?f_SvdN?4cՑ' /_YxxhA:qM-œW"ã8^(2?+ VmwFD%} trej\;^,-|MC58m`Rw_^tn]e MbӦ"/5K#ڑȈ/K㦼iLM=ˎa2towWPRŴD0=I7Q]h-@2wT/p,LzOyS=UK1CE qJmH5A 9$&l`Ed&wk&Yrjdǁ|APpсnHf oOHZP)>H'᪍r6!$buъWDXAjqG/^du3>ip{>{a~(erA;:k>Kڑ,ɘ1CGY}XNtԬK=,'eH|OƼ\QmGLEaP2wF(s@-ɔT'8rΡlPQ*=-0@fXoYb3}H+[iRx#˄RWɣ6$bJ2_!(3t\$ӷ񙾕a!$ !;w(ӊQ=^~ёkjCu)7rsϴS1VnT\2^|X#u}BհF„Gф@݈%p ҥkKStA@zB KANW_^<9|\z(q H7>b!c_I{4M)9|W+>uy:8T%dE S}wQ2ʋbG%?q>>]xP9R1Db?u㥷 AL&Ol/^/w˻?5RMȉEnrlcȒ}fX9=]K(z\3>嶬4ˋf_d#"AsETxS,yۻr%)N˸d?I }Xش#JN]|#:igR`=pE8lճV җ[haTFkZ;õ0/hT'yÓ؂f%&n@Jw;.iS/>fx x|pbݎ3GO2SEH$2JS=*MltR<Ƿj6FY{W(ut?t_x{T^$Ej^%,ĝtf#1+xMω0: 9H3kJ)2 smNG+eh:lW }pn= 2o}~7cǾpUmFѸ&%+*'듁4PYƎ@aLJa[WY+{Y|+A"p\p/a?鮪")h|;msV˹iv1bt%͋A)DȽ;XS%|ܵe7g]m2{WS\w8ȃP|vbж2;Gz< ǃ`񻀿%qmP Xܓ~--Weyz4wEm7=Sτ|L%,OO௓ 8U+V?$i'a=-̠?m>9 jlw0TeIʕVHOA#Tܧ$UC\i%*KYbsFs ^@ΰ |N; &a ZM|ޛ^u0Fߒ]F]_=ʺRTK=(/ݧk噤?6D4&܆T6RsrKBUݢW bL)<%S,}oh«xW plB+JGf\yq{3_a%(937{٪ ;o5*OdAl,cFcM w$W%F!++D]"&;g7:NFX=znByWTL9)Ɨmwô譣H8qf|>8ϛqS5Ö}g@)vI-[ϰddG;J6V ,Y_1<-Q;lH]8uҌOJdf$iVl1m#R!3}YZ3tǕ#/W2*9(\ڃ7XNun@{ۓ8Y4$o ZI2[Β)p7|؜T+Oz֨Qò[VrmMeaڒ#i4^9ao}̭054#g߭VU {٭S1@/x!I_$DiO4& /ɡʵf^1WWƾT&A@o3UCnN,ɞ &,C4±+(fx)##![%w,պt]y]i ic;DhJ8wCjNͧP J"gk:p+Vh7E>RXqzfu6pDhCVZ4>a ZRןoA?aߒ׆@l` 4 `6_+J m '+K%ueng#r~^FZpB}L;N#5e_EJV>z35V jx9zLd⧰U2jSmMaA:H_Q 9slV8ah9*GVqԬ ő܃ի 2;G20ńՠ L|,-of\٨p]a3%ʩ!X,sN$CLh eޜdRFI$XƐX],feW^Jz7~*8XPcsA<,VBY)_WS˚D+jZ/wr> jKR&rQ˴/ٴp`MXBbqɔ47ro&J$ EGJjT-"Cu҇T;+3E;6rR'2[zWTip8 :5R4GE`dM(X`dlF'§ay9,Hy* C_Y!HV32i=BC4FVXd:W^ܳф=V|e%nâIYg)WUP1(CprTt UpO6i L7t+G갃E6:k_u|B}7 !h$~$lI,bF!-%Ԛ`u{j,Ê׿n {&I{sSQQL;?2F6f32ω(hr$ +`x0BW;Ùiao>U{S!}3uT? Lɗ.Q=.TDr]zrH~ob9Z.CD/^Bg,u,)z˖h7S؞|dѻq7 gIvił*Qd:6Y33f&cLs`ؒ{ jQc~b_I+ö\x,,@QR51 7aDp܍Yݼ 1 ŕIFsBЏ5E_7-Aƿ]ʳ5ӯP}U',q'x@W%g1/Lc}`TU0 6Q1ɼB LJs̼$qJ E] 6(bW]]^"QlX{ߛp}kr~[lqx9Mqr%>Ǘ}grqgш7\3G /OG.:pB+zvG.m=_bGl]_ʒesw;4KzEmhPfx~?~=kU}wlum|xfU, gI*sݾZW?kY]C/.5j:c.9zݳ3sI[Μ34vwṃ^ӂ1_yۚ ʊ{ s8LU͵g^}57;g EJO9Od=[vm϶^ /ykѧ7jgoxc[W/u/pUq*^bk[ ~k=j'p{o>^pD֔]ףlF=۲ybޣ#8rK|7L:qЇW>y~j^xKn:WqSnYw^Pjn9rcՅwzsOl)9iso1%ݪ,aQ'=#'}*ݲn|µ|Tto}i;x V8j6릿}GKߪ9m}eh1ukybY>җ6|L[jZSU83'?.oToqUKOh|G.ᕯv,9q :-Ǟ݆++ozֽ/'vvT΃οGQ' ,t ג]͛U֎xKo طNw0r#zT۹V6^cSsuÎu[]/`¢.ý\kϯ4) =g͖󦔾K_5.Oq5zvcn-[ڻc޼1d9𷿗 8X]whނC}Պ GO]'{Ǒ8pSQկ/Yz7h 69 O}t|b#G;D~󑧌5%KzhuښVV|tuy~ z}=>}͠F8mgQW?3o}zࢂ#G?|'yCɫrJ[;IT~ÛW>i֨{#J;&:haw٭.zɋl3"ᝑw{ xj{UQA?:"g^{v<[Ӎ׼ԑKW޸m.ͯ ھr}{~c[O 6]*=bvvނo.MvM o.t7ec%,_^w.n ^:Ɖv7N? Mi9KQ;ρpy }yO?4x+{9n}augYƂ[.ә{}wSsQ۝3橩;6{MyX޿_U]_4oovG~ɽnSYlPmn1ǽً6^ƅM|$:cFYc@m#ջ=Xwzi3Ϟ93w9v|YSN;vIC=b+kySxepͮ/93t^[o\Iւ^Gˍ7_r?yfALo =e}iz'ݱas zVZ+52MǞ~٢ aZwĒǎ޹yvpO^>dmκwfoO6-:n/]pI|?wONyNk}wzxۼr]98kXr׾{EYc;w_}ްӾa_x։Ν_}WqgtK{o,xY۸mמ|=R7/XGmǶ<`,ΉspG]qWƻWZo:Cg^;#_e[֛Nx;&z0cYIý_<#$|#|yWϻwe=;27^)E_p~O|~fW9o褀c_yz_r_ޫWD3n\ߝt鏧7eO/zGwק_(@dvʭs_y w۟%<]bcOytѮ+78GVN9&W.5Y[*֕m.V-=tqm {qK<2_Uڷs/ޤ\v]^ua`x5|k&8( ȃU`{ϧި 3S>uÃ_:n֑'u{m*9 *̻?uC[Vy+\2g!ukn2<(X}~[AeUO]xw鷃e||p?ۺ~ē<꤫_pOp1};#6jCC̼A7qCorwv΍sѐsV|}[uhZ33~tcowWз/s'y˙ăޛo:~cvvnkN>Gn?;NeJl*kͅ :.qM%n];t Vq;+lx@竫:'l#ם{w=>ɻubMvsk}='/b|/ځ>oU5,pf͆;uVcWe7 luڸ+\uсw]럶W>C` z.tw.k޲]o̰Y=o}B}Ќ 롕/\kO~k|I]S>?wG\MTx8/Λ1G9_zr=E8r 6v'Y9EG}:z-tv×3Ǖ~tq˅ե)6hQuԒ:*ߌ9Y]t6ys~=;^6K_j#O+;ӧcIS}{{Pg67*.M-ް7^~bϾ+[]dɋnwYoY~uWYow/􏖹WKoe0澇\OyoslϔCg^\p;kǝBgG }v/^x·xb]D_:A0u馻Dt^}3h@,䟽jᦾy˅KvG?߸9z#-W/qٛ=vʡ@HoP㚇>+}ftՇ|PǖKS=U!jOһ>YUˬ 7}ݽ·ˏ0O~nK[F.8$@#ۻ]ra[rէ?y;+-C!~gjo)v [`攟UgsvyMtw~xG {]}r/p6)a#zǹ ^_}_2ᢥ\wᦟֵ_۫7h:5Okx`|gR> =/sg? =ۨ:|bl֋v`Ÿ]|n^BW/'t3y˲Xt=![#|3hz-ay}έW. } ו [pW_g|霗Knsv5x;dk^2ρmGrڮo>ipoٷJ7n|۱#?jgU{uV[+;ˮ칬𳥃WM}xGȏpg=3fG.3-~Wi WָM7nmٲew{ډkvyPpS趲ǖ;Omːs.>pU?|lW/R^>nwwˢw0uܳr<~G-7._o:^1/m?e/j߿Â{/jj]cN[uhHuoĨ怀C"h4W|H7n/BAH F1`J+P[ypv Kg< YY#ʲAvPH Kh+5\ ͦzl2 .QU*{[[ $zb,P&=hpנU .d.0 PmT%\P1N( iB0 }!/H''HX5_Vʀ,|-VX]U'S础ǁh,KAb &@(R}8%}X{8\jhJؤJ#A K'h{H#-/'__jM`8QϨy,;d3!a˓P|Shj-ҙ3BXt6d2p9dBvhmL zcQᶔZC. EB=Nt$eCm|)9<8߈.)C 3il͐i7A h G7(Oi8Tft6asEbѩY].[w[ aVa۝vdqo˱vaw l@ִMCS+ǥw8F ~e1 &-&jv mY-96\-4NkKM6 D oeDAhf)ybS2GQX3vn“C M<8 E)+H3^AуP24c hF$fA5|f?V*rlDA H#MSETQ 〾WS/t(1EFBps'qAK` v">   a,3 KiD`LJZ*Ť/PU}y`!=|[P+( Gmu & 4S[A='DzI# @,2>6(Cj~xkď/Xg&fXoњE Bsi|Nh2iB4-EX[Q?g |J͆RlZ|)+g; oNh/ 7c`~唕K= ZA<`<; mRwԉB KUd5)mz - LzN-.QN8b!@iv'-҇j< B` PV l.J"Pfʵ",fFf[O޺eeȱfӖHT,Pp E `˵xbƴ"xڼn:;! ˒ "֌f]PǔV& 2D)(nr3 41 Lp` VaݶV6=vKh.Kw1G)Z KL+pٙYp0v5@8ڭvm b /X; ̠sY3;JN.G  L;d*pIG&^Dmd%|29 9s'fVhِDLLϚ]\ ߄bU3/hf^*L`X]6KhD&c @v Vf̊zyi i]2#eIJBfpuGZhMim P8##tt(celV,6/r'a>ʑa. ht4;Cu^b} cs0B;jd&&(0]KdC#I /"Mܯ, %!2i2:XũDx:ur؅8b+*gS].Le_ɧ9E=95-kcDAȬ%idVpVnN:nX50vc@р}zI($nI/N/C0)o4#%Na v$>'੐TaYdGTo5R-WUpOu(5tC)yvF(W)'X Dl +p܈n:M^ఙMTZ*y (it4AK=E:Th36Fcj%5s.O7%RshZmZOf{`v]u/9=;e7X}ngemFd m~ĉm$e_]Ky t)5-s^bgw BRA}ȯcpBAO6ҟGT.Q!Ei ř?}9X&08#_C?8$}?˒I \ƃ7Vf@%tcQI79VN{I&vn%]6 Y`aBиA"@i:ɄNs+ tgF; SYfڀJjtD[ D̸`5 vz " /FLenh@* тB53d fȂBސh-Fsb5,`7YTf aWLԅ}x^ 4m&}DK N'6^p4+Tb{f=S0hA 9 /8zrp% j@.? ! `h[ `8"mPJ; "Zq& *&(dBm +m ,b߄]PEc "."jy+N6C0&Ep {gl.` Qn#*A\4"Cm 2p]^'6ÀY$Rx-Zv ]c 68%v(!R"Cb7TNl4u-V]FMsڜF36cÆ>EBiZ&4B1mVH 13M4\( l88d0u-f$X K)**_+ Rl1pOhMXS",/ts.a%G5!+Zi D=r S)Q6EV!; lCey @j9 d!EABbEd )A@6@M@#w(LH"`Y!L >'!lj?J08C$DO@P)V+t! AZD%r#`& p!)R- i1z )PWVl۸"b sˆL^hF&h%yD, sD#H@t0j`\4 q@ RS&\u%33fDfu 2Y)$$fXx2Lı@ބ?&fMB)@oppj!tAY=ҿYg2@D!nsn4ZKHPFKb`P^ШaDl`p&RAR^^:G†YV.kј_/ۤG\TXf¡ggL!AGͭ lHZx/P2bV LrH5}3L͌P8N&8D_XJ\34֦dR 4Y"gL3@L8()^)J FzLdRo-Y 0.[ F#*w`SA'& h:f&zĿ^@)GB>і'JYdx9ۈP00l~aJL16q`hmffP4P`` J 3`@VV&; dؙp%bӘ$*%;L'IeWX,E? Bi:`#GQ3 r)bG ȦԢ&l֭0pa"MA"s>K :mD^&c, vNL-:瘗iSRƤTt`&CYL)l1fqb]6GlUzHk-B,HcDe`d`$rDN2[UDά,F4Qgh2YKrpd Iz$ r &Y'&r"2Jӧ nDe{bh!Zq>[#0:"[1[QVDeѺ⊢^Ps:w8b0gjj'ky{{'޳+1dSo۾޲O%?(*VP1ćqj2f )dbʵ 3$ 83JP䄧hIx|Fx x8nܗNā8Zm^&T)D49PKcD"<.ỳ'<vͤeiiKkKd"YZ19_,ݽ8Y>(odsXɝw)/n!sh"g^0|'GATT^̜Ueؗ]eYdqYUh&^:"΅ev FGAȃ*X6w.[eO"-iFci&rie7G:9&K5 5dbiejFd;9AˈGVM'iUm:,4Yɶ5j S31 N4,uj]:+lr8A5^_Ert,ZfYI"R9h69ZwpMa,As'wМAc1 ̪ek>7aع9n  \Js-VhSNg','?-jok#:sJ3s!ŋD&bF QΓI Xh Oj{m7 X1 -`ys+'e"{mX309gQ;ijAj plbN +$Ady <@ʱM^AZT!+L+GE K^D8#OE)Tb`qm`k;%M s4E"&em[) "7o3Bw[ߖf>o#^F 01 8#Nftv"f};6W^S4o(J3Uj$ q^ppP"f+n"h禂vnB$Ԑ2m@hM ^YF"+N2cQmlǥQJ2: ;7Q[yԒq"R4&Xl!?٨N]#W![ۏ+~QJ%eOYGv]Sվ?nORVJiW"U΢T|n<O4oh+:+)"ߜfȚܢ[U77Z-V Ιс"B$qkEa2 жaQV;4::xXJ"nq-[pQ }!G9/KӸmxnAh7 l I uL;Žn*ތ{-V@iqh[p u[~G 3j|M L 5D'ͮM]N;N3C5 ډTp,V &# :m@9$ DgL B 9b[yJje35톌>ekO8H:l- {ZP`΢oEobEH[|ۃp58.ls`2atPQE <SXz[@EYx'sd\h4YP XG:ER`DMYf[.Pd8'2wz`uAC:tFΆ+0O&! 0I[Լx#c2j>2A1Xphg, |N_VS/N"M}[Q5oäٵ\;쀂K Cߋ!/NZ@ڹ`Z܅el ; edj,:Plf̦^;Nv \LzA qw3p(sN38J ?B]'#B : A$s4쑣 G/{EFm$jAx@IDG"p6t#aYFo4*[?Äql'4DBBIz"&!&5꣨ SBs$4yPM/#zO}=K&RHXVksfO@pMi BÅY!_07K*BA]hb~GN/( zjQO0jJ,ƈ}4CxX\!!5oH Д e5T]D%d[AX)gQmb|@>@}^؄WM%odCXohH݉pDBDKFFalC.3T =ސ^WG s^7V:*,1^2iYKܖ& R᭤U db^@$6 kYQ6R\ *`lGxPf4yE3hՅ'Bk`^Gb^5"Mn`wOA<1+cRdjLa#@zBVL7~ *s &XX8h DH8[h`cU ͡9ie %ME~U^eJDf`'kFX45+/}4 B( zVyJd >@aDPߴegSGjV f_5e$T?fSjA;R.ƈ\75LcX2R) n8C8`3Ie ( b$^߾:_&&v#5=LPq Xky9g0JN|gh+4djFl > MJ3=Sօ† E KF^5}7bB U~i!SE O{}ǤkLFOdI KJLXLh J3<<1fU0EL@cŤThK 32Pnǚ@ õ( zN9Qˑىz՗OV4 Wj;%وO-d+qZ&^Œm-I YEc4MB!";oaFGgՔx~lh$O={&kWfYVuL=:(_}įM'o(>v0e0I&O UcPHkbt팸՗+FUbNQ2 M:'5˗O_ÓvF鄺;);lJ%eNrG].ñ 锐5걠& fzؽyo'ePWl\u:(dhQ'V Bk( gn6$iY*I$dr" 3 g0PTpfk{NS- Qx2Q}F=xd^yM)ԺgDJ#RmBDS־^8MgVAv{BK{nAgn#&dCꎩ1ȡ`>:'0۳@JePQ: Y@'ycD{𤶲Sqqr܊/ K'Zxx<sNa;y0 _&]L҂T^(` -0\H/E8Z" C+"5Jmas<>5yx,^?h j;,sysx$K]s֢J $J(XQwoNP|5꒚H~մru>dw!k.ٞ(#˕(M9m=dDOC ٦q#TAY acnLA}WԚZHfBjWy$##醣-ɴI,(-m/rs'a46yxR VcK& fGImp@*&h']¿l\#L T .KYY3/՗$'++H*,o+Y͊ă1҃x'.2&"`~.s֟?-1&{* :3{wſo}k8,IoX-]l$ng %ydr&%TH&ܗ;FgT([!xdV6@E~Qhڎk,| ƅp+29*OP,c!Jd8D%UB("`?0zW@q#I* l^0 !i@@"`U\vKQ#  ʙ(:JFhz?_@ #b6FhѐM<%A M, \!Z+(MaXبr%:L $:!HcI:Aƒ#T]ZSJkj˫%x\VPj1wRq]j\:WI5'M.sW֕U%bXWNB%5UŕTXjLuՔWWʨ Pi =&%5HTJ`Zc]R]UWCQ0wXI5ZT,Vչ+J3,!UHXXI X]{XbTO,/UU+Š?~*RWS\U;FQZUR= EhUDJ !iɄipud:*&W D_urII)J!ɉL!"u~RKeğT=OL( OL\!(+)e'I1)⏄>@O$ABZ.LWĤQZ]iqWs"33T,Ԟ"ZǗV ؈F(U^%OQpu2!_H]) .kk,D$Ϥ2M [egRPss(XAjF)Hin{} /TwKoThP1KUJM[ E[ #hK[c%%1P$57N=Vjc n};إ$brBRkH'al Vdp8kDM3 MVJ#VrwrR{s، ifme(n6*h_#vȮo`'w\-GU(,'3T)a2Rנ"(N.DJ*p*%!-)ɩU:83ꒊ2R%긺dC79X,X櫫N|T#!1zIQs u229IL}B \`J~2oza,Fa޼"CF&GB-F)Pbԏ{n)?J:TF(P3 VM >i(@E09B^0g 'oJ  Ʀ4BAQ{< #2y>(#)hU/9c[X֥T,V"7@5ʒ *Uk.f rԊ95uɵ593ѩB2zTySǫRqf4{)#ܻ"ݐ.G¾:3ƨuYNIlk<$Ut,)qmUFX$$*`V%Cně1}#YyS6pҴLw uOɦ{?bEk_5X7&@We1.'v)Bh0[J,UԦ 4^55 |jP!LFt}0;PxR)AAR0TijCaLU$_w`+% n+h$Cd 10I ʲ.$eFBy88A/|FCo67oăѼE ,78yvR%ԦV<`2k/g""EŴ+۝*;-XAaY\P]xJ%p*Yh2w(㓂||LmÚ!{¼6QͱQ5xUc2VhdꓝAn$hGY+Oa[0&O)0YkeϜfI&G/tFejt;R7ӇpafO8u0XBN:HH;=PLmɛZL ܃ޓ`@_wO.Jj[nb]qXnƴ o/V26Fތ\c^8l3fELy VR?}՜ru_MyP-ޜKt"ߩ R]_kcE%i;"B$9>/ xY,D?|=1X66>5=* B)`(2},_wѫotKMžcLO'SUWoLVe+? DI$ҍv;iyp?!8fI/כ||0=zb̙pO]·^ (fZ ]x#Z>TʧWt=1|A\EDPVq`0ț~+㚖[ ڂ` ӂ8d & N=_C5, l6[NsAk'5@ >?^)lb`ʖB#Clqn{Lu%_&5h5]2[ϧ@6JH:kJhJx/ Ǎ`lv\ip) rMAtbZ"ta.S9I͘V BXL=dRDH5"7B`,#!&f/2g#ٙ,8~JLz.qs#[8YbgD&ւŇ vPTQ:= yB[/H&p;r4{%@Zn-ʼnHbZ$Ep9h>R|3Fj#'~1j:t P@2*Ҋ!(ep^L eB ]%_QQ^15PyOk[hy=0Ԕzf<&jO&EUVNjcpq]wt8CAT4k#gY}H` I$J H5%t}~ =!%Lhǒj'2jd Zn1|cc秕JFy\v+%}R,HI8UGCuP7.*b˟_RKiݘ҃Alm؅S/t%::Hrt=Ea TÝd0W/ɦ?ƶٺJb6ecȗA/< O~@l<3O/y< |<}ufs}p ,N0JLs$ԇQ< T0My H{Z'=%>#sHbtoyfKl> TaJCTvԀOAYF+\HL.RNB V]/sJ^Ji#:9Gz[ R>dֽpěh/ȼy*%E7LTqP fGU/A6E%n2q*^< Gŝye%ڪWE3$A߃%tHF'3(/MTyKa"ENհ_RC5nV,gDF{ҽ|-ATyGSXXtCi dW299R0i6p$15N Sn2]Q8dr#KCF>j=eo3Ry*qDMQvuI+3|S)/G'YwgPHWiNKAr#B ̚NFݎ̶a~## KA?{CV7ͧPFri]HJ0 v:qe[6*#\|g]]mL't ko;וo5vjD~\I7񂓊qu!-i@G@p1>(Տ5VrGMGRVz˂k1s$Ta3)k5[ӁTi .Kr&2Q"4 a`=fSh z)1im>8 來'g'y0wYc - 2nW@/djҍlL*Wg1`T Tq5AtsAD Zs_Q ~Dlr LIE)!'W}sSBDiFTf$Yr..g_;9d_x:$ΠRa;#1KJmoI|f#5._/Iog ZPd-w΄m?*b_+l+ohSB +H @;R]4$e b;Nhщ\1@ B).) 19 €ݛL{"n8T ?$[v9Vrq&5bgj_'ګXkytg#nj5{ע t?022w6T^mk!z,_ oV݆'=Gާm̈́:Y9;DڇC,ݎw_Ori+Dvn3ajhRhCoZG{'Xo[-d=]ntѰqNl╩MC[~:3-D tU!ܠ|G٢nd) /csxׅar llU'yPP(7g ^`fąҁM_^$HBȊ c?mE]E<1zISk}c& ?YfD䜧(gXƊ*sh>P,a}@,di!S)?|,yǨ1:d5EAɣß;>d\|st{ۃ_:^ wvMх;iyݷG/{o;YW]c|LD1="8GDm7."SqgD_V 0Gh]Wl3͑ ~&*-P Ex FG F3C-O`0B"" 9tOz܊[kؤG\I  ~Z承3m֟w8[ 涻01qzڅ'Z]ƖJ~Ӽ ͶJ.:S1eN{ uU4L$̰n~z c{ %+$tϻ/^ou8x/ pŋ=ZV 5#[`I6EouҾ}Mޑwci@/ky.94vKazjO?8t8Vhɺox=JSc$ɿN0KO?ħk8W˟z>#.$J+֐ mNMs3J(u +ȸ mg#,a7EiBz %f(JNF4U=(""=*eaU7\ ~au:lizeaCUb?=ܸ_a cԇiE񅍤շIA/%7QDN@`0x$Hϋz J^|dj F**L"M#ȌK+?Cy $üU\+zs1LMPe2UyYO][w-O>: ^}\ꙌXb%LppD1g(ZC3~0QAo‘QE1tMv5^ }d² a]cPe;Jk*eTKEK%իwD24(ԡܱ}Ә:+l2DTcғuh/ r߷J.uę4]:4Sg<~a:z6,} ;E!:DK89mƴ~\m-ج=tRJ`Kwgɾ-k~ 3of *"Ώ765C#5( )Yfe۽H;_. MOr0zCCv>}>߫]0g頷@/_8ɓ$" (+ĮI7Kt `.{ߵ>viq⻕pjvD\u_C[ד/ 1o>|w_J?  D!gNOG xˊV /i}LU"V ےg 4SPvg劲"l6G%ID)Pݝܳi8 &w#JL%_ x(9"TdW%B02P2v`*F;/]|ʵEo+ثG v2} 0 %[[@nL2>wp%O#l=j‚zh'3*". 7m/x'XG}Cײ^.LՀ4:%3S$@ƈBm!bOO2r* z֙ 1,9E(hЍ'eujN򔎂'zڵߌDnBPdg}q>fem ;i8^[ sl{vgt~;d_'~-G3H9xeETƒBT3~ z ۸M~t*$ix(=иw8ǽjne-F:Y2HD RU2́iYM 3l75̫\C(=г`O'1)f4L]M"z&+=i&Z E%S,0aPi@k'VԒC]ŧf|U%WB1M/R*cu[3bb)TmC\v [X$ SpGjký`$oel]5_G5oU0dTg~ieӀȋP`U-"s b0(Z X%-[_}#'? d4cf 3CNONftR2LIC E6ZԕJ*ɤr >MhFv"6 'p䮬,emE1Yy,}Ig s[]փ_lj2˨qTWh (ڨT@4щBHÅ>'#$wF{L˴&jL 皊_=Hn4lV0<(H9 wI!0{_f2yНZ<0b$ɛbҴPNMfRXw|B>wA#zP at~?6]h/h.dVIheVF9_3",xXCl?3#w85[v (Z=5 ېkgpQ|<\3Mj& RMҵtWMqNE&94Vzd^ Xĝ;O̰qkXj23(!V37dӺ?rV줵f[_7N o/Cu4(9 00b~Lgbllu3eGIK)}QF !1 QP=f{^ŚZWh B]!ڐɜɁa-LG&v;)̉iRM$ _-Su^LCR_5b1GI[ _zw!(nT,|BA?n(ʐcR#&V ~S#Hĭ`OpV<s 52ˊx唿^%=+P\}F{s*3x""sRn4=I< {i'FKM"K1s ٲ>F.X!NUޢ 1CE۱'c$2{~lG)u\ػl9ϽYƙm}ﱽ$JQo[r+ч0" GDYsKٓ=cp\oyH+T~|y#lo&l7*M;Φ Ji*FV\ 炱Qa"yQIڳhj{)Z[o0eAp n/q {ߧRצ~4aj-; 6K,DVD&Ç L zQ8G.AݶgJ9T\3En'Y6bV[*;=+ĖZ6\LZY);Z<⫦A޴(g$f$@ p!떟!1找y.tfF0/`2rJ* ( #ǣU6Va(jԔ hu[9P36$}|^dgqoUIBgp>, u,TmsF/H"b9~@@WMiA-CŨh*Fs5,f.7d 6Vz%zhX2c]yq(y9wj!YD OɧI_P|`dd6Ǭ g%˅"!a+-٣Y&{xyv_0a7xuPpA8Qmڝ> |Vu~?7q:tKc'j|a*+*xT i h0+MKEԧtu9]n i*'-*lMpfDRSz*n=B<~L]J/Z5jVJ ʁ*LNR# QÖW{jl̶5tusS=;UI[*zˊ2%FHe;Ŏ8ϋAaNU)mq5q|"B8Qp`uS18/ QZZel|j$dԐ(3i XY1`ߨЎ^rVOL{c;t-[~ffb;<@LsEHRx" ,B͉ժ8eXu:9=-`7+ آn7PFU6nB%$ ?˧҇MpXq=PR-)2z> 8;-y[OnaZ3fl&Pdg=e S]i$&t/tIqQ%PFnነ|vUV|7yj[!W,`zńor*v9v@szdڇCZzVWeXW眨C$-Σɦc1:sL"-It]S 0ɲ:c 5y,' hQd)h]^EC -mo\.U ޘrt^h{%=5~?~?}i 40F;eeO*԰%fڐBy#Ϣ,eoyr&^MBkX$CމQ0oޛWrO:LmJ2֝yςTF]=X1&Hx1wöUH9B[Eʽ¿X(=}jƒ) g*T(\wiQ7ݲrϝpid Gʖ@ubkB{pCƒiL2FׁSLg `i1 ޯ+^b WBQk{+Q ;gEzoN`{'utF!<SU*>X-Ή1&|A܂Z5j6-(UET9[5՞c"8rcC[[(OB65M2c$}dC-sVE)$F4B^B >2i(E.06Zx҅ra^Qj뼾 v$h#$I|,HN7@.{ tJϮOx|QS{ּ&m%i~dw+kMJڕ1>HZ}x-o\  y_MULe)E߰' P"Ć RSr' He9:Kɺ<&|qw3ꀩ2Զo4Ow7jN)%𸤴҂_|e[Yי!]'ثC]$ETw aVi4N[4+QI7 ]+2oѣn俯N+hX MNA΢` ~(m'PryY* N2, [7"=W#[P-%- {4[(^U)'5xcbdyxrK}X>QKvQJُ1+7xt XB9 :DO0,GWywBo>S,-u7B{R\ 浭mN5%i{q$ymM+t{+V ̜ ]RҘ@i{UZYNWwrQÖ$3SvJ38coաؐ 8T;r$o7dA+g$Q.2wzC*wa[=.:O^8_ћUK ˟79uik/;֡/{\ C,חwG[*2OF/-!!dqQEpn?&n:rl;]#[Ȥ'r3xPR P"UIoTK]-ڙ8!fsqMoo?XDdf"}z.I6+kU-f9b&z Nj&p7Cr&1b|۟xC{~x ;8_j;u娫P:uW_*epv^$U}cGC*37M]Ùywp(?vu6ndVs8x/t?3hBEctA/a+(ܜahIn1Gɛl.^D."#=C?3WSM݆ ӗ?KE,1o- ^6%[BykaVK)Dn-8oz_ \{I0plwK6R$ 5"L 9;kFY0 Bh?^v=ɽovY\=\of<)( (8kve-uVC[Q]Db +e_?.pa_B\{|oQ/m_9*%s&m{/nKH'I6ryȖ֘м9jƫD`v(gG@dUHMw/Nm8a) 80N=|h> ^SiщpHoWlo|ᆔOV ,qM{|H6O@@~HW!q")z=eL/,s'{ E_gow/JŶ>'F,a蠊(2Cq!͛^S<9s~ANou77ַ Ɲkko!Q29twaޤ#k.*df&ᙄhQS%0NoB?%fJ,R\ZN 3X7Aud z zמ<RP'p}ADYo.\i o,f֬ I-_;wfMGEG}~ٌmpMeLi^LN8x^o֒7J8is֪__~c\6ۚϦ9ڛ.XLJKKkα[i]H ^Dڑ@|"8w Ef%Lp]1L`lbɝBBgksyWmV.TƧy(S>TCw&YC!h9IX2"@\U`8C24|~Q$v6X$fzQ[ӥr2/-3xV. E#v89Qp=X/l}:+@vV{Ir5% P#w nw/T%?z3 '!aə.T&: %so?<7bOOib,4g@"ߘ0]j>:i]}Mĉm o4;n?qڔKs-+ ڬꁉb-/ >[o.XegH7p;ӟAH _!נ)gǼ|(eso!APMcL6dOAW*R\[03ՂF3 #Gg9 IJ894޲n2ܽYh?~ѦK6פ~T5F#',N5(~@$hYeN IAq] #g2df<^L_c0mpcR3{EIlfY@ -U@"sbӕIMj;bK\{ Z%l3ZD4&K ah\O$Oz_l~6)VCk=Dp˲ψNJXfG(_B A4zx bP#TO8, q3qiKkD ߄9 rY[4k+-NFO'~fB,SH͹l ^>~!\LQԢEoKye )9I^C(V *sHb>Aȍ%CT(QS<)L0 8EnMbUڳUE]-3B@5bȑgi(2[V*jo@6WMsOЄ8d\p\)WXeBu,D 0f&VK2o֒(0n?HZO$E﷬)+оm:5dԠauJ#35W_4^Q 6?.FF Eտ94"5I)[Ky$]P\EɘykKE-.nVeϲ&:˛1p.H=L8rp ?R.j<5F?GzG2Enт9"Hb?N~#uJE,Qr:tMg6a&x([OC'.I2ic?TdHR!iLl#'y·޻w[[[͖bYˡu%ܒkox`a;]nS+sB{kڏ{5;[0jFx#"YINЙ-ԋ`t\vohͱ <q׊|Lb6~z`?ͫU=7N ݶyN3\ i0[Fi\1\Kjm@VSgƘ~٥kr YKe1WsFs>+ h%$)t {a8o#!`ǜF&AteTkH$0 5eɀB7&4>=HnD4Fby@i#a4dI>~& $챆COuZ 7 [\Ktv 9zɸQ*hVg]"ܦ"lB18O>h9,Ļ5P ]Ď]eDOܠ3hB)&0r͜wIw"r7kø1"ꚝ{ cvcjeXa p XЁi.=Gj kĖ5D!NUdsAڧ޹㤍30֟W4-£xQD 8F8Z)n5"?[)^HlY#QZ",v#ݝ`WJnY/Wlnb/UjoR[^0`g:K嚋49V^ 6cȇ:l[?U #GעI~)wi0h@}: HK@ӏj؝*lG#ɡІ#cQph$'ޥ(FOϴ/zJqPq; ͵WzbT9msh~febҪijYUnK 8vKYѵn'FSåUTYD;?wӲo'/[4sTjV/g \x~9|=hI{>4(VZٞ _fh?>0U0Β*$ĬnBGl``@d2Ok-X5)|+bg[ .#ng'[Ñ'd6 = jGEI= 'wC& ~5xո\6t=zrLF={_ˋLEW}IT_;kl@_ U^I58&4VCa桍Mc&O%8/0O`IZ-t˱ad,]??ݜrp%3^zVwovWZĵ Nxw /C\ *9%_dv< W2B ̓0vfݕBt<)ٷn'3X͇__?ӕתv@S(9Q"N44WӮbk *#)Ԧ5!݌ 'of kkeGXufUjVa.jҬ 2$,BrR]!Ёݷ1ojEo Ɉof -L)y |RfPK]?2S!M8~,I$ޚ:l"t s1C]}+g֕i(u S1`_Y~"8Q 30z8(uN osp13ޔDqHş"/D߉#>v|幠lde퓇vpIrl 9yGB=<`MٙAprr4WI 2Yњq:N2GAuQT\#CA~8!d}VA e΂| AhQU۲\`BQ:9%}霮bMG:k\XrD- {xƲ-EXJ \'\s7!(1:u6»K`AbR}1w/%KidIK :^bIGd!Nb?7ⱪ?яr+˱&FuD{Q5I;6eJ)lN>t#zNPq-^M7e=Md42fq8 v*Ug LfStf;B1B*hm+:#cVƊP ^1;9Fǡ^# =9RO`3:aMhF]Om@l~iaH! 㮁( UD셐)?xy|7rbĪ`ѵKbRfLZ@z>-Θ OmML";fErUvF5x|"qjxU8 R8DikelVxfq܋S=/Ҿ\~6sgow̞}J;yG .ެZ`n˾p-Ʌ bNOŭK'0e""izسRu'؅O.c̳ -pXRɮ2W}I*b5=[\H rKXaW}ʼnΝ]B`™,a`L%q(0}J U{i'ѻw{m%PL2/C]" е9(DC. <>:,LSC1>RwD!Fn&K.t`߳9՞&OĒoA cl6DܖY)v lAs, XufL'ۧi搩U uC>4*#҄8M3C`2 "RI˟-%E%E떒b;Th"HR8#Vt1[4 +hn7||Y17{ Ҭ](.mL o}J_-[61o23c`+B6D|QUc@4炾|{z"PZLyD46RckhpaGq`K~%5 ?M/پSXw0.CnoE+BoBQmCMFUɈ)S`YhM Rx% }==Z9Cն KadáD.!t!C 0k" BdZqc e:t@p8Ptljh,BD^Fh E^%Tg=mu6pfY HnQg Fxy(蘣1(Xjȧ`mp?HyAVi} Gw/~aʦXF}68J:,thvItegcZ, (01)zpT4Yrq45e3`3qVcSK hf-Ty,P;Gݞ\,z"P< qt4q:&^W =|pD%Gi:SM)#`<ʆ4mu'u5*!A%gO؂|8|N$H-K5FHN{V%mn/̦i^϶Puwfz<,n0@jBnhغ<ؖbO>3dػ c.r|u+0A}<٢O6`'^隳IuvbR37qЧ@4 F-{hVY[%/LDs܀J2A?ʏB(C_\rGaF3!j>q',͒ZDy8\Tr' Ո$Jo}_br$ř- (ފqVs379Ca_0Q2Nʠ-/@[Sbpu!hrket/8!j%`~_5(L,A(Z@kKCqt{ۃ_:^COV$f_P+a/k׾GdrzJz pĊ[n׸Ŭ4W.hp.,yFQ+GXPG " آ,ˋ|wvТ(u3ڥ֋)ۡOyb&xU.Ldzzĝd3=\T؜6Rg/Z~԰7~p37!.AE2"؊E,8:4**PJNw=yBWv<} ę" '13c0vQ"%)6l #se3Asx7 2@BOr2CUX lw[zb* C0@Ĝ¼hoZ-< 87ȠEz av,4EgjATʳ u/^=g;#tGꕩ Mۅԍmu~sQaW߽A/qmņ50?^MICkM +>x :2\#FI]vX]ߓnʧ'k])G(%i wI|-5kRή]p>;?~<f~6j_;;}gF=w{q7~{?ߣ8,Zߓ-:1}ã|_ ~ϗg?d:?z?rA|9ܿ8y1ooUw/GR[vΎ{<<_>[vwE|}g ڇث5if߀LOkrm{ً' mQ _xI6֑/<[B 1vx%+Z|Fr_n )gt{2d\xw|›1nF jAXW|k‡ٴۨPoyu7#@ *}IZSR)wͺegl`%Md/ 3=]Wʎ`yII0.~!"H朣td G˯W8dPm^%:Mb (9HQ$Bu:ܡ{'ݡ ID}8*Tұ:FXƒHՖ/A~x(?O\io'%1[w1r (w'p}2`7Ȍ6썧pkV)j0 F*M :IL9|H#8_-"ж7΍6.\":7%WGʸP|WdvKCť%'D$B\ʳw+Y~Cs-?| 9 9vG{ǣtAhD_qH:"(_ZRd@Fλ÷p>dOo34C(Z845)4INRp"LWߩX2s cs4E2iwKY9;%)imʓ#-|uŀIf%ߪj3tf rb$A39Sf`jfo^ޮg:P誥j?/? x\<_;I,D-*ՕE HB+GI:f{,kP#-[IXJL}J}\%9Un4' NzDYFzfrGVmILxpO$p(5U,C[>¼w&lyuws-azzӸTO`ZAgU).|kQb#aƒ8Nsc.e g!2vYOT HogRH{ufMjK[A4?-K _l,)^@kN!Q1ޠ@uDs?$6ƛ Ry wkӊEW֕.FpP>dL%Ӵ' o &IesN g0쏾a tLBtG4XVL<'e]$Rw &_gWFZkSfK틺9F)jgyie%tux2X,8k ̢˜[4Χ]K ؕD6%`pR9) e(`HX%F҈s$uaJo|ܪ ҏq批0Q4[X\RJj9,[}~in@^5L6BBF(&5kz;EC,oj_Ud&[3ٛnbNPNf֘pJ:u؇- jU7Zh[78h0K jK+ *dTf1z:hU8%RY/!dU [ju g֐YY4Kfo$ YIͪWu#ݏMd\+VӍm4ZR!UUW W3ѕ?L1Ψ=7=mnEI~3 vy$a!7Y7kKpFV>nf5ﭞ}'CnރFI|djtgUc%o }Uw%oqz^gZ_TƬu^תGAQ֬k LQ8]j 3Oxg.I)N(0넕<~IvzqqCș"&}F/Ͳ9%pdmXh>d[;cXW7ya2\l EZ 9 FKF\߮eP|$PB!B7 Ҿ]pI0 ypu  _.\noU̺'{#3Y^ ->1ܩ,86UdC4l4VeکUW,oA F+kQF1ef2zIm0rA.Ku`Zq8(Z5F)jjN:z܇"UfQK57Ifl2{LX”3EI 4:S{./+'#|m#`&yN4Rfq2Z|^Z^ $ߟ&Wa\QAZ؝ѷ*F™j޵AЛ}Lym1\aߖQ2FvQjԑ.vimr- `<ҏg2(T> D6M u@.d/FXi4bްoH&f# EB@~a K3a04I$GȆ1+̔ൣZ*!ofϫoh_>gv~f5xaͅT[/2 uaKc"" piMՠؕ4$(?ӵ \ ,΀S3k@8zz͙xکYUSG3B*ૂV6# Tάu`-Y zzYhޭah*g3F m| g7J:}i0Uhh2Z9 sZ&Wd\XI<4`TXy0iq 6+*iֻ(o*t9qReEn0 2[ˋL.{0} I3xZ-3 ΨQ)Ip 71 ݇_]jyEm04Mr;jAq0ҾJrxT@\mD_1}>~vpZt 0gx̜a$*:WL-6}3](o)A tީ9_>&3˞ 輣^F% 2_~*.Lehֆې5;g _< (KUbEiM?p\^eY f):E.fqp@վupv1Y桴*fU,H+l(x=IGOnP8:J+@:*$\Y2ȱHl(я’E݅Zv8 Pᰏ3: FV0̬2W XҨ n1LܓrzU/)<8q6GF-[t<2f4JgΥ!H川;7ڪ`Ƣ|rVfӋh^N+q'A;a-Fs93JeTSe-Ԗ΍B6TH84v+t*0D^(K"3 kޔjG dR7xw4 wa^f|!7rkLj"@ӆM[ctPiIJy82ȧ}K0àV<m!#O]hgi iR 2w 8iF6 {ͣ$꟱lWY0S>c&4#|2`p&O䦳h^eg $uQtv/Jc]f`Im CK&?(;$qJ4Zf=45(』_0gSL2Mn:  ic1t^ 4nW :dEwΑqޔBO ӰMe_&:Iʹʞj7}%a:g 碀;.ewvNz;E[bɵt,(MR4JuZh4TF+:X ` @46>:6e}kM*:EKRej[DD >FK{hK.;t8'9~X7O:`t)+{aTW[S90|p8b@~&Mgb6[܈g"b՛mc&c" rC ! 7KJƋ*Q9/mN}u#vn8g%L1͞9zƺp% ĉ qʎ !9e 3ub^7H7 xַw~QrZEwyp},SS|F"W菙֖꫁Y|$p?qӦ}fS#l0YpWM<ߘ%.Z2u$~J̐]gf҉vl'Z=*I/NccgUehb\H8pRz,D`.?invV u-ɵ2]]+1q {Y`f ;}~ݞ!8&%UeM?1FwR@&lmf\܃lME@EޏYeEK !f@ N/UX,+\䵘[wq.sq6󿨕3VaU5qV}q0ffXf~Y3囙N@O/ʦ_m4U}/Ϙ:Mz9K*̟[I,>S #`d>1Bҥ7tjfЭyЙ]Y SX Y9*$B}6ԾIGCZMWᴃ}*pmgم9wn}yNǪ[Ezɫ0/&Ɖyu,9h%F7KtC5'A{L28Rыgo׵Wxrg0K"iEb 3G0ӯKJQ\,?uGCKiW{veJy4c`>)?,'KLo/jCS z1sWk ܢ"nǤøaor%mCO&RQ j_Є')1'lєn0lj3 >)@Ť7h,:[u^Ew .zYŁ= ~&IfiZ[t=3(qfUX/tә| +\H&ibL˧Y:,0qLppa) .ujiu(ᩄGm7tPB" +E`t вeլ=jl*Ftq!D^V5xBjm;)5bA~h`UnـVCMQ5Ȁ\-ܾ#'WYҌ]J*aShQۺOGR!sN+5.:» RpuA.* _kI$-?O ǟ; +Nę ~S[oeCClؤF|4IAQyeT`"֎y- NgK3*8^3(  GvV!.9TBn~]R3x%/DZz?$_8TOK1K 4-ߒ\}}_jq; Xx% MK/Rmo  .0LK믔5}%uE`"\^WA{d-xlN| ei>Fd~>2l|[̪tf48.5Un qOМ< PC>Z!#5/R7p5 2ic47RWa5 |ЗUb3*.\UWx!n[n1gK/M%I..ցnοiP^sLU?:lTu'lye*O ]R:cKM0C %R7׾6@QJ[-צ:eRO'UEY".\OӻڢYUˍI8)3&}_"]7ӻkSZ5np]mB~A22=g jd}0eRH :q4u:,^,54Kdfyb܃__ή+}v<~*̎SW9nΗ4ʍ&`{l6o<ض Ů?iz *cɮ"mdz`xhXM3CߌU)L O6AaID$z3Yd PbQXhw3I?feTY3-ɱ/$$FtyJH>(>Nך~qulNcpъ LmyS0ѼmMKp ]/0"oRFdI6J`҅2Qi 3rfp2.x=t5sCp~Bi ݯ< $[R rX.hxLm $8ϴV89:_?|-kxpI:7ן>p:Uogȥ;Q=B捃fE58YB' PX.=O|BCupNuzv3C*x -3FÈx&^{c+{ϲngkxG4rߞ;CO=p̟H~~!pDytL-":ՐM`㔸vG4ZPȟI jC {OH(Mb֠w8J2Xx^> F\?  GQC3Ӗ`4yQ!bpG/wvըk+l?;Q~w5oa(lp~mmyk+ Dp>>qm3 3o3;YO;"kv5GC GX2) D`~{ƟbhK],zxlEm C$ h/w?iXFmVYv2jk5\~0 Cev 0``/lf@)7-.֐ {O|V" <~=#JjmVjOLPi&9~(n"H.7I*?knB> '`,`ا9`f^g'Lv)lpD ",L8)%mBI[ޑȼG/[ňuP^;;rЫa5m5f`Ʉ풆5 oB ЕC o9,,GnT>ڡ#y{ǰqW̻@ѴFMG,OA0G%Μ;߽9fetgÖ^].Anf +o]>C=%h`^V -\h .˼;J֌ݗ4FOv_쾃jڬu9O'UH>}4$LT7\xO0 [~2X%}AUiC.ԥ ,ђ!554T,}JqTϼY@r6*_G 3!+ [m'>f3DcIə''&=YzuAq_Ne^.RRIN:¦KsTy"@6={.)49匍h(sSQEB[`5L v~웭i(7#e|JzB/+Nk?uqhOjxdNf 2"W$ E< ZgPle![daNc<fQ߫iPCna6Oyt33QV/}ppq+3Kds}m?jy o0m1Sy7PSK(Y_Z^N, h²cB!IOQֹۼQ_k0e1:QwBo#@_0kN#8#E 4ANp2}G[uf0>AMo叻.8! Ց:5ډ9Z& t2Ev&4x.G-tcWzv_MxTxwPr >ZOӵӓӳkrݫݣ|0,auO \c?aZcq~:WyI2~u?Dؙ(2l5V?w;]ѹ\z v񺸬}LMJ)W:W?L}U+i(Ґ/hVE 9>>}fɿ4:M=qV;(Rt'FRzr{?9Cvŕn@p]R K@ǹ5Ne3ޫJ zYN!_}ܼTgq|ULڻv[vsWv!jʉ}ОXFK Zm4(* QJ}A(o10[D:1 D&2"_nn|0$+@OU+*͆+eiM[@c27*:=CT[v{, e0Fv32qoih|"/a$)(ʣ n%^z/Md;nkP_<=㻜^"4s վ]]]0d[Ė}R`Σɦ3K{#z_5qpZ㐒phnJ|(O_$wysxULDcCڽY5z.?? ]$@ֻ` v1m_˫~m 7=XV}N9TQ8Rkhۆ68cm^m=huԋ|ōW慠?'AMe\J Ͻ&Q1d׵u/ƈ6N 7RXw兎%nD޲[F(Տkv4'ʧc2cOχ>ZX@6[%VBMdun7%M GUY`X` hyb 3J1"|cDw❁NR_s=R&'bN7׸8 ˲8J(Ӕt~Ǹ-qRNV?2X"w+UUI5_\z< n2ax^ز%I0sMi[aٺ6(CJ"s=z3^nm-9?bS)l3w^ rXMk}>&,IqLC-;xԚe0WE`p -h-i8瞀z󆦭9&o4cؒ$2|>lP7\ZpTf`r%jݣ, g_E#eD9%'sf( _Ʊœy╕/!nٮ{b7,k,ƒq ׳-˹ĊIJۡ8{xSyO& * ([] kN"H4#rCƧ<|Fď.sQE1`<,,hg0ĴϗZp[Ǝv{1Jct's?ec.T;E$ZY5 ؘ}4LR(\H[oCZEAn$H ̂Ÿl5hc2sHw Cm8 J2#S5;03 TJy-K'Oc9vhex|W߶<]~l8>ZM/Ȧ^'l?eSKUA]t&).U"*+^/Olr> VʤR,?˟)45dZ|rBE8'( >%ˁrt _Ps*2#"0~8 nBI‰}ݼI|4]Ҽ2f)j F4*/2Uˡ\Ԇ$eor.w] .y4Vc\r!.24VK/J{/F-ܲ|c]R% $aamVa4Jpt~߄qUoqq$Ay0I4[q_jctm\M}{Vt083\k%n"t%j^ϥ/"D cNWox.[zz;VA`pr(tSV. H;hj?wOj(2C+74mn~d-T<΂jON}jkWrӟ7}aw: Тg079Bd\qۂ:aV;uQB,M\|WC |)G*7Nnǚ#eP朝MN+b5:aƥ,SC6XHZVAYvoϘANf $[zqVMCki}|sH:W}3^1VLxr'ڽaTpfpwmOHapS#A\CH5ַCUbT2^e16r*Y'{s%W1;u6\%Kh[#i gF{dQϭRKV ٗS/9zg H9ajB>pX?^ݫ;'6!= :c0aYQj"VD1ꤡm*:1<%4NE؃ H3 BκadIڙgp BovoQM+r뜡ݽ%Rlo' '8p7Qx1GU~quwrFRKQ( ç.L-s *g۳g/i$J>j 9e: l&,tF$\ʏa߻ S8+Gצ ՛%b ݕ\9,T1,b;$MtqupESdlז+Xu18[WyRxHco'7dgf`*t m nHsAp٠*,IOW,"贕}δ7OOS݊{S.VWA> ݼ8nBV=m<+WJl3Yvu7#ÂfWzm6dVfQJm0'D.^l.P5fMbڮuuyKQD(Mg"Aa@Lk \Jt+-4&p(|60ԶlyW""d\moO6:prݨ@U7]04;㘘]rW( 2"[>B>扼"0bsן?k/|Cws}wosR||׾g6_&l`3aR3i˕I"핋!?};Ev2dA0 !Yh AדLI ( oKC*økڵ1.u0?:NՏjIqPR^n7eqťR.f`6MZjzUNYn@Aa,-˛J!*Z2cVA^ư)x}av*`)ld!PG]m5OE^ʵoρ˦j)J{I3Km&xU]7|d{xOVfM/̭F:J+㏽3Hd 2F1KqS< ,\ro9HrXl,:.zI^nVZ`CIpLwB,⌒S%Aટ]^rOʷOMÖf%5[ E٬taFao z;՟=`:OR&HQ1- QR&Jp4p 9cJkfTIۧfJn >!,yzArʷ&L]vf}Aq4FγOndq^a1"[ѾڐOڸk 4nMI~}iǎ[@<z`\Uِ[ `Bʮ̲zɫjq%_kȳ1SLl#Lgv!yG` ܣPw`Fp@$w'4 '}>$X'/0e r/罠㽧AH5j}cl>Z_xe|ݴ\biT]Ok:A˧rXA+Z0r6b?) Ǩ ߇B[릝BC :4?AĀZ+Y#؄I)؃SjEƷ1Ԇϫ&#êQх.)jĀ3tY-*[89Hg~Ct&`+o}s1Ouʗ6evm7ZulJr.3p(,{s!wsg tV^C񇽳\g @)QCI kMVʼgh|~v.}-m77εpړy9ePF(w6!An #LIh9>{Y B2k1j/\.:'ۣb}t4Vm:FdBm?C?޹O|.kp{VVbGdmZ?aQ2qHSIH-7!00'B3:ۤ;gkȢV\5qv]'E~6*a H|G;0IQK/Y J=T_&LBe݊B8$|A&8A=S*ty-x 2:8򩾝35t X9`6:GXHLS6IV#chi*<6G.7+)Aᡆ% 01AE_wU2;;yha{ |VX}vY1WHZUqKN"=xaQ`-o/^ܣa.~1V!&6\=ą|SoY5cY,y!]vGΓБos_s 93bg7bzC:8 a$b3C "XA'RJffe E{&Pϼp3d2t]9+|$Uw[:-)L`M3 Lc59IQ/f,bv1kQ/F[G/dtpLU\򘇞FX}~@[(\M)ΐ#2L_G 1!q(H ] l``h%<˲;PN#I9{pxҧtJp[MOղhU7: ]y:HYG8G/w)3 q{/ԃršfknx`2YKCZ[f˕X]tϻ7'u<)!SI?%Hm0$E(j=`ݱ.)eݧxv2|Iq+-+rNut;~ K;.{w?!c3@uF8P[5Ն;?IH{Qx__o{ne˦6`(7Ϧ|x>3?[70<ͥs> 1tq;nĀ]9}; {ELy245Q(]&"ã K[h)&c5B';I-ĻOjxpGuƂ\F'=<̼lpLJ f gVSaG9e-{`] ǮA5Td36Ko,1PfN$@ l+ɬVqNaq6)q=,ey't!Y>+  n nzXi8h2tdOl5(<0:4F1,d(fS"bՆ^ҩSi{dҝ-ER{lҫPqP$N[@V9K MAKk*+b2+ۻ}8W7+ IGlg%?/8?x_|Ipl݋[UtjEg?/l;8QQdl-79?>ӔMy[T`'T7ҫy#&*~U$$s=)նz+^t== gt +vMHy2qZU ꛑ2}tߝvtiM7N~i}zFƓvh(b$bn"xD ިݵPJLQ'ȷ|}tA4;$DHWqooZWpTLfD! `QTx].׽:(ʴ-J]%A(ਐÐol}@^I)޲%Z&],̣ ]qji8- Tr!qi@('qPhֱBruU.s){i\J%b*yQ=S=[FGk[ю#z{qhsk p&=Dw^l]xW׷vTѶ܀YjDx$FvHOmlR"F|KiG^iӅ͊(lOMUW)lL.JIsԣM@?50j.A cSjYkMlfui)Vo.#X>-q_܌}QgaG\$D~ꢍrK9*kq.!aO]^{EN+ ؅L H;~=%/?E^%m9]`?>g0}T"T4,|ݭ$th 󦦐c9_R ;v?FCU4"^GtŎ.j)@?1zTa@G}ՅeY7  ?M ." Fڗt `^8 ؑ(M(';k2#940pW;Ѷ'q#Kc w`ط?Y {Wc :ѩcUXF9L>VAjB_>wO: c80F2Cj'C~dm7YC+~gNzӂΏz4Y4rfy?|D'L HfW(Y*6"@~C9W[oܔq_Ii5xD_@F:ɡJ_ c A\ /Տu]jU~rhO\y5+\&*tf 7@s1"lk +Y`,,AJϳ $LN4_b*WFKŤtgV zZ.#NJ_r0oo$3n.mBWoZwU9ZڜUkhPr!033?ԋ~(I3&)-S=yL;=ZN,fSlof'}k}(G :}TCBjY%!R:( 4\]5B:eS?%gJ{pHjirLsNlۃ}c6BVBF V{-X{RY49UFZT %V Qs,&:MVRk;+ꇳ'jl}S2KIJ!I.(0)u43 ,Mo9amJTKf|kk"o-z. aV!B4g䅪!̣#w3Zħ"<r2\@HϭXlz `Sd|%<,( !)Z~aCeX*2O>oF<~Ji.1RZiadMүѱ>o(TD8jQboy?k](kx9LjUy<=a+ʈ1 Hnѫ dP'ui~6uAP5n[$˵QӜd$Hԙ {K4+H^!T.֬rdѨI;1ɰQ">E,&q H{ootyQTiOm8^n;SN- (F0<^2um\m%6~gRmU ǧ0QB,hb(0p z /=iF'qwɗv9IV8%4C@ c>֑(B+`^pw;{vr|n0zqR g/˸MۍR93vɚw珱 cFHwW0l4UV̫nV=Z 0+dFOơςBؾ1-n8Rqab'l1 MF9pP r/4šJA|EǪM99 @"^q>}ȵkW瘳!mB-2HLQ <]JX9eDx 3)2Ŗ+oYif+A`:}I7%ɡߟ\ Co[T5NO_kabWdyC7 huSI1νF{eFt4`VizWHp-"J{ap9enJHqSq0ީ>F3îCRhm̤|>?TۭcnqNZh[G+ܮ*8 $%CY-{h h'F_].vNUP:2BMwpҌ)B?re$@U9A(zPgHDzV"A414Z_(HNʩ0'.ˑ@|>v,V^&YULY0 +m0GT]4& ]_>5/Qh z I 8LrzU0R˝ q15lSx!"k¹;+kkl<_޹xLɨK馒$8,?cLQhIy(ҋaUiجrgH%:EObPՏ:Wn<$G<ĨU w^{^a;iG?w?WZ,ڛUefSr@c0sCqEq->'c~߃ykՓ3\{2.sq_|[; خJS3܆2Z9H2?Ҏ9 ,eif?p>w3ϬdWٽo,Sa #[Ty@;RYFb?)싘]P2 8scx PXNq9[~ؕ5]xeeųR'hκt4(6/x[Zn`f< Z- 2 SĂS ?aκe鑣…vaqr:=ha8(Jϫ'mz4fB 11BE,n RX[ܠA|Ce]fZ4X1`*JxLe @:q;bgz+f'2i@p>?9p ;S>[BcWݒ$L5Ai#hV%#+Z*Ń%gfA*x'wL 1cS _dpB.W Qu^c]m # 5 /e@VdH*CZ ELVǝu7yp}ʱ"Y)6Ռ6 *b;T=LƦ9l_b/{rH`(n2@Y{Уa\əJF9/8-}8oV#+HX Y5nF9/qe TGSrYq(QztەA7@|6o ԚG'x80/ar|uP4\!?}Y<ʔLr/!vL cG3 #FFQ~=q.g ,Cۏc9Z`H2*U _WUZ:_Y1Da(mqhX\/8I7$[~99;sMn,[qUS9+*f,R@7}hyıb !b4+UNd6} KiٻG\+8 o"zpDcz$&<=|L<4LK@fPiQ Eq!RڞyS! -^?-F~0/[%DV]!'"C:7zՁa~4gB/oi4ZDls뺠jG9em_tH%ڞX.ՐCie"zӪ?IF'd*זJ-ԨIzrC_.#PD\_-lU.BոZظIK≓{|>[G-;ʑАz&gJ|oaI={_ս_,d~=1< (np 64k'@J~>=Tnt{N55`t 3,n+/SI۴*L>7jǝAyob?fvxT~BTTǴLB'h}'ohVmǖדO=OnҦata/I{$gFkݗ+k 66Q/(4 ED:%g3>*j9)oejPĥÌ M!`6"<B ]: 5H|EL!T@[ƊH7ij؝al׫XDچR`]tpc!MTe PY tysLGY5me95чζb#MsNI``5rcîk3N&~gŲ~2VQ̼--7*`Zh/q'9{in\rrMna'&7 Z j̼g𠮝Ҩ ޭ\L(Ne9\_De_M;T₽猧P rIZRs( pž;ޑ]QK^F=d=q(ba24QL ΐAӡHa 1iv6JRxDO4B7FpVJ1>4#U4𖊳^3iN&yG:`=Gkeih!p1chk[Dub;%(K!qviyKT 1Vl⦟S?A94U=_&vcvfèm1,'V߂@C\2G}QK >@Cg2{x5 fǦ lK:e2!ֽNG6K-2_{;ɻ?ZcOvW~s12?vG,:m<~bo~Oc(D~nLdY~$dEmQE(xй N8!a8Fr>)2KH+>8Q9 nn՛9D@Ӗ8ryNαlo'F0TI]:@#[=D-{x}Ux$W?#?LcMi漢cO#p?\Ugx7c#zrd #lDDstfPQK)F2scG6x/' ` X5^ɗ}Wq|!ɩVx\睠pt!_Js[H:UK$P*sKU[XYhpW&>Z7#GCp>cސT\*mT#()T?1RȌ)Zz`b~ Cj!Ij"FUVѝl4\҄>>{`G 'hqBAƍa{(pބ&6'DC*tThk1kPPu ZM:PN͌ۙK /#`8Ed-wA0t|ypnF7 =ɰ#6=Nڇ®T@T4Gc1RVSb5S-Rp&& .n;*5l)#L6'CΪ3BW[#j`$E/5(6"RY,j<81EQ|Ez.kW~klOw.k. rҗf*j$foB$|`VY3'@fAa#rf84Xv+ޙCs`-1r.2h(i A6߯Vw~HA 2XlBfq]D_1oL5/ VL|hzA/Hx%5f|A{i kl5[w=(~^iFpٛ4e??O0k4=U698$*91cG2gMi׮pd, Vݤt'l6T/ R 18(U9( v~'BGpQe} Sȁb" "=Dߠ/I r팲6c48v:c{kNsaI7G;è #9^k0?v:i,Lbr iߴ# MRUbkj:t<&-l ґsXfUky]UY 4OcI5WGEݖzETOC0+%08u#N*ny6p2 QU_[yCu%4em=F^9h Eɧ\ګCpYnjZ^o_Ů,c~^-̴SMxyk1j!FѧãlZ08T9.9}-Ez~MX΄Zvch rɰ|ޠ|;,Q.#5D-W_;wNZM"a.Gvj+)MR"Qwݽ9ϊ\r ȩz_?SxQz wz@8h6D~L(tWǓ\H R8HA^b;<=ꛝGuݥb\ 5tCLOxkK3T[S lWo7Tg( g(]/ϼ3xj#@aꬶb?qU|;*X&pnk.[LMt6z{zsمPCDFLO"*[^'/v߽T\at=0 [qR9d*|?QFc8UI ӸYcUKϊ_s+:ň tuzʫBKkdxjgE\99~Sk`ԤW}C˝]IM1}3UB,5xs֭Kڐp$}qs49Hp 晸b>E`UmA5Qe85gs )^C{Ǻ?daW8j8L=S%`xz |]I83*-!"-bBb&Kޛc|Pf6:6DwSF}Y^E4hhƭV1SW3+QaGi:1 RgTDZtX%#]b'a? P#Jɒ'4Ko{D9JT!(ep[Ǹ% epw &"I'O_1U P GN;, v([OdWS=WAu~$s43*]/li4pZ)mʽ ^C0= h:6NCu:׼t}k:PD{&X= ~ x0]/nh8])y(5 ]јDkFzj!ЌLT:QcVT)=geTJSR8iMOk hMz^ t<*vYIN!ysVWOP}f0eoOnzy?:˅ 5:kLW7,q.qUUc9<{a j=*)4g "N|qu Kge˃73n$eu%kMԽ:0N0gIx+/HEcWk״]Y}޹_b}26~hgNgQh5Tiٰɬ c:f4Ki($djWi6iFD6s )Z!ESBѪyB$Ds,="ROʔ,Q89:`dù`Sgl\t?U ܺٸጿ<0Bʘ{ dOxG+ ,-֫ku125wa%hIaRͶ$`H-i$Dxv^D:]h4{^P.5_{ I}^sɕXsDdžy-G,L 37"r1Zr2P,wCSht:Ч3"yN%dݖ{i FWrnQ=+Htҥ:o"@R 1;u|'}0.Nq5]C%dT)52 1a'b+\%(ShnYXŹZS:_Փ.~f;}:MH5i@EZ^ TRNJў%j>AGTh֫"Lw:𰑛~e{{߭e8]ĸ}puI?ONHi\a).ؖi[[w_9FPFDk^be/e _?0['vT- {Ѓv=: qgfLw:ugKB|QJ$Αz kнI2F%d),eݓTy/D| QΎ H#``TS!YO(Orql w.` :y|zok@]筿oqyj%z"CktMͽ>ìx]~Q# t@`L}rq1~ļP|u 6KA*[8Y/ҲHkgpF ,p)FMP]m圻0Hp~M2f1xbO(IH7 -ж~IJWh GG^WK ~NYja ;@.eo&s'0W[[.2u?3G:qx։3-ʣ'_j=Q{]uLqO8#<{ŭ= ǧ/i?lcM7Mv:&]1fHGgcI^ ?nL8iԟMA2r^(:YRtL}Z@^m룿ҌL4*.aiޡ/G,97\_7'i$o$D ͷ/H0S>86 }ʧTK &v\ytK `H Rw^Bv7V? ΢n\\xCw ņDKW2 C*#uw ܣmg#ؖǎów0Of̭h}w_Ȋ} 5ފ2CCMˡ7 "5Sbi;o9KrQ҄<`u^K?/DZ=/;(Z`yL9ҸnS hS=T$څfkEt >@<(~vFiX:ZltX Aٟt[$A|P;NܾZ/Mt V+$.7O7;i (P9cB|Q@1۴{~tm X@1%\2 ear}+@ޙO^uN*euh,U0Emq VMw<8TcIU[WQ&M> }^r]$sOrf~ʀ }I7nA3*R_~0X(XhkqP L[i' Q6Eq'0șRF5t|Mnu jc."e"^ pբ oM.(E`{fMan>dzfF̤0Ru|*QRAsBQ4Z0rv"c 0NCgBy[u'N=| s;R' L1,6S mB Ҽb"dg]a $[Tv;+T ِdas J#PajV۸ .(> q\JLǰ1&;qfEQ}4i dt m4YʧZD{nNl=Nnxj΢0qÕKM D;褔)X˲gu=Z7^?Zqrv螉1/t,h[.!Cx&i=OϠܯӨFU8Y8>%! iRT9UpcFaa4دJ98)ńxFZ<z '"'@{NiPTx@~rUחD"vUSw_2"GFmќpRRNy{9]^Dpz,*t{lICyj97P)UY}h|g& >#vs-.%Bx" 4qZ/iW) 4)a6j/YZ|&H5m:l;HJa).#<(힔)F1I^\ۄF9b1c8^A7(ܞ[ys STʚSueHuj[`4r̡rWq{\َZ-^S`IF,"( =[{̽PMiB %y qd'x^2ÙՇ[$>{(:X'WAS.2hB͏Ppft8viS#[4GY9juЉ$_T9ፑ.fkjze& IAA44PnIn)"{ ӜW-n^3g*IbMKX[I=v&y&D__!s @s] ae=6(T&ɝ}*Jʹ5;C5GLLaNǂ /R8<"r+&1RxZ8$_jX{$ . 1;\sn/n]c˵ۊ"j |IW{|7t4;%147ĦF_a*9JfEd+r9̦#x 4J *n:iДBs0n#fLm p "Y; ?SrwsK<9^3|aGɺqRPEA9 (4M{/- :½ADrbo%=A/Mg~2:t"<sþyaY8O# ~SC<=w#\~#* (o^;S WDanV@*dkY!%wı%kʨșKh}J8}b!n1;;mao=&+H4p&7tt{U%s D}(F /nF 9>+;l`$>CmRNIׄ&V$9)WgzeOT h^+UJT%v ;L8UK+uo=`&YO۲s=0aCtء@e]GIo ')H̕pwɿ^E*OAq'v(;+WCNR1j! WUإdt%xQnÒ-y!n #"VJSQ[צvr,d<'XPuO.D @wʷ9cاOs53.9D7|;O*P2zYrb^&ѷ{fQ,HQ0OLÜL;rï7ɩ=YJ n kʬ-)1>r"9{ҋ9M '~&8q{@kĂ,ʾyMj1}n)o!/]ҝi;1Jm޹qF[NĐ6;Df>7w+[7|)&6fW5aԦhwQPC>>D`ƚdgĆjfyd`P:o5]N!TZY=4FvP$Ʃ5md;@ yC]>W%DP7@c;䲐uvv5<=p̱ P](~sEF(߿0<'} D]*:A'.wd{;79~.o)+qN|O.dvr}US2|?] 1xfۉǖ{c$t_¾SJtmKK@=ˎ ofxOX/om>I}W$k#8r5(` DV'PDU2sD/ԝalĤZU)mh7OKh؇02THiq4UB {g?"#L@OMBm7C=ƈKG7vFa "SXr.8^&I^wj{Yz$p-r>'iڷ3g<{9!E qU*G-pT.U=R~[c\f{^6ww{qQϯr"r1yCȞG4@1(pYd٨f% N٤-n[9όLL92 ݁dc}-1LwNɦ3&JO z jU4N2& {Mfסz ͼz)Yg朗%`k[9{4@vӹGzp4:^d!5ojA&'MF26 Sr Ӱc?ZoRv9 rQc+ t7[l-yLYOQ9{c-Ҧ~R 낓$Pc"ӨZjTϩ;JۍM'$kr]\KgjZWˀ,F́4d<{/CH2 PA3F{j>ydϤ88)nEӿVaIQ"1GUmeP7`sY$wzWWVr7,9Q^omH7xj[SX٤%VS`tMO徧ri<]nTVE~N+g B10zAgRjmZj4LnW8X%'; 1; O7 PG7=E @v] 2g$%Qs /F(op6&O%(D_Z@\m**%)̩M^bRsLejhݮsX FKuqU+Yۯ*k0|oH{O V3*] ؄^Zhx >NʹjaE戺FW& 9-ۺk#0Cti |OI/Lz1aI GU RM7`oDr\S،Yf`Jy]?V++rnt L^?_ǣ@vojrs>>a)ؿ' pK'KEOe g̡qd6]6 }n1rP`]024D=,%c@D! ̦rtEs"GPf˳D:[/BT; ڪ)Ezz )uR!% hi5퓰OqaSGv " cDgr 0  5xSV̊śF];[?!'4erJ0K=`v))k7I_#= k˖€X׼oDFqVUOIViS>9@ G5,gp2}InS4š C(x*U'>59n gmUR$"8{h!UG2if^ż{ *0bVm`냃wͭwgyhVBג@~_f?:)rߍ<^ø|kkvQ8Aᵪ}? oj&9ǍP:vO;A? ,yȎȫSF}qꚴcU)~vE#бC]ä(L6 "3h8$#Lq[@?O4OIF9C;kd3Ha<Z EG O50jbN#xm|^9&IlP{ UhL̬9h#ss^ VM[h|riϲ5CC^&I:vvwZ;{eq6_?S9C}jȆ~֞y1a.U4 䱲/WrHī[ryiQ?r0 %>7!ŠhK> )l6L]t`0+- eV\(0oQP:A!B~t:&'O#Rw9%&I4l=-/v3NABKV@]9Z-<7="9 F< G;J ~T#A@Ie<ƭ.Ƈ t)Uxbi.9(,w hߵ 3E1φ d)7>ְ* c (a90M.ULU;;69茁P- 0g6Ma o?ע&b@C\ EP#a4b {xnKNW:wZFm6:(; *OsZ<9WۦsӪxLp9ZS%{[qV;-L,aSA- ȳayy3*pT7ţ'Y=bT81H͎B=wҟޣ`dD <tiyG8a'F;Ŝ\<iK>|hJLӭi??|H5o塪5W_5+I׋洁uس3g6L'DUv=-)4dDA24󥍐 P~,=3 e,?F+);i@VFO i3G'.<(f6#qCEB0S%f#e<$A2F?w`J*p>C-U'<^Hכ;d@>k YJ(VjYrz:zŰ^p5̊'fz ʱ]y=h0p" [4>QvBa ]:nF2u2u`s3$v̓6[CC߭;Co,)7)ǚۤVwz|Wfqr96T_ [;0A%ct\6GPP3(j'R#34,k ,g&p8 < 'Q]Bu6Nkp^H:מ}u %^YP3 lV.U$TX|3'x kTŁa)=k.2c)^|;&0tH?kz.A=at@M#XgQ*ek4}Q1?=+%6]SoNNQpt($n%t3I:>&c݂!7eu4SY㕕ɟ\o*粓 +E]ZnWjy)| 0 MUUߺ3iX7ѡ]e;V,!~ nÅሑrW'6|;w1]ޥ|_ۧ'H%ZaA+(-ko%$bMWYg@rs]ZƔmrq4_LPdߧnަ$&tNH.ܢ!~|Y5kAm*AC)\Tm|(CŹ;@M$ u&~֛@_hN@|![Dok! QLjS޵47_ݶ-tJyZ`/=U*7taGv/lk'µAJ3Np;MjBi0/TЃإ'.Y<# ݬ[f]*S;δAq#=3A"\8-xV"V󞝼*xW6f'(܄ּXj{5͐V@%.UtxS_gҪ]UDGL,Ĉ&J1\+Xll:鈲fLxbI& ĩ0WJ%Y6$'ׂ-,79O3rGa( Qe>D7t$#|rI4I HZ[`FR\ge@q̈́^"N`$($ .#`a)#ia4GkI=`4Y畸wo -K8,a83=6>:~ }c27 3QcD$錢AH5z|% ):A<$py5byдm^bKuafSd]k4e" +$p:K8e@1%c4{7t^ Ӷic-\N' " R5Lc& eat{T5Hآ܅#-8pּY`wͧZr`m3:îSëF{pPiY ] ]"yGxg#wF (QEֆ0o:FE }Xps{vY#X?!~iOR;:Qpyn=¢}IE%\]֮FV;[Kc+a4wN#05irvDш~褳ci!W!# SJط^aȔ(2F$~@ts,v*"!-n6ѷj6 3$t\cG)tCxޅ3~Տ:NerrB^3Y(fetLbT5hhM_jLldMMtL 3BMۉ/ʷ>o~~ >eG  c( F7?!<{j.r峌 u() B}]Q/еߠ4vXPzH.I+ XAl&I-;YFMĺ6)% aX:i@ᶹtqɄO6Aˆ P{ɰ ǏR\^hUo2 RI}Oܯl>ȯt>'3>Sw^`r$YuI ?Fwd9Wn&y .LcتY+095 .Cl'YC+z*7Yqpnh+>9y('u%NeY0GK/_3aN<Ɔx;7.8@* Gj]%$we5<\Ш<7!qI9'k0Y0W..Qnuo{#'Tmy'mCZ_:9w]C|{tavNu'jokgsu~p%?wIB7IuUNa ɚ).6J.~Y]Z9r irj/W `^`.mSxXQ o٬ pRՇ]D΀>=ښDoAo1fqg f&ˢ++ G?(5.*vI@vfY&4JdL4IN<8uQ8iFۿ=.!xoۗWr׿n~F`GGwLa7[0eɋziKw8L*i0I{M(VV +Α;t%%ӟ[8 ' KW O*4*?yNTs9"Qe3#=[c6h~?"+9 ڟM&ɔ0zteE!~Ɣj<30(Aq8",F_%~V aVom;lݢư%u /I4.BGDu""iHB1eB jQ*WpKO K"73EK w Cu^١z2! Etc-:Ү 7YvebW> -T3"QnzS4yY$U 浗E`Yny{R4:=ZjMvnmjT_ 7rDus"P5`#9žɞqOLVޒ3"X1yf_??/$~SD@wImj-.A rT$ |6+]8w;?Tیs(B.ׂ8AF!b<8RWށJXebGmkJ?9ouc;A?B̭{&`}nBt[!\ΟM- p-_fwn{ 4-d+C "36f>O5^{(G]'<Lh%G$8b&OkI] hdžGB{n',TJCVIC5JR/NM:*iNfÙ!zr}Z|$[.ћ¥FVerBvʢe)BJk^,],࢘l5Ai7Q@5Wh ^t :M8ȹLjCS27 h<ɳoѓՂ_~ІZ:/Φa9G 2 _ ON lc#:Xr=w{ynG{_؞N2%(Bj6 L@ZW5MNg@Gdj@' L<$(묿v@0G=)x'-|z:DVXM~9iX6 # XϢex{2Øt1GCT),~.R R[E&\hAlczҳm{mk&*Y<z@a'CH 8ydv8uvjGAi,9 Lʴso.,3Qfn2 "Sdx]耦+m<0Tn r`Uc=g,? Fx49˧  JM;7A{_R>f$E0r T#n=Z?I8Qc[ ٺHz f mޛu2\^YBLڱ_&ٙ3CJaž(zFЙ*0̅(ːNY>]F+Wƻi7;;ۛM;,8IӥZN:w Hжn\:)(/} ~Zv/p,m5eڛ>".|fE0%-.C'$N|u/$zɅy|V㑺N zꢄ<ެM45YQվU֛ %ch/Tog=ċ$m9 >\001p+2ӌj r]R|К=yfl4b?Y#I QB.Ur F+ riV`x-gXGU>5h%Ld=`4 V`3H=n6=rN=3OMcXhڨx@g(f;ŠTVd3$Tl6.ۊ0A/kn'>B' 6&)W,HbCq16 7G1{_7NQ~ƱD]79oZWoZc1+d001Syv&&S,rtAc֞xC" @\p$ y0QTjcFTÿkn-@hP O/=/nWCP_;'h.ٮ`IpoZnr*N\"T'cTtWQC3Ta~oXTV"(oa=B~ $U L s,glu. g-G Ӫ*m"&9*ȳt)f4 a`JlPčV!" o?ac.f"%Gps5ZjTѯTצ >i%vAf#p.>4߿=  uU$:^^H;[]]a(ݚ)m3 JLSؼtP^ڼ{t4E@Np=*Bq?$-lIFr_%`Qoa.On2!˸G8;sf[K^0:ÏG6K׶26ޙ t@!E.«vD 8d(-=<ݚ5<)š ?:!z`ۘ!&"äsaai1$-f2<Z6&CEۖzb'4􄒣8Z+@*\+-J b#UNRK}E #$rp/4B-KW?l2NG܃"&Ud'y~v>z̗Biieٷ75\ԡZ٘,Xu%`_blAMKR墇ZʋoVr\wc٦>}Lsq[ZB hjc3d0$Tkjlk.WI 0bLU@˘c,XpA0_q@V O陮l]y9q,GmmM5`rL&vks8;i^tצqjn 3T q }^ ivT`C)+ <̈́ kzvc3N:&,d.%-*rҤɍchU\ "q8%XwtV, Ɉ!\ҥN$rrC %6Ra0OFmu9ÛFK"a|c'SPc-[ÔD%LS"Q)~}&)q !>!MJ&dU[{>#< pd/Xf/}1<<f04nq 7,rc"&-`3JQEj sT{#$` rW Fu,O\*t &uȶK! S ۤZEJyKˍ"tKX3d#c)XEd9rj,Vv.Yn@grN H#wB##2r{ K9-% Vaj& pM;c7堟^k.J KTc 00Aztl5{?{J[l~kqtBw΀-~HǕoq%]_juK!./-Qy$M1$a&8 Sfʈصѧp |kd̷iso+nm9>0dޘ{n9/F~OqY' O&OS_ʾI&=(rEF=PbM>t yS-g*?8ˡa(,m:Uʎl(+~Fnok`W?F X_=6D4^nfn0gC4m;j Oo_캔@h#/|KS=Taȉ!n_;-UթoըEgUMp2 3#4&iSfHcS+Kc(8H0;a9?6]}'r=o/8r.nnm$68>.8M'^ ˱R,EX;fcO%AUhfy#Aݱz 8]i@-iL0cBta4jZSw4T|͕7oz/:sRT@j&ԧ~GmdFxnW?"m߁+K?C_TbM8G`c7m'KxWQAJ:.\()i ! __\>ΐsݳdM_n2$R`Πz=ygj%x,I9X8Yh4iDlsy-v4+j32;>&ǝQYNǨE$8 \`d A/7lAON7vzXREd$TyK;iY8m/S8-/9v/checksums.yaml.gz0000444000000000000000000000044514257420603014612 0ustar00wheelwheel00000000000000!be+@ @Q? οYA>iNM^(x>wtӷOQlMd&.,w;&)m=IÍ~zǏ^\umPHlU*l/Qљa݀w,<p,;H`mL[V"9b܁78Oc7vOwIVֺuM2gwKT*JRiwimZϟ~;~v wv= i*w7A0))($g! E J8"8!}mO=ڧ S$$ l3"8׎ ҿ3e2.N> 'Kaβ& 8H002rߓ,&4] ,H0 a9x}!j=?d3?8Pf7& ,= |ϲp:Ϡ)_m&=pL G@p1crœ9I)K2q &%uGsDBǔNJ ,cf-d3I8Nip'U,'?Y{@'qpȦI"I) d08zBz xʫ"ՠIB+ LXxIsjU(M@Th%\gsM^nmmN,HgЏ,lV:$ۺ ?[|sv3'<DB- @< j g7`5 M9#O}} KjjFY,'5'|z8Qcgҽ&~uϸ:LL" pInq vVPTP, &&3 M}+IÚ2: `%Z0Q!\[CC w Vr oneTeM.^ &]Ӂ!'"yO0Ƶw'rpR.DX?pBlrlra9]V. Z2 H\pIUE9+ذy;>]̆JYBpg1 ~7(DuޘAI FIVxVquuj>X>>͂)p&Tdp$ , AxWO71[EUihnh֜hf U8`@"36F@Q7JQ0i8QUƷˠv||(Q@ NV3Pfϕ,EA 3'yDPf o p>Ȕ6?&N+""UʤEbNc>W!:oZnE ԑ~u/ZPX(ZZG u R)k.0yҟ,8L=Q'S&ظNi f|qdtB"q GQKh(+*[Dבm::/䄢єNZQF SQq͉ 1?\nBLX:ѹv}o}6AthU7gLnqrY. P1oFb~^ÀFY1j6ڼfܸ2J$֠Qka+F^W+_.\r; pN,  yAE1U%  5I.΁M;ok{ybLXqcb^99? ǎq>b4n2e%d r% C:I/S 9 i GaJ?g8ak#a19deٜo@F\<ўRrF8h d<D}_C+m+@eM6h$QC$JBahz?VjjYa.{/3Vߘf\ou=;٧ ϟQ ՃȪމ' T`}گ+V&aZv[z2=}OkTc vG ku\}[/^[g/v |dk&[Um!KjZ~x \Xl }nHS"Џ! 2?O?0$* yA `-'}Oȫ䀬ZsQRϔuAR/ :tW[b_a<{f͒ .7[%EP⿑@'`޺ɦl'w}f-+uo cpd:3$>g'qـ@x >eO0xn?GNim&;FXvƿ ZSCim,߉'BkQ/F=#'u"'Bx=RP3poN i$HFp Z-7ĈS~8(gX6 ̟URDpt`: *,_gV(BtgdFi42=FT!^Rsąc 1Z!H3GpglXLAA*ΡΈ.!tOQK 4J!8{4@Svl Rq`>0CYc!%V;d*yΉAƉa1KSڽMOǃ۽G#W2x!'o6}vg^ׯPsf~%_.z~Hi^l{vxzy=;i@ ΛQ9?&:7{J;ΰ^M.ڽA#~`v]hZIـߴOO^>uuvۯO;Q9`oO@8@Y_thс{69~oP2Q]V_@<4u!@;ts{>%eӬm0JA6|~}Ru^b DgjP?lC#J\+#ޯi@i$?@zI)Fb>isvssiPuXK6/iq0l$O]Dw9Pެmjqz!u7^;H Hp2 cK7o( *`fy˗<26$"++s;8i3oab[f;,78"F xUO_y_/:fid&O=v7}E}-:ǝ^'(B6@ڇo:w*R;1ᰣfogV@t.i'UO@ 'SWv P=Ia' ÷qxcjF1{[ӧE嶵r )=zK!~|xIu_3f@9okKoԙ"|5|I>AsJ<ؖ2I6IkCG4ɋ2y_wNgq ~ 2*cE{i*U qN)U :hgB۵` v`>)~0JOqMV~~4J5}A粛t)PLCsv^6p9.ڇo;^k{ُkN:Xî-e #` :$(k.~x'w *c[{[kg %U Q3 KG35A:Xٞx Oj9z9,H?xn#40jrIe[MQzQʎ'< aMDK=,'w 1749U?m /b3Gxܿ Se[FbN>f =|E gB#G?'xFpֆr~la4k^%= 7n$@h7m(@;蚁(4!(E +sR V7Qv @'uqSOh3'Gld{`}(+(,OP F|`D1Uh5ڤ+ 5zvS6m`YO JŽ/No:틋ӎ(? gױ8}4I ھ )#j]0%`JiN3X=5+bi\kx7 zQkCgԺ@XXiɠ͚b1&Ad5u *֤A$pv5y33HOoL IAAq#YԦLY>5mwGXi hDGۓ%7o:-Ư/~̼_w,vWCڋFۃԴR!^bT97nY#6#(fJz 7PП'^I2Z |N&}Pe8.􎰑coB*?Â:2iQS?Ebj6 /L9 '0G}rvyzW®]{u?20^ ɶz3:@Z^`D,`NMaDm4`M5'ؘә7 4lB)A\u"1yI ,I1=uިSyhLokY]Kyzχ>ts-]Pz_o 24?ocFg@U tV6=p- 81&qRZI?qxT֑aCYh.L<3K#ѴZ{|\#~3ٜz)ah!=!?&A~uQ5qy4)x128 wUm'Kgc/52WؼcPԙ*qPWO|a7 M(ӛ |Xij_J*)A6R98D;`aEP$Hsb|`,Q|";GQtS `O9E)f;:]E+z,@ SW*+]嬅CR]T;i&ih^~v&ˇ?0gy pxCgk(AbAi`A&S;06Oz֟g]ed!2M; 솕?A)g8^$=7$qFI&8dwEbw񎚝F6`-LHnJ8 S_FSz F{/qr'O"PkQ ]io꟱)w91v, ?4Y[[sd^ Ϛ?P?2ǒ&VĖ)]ri}!=Xitώˤ Lc*)G ^ }Öu{45,x ͆ꄂc\w?(#k3X INVE'4l;]W!UUnjFMo$pB2~dMl jvۤ n#/@oaXo!3IVR Tңc) ^I#z9o\5}hEKk g6̦}D_ja4: \¾BjD #vY=TH ?"y_ *;_tᡠi)ɜ{YaLվRIyt.< bOjZEjcݣߏ>(<Mòۚ`9H6!q\6P|o|[ӝg; Q-! C Q~JE'@rD/ƐQ_ L]]QI3 F&^wG%-; }tUc (?,IM:PF9.+ߧMBO&^a} 56I a{fcE{[[`hAqchtIH s lJ^}, e\[$1M@XPB[$ 9D,lvw CaJF\tz:* u |A6vvn1(hcX=^﵃ucLk\l^¢-mejزZB P>!L*EkP1ћ7MZ/7tG4(S՜>)ʤ: ko'#g `Yvۉ*4ӏʊqi7=C6!z14=)bWhAfQic/ ޿ 4^O+yFsX?q&5 zaTg1| h3_#J$ R @#&1,Q E5Z@wߵpXM"kaL%9I#OApZ@Wl((PɊ3bqɳM@h 8TJgpdܯL:G.)Ti9#t|+3<_~ga}@L׌+'&@0*$dtAxnVj*:4ɥ8PnL}^ P6(#JazRz*(FlP+CEWV4/*iҸtWn(uZ; q"MT*9G÷"(cʅd5@h@؁:p 8Via $N1͡"HɶEԄJFk+@:٠GӤ.?݃ 1@o`hnx:! S6bDXW*ztkU|\8Ȇ7^:26Fj]oaPkgt3EEOz0,8w8Pei*~+9|=7eF2[t\gMalf,zSmz5::-״.c&CCڨDgX$VyD,*ymeI7|DvƷI̥#==U8]H7Q0BRwj)5VWt+G5ذf[ }H_R'O󩍕Bvq|r3~}v I, 69 rv"Hh"t3ζqBR\('ezuJp-I{Vm qp2V8" )ڔ\EQޡY u x!L%YP8K%.(g#- c`0{c%i-[6S, HpGJ-T~FXu_h Z:Ы!:'40E.7W\}l\,Ug ∗PQ QisKi{MiRQ7fɌXn:A3w r7tpb !@t>651>x1vD~ ERA^^M(N|/&k粅5' EX_Y(_5TA yTaxsIT<S\)lM@kb 5ˎHE ݞ*B,^]n EL)?,{ڌ޹h昪l-㍜GP[Ժ?+`#/ Ru'f.7?7v*]Zݸ:X_o4uӫW IԩOh /Nuѕu@M':3pGt`6G"̔KALp 9{4,܂귪I/Ǒ ۮf$oU)[@^tәvb45$)J/V6g] 4 Js%(#q(ETאZό5Rwi +-z!uTz2?^l{[پ3KNb}UY2UZLV$UZRK-Wia+ע䡾ÿ 50_ƙ1t?\@`Zk2TX䐳`P0a$a['Gbm[Ʈ90ݹf'Nqp5~ZԤZa٢ֈ&*ufEIqvqSDilXA6 C TaJ ̭0qUKY{/_H>E!K^h`Wu0sVf(6+ Vv蓴J]9G*N9xBp߹q ]L/:nm)b |Mjz {NxG>1s3Hq_qg{/CL5 &ӕ2\~ZA*ufzkK\I߁w]G Q7);ɟK U)4A-= ۠ kHSOӻZf>}2E KLM xrz}yE 0v 8m$:4ˬ[|WG?UzVr0Zc5Њq/j}z(PY @& @|~+S^O^(BLTRPsYAX>g46=CL2vY%a 9T-$XT3EUyQ)8UhQ 4sE5zk?w s|q+D"6'm&<{-5[LA@2bBUnC'^(])^ˈS~=9W8 MLJ~Q٧ABꆟ!KEËi"$U|٨,j&9zGg&itmxk7oqjl&4K}T]@>TB=OOj1i%n}fQ %b$Y P bXϓou7Őᇪ mEmQ p8M Yb>MkpA*oFp1Y s:G;i;U.2PLmLvJa3V i-'ɶI;)t{%AE!=$ӗ?ڒAL]wNn]7cAܖ+&9ke2wO7*$3ub,&ERΩ"-X`"<͟a:5sLicjP` +0 $}HYǏyQoe(bD/O4i<$=H?aD YOРśZ#)'5F`M =kS2R :}=`|V/b mij&UAU,ŴϦrVdO0|2bWcߘ=80qtv@5˜QM0|[e] ^\4RVil`瓌Ƌ`mKccv\/A gMZi=h"B^EctfmQ^h23;v 2MYD%^Y 0 yMdzLaDpt(q%gcX(;p 6G)5e+f;U33os*wf eiŴ{O Q7߽q^qʷ:5lUsvf[p Ъ;@A/L6%o=?(! I;\n-Oz+ _-ECdAhJ8䠈_@C> Z'L9P6}߄7`An0X;m\eN\eSnjzŬX5gHGhJ#Ӽ dzkE)y!`3Jɭ *Pk o+kb ,Um<$Wl_~De# bUZOv>k>؜[!G*; .*9տ 9pҶI!S 킋r## 7ayEWӋut| ?n,we >˵'tb}r;(Og(&M8O4 ~ay[z]aWv`l)a]aJ0 "@.aƆK_}\t\=p$G^(R*xe8=5<`4馈K+jDۏS]t5i*Wv_IToⲎ)GᏐƔ Q2G눫 =*s(jysa8aSet?3kң$K,EG'SP^Դ7br{5'u4<ﻔ%6ɻs*0Π>6YV% 2\G;s̓jxEmZzuI@Q>V1iVeip*t{{ثFhaW+/W&"*_\e/*فMaI5WU+c?طow8#WoǸ!B۲(G BnE6؉H;$_4{.8JCck@[>K@ъP2Hsh)YLu*W 3 r㍮u,;g!-Fms9 }9 Ofw[mj J[o-JfŅPŻ, ĂgiH93j;`dȝ bt TAq\) ͼJul@5A@P j{I ^Nmkb}_ԞzQ{"!/|a9䨰L/Èy ??=}$OOm}B<7w9jjv|f_/ڇo;atiAF OqGJhĉ ռԨ3 uF/+ ю&- Ax轲?qpk攑t.h|5ǟT}?FLrYy >֖rM]Kh@h5 -.,wtrRjP;"G .ۏ q0VEZ+&G]5_祅$BɣSXBq`rD@"]tXH$NZkb;]1u +yOf2.2YrƷ 5fJf3+\UA 4}5дHO+'6ئGS4o-3^Բ۾b [ҢYx9!NV%.Z ]]!s5x  &QlAj{&|#+hOwnw&-&Bۖ8g^5!_Դ>Ě:bG ]L8X]܁iKV/x)U"iʴ }[-%J(y hKd+^ߡnC;7b:15 ݓj,ť/eÈ,~9dVҼYC}IJM" h.ptP`Vexr@=F< dׯP@^ڣ2܋g4mK"*Uu~_t.Gs_ OUU‰3^JУ4LNRx g8N>zH`"A^rEhw.^yd3NXV5Fz<ޟwq̼A8p]'O*3QW[/C$j17+ExT]䒑ŢѠ~h< -=UH8yDBi`x}y1MȕqwYuW%*۠N ,hBh Ug#`ͩ-&1{.*jw ;Q;2KDP%@)SlK{ T"5\ɺޢH˘DO4pZMpQ!{i'ES)$[3mOW\exuL.s-?g˼5vm H],e׸}A"ὈL̢!7&Ab%owfJl[z;aA)U $J_!\_K1TVU@ۺ?@n(?QƳȗo5z TgvD/I/7jo..i,_SV H!&#!s\iS,`) :K` ][Le7It#leUͨX+F+Г½_Q_\̙YEh;D7K݂;5,ߖU,ߜ 8 m .;¢fл0nK `  5nMÀ,@Cў_:Kɑ&]NB15Iom]Ϗ&54#W ǬXpm*ueG|_@e#]neb %=`b6jy7ח~_+x:qҗ?;|iqQ޹xӞ 4~Z6s-!ס;M@|b؊F]#'\'/5]-ԝ(wHW 冿eX>P"btt9ijhҥxW¾ Z7Z?@Ok=ai |Ht=jUdk|ysQfBʺE<^i!ȃvjkm99:z0Ec{jgIIޖI9RyWBr4 ݨr]1p--xzĂ_H>P8{ DzF )+ʛ[ijgJku*'ˮ# FP^(`N|OOǮv(.^6F#/<13? hNc~c:+nw̳:`TklD,#kWycpÛzL?M@褟\tDZqBFmH:kc{g-X}VpQ^pjnƢ`-YZaUV {|R tA)*rU|q(pcq="!2W|ٲ6uOMM=8M9={F|hOK5CS{^R{)jbԾB竤-19mxFto4 u &bRt(47yWo:uH1>ai'S?k#sh&F1ѴRNDoE$](jR98UOEO%n$TE|%Xj0KLJ%`Y͖0?Gkt0yd?2gu}uKÔHM2UQY_/0cj+6[_'ԤW-RIҀkk3[pXmID1.cTE[ܪW#v|/guԩ:^ͺmY?_[L(,[`gӵV(kMlyi1-J+,>ҀsTsipUאJOAT彯z*j:Czfo\ T6vX[PC,'%< ̪<W*qyAB.#Va|=(d_pI[hk98< \տ&9ocwFW/uUܷHAF9Tu*T4]f"O*KW]5OU=T7%.Ңe/ب}, Ż)Wbk}uojd#CDKRrx=a"hpt|&'筿VX8č}{Zs5/^qOdn45I((V"(ӿ|,F|[s9`b2ZJilH N8!D9g,%PRrkR~’]z2qi;"j#VɢO DyAT MC`,`7MNhNL[d i7&}I|m^ oŜl)V waFMy3^*'ӗzC_/%x4r%2~j]gEc(zѮ*"0/Ϻ,rMG0H#`z׊M#|A@SN>R_:!-??/%weQ'*屆<ǯ ^ш5< XK*O*Öo28&{% o#8 aEưO>Mt,o0Q9@[4SOG>$ȯ&Ss#=GI"%ȕ0Mg0'i  L}yguދ΋y_|P([b|bL)/Dv\K( P4IgDE e K։ ;AefdzGnڳmfa:¹ѳj.EζVYQlW^\qjNj mIdH.&Z)^~c2&))d3,&r}k4":d9lzUɫi1d #yCʻojR(ȼ IV+{}8TϜϲ^G!"M} lgBZz5:?UCKlz@v_xBB۳*}bDZV骅a QK eєM?3b`.#о(c$aWkMxdbdF*2 ~`f̘@o}JH|J⃭ۏۢo? &uƹ vK`g[-XP[.22orގ+ kd)pK=QV\MƑ`a|4o?pp.OB h>b*݋i%BS >t֛1- 4qQ *9e!x -dQi^_yb&0k‰(Y:hQiZw +VWsXPUy}],>lF~MrB0bG[%kWQʩnUY,CIEFAϞz߼d4+J5+E4df‰6maN4(li;',wA{:Α]E"lTiv`9;)kN2{”}sc#+;?>XE>;>;٠>ٯBO?wݓiI?[wc`h>tzr^oOX>:L׾ggoڠ5F;iq{zUIa>VQOc$EA>̉ъÛrefp_36șbb@065Ь5 :$Zstr_zדʟx<=qP0,_u Z-smU7kFZ/i7$U6e p:zyAKYvT *Q>R;WqW$ȿŖI.G {!?f`% qebWR&C g1 K2 ,@׀>Q3?j6CKP2G MlD6l hL쩟fؑ H>S#?r>:kg9{lhYс@~!] z^B6O?ˠ o+<L7Ax}${V*܃՝[4J'Js-.kާY0*h E9/dw)P`olhlMݫ5/F̖*H/b^Ռry_·p>AH.~6(uFTQJ7pVS˾|arPPj4ii@X`)6^e]%ܴ3AV!1!g?Xhpo>KiRd'.Jf/]Aaj7{J#(RVE^!"ĉFZLy]?6u'Àji,*PV5VE7쩅kh9N4sW"γU!o:Rf%Fhং 0@yh;|CUg[In'r,_-tݫ< IE)`}d`,eÔ% $(iD>Ӹv<('s[(Xڭ-g2-_yy0ද5-[)IHጅV#@^`O1BW:3lìCƞR>n+/AB5'l7bcw w\MV-R@] >3֖i2L=&ㆩDCO~o &a =$aNS} Zg|43 *hT{U5݄CuC钧 ۬-ERwU n#*= <U^:Nk>ib1m$S󐧡 .f^}ܩJ`™.bHk v7ӌ˒pƀj (."[ LïqL?Iq^{,]GoDd>1"3UhÝMT5d!(rV{6heؒ CZUVo݁Vg*UZa\Z{F);zIe!hLGcukfvQ_U,gVo4Z{y+B/jwb˞8Tґc"_N#gxP'6 s#yj9,l66lA⍼0r͹K"|6M6(ye2v#nF|EzJ#Hݷֵ1Ec*vz96W mNCnoniY' 8_>@S\ԏ e m,S2mp0tVXL6dzJ]+8T6`+.xl #O|Ro.\U1vYւfKB}pv) r6#1~h`CPa0u0ULU=N3NnPYrh:#,Jn  (p4pSy Ag{ۉB}`^x~u=ݹy%qbDk [乯jjJm6 D̸f%}58s~> uiw_T\u)0We%-ifSq.[jV4͹Ҿb xOݳF]>Y&E3PX܃u"eG '}3m4UCos>_S>ҹZw٩K^( icl8&xS)PlMt/dG)*ojTG_/W5j^]_Rwz,].ԯNHV+YW!zEqkochR]SR^!T|١sB[Urj%5GQݯz$ os|Zw|_+^rgWz#t ++ 8}+ <+;*;*S/x7q80/gG/2ހC1XcXL@+f a& 6UBN-_G#YMoz$(;|=:h7Z'.M1Mˠt5͇1p'68 . LpVgG H'VUQ݌ @Ծ8XnE, d> ȫay0s$J7ocX,F6LHF{S#LC9׳ k |t $\@íPb%L?o'u$͒h8ձdAfy6o.ӟw~jLA#(j3?MFx|'|a$ /zZ%w:B``[Z0SYX Y' &>g+KN+i0gUZ=$@6 &]?n/AOf U 8h^Ik (9; $<70K[h *AZLzgpjMI/FtG|2a=W(VOU%w~v+aqi'P ;gGM}\8%\ll} { zs8OxJd_rtP$Gil4&d(iJK4v~aN- #6m0QTҺ݆zS9c&Ŗa]iKz;xn)K2<ԍn 4n1AB\rf|S X1Ԥ^^FƳ4p??K^ mope/9 S Su':'PkyM8rkiWN:gȾD-jy;>]Ԧ<ԐE 4-wp~h@ '6ȶkC pUbCQQ_ۧQ gZ|60]VR/HxY}KyBrRu 4q_yfxq;qVy`ةUlTjz"Çy+.""vX ąBfHv~gM[AxAhx4*0B>~;NW+]-L E!%)llAiq{ބjBŵʋDu h A"{왒 > W/]2赗x$ժ㸣r' +bhT;q;Xtu~&)4e Bo:/~wJ^_~[1o)ǧk: KΔOA{Gח'^|PeiQs8)nWsNGzb,qI^`]j'ZGASmt&G U+s1Q=&SYN#4Mھ)[K8p*ObFyi JSh&ps5X_WKL"OzAS^s3^VQԔTkwwG/Nsg;j>~ClT9[k5޳8 ^&Lو_}YbY6 6kL {YK*WY @A~ъq>*/%T0nj_j@%*.a6h} ^mCn/ڀZIFL  FM /ϧ ̶IhP<0~4Bcg/>'ak%FOl(:zeae'쓴h{9䞌x 3){^߈ڐOXл3Lz 0{ HmOh7i/{ %N0pІ?{hԞGSY2ˌJ =bLɆ:1ffȢi0Ʒ&Oz\vxuk\6A~)%R]L&QݰUlȔ1c PjeK }HQs"qI0CzeHMew%lc>W}zz!x3}dB?3ۤFX\ (`y$7a,EQx .MReUPEM]s0h>q',#\B$":pH!Q @Rɀ[PMS4VKPkO{Bx~8 (z,m&.?{D+OQ8̸$!@|&$lbf_zv;`ng]mw`f{9;qC*JRI*cЫi۩jK.ǯF 9 |W%Ӷe3K ڵC3]FiWF m_cZ7ȾF䡨P~[EE ?ZoÌI`UF0gDIȰڕb/K*pd3u8Tb+fJGkNE؜\n'X0G)!7I DKXܜE;>`dfW /?j'~K]{\r_JFhm!lQ-)m6=;ຣQhQ}^ݮ[cFQu ( RlHQs[LCmݭmH[^تgҶhZ6hNN/,=mv:m$C!?fS6Gv'<KluUkz=K=ٮ=Z8, $WۍP]a>2r_IGfo=kL:*BLyԨ~DJĞwaɸK^uoqv19|rv!& v1# 3SaTkUg[7P7ַ6@Ay4U [Vɿj0LW3uVkj ߣ,`g VнrD N9w02jazʹiD3{^i71^堕(*qu8YnTZI͏1t[&K2ԇaxVn8涰Fl UfcE1yi}a,;',d@J؍ t܋a@Cf) BoE 71$ug\D#i/SF>PugF8PkGֹ`8T_Z]z-pF7Ыtx-{5@ GL {0`L~EOĊJ&A  ©m9/hx;;y﷧'?7_4^Yu}|^hu|urzA<g=mS| AǭfĚLJG^P^Vr] Z'%lN^7yzO^6[i=8m5Nߞ5E "kzgQN~9n";jk|GC)r%H|^DEe`"kAr/Ыs qW붺?.'yow2#g_׿nAU8MTL7Ҁ%>W?7Op'`j`=X폂 O{ 3_Q3޶_7HnP(u.h#孎=5Q5gTpx^Iϒ^iH$3)A~:S*?,%nhȀEކ2`iu9HUo9`U5IFwP&[RKr8. ~Qv~Qۏ3>tB" $Hɵdu2ZI&e xεYE0-j\fAdgM` s 8KR3Yw:^޲JhQσ(l^0 N(E=vHɧy R{C܅|iS@;Tַ/&Jbty^I$DSk1]fm$-Jܴ|&tVD|hAAb{s]vٓYbUf0?OAHeoU=UӢ]_𽻔[A{>ow*1/)d&3Buݨ. BObաwQ(RgM<:#ZY+2T> UU8>+-S|mI'X9O8^`0) @+.^dA."tkkf(t$CN40!/gffz =rDFBlڨ uߕ] & 6N ѝRđs! .nTġJGop.(OL߄>뤕-R '~2Q'߃@n!rJAN/.dԇKCS{mC uIr=,;Zʲ(qVbi2ۻm &wn7-bPYY߂%6w-5]iG\OwzI$bFLxS~ &l@ڀVp3@sGV[~[6f4Ҁ+ut}q~lðGG' vմkj`G꣞6j4NOONfZfJup5]Tܢg7o9<[Z\X%>caF%_eyuu6_Xy<5QxI?ݥ\.7~uΙr<gN3P`%KV~{oUn;7c8css^llog38z`89m4C-G>ie|: ũDY@M%06k dz7r$Y/P{ zkL:WE4Haxnez *bx6C) 3\]X,)(Z4"R/4LǃbI tߡvK?^D8=u ftlXr eA)9ӛKD#3d(!eǗ0 :f )_$qcGx0R:S ąJ%<]]3Gudz5| SunHHA#L+!%EjRIEHV0%9]́zRV'xxy?~XrT;pUx:*3 =M M/m!VSwk ̕{fkeeW‚'.l(0/w>Bאo{2/^ \M+z>qO&m|9u`M° Y#j;m,̄F׽Œb O @{ՏTrvaktIa=g n׿Riŕ\xx9}Z~I@/1VJm&O;j7K \t]P<)+ dI95MJX]|8 O0=M >gJ>I.f@X3]DOLRDړb wG} 8ӵh"";8lȭ۵w"q&RHʭ ~lzl; ){ic e8HcyjˡDIpL~7:|^R'Xc {z8r M:o+Ζ6uZÊ33=N{kNyxJp"?Z7?()oJrilV_±b.ͷB}V QȂ7>{o?"A<^rNKeHZ);^04yX[$X)ᨭL-P4=USvE"磻QT&JN9*J` i//K`Y] me k/XG]UO, 4 ?E #xs0C/ꀏǃy,6r o׊+I)5"!mS~?hO+Mt#~>--k 4XΝn~so\(m$1@ٔZK Ԯ^ClεoxBہl[w1 1L`)!+MXHL&6{IUMUtk[ۨn(ѵe*\B֤,|ueײt{oꇯO➛PrlC{U§e1MVPX\nΕP-]-x㘏1Sho[b!/Gcb(H c0OxnZ<ʹADI &w^=+`~|?0 $ܳy@qQ:v9]0)0鼙x &,~4_mPLq?jE7j1 }!7oQàa T4,QKwS6࢘=[mk7qVrwebFԃDwiWAFAr6Mcᄋmqc#oG6b0EyJťwj5Ӷ?7ij0%B-[^8M_cْ-S2-:/;xp 'λ?Bu/]6>-SLv W(sb#$ĪYq9!w*JB28 Yey_cՂyNJtJ*FƩ'θ{d7xX92giqT=8mo% ƅN]o@=cSNB+3k{[SbhR^v_ʃ(9TCgjY+PڭL~%0h9Q]gK,G%e$l> yWۄr RM>?@KA{ £-%Btkh^ba~sŧ̫wW-rHJbfh g% Ϙ Pv{Dbz<%yk[z\1uΣ"A'/[C~>1 q9,4#2=A@yфHvz9I O8 -Ӊ+ 㼋. #;2jA8 -3~ w+aٕю,N=wV*LQ`p?FNfV̏X5vSuq߁+mͷZDzL=0PNXUrwi="iP538=(3XEJwF;.I\tLij@Nm>8m@WbՔiڧ/Gw%KU\鮈sxj`3p,pHh_ύti[G<. yGo.G wR6ڹ)ݹ 2RbWw>٧vY-Uyh r=3JeT,E6h AĿ (ͻ}IbDE>;#UBcrj`ڣGt>dClɈ|Sh Y6{"M֑mؕ]_|fPJ4e.ݿ0zjfWIICUmo)OD0C5s ~FPy'7[?ܗscrzuK0d-+LΚXD)U}Xx@$^j7%PwH|0Җ *^W˓^> vILc@)с1v]oo'kHj fI3II_XgCq9ee:2WWh5Nw- `N5P'׃ z%9|2ZMMOZHL E,4.-1cssnE? S\s փ 2Fbo ñ*ŕWe%/a>u tz 傝Vt.LMvݕء<؆շfX~8N\ڣ0]15 #KrI1bt2 Ϭn0Rbll˺67T6khF?Iqsnk7("ޚkM&!udx9 &3d="L142@$_ռI57ip=䩐|VDzpv]}EӢ+`\ֵistz(rsZIKuG7`Ks*HGw C萄tgN#[g0 ""6Iott3~s[ ݼ$wۘ\~WWSK{%}og-v4 i|h0\Yp疸᧺/q_z_q8R&tcYQSxeaD^Ġay8brmc &<]W/oɍ-KwQP5, eX-̀$#,n -F dRLxf&kr"] O%9i6y  tyq\I]~2*cJgւfu%#(YIkT2nX+>o͞aE?ciHwR c :iuR/(5gpHե?C֘ϸ ҍX/;iнaK[^ޏWkZ1Ӳ3V㗃&?a0|Vv 4-o/͔!:Yv1z$T(;|< ڻCݴ ?ZӊGЏ"!%$S5#pxoCM w$˸r]2b@B*}9mz%ky׭zOCT_ⷱxH{Js_?JCa>jCYz# UWff B'2 Zg9(SǏU.ep/ T¹'|ьdŒ4Lq^n5Zk3!/GG9<Ô$Ƴ,@5 ~5_>/hӲ^heY,?k2%F+#PSm/&iUH|$,D~o%VZZS݅:e΍z$ރ_Itv"ٱ|FOB4%[,+DX2( "YPܘt08{UW뵿^]z?JV$F_52=+~5b[*0Yӷ?Zu}kR`-̾Kzgz@I\ c̮A@6_t9h>)|a|wg4i/tG9lS4uVнrD9T78`}l#?e@#zWdR.'jWxu2Ʊ^ #8SуoL> 3o3XhDNt&˭ e_UMT-_9cnD}j~%CDShq?Et>ìs,)K-fl5M U g{8e|S6v9PUrKE?BoonzLo%++hZ]XsWC.C`W|מO]4Cpf젲 zq3(SZvmnW e,L;=hÚ}v 5WOaE}u`2Yp]&TYC|'#DB~+-LOE\\Nم[)vM>@8nT=@* oqSGv}eIK%|0X[ .hX2(V- ˑhr! #^x ;IaEbI= & ^,Y wO1>Z "i6n8p(~~R^}ZPYr6w=PjN>`?m/xO}=q*+](WQdlA.~Wn8q~Cr𰨋ӓmY:KCo"@ X9?y#a,Ԫ[?eV@?\^͘-: e g{f2 /XJٵ? P}8g]ЧA[V@o. `SD;=7wۣ;aUC̣AVz`s9qTh#A=nU;'Et+tN`Fy 5`7I7$;ODIW XX)7 pQ>ɺN>^o_:,Ł7C8>A{/ScLqSR ph( c|Ɲ]“0A!0WV?6 4J0 2ĉpZ!^7N,Pj^`+Vr)yQZTG* 3~:'نW}AJ}?td8Ҷ[i@]V\CTE$)W6ɦS uTH>7E28o\SC]MjlOCy52W6[>H fw~i9l}5j 1懧PT7RG>Dlv{=-'ZwYD40IH 9 NцIY<H +UIkDtsCqunA$jZ+y0mJUITbzRճT~o"|xO\ Bț 9KRYWo<(*dǜ6KOIR_~vz 3A5<uz>WRh*VIpxXEӕfN/9gq?m%5+L WVY[C5t]s~M؉̆EX³(s Ahk絋8m wjAI&([ &h*YQpb`]& 3=x=Ƌ>y(?|=վ&3lCGYB _\=^)UƖ'SLQ,aٵ PZt@dpc#_,.ځ'J6G4 iq%Hx2qǼ‚s%47 ʔ/tQaw a@M~ X d\&]i3ղCiУd)i AZ!C1 nt ۨy`h& n#Ǜe4Yx|Vvd ΊKV@.,e=aL1(b   &T@ Jր*?-Jq*%#otQ1WA\@eƁX*|˖Io~Lǃɠ0jxx.5 !QeҨ~W*RN_Z%ontfFl0aӴlkjSM,%\)7QaiyA<3M8]yLA\qpKCkZi3)T88j5:,'pkYۯgWKg֓樴 H!z2 kܪI|[.)obL旡`֒˃A:N ۓ8tU BnV%v=)k#XvaBEW*X<몥 V_ZZɾT0ڜ) k9%Z/ 0;.k<4$n*Bx0,nSZʇ5o勾IMP-zOwjo[ƁxUvFS벑vq^%6[yTCk‹#]eKW1NEq=;Ɍ ?$ ?{&<Ih9-])ѾR~?]f cto׊to$]m ;\É|)L!ExQ̯{>aT-,ME:#$XJ֑Er?LxayP`o\|)$7VJ#DB/K+/a1H:Pt$:Zᬃz_!9ѓ, n "~<gbm^h4{R& 9GE̸/rB|1+&'vy0'e"ua3 yUz?=(h' >O@p5kēeмv!7}w̑TeSDs4&Y T qA]ּakBS,ť95"VXz-Y =nNL,Qu<P4!ha"}ڲ)xEWez z(M(0*&%6v ~O_Ip&"Igz$r 0 爉 ,$MtRr(SXl&T}Um~׾ySTӒ_.hzҵ%$TQjxj/}xߩ+X{N&1H*:E1״ Ik͝:E' ⋿)3SߦYs3 X3љe^'WSrcYYQlaEv+6Ѕ3>z51sQ`J.JMs vMZF RtHG?P٣'ak`n>Cv Jf SB-3  RMNg]yQ p -Q2FoH6L_b+9^-D.⣏ '/13xTWa8 }H0'B*c^D'XlmV84 ~/nҬY23aYIGUBa{_)>Q~p|<~إt "\c9g;բ"j&cj6^m~ŽϦZ.CɅ0)Q9rBH9F=1[ì`y)!e:vg8J`NXa.5KfMn1HRq- V 55FglO_QyR*ʅUSq6  ha$ i"XZSND[eb-[TqG!"4>GqIhyѴKz|xc;ccUf5 Qr N ZatХ$U 61\KEz/_Ǩ jHEX"К p)豤H9HDk)sJ(*~m-_Nj2ݡwg1~KǐXbVV7_6Zy".|*a jba⽲xv f'vy>mO㰅 =Vf2;S'+GƬo[nK lyXv3)|d5 VTFpQ˧c ~"*=ӚʆmVpA.f~j~fg0Ib4o FEZ,1a,$Ւx7%^BqYƃW?#NNF/eRGɣ7Bey' aW[TEY`:vw9cO_6_O8Ii7V*pGu K/VXWe||FmԌO!,c,hK>W exnP6'x;@p6%: Ea~D~S>D@XcE]nV|y͂nv=BB '\h:5ie:>ٵ$4Ě."E.+)q܆+Y^o KJV}\?‹Qpvc:5} yjXƠL2%Y^'?(]LVR0^g9%y6σ&h@Fgdϱl)w^ }!sx`Qx)`άW]tngikؽ+_H _п5]ݎm&RLIO3o$t5<2"*GA7=X “~5N_!^hB̑8Ylܡ>Aw韶;Wۗ~|xZ;#ct||p)⊥LL%r!DB9͘k#i͈X*F + ]+IOM*.y{H:Bf2^ݠ7zb|~ك2KjJz yᕳA5z^IV\=$I܂ySL$c ]vK3;!X2D2^H`'ξ8 FiQQ$~mfgǴ=Hf!06xSgB)O Jep/dP7[ +1A`| ~?+Uq(3,3Q`ww|^c06О?Gluc&x$cmtYL^Ǜ^nAU!&uo{i+J-:le:mt\e2\Tf9Qjɗ\)zM8[ޛI4!@(1XwO^KkA'ʸHA\OE $ۭ);٦̞.~,Sl4.9%e՝$W%gW'1n/b 9UR-EϢ-Cu+ck ~nZб&p6RĶ{(IŒ]|9tq+l2~ @ea\)Zk2ӠF6=PĸMD?:yԄ}uꌕtIMPGAL~VVY *+^0\[EvG}~~Y=W~ `ʫF9 )1/ξ<Ħ_14["FF~/DW%, `S!? \A}ehȫhCKA+1ͨ(Q}xPzapѿ'RfaNO/K3 2">CyJK14`r!ß_7]^9PʇՋ ݫݫ vk< N\ّ6j^4O؜w{ϛ]6 tFN=$()zx>n"`(1[VQO+3>Q)JZy= 0?f|M$Ǣg)ݽFm4`LrB+WRnJ&^}2EɷSQX){aaUeK*tɷdt=^xegwek"b׿97q#]=T4B3P҅[+$g&w$ED&r ^4{rb%I"1/0 g&l%{w/$"("K GZwK)vp$Uxm:9N rMNwK#gwHu>ѓW6Y"k_׿T-pDchecksums.yaml.gz0000444000000000000000000000044514574364676014635 0ustar00wheelwheel00000000000000ee;R0 "ctt@,*&ǤQ+[vy{z܏xJƫ h 1j!mlkfQ5d=ɋ&\H-HLK'h쮩Sjwkzr+Clh.*(F?4u!R]0.?3OdFPK!äGshare/gems/doc/rack-2.2.4/ri/WEBrick/HTTPResponse/cdesc-HTTPResponse.rinu[U:RDoc::NormalClass[iI"HTTPResponse:ETI"WEBrick::HTTPResponse;TI" Object;To:RDoc::Markup::Document: @parts[o;;[o:RDoc::Markup::Paragraph;[I"MThis monkey patch allows for applications to perform their own chunking ;TI":through WEBrick::HTTPResponse if rack is set to true.;T: @fileI" lib/rack/handler/webrick.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[ I" rack;TI"RW;T: publicFI" lib/rack/handler/webrick.rb;T[[[[I" class;T[[; [[:protected[[: private[[I" instance;T[[; [[I"_rack_setup_header;T@[I"setup_header;T@[; [[;[[[U:RDoc::Context::Section[i0o;;[; 0; 0[@@cRDoc::TopLevelPK!B;;Cshare/gems/doc/rack-2.2.4/ri/WEBrick/HTTPResponse/setup_header-i.rinu[U:RDoc::AnyMethod[iI"setup_header:ETI"'WEBrick::HTTPResponse#setup_header;TF: publico:RDoc::Markup::Document: @parts[: @fileI" lib/rack/handler/webrick.rb;T:0@omit_headings_from_table_of_contents_below000[[I"_rack_setup_header;To;; [; @ ; 0I"();T@ FI"HTTPResponse;TcRDoc::NormalClass00PK!ͣ;share/gems/doc/rack-2.2.4/ri/WEBrick/HTTPResponse/rack-i.rinu[U:RDoc::Attr[iI" rack:ETI"WEBrick::HTTPResponse#rack;TI"RW;T: publico:RDoc::Markup::Document: @parts[: @fileI" lib/rack/handler/webrick.rb;T:0@omit_headings_from_table_of_contents_below0F@ I"WEBrick::HTTPResponse;TcRDoc::NormalClass0PK!ֵNNIshare/gems/doc/rack-2.2.4/ri/WEBrick/HTTPResponse/_rack_setup_header-i.rinu[U:RDoc::AnyMethod[iI"_rack_setup_header:ETI"-WEBrick::HTTPResponse#_rack_setup_header;TF: publico:RDoc::Markup::Document: @parts[: @fileI" lib/rack/handler/webrick.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI"HTTPResponse;TcRDoc::NormalClass0[I"WEBrick::HTTPResponse;TFI"setup_header;TPK!&NڧRR5share/gems/doc/rack-2.2.4/ri/WEBrick/cdesc-WEBrick.rinu[U:RDoc::NormalModule[iI" WEBrick:ET@0o:RDoc::Markup::Document: @parts[: @file0:0@omit_headings_from_table_of_contents_below0[[[[[I" class;T[[: public[[:protected[[: private[[I" instance;T[[; [[; [[; [[[U:RDoc::Context::Section[i0o;;[; 0; 0[I" lib/rack/handler/webrick.rb;T@'cRDoc::TopLevelPK!jII%share/gems/doc/rack-2.2.4/ri/cache.rinu[{:ancestors{jI" Rack::Auth::AbstractHandler:ET[I" Object;TI" Rack::Auth::AbstractRequest;T[I" Object;TI"Rack::Auth::Basic;T[@I"Rack::Auth::Basic::Request;T[@ I"Rack::Auth::Digest::MD5;T[@I"Rack::Auth::Digest::Nonce;T[I" Object;TI"Rack::Auth::Digest::Params;T[I" Hash;TI" Rack::Auth::Digest::Request;T[@ I"Rack::BodyProxy;T[I" Object;TI"Rack::Builder;T[I" Object;TI"Rack::Cascade;T[I" Object;TI"Rack::Chunked;T[I" Object;TI"Rack::Utils;TI"Rack::Chunked::Body;T[I" Object;TI"Rack::Chunked::TrailerBody;T[@(I"Rack::CommonLogger;T[I" Object;TI"Rack::ConditionalGet;T[I" Object;TI"Rack::Config;T[I" Object;TI"Rack::ContentLength;T[I" Object;T@'I"Rack::ContentType;T[I" Object;T@'I"Rack::Deflater;T[I" Object;TI"Rack::Deflater::GzipStream;T[I" Object;TI"Rack::Directory;T[I" Object;TI"#Rack::Directory::DirectoryBody;T[I"%Struct.new(:root, :path, :files);TI"Rack::ETag;T[I" Object;TI"Rack::Events;T[I" Object;TI"#Rack::Events::EventedBodyProxy;T[@I"#Rack::Events::BufferedResponse;T[I"Rack::Response::Raw;TI"Rack::Files;T[I" Object;TI"Rack::File;T[@UI"Rack::Files::BaseIterator;T[I" Object;TI"Rack::Files::Iterator;T[@XI"Rack::Handler::CGI;T[I" Object;TI"FCGI::Stream;T[I" Object;TI"Rack::Handler::FastCGI;T[I" Object;TI"Rack::Handler::LSWS;T[I" Object;TI"Rack::Handler::SCGI;T[I"SCGI::Processor;TI"Rack::Handler::Thin;T[I" Object;TI"WEBrick::HTTPResponse;T[I" Object;TI"Rack::Handler::WEBrick;T[I"*WEBrick::HTTPServlet::AbstractServlet;TI"Rack::Head;T[I" Object;TI"Rack::Lint;T[I" Object;TI"Rack::Lint::LintError;T[I"RuntimeError;TI"Rack::Lint::InputWrapper;T[I" Object;TI"Rack::Lint::ErrorWrapper;T[I" Object;TI"Rack::Lint::HijackWrapper;T[I" Object;TI"Rack::Lobster;T[I" Object;TI"Rack::Lock;T[I" Object;TI"Rack::Logger;T[I" Object;TI"Rack::MediaType;T[I" Object;TI"Rack::MethodOverride;T[I" Object;TI"Rack::MockRequest;T[I" Object;TI"$Rack::MockRequest::FatalWarning;T[I"RuntimeError;TI"#Rack::MockRequest::FatalWarner;T[I" Object;TI"Rack::MockResponse;T[I"Rack::Response;TI"Rack::Multipart::Generator;T[I" Object;TI"-Rack::Multipart::MultipartPartLimitError;T[I"Errno::EMFILE;TI"Rack::Multipart::Parser;T[I" Object;TI"'Rack::Multipart::Parser::BoundedIO;T[I" Object;TI"'Rack::Multipart::Parser::Collector;T[I"Enumerable;TI" Object;TI"1Rack::Multipart::Parser::Collector::MimePart;T[I">Struct.new(:body, :head, :filename, :content_type, :name);TI"3Rack::Multipart::Parser::Collector::BufferPart;T[@I"5Rack::Multipart::Parser::Collector::TempfilePart;T[@I""Rack::Multipart::UploadedFile;T[I" Object;TI"Rack::NullLogger;T[I" Object;TI"Rack::QueryParser;T[I" Object;TI"*Rack::QueryParser::ParameterTypeError;T[I"TypeError;TI"-Rack::QueryParser::InvalidParameterError;T[I"ArgumentError;TI"*Rack::QueryParser::ParamsTooDeepError;T[I"RangeError;TI"Rack::QueryParser::Params;T[I" Object;TI"Rack::ForwardRequest;T[I"Exception;TI"Rack::Recursive;T[I" Object;TI"Rack::Reloader;T[I" Object;TI"Rack::Request;T[I" Object;TI"Rack::Request::Env;TI"Rack::Request::Helpers;T@[I" Object;TI"Rack::Response::Helpers;T@R[I" Object;T@I"Rack::RewindableInput;T[I" Object;TI"Rack::Runtime;T[I" Object;TI"Rack::Sendfile;T[I" Object;TI"Rack::Server;T[I" Object;TI"Rack::Server::Options;T[I" Object;TI"Rack::Session::SessionId;T[I" Object;TI")Rack::Session::Abstract::SessionHash;T[I"Enumerable;TI" Object;TI"'Rack::Session::Abstract::Persisted;T[I" Object;TI"-Rack::Session::Abstract::PersistedSecure;T[@I"@Rack::Session::Abstract::PersistedSecure::SecureSessionHash;T[@I" Rack::Session::Abstract::ID;T[@I"Rack::Session::Cookie;T[@I""Rack::Session::Cookie::Base64;T[I" Object;TI"+Rack::Session::Cookie::Base64::Marshal;T[@I"(Rack::Session::Cookie::Base64::JSON;T[@I"+Rack::Session::Cookie::Base64::ZipJSON;T[@I"$Rack::Session::Cookie::Identity;T[I" Object;TI"%Rack::Session::Cookie::SessionId;T[I"&DelegateClass(Session::SessionId);TI"Rack::Session::Pool;T[@I"Rack::ShowExceptions;T[I" Object;TI"Rack::ShowStatus;T[I" Object;TI"Rack::Static;T[I" Object;TI"Rack::TempfileReaper;T[I" Object;TI"Rack::URLMap;T[I" Object;TI"Rack::Utils::Context;T[I" Object;TI"Rack::Utils::HeaderHash;T[I" Hash;T:attributes{!@[I"attr_accessor realm;T@[I"attr_accessor opaque;TI"!attr_writer passwords_hashed;T@[I"attr_accessor private_key;TI"attr_accessor time_limit;T@![I"attr_reader apps;T@B[I"attr_reader root;T@S[I"attr_reader root;T@V[I"attr_reader root;T@X[I"attr_reader options;TI"attr_reader path;TI"attr_reader ranges;T@i[I"attr_accessor app;T@o[I"attr_accessor rack;T@[I"attr_accessor errors;TI"attr_reader cookies;TI"!attr_reader original_headers;T@[I"attr_reader state;T@[I"attr_accessor content_type;TI""attr_reader original_filename;T@[I" attr_reader key_space_limit;TI""attr_reader param_depth_limit;T@[I"attr_reader env;TI"attr_reader url;T@[I"attr_accessor ip_filter;T@[ I"attr_accessor body;TI"attr_accessor length;TI"attr_accessor status;TI"attr_reader header;TI"attr_reader headers;T@R[I"attr_accessor status;TI"attr_reader headers;T@[I"attr_writer options;T@[I"attr_reader cookie_value;TI"attr_reader public_id;TI"attr_reader to_s;T@[I"attr_writer id;T@[I" attr_reader default_options;TI"attr_reader key;TI"attr_reader sid_secure;T@[I"attr_reader coder;T@ [I"attr_reader cookie_value;T@ [I"attr_reader mutex;TI"attr_reader pool;T@[I"attr_reader app;TI"attr_reader for;T@[I"attr_reader env;T@'[I"'attr_accessor default_query_parser;TI"'attr_accessor multipart_part_limit;T:class_methods{N@[I"new;T@ [@s@[@s@[ @sI" parse;TI"private_key;TI"time_limit;T@[ I" dequote;T@sI" parse;TI"split_header_value;T@[@s@[ I"app;TI"load_file;T@sI"new_from_string;TI"parse_file;T@![@s@$[@s@([@s@-[@s@0[@s@3[@s@6[@s@9[@s@<[@s@?[@s@B[@s@H[@s@K[@s@S[I"method_added;T@s@V[@@s@X[@s@][ I"run;TI"send_body;TI"send_headers;TI" serve;T@c[ I"run;TI"send_body;TI"send_headers;TI" serve;TI"valid_options;T@f[ I"run;TI"send_body;TI"send_headers;TI" serve;T@i[@sI"run;TI"valid_options;T@l[I"run;TI"valid_options;T@r[ @sI"run;TI" shutdown;TI"valid_options;T@u[@s@x[@s@[@s@[@s@[I" params;TI"strip_doublequotes;TI" type;T@[@s@[I" env_for;T@sI"parse_uri_rfc2396;T@[@s@[@s@[@sI" parse;TI"parse_boundary;T@[@s@[@s@[@s@[I"make_default;T@s@[@s@[@s@[@s@[@s@[I"ip_filter;T@s@[I"[];T@s@R[@s@[@s@[@s@[@s@[ I"&default_middleware_by_environment;TI"logging_middleware;TI"middleware;T@sI" start;T@[@s@[ I" find;T@sI"set;TI"set_options;T@[@s@[I"inherited;T@[@s@ [@s@ [@s@[@s@[@s@[@s@[@s@[@s@[@sI" Rack;T[I" release;TI" version;TI"Rack::Handler;T[ I" default;TI"get;TI" pick;TI" register;TI"try_require;TI"Rack::Mime;T[I" match?;TI"mime_type;TI"Rack::Multipart;T[I"build_multipart;TI"extract_multipart;TI"parse_multipart;T@[@s@'[ I"default_query_parser;TI"key_space_limit;TI"key_space_limit=;TI"multipart_part_limit;TI"param_depth_limit;TI"param_depth_limit=;T:c_class_variables{: c_singleton_class_variables{: encodingIu: Encoding UTF-8;F:instance_methods{^@[I"bad_request;TI" realm;TI"unauthorized;T@ [ I"authorization_key;TI" params;TI" parts;TI"provided?;TI" request;TI" scheme;TI" valid?;T@ [I" call;TI"challenge;TI" valid?;T@[I" basic?;TI"credentials;TI" username;T@[I"A1;TI"A2;TI"H;TI"KD;TI" call;TI"challenge;TI" digest;TI"md5;TI" opaque;TI" params;TI"passwords_hashed;TI"passwords_hashed?;TI" valid?;TI"valid_digest?;TI"valid_nonce?;TI"valid_opaque?;TI"valid_qop?;T@[ I" digest;TI" fresh?;TI" stale?;TI" to_s;TI" valid?;T@[ I"[];TI"[]=;TI" quote;TI" to_s;T@[ I"correct_uri?;TI" digest?;TI" method;TI"method_missing;TI" nonce;TI" params;TI"respond_to?;T@[ I" close;TI" closed?;TI"method_missing;TI"respond_to_missing?;T@[ I" call;TI"freeze_app;TI"generate_map;TI"map;TI"run;TI" to_app;TI"use;TI" warmup;T@![ I"<<;TI"add;TI" apps;TI" call;TI" include?;T@$[I" call;TI"chunkable_version?;T@([I" close;TI" each;TI"yield_trailers;T@+[I"yield_trailers;T@-[I" call;TI"extract_content_length;TI"log;T@0[ I" call;TI"etag_matches?;TI" fresh?;TI"modified_since?;TI"to_rfc2822;T@3[I" call;T@6[I" call;T@9[I" call;T@<[I" call;TI"should_deflate?;T@?[I" close;TI" each;TI" write;T@B[I" call;TI"check_bad_request;TI"check_forbidden;TI"entity_not_found;TI"filesize_format;TI"get;TI"list_directory;TI"list_path;TI" root;TI" stat;T@E[I"DIR_FILE_escape;TI" each;T@H[ I" call;TI"digest_body;TI"etag_body?;TI"etag_status?;TI"skip_caching?;T@K[ I" call;TI"make_request;TI"make_response;TI"on_commit;TI" on_error;TI"on_finish;TI" on_start;T@S[ I" call;TI" fail;TI" filesize;TI"get;TI"mime_type;TI" root;TI" serving;T@V[ @@@@@@@@X[I" bytesize;TI" close;TI" each;TI"each_range_part;TI"multipart?;TI"multipart_heading;TI" options;TI" path;TI" ranges;T@`[I"_rack_read_without_buffer;TI" read;T@i[I"app;TI"process_request;T@o[I"_rack_setup_header;TI" rack;TI"setup_header;T@r[I" service;T@u[I" call;T@[I" call;T@[I" call;TI" unlock;T@[I" call;T@[ I"allowed_methods;TI" call;TI"method_override;TI"method_override_param;T@[ I" delete;TI"get;TI" head;TI" options;TI" patch;TI" post;TI"put;TI" request;T@[ I" flush;TI" puts;TI" string;TI" write;T@[I"=~;TI" body;TI" cookie;TI" cookies;TI" empty?;TI" errors;TI"identify_cookie_attributes;TI" match;TI"original_headers;TI"parse_cookies_from_header;T@[ I"content_for_other;TI"content_for_tempfile;TI" dump;TI"flattened_params;TI"multipart?;T@[I"consume_boundary;TI"full_boundary;TI"get_filename;TI"handle_consume_token;TI"handle_empty_content!;TI"handle_fast_forward;TI"handle_mime_body;TI"handle_mime_head;TI" on_read;TI" result;TI"run_parser;TI" state;TI"tag_multipart_encoding;T@[ I"check_open_files;TI" each;TI"on_mime_body;TI"on_mime_finish;TI"on_mime_head;T@[I" get_data;T@[I" close;TI" file?;T@[I" close;TI" file?;T@[ I"content_type;TI"local_path;TI"original_filename;TI" path;TI"respond_to?;T@[I"<<;TI"add;TI" call;TI" close;TI"datetime_format;TI"datetime_format=;TI" debug;TI" debug?;TI" error;TI" error?;TI" fatal;TI" fatal?;TI"formatter;TI"formatter=;TI" info;TI" info?;TI" level;TI" level=;TI" progname;TI"progname=;TI"sev_threshold;TI"sev_threshold=;TI" unknown;TI" warn;TI" warn?;T@[I"key_space_limit;TI"make_params;TI"new_depth_limit;TI"new_space_limit;TI"normalize_params;TI"param_depth_limit;TI"params_hash_has_key?;TI"params_hash_type?;TI"parse_nested_query;TI"parse_query;TI" unescape;T@[ I"[];TI"[]=;TI" key?;TI" to_h;TI"to_params_hash;T@[I"env;TI"url;T@[I" _call;TI" call;TI" include;T@[I" call;TI" reload!;TI"safe_load;T@[I"delete_param;TI" params;TI"update_param;T@[I"[];TI"[]=;TI" body;TI" chunked?;TI" close;TI"delete_header;TI" each;TI" empty?;TI" finish;TI"get_header;TI"has_header?;TI" header;TI" headers;TI" length;TI" redirect;TI"set_header;TI" status;TI" to_a;TI" write;T@R[ I"delete_header;TI"get_header;TI"has_header?;TI" headers;TI"set_header;TI" status;T@[ I" close;TI" each;TI"$filesystem_has_posix_semantics?;TI" gets;TI"make_rewindable;TI" read;TI" rewind;T@[I" call;T@[I" call;TI"map_accel_path;TI"variation;T@[I"app;TI"build_app;TI"&build_app_and_options_from_config;TI"build_app_from_string;TI"check_pid!;TI"daemonize_app;TI"default_options;TI"handle_profiling;TI"make_profile_name;TI"middleware;TI"opt_parser;TI" options;TI"parse_options;TI"pidfile_process_status;TI" server;TI" start;TI"wrapped_app;TI"write_pid;T@[I"handler_opts;TI" parse!;T@[ I"cookie_value;TI" empty?;TI" hash_sid;TI" inspect;TI"private_id;TI"public_id;TI" to_s;T@[!I"[];TI"[]=;TI" clear;TI" delete;TI" destroy;TI"dig;TI" each;TI" empty?;TI" exists?;TI" fetch;TI" has_key?;TI"id;TI" include?;TI" inspect;TI" key?;TI" keys;TI" load!;TI"load_for_read!;TI"load_for_write!;TI" loaded?;TI" merge!;TI" options;TI" replace;TI" store;TI"stringify_keys;TI" to_hash;TI" update;TI" values;T@[I" call;TI"commit_session;TI"commit_session?;TI" context;TI"cookie_value;TI"current_session_id;TI"default_options;TI"delete_session;TI"extract_session_id;TI"find_session;TI"force_options?;TI"forced_session_update?;TI"generate_sid;TI"initialize_sid;TI"key;TI"load_session;TI"loaded_session?;TI"make_request;TI"prepare_session;TI"security_matches?;TI"session_class;TI"session_exists?;TI"set_cookie;TI"sid_secure;TI"write_session;T@[ I"cookie_value;TI"extract_session_id;TI"generate_sid;TI"session_class;T@[I"[];T@[I"delete_session;TI"find_session;TI"write_session;T@[I" coder;TI"delete_session;TI"digest_match?;TI"extract_session_id;TI"find_session;TI"generate_hmac;TI"persistent_session_id!;TI" secure?;TI"unpacked_cookie_data;TI"write_session;T@[I" decode;TI" encode;T@[I" decode;TI" encode;T@[I" decode;TI" encode;T@[I" decode;TI" encode;T@[I" decode;TI" encode;T@ [I"cookie_value;T@ [ I"delete_session;TI"find_session;TI"generate_sid;TI"get_session_with_fallback;TI" mutex;TI" pool;TI"with_lock;TI"write_session;T@[ I"accepts_html?;TI" call;TI"dump_exception;TI"prefers_plaintext?;TI" pretty;TI" template;T@[I" call;T@[ I"add_index_root?;TI"applicable_rules;TI" call;TI"can_serve;TI"overwrite_file_path;TI"route_file;T@[I" call;T@[I" call;TI" casecmp?;TI" remap;T@[ I"app;TI" call;TI" context;TI"for;TI"recontext;TI"Rack::RegexpExtensions;T[I" match?;TI"Rack::Events::Abstract;T[ I"on_commit;TI" on_error;TI"on_finish;TI" on_send;TI" on_start;T@[@@I"Rack::Reloader::Stat;T[I"figure_path;TI" rotation;TI"safe_stat;T@[I"add_header;TI"delete_header;TI"each_header;TI"env;TI"fetch_header;TI"get_header;TI"has_header?;TI"initialize_copy;TI"set_header;T@[PI"GET;TI" POST;TI"[];TI"[]=;TI"accept_encoding;TI"accept_language;TI"allowed_scheme;TI"authority;TI" base_url;TI" body;TI"content_charset;TI"content_length;TI"content_type;TI" cookies;TI"default_session;TI" delete?;TI"delete_param;TI"extract_proto_header;TI"form_data?;TI"forwarded_authority;TI"forwarded_for;TI"forwarded_port;TI"forwarded_scheme;TI" fullpath;TI" get?;TI" head?;TI" host;TI"host_authority;TI"host_with_port;TI" hostname;TI"ip;TI" link?;TI" logger;TI"media_type;TI"media_type_params;TI"multithread?;TI" options?;TI" params;TI"parse_http_accept_header;TI"parse_multipart;TI"parse_query;TI"parseable_data?;TI" patch?;TI" path;TI"path_info;TI"path_info=;TI" port;TI" post?;TI" put?;TI"query_parser;TI"query_string;TI" referer;TI" referrer;TI" reject_trusted_ip_addresses;TI"request_method;TI" scheme;TI"script_name;TI"script_name=;TI"server_authority;TI"server_name;TI"server_port;TI" session;TI"session_options;TI"split_authority;TI"split_header;TI" ssl?;TI" trace?;TI"trusted_proxy?;TI" unlink?;TI"update_param;TI"url;TI"user_agent;TI"values_at;TI"wrap_ipv6;TI" xhr?;T@[-I"accepted?;TI"add_header;TI" append;TI"bad_request?;TI"buffered_body!;TI" cache!;TI"cache_control;TI"cache_control=;TI"client_error?;TI"content_length;TI"content_type;TI"content_type=;TI" created?;TI"delete_cookie;TI"do_not_cache!;TI" etag;TI" etag=;TI"forbidden?;TI" include?;TI"informational?;TI" invalid?;TI" location;TI"location=;TI"media_type;TI"media_type_params;TI"method_not_allowed?;TI"moved_permanently?;TI"no_content?;TI"not_found?;TI"ok?;TI"precondition_failed?;TI"redirect?;TI"redirection?;TI"server_error?;TI"set_cookie;TI"set_cookie_header;TI"set_cookie_header=;TI"successful?;TI"unauthorized?;TI"unprocessable?;T@'[!I"add_cookie_to_header;TI" add_remove_cookie_to_header;TI"best_q_match;TI"build_nested_query;TI"build_query;TI"byte_ranges;TI"clean_path_info;TI"clock_time;TI"delete_cookie_header!;TI" escape;TI"escape_html;TI"escape_path;TI"get_byte_ranges;TI"make_delete_cookie_header;TI"parse_cookies;TI"parse_cookies_header;TI"parse_nested_query;TI"parse_query;TI" q_values;TI" rfc2109;TI" rfc2822;TI"secure_compare;TI"select_best_encoding;TI"set_cookie_header!;TI"status_code;TI" unescape;TI"unescape_path;TI"valid_path?;T: main0: modules[|I" FCGI;T@`I" Rack;TI"Rack::Auth;T@@ @ @I"Rack::Auth::Digest;T@@@@@@@!@$@(@+@-@0@3@6@9@<@?@B@E@H@K@@P@N@V@S@X@[@@@]@c@f@i@l@r@u@xI"Rack::Lint::Assertion;T@|@@~@{@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@R@@@@@I"Rack::Session;TI"Rack::Session::Abstract;T@@@@@@@@@@@@ @ @@@@@@@'@@ I" WEBrick;T@o: pages[I"CHANGELOG.md;TI"CONTRIBUTING.md;TI"README.rdoc;T: titleI"rack-2.2.4 Documentation;TPK! =L^OO/share/gems/doc/rack-2.2.4/ri/FCGI/cdesc-FCGI.rinu[U:RDoc::NormalModule[iI" FCGI:ET@0o:RDoc::Markup::Document: @parts[: @file0:0@omit_headings_from_table_of_contents_below0[[[[[I" class;T[[: public[[:protected[[: private[[I" instance;T[[; [[; [[; [[[U:RDoc::Context::Section[i0o;;[; 0; 0[I" lib/rack/handler/fastcgi.rb;T@'cRDoc::TopLevelPK!8share/gems/doc/rack-2.2.4/ri/FCGI/Stream/cdesc-Stream.rinu[U:RDoc::NormalClass[iI" Stream:ETI"FCGI::Stream;TI" Object;To:RDoc::Markup::Document: @parts[o;;[: @fileI" lib/rack/handler/fastcgi.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[[:protected[[: private[[I" instance;T[[; [[I"_rack_read_without_buffer;TI" lib/rack/handler/fastcgi.rb;T[I" read;T@#[; [[; [[[U:RDoc::Context::Section[i0o;;[; 0; 0[@@cRDoc::TopLevelPK!\KKGshare/gems/doc/rack-2.2.4/ri/FCGI/Stream/_rack_read_without_buffer-i.rinu[U:RDoc::AnyMethod[iI"_rack_read_without_buffer:ETI"+FCGI::Stream#_rack_read_without_buffer;TF: publico:RDoc::Markup::Document: @parts[: @fileI" lib/rack/handler/fastcgi.rb;T:0@omit_headings_from_table_of_contents_below000[I"(n, buffer = nil);T@ FI" Stream;TcRDoc::NormalClass0[I"FCGI::Stream;TFI" read;TPK!#'222share/gems/doc/rack-2.2.4/ri/FCGI/Stream/read-i.rinu[U:RDoc::AnyMethod[iI" read:ETI"FCGI::Stream#read;TF: publico:RDoc::Markup::Document: @parts[: @fileI" lib/rack/handler/fastcgi.rb;T:0@omit_headings_from_table_of_contents_below000[[I"_rack_read_without_buffer;To;; [; @ ; 0I"(n, buffer = nil);T@ FI" Stream;TcRDoc::NormalClass00PK!o$1share/gems/doc/rack-2.2.4/ri/page-CHANGELOG_md.rinu[U:RDoc::TopLevel[ iI"CHANGELOG.md:ETcRDoc::Parser::Markdowno:RDoc::Markup::Document: @parts[S:RDoc::Markup::Heading: leveli: textI"Changelog;To:RDoc::Markup::Paragraph;[I"All notable changes to this project will be documented in this file. For info on how to format all future additions to this file please reference {Keep A Changelog}[https://keepachangelog.com/en/1.0.0/].;TS; ; i; I"[2.2.4] - 2022-06-30;To:RDoc::Markup::List: @type: BULLET: @items[o:RDoc::Markup::ListItem: @label0;[o; ;[I"Better support for lower case headers in Rack::ETag middleware. ({#1919}[https://github.com/rack/rack/pull/1919], {@ioquatix}[https://github.com/ioquatix]);To;;0;[o; ;[I"Use custom exception on params too deep error. ({#1838}[https://github.com/rack/rack/pull/1838], {@simi}[https://github.com/simi]);TS; ; i; I"[2.2.3.1] - 2022-05-27;TS; ; i; I" Security;To; ;;;[o;;0;[o; ;[I"?[CVE-2022-30123] Fix shell escaping issue in Common Logger;To;;0;[o; ;[I"A[CVE-2022-30122] Restrict parsing of broken MIME attachments;TS; ; i; I"[2.2.3] - 2020-02-11;TS; ; i; I" Security;To; ;;;[o;;0;[o; ;[I".[CVE-2020-8184] Only decode cookie values;TS; ; i; I"[2.2.2] - 2020-02-11;TS; ; i; I" Fixed;To; ;;;[ o;;0;[o; ;[I"Fix incorrect Rack::Request#host value. ({#1591}[https://github.com/rack/rack/pull/1591], {@ioquatix}[https://github.com/ioquatix]);To;;0;[o; ;[I"Revert Rack::Handler::Thin implementation. ({#1583}[https://github.com/rack/rack/pull/1583], {@jeremyevans}[https://github.com/jeremyevans]);To;;0;[o; ;[I"Double assignment is still needed to prevent an "unused variable" warning. ({#1589}[https://github.com/rack/rack/pull/1589], {@kamipo}[https://github.com/kamipo]);To;;0;[o; ;[I"Fix to handle same_site option for session pool. ({#1587}[https://github.com/rack/rack/pull/1587], {@kamipo}[https://github.com/kamipo]);TS; ; i; I"[2.2.1] - 2020-02-09;TS; ; i; I" Fixed;To; ;;;[o;;0;[o; ;[I"Rework Rack::Request#ip to handle empty forwarded_for. ({#1577}[https://github.com/rack/rack/pull/1577], {@ioquatix}[https://github.com/ioquatix]);TS; ; i; I"[2.2.0] - 2020-02-08;TS; ; i; I"SPEC Changes;To; ;;;[ o;;0;[o; ;[I"rack.session request environment entry must respond to to_hash and return unfrozen Hash. ({@jeremyevans}[https://github.com/jeremyevans]);To;;0;[o; ;[I"[Request environment cannot be frozen. ({@jeremyevans}[https://github.com/jeremyevans]);To;;0;[o; ;[I"CGI values in the request environment with non-ASCII characters must use ASCII-8BIT encoding. ({@jeremyevans}[https://github.com/jeremyevans]);To;;0;[o; ;[I"Improve SPEC/lint relating to SERVER_NAME, SERVER_PORT and HTTP_HOST. ({#1561}[https://github.com/rack/rack/pull/1561], {@ioquatix}[https://github.com/ioquatix]);TS; ; i; I" Added;To; ;;;[o;;0;[o; ;[I"rackup supports multiple -r options and will require all arguments. ({@jeremyevans}[https://github.com/jeremyevans]);To;;0;[o; ;[I"Server supports an array of paths to require for the :require option. ({@khotta}[https://github.com/khotta]);To;;0;[o; ;[I"gFiles supports multipart range requests. ({@fatkodima}[https://github.com/fatkodima]);To;;0;[o; ;[I"Multipart::UploadedFile supports an IO-like object instead of using the filesystem, using :filename and :io options. ({@jeremyevans}[https://github.com/jeremyevans]);To;;0;[o; ;[I"Multipart::UploadedFile supports keyword arguments :path, :content_type, and :binary in addition to positional arguments. ({@jeremyevans}[https://github.com/jeremyevans]);To;;0;[o; ;[I"Static supports a :cascade option for calling the app if there is no matching file. ({@jeremyevans}[https://github.com/jeremyevans]);To;;0;[o; ;[I"fSession::Abstract::SessionHash#dig. ({@jeremyevans}[https://github.com/jeremyevans]);To;;0;[o; ;[I"Response.[] and MockResponse.[] for creating instances using status, headers, and body. ({@ioquatix}[https://github.com/ioquatix]);To;;0;[o; ;[I"Convenient cache and content type methods for Rack::Response. ({#1555}[https://github.com/rack/rack/pull/1555], {@ioquatix}[https://github.com/ioquatix]);TS; ; i; I" Changed;To; ;;;[o;;0;[o; ;[I"mRequest#params no longer rescues EOFError. ({@jeremyevans}[https://github.com/jeremyevans]);To;;0;[o; ;[I"Directory uses a streaming approach, significantly improving time to first byte for large directories. ({@jeremyevans}[https://github.com/jeremyevans]);To;;0;[o; ;[I"Directory no longer includes a Parent directory link in the root directory index. ({@jeremyevans}[https://github.com/jeremyevans]);To;;0;[o; ;[I"QueryParser#parse_nested_query uses original backtrace when reraising exception with new class. ({@jeremyevans}[https://github.com/jeremyevans]);To;;0;[o; ;[I"ConditionalGet follows RFC 7232 precedence if both If-None-Match and If-Modified-Since headers are provided. ({@jeremyevans}[https://github.com/jeremyevans]);To;;0;[o; ;[I"|.ru files supports the frozen-string-literal magic comment. ({@eregon}[https://github.com/eregon]);To;;0;[o; ;[I"Rely on autoload to load constants instead of requiring internal files, make sure to require 'rack' and not just 'rack/...'. ({@jeremyevans}[https://github.com/jeremyevans]);To;;0;[o; ;[I"Etag will continue sending ETag even if the response should not be cached. ({@henm}[https://github.com/henm]);To;;0;[o; ;[I"Request#host_with_port no longer includes a colon for a missing or empty port. ({@AlexWayfer}[https://github.com/AlexWayfer]);To;;0;[o; ;[I"yAll handlers uses keywords arguments instead of an options hash argument. ({@ioquatix}[https://github.com/ioquatix]);To;;0;[o; ;[I"Files handling of range requests no longer return a body that supports to_path, to ensure range requests are handled correctly. ({@jeremyevans}[https://github.com/jeremyevans]);To;;0;[o; ;[I"Multipart::Generator only includes Content-Length for files with paths, and Content-Disposition filename if the UploadedFile instance has one. ({@jeremyevans}[https://github.com/jeremyevans]);To;;0;[o; ;[I"Request#ssl? is true for the wss scheme (secure websockets). ({@jeremyevans}[https://github.com/jeremyevans]);To;;0;[o; ;[I"Rack::HeaderHash is memoized by default. ({#1549}[https://github.com/rack/rack/pull/1549], {@ioquatix}[https://github.com/ioquatix]);To;;0;[o; ;[I"Rack::Directory allow directory traversal inside root directory. ({#1417}[https://github.com/rack/rack/pull/1417], {@ThomasSevestre}[https://github.com/ThomasSevestre]);To;;0;[o; ;[I"Sort encodings by server preference. ({#1184}[https://github.com/rack/rack/pull/1184], {@ioquatix}[https://github.com/ioquatix], {@wjordan}[https://github.com/wjordan]);To;;0;[o; ;[I"}Rework host/hostname/authority implementation in Rack::Request. #host and #host_with_port have been changed to correctly return IPv6 addresses formatted with square brackets, as defined by {RFC3986}[https://tools.ietf.org/html/rfc3986#section-3.2.2]. ({#1561}[https://github.com/rack/rack/pull/1561], {@ioquatix}[https://github.com/ioquatix]);To;;0;[o; ;[I"Rack::Builder parsing options on first #\ line is deprecated. ({#1574}[https://github.com/rack/rack/pull/1574], {@ioquatix}[https://github.com/ioquatix]);TS; ; i; I" Removed;To; ;;;[ o;;0;[o; ;[I"}Directory#path as it was not used and always returned nil. ({@jeremyevans}[https://github.com/jeremyevans]);To;;0;[o; ;[I"BodyProxy#each as it was only needed to work around a bug in Ruby <1.9.3. ({@jeremyevans}[https://github.com/jeremyevans]);To;;0;[o; ;[I"URLMap::INFINITY and URLMap::NEGATIVE_INFINITY, in favor of Float::INFINITY. ({@ch1c0t}[https://github.com/ch1c0t]);To;;0;[o; ;[I"Deprecation of Rack::File. It will be deprecated again in rack 2.2 or 3.0. ({@rafaelfranca}[https://github.com/rafaelfranca]);To;;0;[o; ;[I"\Support for Ruby 2.2 as it is well past EOL. ({@ioquatix}[https://github.com/ioquatix]);To;;0;[o; ;[I"Remove Rack::Files#response_body as the implementation was broken. ({#1153}[https://github.com/rack/rack/pull/1153], {@ioquatix}[https://github.com/ioquatix]);To;;0;[o; ;[I"Remove SERVER_ADDR which was never part of the original SPEC. ({#1573}[https://github.com/rack/rack/pull/1573], {@ioquatix}[https://github.com/ioquatix]);TS; ; i; I" Fixed;To; ;;;[o;;0;[o; ;[I"Directory correctly handles root paths containing glob metacharacters. ({@jeremyevans}[https://github.com/jeremyevans]);To;;0;[o; ;[I"Cascade uses a new response object for each call if initialized with no apps. ({@jeremyevans}[https://github.com/jeremyevans]);To;;0;[o; ;[I"BodyProxy correctly delegates keyword arguments to the body object on Ruby 2.7+. ({@jeremyevans}[https://github.com/jeremyevans]);To;;0;[o; ;[I"BodyProxy#method correctly handles methods delegated to the body object. ({@jeremyevans}[https://github.com/jeremyevans]);To;;0;[o; ;[I"Request#host and Request#host_with_port handle IPv6 addresses correctly. ({@AlexWayfer}[https://github.com/AlexWayfer]);To;;0;[o; ;[I"Lint checks when response hijacking that rack.hijack is called with a valid object. ({@jeremyevans}[https://github.com/jeremyevans]);To;;0;[o; ;[I"Response#write correctly updates Content-Length if initialized with a body. ({@jeremyevans}[https://github.com/jeremyevans]);To;;0;[o; ;[I"qCommonLogger includes SCRIPT_NAME when logging. ({@Erol}[https://github.com/Erol]);To;;0;[o; ;[I"Utils.parse_nested_query correctly handles empty queries, using an empty instance of the params class instead of a hash. ({@jeremyevans}[https://github.com/jeremyevans]);To;;0;[o; ;[I"`Directory correctly escapes paths in links. ({@yous}[https://github.com/yous]);To;;0;[o; ;[I"Request#delete_cookie and related Utils methods handle :domain and :path options in same call. ({@jeremyevans}[https://github.com/jeremyevans]);To;;0;[o; ;[I"Request#delete_cookie and related Utils methods do an exact match on :domain and :path options. ({@jeremyevans}[https://github.com/jeremyevans]);To;;0;[o; ;[I"Static no longer adds headers when a gzipped file request has a 304 response. ({@chooh}[https://github.com/chooh]);To;;0;[o; ;[I"ContentLength sets Content-Length response header even for bodies not responding to to_ary. ({@jeremyevans}[https://github.com/jeremyevans]);To;;0;[o; ;[I"Thin handler supports options passed directly to Thin::Controllers::Controller. ({@jeremyevans}[https://github.com/jeremyevans]);To;;0;[o; ;[I"yWEBrick handler no longer ignores :BindAddress option. ({@jeremyevans}[https://github.com/jeremyevans]);To;;0;[o; ;[I"lShowExceptions handles invalid POST data. ({@jeremyevans}[https://github.com/jeremyevans]);To;;0;[o; ;[I"~Basic authentication requires a password, even if the password is empty. ({@jeremyevans}[https://github.com/jeremyevans]);To;;0;[o; ;[I"{Lint checks response is array with 3 elements, per SPEC. ({@jeremyevans}[https://github.com/jeremyevans]);To;;0;[o; ;[I"bSupport for using :SSLEnable option when using WEBrick handler. (Gregor Melhorn);To;;0;[o; ;[I"fClose response body after buffering it when buffering. ({@ioquatix}[https://github.com/ioquatix]);To;;0;[o; ;[I"iOnly accept ; as delimiter when parsing cookies. ({@mrageh}[https://github.com/mrageh]);To;;0;[o; ;[I"qUtils::HeaderHash#clear clears the name mapping as well. ({@raxoft}[https://github.com/raxoft]);To;;0;[o; ;[I"Support for passing nil Rack::Files.new, which notably fixes Rails' current ActiveStorage::FileServer implementation. ({@ioquatix}[https://github.com/ioquatix]);TS; ; i; I"Documentation;To; ;;;[o;;0;[o; ;[I">CHANGELOG updates. ({@aupajo}[https://github.com/aupajo]);To;;0;[o; ;[I"RAdded {CONTRIBUTING}[CONTRIBUTING.md]. ({@dblock}[https://github.com/dblock]);TS; ; i; I"[2.1.2] - 2020-01-27;To; ;;;[ o;;0;[o; ;[I"rFix multipart parser for some files to prevent denial of service ({@aiomaster}[https://github.com/aiomaster]);To;;0;[o; ;[I"eFix Rack::Builder#use with keyword arguments ({@kamipo}[https://github.com/kamipo]);To;;0;[o; ;[I"mSkip deflating in Rack::Deflater if Content-Length is 0 ({@jeremyevans}[https://github.com/jeremyevans]);To;;0;[o; ;[I"jRemove SessionHash#transform_keys, no longer needed ({@pavel}[https://github.com/pavel]);To;;0;[o; ;[I"hAdd to_hash to wrap Hash and Session classes ({@oleh-demyanyuk}[https://github.com/oleh-demyanyuk]);To;;0;[o; ;[I"oHandle case where session id key is requested but missing ({@jeremyevans}[https://github.com/jeremyevans]);TS; ; i; I"[2.1.1] - 2020-01-12;To; ;;;[o;;0;[o; ;[I"Remove Rack::Chunked from Rack::Server default middleware. ({#1475}[https://github.com/rack/rack/pull/1475], {@ioquatix}[https://github.com/ioquatix]);To;;0;[o; ;[I"vRestore support for code relying on SessionId#to_s. ({@jeremyevans}[https://github.com/jeremyevans]);TS; ; i; I"[2.1.0] - 2020-01-10;TS; ; i; I" Added;To; ;;;[o;;0;[o; ;[I"hAdd support for SameSite=None cookie value. ({@hennikul}[https://github.com/hennikul]);To;;0;[o; ;[I"JAdd trailer headers. ({@eileencodes}[https://github.com/eileencodes]);To;;0;[o; ;[I"KAdd MIME Types for video streaming. ({@styd}[https://github.com/styd]);To;;0;[o; ;[I"KAdd MIME Type for WASM. ({@buildrtech}[https://github.com/buildrtech]);To;;0;[o; ;[I"\Add Early Hints(103) to status codes. ({@egtra}[https://github.com/egtra]);To;;0;[o; ;[I"^Add Too Early(425) to status codes. ({@y-yagi}[(https://github.com/y-yagi)]);To;;0;[o; ;[I"mAdd Bandwidth Limit Exceeded(509) to status codes. ({@CJKinni}[https://github.com/CJKinni]);To;;0;[o; ;[I"cAdd method for custom ip_filter. ({@svcastaneda}[https://github.com/svcastaneda]);To;;0;[o; ;[I"pAdd boot-time profiling capabilities to rackup. ({@tenderlove}[https://github.com/tenderlove]);To;;0;[o; ;[I"qAdd multi mapping support for X-Accel-Mappings header. ({@yoshuki}[https://github.com/yoshuki]);To;;0;[o; ;[I"TAdd sync: false option to Rack::Deflater. (Eric Wong);To;;0;[o; ;[I"Add Builder#freeze_app to freeze application and all middleware instances. ({@jeremyevans}[https://github.com/jeremyevans]);To;;0;[o; ;[I"tAdd API to extract cookies from Rack::MockResponse. ({@petercline}[https://github.com/petercline]);TS; ; i; I" Changed;To; ;;;[o;;0;[o; ;[I"[Don't propagate nil values from middleware. ({@ioquatix}[https://github.com/ioquatix]);To;;0;[o; ;[I"sLazily initialize the response body and only buffer it if required. ({@ioquatix}[https://github.com/ioquatix]);To;;0;[o; ;[I"oFix deflater zlib buffer errors on empty body part. ({@felixbuenemann}[https://github.com/felixbuenemann]);To;;0;[o; ;[I"hSet X-Accel-Redirect to percent-encoded path. ({@diskkid}[https://github.com/diskkid]);To;;0;[o; ;[I"eRemove unnecessary buffer growing when parsing multipart. ({@tainoe}[https://github.com/tainoe]);To;;0;[o; ;[I"xExpand the root path in Rack::Static upon initialization. ({@rosenfeld}[https://github.com/rosenfeld]);To;;0;[o; ;[I"aMake ShowExceptions work with binary data. ({@axyjo}[https://github.com/axyjo]);To;;0;[o; ;[I"`Use buffer string when parsing multipart requests. ({@janko-m}[https://github.com/janko-m]);To;;0;[o; ;[I"hSupport optional UTF-8 Byte Order Mark (BOM) in config.ru. ({@mikegee}[https://github.com/mikegee]);To;;0;[o; ;[I"kHandle X-Forwarded-For with optional port. ({@dpritchett}[https://github.com/dpritchett]);To;;0;[o; ;[I"wUse Time#httpdate format for Expires, as proposed by RFC 7231. ({@nanaya}[https://github.com/nanaya]);To;;0;[o; ;[I"Make Utils.status_code raise an error when the status symbol is invalid instead of 500. ({@adambutler}[https://github.com/adambutler]);To;;0;[o; ;[I"\Rename Request::SCHEME_WHITELIST to Request::ALLOWED_SCHEMES.;To;;0;[o; ;[I"Make Multipart::Parser.get_filename accept files with + in their name. ({@lucaskanashiro}[https://github.com/lucaskanashiro]);To;;0;[o; ;[I"\Add Falcon to the default handler fallbacks. ({@ioquatix}[https://github.com/ioquatix]);To;;0;[o; ;[I"Update codebase to avoid string mutations in preparation for frozen_string_literals. ({@pat}[https://github.com/pat]);To;;0;[o; ;[I"Change MockRequest#env_for to rely on the input optionally responding to #size instead of #length. ({@janko}[https://github.com/janko]);To;;0;[o; ;[I"Rename Rack::File -> Rack::Files and add deprecation notice. ({@postmodern}[https://github.com/postmodern]).;To;;0;[o; ;[I"gPrefer Base64 “strict encoding” for Base64 cookies. ({@ioquatix}[https://github.com/ioquatix]);TS; ; i; I" Removed;To; ;;;[o;;0;[o; ;[I"\Remove to_ary from Response ({@tenderlove}[https://github.com/tenderlove]);To;;0;[o; ;[I"Deprecate Rack::Session::Memcache in favor of Rack::Session::Dalli from dalli gem ({@fatkodima}[https://github.com/fatkodima]);TS; ; i; I" Fixed;To; ;;;[o;;0;[o; ;[I"WEliminate warnings for Ruby 2.7. ({@osamtimizer}[https://github.com/osamtimizer]]);TS; ; i; I"Documentation;To; ;;;[ o;;0;[o; ;[I"Update broken example in Session::Abstract::ID documentation. ({tonytonyjan}[https://github.com/tonytonyjan]);To;;0;[o; ;[I"jAdd Padrino to the list of frameworks implementing Rack. ({@wikimatze}[https://github.com/wikimatze]);To;;0;[o; ;[I"xRemove Mongrel from the suggested server options in the help output. ({@tricknotes}[https://github.com/tricknotes]);To;;0;[o; ;[I"Replace HISTORY.md and NEWS.md with CHANGELOG.md. ({@twitnithegirl}[https://github.com/twitnithegirl]);To;;0;[o; ;[I"\CHANGELOG updates. ({@drenmi}[https://github.com/Drenmi], {@p8}[https://github.com/p8]);TS; ; i; I"[2.0.8] - 2019-12-08;TS; ; i; I" Security;To; ;;;[o;;0;[o; ;[I"'[{CVE-2019-16782}[https://nvd.nist.gov/vuln/detail/CVE-2019-16782]] Prevent timing attacks targeted at session ID lookup. BREAKING CHANGE: Session ID is now a SessionId instance instead of a String. ({@tenderlove}[https://github.com/tenderlove], {@rafaelfranca}[https://github.com/rafaelfranca]);TS; ; i; I"[1.6.12] - 2019-12-08;TS; ; i; I" Security;To; ;;;[o;;0;[o; ;[I"'[{CVE-2019-16782}[https://nvd.nist.gov/vuln/detail/CVE-2019-16782]] Prevent timing attacks targeted at session ID lookup. BREAKING CHANGE: Session ID is now a SessionId instance instead of a String. ({@tenderlove}[https://github.com/tenderlove], {@rafaelfranca}[https://github.com/rafaelfranca]);TS; ; i; I"[2.0.7] - 2019-04-02;TS; ; i; I" Fixed;To; ;;;[o;;0;[o; ;[I"Remove calls to #eof? on Rack input in Multipart::Parser, as this breaks the specification. ({@matthewd}[https://github.com/matthewd]);To;;0;[o; ;[I"mPreserve forwarded IP addresses for trusted proxy chains. ({@SamSaffron}[https://github.com/SamSaffron]);TS; ; i; I"[2.0.6] - 2018-11-05;TS; ; i; I" Fixed;To; ;;;[o;;0;[o; ;[I"[{CVE-2018-16470}[https://nvd.nist.gov/vuln/detail/CVE-2018-16470]] Reduce buffer size of Multipart::Parser to avoid pathological parsing. ({@tenderlove}[https://github.com/tenderlove]);To;;0;[o; ;[I"Fix a call to a non-existing method #accepts_html in the ShowExceptions middleware. ({@tomelm}[https://github.com/tomelm]);To;;0;[o; ;[I"[{CVE-2018-16471}[https://nvd.nist.gov/vuln/detail/CVE-2018-16471]] Whitelist HTTP and HTTPS schemes in Request#scheme to prevent a possible XSS attack. ({@PatrickTulskie}[https://github.com/PatrickTulskie]);TS; ; i; I"[2.0.5] - 2018-04-23;TS; ; i; I" Fixed;To; ;;;[o;;0;[o; ;[I"Record errors originating from invalid UTF8 in MethodOverride middleware instead of breaking. ({@mclark}[https://github.com/mclark]);TS; ; i; I"[2.0.4] - 2018-01-31;TS; ; i; I" Changed;To; ;;;[ o;;0;[o; ;[I"{Ensure the Lock middleware passes the original env object. ({@lugray}[https://github.com/lugray]);To;;0;[o; ;[I"}Improve performance of Multipart::Parser when uploading large files. ({@tompng}[https://github.com/tompng]);To;;0;[o; ;[I"|Increase buffer size in Multipart::Parser for better performance. ({@jkowens}[https://github.com/jkowens]);To;;0;[o; ;[I"}Reduce memory usage of Multipart::Parser when uploading large files. ({@tompng}[https://github.com/tompng]);To;;0;[o; ;[I"uReplace ConcurrentRuby dependency with native Queue. ({@devmchakan}[https://github.com/devmchakan]);TS; ; i; I" Fixed;To; ;;;[o;;0;[o; ;[I"yRequire the correct digest algorithm in the ETag middleware. ({@matthewd}[https://github.com/matthewd]);TS; ; i; I"Documentation;To; ;;;[o;;0;[o; ;[I"YUpdate homepage links to use SSL. ({@hugoabonizio}[https://github.com/hugoabonizio]);TS; ; i; I"[2.0.3] - 2017-05-15;TS; ; i; I" Changed;To; ;;;[o;;0;[o; ;[I"mEnsure env values are ASCII 8-bit encoded. ({@eileencodes}[https://github.com/eileencodes]);TS; ; i; I" Fixed;To; ;;;[o;;0;[o; ;[I"Prevent exceptions when a class with mixins inherits from Session::Abstract::ID. ({@jnraine}[https://github.com/jnraine]);TS; ; i; I"[2.0.2] - 2017-05-08;TS; ; i; I" Added;To; ;;;[o;;0;[o; ;[I"Allow Session::Abstract::SessionHash#fetch to accept a block with a default value. ({@yannvanhalewyn}[https://github.com/yannvanhalewyn]);To;;0;[o; ;[I"~Add Builder#freeze_app to freeze application and all middleware. ({@jeremyevans}[https://github.com/jeremyevans]);TS; ; i; I" Changed;To; ;;;[ o;;0;[o; ;[I"dFreeze default session options to avoid accidental mutation. ({@kirs}[https://github.com/kirs]);To;;0;[o; ;[I"_Detect partial hijack without hash headers. ({@devmchakan}[https://github.com/devmchakan]);To;;0;[o; ;[I"^Update tests to use MiniTest 6 matchers. ({@tonytonyjan}[https://github.com/tonytonyjan]);To;;0;[o; ;[I"Allow 205 Reset Content responses to set a Content-Length, as RFC 7231 proposes setting this to 0. ({@devmchakan}[https://github.com/devmchakan]);TS; ; i; I" Fixed;To; ;;;[ o;;0;[o; ;[I"nHandle NULL bytes in multipart filenames. ({@casperisfine}[https://github.com/casperisfine]);To;;0;[o; ;[I"]Remove warnings due to miscapitalized global. ({@ioquatix}[https://github.com/ioquatix]);To;;0;[o; ;[I"{Prevent exceptions caused by a race condition on multi-threaded servers. ({@sophiedeziel}[https://github.com/sophiedeziel]);To;;0;[o; ;[I"tAdd RDoc as an explicit depencency for doc group. ({@tonytonyjan}[https://github.com/tonytonyjan]);To;;0;[o; ;[I"Record errors originating from Multipart::Parser in the MethodOverride middleware instead of letting them bubble up. ({@carlzulauf}[https://github.com/carlzulauf]);To;;0;[o; ;[I"Remove remaining use of removed Utils#bytesize method from the File middleware. ({@brauliomartinezlm}[https://github.com/brauliomartinezlm]);TS; ; i; I" Removed;To; ;;;[o;;0;[o; ;[I"|Remove deflate encoding support to reduce caching overhead. ({@devmchakan}[https://github.com/devmchakan]);TS; ; i; I"Documentation;To; ;;;[o;;0;[o; ;[I"oUpdate broken example in Deflater documentation. ({@mwpastore}[https://github.com/mwpastore]);TS; ; i; I"[2.0.1] - 2016-06-30;TS; ; i; I" Changed;To; ;;;[o;;0;[o; ;[I"TRemove JSON as an explicit dependency. ({@mperham}[https://github.com/mperham]);TS; ; i; I"History/News Archive;To; ;[I"[Items below this line are from the previously maintained HISTORY.md and NEWS.md files.;TS; ; i; I"[2.0.0.rc1] 2016-05-06;To; ;;;[o;;0;[o; ;[I"gRack::Session::Abstract::ID is deprecated. Please change to use Rack::Session::Abstract::Persisted;TS; ; i; I"[2.0.0.alpha] 2015-12-04;To; ;;;[o;;0;[o; ;[I"First-party "SameSite" cookies. Browsers omit SameSite cookies from third-party requests, closing the door on many CSRF attacks.;To;;0;[o; ;[I"Pass same_site: true (or :strict) to enable: response.set_cookie 'foo', value: 'bar', same_site: true or same_site: :lax to use Lax enforcement: response.set_cookie 'foo', value: 'bar', same_site: :lax;To;;0;[o; ;[I"Based on version 7 of the Same-site Cookies internet draft: https://tools.ietf.org/html/draft-west-first-party-cookies-07;To;;0;[o; ;[I"`Thanks to Ben Toews (@mastahyeti) and Bob Long (@bobjflong) for updating to drafts 5 and 7.;To;;0;[o; ;[I"Add Rack::Events middleware for adding event based middleware: middleware that does not care about the response body, but only cares about doing work at particular points in the request / response lifecycle.;To;;0;[o; ;[I"Add Rack::Request#authority to calculate the authority under which the response is being made (this will be handy for h2 pushes).;To;;0;[o; ;[I"Add Rack::Response::Helpers#cache_control and cache_control=. Use this for setting cache control headers on your response objects.;To;;0;[o; ;[I"|Add Rack::Response::Helpers#etag and etag=. Use this for setting etag values on the response.;To;;0;[o; ;[I" Introduce Rack::Response::Helpers#add_header to add a value to a multi-valued response header. Implemented in terms of other Response#*_header methods, so it's available to any response-like class that includes the Helpers module.;To;;0;[o; ;[I"8Add Rack::Request#add_header to match.;To;;0;[o; ;[I"Rack::Session::Abstract::ID IS DEPRECATED. Please switch to Rack::Session::Abstract::Persisted. Rack::Session::Abstract::Persisted uses a request object rather than the env hash.;To;;0;[o; ;[I"Pull ENV access inside the request object in to a module. This will help with legacy Request objects that are ENV based but don't want to inherit from Rack::Request;To;;0;[o; ;[I"`Move most methods on the Rack::Request to a module Rack::Request::Helpers and use public API to get values from the request object. This enables users to mix Rack::Request::Helpers in to their own objects so they can implement (get|set|fetch|each)_header as they see fit (for example a proxy object).;To;;0;[o; ;[I"Files and directories with + in the name are served correctly. Rather than unescaping paths like a form, we unescape with a URI parser using Rack::Utils.unescape_path. Fixes #265;To;;0;[o; ;[I"UTempfiles are automatically closed in the case that there were too many posted.;To;;0;[o; ;[I"Added methods for manipulating response headers that don't assume they're stored as a Hash. Response-like classes may include the Rack::Response::Helpers module if they define these methods:;To; ;;;[o;;0;[o; ;[I"Rack::Response#has_header?;To; ;;;[o;;0;[o; ;[I"Rack::Response#get_header;To;;0;[o; ;[I"Rack::Response#set_header;To;;0;[o; ;[I"!Rack::Response#delete_header;To;;0;[o; ;[I"Introduce Util.get_byte_ranges that will parse the value of the HTTP_RANGE string passed to it without depending on the env hash. byte_ranges is deprecated in favor of this method.;To;;0;[o; ;[I"Change Session internals to use Request objects for looking up session information. This allows us to only allocate one request object when dealing with session objects (rather than doing it every time we need to manipulate cookies, etc).;To;;0;[o; ;[I"iAdd Rack::Request#initialize_copy so that the env is duped when the request gets duped.;To;;0;[o; ;[I"pAdded methods for manipulating request specific data. This includes data set as CGI parameters, and just any arbitrary data the user wants to associate with a particular request. New methods: - Rack::Request#has_header? - Rack::Request#get_header - Rack::Request#fetch_header - Rack::Request#each_header - Rack::Request#set_header - Rack::Request#delete_header;To;;0;[o; ;[I"lib/rack/utils.rb: add a method for constructing "delete" cookie headers. This allows us to construct cookie headers without depending on the side effects of mutating a hash.;To;;0;[o; ;[I"GPrevent extremely deep parameters from being parsed. CVE-2015-3225;TS; ; i; I"[1.6.1] 2015-05-06;To; ;;;[o;;0;[o; ;[I":Fix CVE-2014-9490, denial of service attack in OkJson;To;;0;[o; ;[I"9Use a monotonic time for Rack::Runtime, if available;To;;0;[o; ;[I"{RACK_MULTIPART_LIMIT changed to RACK_MULTIPART_PART_LIMIT (RACK_MULTIPART_LIMIT is deprecated and will be removed in 1.7.0);TS; ; i; I"[1.5.3] 2015-05-06;To; ;;;[o;;0;[o; ;[I":Fix CVE-2014-9490, denial of service attack in OkJson;To;;0;[o; ;[I"%Backport bug fixes to 1.5 series;TS; ; i; I"[1.6.0] 2014-01-18;To; ;;;[o;;0;[o; ;[I""Response#unauthorized? helper;To;;0;[o; ;[I"WDeflater now accepts an options hash to control compression on a per-request level;To;;0;[o; ;[I"-Builder#warmup method for app preloading;To;;0;[o; ;[I"CRequest#accept_language method to extract HTTP_ACCEPT_LANGUAGE;To;;0;[o; ;[I"2Add quiet mode of rack server, rackup --quiet;To;;0;[o; ;[I")Update HTTP Status Codes to RFC 7231;To;;0;[o; ;[I"=Less strict header name validation according to RFC 2616;To;;0;[o; ;[I"ESPEC updated to specify headers conform to RFC7230 specification;To;;0;[o; ;[I"'Etag correctly marks etags as weak;To;;0;[o; ;[I"ARequest#port supports multiple x-http-forwarded-proto values;To;;0;[o; ;[I"\Utils#multipart_part_limit configures the maximum number of parts a request can contain;To;;0;[o; ;[I"7Default host to localhost when in development mode;To;;0;[o; ;[I"2Various bugfixes and performance improvements;TS; ; i; I"[1.5.2] 2013-02-07;To; ;;;[ o;;0;[o; ;[I"CFix CVE-2013-0263, timing attack against Rack::Session::Cookie;To;;0;[o; ;[I"bundle exec rake fulltest completes without errors.;TS; ; i ; I"Write Documentation;To; ;[I"ADocument any external behavior in the {README}[README.rdoc].;TS; ; i ; I"Update Changelog;To; ;[I"-Add a line to {CHANGELOG}[CHANGELOG.md].;TS; ; i ; I"Commit Changes;To; ;[I"5Make sure git knows your name and email address:;To; ;[I"hgit config --global user.name "Your Name" git config --global user.email "contributor@example.com" ;T;0o; ;[I"^Writing good commit logs is important. A commit log should describe what changed and why.;To; ;[I"git add ... git commit ;T;0S; ; i ; I" Push;To; ;[I"'git push origin my-feature-branch ;T;0S; ; i ; I"Make a Pull Request;To; ;[I"Go to https://github.com/contributor/rack and select your feature branch. Click the 'Pull Request' button and fill out the form. Pull requests are usually reviewed within a few days.;TS; ; i ; I" Rebase;To; ;[I"QIf you've been working on a change for a while, rebase with upstream/master.;To; ;[I"Xgit fetch upstream git rebase upstream/master git push origin my-feature-branch -f ;T;0S; ; i ; I"Make Required Changes;To; ;[I";Amend your previous commit and force push the changes.;To; ;[I"=git commit --amend git push origin my-feature-branch -f ;T;0S; ; i ; I"Check on Your Pull Request;To; ;[I"Go back to your pull request after a few minutes and see whether it passed muster with Travis-CI. Everything should look green, otherwise fix issues and amend your commit as described above.;TS; ; i ; I"Be Patient;To; ;[I"It's likely that your change will not be merged and that the nitpicky maintainers will ask you to do more, or fix seemingly benign problems. Hang on there!;TS; ; i ; I"Thank You;To; ;[I"`Please do know that we really appreciate and value your time and work. We love you, really.;T: @file@:0@omit_headings_from_table_of_contents_below0PK!.u>u>0share/gems/doc/rack-2.2.4/ri/page-README_rdoc.rinu[U:RDoc::TopLevel[ iI"README.rdoc:ETcRDoc::Parser::Simpleo:RDoc::Markup::Document: @parts[S:RDoc::Markup::Heading: leveli: textI".\Rack, a modular Ruby webserver interface;To:RDoc::Markup::BlankLineo:RDoc::Markup::Paragraph;[I"|{rack powers web applications}[https://rack.github.io/];T@ o; ;[ I"w{CircleCI}[https://circleci.com/gh/rack/rack] ;TI"g{Gem Version}[http://badge.fury.io/rb/rack] ;TI"{SemVer Stability}[https://dependabot.com/compatibility-score.html?dependency-name=rack&package-manager=bundler&version-scheme=semver] ;TI"|{Inline docs}[http://inch-ci.org/github/rack/rack];T@ o; ;[ I"O\Rack provides a minimal, modular, and adaptable interface for developing ;TI"Jweb applications in Ruby. By wrapping HTTP requests and responses in ;TI"Hthe simplest way possible, it unifies and distills the API for web ;TI"Eservers, web frameworks, and software in between (the so-called ;TI"+middleware) into a single method call.;T@ o; ;[I"IThe exact details of this are described in the \Rack specification, ;TI"4which all \Rack applications should conform to.;T@ S; ; i; I"Supported web servers;T@ o; ;[I"GThe included *handlers* connect all kinds of web servers to \Rack:;T@ o:RDoc::Markup::List: @type: BULLET: @items[ o:RDoc::Markup::ListItem: @label0;[o; ;[I"-WEBrick[https://github.com/ruby/webrick];To;;0;[o; ;[I" FCGI;To;;0;[o; ;[I"CGI;To;;0;[o; ;[I" SCGI;To;;0;[o; ;[I".LiteSpeed[https://www.litespeedtech.com/];To;;0;[o; ;[I")Thin[https://rubygems.org/gems/thin];T@ o; ;[I"EThese web servers include \Rack handlers in their distributions:;T@ o;;;;[ o;;0;[o; ;[I"*Agoo[https://github.com/ohler55/agoo];To;;0;[o; ;[I"/Falcon[https://github.com/socketry/falcon];To;;0;[o; ;[I"0Iodine[https://github.com/boazsegev/iodine];To;;0;[o; ;[I"*{NGINX Unit}[https://unit.nginx.org/];To;;0;[o; ;[I"h{Phusion Passenger}[https://www.phusionpassenger.com/] (which is mod_rack for Apache and for nginx);To;;0;[o; ;[I"Puma[https://puma.io/];To;;0;[o; ;[I"'Unicorn[https://yhbt.net/unicorn/];To;;0;[o; ;[I"8uWSGI[https://uwsgi-docs.readthedocs.io/en/latest/];T@ o; ;[I"JAny valid \Rack app will run the same on all these handlers, without ;TI"changing anything.;T@ S; ; i; I"Supported web frameworks;T@ o; ;[I" or rack-core@googlegroups.com. This ;TI"Tlist is not public. Due to wide usage of the library, it is strongly preferred ;TI"Mthat we manage timing in order to provide viable patches at the time of ;TI"Gdisclosure. Your assistance in this matter is greatly appreciated.;T@ o; ;[I",Mailing list archives are available at ;TI":.;T@ o; ;[I";Git repository (send Git patches to the mailing list):;T@ o;;;;[o;;0;[o; ;[I"!https://github.com/rack/rack;T@ o; ;[I"HYou are also welcome to join the #rack channel on irc.freenode.net.;T@ S; ; i; I" Thanks;T@ o; ;[I"'The \Rack Core Team, consisting of;T@ o;;;;[ o;;0;[o; ;[I"@Aaron Patterson (tenderlove[https://github.com/tenderlove]);To;;0;[o; ;[I"Scytrin dai Kinthra (scytrin[https://github.com/scytrin]);To;;0;[o; ;[I"HLeah Neukirchen (leahneukirchen[https://github.com/leahneukirchen]);To;;0;[o; ;[I"3James Tucker (raggi[https://github.com/raggi]);To;;0;[o; ;[I".Josh Peek (josh[https://github.com/josh]);To;;0;[o; ;[I":José Valim (josevalim[https://github.com/josevalim]);To;;0;[o; ;[I"Jonathan Buch, for improvements regarding Rack::Response.;To;;0;[o; ;[I"BArmin Röhrl, for tracking down bugs in the Cookie generator.;To;;0;[o; ;[I"JAlexander Kellett for testing the Gem and reviewing the announcement.;To;;0;[o; ;[I"GMarcus Rückert, for help with configuring and debugging lighttpd.;To;;0;[o; ;[I"JThe WSGI team for the well-done and documented work they've done and ;TI"\Rack builds up on.;To;;0;[o; ;[I"BAll bug reporters and patch contributors not mentioned above.;T@ S; ; i; I" Links;T@ o;;: NOTE;[ o;;[I" \Rack;T;[o; ;[I";To;;[I" Official \Rack repositories;T;[o; ;[I";To;;[I"\Rack Bug Tracking;T;[o; ;[I"*;To;;[I"rack-devel mailing list;T;[o; ;[I"9;T@ S; ; i; I" License;T@ o; ;[I"T\Rack is released under the {MIT License}[https://opensource.org/licenses/MIT].;T: @file@:0@omit_headings_from_table_of_contents_below0PK!5share/gems/doc/rack-2.2.4/ri/Rack/ShowStatus/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"Rack::ShowStatus::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/show_status.rb;T:0@omit_headings_from_table_of_contents_below000[I" (app);T@ FI"ShowStatus;TcRDoc::NormalClass00PK!CS,DD@share/gems/doc/rack-2.2.4/ri/Rack/ShowStatus/cdesc-ShowStatus.rinu[U:RDoc::NormalClass[iI"ShowStatus:ETI"Rack::ShowStatus;TI" Object;To:RDoc::Markup::Document: @parts[o;;[o:RDoc::Markup::Paragraph;[I"DRack::ShowStatus catches all empty responses and replaces them ;TI"&with a site explaining the error.;To:RDoc::Markup::BlankLineo; ;[I"HAdditional details can be put into rack.showstatus.detail ;TI"Gand will be shown as HTML. If such details exist, the error page ;TI"9is always rendered, even if the reply was not empty.;T: @fileI"lib/rack/show_status.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[[I"new;TI"lib/rack/show_status.rb;T[:protected[[: private[[I" instance;T[[; [[I" call;T@$[;[[;[[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I" Rack;TcRDoc::NormalModulePK!S6share/gems/doc/rack-2.2.4/ri/Rack/ShowStatus/call-i.rinu[U:RDoc::AnyMethod[iI" call:ETI"Rack::ShowStatus#call;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/show_status.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@ FI"ShowStatus;TcRDoc::NormalClass00PK!RCshare/gems/doc/rack-2.2.4/ri/Rack/QueryParser/normalize_params-i.rinu[U:RDoc::AnyMethod[iI"normalize_params:ETI"'Rack::QueryParser#normalize_params;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"Onormalize_params recursively expands parameters into structural types. If ;TI"Nthe structural types represented by two different parameter names are in ;TI".conflict, a ParameterTypeError is raised.;T: @fileI"lib/rack/query_parser.rb;T:0@omit_headings_from_table_of_contents_below000[I"(params, name, v, depth);T@FI"QueryParser;TcRDoc::NormalClass00PK!)АEshare/gems/doc/rack-2.2.4/ri/Rack/QueryParser/parse_nested_query-i.rinu[U:RDoc::AnyMethod[iI"parse_nested_query:ETI")Rack::QueryParser#parse_nested_query;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [ I"Pparse_nested_query expands a query string into structural types. Supported ;TI"Ntypes are Arrays, Hashes and basic value types. It is possible to supply ;TI"Hquery strings with parameters of conflicting types, in this case a ;TI"PParameterTypeError is raised. Users are encouraged to return a 400 in this ;TI" case.;T: @fileI"lib/rack/query_parser.rb;T:0@omit_headings_from_table_of_contents_below000[I"(qs, d = nil);T@FI"QueryParser;TcRDoc::NormalClass00PK!h{((6share/gems/doc/rack-2.2.4/ri/Rack/QueryParser/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"Rack::QueryParser::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/query_parser.rb;T:0@omit_headings_from_table_of_contents_below000[I"7(params_class, key_space_limit, param_depth_limit);T@ FI"QueryParser;TcRDoc::NormalClass00PK!TT>share/gems/doc/rack-2.2.4/ri/Rack/QueryParser/parse_query-i.rinu[U:RDoc::AnyMethod[iI"parse_query:ETI""Rack::QueryParser#parse_query;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [ I"9Stolen from Mongrel, with some small modifications: ;TI"8Parses a query string by breaking it up at the '&' ;TI"9and ';' characters. You can also use this to parse ;TI";cookies by changing the characters used in the second ;TI"(parameter (which defaults to '&;').;T: @fileI"lib/rack/query_parser.rb;T:0@omit_headings_from_table_of_contents_below000[I"(qs, d = nil, &unescaper);T@FI"QueryParser;TcRDoc::NormalClass00PK! Bshare/gems/doc/rack-2.2.4/ri/Rack/QueryParser/cdesc-QueryParser.rinu[U:RDoc::NormalClass[iI"QueryParser:ETI"Rack::QueryParser;TI" Object;To:RDoc::Markup::Document: @parts[o;;[: @fileI"lib/rack/query_parser.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[ I"key_space_limit;TI"R;T: publicFI"lib/rack/query_parser.rb;T[ I"param_depth_limit;T@; F@[U:RDoc::Constant[iI"DEFAULT_SEP;TI"#Rack::QueryParser::DEFAULT_SEP;T; 0o;;[; @; 0@@cRDoc::NormalClass0U; [iI"COMMON_SEP;TI""Rack::QueryParser::COMMON_SEP;T; 0o;;[; @; 0@@@0[[[I" class;T[[; [[I"make_default;T@[I"new;T@[:protected[[: private[[I" instance;T[[; [ [I"make_params;T@[I"new_depth_limit;T@[I"new_space_limit;T@[I"normalize_params;T@[I"parse_nested_query;T@[I"parse_query;T@[; [[;[[I"params_hash_has_key?;T@[I"params_hash_type?;T@[I" unescape;T@[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I" Rack;TcRDoc::NormalModulePK!LBshare/gems/doc/rack-2.2.4/ri/Rack/QueryParser/new_space_limit-i.rinu[U:RDoc::AnyMethod[iI"new_space_limit:ETI"&Rack::QueryParser#new_space_limit;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/query_parser.rb;T:0@omit_headings_from_table_of_contents_below000[I"(key_space_limit);T@ FI"QueryParser;TcRDoc::NormalClass00PK!}ё>share/gems/doc/rack-2.2.4/ri/Rack/QueryParser/make_params-i.rinu[U:RDoc::AnyMethod[iI"make_params:ETI""Rack::QueryParser#make_params;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/query_parser.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI"QueryParser;TcRDoc::NormalClass00PK!tSS\share/gems/doc/rack-2.2.4/ri/Rack/QueryParser/ParamsTooDeepError/cdesc-ParamsTooDeepError.rinu[U:RDoc::NormalClass[iI"ParamsTooDeepError:ETI"*Rack::QueryParser::ParamsTooDeepError;TI"RangeError;To:RDoc::Markup::Document: @parts[o;;[o:RDoc::Markup::Paragraph;[I"PParamsTooDeepError is the error that is raised when params are recursively ;TI"%nested over the specified limit.;T: @fileI"lib/rack/query_parser.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[[:protected[[: private[[I" instance;T[[; [[; [[;[[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I"Rack::QueryParser;TcRDoc::NormalClassPK!LE   Bshare/gems/doc/rack-2.2.4/ri/Rack/QueryParser/new_depth_limit-i.rinu[U:RDoc::AnyMethod[iI"new_depth_limit:ETI"&Rack::QueryParser#new_depth_limit;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/query_parser.rb;T:0@omit_headings_from_table_of_contents_below000[I"(param_depth_limit);T@ FI"QueryParser;TcRDoc::NormalClass00PK!-##Ishare/gems/doc/rack-2.2.4/ri/Rack/QueryParser/params_hash_has_key%3f-i.rinu[U:RDoc::AnyMethod[iI"params_hash_has_key?:ETI"+Rack::QueryParser#params_hash_has_key?;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/query_parser.rb;T:0@omit_headings_from_table_of_contents_below000[I"(hash, key);T@ FI"QueryParser;TcRDoc::NormalClass00PK!,,?share/gems/doc/rack-2.2.4/ri/Rack/QueryParser/make_default-c.rinu[U:RDoc::AnyMethod[iI"make_default:ETI"$Rack::QueryParser::make_default;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/query_parser.rb;T:0@omit_headings_from_table_of_contents_below000[I")(key_space_limit, param_depth_limit);T@ FI"QueryParser;TcRDoc::NormalClass00PK!&;share/gems/doc/rack-2.2.4/ri/Rack/QueryParser/unescape-i.rinu[U:RDoc::AnyMethod[iI" unescape:ETI"Rack::QueryParser#unescape;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/query_parser.rb;T:0@omit_headings_from_table_of_contents_below000[I"(s);T@ FI"QueryParser;TcRDoc::NormalClass00PK!5bshare/gems/doc/rack-2.2.4/ri/Rack/QueryParser/InvalidParameterError/cdesc-InvalidParameterError.rinu[U:RDoc::NormalClass[iI"InvalidParameterError:ETI"-Rack::QueryParser::InvalidParameterError;TI"ArgumentError;To:RDoc::Markup::Document: @parts[o;;[o:RDoc::Markup::Paragraph;[I"PInvalidParameterError is the error that is raised when incoming structural ;TI"Nparameters (parsed by parse_nested_query) contain invalid format or byte ;TI"sequence.;T: @fileI"lib/rack/query_parser.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[[:protected[[: private[[I" instance;T[[; [[; [[;[[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I"Rack::QueryParser;TcRDoc::NormalClassPK! ss\share/gems/doc/rack-2.2.4/ri/Rack/QueryParser/ParameterTypeError/cdesc-ParameterTypeError.rinu[U:RDoc::NormalClass[iI"ParameterTypeError:ETI"*Rack::QueryParser::ParameterTypeError;TI"TypeError;To:RDoc::Markup::Document: @parts[o;;[o:RDoc::Markup::Paragraph;[I"MParameterTypeError is the error that is raised when incoming structural ;TI"Iparameters (parsed by parse_nested_query) contain conflicting types.;T: @fileI"lib/rack/query_parser.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[[:protected[[: private[[I" instance;T[[; [[; [[;[[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I"Rack::QueryParser;TcRDoc::NormalClassPK!qQ  Bshare/gems/doc/rack-2.2.4/ri/Rack/QueryParser/key_space_limit-i.rinu[U:RDoc::Attr[iI"key_space_limit:ETI"&Rack::QueryParser#key_space_limit;TI"R;T: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/query_parser.rb;T:0@omit_headings_from_table_of_contents_below0F@ I"Rack::QueryParser;TcRDoc::NormalClass0PK!\=share/gems/doc/rack-2.2.4/ri/Rack/QueryParser/Params/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"#Rack::QueryParser::Params::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/query_parser.rb;T:0@omit_headings_from_table_of_contents_below000[I" (limit);T@ FI" Params;TcRDoc::NormalClass00PK!XZ@share/gems/doc/rack-2.2.4/ri/Rack/QueryParser/Params/key%3f-i.rinu[U:RDoc::AnyMethod[iI" key?:ETI"#Rack::QueryParser::Params#key?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/query_parser.rb;T:0@omit_headings_from_table_of_contents_below000[I" (key);T@ FI" Params;TcRDoc::NormalClass00PK!9@share/gems/doc/rack-2.2.4/ri/Rack/QueryParser/Params/%5b%5d-i.rinu[U:RDoc::AnyMethod[iI"[]:ETI"!Rack::QueryParser::Params#[];TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/query_parser.rb;T:0@omit_headings_from_table_of_contents_below000[I" (key);T@ FI" Params;TcRDoc::NormalClass00PK!">share/gems/doc/rack-2.2.4/ri/Rack/QueryParser/Params/to_h-i.rinu[U:RDoc::AnyMethod[iI" to_h:ETI"#Rack::QueryParser::Params#to_h;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [ I"JRecursively unwraps nested `Params` objects and constructs an object ;TI"Hof the same shape, but using the objects' internal representations ;TI"L(Ruby hashes) in place of the objects. The result is a hash consisting ;TI"purely of Ruby primitives.;To:RDoc::Markup::BlankLineo:RDoc::Markup::Verbatim; [I"Mutation warning! ;TI" ;TI"H1. This method mutates the internal representation of the `Params` ;TI"5 objects in order to save object allocations. ;TI" ;TI"C2. The value you get back is a reference to the internal hash ;TI"$ representation, not a copy. ;TI" ;TI"I3. Because the `Params` object's internal representation is mutable ;TI"H through the `#[]=` method, it is not thread safe. The result of ;TI"I getting the hash representation while another thread is adding a ;TI"' key to it is non-deterministic.;T: @format0: @fileI"lib/rack/query_parser.rb;T:0@omit_headings_from_table_of_contents_below000[[I"to_params_hash;To;; [;@ ;0I"();T@ FI" Params;TcRDoc::NormalClass00PK!Dshare/gems/doc/rack-2.2.4/ri/Rack/QueryParser/Params/cdesc-Params.rinu[U:RDoc::NormalClass[iI" Params:ETI"Rack::QueryParser::Params;TI" Object;To:RDoc::Markup::Document: @parts[o;;[: @fileI"lib/rack/query_parser.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[[I"new;TI"lib/rack/query_parser.rb;T[:protected[[: private[[I" instance;T[[; [ [I"[];T@[I"[]=;T@[I" key?;T@[I" to_h;T@[I"to_params_hash;T@[; [[; [[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I"Rack::QueryParser;TcRDoc::NormalClassPK! ==Hshare/gems/doc/rack-2.2.4/ri/Rack/QueryParser/Params/to_params_hash-i.rinu[U:RDoc::AnyMethod[iI"to_params_hash:ETI"-Rack::QueryParser::Params#to_params_hash;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/query_parser.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Params;TcRDoc::NormalClass0[I"Rack::QueryParser::Params;TFI" to_h;TPK!۷#Cshare/gems/doc/rack-2.2.4/ri/Rack/QueryParser/Params/%5b%5d%3d-i.rinu[U:RDoc::AnyMethod[iI"[]=:ETI""Rack::QueryParser::Params#[]=;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/query_parser.rb;T:0@omit_headings_from_table_of_contents_below000[I"(key, value);T@ FI" Params;TcRDoc::NormalClass00PK!\E_Fshare/gems/doc/rack-2.2.4/ri/Rack/QueryParser/params_hash_type%3f-i.rinu[U:RDoc::AnyMethod[iI"params_hash_type?:ETI"(Rack::QueryParser#params_hash_type?;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/query_parser.rb;T:0@omit_headings_from_table_of_contents_below000[I" (obj);T@ FI"QueryParser;TcRDoc::NormalClass00PK!C  Dshare/gems/doc/rack-2.2.4/ri/Rack/QueryParser/param_depth_limit-i.rinu[U:RDoc::Attr[iI"param_depth_limit:ETI"(Rack::QueryParser#param_depth_limit;TI"R;T: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/query_parser.rb;T:0@omit_headings_from_table_of_contents_below0F@ I"Rack::QueryParser;TcRDoc::NormalClass0PK!O6share/gems/doc/rack-2.2.4/ri/Rack/Recursive/_call-i.rinu[U:RDoc::AnyMethod[iI" _call:ETI"Rack::Recursive#_call;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/recursive.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@ FI"Recursive;TcRDoc::NormalClass00PK!N8share/gems/doc/rack-2.2.4/ri/Rack/Recursive/include-i.rinu[U:RDoc::AnyMethod[iI" include:ETI"Rack::Recursive#include;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/recursive.rb;T:0@omit_headings_from_table_of_contents_below000[I"(env, path);T@ FI"Recursive;TcRDoc::NormalClass00PK!~q214share/gems/doc/rack-2.2.4/ri/Rack/Recursive/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"Rack::Recursive::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/recursive.rb;T:0@omit_headings_from_table_of_contents_below000[I" (app);T@ FI"Recursive;TcRDoc::NormalClass00PK!K|>share/gems/doc/rack-2.2.4/ri/Rack/Recursive/cdesc-Recursive.rinu[U:RDoc::NormalClass[iI"Recursive:ETI"Rack::Recursive;TI" Object;To:RDoc::Markup::Document: @parts[o;;[o:RDoc::Markup::Paragraph;[ I"BRack::Recursive allows applications called down the chain to ;TI"4include data from other applications (by using ;TI"=rack['rack.recursive.include'][...] or raise a ;TI"+ForwardRequest to redirect internally.;T: @fileI"lib/rack/recursive.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[[I"new;TI"lib/rack/recursive.rb;T[:protected[[: private[[I" instance;T[[; [[I" _call;T@ [I" call;T@ [I" include;T@ [; [[;[[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I" Rack;TcRDoc::NormalModulePK!s5share/gems/doc/rack-2.2.4/ri/Rack/Recursive/call-i.rinu[U:RDoc::AnyMethod[iI" call:ETI"Rack::Recursive#call;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/recursive.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@ FI"Recursive;TcRDoc::NormalClass00PK!H:share/gems/doc/rack-2.2.4/ri/Rack/MockResponse/%3d%7e-i.rinu[U:RDoc::AnyMethod[iI"=~:ETI"Rack::MockResponse#=~;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/mock.rb;T:0@omit_headings_from_table_of_contents_below000[I" (other);T@ FI"MockResponse;TcRDoc::NormalClass00PK!6hhDshare/gems/doc/rack-2.2.4/ri/Rack/MockResponse/cdesc-MockResponse.rinu[U:RDoc::NormalClass[iI"MockResponse:ETI"Rack::MockResponse;TI"Rack::Response;To:RDoc::Markup::Document: @parts[o;;[o:RDoc::Markup::Paragraph;[I"GRack::MockResponse provides useful helpers for testing your apps. ;TI"EUsually, you don't create the MockResponse on your own, but use ;TI"MockRequest.;T: @fileI"lib/rack/mock.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[ I" cookies;TI"R;T: publicFI"lib/rack/mock.rb;T[ I" errors;TI"RW;T; F@[ I"original_headers;T@; F@[[[[I" class;T[[; [[I"new;T@[:protected[[: private[[I" instance;T[[; [ [I"=~;T@[I" body;T@[I" cookie;T@[I" empty?;T@[I" match;T@[; [[;[[I"identify_cookie_attributes;T@[I"parse_cookies_from_header;T@[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I" Rack;TcRDoc::NormalModulePK!,̓E:share/gems/doc/rack-2.2.4/ri/Rack/MockResponse/errors-i.rinu[U:RDoc::Attr[iI" errors:ETI"Rack::MockResponse#errors;TI"RW;T: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I" Errors;T: @fileI"lib/rack/mock.rb;T:0@omit_headings_from_table_of_contents_below0F@I"Rack::MockResponse;TcRDoc::NormalClass0PK!*o<share/gems/doc/rack-2.2.4/ri/Rack/MockResponse/empty%3f-i.rinu[U:RDoc::AnyMethod[iI" empty?:ETI"Rack::MockResponse#empty?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/mock.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI"MockResponse;TcRDoc::NormalClass00PK!Y9share/gems/doc/rack-2.2.4/ri/Rack/MockResponse/match-i.rinu[U:RDoc::AnyMethod[iI" match:ETI"Rack::MockResponse#match;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/mock.rb;T:0@omit_headings_from_table_of_contents_below000[I" (other);T@ FI"MockResponse;TcRDoc::NormalClass00PK!|Ed22Dshare/gems/doc/rack-2.2.4/ri/Rack/MockResponse/original_headers-i.rinu[U:RDoc::Attr[iI"original_headers:ETI"(Rack::MockResponse#original_headers;TI"R;T: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I" Headers;T: @fileI"lib/rack/mock.rb;T:0@omit_headings_from_table_of_contents_below0F@I"Rack::MockResponse;TcRDoc::NormalClass0PK![o:share/gems/doc/rack-2.2.4/ri/Rack/MockResponse/cookie-i.rinu[U:RDoc::AnyMethod[iI" cookie:ETI"Rack::MockResponse#cookie;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/mock.rb;T:0@omit_headings_from_table_of_contents_below000[I" (name);T@ FI"MockResponse;TcRDoc::NormalClass00PK!Z ""7share/gems/doc/rack-2.2.4/ri/Rack/MockResponse/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"Rack::MockResponse::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/mock.rb;T:0@omit_headings_from_table_of_contents_below000[I"7(status, headers, body, errors = StringIO.new(""));T@ TI"MockResponse;TcRDoc::NormalClass00PK!O8share/gems/doc/rack-2.2.4/ri/Rack/MockResponse/body-i.rinu[U:RDoc::AnyMethod[iI" body:ETI"Rack::MockResponse#body;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/mock.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ TI"MockResponse;TcRDoc::NormalClass00PK!  ;share/gems/doc/rack-2.2.4/ri/Rack/MockResponse/cookies-i.rinu[U:RDoc::Attr[iI" cookies:ETI"Rack::MockResponse#cookies;TI"R;T: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I" Headers;T: @fileI"lib/rack/mock.rb;T:0@omit_headings_from_table_of_contents_below0F@I"Rack::MockResponse;TcRDoc::NormalClass0PK!)..Nshare/gems/doc/rack-2.2.4/ri/Rack/MockResponse/identify_cookie_attributes-i.rinu[U:RDoc::AnyMethod[iI"identify_cookie_attributes:ETI"2Rack::MockResponse#identify_cookie_attributes;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/mock.rb;T:0@omit_headings_from_table_of_contents_below000[I"(cookie_filling);T@ FI"MockResponse;TcRDoc::NormalClass00PK!6PMshare/gems/doc/rack-2.2.4/ri/Rack/MockResponse/parse_cookies_from_header-i.rinu[U:RDoc::AnyMethod[iI"parse_cookies_from_header:ETI"1Rack::MockResponse#parse_cookies_from_header;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/mock.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI"MockResponse;TcRDoc::NormalClass00PK!K<<Bshare/gems/doc/rack-2.2.4/ri/Rack/Multipart/extract_multipart-c.rinu[U:RDoc::AnyMethod[iI"extract_multipart:ETI"'Rack::Multipart::extract_multipart;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/multipart.rb;T:0@omit_headings_from_table_of_contents_below000[I"5(req, params = Rack::Utils.default_query_parser);T@ FI"Multipart;TcRDoc::NormalModule00PK!F;NNHshare/gems/doc/rack-2.2.4/ri/Rack/Multipart/UploadedFile/local_path-i.rinu[U:RDoc::AnyMethod[iI"local_path:ETI"-Rack::Multipart::UploadedFile#local_path;TF: publico:RDoc::Markup::Document: @parts[: @fileI"(lib/rack/multipart/uploaded_file.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI"UploadedFile;TcRDoc::NormalClass0[I""Rack::Multipart::UploadedFile;TFI" path;TPK!`$$Kshare/gems/doc/rack-2.2.4/ri/Rack/Multipart/UploadedFile/respond_to%3f-i.rinu[U:RDoc::AnyMethod[iI"respond_to?:ETI".Rack::Multipart::UploadedFile#respond_to?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"(lib/rack/multipart/uploaded_file.rb;T:0@omit_headings_from_table_of_contents_below000[I" (*args);T@ TI"UploadedFile;TcRDoc::NormalClass00PK!Rcs33Bshare/gems/doc/rack-2.2.4/ri/Rack/Multipart/UploadedFile/path-i.rinu[U:RDoc::AnyMethod[iI" path:ETI"'Rack::Multipart::UploadedFile#path;TF: publico:RDoc::Markup::Document: @parts[: @fileI"(lib/rack/multipart/uploaded_file.rb;T:0@omit_headings_from_table_of_contents_below000[[I"local_path;To;; [; @ ; 0I"();T@ FI"UploadedFile;TcRDoc::NormalClass00PK!qNIAshare/gems/doc/rack-2.2.4/ri/Rack/Multipart/UploadedFile/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"'Rack::Multipart::UploadedFile::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI"(lib/rack/multipart/uploaded_file.rb;T:0@omit_headings_from_table_of_contents_below000[I"|(filepath = nil, ct = "text/plain", bin = false, path: filepath, content_type: ct, binary: bin, filename: nil, io: nil);T@ FI"UploadedFile;TcRDoc::NormalClass00PK!=)mmNshare/gems/doc/rack-2.2.4/ri/Rack/Multipart/UploadedFile/cdesc-UploadedFile.rinu[U:RDoc::NormalClass[iI"UploadedFile:ETI""Rack::Multipart::UploadedFile;TI" Object;To:RDoc::Markup::Document: @parts[o;;[: @fileI"(lib/rack/multipart/uploaded_file.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[ I"content_type;TI"RW;T: publicFI"(lib/rack/multipart/uploaded_file.rb;T[ I"original_filename;TI"R;T; F@[[[[I" class;T[[; [[I"new;T@[:protected[[: private[[I" instance;T[[; [[I"local_path;T@[I" path;T@[I"respond_to?;T@[; [[; [[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I"Rack::Multipart;TcRDoc::NormalModulePK!{7]Oshare/gems/doc/rack-2.2.4/ri/Rack/Multipart/UploadedFile/original_filename-i.rinu[U:RDoc::Attr[iI"original_filename:ETI"4Rack::Multipart::UploadedFile#original_filename;TI"R;T: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"CThe filename, *not* including the path, of the "uploaded" file;T: @fileI"(lib/rack/multipart/uploaded_file.rb;T:0@omit_headings_from_table_of_contents_below0F@I""Rack::Multipart::UploadedFile;TcRDoc::NormalClass0PK!p ttJshare/gems/doc/rack-2.2.4/ri/Rack/Multipart/UploadedFile/content_type-i.rinu[U:RDoc::Attr[iI"content_type:ETI"/Rack::Multipart::UploadedFile#content_type;TI"RW;T: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I",The content type of the "uploaded" file;T: @fileI"(lib/rack/multipart/uploaded_file.rb;T:0@omit_headings_from_table_of_contents_below0F@I""Rack::Multipart::UploadedFile;TcRDoc::NormalClass0PK!WTs#88@share/gems/doc/rack-2.2.4/ri/Rack/Multipart/parse_multipart-c.rinu[U:RDoc::AnyMethod[iI"parse_multipart:ETI"%Rack::Multipart::parse_multipart;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/multipart.rb;T:0@omit_headings_from_table_of_contents_below000[I"5(env, params = Rack::Utils.default_query_parser);T@ FI"Multipart;TcRDoc::NormalModule00PK!dshare/gems/doc/rack-2.2.4/ri/Rack/Multipart/MultipartPartLimitError/cdesc-MultipartPartLimitError.rinu[U:RDoc::NormalClass[iI"MultipartPartLimitError:ETI"-Rack::Multipart::MultipartPartLimitError;TI"Errno::EMFILE;To:RDoc::Markup::Document: @parts[o;;[: @fileI"!lib/rack/multipart/parser.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[[:protected[[: private[[I" instance;T[[; [[; [[; [[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I"Rack::Multipart;TcRDoc::NormalModulePK!n >share/gems/doc/rack-2.2.4/ri/Rack/Multipart/Generator/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"$Rack::Multipart::Generator::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI"$lib/rack/multipart/generator.rb;T:0@omit_headings_from_table_of_contents_below000[I"(params, first = true);T@ FI"Generator;TcRDoc::NormalClass00PK!],,Lshare/gems/doc/rack-2.2.4/ri/Rack/Multipart/Generator/content_for_other-i.rinu[U:RDoc::AnyMethod[iI"content_for_other:ETI"1Rack::Multipart::Generator#content_for_other;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"$lib/rack/multipart/generator.rb;T:0@omit_headings_from_table_of_contents_below000[I"(file, name);T@ FI"Generator;TcRDoc::NormalClass00PK!(Dshare/gems/doc/rack-2.2.4/ri/Rack/Multipart/cdesc-Multipart.rinu[U:RDoc::NormalModule[iI"Multipart:ETI"Rack::Multipart;T0o:RDoc::Markup::Document: @parts[ o;;[o:RDoc::Markup::Paragraph;[I"5A multipart form data parser, adapted from IOWA.;To:RDoc::Markup::BlankLineo; ;[I".ȻHshare/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/handle_mime_head-i.rinu[U:RDoc::AnyMethod[iI"handle_mime_head:ETI"-Rack::Multipart::Parser#handle_mime_head;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"!lib/rack/multipart/parser.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Parser;TcRDoc::NormalClass00PK!ېKshare/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/handle_fast_forward-i.rinu[U:RDoc::AnyMethod[iI"handle_fast_forward:ETI"0Rack::Multipart::Parser#handle_fast_forward;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"!lib/rack/multipart/parser.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Parser;TcRDoc::NormalClass00PK! cEshare/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/full_boundary-i.rinu[U:RDoc::AnyMethod[iI"full_boundary:ETI"*Rack::Multipart::Parser#full_boundary;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"!lib/rack/multipart/parser.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Parser;TcRDoc::NormalClass00PK!E*&&;share/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"!Rack::Multipart::Parser::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI"!lib/rack/multipart/parser.rb;T:0@omit_headings_from_table_of_contents_below000[I"0(boundary, tempfile, bufsize, query_parser);T@ FI" Parser;TcRDoc::NormalClass00PK!)R>share/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/result-i.rinu[U:RDoc::AnyMethod[iI" result:ETI"#Rack::Multipart::Parser#result;TF: publico:RDoc::Markup::Document: @parts[: @fileI"!lib/rack/multipart/parser.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Parser;TcRDoc::NormalClass00PK!O<  Bshare/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/run_parser-i.rinu[U:RDoc::AnyMethod[iI"run_parser:ETI"'Rack::Multipart::Parser#run_parser;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"!lib/rack/multipart/parser.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Parser;TcRDoc::NormalClass00PK!XmEENshare/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/tag_multipart_encoding-i.rinu[U:RDoc::AnyMethod[iI"tag_multipart_encoding:ETI"3Rack::Multipart::Parser#tag_multipart_encoding;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"!lib/rack/multipart/parser.rb;T:0@omit_headings_from_table_of_contents_below000[I")(filename, content_type, name, body);T@ FI" Parser;TcRDoc::NormalClass00PK!ɷOshare/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/BoundedIO/cdesc-BoundedIO.rinu[U:RDoc::NormalClass[iI"BoundedIO:ETI"'Rack::Multipart::Parser::BoundedIO;TI" Object;To:RDoc::Markup::Document: @parts[: @file0:0@omit_headings_from_table_of_contents_below0[[[[[I" class;T[[: public[[:protected[[: private[[I" instance;T[[; [[; [[; [[[U:RDoc::Context::Section[i0o;;[; 0; 0[I"!lib/rack/multipart/parser.rb;TI"Rack::Multipart::Parser;TcRDoc::NormalClassPK!g+377=share/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/parse-c.rinu[U:RDoc::AnyMethod[iI" parse:ETI"#Rack::Multipart::Parser::parse;TT: publico:RDoc::Markup::Document: @parts[: @fileI"!lib/rack/multipart/parser.rb;T:0@omit_headings_from_table_of_contents_below000[I"=(io, content_length, content_type, tmpfile, bufsize, qp);T@ FI" Parser;TcRDoc::NormalClass00PK!;*$Bshare/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/cdesc-Parser.rinu[U:RDoc::NormalClass[iI" Parser:ETI"Rack::Multipart::Parser;TI" Object;To:RDoc::Markup::Document: @parts[o;;[: @fileI"!lib/rack/multipart/parser.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[ I" state;TI"R;T: publicFI"!lib/rack/multipart/parser.rb;T[ U:RDoc::Constant[iI" BUFSIZE;TI"%Rack::Multipart::Parser::BUFSIZE;T; 0o;;[; @; 0@@cRDoc::NormalClass0U; [iI"TEXT_PLAIN;TI"(Rack::Multipart::Parser::TEXT_PLAIN;T; 0o;;[; @; 0@@@0U; [iI"TEMPFILE_FACTORY;TI".Rack::Multipart::Parser::TEMPFILE_FACTORY;T; 0o;;[; @; 0@@@0U; [iI"BOUNDARY_REGEX;TI",Rack::Multipart::Parser::BOUNDARY_REGEX;T; 0o;;[; @; 0@@@0U; [iI"MultipartInfo;TI"+Rack::Multipart::Parser::MultipartInfo;T; 0o;;[; @; 0@@@0U; [iI" EMPTY;TI"#Rack::Multipart::Parser::EMPTY;T; 0o;;[; @; 0@@@0U; [iI" CHARSET;TI"%Rack::Multipart::Parser::CHARSET;T; 0o;;[; @; 0@@@0[[[I" class;T[[; [[I"new;T@[I" parse;T@[I"parse_boundary;T@[:protected[[: private[[I" instance;T[[; [[I" on_read;T@[I" result;T@[; [[;[[I"consume_boundary;T@[I"full_boundary;T@[I"get_filename;T@[I"handle_consume_token;T@[I"handle_empty_content!;T@[I"handle_fast_forward;T@[I"handle_mime_body;T@[I"handle_mime_head;T@[I"run_parser;T@[I"tag_multipart_encoding;T@[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I"Rack::Multipart;TcRDoc::NormalModulePK!Q%%Rshare/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/Collector/check_open_files-i.rinu[U:RDoc::AnyMethod[iI"check_open_files:ETI"8Rack::Multipart::Parser::Collector#check_open_files;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"!lib/rack/multipart/parser.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI"Collector;TcRDoc::NormalClass00PK!1f+//Nshare/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/Collector/on_mime_body-i.rinu[U:RDoc::AnyMethod[iI"on_mime_body:ETI"4Rack::Multipart::Parser::Collector#on_mime_body;TF: publico:RDoc::Markup::Document: @parts[: @fileI"!lib/rack/multipart/parser.rb;T:0@omit_headings_from_table_of_contents_below000[I"(mime_index, content);T@ FI"Collector;TcRDoc::NormalClass00PK!Dp''Sshare/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/Collector/MimePart/get_data-i.rinu[U:RDoc::AnyMethod[iI" get_data:ETI":Rack::Multipart::Parser::Collector::MimePart#get_data;TF: publico:RDoc::Markup::Document: @parts[: @fileI"!lib/rack/multipart/parser.rb;T:0@omit_headings_from_table_of_contents_below00I" data;T[I"();T@ FI" MimePart;TcRDoc::NormalClass00PK!/Ĉ00Wshare/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/Collector/MimePart/cdesc-MimePart.rinu[U:RDoc::NormalClass[iI" MimePart:ETI"1Rack::Multipart::Parser::Collector::MimePart;TI">Struct.new(:body, :head, :filename, :content_type, :name);To:RDoc::Markup::Document: @parts[o;;[: @fileI"!lib/rack/multipart/parser.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[[:protected[[: private[[I" instance;T[[; [[I" get_data;TI"!lib/rack/multipart/parser.rb;T[; [[; [[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I"'Rack::Multipart::Parser::Collector;TcRDoc::NormalClassPK!3 Eshare/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/Collector/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI",Rack::Multipart::Parser::Collector::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI"!lib/rack/multipart/parser.rb;T:0@omit_headings_from_table_of_contents_below000[I"(tempfile);T@ FI"Collector;TcRDoc::NormalClass00PK! Vshare/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/Collector/TempfilePart/file%3f-i.rinu[U:RDoc::AnyMethod[iI" file?:ETI";Rack::Multipart::Parser::Collector::TempfilePart#file?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"!lib/rack/multipart/parser.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI"TempfilePart;TcRDoc::NormalClass00PK!88_share/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/Collector/TempfilePart/cdesc-TempfilePart.rinu[U:RDoc::NormalClass[iI"TempfilePart:ETI"5Rack::Multipart::Parser::Collector::TempfilePart;TI"1Rack::Multipart::Parser::Collector::MimePart;To:RDoc::Markup::Document: @parts[o;;[: @fileI"!lib/rack/multipart/parser.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[[:protected[[: private[[I" instance;T[[; [[I" close;TI"!lib/rack/multipart/parser.rb;T[I" file?;T@#[; [[; [[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I"'Rack::Multipart::Parser::Collector;TcRDoc::NormalClassPK!#FVTshare/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/Collector/TempfilePart/close-i.rinu[U:RDoc::AnyMethod[iI" close:ETI";Rack::Multipart::Parser::Collector::TempfilePart#close;TF: publico:RDoc::Markup::Document: @parts[: @fileI"!lib/rack/multipart/parser.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI"TempfilePart;TcRDoc::NormalClass00PK!g**Pshare/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/Collector/on_mime_finish-i.rinu[U:RDoc::AnyMethod[iI"on_mime_finish:ETI"6Rack::Multipart::Parser::Collector#on_mime_finish;TF: publico:RDoc::Markup::Document: @parts[: @fileI"!lib/rack/multipart/parser.rb;T:0@omit_headings_from_table_of_contents_below000[I"(mime_index);T@ FI"Collector;TcRDoc::NormalClass00PK!Fshare/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/Collector/each-i.rinu[U:RDoc::AnyMethod[iI" each:ETI",Rack::Multipart::Parser::Collector#each;TF: publico:RDoc::Markup::Document: @parts[: @fileI"!lib/rack/multipart/parser.rb;T:0@omit_headings_from_table_of_contents_below00I" part;T[I"();T@ FI"Collector;TcRDoc::NormalClass00PK!9yyOshare/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/Collector/cdesc-Collector.rinu[U:RDoc::NormalClass[iI"Collector:ETI"'Rack::Multipart::Parser::Collector;TI" Object;To:RDoc::Markup::Document: @parts[o;;[: @fileI"!lib/rack/multipart/parser.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[I"Enumerable;To;;[; @; 0I"!lib/rack/multipart/parser.rb;T[[I" class;T[[: public[[I"new;T@[:protected[[: private[[I" instance;T[[; [ [I" each;T@[I"on_mime_body;T@[I"on_mime_finish;T@[I"on_mime_head;T@[; [[; [[I"check_open_files;T@[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I"Rack::Multipart::Parser;TcRDoc::NormalClassPK!:JJNshare/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/Collector/on_mime_head-i.rinu[U:RDoc::AnyMethod[iI"on_mime_head:ETI"4Rack::Multipart::Parser::Collector#on_mime_head;TF: publico:RDoc::Markup::Document: @parts[: @fileI"!lib/rack/multipart/parser.rb;T:0@omit_headings_from_table_of_contents_below000[I"5(mime_index, head, filename, content_type, name);T@ FI"Collector;TcRDoc::NormalClass00PK!c44[share/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/Collector/BufferPart/cdesc-BufferPart.rinu[U:RDoc::NormalClass[iI"BufferPart:ETI"3Rack::Multipart::Parser::Collector::BufferPart;TI"1Rack::Multipart::Parser::Collector::MimePart;To:RDoc::Markup::Document: @parts[o;;[: @fileI"!lib/rack/multipart/parser.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[[:protected[[: private[[I" instance;T[[; [[I" close;TI"!lib/rack/multipart/parser.rb;T[I" file?;T@#[; [[; [[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I"'Rack::Multipart::Parser::Collector;TcRDoc::NormalClassPK!NRTshare/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/Collector/BufferPart/file%3f-i.rinu[U:RDoc::AnyMethod[iI" file?:ETI"9Rack::Multipart::Parser::Collector::BufferPart#file?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"!lib/rack/multipart/parser.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI"BufferPart;TcRDoc::NormalClass00PK!'Rshare/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/Collector/BufferPart/close-i.rinu[U:RDoc::AnyMethod[iI" close:ETI"9Rack::Multipart::Parser::Collector::BufferPart#close;TF: publico:RDoc::Markup::Document: @parts[: @fileI"!lib/rack/multipart/parser.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI"BufferPart;TcRDoc::NormalClass00PK! \g7Dshare/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/get_filename-i.rinu[U:RDoc::AnyMethod[iI"get_filename:ETI")Rack::Multipart::Parser#get_filename;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"!lib/rack/multipart/parser.rb;T:0@omit_headings_from_table_of_contents_below000[I" (head);T@ FI" Parser;TcRDoc::NormalClass00PK!_Fshare/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/parse_boundary-c.rinu[U:RDoc::AnyMethod[iI"parse_boundary:ETI",Rack::Multipart::Parser::parse_boundary;TT: publico:RDoc::Markup::Document: @parts[: @fileI"!lib/rack/multipart/parser.rb;T:0@omit_headings_from_table_of_contents_below000[I"(content_type);T@ FI" Parser;TcRDoc::NormalClass00PK!eHshare/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/consume_boundary-i.rinu[U:RDoc::AnyMethod[iI"consume_boundary:ETI"-Rack::Multipart::Parser#consume_boundary;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"!lib/rack/multipart/parser.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Parser;TcRDoc::NormalClass00PK!gų((Oshare/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/handle_empty_content%21-i.rinu[U:RDoc::AnyMethod[iI"handle_empty_content!:ETI"2Rack::Multipart::Parser#handle_empty_content!;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"!lib/rack/multipart/parser.rb;T:0@omit_headings_from_table_of_contents_below000[I"(content);T@ FI" Parser;TcRDoc::NormalClass00PK!1l1share/gems/doc/rack-2.2.4/ri/Rack/Logger/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"Rack::Logger::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/logger.rb;T:0@omit_headings_from_table_of_contents_below000[I""(app, level = ::Logger::INFO);T@ FI" Logger;TcRDoc::NormalClass00PK!:  8share/gems/doc/rack-2.2.4/ri/Rack/Logger/cdesc-Logger.rinu[U:RDoc::NormalClass[iI" Logger:ETI"Rack::Logger;TI" Object;To:RDoc::Markup::Document: @parts[o;;[o:RDoc::Markup::Paragraph;[I"7Sets up rack.logger to write to rack.errors stream;T: @fileI"lib/rack/logger.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[[I"new;TI"lib/rack/logger.rb;T[:protected[[: private[[I" instance;T[[; [[I" call;T@[; [[;[[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I" Rack;TcRDoc::NormalModulePK!/'e2share/gems/doc/rack-2.2.4/ri/Rack/Logger/call-i.rinu[U:RDoc::AnyMethod[iI" call:ETI"Rack::Logger#call;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/logger.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@ FI" Logger;TcRDoc::NormalClass00PK!OAEshare/gems/doc/rack-2.2.4/ri/Rack/ShowExceptions/accepts_html%3f-i.rinu[U:RDoc::AnyMethod[iI"accepts_html?:ETI"'Rack::ShowExceptions#accepts_html?;TF: privateo:RDoc::Markup::Document: @parts[: @fileI" lib/rack/show_exceptions.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@ FI"ShowExceptions;TcRDoc::NormalClass00PK!!!Jshare/gems/doc/rack-2.2.4/ri/Rack/ShowExceptions/prefers_plaintext%3f-i.rinu[U:RDoc::AnyMethod[iI"prefers_plaintext?:ETI",Rack::ShowExceptions#prefers_plaintext?;TF: publico:RDoc::Markup::Document: @parts[: @fileI" lib/rack/show_exceptions.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@ FI"ShowExceptions;TcRDoc::NormalClass00PK!9QDshare/gems/doc/rack-2.2.4/ri/Rack/ShowExceptions/dump_exception-i.rinu[U:RDoc::AnyMethod[iI"dump_exception:ETI"(Rack::ShowExceptions#dump_exception;TF: publico:RDoc::Markup::Document: @parts[: @fileI" lib/rack/show_exceptions.rb;T:0@omit_headings_from_table_of_contents_below000[I"(exception);T@ FI"ShowExceptions;TcRDoc::NormalClass00PK!ˍ9share/gems/doc/rack-2.2.4/ri/Rack/ShowExceptions/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"Rack::ShowExceptions::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI" lib/rack/show_exceptions.rb;T:0@omit_headings_from_table_of_contents_below000[I" (app);T@ FI"ShowExceptions;TcRDoc::NormalClass00PK!_i<share/gems/doc/rack-2.2.4/ri/Rack/ShowExceptions/pretty-i.rinu[U:RDoc::AnyMethod[iI" pretty:ETI" Rack::ShowExceptions#pretty;TF: publico:RDoc::Markup::Document: @parts[: @fileI" lib/rack/show_exceptions.rb;T:0@omit_headings_from_table_of_contents_below000[I"(env, exception);T@ FI"ShowExceptions;TcRDoc::NormalClass00PK!Ĉ`OOHshare/gems/doc/rack-2.2.4/ri/Rack/ShowExceptions/cdesc-ShowExceptions.rinu[U:RDoc::NormalClass[iI"ShowExceptions:ETI"Rack::ShowExceptions;TI" Object;To:RDoc::Markup::Document: @parts[o;;[o:RDoc::Markup::Paragraph;[ I"HRack::ShowExceptions catches all exceptions raised from the app it ;TI"Awraps. It shows a useful backtrace with the sourcefile and ;TI"Cclickable context, the whole Rack environment and the request ;TI" data.;To:RDoc::Markup::BlankLineo; ;[I"EBe careful when you use this on public-facing sites as it could ;TI"-reveal information helpful to attackers.;T: @fileI" lib/rack/show_exceptions.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[U:RDoc::Constant[iI" CONTEXT;TI""Rack::ShowExceptions::CONTEXT;T: public0o;;[; @; 0@@cRDoc::NormalClass0[[[I" class;T[[;[[I"new;TI" lib/rack/show_exceptions.rb;T[:protected[[: private[[I" instance;T[[;[ [I" call;T@,[I"dump_exception;T@,[I"prefers_plaintext?;T@,[I" pretty;T@,[I" template;T@,[;[[;[[I"accepts_html?;T@,[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I" Rack;TcRDoc::NormalModulePK!o  >share/gems/doc/rack-2.2.4/ri/Rack/ShowExceptions/template-i.rinu[U:RDoc::AnyMethod[iI" template:ETI""Rack::ShowExceptions#template;TF: publico:RDoc::Markup::Document: @parts[: @fileI" lib/rack/show_exceptions.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI"ShowExceptions;TcRDoc::NormalClass00PK!';:share/gems/doc/rack-2.2.4/ri/Rack/ShowExceptions/call-i.rinu[U:RDoc::AnyMethod[iI" call:ETI"Rack::ShowExceptions#call;TF: publico:RDoc::Markup::Document: @parts[: @fileI" lib/rack/show_exceptions.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@ FI"ShowExceptions;TcRDoc::NormalClass00PK!Ƹ5share/gems/doc/rack-2.2.4/ri/Rack/Request/params-i.rinu[U:RDoc::AnyMethod[iI" params:ETI"Rack::Request#params;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ TI" Request;TcRDoc::NormalClass00PK!f 2share/gems/doc/rack-2.2.4/ri/Rack/Request/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"Rack::Request::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@ TI" Request;TcRDoc::NormalClass00PK!4ώBshare/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/server_name-i.rinu[U:RDoc::AnyMethod[iI"server_name:ETI"'Rack::Request::Helpers#server_name;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!n;share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/POST-i.rinu[U:RDoc::AnyMethod[iI" POST:ETI" Rack::Request::Helpers#POST;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"3Returns the data received in the request body.;To:RDoc::Markup::BlankLineo; ; [I"DThis method support both application/x-www-form-urlencoded and ;TI"multipart/form-data.;T: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@FI" Helpers;TcRDoc::NormalModule00PK!&jj@share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/delete%3f-i.rinu[U:RDoc::AnyMethod[iI" delete?:ETI"#Rack::Request::Helpers#delete?;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"MChecks the HTTP request method (or verb) to see if it was of type DELETE;T: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@FI" Helpers;TcRDoc::NormalModule00PK!T=share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/ssl%3f-i.rinu[U:RDoc::AnyMethod[iI" ssl?:ETI" Rack::Request::Helpers#ssl?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!F  Fshare/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/accept_encoding-i.rinu[U:RDoc::AnyMethod[iI"accept_encoding:ETI"+Rack::Request::Helpers#accept_encoding;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!my`Cshare/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/query_string-i.rinu[U:RDoc::AnyMethod[iI"query_string:ETI"(Rack::Request::Helpers#query_string;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!"JJshare/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/forwarded_authority-i.rinu[U:RDoc::AnyMethod[iI"forwarded_authority:ETI"/Rack::Request::Helpers#forwarded_authority;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!ehBshare/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/server_port-i.rinu[U:RDoc::AnyMethod[iI"server_port:ETI"'Rack::Request::Helpers#server_port;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!|_E;share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/path-i.rinu[U:RDoc::AnyMethod[iI" path:ETI" Rack::Request::Helpers#path;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!tXCshare/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/path_info%3d-i.rinu[U:RDoc::AnyMethod[iI"path_info=:ETI"&Rack::Request::Helpers#path_info=;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"(s);T@ FI" Helpers;TcRDoc::NormalModule00PK!nZ[[>share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/referer-i.rinu[U:RDoc::AnyMethod[iI" referer:ETI"#Rack::Request::Helpers#referer;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"the referer of the client;T: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[[I" referrer;To;; [; @; 0I"();T@FI" Helpers;TcRDoc::NormalModule00PK!j=share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/scheme-i.rinu[U:RDoc::AnyMethod[iI" scheme:ETI""Rack::Request::Helpers#scheme;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!ppy#jj@share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/unlink%3f-i.rinu[U:RDoc::AnyMethod[iI" unlink?:ETI"#Rack::Request::Helpers#unlink?;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"MChecks the HTTP request method (or verb) to see if it was of type UNLINK;T: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@FI" Helpers;TcRDoc::NormalModule00PK!"HH:share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/GET-i.rinu[U:RDoc::AnyMethod[iI"GET:ETI"Rack::Request::Helpers#GET;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"3Returns the data received in the query string.;T: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@FI" Helpers;TcRDoc::NormalModule00PK!*fd?WW;share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/host-i.rinu[U:RDoc::AnyMethod[iI" host:ETI" Rack::Request::Helpers#host;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"@Returns a formatted host, suitable for being used in a URI.;T: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@FI" Helpers;TcRDoc::NormalModule00PK!ygg?share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/trace%3f-i.rinu[U:RDoc::AnyMethod[iI" trace?:ETI""Rack::Request::Helpers#trace?;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"LChecks the HTTP request method (or verb) to see if it was of type TRACE;T: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@FI" Helpers;TcRDoc::NormalModule00PK! >l=share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/params-i.rinu[U:RDoc::AnyMethod[iI" params:ETI""Rack::Request::Helpers#params;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"$The union of GET and POST data.;To:RDoc::Markup::BlankLineo; ; [I"Note that modifications will not be persisted in the env. Use update_param or delete_param if you want to destructively modify params.;T: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@FI" Helpers;TcRDoc::NormalModule00PK!|Eshare/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/multithread%3f-i.rinu[U:RDoc::AnyMethod[iI"multithread?:ETI"(Rack::Request::Helpers#multithread?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!""@share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/authority-i.rinu[U:RDoc::AnyMethod[iI"authority:ETI"%Rack::Request::Helpers#authority;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"BThe authority of the incoming request as defined by RFC3976. ;TI"4https://tools.ietf.org/html/rfc3986#section-3.2;To:RDoc::Markup::BlankLineo; ; [I"+In HTTP/1, this is the `host` header. ;TI"7In HTTP/2, this is the `:authority` pseudo-header.;T: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@FI" Helpers;TcRDoc::NormalModule00PK!+  Fshare/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/default_session-i.rinu[U:RDoc::AnyMethod[iI"default_session:ETI"+Rack::Request::Helpers#default_session;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!:^!(?share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/fullpath-i.rinu[U:RDoc::AnyMethod[iI" fullpath:ETI"$Rack::Request::Helpers#fullpath;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!kGshare/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/forwarded_scheme-i.rinu[U:RDoc::AnyMethod[iI"forwarded_scheme:ETI",Rack::Request::Helpers#forwarded_scheme;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!#dd>share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/post%3f-i.rinu[U:RDoc::AnyMethod[iI" post?:ETI"!Rack::Request::Helpers#post?;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"KChecks the HTTP request method (or verb) to see if it was of type POST;T: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@FI" Helpers;TcRDoc::NormalModule00PK!F..Fshare/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/content_charset-i.rinu[U:RDoc::AnyMethod[iI"content_charset:ETI"+Rack::Request::Helpers#content_charset;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [ I"EThe character set of the request body if a "charset" media type ;TI"Eparameter was given, or nil if no "charset" was specified. Note ;TI"Dthat, per RFC2616, text/* media types that specify no explicit ;TI"-charset are to be considered ISO-8859-1.;T: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@FI" Helpers;TcRDoc::NormalModule00PK!*eAshare/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/media_type-i.rinu[U:RDoc::AnyMethod[iI"media_type:ETI"&Rack::Request::Helpers#media_type;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"FThe media type (type/subtype) portion of the CONTENT_TYPE header ;TI"Cwithout any media type parameters. e.g., when CONTENT_TYPE is ;TI"@"text/plain;charset=utf-8", the media-type is "text/plain".;To:RDoc::Markup::BlankLineo; ; [I"BFor more information on the use of media types in HTTP, see: ;TI"Ahttp://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7;T: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@FI" Helpers;TcRDoc::NormalModule00PK!iBshare/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/parse_query-i.rinu[U:RDoc::AnyMethod[iI"parse_query:ETI"'Rack::Request::Helpers#parse_query;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"(qs, d = '&');T@ FI" Helpers;TcRDoc::NormalModule00PK!G`%%Oshare/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/parse_http_accept_header-i.rinu[U:RDoc::AnyMethod[iI"parse_http_accept_header:ETI"4Rack::Request::Helpers#parse_http_accept_header;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I" (header);T@ FI" Helpers;TcRDoc::NormalModule00PK!1`gg@share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/wrap_ipv6-i.rinu[U:RDoc::AnyMethod[iI"wrap_ipv6:ETI"%Rack::Request::Helpers#wrap_ipv6;TF: privateo:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"AAssist with compatibility when processing `X-Forwarded-For`.;T: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I" (host);T@FI" Helpers;TcRDoc::NormalModule00PK!~e$$Eshare/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/host_with_port-i.rinu[U:RDoc::AnyMethod[iI"host_with_port:ETI"*Rack::Request::Helpers#host_with_port;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"!(authority = self.authority);T@ FI" Helpers;TcRDoc::NormalModule00PK!ɰAshare/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/user_agent-i.rinu[U:RDoc::AnyMethod[iI"user_agent:ETI"&Rack::Request::Helpers#user_agent;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!@Kshare/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/extract_proto_header-i.rinu[U:RDoc::AnyMethod[iI"extract_proto_header:ETI"0Rack::Request::Helpers#extract_proto_header;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I" (header);T@ FI" Helpers;TcRDoc::NormalModule00PK!;=share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/xhr%3f-i.rinu[U:RDoc::AnyMethod[iI" xhr?:ETI" Rack::Request::Helpers#xhr?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!v;share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/port-i.rinu[U:RDoc::AnyMethod[iI" port:ETI" Rack::Request::Helpers#port;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!]tGGEshare/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/host_authority-i.rinu[U:RDoc::AnyMethod[iI"host_authority:ETI"*Rack::Request::Helpers#host_authority;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"The `HTTP_HOST` header.;T: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@FI" Helpers;TcRDoc::NormalModule00PK!V Paa=share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/get%3f-i.rinu[U:RDoc::AnyMethod[iI" get?:ETI" Rack::Request::Helpers#get?;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"JChecks the HTTP request method (or verb) to see if it was of type GET;T: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@FI" Helpers;TcRDoc::NormalModule00PK!!XCshare/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/query_parser-i.rinu[U:RDoc::AnyMethod[iI"query_parser:ETI"(Rack::Request::Helpers#query_parser;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!75  Eshare/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/request_method-i.rinu[U:RDoc::AnyMethod[iI"request_method:ETI"*Rack::Request::Helpers#request_method;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!.u  Eshare/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/content_length-i.rinu[U:RDoc::AnyMethod[iI"content_length:ETI"*Rack::Request::Helpers#content_length;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!дdd>share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/link%3f-i.rinu[U:RDoc::AnyMethod[iI" link?:ETI"!Rack::Request::Helpers#link?;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"KChecks the HTTP request method (or verb) to see if it was of type LINK;T: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@FI" Helpers;TcRDoc::NormalModule00PK!Cshare/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/form_data%3f-i.rinu[U:RDoc::AnyMethod[iI"form_data?:ETI"&Rack::Request::Helpers#form_data?;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [ I"GDetermine whether the request body contains form-data by checking ;TI":the request Content-Type for one of the media-types: ;TI"G"application/x-www-form-urlencoded" or "multipart/form-data". The ;TI"?list of form-data media types can be modified through the ;TI"#+FORM_DATA_MEDIA_TYPES+ array.;To:RDoc::Markup::BlankLineo; ; [I"AA request body is also assumed to contain form-data when no ;TI"DContent-Type header is provided and the request_method is POST.;T: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@FI" Helpers;TcRDoc::NormalModule00PK!ovx9share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/ip-i.rinu[U:RDoc::AnyMethod[iI"ip:ETI"Rack::Request::Helpers#ip;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK![>share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/session-i.rinu[U:RDoc::AnyMethod[iI" session:ETI"#Rack::Request::Helpers#session;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!$-++?share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/referrer-i.rinu[U:RDoc::AnyMethod[iI" referrer:ETI"$Rack::Request::Helpers#referrer;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule0[I"Rack::Request::Helpers;TFI" referer;TPK!.7DD=share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/%5b%5d-i.rinu[U:RDoc::AnyMethod[iI"[]:ETI"Rack::Request::Helpers#[];TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I".shortcut for request.params[key];T: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I" (key);T@FI" Helpers;TcRDoc::NormalModule00PK!ىFshare/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/split_authority-i.rinu[U:RDoc::AnyMethod[iI"split_authority:ETI"+Rack::Request::Helpers#split_authority;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"(authority);T@ FI" Helpers;TcRDoc::NormalModule00PK!>J6  Fshare/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/parse_multipart-i.rinu[U:RDoc::AnyMethod[iI"parse_multipart:ETI"+Rack::Request::Helpers#parse_multipart;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!˭-  Gshare/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/trusted_proxy%3f-i.rinu[U:RDoc::AnyMethod[iI"trusted_proxy?:ETI"*Rack::Request::Helpers#trusted_proxy?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I" (ip);T@ FI" Helpers;TcRDoc::NormalModule00PK!|gg?share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/patch%3f-i.rinu[U:RDoc::AnyMethod[iI" patch?:ETI""Rack::Request::Helpers#patch?;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"LChecks the HTTP request method (or verb) to see if it was of type PATCH;T: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@FI" Helpers;TcRDoc::NormalModule00PK!єooCshare/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/update_param-i.rinu[U:RDoc::AnyMethod[iI"update_param:ETI"(Rack::Request::Helpers#update_param;TF: publico:RDoc::Markup::Document: @parts[ o:RDoc::Markup::Paragraph; [I"TDestructively update a parameter, whether it's in GET and/or POST. Returns nil.;To:RDoc::Markup::BlankLineo; ; [I"The parameter is updated wherever it was previous defined, so GET, POST, or both. If it wasn't previously defined, it's inserted into GET.;T@o; ; [I"/env['rack.input'] is not touched.;T: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I" (k, v);T@FI" Helpers;TcRDoc::NormalModule00PK!^F\mmAshare/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/options%3f-i.rinu[U:RDoc::AnyMethod[iI" options?:ETI"$Rack::Request::Helpers#options?;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"NChecks the HTTP request method (or verb) to see if it was of type OPTIONS;T: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@FI" Helpers;TcRDoc::NormalModule00PK!X|  Fshare/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/session_options-i.rinu[U:RDoc::AnyMethod[iI"session_options:ETI"+Rack::Request::Helpers#session_options;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!;W11Rshare/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/reject_trusted_ip_addresses-i.rinu[U:RDoc::AnyMethod[iI" reject_trusted_ip_addresses:ETI"7Rack::Request::Helpers#reject_trusted_ip_addresses;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"(ip_addresses);T@ FI" Helpers;TcRDoc::NormalModule00PK!kWBshare/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/script_name-i.rinu[U:RDoc::AnyMethod[iI"script_name:ETI"'Rack::Request::Helpers#script_name;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!dd>share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/head%3f-i.rinu[U:RDoc::AnyMethod[iI" head?:ETI"!Rack::Request::Helpers#head?;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"KChecks the HTTP request method (or verb) to see if it was of type HEAD;T: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@FI" Helpers;TcRDoc::NormalModule00PK!qx?share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/hostname-i.rinu[U:RDoc::AnyMethod[iI" hostname:ETI"$Rack::Request::Helpers#hostname;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [ I"EReturns an address suitable for being to resolve to an address. ;TI"JIn the case of a domain name or IPv4 address, the result is the same ;TI"Jas +host+. In the case of IPv6 or future address formats, the square ;TI"brackets are removed.;T: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@FI" Helpers;TcRDoc::NormalModule00PK!XHshare/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/media_type_params-i.rinu[U:RDoc::AnyMethod[iI"media_type_params:ETI"-Rack::Request::Helpers#media_type_params;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [ I"FThe media type parameters provided in CONTENT_TYPE as a Hash, or ;TI"Dan empty Hash if no CONTENT_TYPE or media-type parameters were ;TI"Kprovided. e.g., when the CONTENT_TYPE is "text/plain;charset=utf-8", ;TI"2this method responds with the following Hash:;To:RDoc::Markup::Verbatim; [I"{ 'charset' => 'utf-8' };T: @format0: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@FI" Helpers;TcRDoc::NormalModule00PK!  Fshare/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/accept_language-i.rinu[U:RDoc::AnyMethod[iI"accept_language:ETI"+Rack::Request::Helpers#accept_language;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!R<@share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/path_info-i.rinu[U:RDoc::AnyMethod[iI"path_info:ETI"%Rack::Request::Helpers#path_info;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!?s1H?share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/base_url-i.rinu[U:RDoc::AnyMethod[iI" base_url:ETI"$Rack::Request::Helpers#base_url;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!yCshare/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/content_type-i.rinu[U:RDoc::AnyMethod[iI"content_type:ETI"(Rack::Request::Helpers#content_type;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!Id;share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/body-i.rinu[U:RDoc::AnyMethod[iI" body:ETI" Rack::Request::Helpers#body;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!7x>share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/cookies-i.rinu[U:RDoc::AnyMethod[iI" cookies:ETI"#Rack::Request::Helpers#cookies;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!91  Eshare/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/forwarded_port-i.rinu[U:RDoc::AnyMethod[iI"forwarded_port:ETI"*Rack::Request::Helpers#forwarded_port;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!aa=share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/put%3f-i.rinu[U:RDoc::AnyMethod[iI" put?:ETI" Rack::Request::Helpers#put?;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"JChecks the HTTP request method (or verb) to see if it was of type PUT;T: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@FI" Helpers;TcRDoc::NormalModule00PK!ADshare/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/forwarded_for-i.rinu[U:RDoc::AnyMethod[iI"forwarded_for:ETI")Rack::Request::Helpers#forwarded_for;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!x#zHshare/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/parseable_data%3f-i.rinu[U:RDoc::AnyMethod[iI"parseable_data?:ETI"+Rack::Request::Helpers#parseable_data?;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"BDetermine whether the request body contains data by checking ;TI"Ethe request media_type against registered parse-data media-types;T: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@FI" Helpers;TcRDoc::NormalModule00PK!)Eshare/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/script_name%3d-i.rinu[U:RDoc::AnyMethod[iI"script_name=:ETI"(Rack::Request::Helpers#script_name=;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"(s);T@ FI" Helpers;TcRDoc::NormalModule00PK!4eeCshare/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/delete_param-i.rinu[U:RDoc::AnyMethod[iI"delete_param:ETI"(Rack::Request::Helpers#delete_param;TF: publico:RDoc::Markup::Document: @parts[ o:RDoc::Markup::Paragraph; [I"oDestructively delete a parameter, whether it's in GET or POST. Returns the value of the deleted parameter.;To:RDoc::Markup::BlankLineo; ; [I"nIf the parameter is in both GET and POST, the POST value takes precedence since that's how #params works.;T@o; ; [I"/env['rack.input'] is not touched.;T: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"(k);T@FI" Helpers;TcRDoc::NormalModule00PK!5#>>@share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/values_at-i.rinu[U:RDoc::AnyMethod[iI"values_at:ETI"%Rack::Request::Helpers#values_at;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"like Hash#values_at;T: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I" (*keys);T@FI" Helpers;TcRDoc::NormalModule00PK!A[[:share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/url-i.rinu[U:RDoc::AnyMethod[iI"url:ETI"Rack::Request::Helpers#url;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"FTries to return a remake of the original request URL as a string.;T: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@FI" Helpers;TcRDoc::NormalModule00PK!w5=share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/logger-i.rinu[U:RDoc::AnyMethod[iI" logger:ETI""Rack::Request::Helpers#logger;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!AhGshare/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/server_authority-i.rinu[U:RDoc::AnyMethod[iI"server_authority:ETI",Rack::Request::Helpers#server_authority;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"EThe authority as defined by the `SERVER_NAME` and `SERVER_PORT` ;TI"variables.;T: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@FI" Helpers;TcRDoc::NormalModule00PK!yEshare/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/allowed_scheme-i.rinu[U:RDoc::AnyMethod[iI"allowed_scheme:ETI"*Rack::Request::Helpers#allowed_scheme;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I" (header);T@ FI" Helpers;TcRDoc::NormalModule00PK!  Cshare/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/split_header-i.rinu[U:RDoc::AnyMethod[iI"split_header:ETI"(Rack::Request::Helpers#split_header;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I" (value);T@ FI" Helpers;TcRDoc::NormalModule00PK!jBshare/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/cdesc-Helpers.rinu[U:RDoc::NormalModule[iI" Helpers:ETI"Rack::Request::Helpers;T0o:RDoc::Markup::Document: @parts[o;;[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[U:RDoc::Constant[iI"FORM_DATA_MEDIA_TYPES;TI"2Rack::Request::Helpers::FORM_DATA_MEDIA_TYPES;T: public0o;;[o:RDoc::Markup::Paragraph;[I"EThe set of form-data media-types. Requests that do not indicate ;TI"Fone of the media types present in this list will not be eligible ;TI"#for form-data / param parsing.;T; @ ; 0@ @cRDoc::NormalModule0U; [iI"PARSEABLE_DATA_MEDIA_TYPES;TI"7Rack::Request::Helpers::PARSEABLE_DATA_MEDIA_TYPES;T; 0o;;[o; ;[I";The set of media-types. Requests that do not indicate ;TI"Fone of the media types present in this list will not be eligible ;TI"Bfor param parsing like soap attachments or generic multiparts;T; @ ; 0@ @@0U; [iI"DEFAULT_PORTS;TI"*Rack::Request::Helpers::DEFAULT_PORTS;T; 0o;;[o; ;[I"FDefault ports depending on scheme. Used to decide whether or not ;TI",to include the port in a generated URI.;T; @ ; 0@ @@0U; [iI"HTTP_X_FORWARDED_FOR;TI"1Rack::Request::Helpers::HTTP_X_FORWARDED_FOR;T; 0o;;[o; ;[I"request.params[key] = value;To:RDoc::Markup::BlankLineo; ; [I"Note that modifications will not be persisted in the env. Use update_param or delete_param if you want to destructively modify params.;T: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"(key, value);T@FI" Helpers;TcRDoc::NormalModule00PK!È*8share/gems/doc/rack-2.2.4/ri/Rack/Request/ip_filter-c.rinu[U:RDoc::Attr[iI"ip_filter:ETI"Rack::Request::ip_filter;TI"RW;T: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below0T@ I"Rack::Request;TcRDoc::NormalClass0PK!e|P;share/gems/doc/rack-2.2.4/ri/Rack/Request/update_param-i.rinu[U:RDoc::AnyMethod[iI"update_param:ETI"Rack::Request#update_param;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I" (k, v);T@ TI" Request;TcRDoc::NormalClass00PK!s:share/gems/doc/rack-2.2.4/ri/Rack/Request/cdesc-Request.rinu[U:RDoc::NormalClass[iI" Request:ETI"Rack::Request;TI" Object;To:RDoc::Markup::Document: @parts[o;;[o:RDoc::Markup::Paragraph;[I"=Rack::Request provides a convenient interface to a Rack ;TI"Henvironment. It is stateless, the environment +env+ passed to the ;TI"+constructor will be directly modified.;To:RDoc::Markup::BlankLineo:RDoc::Markup::Verbatim;[I""req = Rack::Request.new(env) ;TI"req.post? ;TI"req.params["data"];T: @format0: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below0; 0;0[[ I"ip_filter;TI"RW;T: publicTI"lib/rack/request.rb;T[U:RDoc::Constant[iI"ALLOWED_SCHEMES;TI"#Rack::Request::ALLOWED_SCHEMES;T;0o;;[; @;0@@cRDoc::NormalClass0U;[iI"SCHEME_WHITELIST;TI"$Rack::Request::SCHEME_WHITELIST;T;0o;;[; @;0@@@&0[[I"Env;To;;[; @;0@[I" Helpers;To;;[; @;0@[[I" class;T[[;[[I"new;T@[:protected[[: private[[I" instance;T[[;[[I"delete_param;T@[I" params;T@[I"update_param;T@[;[[;[[[U:RDoc::Context::Section[i0o;;[; 0;0[@I" Rack;TcRDoc::NormalModulePK!z>;share/gems/doc/rack-2.2.4/ri/Rack/Request/delete_param-i.rinu[U:RDoc::AnyMethod[iI"delete_param:ETI"Rack::Request#delete_param;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"(k);T@ TI" Request;TcRDoc::NormalClass00PK! @LL=share/gems/doc/rack-2.2.4/ri/Rack/Request/Env/get_header-i.rinu[U:RDoc::AnyMethod[iI"get_header:ETI""Rack::Request::Env#get_header;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"-Get a request specific value for `name`.;T: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I" (name);T@FI"Env;TcRDoc::NormalModule00PK!)g||@share/gems/doc/rack-2.2.4/ri/Rack/Request/Env/has_header%3f-i.rinu[U:RDoc::AnyMethod[iI"has_header?:ETI"#Rack::Request::Env#has_header?;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"GPredicate method to test to see if `name` has been set as request ;TI"specific data;T: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I" (name);T@FI"Env;TcRDoc::NormalModule00PK!)hL6share/gems/doc/rack-2.2.4/ri/Rack/Request/Env/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"Rack::Request::Env::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@ TI"Env;TcRDoc::NormalModule00PK!e8=share/gems/doc/rack-2.2.4/ri/Rack/Request/Env/add_header-i.rinu[U:RDoc::AnyMethod[iI"add_header:ETI""Rack::Request::Env#add_header;TF: publico:RDoc::Markup::Document: @parts[ o:RDoc::Markup::Paragraph; [I"0Add a header that may have multiple values.;To:RDoc::Markup::BlankLineo; ; [I" Example:;To:RDoc::Markup::Verbatim; [ I".request.add_header 'Accept', 'image/png' ;TI"(request.add_header 'Accept', '*/*' ;TI" ;TI"@assert_equal 'image/png,*/*', request.get_header('Accept') ;T: @format0o; ; [I"Ahttp://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2;T: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I" (key, v);T@FI"Env;TcRDoc::NormalModule00PK!ӏ?share/gems/doc/rack-2.2.4/ri/Rack/Request/Env/fetch_header-i.rinu[U:RDoc::AnyMethod[iI"fetch_header:ETI"$Rack::Request::Env#fetch_header;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"NIf a block is given, it yields to the block if the value hasn't been set ;TI"on the request.;T: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"(name, &block);T@FI"Env;TcRDoc::NormalModule00PK!S446share/gems/doc/rack-2.2.4/ri/Rack/Request/Env/env-i.rinu[U:RDoc::Attr[iI"env:ETI"Rack::Request::Env#env;TI"R;T: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"$The environment of the request.;T: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below0F@I"Rack::Request::Env;TcRDoc::NormalModule0PK!t˰  Bshare/gems/doc/rack-2.2.4/ri/Rack/Request/Env/initialize_copy-i.rinu[U:RDoc::AnyMethod[iI"initialize_copy:ETI"'Rack::Request::Env#initialize_copy;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I" (other);T@ FI"Env;TcRDoc::NormalModule00PK!34UU@share/gems/doc/rack-2.2.4/ri/Rack/Request/Env/delete_header-i.rinu[U:RDoc::AnyMethod[iI"delete_header:ETI"%Rack::Request::Env#delete_header;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"0Delete a request specific value for `name`.;T: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I" (name);T@FI"Env;TcRDoc::NormalModule00PK!UU=share/gems/doc/rack-2.2.4/ri/Rack/Request/Env/set_header-i.rinu[U:RDoc::AnyMethod[iI"set_header:ETI""Rack::Request::Env#set_header;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"3Set a request specific value for `name` to `v`;T: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"(name, v);T@FI"Env;TcRDoc::NormalModule00PK!ątt:share/gems/doc/rack-2.2.4/ri/Rack/Request/Env/cdesc-Env.rinu[U:RDoc::NormalModule[iI"Env:ETI"Rack::Request::Env;T0o:RDoc::Markup::Document: @parts[o;;[: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[ I"env;TI"R;T: publicFI"lib/rack/request.rb;T[[[[I" class;T[[; [[I"new;T@[:protected[[: private[[I" instance;T[[; [ [I"add_header;T@[I"delete_header;T@[I"each_header;T@[I"fetch_header;T@[I"get_header;T@[I"has_header?;T@[I"initialize_copy;T@[I"set_header;T@[; [[; [[[U:RDoc::Context::Section[i0o;;[; 0; 0[@ I"Rack::Request;TcRDoc::NormalClassPK!mii>share/gems/doc/rack-2.2.4/ri/Rack/Request/Env/each_header-i.rinu[U:RDoc::AnyMethod[iI"each_header:ETI"#Rack::Request::Env#each_header;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"FLoops through each key / value pair in the request specific data.;T: @fileI"lib/rack/request.rb;T:0@omit_headings_from_table_of_contents_below000[I" (&block);T@FI"Env;TcRDoc::NormalModule00PK!_ ph/share/gems/doc/rack-2.2.4/ri/Rack/Lock/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"Rack::Lock::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/lock.rb;T:0@omit_headings_from_table_of_contents_below000[I"(app, mutex = Mutex.new);T@ FI" Lock;TcRDoc::NormalClass00PK!.v:ZZ4share/gems/doc/rack-2.2.4/ri/Rack/Lock/cdesc-Lock.rinu[U:RDoc::NormalClass[iI" Lock:ETI"Rack::Lock;TI" Object;To:RDoc::Markup::Document: @parts[o;;[o:RDoc::Markup::Paragraph;[I"JRack::Lock locks every request inside a mutex, so that every request ;TI"0will effectively be executed synchronously.;T: @fileI"lib/rack/lock.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[[I"new;TI"lib/rack/lock.rb;T[:protected[[: private[[I" instance;T[[; [[I" call;T@[; [[;[[I" unlock;T@[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I" Rack;TcRDoc::NormalModulePK!DE2share/gems/doc/rack-2.2.4/ri/Rack/Lock/unlock-i.rinu[U:RDoc::AnyMethod[iI" unlock:ETI"Rack::Lock#unlock;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/lock.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Lock;TcRDoc::NormalClass00PK!HU0share/gems/doc/rack-2.2.4/ri/Rack/Lock/call-i.rinu[U:RDoc::AnyMethod[iI" call:ETI"Rack::Lock#call;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/lock.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@ FI" Lock;TcRDoc::NormalClass00PK!]Lshare/gems/doc/rack-2.2.4/ri/Rack/RegexpExtensions/cdesc-RegexpExtensions.rinu[U:RDoc::NormalModule[iI"RegexpExtensions:ETI"Rack::RegexpExtensions;T0o:RDoc::Markup::Document: @parts[o;;[: @fileI" lib/rack/core_ext/regexp.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[[:protected[[: private[[I" instance;T[[; [[I" match?;TI" lib/rack/core_ext/regexp.rb;T[; [[; [[[U:RDoc::Context::Section[i0o;;[; 0; 0[@ I" Rack;TcRDoc::NormalModulePK! Ҡ@share/gems/doc/rack-2.2.4/ri/Rack/RegexpExtensions/match%3f-i.rinu[U:RDoc::AnyMethod[iI" match?:ETI""Rack::RegexpExtensions#match?;TF: publico:RDoc::Markup::Document: @parts[: @fileI" lib/rack/core_ext/regexp.rb;T:0@omit_headings_from_table_of_contents_below000[I"(string, pos = 0);T@ FI"RegexpExtensions;TcRDoc::NormalModule00PK!Q3share/gems/doc/rack-2.2.4/ri/Rack/Handler/pick-c.rinu[U:RDoc::AnyMethod[iI" pick:ETI"Rack::Handler::pick;TT: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"KSelect first available Rack handler given an `Array` of server names. ;TI"0Raises `LoadError` if no handler was found.;To:RDoc::Markup::BlankLineo:RDoc::Markup::Verbatim; [I" > pick ['thin', 'webrick'] ;TI"=> Rack::Handler::WEBrick;T: @format0: @fileI"lib/rack/handler.rb;T:0@omit_headings_from_table_of_contents_below000[I"(server_names);T@FI" Handler;TcRDoc::NormalModule00PK!0U<share/gems/doc/rack-2.2.4/ri/Rack/Handler/CGI/send_body-c.rinu[U:RDoc::AnyMethod[iI"send_body:ETI""Rack::Handler::CGI::send_body;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/handler/cgi.rb;T:0@omit_headings_from_table_of_contents_below000[I" (body);T@ FI"CGI;TcRDoc::NormalClass00PK!e:share/gems/doc/rack-2.2.4/ri/Rack/Handler/CGI/cdesc-CGI.rinu[U:RDoc::NormalClass[iI"CGI:ETI"Rack::Handler::CGI;TI" Object;To:RDoc::Markup::Document: @parts[o;;[: @fileI"lib/rack/handler/cgi.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[ [I"run;TI"lib/rack/handler/cgi.rb;T[I"send_body;T@[I"send_headers;T@[I" serve;T@[:protected[[: private[[I" instance;T[[; [[; [[; [[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I"Rack::Handler;TcRDoc::NormalModulePK!e6 ?share/gems/doc/rack-2.2.4/ri/Rack/Handler/CGI/send_headers-c.rinu[U:RDoc::AnyMethod[iI"send_headers:ETI"%Rack::Handler::CGI::send_headers;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/handler/cgi.rb;T:0@omit_headings_from_table_of_contents_below000[I"(status, headers);T@ FI"CGI;TcRDoc::NormalClass00PK!6share/gems/doc/rack-2.2.4/ri/Rack/Handler/CGI/run-c.rinu[U:RDoc::AnyMethod[iI"run:ETI"Rack::Handler::CGI::run;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/handler/cgi.rb;T:0@omit_headings_from_table_of_contents_below000[I"(app, **options);T@ FI"CGI;TcRDoc::NormalClass00PK!{8share/gems/doc/rack-2.2.4/ri/Rack/Handler/CGI/serve-c.rinu[U:RDoc::AnyMethod[iI" serve:ETI"Rack::Handler::CGI::serve;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/handler/cgi.rb;T:0@omit_headings_from_table_of_contents_below000[I" (app);T@ FI"CGI;TcRDoc::NormalClass00PK!D?share/gems/doc/rack-2.2.4/ri/Rack/Handler/WEBrick/shutdown-c.rinu[U:RDoc::AnyMethod[iI" shutdown:ETI"%Rack::Handler::WEBrick::shutdown;TT: publico:RDoc::Markup::Document: @parts[: @fileI" lib/rack/handler/webrick.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" WEBrick;TcRDoc::NormalClass00PK!=U:share/gems/doc/rack-2.2.4/ri/Rack/Handler/WEBrick/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI" Rack::Handler::WEBrick::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI" lib/rack/handler/webrick.rb;T:0@omit_headings_from_table_of_contents_below000[I"(server, app);T@ TI" WEBrick;TcRDoc::NormalClass00PK!! ,Dshare/gems/doc/rack-2.2.4/ri/Rack/Handler/WEBrick/valid_options-c.rinu[U:RDoc::AnyMethod[iI"valid_options:ETI"*Rack::Handler::WEBrick::valid_options;TT: publico:RDoc::Markup::Document: @parts[: @fileI" lib/rack/handler/webrick.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" WEBrick;TcRDoc::NormalClass00PK!/5:share/gems/doc/rack-2.2.4/ri/Rack/Handler/WEBrick/run-c.rinu[U:RDoc::AnyMethod[iI"run:ETI" Rack::Handler::WEBrick::run;TT: publico:RDoc::Markup::Document: @parts[: @fileI" lib/rack/handler/webrick.rb;T:0@omit_headings_from_table_of_contents_below00I" server;T[I"(app, **options);T@ FI" WEBrick;TcRDoc::NormalClass00PK!  >share/gems/doc/rack-2.2.4/ri/Rack/Handler/WEBrick/service-i.rinu[U:RDoc::AnyMethod[iI" service:ETI"#Rack::Handler::WEBrick#service;TF: publico:RDoc::Markup::Document: @parts[: @fileI" lib/rack/handler/webrick.rb;T:0@omit_headings_from_table_of_contents_below000[I"(req, res);T@ FI" WEBrick;TcRDoc::NormalClass00PK!u55Bshare/gems/doc/rack-2.2.4/ri/Rack/Handler/WEBrick/cdesc-WEBrick.rinu[U:RDoc::NormalClass[iI" WEBrick:ETI"Rack::Handler::WEBrick;TI"*WEBrick::HTTPServlet::AbstractServlet;To:RDoc::Markup::Document: @parts[o;;[: @fileI" lib/rack/handler/webrick.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[ [I"new;TI" lib/rack/handler/webrick.rb;T[I"run;T@[I" shutdown;T@[I"valid_options;T@[:protected[[: private[[I" instance;T[[; [[I" service;T@[; [[; [[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I"Rack::Handler;TcRDoc::NormalModulePK!Q$.6share/gems/doc/rack-2.2.4/ri/Rack/Handler/default-c.rinu[U:RDoc::AnyMethod[iI" default:ETI"Rack::Handler::default;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/handler.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Handler;TcRDoc::NormalModule00PK!<share/gems/doc/rack-2.2.4/ri/Rack/Handler/Thin/cdesc-Thin.rinu[U:RDoc::NormalClass[iI" Thin:ETI"Rack::Handler::Thin;TI" Object;To:RDoc::Markup::Document: @parts[o;;[: @fileI"lib/rack/handler/thin.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[[I"run;TI"lib/rack/handler/thin.rb;T[I"valid_options;T@[:protected[[: private[[I" instance;T[[; [[; [[; [[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I"Rack::Handler;TcRDoc::NormalModulePK!̯Ashare/gems/doc/rack-2.2.4/ri/Rack/Handler/Thin/valid_options-c.rinu[U:RDoc::AnyMethod[iI"valid_options:ETI"'Rack::Handler::Thin::valid_options;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/handler/thin.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Thin;TcRDoc::NormalClass00PK!N|  7share/gems/doc/rack-2.2.4/ri/Rack/Handler/Thin/run-c.rinu[U:RDoc::AnyMethod[iI"run:ETI"Rack::Handler::Thin::run;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/handler/thin.rb;T:0@omit_headings_from_table_of_contents_below00I" server;T[I"(app, **options);T@ FI" Thin;TcRDoc::NormalClass00PK!:share/gems/doc/rack-2.2.4/ri/Rack/Handler/cdesc-Handler.rinu[U:RDoc::NormalModule[iI" Handler:ETI"Rack::Handler;T0o:RDoc::Markup::Document: @parts[ o;;[ o:RDoc::Markup::Paragraph;[I".*Handlers* connect web servers with Rack.;To:RDoc::Markup::BlankLineo; ;[I"BRack includes Handlers for Thin, WEBrick, FastCGI, CGI, SCGI ;TI"and LiteSpeed.;T@o; ;[I"NHandlers usually are activated by calling MyHandler.run(myapp). ;TI"EA second optional hash can be passed to include server-specific ;TI"configuration.;T: @fileI"lib/rack/handler.rb;T:0@omit_headings_from_table_of_contents_below0o;;[; I"lib/rack/handler/cgi.rb;T; 0o;;[; I" lib/rack/handler/fastcgi.rb;T; 0o;;[; I"lib/rack/handler/lsws.rb;T; 0o;;[; I"lib/rack/handler/scgi.rb;T; 0o;;[; I"lib/rack/handler/thin.rb;T; 0o;;[; I" lib/rack/handler/webrick.rb;T; 0; 0; 0[[U:RDoc::Constant[iI"SERVER_NAMES;TI" Rack::Handler::SERVER_NAMES;T: private0o;;[; @; 0@@cRDoc::NormalModule0[[[I" class;T[[: public[ [I" default;TI"lib/rack/handler.rb;T[I"get;T@?[I" pick;T@?[I" register;T@?[I"try_require;T@?[:protected[[;[[I" instance;T[[;[[;[[;[[[U:RDoc::Context::Section[i0o;;[; 0; 0[ @@@ @#@&@)@,I" Rack;T@5PK! @share/gems/doc/rack-2.2.4/ri/Rack/Handler/FastCGI/send_body-c.rinu[U:RDoc::AnyMethod[iI"send_body:ETI"&Rack::Handler::FastCGI::send_body;TT: publico:RDoc::Markup::Document: @parts[: @fileI" lib/rack/handler/fastcgi.rb;T:0@omit_headings_from_table_of_contents_below000[I"(out, body);T@ FI" FastCGI;TcRDoc::NormalClass00PK!~""Cshare/gems/doc/rack-2.2.4/ri/Rack/Handler/FastCGI/send_headers-c.rinu[U:RDoc::AnyMethod[iI"send_headers:ETI")Rack::Handler::FastCGI::send_headers;TT: publico:RDoc::Markup::Document: @parts[: @fileI" lib/rack/handler/fastcgi.rb;T:0@omit_headings_from_table_of_contents_below000[I"(out, status, headers);T@ FI" FastCGI;TcRDoc::NormalClass00PK!XFDshare/gems/doc/rack-2.2.4/ri/Rack/Handler/FastCGI/valid_options-c.rinu[U:RDoc::AnyMethod[iI"valid_options:ETI"*Rack::Handler::FastCGI::valid_options;TT: publico:RDoc::Markup::Document: @parts[: @fileI" lib/rack/handler/fastcgi.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" FastCGI;TcRDoc::NormalClass00PK!J  :share/gems/doc/rack-2.2.4/ri/Rack/Handler/FastCGI/run-c.rinu[U:RDoc::AnyMethod[iI"run:ETI" Rack::Handler::FastCGI::run;TT: publico:RDoc::Markup::Document: @parts[: @fileI" lib/rack/handler/fastcgi.rb;T:0@omit_headings_from_table_of_contents_below000[I"(app, **options);T@ FI" FastCGI;TcRDoc::NormalClass00PK!gBshare/gems/doc/rack-2.2.4/ri/Rack/Handler/FastCGI/cdesc-FastCGI.rinu[U:RDoc::NormalClass[iI" FastCGI:ETI"Rack::Handler::FastCGI;TI" Object;To:RDoc::Markup::Document: @parts[o;;[: @fileI" lib/rack/handler/fastcgi.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[ [I"run;TI" lib/rack/handler/fastcgi.rb;T[I"send_body;T@[I"send_headers;T@[I" serve;T@[I"valid_options;T@[:protected[[: private[[I" instance;T[[; [[; [[; [[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I"Rack::Handler;TcRDoc::NormalModulePK!}  <share/gems/doc/rack-2.2.4/ri/Rack/Handler/FastCGI/serve-c.rinu[U:RDoc::AnyMethod[iI" serve:ETI""Rack::Handler::FastCGI::serve;TT: publico:RDoc::Markup::Document: @parts[: @fileI" lib/rack/handler/fastcgi.rb;T:0@omit_headings_from_table_of_contents_below000[I"(request, app);T@ FI" FastCGI;TcRDoc::NormalClass00PK!Z|l7share/gems/doc/rack-2.2.4/ri/Rack/Handler/register-c.rinu[U:RDoc::AnyMethod[iI" register:ETI"Rack::Handler::register;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/handler.rb;T:0@omit_headings_from_table_of_contents_below000[I"(server, klass);T@ FI" Handler;TcRDoc::NormalModule00PK!L=share/gems/doc/rack-2.2.4/ri/Rack/Handler/LSWS/send_body-c.rinu[U:RDoc::AnyMethod[iI"send_body:ETI"#Rack::Handler::LSWS::send_body;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/handler/lsws.rb;T:0@omit_headings_from_table_of_contents_below000[I" (body);T@ FI" LSWS;TcRDoc::NormalClass00PK!ݢ@share/gems/doc/rack-2.2.4/ri/Rack/Handler/LSWS/send_headers-c.rinu[U:RDoc::AnyMethod[iI"send_headers:ETI"&Rack::Handler::LSWS::send_headers;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/handler/lsws.rb;T:0@omit_headings_from_table_of_contents_below000[I"(status, headers);T@ FI" LSWS;TcRDoc::NormalClass00PK!-"<share/gems/doc/rack-2.2.4/ri/Rack/Handler/LSWS/cdesc-LSWS.rinu[U:RDoc::NormalClass[iI" LSWS:ETI"Rack::Handler::LSWS;TI" Object;To:RDoc::Markup::Document: @parts[o;;[: @fileI"lib/rack/handler/lsws.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[ [I"run;TI"lib/rack/handler/lsws.rb;T[I"send_body;T@[I"send_headers;T@[I" serve;T@[:protected[[: private[[I" instance;T[[; [[; [[; [[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I"Rack::Handler;TcRDoc::NormalModulePK!)/7share/gems/doc/rack-2.2.4/ri/Rack/Handler/LSWS/run-c.rinu[U:RDoc::AnyMethod[iI"run:ETI"Rack::Handler::LSWS::run;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/handler/lsws.rb;T:0@omit_headings_from_table_of_contents_below000[I"(app, **options);T@ FI" LSWS;TcRDoc::NormalClass00PK!EY9share/gems/doc/rack-2.2.4/ri/Rack/Handler/LSWS/serve-c.rinu[U:RDoc::AnyMethod[iI" serve:ETI"Rack::Handler::LSWS::serve;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/handler/lsws.rb;T:0@omit_headings_from_table_of_contents_below000[I" (app);T@ FI" LSWS;TcRDoc::NormalClass00PK!"6%%Cshare/gems/doc/rack-2.2.4/ri/Rack/Handler/SCGI/process_request-i.rinu[U:RDoc::AnyMethod[iI"process_request:ETI"(Rack::Handler::SCGI#process_request;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/handler/scgi.rb;T:0@omit_headings_from_table_of_contents_below000[I""(request, input_body, socket);T@ FI" SCGI;TcRDoc::NormalClass00PK!K7share/gems/doc/rack-2.2.4/ri/Rack/Handler/SCGI/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"Rack::Handler::SCGI::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/handler/scgi.rb;T:0@omit_headings_from_table_of_contents_below000[I"(settings = {});T@ TI" SCGI;TcRDoc::NormalClass00PK! H7share/gems/doc/rack-2.2.4/ri/Rack/Handler/SCGI/app-i.rinu[U:RDoc::Attr[iI"app:ETI"Rack::Handler::SCGI#app;TI"RW;T: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/handler/scgi.rb;T:0@omit_headings_from_table_of_contents_below0F@ I"Rack::Handler::SCGI;TcRDoc::NormalClass0PK!,Ashare/gems/doc/rack-2.2.4/ri/Rack/Handler/SCGI/valid_options-c.rinu[U:RDoc::AnyMethod[iI"valid_options:ETI"'Rack::Handler::SCGI::valid_options;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/handler/scgi.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" SCGI;TcRDoc::NormalClass00PK!:aI ""<share/gems/doc/rack-2.2.4/ri/Rack/Handler/SCGI/cdesc-SCGI.rinu[U:RDoc::NormalClass[iI" SCGI:ETI"Rack::Handler::SCGI;TI"SCGI::Processor;To:RDoc::Markup::Document: @parts[o;;[: @fileI"lib/rack/handler/scgi.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[ I"app;TI"RW;T: publicFI"lib/rack/handler/scgi.rb;T[[[[I" class;T[[; [[I"new;T@[I"run;T@[I"valid_options;T@[:protected[[: private[[I" instance;T[[; [[I"process_request;T@[; [[; [[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I"Rack::Handler;TcRDoc::NormalModulePK!_m7share/gems/doc/rack-2.2.4/ri/Rack/Handler/SCGI/run-c.rinu[U:RDoc::AnyMethod[iI"run:ETI"Rack::Handler::SCGI::run;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/handler/scgi.rb;T:0@omit_headings_from_table_of_contents_below000[I"(app, **options);T@ FI" SCGI;TcRDoc::NormalClass00PK!pJa2share/gems/doc/rack-2.2.4/ri/Rack/Handler/get-c.rinu[U:RDoc::AnyMethod[iI"get:ETI"Rack::Handler::get;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/handler.rb;T:0@omit_headings_from_table_of_contents_below000[I" (server);T@ FI" Handler;TcRDoc::NormalModule00PK!Y:share/gems/doc/rack-2.2.4/ri/Rack/Handler/try_require-c.rinu[U:RDoc::AnyMethod[iI"try_require:ETI"Rack::Handler::try_require;TT: publico:RDoc::Markup::Document: @parts[ o:RDoc::Markup::Paragraph; [I"LTransforms server-name constants to their canonical form as filenames, ;TI"Gthen tries to require them but silences the LoadError if not found;To:RDoc::Markup::BlankLineo; ; [I"Naming convention:;T@o:RDoc::Markup::Verbatim; [ I"Foo # => 'foo' ;TI"FooBar # => 'foo_bar.rb' ;TI"FooBAR # => 'foobar.rb' ;TI"FOObar # => 'foobar.rb' ;TI"FOOBAR # => 'foobar.rb' ;TI"$FooBarBaz # => 'foo_bar_baz.rb';T: @format0: @fileI"lib/rack/handler.rb;T:0@omit_headings_from_table_of_contents_below000[I"(prefix, const_name);T@FI" Handler;TcRDoc::NormalModule00PK!wt/share/gems/doc/rack-2.2.4/ri/Rack/Head/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"Rack::Head::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/head.rb;T:0@omit_headings_from_table_of_contents_below000[I" (app);T@ FI" Head;TcRDoc::NormalClass00PK!f884share/gems/doc/rack-2.2.4/ri/Rack/Head/cdesc-Head.rinu[U:RDoc::NormalClass[iI" Head:ETI"Rack::Head;TI" Object;To:RDoc::Markup::Document: @parts[o;;[o:RDoc::Markup::Paragraph;[I"GRack::Head returns an empty body for all HEAD requests. It leaves ;TI""all other requests unchanged.;T: @fileI"lib/rack/head.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[[I"new;TI"lib/rack/head.rb;T[:protected[[: private[[I" instance;T[[; [[I" call;T@[; [[;[[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I" Rack;TcRDoc::NormalModulePK!0share/gems/doc/rack-2.2.4/ri/Rack/Head/call-i.rinu[U:RDoc::AnyMethod[iI" call:ETI"Rack::Head#call;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/head.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@ FI" Head;TcRDoc::NormalClass00PK!B^cc8share/gems/doc/rack-2.2.4/ri/Rack/Utils/escape_html-i.rinu[U:RDoc::AnyMethod[iI"escape_html:ETI"Rack::Utils#escape_html;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"GEscape ampersands, brackets and quotes to their HTML/XML entities.;T: @fileI"lib/rack/utils.rb;T:0@omit_headings_from_table_of_contents_below000[I" (string);T@FI" Utils;TcRDoc::NormalModule00PK!k{b  Ashare/gems/doc/rack-2.2.4/ri/Rack/Utils/parse_cookies_header-i.rinu[U:RDoc::AnyMethod[iI"parse_cookies_header:ETI"%Rack::Utils#parse_cookies_header;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/utils.rb;T:0@omit_headings_from_table_of_contents_below000[I" (header);T@ FI" Utils;TcRDoc::NormalModule00PK!à##Fshare/gems/doc/rack-2.2.4/ri/Rack/Utils/make_delete_cookie_header-i.rinu[U:RDoc::AnyMethod[iI"make_delete_cookie_header:ETI"*Rack::Utils#make_delete_cookie_header;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/utils.rb;T:0@omit_headings_from_table_of_contents_below000[I"(header, key, value);T@ FI" Utils;TcRDoc::NormalModule00PK!}}8share/gems/doc/rack-2.2.4/ri/Rack/Utils/escape_path-i.rinu[U:RDoc::AnyMethod[iI"escape_path:ETI"Rack::Utils#escape_path;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"MLike URI escaping, but with %20 instead of +. Strictly speaking this is ;TI"true URI escaping.;T: @fileI"lib/rack/utils.rb;T:0@omit_headings_from_table_of_contents_below000[I"(s);T@FI" Utils;TcRDoc::NormalModule00PK!&<share/gems/doc/rack-2.2.4/ri/Rack/Utils/key_space_limit-c.rinu[U:RDoc::AnyMethod[iI"key_space_limit:ETI"!Rack::Utils::key_space_limit;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/utils.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Utils;TcRDoc::NormalModule00PK!wFshare/gems/doc/rack-2.2.4/ri/Rack/Utils/HeaderHash/cdesc-HeaderHash.rinu[U:RDoc::NormalClass[iI"HeaderHash:ETI"Rack::Utils::HeaderHash;TI" Hash;To:RDoc::Markup::Document: @parts[: @file0:0@omit_headings_from_table_of_contents_below0[[[[[I" class;T[[: public[[:protected[[: private[[I" instance;T[[; [[; [[; [[[U:RDoc::Context::Section[i0o;;[; 0; 0[I"lib/rack/utils.rb;TI"Rack::Utils;TcRDoc::NormalModulePK!?share/gems/doc/rack-2.2.4/ri/Rack/Utils/parse_nested_query-i.rinu[U:RDoc::AnyMethod[iI"parse_nested_query:ETI"#Rack::Utils#parse_nested_query;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/utils.rb;T:0@omit_headings_from_table_of_contents_below000[I"(qs, d = nil);T@ FI" Utils;TcRDoc::NormalModule00PK!7@share/gems/doc/rack-2.2.4/ri/Rack/Utils/Context/cdesc-Context.rinu[U:RDoc::NormalClass[iI" Context:ETI"Rack::Utils::Context;TI" Object;To:RDoc::Markup::Document: @parts[o;;[o:RDoc::Markup::Paragraph;[ I"KContext allows the use of a compatible middleware at different points ;TI"Fin a request handling stack. A compatible middleware must define ;TI"N#context which should take the arguments env and app. The first of which ;TI"Mwould be the request environment. The second of which would be the rack ;TI"8application that the request would be forwarded to.;T: @fileI"lib/rack/utils.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[ I"app;TI"R;T: publicFI"lib/rack/utils.rb;T[ I"for;T@; F@[[[[I" class;T[[; [[I"new;T@[:protected[[: private[[I" instance;T[[; [[I" call;T@[I" context;T@[I"recontext;T@[; [[;[[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I"Rack::Utils;TcRDoc::NormalModulePK!M^8share/gems/doc/rack-2.2.4/ri/Rack/Utils/Context/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"Rack::Utils::Context::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/utils.rb;T:0@omit_headings_from_table_of_contents_below000[I"(app_f, app_r);T@ FI" Context;TcRDoc::NormalClass00PK!>^<share/gems/doc/rack-2.2.4/ri/Rack/Utils/Context/context-i.rinu[U:RDoc::AnyMethod[iI" context:ETI"!Rack::Utils::Context#context;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/utils.rb;T:0@omit_headings_from_table_of_contents_below000[I"(env, app = @app);T@ FI" Context;TcRDoc::NormalClass00PK!_^8share/gems/doc/rack-2.2.4/ri/Rack/Utils/Context/app-i.rinu[U:RDoc::Attr[iI"app:ETI"Rack::Utils::Context#app;TI"R;T: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/utils.rb;T:0@omit_headings_from_table_of_contents_below0F@ I"Rack::Utils::Context;TcRDoc::NormalClass0PK!=K8share/gems/doc/rack-2.2.4/ri/Rack/Utils/Context/for-i.rinu[U:RDoc::Attr[iI"for:ETI"Rack::Utils::Context#for;TI"R;T: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/utils.rb;T:0@omit_headings_from_table_of_contents_below0F@ I"Rack::Utils::Context;TcRDoc::NormalClass0PK!,9)9share/gems/doc/rack-2.2.4/ri/Rack/Utils/Context/call-i.rinu[U:RDoc::AnyMethod[iI" call:ETI"Rack::Utils::Context#call;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/utils.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@ FI" Context;TcRDoc::NormalClass00PK!y>share/gems/doc/rack-2.2.4/ri/Rack/Utils/Context/recontext-i.rinu[U:RDoc::AnyMethod[iI"recontext:ETI"#Rack::Utils::Context#recontext;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/utils.rb;T:0@omit_headings_from_table_of_contents_below000[I" (app);T@ FI" Context;TcRDoc::NormalClass00PK!uU553share/gems/doc/rack-2.2.4/ri/Rack/Utils/escape-i.rinu[U:RDoc::AnyMethod[iI" escape:ETI"Rack::Utils#escape;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"(URI escapes. (CGI style space to +);T: @fileI"lib/rack/utils.rb;T:0@omit_headings_from_table_of_contents_below000[I"(s);T@FI" Utils;TcRDoc::NormalModule00PK!4share/gems/doc/rack-2.2.4/ri/Rack/Utils/rfc2109-i.rinu[U:RDoc::AnyMethod[iI" rfc2109:ETI"Rack::Utils#rfc2109;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"OModified version of stdlib time.rb Time#rfc2822 to use '%d-%b-%Y' instead ;TI"of '% %b %Y'. ;TI"BIt assumes that the time is in GMT to comply to the RFC 2109.;To:RDoc::Markup::BlankLineo; ; [ I"NNOTE: I'm not sure the RFC says it requires GMT, but is ambiguous enough ;TI" \x27#{m[2].strip}\x27,"';T: @format0; @; 0@@@ 0U; [iI"STATUS_WITH_NO_ENTITY_BODY;TI",Rack::Utils::STATUS_WITH_NO_ENTITY_BODY;T; 0o;;[o; ;[I"IResponses with HTTP status codes that should not have an entity body;T; @; 0@@@ 0U; [iI"SYMBOL_TO_STATUS_CODE;TI"'Rack::Utils::SYMBOL_TO_STATUS_CODE;T; 0o;;[; @; 0@@@ 0U; [iI"PATH_SEPS;TI"Rack::Utils::PATH_SEPS;T; 0o;;[; @; 0@@@ 0U; [iI"NULL_BYTE;TI"Rack::Utils::NULL_BYTE;T; 0o;;[; @; 0@@@ 0[[[I" class;T[[; [ [I"key_space_limit;T@[I"key_space_limit=;T@[I"param_depth_limit;T@[I"param_depth_limit=;T@[:protected[[: private[[I" instance;T[[; [![I"add_cookie_to_header;T@[I" add_remove_cookie_to_header;T@[I"best_q_match;T@[I"build_nested_query;T@[I"build_query;T@[I"byte_ranges;T@[I"clean_path_info;T@[I"clock_time;T@[I"delete_cookie_header!;T@[I" escape;T@[I"escape_html;T@[I"escape_path;T@[I"get_byte_ranges;T@[I"make_delete_cookie_header;T@[I"parse_cookies;T@[I"parse_cookies_header;T@[I"parse_nested_query;T@[I"parse_query;T@[I" q_values;T@[I" rfc2109;T@[I" rfc2822;T@[I"secure_compare;T@[I"select_best_encoding;T@[I"set_cookie_header!;T@[I"status_code;T@[I" unescape;T@[I"unescape_path;T@[I"valid_path?;T@[;[[;[[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I" Rack;T@ PK!R:share/gems/doc/rack-2.2.4/ri/Rack/Utils/valid_path%3f-i.rinu[U:RDoc::AnyMethod[iI"valid_path?:ETI"Rack::Utils#valid_path?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/utils.rb;T:0@omit_headings_from_table_of_contents_below000[I" (path);T@ FI" Utils;TcRDoc::NormalModule00PK!8share/gems/doc/rack-2.2.4/ri/Rack/Utils/byte_ranges-i.rinu[U:RDoc::AnyMethod[iI"byte_ranges:ETI"Rack::Utils#byte_ranges;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"MParses the "Range:" header, if present, into an array of Range objects. ;TI"DReturns nil if the header is missing or syntactically invalid. ;TI"BReturns an empty array if none of the ranges are satisfiable.;T: @fileI"lib/rack/utils.rb;T:0@omit_headings_from_table_of_contents_below000[I"(env, size);T@FI" Utils;TcRDoc::NormalModule00PK!ã:share/gems/doc/rack-2.2.4/ri/Rack/Utils/parse_cookies-i.rinu[U:RDoc::AnyMethod[iI"parse_cookies:ETI"Rack::Utils#parse_cookies;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/utils.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@ FI" Utils;TcRDoc::NormalModule00PK!p8 Ashare/gems/doc/rack-2.2.4/ri/Rack/Utils/add_cookie_to_header-i.rinu[U:RDoc::AnyMethod[iI"add_cookie_to_header:ETI"%Rack::Utils#add_cookie_to_header;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/utils.rb;T:0@omit_headings_from_table_of_contents_below000[I"(header, key, value);T@ FI" Utils;TcRDoc::NormalModule00PK!,*Ashare/gems/doc/rack-2.2.4/ri/Rack/Utils/param_depth_limit%3d-c.rinu[U:RDoc::AnyMethod[iI"param_depth_limit=:ETI"$Rack::Utils::param_depth_limit=;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/utils.rb;T:0@omit_headings_from_table_of_contents_below000[I"(v);T@ FI" Utils;TcRDoc::NormalModule00PK!+?8share/gems/doc/rack-2.2.4/ri/Rack/Utils/status_code-i.rinu[U:RDoc::AnyMethod[iI"status_code:ETI"Rack::Utils#status_code;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/utils.rb;T:0@omit_headings_from_table_of_contents_below000[I" (status);T@ FI" Utils;TcRDoc::NormalModule00PK!=Ashare/gems/doc/rack-2.2.4/ri/Rack/Utils/set_cookie_header%21-i.rinu[U:RDoc::AnyMethod[iI"set_cookie_header!:ETI"#Rack::Utils#set_cookie_header!;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/utils.rb;T:0@omit_headings_from_table_of_contents_below000[I"(header, key, value);T@ FI" Utils;TcRDoc::NormalModule00PK!&29share/gems/doc/rack-2.2.4/ri/Rack/Utils/best_q_match-i.rinu[U:RDoc::AnyMethod[iI"best_q_match:ETI"Rack::Utils#best_q_match;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [ I"=Return best accept value to use, based on the algorithm ;TI"9in RFC 2616 Section 14. If there are multiple best ;TI"@matches (same specificity and quality), the value returned ;TI"is arbitrary.;T: @fileI"lib/rack/utils.rb;T:0@omit_headings_from_table_of_contents_below000[I"&(q_value_header, available_mimes);T@FI" Utils;TcRDoc::NormalModule00PK!'Hshare/gems/doc/rack-2.2.4/ri/Rack/Utils/add_remove_cookie_to_header-i.rinu[U:RDoc::AnyMethod[iI" add_remove_cookie_to_header:ETI",Rack::Utils#add_remove_cookie_to_header;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"KAdds a cookie that will *remove* a cookie from the client. Hence the ;TI"strange method name.;T: @fileI"lib/rack/utils.rb;T:0@omit_headings_from_table_of_contents_below000[I"(header, key, value = {});T@FI" Utils;TcRDoc::NormalModule00PK!VL >share/gems/doc/rack-2.2.4/ri/Rack/Utils/param_depth_limit-c.rinu[U:RDoc::AnyMethod[iI"param_depth_limit:ETI"#Rack::Utils::param_depth_limit;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/utils.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Utils;TcRDoc::NormalModule00PK!6+k1share/gems/doc/rack-2.2.4/ri/Rack/URLMap/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"Rack::URLMap::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/urlmap.rb;T:0@omit_headings_from_table_of_contents_below000[I"(map = {});T@ FI" URLMap;TcRDoc::NormalClass00PK!B3share/gems/doc/rack-2.2.4/ri/Rack/URLMap/remap-i.rinu[U:RDoc::AnyMethod[iI" remap:ETI"Rack::URLMap#remap;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/urlmap.rb;T:0@omit_headings_from_table_of_contents_below000[I" (map);T@ FI" URLMap;TcRDoc::NormalClass00PK!08share/gems/doc/rack-2.2.4/ri/Rack/URLMap/casecmp%3f-i.rinu[U:RDoc::AnyMethod[iI" casecmp?:ETI"Rack::URLMap#casecmp?;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/urlmap.rb;T:0@omit_headings_from_table_of_contents_below000[I" (v1, v2);T@ FI" URLMap;TcRDoc::NormalClass00PK!Dvjj8share/gems/doc/rack-2.2.4/ri/Rack/URLMap/cdesc-URLMap.rinu[U:RDoc::NormalClass[iI" URLMap:ETI"Rack::URLMap;TI" Object;To:RDoc::Markup::Document: @parts[o;;[ o:RDoc::Markup::Paragraph;[I"BRack::URLMap takes a hash mapping urls or paths to apps, and ;TI"Hdispatches accordingly. Support for HTTP/1.1 host names exists if ;TI"?the URLs start with http:// or https://.;To:RDoc::Markup::BlankLineo; ;[ I"FURLMap modifies the SCRIPT_NAME and PATH_INFO such that the part ;TI"Frelevant for dispatch is in the SCRIPT_NAME, and the rest in the ;TI"?PATH_INFO. This should be taken care of when you need to ;TI"2reconstruct the URL in order to create links.;T@o; ;[I"FURLMap dispatches in such a way that the longest paths are tried ;TI")first, since they are most specific.;T: @fileI"lib/rack/urlmap.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[[I"new;TI"lib/rack/urlmap.rb;T[:protected[[: private[[I" instance;T[[; [[I" call;T@*[I" remap;T@*[;[[;[[I" casecmp?;T@*[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I" Rack;TcRDoc::NormalModulePK!!q2share/gems/doc/rack-2.2.4/ri/Rack/URLMap/call-i.rinu[U:RDoc::AnyMethod[iI" call:ETI"Rack::URLMap#call;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/urlmap.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@ FI" URLMap;TcRDoc::NormalClass00PK! yy7share/gems/doc/rack-2.2.4/ri/Rack/MediaType/params-c.rinu[U:RDoc::AnyMethod[iI" params:ETI"Rack::MediaType::params;TT: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [ I"FThe media type parameters provided in CONTENT_TYPE as a Hash, or ;TI"Dan empty Hash if no CONTENT_TYPE or media-type parameters were ;TI"Kprovided. e.g., when the CONTENT_TYPE is "text/plain;charset=utf-8", ;TI"2this method responds with the following Hash:;To:RDoc::Markup::Verbatim; [I"{ 'charset' => 'utf-8' };T: @format0: @fileI"lib/rack/media_type.rb;T:0@omit_headings_from_table_of_contents_below000[I"(content_type);T@FI"MediaType;TcRDoc::NormalClass00PK!a>share/gems/doc/rack-2.2.4/ri/Rack/MediaType/cdesc-MediaType.rinu[U:RDoc::NormalClass[iI"MediaType:ETI"Rack::MediaType;TI" Object;To:RDoc::Markup::Document: @parts[o;;[o:RDoc::Markup::Paragraph;[I"ORack::MediaType parse media type and parameters out of content_type string;T: @fileI"lib/rack/media_type.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[U:RDoc::Constant[iI"SPLIT_PATTERN;TI"#Rack::MediaType::SPLIT_PATTERN;T: public0o;;[; @; 0@@cRDoc::NormalClass0[[[I" class;T[[; [[I" params;TI"lib/rack/media_type.rb;T[I" type;T@$[:protected[[: private[[I"strip_doublequotes;T@$[I" instance;T[[; [[;[[;[[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I" Rack;TcRDoc::NormalModulePK!ѧӭCshare/gems/doc/rack-2.2.4/ri/Rack/MediaType/strip_doublequotes-c.rinu[U:RDoc::AnyMethod[iI"strip_doublequotes:ETI"(Rack::MediaType::strip_doublequotes;TT: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/media_type.rb;T:0@omit_headings_from_table_of_contents_below000[I" (str);T@ FI"MediaType;TcRDoc::NormalClass00PK!i-l5share/gems/doc/rack-2.2.4/ri/Rack/MediaType/type-c.rinu[U:RDoc::AnyMethod[iI" type:ETI"Rack::MediaType::type;TT: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"FThe media type (type/subtype) portion of the CONTENT_TYPE header ;TI"Cwithout any media type parameters. e.g., when CONTENT_TYPE is ;TI"@"text/plain;charset=utf-8", the media-type is "text/plain".;To:RDoc::Markup::BlankLineo; ; [I"BFor more information on the use of media types in HTTP, see: ;TI"Ahttp://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.7;T: @fileI"lib/rack/media_type.rb;T:0@omit_headings_from_table_of_contents_below000[I"(content_type);T@FI"MediaType;TcRDoc::NormalClass00PK!ڻFshare/gems/doc/rack-2.2.4/ri/Rack/RewindableInput/make_rewindable-i.rinu[U:RDoc::AnyMethod[iI"make_rewindable:ETI"*Rack::RewindableInput#make_rewindable;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"!lib/rack/rewindable_input.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI"RewindableInput;TcRDoc::NormalClass00PK!~.K<<Xshare/gems/doc/rack-2.2.4/ri/Rack/RewindableInput/filesystem_has_posix_semantics%3f-i.rinu[U:RDoc::AnyMethod[iI"$filesystem_has_posix_semantics?:ETI":Rack::RewindableInput#filesystem_has_posix_semantics?;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"!lib/rack/rewindable_input.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI"RewindableInput;TcRDoc::NormalClass00PK!;:share/gems/doc/rack-2.2.4/ri/Rack/RewindableInput/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"Rack::RewindableInput::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI"!lib/rack/rewindable_input.rb;T:0@omit_headings_from_table_of_contents_below000[I" (io);T@ FI"RewindableInput;TcRDoc::NormalClass00PK!F9Jshare/gems/doc/rack-2.2.4/ri/Rack/RewindableInput/cdesc-RewindableInput.rinu[U:RDoc::NormalClass[iI"RewindableInput:ETI"Rack::RewindableInput;TI" Object;To:RDoc::Markup::Document: @parts[o;;[ o:RDoc::Markup::Paragraph;[I"[Class which can make any IO object rewindable, including non-rewindable ones. It does ;TI"Ethis by buffering the data into a tempfile, which is rewindable.;To:RDoc::Markup::BlankLineo; ;[I"[rack.input is required to be rewindable, so if your input stream IO is non-rewindable ;TI"Yby nature (e.g. a pipe or a socket) then you can wrap it in an object of this class ;TI""to easily make it rewindable.;T@o; ;[I"ZDon't forget to call #close when you're done. This frees up temporary resources that ;TI"MRewindableInput uses, though it does *not* close the original IO object.;T: @fileI"!lib/rack/rewindable_input.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[[I"new;TI"!lib/rack/rewindable_input.rb;T[:protected[[: private[[I" instance;T[[; [ [I" close;T@([I" each;T@([I" gets;T@([I" read;T@([I" rewind;T@([;[[;[[I"$filesystem_has_posix_semantics?;T@([I"make_rewindable;T@([[U:RDoc::Context::Section[i0o;;[; 0; 0[@I" Rack;TcRDoc::NormalModulePK!=t  ;share/gems/doc/rack-2.2.4/ri/Rack/RewindableInput/each-i.rinu[U:RDoc::AnyMethod[iI" each:ETI"Rack::RewindableInput#each;TF: publico:RDoc::Markup::Document: @parts[: @fileI"!lib/rack/rewindable_input.rb;T:0@omit_headings_from_table_of_contents_below000[I" (&block);T@ FI"RewindableInput;TcRDoc::NormalClass00PK!WA  ;share/gems/doc/rack-2.2.4/ri/Rack/RewindableInput/read-i.rinu[U:RDoc::AnyMethod[iI" read:ETI"Rack::RewindableInput#read;TF: publico:RDoc::Markup::Document: @parts[: @fileI"!lib/rack/rewindable_input.rb;T:0@omit_headings_from_table_of_contents_below000[I" (*args);T@ FI"RewindableInput;TcRDoc::NormalClass00PK!J`  =share/gems/doc/rack-2.2.4/ri/Rack/RewindableInput/rewind-i.rinu[U:RDoc::AnyMethod[iI" rewind:ETI"!Rack::RewindableInput#rewind;TF: publico:RDoc::Markup::Document: @parts[: @fileI"!lib/rack/rewindable_input.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI"RewindableInput;TcRDoc::NormalClass00PK!2^APP<share/gems/doc/rack-2.2.4/ri/Rack/RewindableInput/close-i.rinu[U:RDoc::AnyMethod[iI" close:ETI" Rack::RewindableInput#close;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"GCloses this RewindableInput object without closing the originally ;TI"Twrapped IO object. Cleans up any temporary resources that this RewindableInput ;TI"has created.;To:RDoc::Markup::BlankLineo; ; [I"SThis method may be called multiple times. It does nothing on subsequent calls.;T: @fileI"!lib/rack/rewindable_input.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@FI"RewindableInput;TcRDoc::NormalClass00PK!Bd+R;share/gems/doc/rack-2.2.4/ri/Rack/RewindableInput/gets-i.rinu[U:RDoc::AnyMethod[iI" gets:ETI"Rack::RewindableInput#gets;TF: publico:RDoc::Markup::Document: @parts[: @fileI"!lib/rack/rewindable_input.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI"RewindableInput;TcRDoc::NormalClass00PK!)*K  Eshare/gems/doc/rack-2.2.4/ri/Rack/Auth/Basic/Request/credentials-i.rinu[U:RDoc::AnyMethod[iI"credentials:ETI"+Rack::Auth::Basic::Request#credentials;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/auth/basic.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Request;TcRDoc::NormalClass00PK!\I  Eshare/gems/doc/rack-2.2.4/ri/Rack/Auth/Basic/Request/cdesc-Request.rinu[U:RDoc::NormalClass[iI" Request:ETI"Rack::Auth::Basic::Request;TI" Rack::Auth::AbstractRequest;To:RDoc::Markup::Document: @parts[o;;[: @fileI"lib/rack/auth/basic.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[[:protected[[: private[[I" instance;T[[; [[I" basic?;TI"lib/rack/auth/basic.rb;T[I"credentials;T@#[I" username;T@#[; [[; [[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I"Rack::Auth::Basic;TcRDoc::NormalClassPK!CBshare/gems/doc/rack-2.2.4/ri/Rack/Auth/Basic/Request/basic%3f-i.rinu[U:RDoc::AnyMethod[iI" basic?:ETI"&Rack::Auth::Basic::Request#basic?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/auth/basic.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Request;TcRDoc::NormalClass00PK!C/Bshare/gems/doc/rack-2.2.4/ri/Rack/Auth/Basic/Request/username-i.rinu[U:RDoc::AnyMethod[iI" username:ETI"(Rack::Auth::Basic::Request#username;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/auth/basic.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Request;TcRDoc::NormalClass00PK!5R];share/gems/doc/rack-2.2.4/ri/Rack/Auth/Basic/challenge-i.rinu[U:RDoc::AnyMethod[iI"challenge:ETI" Rack::Auth::Basic#challenge;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/auth/basic.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Basic;TcRDoc::NormalClass00PK!S>j:share/gems/doc/rack-2.2.4/ri/Rack/Auth/Basic/valid%3f-i.rinu[U:RDoc::AnyMethod[iI" valid?:ETI"Rack::Auth::Basic#valid?;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/auth/basic.rb;T:0@omit_headings_from_table_of_contents_below000[I" (auth);T@ FI" Basic;TcRDoc::NormalClass00PK! LQQ;share/gems/doc/rack-2.2.4/ri/Rack/Auth/Basic/cdesc-Basic.rinu[U:RDoc::NormalClass[iI" Basic:ETI"Rack::Auth::Basic;TI" Rack::Auth::AbstractHandler;To:RDoc::Markup::Document: @parts[o;;[ o:RDoc::Markup::Paragraph;[I"MRack::Auth::Basic implements HTTP Basic Authentication, as per RFC 2617.;To:RDoc::Markup::BlankLineo; ;[I"DInitialize with the Rack application that you want protecting, ;TI"Gand a block that checks if a username and password pair are valid.;T@o; ;[I"3See also: example/protectedlobster.rb;T: @fileI"lib/rack/auth/basic.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[[:protected[[: private[[I" instance;T[[; [[I" call;TI"lib/rack/auth/basic.rb;T[;[[;[[I"challenge;T@.[I" valid?;T@.[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I"Rack::Auth;TcRDoc::NormalModulePK!-X6share/gems/doc/rack-2.2.4/ri/Rack/Auth/Basic/call-i.rinu[U:RDoc::AnyMethod[iI" call:ETI"Rack::Auth::Basic#call;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/auth/basic.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@ FI" Basic;TcRDoc::NormalClass00PK!=Bshare/gems/doc/rack-2.2.4/ri/Rack/Auth/AbstractRequest/scheme-i.rinu[U:RDoc::AnyMethod[iI" scheme:ETI"'Rack::Auth::AbstractRequest#scheme;TF: publico:RDoc::Markup::Document: @parts[: @fileI"&lib/rack/auth/abstract/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI"AbstractRequest;TcRDoc::NormalClass00PK!Bshare/gems/doc/rack-2.2.4/ri/Rack/Auth/AbstractRequest/params-i.rinu[U:RDoc::AnyMethod[iI" params:ETI"'Rack::Auth::AbstractRequest#params;TF: publico:RDoc::Markup::Document: @parts[: @fileI"&lib/rack/auth/abstract/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI"AbstractRequest;TcRDoc::NormalClass00PK!0/Dshare/gems/doc/rack-2.2.4/ri/Rack/Auth/AbstractRequest/valid%3f-i.rinu[U:RDoc::AnyMethod[iI" valid?:ETI"'Rack::Auth::AbstractRequest#valid?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"&lib/rack/auth/abstract/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI"AbstractRequest;TcRDoc::NormalClass00PK!jOshare/gems/doc/rack-2.2.4/ri/Rack/Auth/AbstractRequest/cdesc-AbstractRequest.rinu[U:RDoc::NormalClass[iI"AbstractRequest:ETI" Rack::Auth::AbstractRequest;TI" Object;To:RDoc::Markup::Document: @parts[o;;[: @fileI"&lib/rack/auth/abstract/request.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[U:RDoc::Constant[iI"AUTHORIZATION_KEYS;TI"4Rack::Auth::AbstractRequest::AUTHORIZATION_KEYS;T: public0o;;[; @; 0@@cRDoc::NormalClass0[[[I" class;T[[; [[I"new;TI"&lib/rack/auth/abstract/request.rb;T[:protected[[: private[[I" instance;T[[; [ [I" params;T@![I" parts;T@![I"provided?;T@![I" request;T@![I" scheme;T@![I" valid?;T@![; [[;[[I"authorization_key;T@![[U:RDoc::Context::Section[i0o;;[; 0; 0[@I"Rack::Auth;TcRDoc::NormalModulePK!u1?share/gems/doc/rack-2.2.4/ri/Rack/Auth/AbstractRequest/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"%Rack::Auth::AbstractRequest::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI"&lib/rack/auth/abstract/request.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@ FI"AbstractRequest;TcRDoc::NormalClass00PK!XCshare/gems/doc/rack-2.2.4/ri/Rack/Auth/AbstractRequest/request-i.rinu[U:RDoc::AnyMethod[iI" request:ETI"(Rack::Auth::AbstractRequest#request;TF: publico:RDoc::Markup::Document: @parts[: @fileI"&lib/rack/auth/abstract/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI"AbstractRequest;TcRDoc::NormalClass00PK!,Ashare/gems/doc/rack-2.2.4/ri/Rack/Auth/AbstractRequest/parts-i.rinu[U:RDoc::AnyMethod[iI" parts:ETI"&Rack::Auth::AbstractRequest#parts;TF: publico:RDoc::Markup::Document: @parts[: @fileI"&lib/rack/auth/abstract/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI"AbstractRequest;TcRDoc::NormalClass00PK!d_Gshare/gems/doc/rack-2.2.4/ri/Rack/Auth/AbstractRequest/provided%3f-i.rinu[U:RDoc::AnyMethod[iI"provided?:ETI"*Rack::Auth::AbstractRequest#provided?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"&lib/rack/auth/abstract/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI"AbstractRequest;TcRDoc::NormalClass00PK!|L++Mshare/gems/doc/rack-2.2.4/ri/Rack/Auth/AbstractRequest/authorization_key-i.rinu[U:RDoc::AnyMethod[iI"authorization_key:ETI"2Rack::Auth::AbstractRequest#authorization_key;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"&lib/rack/auth/abstract/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI"AbstractRequest;TcRDoc::NormalClass00PK!wuOshare/gems/doc/rack-2.2.4/ri/Rack/Auth/AbstractHandler/cdesc-AbstractHandler.rinu[U:RDoc::NormalClass[iI"AbstractHandler:ETI" Rack::Auth::AbstractHandler;TI" Object;To:RDoc::Markup::Document: @parts[o;;[o:RDoc::Markup::Paragraph;[I"PRack::Auth::AbstractHandler implements common authentication functionality.;To:RDoc::Markup::BlankLineo; ;[I",+realm+ should be set for all handlers.;T: @fileI"&lib/rack/auth/abstract/handler.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[ I" realm;TI"RW;T: publicFI"&lib/rack/auth/abstract/handler.rb;T[[[[I" class;T[[; [[I"new;T@[:protected[[: private[[I" instance;T[[; [[;[[;[[I"bad_request;T@[I"unauthorized;T@[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I"Rack::Auth;TcRDoc::NormalModulePK!)aPGshare/gems/doc/rack-2.2.4/ri/Rack/Auth/AbstractHandler/bad_request-i.rinu[U:RDoc::AnyMethod[iI"bad_request:ETI",Rack::Auth::AbstractHandler#bad_request;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"&lib/rack/auth/abstract/handler.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI"AbstractHandler;TcRDoc::NormalClass00PK!RkAshare/gems/doc/rack-2.2.4/ri/Rack/Auth/AbstractHandler/realm-i.rinu[U:RDoc::Attr[iI" realm:ETI"&Rack::Auth::AbstractHandler#realm;TI"RW;T: publico:RDoc::Markup::Document: @parts[: @fileI"&lib/rack/auth/abstract/handler.rb;T:0@omit_headings_from_table_of_contents_below0F@ I" Rack::Auth::AbstractHandler;TcRDoc::NormalClass0PK!3//?share/gems/doc/rack-2.2.4/ri/Rack/Auth/AbstractHandler/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"%Rack::Auth::AbstractHandler::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI"&lib/rack/auth/abstract/handler.rb;T:0@omit_headings_from_table_of_contents_below000[I"'(app, realm = nil, &authenticator);T@ FI"AbstractHandler;TcRDoc::NormalClass00PK! ==Hshare/gems/doc/rack-2.2.4/ri/Rack/Auth/AbstractHandler/unauthorized-i.rinu[U:RDoc::AnyMethod[iI"unauthorized:ETI"-Rack::Auth::AbstractHandler#unauthorized;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"&lib/rack/auth/abstract/handler.rb;T:0@omit_headings_from_table_of_contents_below000[I"#(www_authenticate = challenge);T@ FI"AbstractHandler;TcRDoc::NormalClass00PK!~T4share/gems/doc/rack-2.2.4/ri/Rack/Auth/cdesc-Auth.rinu[U:RDoc::NormalModule[iI" Auth:ETI"Rack::Auth;T0o:RDoc::Markup::Document: @parts[ o;;[: @fileI"lib/rack.rb;T:0@omit_headings_from_table_of_contents_below0o;;[; I"&lib/rack/auth/abstract/handler.rb;T; 0o;;[; I"&lib/rack/auth/abstract/request.rb;T; 0o;;[; I"lib/rack/auth/basic.rb;T; 0o;;[; I" lib/rack/auth/digest/md5.rb;T; 0o;;[; I""lib/rack/auth/digest/nonce.rb;T; 0o;;[; I"#lib/rack/auth/digest/params.rb;T; 0o;;[; I"$lib/rack/auth/digest/request.rb;T; 0; 0; 0[[[[[I" class;T[[: public[[:protected[[: private[[I" instance;T[[; [[; [[; [[[U:RDoc::Context::Section[i0o;;[; 0; 0[@ @@@@@@@"I"!lib/rack/multipart/parser.rb;TI" Rack;TcRDoc::NormalModulePK!-+Hshare/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Request/respond_to%3f-i.rinu[U:RDoc::AnyMethod[iI"respond_to?:ETI",Rack::Auth::Digest::Request#respond_to?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"$lib/rack/auth/digest/request.rb;T:0@omit_headings_from_table_of_contents_below000[I" (sym, *);T@ TI" Request;TcRDoc::NormalClass00PK!<Ishare/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Request/correct_uri%3f-i.rinu[U:RDoc::AnyMethod[iI"correct_uri?:ETI"-Rack::Auth::Digest::Request#correct_uri?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"$lib/rack/auth/digest/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Request;TcRDoc::NormalClass00PK!  Ashare/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Request/params-i.rinu[U:RDoc::AnyMethod[iI" params:ETI"'Rack::Auth::Digest::Request#params;TF: publico:RDoc::Markup::Document: @parts[: @fileI"$lib/rack/auth/digest/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Request;TcRDoc::NormalClass00PK!v@share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Request/nonce-i.rinu[U:RDoc::AnyMethod[iI" nonce:ETI"&Rack::Auth::Digest::Request#nonce;TF: publico:RDoc::Markup::Document: @parts[: @fileI"$lib/rack/auth/digest/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Request;TcRDoc::NormalClass00PK!,$$Ishare/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Request/method_missing-i.rinu[U:RDoc::AnyMethod[iI"method_missing:ETI"/Rack::Auth::Digest::Request#method_missing;TF: publico:RDoc::Markup::Document: @parts[: @fileI"$lib/rack/auth/digest/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"(sym, *args);T@ TI" Request;TcRDoc::NormalClass00PK!rƨw  Ashare/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Request/method-i.rinu[U:RDoc::AnyMethod[iI" method:ETI"'Rack::Auth::Digest::Request#method;TF: publico:RDoc::Markup::Document: @parts[: @fileI"$lib/rack/auth/digest/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Request;TcRDoc::NormalClass00PK!(wnnFshare/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Request/cdesc-Request.rinu[U:RDoc::NormalClass[iI" Request:ETI" Rack::Auth::Digest::Request;TI" Rack::Auth::AbstractRequest;To:RDoc::Markup::Document: @parts[o;;[: @fileI"$lib/rack/auth/digest/request.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[[:protected[[: private[[I" instance;T[[; [ [I"correct_uri?;TI"$lib/rack/auth/digest/request.rb;T[I" digest?;T@#[I" method;T@#[I"method_missing;T@#[I" nonce;T@#[I" params;T@#[I"respond_to?;T@#[; [[; [[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I"Rack::Auth::Digest;TcRDoc::NormalModulePK!жD  Dshare/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Request/digest%3f-i.rinu[U:RDoc::AnyMethod[iI" digest?:ETI"(Rack::Auth::Digest::Request#digest?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"$lib/rack/auth/digest/request.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Request;TcRDoc::NormalClass00PK!i PFshare/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/MD5/valid_digest%3f-i.rinu[U:RDoc::AnyMethod[iI"valid_digest?:ETI"*Rack::Auth::Digest::MD5#valid_digest?;TF: privateo:RDoc::Markup::Document: @parts[: @fileI" lib/rack/auth/digest/md5.rb;T:0@omit_headings_from_table_of_contents_below000[I" (auth);T@ FI"MD5;TcRDoc::NormalClass00PK!VU9share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/MD5/A2-i.rinu[U:RDoc::AnyMethod[iI"A2:ETI"Rack::Auth::Digest::MD5#A2;TF: privateo:RDoc::Markup::Document: @parts[: @fileI" lib/rack/auth/digest/md5.rb;T:0@omit_headings_from_table_of_contents_below000[I" (auth);T@ FI"MD5;TcRDoc::NormalClass00PK!79share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/MD5/KD-i.rinu[U:RDoc::AnyMethod[iI"KD:ETI"Rack::Auth::Digest::MD5#KD;TF: privateo:RDoc::Markup::Document: @parts[: @fileI" lib/rack/auth/digest/md5.rb;T:0@omit_headings_from_table_of_contents_below000[I"(secret, data);T@ FI"MD5;TcRDoc::NormalClass00PK!-U  =share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/MD5/digest-i.rinu[U:RDoc::AnyMethod[iI" digest:ETI"#Rack::Auth::Digest::MD5#digest;TF: privateo:RDoc::Markup::Document: @parts[: @fileI" lib/rack/auth/digest/md5.rb;T:0@omit_headings_from_table_of_contents_below000[I"(auth, password);T@ FI"MD5;TcRDoc::NormalClass00PK!@share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/MD5/challenge-i.rinu[U:RDoc::AnyMethod[iI"challenge:ETI"&Rack::Auth::Digest::MD5#challenge;TF: privateo:RDoc::Markup::Document: @parts[: @fileI" lib/rack/auth/digest/md5.rb;T:0@omit_headings_from_table_of_contents_below000[I"(hash = {});T@ FI"MD5;TcRDoc::NormalClass00PK!w=share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/MD5/params-i.rinu[U:RDoc::AnyMethod[iI" params:ETI"#Rack::Auth::Digest::MD5#params;TF: privateo:RDoc::Markup::Document: @parts[: @fileI" lib/rack/auth/digest/md5.rb;T:0@omit_headings_from_table_of_contents_below000[I"(hash = {});T@ FI"MD5;TcRDoc::NormalClass00PK!2##8share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/MD5/H-i.rinu[U:RDoc::AnyMethod[iI"H:ETI"Rack::Auth::Digest::MD5#H;TF: privateo:RDoc::Markup::Document: @parts[: @fileI" lib/rack/auth/digest/md5.rb;T:0@omit_headings_from_table_of_contents_below000[I" (data);T@ FI"MD5;TcRDoc::NormalClass0[I"Rack::Auth::Digest::MD5;TFI"md5;TPK!Yb?share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/MD5/valid%3f-i.rinu[U:RDoc::AnyMethod[iI" valid?:ETI"#Rack::Auth::Digest::MD5#valid?;TF: privateo:RDoc::Markup::Document: @parts[: @fileI" lib/rack/auth/digest/md5.rb;T:0@omit_headings_from_table_of_contents_below000[I" (auth);T@ FI"MD5;TcRDoc::NormalClass00PK!˴mhGshare/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/MD5/passwords_hashed-i.rinu[U:RDoc::Attr[iI"passwords_hashed:ETI"-Rack::Auth::Digest::MD5#passwords_hashed;TI"W;T: publico:RDoc::Markup::Document: @parts[: @fileI" lib/rack/auth/digest/md5.rb;T:0@omit_headings_from_table_of_contents_below0F@ I"Rack::Auth::Digest::MD5;TcRDoc::NormalClass0PK!'':share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/MD5/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"!Rack::Auth::Digest::MD5::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI" lib/rack/auth/digest/md5.rb;T:0@omit_headings_from_table_of_contents_below000[I"5(app, realm = nil, opaque = nil, &authenticator);T@ TI"MD5;TcRDoc::NormalClass00PK!|Jshare/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/MD5/passwords_hashed%3f-i.rinu[U:RDoc::AnyMethod[iI"passwords_hashed?:ETI".Rack::Auth::Digest::MD5#passwords_hashed?;TF: publico:RDoc::Markup::Document: @parts[: @fileI" lib/rack/auth/digest/md5.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI"MD5;TcRDoc::NormalClass00PK!Y@  Cshare/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/MD5/valid_qop%3f-i.rinu[U:RDoc::AnyMethod[iI"valid_qop?:ETI"'Rack::Auth::Digest::MD5#valid_qop?;TF: privateo:RDoc::Markup::Document: @parts[: @fileI" lib/rack/auth/digest/md5.rb;T:0@omit_headings_from_table_of_contents_below000[I" (auth);T@ FI"MD5;TcRDoc::NormalClass00PK!mu9share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/MD5/A1-i.rinu[U:RDoc::AnyMethod[iI"A1:ETI"Rack::Auth::Digest::MD5#A1;TF: privateo:RDoc::Markup::Document: @parts[: @fileI" lib/rack/auth/digest/md5.rb;T:0@omit_headings_from_table_of_contents_below000[I"(auth, password);T@ FI"MD5;TcRDoc::NormalClass00PK!:AA>share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/MD5/cdesc-MD5.rinu[U:RDoc::NormalClass[iI"MD5:ETI"Rack::Auth::Digest::MD5;TI" Rack::Auth::AbstractHandler;To:RDoc::Markup::Document: @parts[o;;[ o:RDoc::Markup::Paragraph;[I"ERack::Auth::Digest::MD5 implements the MD5 algorithm version of ;TI"1HTTP Digest Authentication, as per RFC 2617.;To:RDoc::Markup::BlankLineo; ;[I"FInitialize with the [Rack] application that you want protecting, ;TI"Iand a block that looks up a plaintext password for a given username.;T@o; ;[I"F+opaque+ needs to be set to a constant base64/hexadecimal string.;T: @fileI" lib/rack/auth/digest/md5.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[ I" opaque;TI"RW;T: publicFI" lib/rack/auth/digest/md5.rb;T[ I"passwords_hashed;TI"W;T; F@[U:RDoc::Constant[iI"QOP;TI"!Rack::Auth::Digest::MD5::QOP;T; 0o;;[; @; 0@@cRDoc::NormalClass0[[[I" class;T[[; [[I"new;T@[:protected[[: private[[I" instance;T[[; [[I" call;T@[I"passwords_hashed?;T@[;[[;[[I"A1;T@[I"A2;T@[I"H;T@[I"KD;T@[I"challenge;T@[I" digest;T@[I"md5;T@[I" params;T@[I" valid?;T@[I"valid_digest?;T@[I"valid_nonce?;T@[I"valid_opaque?;T@[I"valid_qop?;T@[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I"Rack::Auth::Digest;TcRDoc::NormalModulePK!知9Eshare/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/MD5/valid_nonce%3f-i.rinu[U:RDoc::AnyMethod[iI"valid_nonce?:ETI")Rack::Auth::Digest::MD5#valid_nonce?;TF: privateo:RDoc::Markup::Document: @parts[: @fileI" lib/rack/auth/digest/md5.rb;T:0@omit_headings_from_table_of_contents_below000[I" (auth);T@ FI"MD5;TcRDoc::NormalClass00PK![;share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/MD5/call-i.rinu[U:RDoc::AnyMethod[iI" call:ETI"!Rack::Auth::Digest::MD5#call;TF: publico:RDoc::Markup::Document: @parts[: @fileI" lib/rack/auth/digest/md5.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@ FI"MD5;TcRDoc::NormalClass00PK!4$=share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/MD5/opaque-i.rinu[U:RDoc::Attr[iI" opaque:ETI"#Rack::Auth::Digest::MD5#opaque;TI"RW;T: publico:RDoc::Markup::Document: @parts[: @fileI" lib/rack/auth/digest/md5.rb;T:0@omit_headings_from_table_of_contents_below0F@ I"Rack::Auth::Digest::MD5;TcRDoc::NormalClass0PK!l'Fshare/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/MD5/valid_opaque%3f-i.rinu[U:RDoc::AnyMethod[iI"valid_opaque?:ETI"*Rack::Auth::Digest::MD5#valid_opaque?;TF: privateo:RDoc::Markup::Document: @parts[: @fileI" lib/rack/auth/digest/md5.rb;T:0@omit_headings_from_table_of_contents_below000[I" (auth);T@ FI"MD5;TcRDoc::NormalClass00PK! gm:share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/MD5/md5-i.rinu[U:RDoc::AnyMethod[iI"md5:ETI" Rack::Auth::Digest::MD5#md5;TF: privateo:RDoc::Markup::Document: @parts[: @fileI" lib/rack/auth/digest/md5.rb;T:0@omit_headings_from_table_of_contents_below000[[I"H;To;; [; @ ; 0I" (data);T@ FI"MD5;TcRDoc::NormalClass00PK!?share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Nonce/digest-i.rinu[U:RDoc::AnyMethod[iI" digest:ETI"%Rack::Auth::Digest::Nonce#digest;TF: publico:RDoc::Markup::Document: @parts[: @fileI""lib/rack/auth/digest/nonce.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Nonce;TcRDoc::NormalClass00PK!,Ashare/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Nonce/valid%3f-i.rinu[U:RDoc::AnyMethod[iI" valid?:ETI"%Rack::Auth::Digest::Nonce#valid?;TF: publico:RDoc::Markup::Document: @parts[: @fileI""lib/rack/auth/digest/nonce.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Nonce;TcRDoc::NormalClass00PK!''<share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Nonce/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"#Rack::Auth::Digest::Nonce::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI""lib/rack/auth/digest/nonce.rb;T:0@omit_headings_from_table_of_contents_below000[I"/(timestamp = Time.now, given_digest = nil);T@ FI" Nonce;TcRDoc::NormalClass00PK!O^Cshare/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Nonce/time_limit-c.rinu[U:RDoc::Attr[iI"time_limit:ETI"*Rack::Auth::Digest::Nonce::time_limit;TI"RW;T: publico:RDoc::Markup::Document: @parts[: @fileI""lib/rack/auth/digest/nonce.rb;T:0@omit_headings_from_table_of_contents_below0T@ I"Rack::Auth::Digest::Nonce;TcRDoc::NormalClass0PK!hfAshare/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Nonce/fresh%3f-i.rinu[U:RDoc::AnyMethod[iI" fresh?:ETI"%Rack::Auth::Digest::Nonce#fresh?;TF: publico:RDoc::Markup::Document: @parts[: @fileI""lib/rack/auth/digest/nonce.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Nonce;TcRDoc::NormalClass00PK!HXBshare/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Nonce/cdesc-Nonce.rinu[U:RDoc::NormalClass[iI" Nonce:ETI"Rack::Auth::Digest::Nonce;TI" Object;To:RDoc::Markup::Document: @parts[o;;[ o:RDoc::Markup::Paragraph;[I"FRack::Auth::Digest::Nonce is the default nonce generator for the ;TI"4Rack::Auth::Digest::MD5 authentication handler.;To:RDoc::Markup::BlankLineo; ;[I"5+private_key+ needs to set to a constant string.;T@o; ;[I"K+time_limit+ can be optionally set to an integer (number of seconds), ;TI"3to limit the validity of the generated nonces.;T: @fileI""lib/rack/auth/digest/nonce.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[ I"private_key;TI"RW;T: publicTI""lib/rack/auth/digest/nonce.rb;T[ I"time_limit;T@; T@[[[[I" class;T[[; [[I"new;T@[I" parse;T@[:protected[[: private[[I" instance;T[[; [ [I" digest;T@[I" fresh?;T@[I" stale?;T@[I" to_s;T@[I" valid?;T@[;[[;[[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I"Rack::Auth::Digest;TcRDoc::NormalModulePK!_Ashare/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Nonce/stale%3f-i.rinu[U:RDoc::AnyMethod[iI" stale?:ETI"%Rack::Auth::Digest::Nonce#stale?;TF: publico:RDoc::Markup::Document: @parts[: @fileI""lib/rack/auth/digest/nonce.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Nonce;TcRDoc::NormalClass00PK!eiDshare/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Nonce/private_key-c.rinu[U:RDoc::Attr[iI"private_key:ETI"+Rack::Auth::Digest::Nonce::private_key;TI"RW;T: publico:RDoc::Markup::Document: @parts[: @fileI""lib/rack/auth/digest/nonce.rb;T:0@omit_headings_from_table_of_contents_below0T@ I"Rack::Auth::Digest::Nonce;TcRDoc::NormalClass0PK!L8;=share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Nonce/to_s-i.rinu[U:RDoc::AnyMethod[iI" to_s:ETI"#Rack::Auth::Digest::Nonce#to_s;TF: publico:RDoc::Markup::Document: @parts[: @fileI""lib/rack/auth/digest/nonce.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Nonce;TcRDoc::NormalClass00PK!d  >share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Nonce/parse-c.rinu[U:RDoc::AnyMethod[iI" parse:ETI"%Rack::Auth::Digest::Nonce::parse;TT: publico:RDoc::Markup::Document: @parts[: @fileI""lib/rack/auth/digest/nonce.rb;T:0@omit_headings_from_table_of_contents_below000[I" (string);T@ FI" Nonce;TcRDoc::NormalClass00PK!ޘu  =share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Params/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"$Rack::Auth::Digest::Params::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI"#lib/rack/auth/digest/params.rb;T:0@omit_headings_from_table_of_contents_below00I" self;T[I"();T@ TI" Params;TcRDoc::NormalClass00PK!@y  Ashare/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Params/dequote-c.rinu[U:RDoc::AnyMethod[iI" dequote:ETI"(Rack::Auth::Digest::Params::dequote;TT: publico:RDoc::Markup::Document: @parts[: @fileI"#lib/rack/auth/digest/params.rb;T:0@omit_headings_from_table_of_contents_below000[I" (str);T@ FI" Params;TcRDoc::NormalClass00PK!N+@share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Params/%5b%5d-i.rinu[U:RDoc::AnyMethod[iI"[]:ETI""Rack::Auth::Digest::Params#[];TF: publico:RDoc::Markup::Document: @parts[: @fileI"#lib/rack/auth/digest/params.rb;T:0@omit_headings_from_table_of_contents_below000[I"(k);T@ TI" Params;TcRDoc::NormalClass00PK!>share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Params/to_s-i.rinu[U:RDoc::AnyMethod[iI" to_s:ETI"$Rack::Auth::Digest::Params#to_s;TF: publico:RDoc::Markup::Document: @parts[: @fileI"#lib/rack/auth/digest/params.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Params;TcRDoc::NormalClass00PK!)K  ?share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Params/parse-c.rinu[U:RDoc::AnyMethod[iI" parse:ETI"&Rack::Auth::Digest::Params::parse;TT: publico:RDoc::Markup::Document: @parts[: @fileI"#lib/rack/auth/digest/params.rb;T:0@omit_headings_from_table_of_contents_below000[I" (str);T@ FI" Params;TcRDoc::NormalClass00PK!OZ y##Lshare/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Params/split_header_value-c.rinu[U:RDoc::AnyMethod[iI"split_header_value:ETI"3Rack::Auth::Digest::Params::split_header_value;TT: publico:RDoc::Markup::Document: @parts[: @fileI"#lib/rack/auth/digest/params.rb;T:0@omit_headings_from_table_of_contents_below000[I" (str);T@ FI" Params;TcRDoc::NormalClass00PK!Dshare/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Params/cdesc-Params.rinu[U:RDoc::NormalClass[iI" Params:ETI"Rack::Auth::Digest::Params;TI" Hash;To:RDoc::Markup::Document: @parts[o;;[: @fileI"#lib/rack/auth/digest/params.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[U:RDoc::Constant[iI" UNQUOTED;TI")Rack::Auth::Digest::Params::UNQUOTED;T: public0o;;[; @; 0@@cRDoc::NormalClass0[[[I" class;T[[; [ [I" dequote;TI"#lib/rack/auth/digest/params.rb;T[I"new;T@![I" parse;T@![I"split_header_value;T@![:protected[[: private[[I" instance;T[[; [ [I"[];T@![I"[]=;T@![I" quote;T@![I" to_s;T@![; [[;[[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I"!lib/rack/multipart/parser.rb;TI"Rack::Auth::Digest;TcRDoc::NormalModulePK!x?share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Params/quote-i.rinu[U:RDoc::AnyMethod[iI" quote:ETI"%Rack::Auth::Digest::Params#quote;TF: publico:RDoc::Markup::Document: @parts[: @fileI"#lib/rack/auth/digest/params.rb;T:0@omit_headings_from_table_of_contents_below000[I" (str);T@ FI" Params;TcRDoc::NormalClass00PK!hCshare/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Params/%5b%5d%3d-i.rinu[U:RDoc::AnyMethod[iI"[]=:ETI"#Rack::Auth::Digest::Params#[]=;TF: publico:RDoc::Markup::Document: @parts[: @fileI"#lib/rack/auth/digest/params.rb;T:0@omit_headings_from_table_of_contents_below000[I" (k, v);T@ TI" Params;TcRDoc::NormalClass00PK!jj=share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/cdesc-Digest.rinu[U:RDoc::NormalModule[iI" Digest:ETI"Rack::Auth::Digest;T0o:RDoc::Markup::Document: @parts[ o;;[: @fileI"lib/rack.rb;T:0@omit_headings_from_table_of_contents_below0o;;[; I" lib/rack/auth/digest/md5.rb;T; 0o;;[; I""lib/rack/auth/digest/nonce.rb;T; 0o;;[; I"#lib/rack/auth/digest/params.rb;T; 0o;;[; I"$lib/rack/auth/digest/request.rb;T; 0; 0; 0[[[[[I" class;T[[: public[[:protected[[: private[[I" instance;T[[; [[; [[; [[[U:RDoc::Context::Section[i0o;;[; 0; 0[ @ @@@@I"!lib/rack/multipart/parser.rb;TI"Rack::Auth;TcRDoc::NormalModulePK!J9share/gems/doc/rack-2.2.4/ri/Rack/TempfileReaper/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"Rack::TempfileReaper::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI" lib/rack/tempfile_reaper.rb;T:0@omit_headings_from_table_of_contents_below000[I" (app);T@ FI"TempfileReaper;TcRDoc::NormalClass00PK!䱦Hshare/gems/doc/rack-2.2.4/ri/Rack/TempfileReaper/cdesc-TempfileReaper.rinu[U:RDoc::NormalClass[iI"TempfileReaper:ETI"Rack::TempfileReaper;TI" Object;To:RDoc::Markup::Document: @parts[o;;[o:RDoc::Markup::Paragraph;[I"`Middleware tracks and cleans Tempfiles created throughout a request (i.e. Rack::Multipart) ;TI"JIdeas/strategy based on posts by Eric Wong and Charles Oliver Nutter ;TI"chttps://groups.google.com/forum/#!searchin/rack-devel/temp/rack-devel/brK8eh-MByw/sw61oJJCGRMJ;T: @fileI" lib/rack/tempfile_reaper.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[[I"new;TI" lib/rack/tempfile_reaper.rb;T[:protected[[: private[[I" instance;T[[; [[I" call;T@[; [[;[[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I" Rack;TcRDoc::NormalModulePK!GX:share/gems/doc/rack-2.2.4/ri/Rack/TempfileReaper/call-i.rinu[U:RDoc::AnyMethod[iI" call:ETI"Rack::TempfileReaper#call;TF: publico:RDoc::Markup::Document: @parts[: @fileI" lib/rack/tempfile_reaper.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@ FI"TempfileReaper;TcRDoc::NormalClass00PK!% 3share/gems/doc/rack-2.2.4/ri/Rack/Sendfile/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"Rack::Sendfile::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/sendfile.rb;T:0@omit_headings_from_table_of_contents_below000[I"*(app, variation = nil, mappings = []);T@ FI" Sendfile;TcRDoc::NormalClass00PK!^  >share/gems/doc/rack-2.2.4/ri/Rack/Sendfile/map_accel_path-i.rinu[U:RDoc::AnyMethod[iI"map_accel_path:ETI""Rack::Sendfile#map_accel_path;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/sendfile.rb;T:0@omit_headings_from_table_of_contents_below000[I"(env, path);T@ FI" Sendfile;TcRDoc::NormalClass00PK!JC9share/gems/doc/rack-2.2.4/ri/Rack/Sendfile/variation-i.rinu[U:RDoc::AnyMethod[iI"variation:ETI"Rack::Sendfile#variation;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/sendfile.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@ FI" Sendfile;TcRDoc::NormalClass00PK!<77<share/gems/doc/rack-2.2.4/ri/Rack/Sendfile/cdesc-Sendfile.rinu[U:RDoc::NormalClass[iI" Sendfile:ETI"Rack::Sendfile;TI" Object;To:RDoc::Markup::Document: @parts[o;;[)S:RDoc::Markup::Heading: leveli: textI" Sendfile;To:RDoc::Markup::BlankLineo:RDoc::Markup::Paragraph;[ I"FThe Sendfile middleware intercepts responses whose body is being ;TI"Jserved from a file and replaces it with a server specific X-Sendfile ;TI"Nheader. The web server is then responsible for writing the file contents ;TI"Mto the client. This can dramatically reduce the amount of work required ;TI"Pby the Ruby backend and takes advantage of the web server's optimized file ;TI"delivery code.;T@o; ;[ I"KIn order to take advantage of this middleware, the response body must ;TI"Jrespond to +to_path+ and the request must include an X-Sendfile-Type ;TI"Mheader. Rack::Files and other components implement +to_path+ so there's ;TI"Mrarely anything you need to do in your application. The X-Sendfile-Type ;TI"Nheader is typically set in your web servers configuration. The following ;TI"!sections attempt to document;T@S; ; i; I" Nginx;T@o; ;[I"ONginx supports the X-Accel-Redirect header. This is similar to X-Sendfile ;TI"Jbut requires parts of the filesystem to be mapped into a private URL ;TI"hierarchy.;T@o; ;[I"LThe following example shows the Nginx configuration required to create ;TI"Ma private "/files/" area, enable X-Accel-Redirect, and pass the special ;TI"@X-Sendfile-Type and X-Accel-Mapping headers to the backend:;T@o:RDoc::Markup::Verbatim;[I"location ~ /files/(.*) { ;TI" internal; ;TI" alias /var/www/$1; ;TI"} ;TI" ;TI"location / { ;TI" proxy_redirect off; ;TI" ;TI"5 proxy_set_header Host $host; ;TI"< proxy_set_header X-Real-IP $remote_addr; ;TI"J proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ;TI" ;TI"@ proxy_set_header X-Sendfile-Type X-Accel-Redirect; ;TI"A proxy_set_header X-Accel-Mapping /var/www/=/files/; ;TI" ;TI"2 proxy_pass http://127.0.0.1:8080/; ;TI"} ;T: @format0o; ;[ I"NNote that the X-Sendfile-Type header must be set exactly as shown above. ;TI"PThe X-Accel-Mapping header should specify the location on the file system, ;TI"Nfollowed by an equals sign (=), followed name of the private URL pattern ;TI"Kthat it maps to. The middleware performs a simple substitution on the ;TI"resulting path.;T@o; ;[I"SSee Also: https://www.nginx.com/resources/wiki/start/topics/examples/xsendfile;T@S; ; i; I" lighttpd;T@o; ;[I"MLighttpd has supported some variation of the X-Sendfile header for some ;TI"Ntime, although only recent version support X-Sendfile in a reverse proxy ;TI"configuration.;T@o;;[I"&$HTTP["host"] == "example.com" { ;TI"% proxy-core.protocol = "http" ;TI", proxy-core.balancer = "round-robin" ;TI" proxy-core.backends = ( ;TI" "127.0.0.1:8000", ;TI" "127.0.0.1:8001", ;TI" ... ;TI" ) ;TI" ;TI"/ proxy-core.allow-x-sendfile = "enable" ;TI"' proxy-core.rewrite-request = ( ;TI"6 "X-Sendfile-Type" => (".*" => "X-Sendfile") ;TI" ) ;TI" } ;T;0o; ;[I"JSee Also: http://redmine.lighttpd.net/wiki/lighttpd/Docs:ModProxyCore;T@S; ; i; I" Apache;T@o; ;[I"FX-Sendfile is supported under Apache 2.x using a separate module:;T@o; ;[I"%https://tn123.org/mod_xsendfile/;T@o; ;[I"HOnce the module is compiled and installed, you can enable it using ;TI" XSendFile config directive:;T@o;;[I"2RequestHeader Set X-Sendfile-Type X-Sendfile ;TI"/ProxyPassReverse / http://localhost:8001/ ;TI"XSendFile on ;T;0S; ; i; I"Mapping parameter;T@o; ;[ I"CThe third parameter allows for an overriding extension of the ;TI"RX-Accel-Mapping header. Mappings should be provided in tuples of internal to ;TI"Oexternal. The internal values may contain regular expression syntax, they ;TI",will be matched with case indifference.;T: @fileI"lib/rack/sendfile.rb;T:0@omit_headings_from_table_of_contents_below0;0;0[[[[[I" class;T[[: public[[I"new;TI"lib/rack/sendfile.rb;T[:protected[[: private[[I" instance;T[[;[[I" call;T@[;[[;[[I"map_accel_path;T@[I"variation;T@[[U:RDoc::Context::Section[i0o;;[;0;0[@}I" Rack;TcRDoc::NormalModulePK!~4share/gems/doc/rack-2.2.4/ri/Rack/Sendfile/call-i.rinu[U:RDoc::AnyMethod[iI" call:ETI"Rack::Sendfile#call;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/sendfile.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@ FI" Sendfile;TcRDoc::NormalClass00PK!3/YCshare/gems/doc/rack-2.2.4/ri/Rack/Lint/LintError/cdesc-LintError.rinu[U:RDoc::NormalClass[iI"LintError:ETI"Rack::Lint::LintError;TI"RuntimeError;To:RDoc::Markup::Document: @parts[: @file0:0@omit_headings_from_table_of_contents_below0[[[[[I" class;T[[: public[[:protected[[: private[[I" instance;T[[; [[; [[; [[[U:RDoc::Context::Section[i0o;;[; 0; 0[I"lib/rack/lint.rb;TI"Rack::Lint;TcRDoc::NormalClassPK!xҵ/share/gems/doc/rack-2.2.4/ri/Rack/Lint/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"Rack::Lint::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/lint.rb;T:0@omit_headings_from_table_of_contents_below000[I" (app);T@ FI" Lint;TcRDoc::NormalClass00PK!țIshare/gems/doc/rack-2.2.4/ri/Rack/Lint/ErrorWrapper/cdesc-ErrorWrapper.rinu[U:RDoc::NormalClass[iI"ErrorWrapper:ETI"Rack::Lint::ErrorWrapper;TI" Object;To:RDoc::Markup::Document: @parts[: @file0:0@omit_headings_from_table_of_contents_below0[[[[[I" class;T[[: public[[:protected[[: private[[I" instance;T[[; [[; [[; [[[U:RDoc::Context::Section[i0o;;[; 0; 0[I"lib/rack/lint.rb;TI"Rack::Lint;TcRDoc::NormalClassPK!U**4share/gems/doc/rack-2.2.4/ri/Rack/Lint/cdesc-Lint.rinu[U:RDoc::NormalClass[iI" Lint:ETI"Rack::Lint;TI" Object;To:RDoc::Markup::Document: @parts[o;;[o:RDoc::Markup::Paragraph;[I"@Rack::Lint validates your application and the requests and ;TI"*responses according to the Rack spec.;T: @fileI"lib/rack/lint.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[[I"new;TI"lib/rack/lint.rb;T[:protected[[: private[[I" instance;T[[; [[; [[;[[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I" Rack;TcRDoc::NormalModulePK!N}Ishare/gems/doc/rack-2.2.4/ri/Rack/Lint/InputWrapper/cdesc-InputWrapper.rinu[U:RDoc::NormalClass[iI"InputWrapper:ETI"Rack::Lint::InputWrapper;TI" Object;To:RDoc::Markup::Document: @parts[: @file0:0@omit_headings_from_table_of_contents_below0[[[[[I" class;T[[: public[[:protected[[: private[[I" instance;T[[; [[; [[; [[[U:RDoc::Context::Section[i0o;;[; 0; 0[I"lib/rack/lint.rb;TI"Rack::Lint;TcRDoc::NormalClassPK!5Kshare/gems/doc/rack-2.2.4/ri/Rack/Lint/HijackWrapper/cdesc-HijackWrapper.rinu[U:RDoc::NormalClass[iI"HijackWrapper:ETI"Rack::Lint::HijackWrapper;TI" Object;To:RDoc::Markup::Document: @parts[: @file0:0@omit_headings_from_table_of_contents_below0[[[[[I" class;T[[: public[[:protected[[: private[[I" instance;T[[; [[; [[; [[[U:RDoc::Context::Section[i0o;;[; 0; 0[I"lib/rack/lint.rb;TI"Rack::Lint;TcRDoc::NormalClassPK! eTuuCshare/gems/doc/rack-2.2.4/ri/Rack/Lint/Assertion/cdesc-Assertion.rinu[U:RDoc::NormalModule[iI"Assertion:ETI"Rack::Lint::Assertion;T0o:RDoc::Markup::Document: @parts[: @file0:0@omit_headings_from_table_of_contents_below0[[[[[I" class;T[[: public[[:protected[[: private[[I" instance;T[[; [[; [[; [[[U:RDoc::Context::Section[i0o;;[; 0; 0[I"lib/rack/lint.rb;TI"Rack::Lint;TcRDoc::NormalClassPK!gg7share/gems/doc/rack-2.2.4/ri/Rack/CommonLogger/log-i.rinu[U:RDoc::AnyMethod[iI"log:ETI"Rack::CommonLogger#log;TF: privateo:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I".Log the request to the configured logger.;T: @fileI"lib/rack/common_logger.rb;T:0@omit_headings_from_table_of_contents_below000[I"$(env, status, header, began_at);T@FI"CommonLogger;TcRDoc::NormalClass00PK!-gwJshare/gems/doc/rack-2.2.4/ri/Rack/CommonLogger/extract_content_length-i.rinu[U:RDoc::AnyMethod[iI"extract_content_length:ETI".Rack::CommonLogger#extract_content_length;TF: privateo:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"AAttempt to determine the content length for the response to ;TI"#include it in the logged data.;T: @fileI"lib/rack/common_logger.rb;T:0@omit_headings_from_table_of_contents_below000[I"(headers);T@FI"CommonLogger;TcRDoc::NormalClass00PK!TjXROO7share/gems/doc/rack-2.2.4/ri/Rack/CommonLogger/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"Rack::CommonLogger::new;TT: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [ I"K+logger+ can be any object that supports the +write+ or +<<+ methods, ;TI"Kwhich includes the standard library Logger. These methods are called ;TI"5with a single string argument, the log message. ;TI"QIf +logger+ is nil, CommonLogger will fall back env['rack.errors'].;T: @fileI"lib/rack/common_logger.rb;T:0@omit_headings_from_table_of_contents_below000[I"(app, logger = nil);T@FI"CommonLogger;TcRDoc::NormalClass00PK!dG@@Dshare/gems/doc/rack-2.2.4/ri/Rack/CommonLogger/cdesc-CommonLogger.rinu[U:RDoc::NormalClass[iI"CommonLogger:ETI"Rack::CommonLogger;TI" Object;To:RDoc::Markup::Document: @parts[o;;[o:RDoc::Markup::Paragraph;[ I"GRack::CommonLogger forwards every request to the given +app+, and ;TI"logs a line in the ;TI"S{Apache common log format}[http://httpd.apache.org/docs/1.3/logs.html#common] ;TI"to the configured logger.;T: @fileI"lib/rack/common_logger.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[U:RDoc::Constant[iI" FORMAT;TI"Rack::CommonLogger::FORMAT;T: public0o;;[ o; ;[I"ICommon Log Format: http://httpd.apache.org/docs/1.3/logs.html#common;To:RDoc::Markup::BlankLineo:RDoc::Markup::Verbatim;[I"Jlilith.local - - [07/Aug/2006 23:58:02 -0400] "GET / HTTP/1.1" 500 - ;TI" ;TI",%{%s - %s [%s] "%s %s%s %s" %d %s\n} % ;T: @format0o; ;[I"GThe actual format is slightly different than the above due to the ;TI"Fseparation of SCRIPT_NAME and PATH_INFO, and because the elapsed ;TI",time in seconds is included at the end.;T; @; 0@@cRDoc::NormalClass0[[[I" class;T[[; [[I"new;TI"lib/rack/common_logger.rb;T[:protected[[: private[[I" instance;T[[; [[I" call;T@5[;[[;[[I"extract_content_length;T@5[I"log;T@5[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I" Rack;TcRDoc::NormalModulePK!-8share/gems/doc/rack-2.2.4/ri/Rack/CommonLogger/call-i.rinu[U:RDoc::AnyMethod[iI" call:ETI"Rack::CommonLogger#call;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [ I"ELog all requests in common_log format after a response has been ;TI"Freturned. Note that if the app raises an exception, the request ;TI"Gwill not be logged, so if exception handling middleware are used, ;TI"Ithey should be loaded after this middleware. Additionally, because ;TI"Ithe logging happens after the request body has been fully sent, any ;TI"Dexceptions raised during the sending of the response body will ;TI"(cause the request not to be logged.;T: @fileI"lib/rack/common_logger.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@FI"CommonLogger;TcRDoc::NormalClass00PK!OZ3share/gems/doc/rack-2.2.4/ri/Rack/Deflater/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"Rack::Deflater::new;TT: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"0Creates Rack::Deflater middleware. Options:;To:RDoc::Markup::BlankLineo:RDoc::Markup::List: @type: NOTE: @items[o:RDoc::Markup::ListItem: @label[I" :if ;T; [o; ; [ I"Ma lambda enabling / disabling deflation based on returned boolean value ;TI"y(e.g use Rack::Deflater, :if => lambda { |*, body| sum=0; body.each { |i| sum += i.length }; sum > 512 }). ;TI"wHowever, be aware that calling `body.each` inside the block will break cases where `body.each` is not idempotent, ;TI")such as when it is an +IO+ instance.;To;;[I":include ;T; [o; ; [I"ea list of content types that should be compressed. By default, all content types are compressed.;To;;[I" :sync ;T; [o; ; [I"ldetermines if the stream is going to be flushed after every chunk. Flushing after every chunk reduces ;TI"^latency for time-sensitive streaming applications, but hurts compression and throughput. ;TI"Defaults to +true+.;T: @fileI"lib/rack/deflater.rb;T:0@omit_headings_from_table_of_contents_below000[I"(app, options = {});T@+FI" Deflater;TcRDoc::NormalClass00PK!*l <share/gems/doc/rack-2.2.4/ri/Rack/Deflater/cdesc-Deflater.rinu[U:RDoc::NormalClass[iI" Deflater:ETI"Rack::Deflater;TI" Object;To:RDoc::Markup::Document: @parts[o;;[ o:RDoc::Markup::Paragraph;[I"AThis middleware enables content encoding of http responses, ;TI")usually for purposes of compression.;To:RDoc::Markup::BlankLineo; ;[I"#Currently supported encodings:;T@o:RDoc::Markup::List: @type: BULLET: @items[o:RDoc::Markup::ListItem: @label0;[o; ;[I" gzip;To;;0;[o; ;[I"!identity (no transformation);T@o; ;[ I"FThis middleware automatically detects when encoding is supported ;TI"?and allowed. For example no encoding is made when a cache ;TI"Fdirective of 'no-transform' is present, when the response status ;TI"Ecode is one that doesn't allow an entity body, or when the body ;TI"is empty.;T@o; ;[I"INote that despite the name, Deflater does not support the +deflate+ ;TI"encoding.;T: @fileI"lib/rack/deflater.rb;T:0@omit_headings_from_table_of_contents_below0;0;0[[[[[I" class;T[[: public[[I"new;TI"lib/rack/deflater.rb;T[:protected[[: private[[I" instance;T[[;[[I" call;T@9[;[[;[[I"should_deflate?;T@9[[U:RDoc::Context::Section[i0o;;[;0;0[@-I" Rack;TcRDoc::NormalModulePK!D8DDIshare/gems/doc/rack-2.2.4/ri/Rack/Deflater/GzipStream/cdesc-GzipStream.rinu[U:RDoc::NormalClass[iI"GzipStream:ETI"Rack::Deflater::GzipStream;TI" Object;To:RDoc::Markup::Document: @parts[o;;[o:RDoc::Markup::Paragraph;[I"0Body class used for gzip encoded responses.;T: @fileI"lib/rack/deflater.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[[I"new;TI"lib/rack/deflater.rb;T[:protected[[: private[[I" instance;T[[; [[I" close;T@[I" each;T@[I" write;T@[; [[;[[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I"Rack::Deflater;TcRDoc::NormalClassPK!5' >share/gems/doc/rack-2.2.4/ri/Rack/Deflater/GzipStream/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"$Rack::Deflater::GzipStream::new;TT: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I",Initialize the gzip stream. Arguments:;To:RDoc::Markup::List: @type: NOTE: @items[o:RDoc::Markup::ListItem: @label[I" body ;T; [o; ; [I"(Response body to compress with gzip;To;;[I" mtime ;T; [o; ; [I"8The modification time of the body, used to set the ;TI"*modification time in the gzip header.;To;;[I" sync ;T; [o; ; [I"=Whether to flush each gzip chunk as soon as it is ready.;T: @fileI"lib/rack/deflater.rb;T:0@omit_headings_from_table_of_contents_below000[I"(body, mtime, sync);T@&FI"GzipStream;TcRDoc::NormalClass00PK!x{)ZZ?share/gems/doc/rack-2.2.4/ri/Rack/Deflater/GzipStream/each-i.rinu[U:RDoc::AnyMethod[iI" each:ETI"$Rack::Deflater::GzipStream#each;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"6Yield gzip compressed strings to the given block.;T: @fileI"lib/rack/deflater.rb;T:0@omit_headings_from_table_of_contents_below000[I" (&block);T@FI"GzipStream;TcRDoc::NormalClass00PK!"Tbb@share/gems/doc/rack-2.2.4/ri/Rack/Deflater/GzipStream/write-i.rinu[U:RDoc::AnyMethod[iI" write:ETI"%Rack::Deflater::GzipStream#write;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I">Call the block passed to #each with the the gzipped data.;T: @fileI"lib/rack/deflater.rb;T:0@omit_headings_from_table_of_contents_below000[I" (data);T@FI"GzipStream;TcRDoc::NormalClass00PK!$׷II@share/gems/doc/rack-2.2.4/ri/Rack/Deflater/GzipStream/close-i.rinu[U:RDoc::AnyMethod[iI" close:ETI"%Rack::Deflater::GzipStream#close;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I")Close the original body if possible.;T: @fileI"lib/rack/deflater.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@FI"GzipStream;TcRDoc::NormalClass00PK!N!4share/gems/doc/rack-2.2.4/ri/Rack/Deflater/call-i.rinu[U:RDoc::AnyMethod[iI" call:ETI"Rack::Deflater#call;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/deflater.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@ FI" Deflater;TcRDoc::NormalClass00PK!z_llAshare/gems/doc/rack-2.2.4/ri/Rack/Deflater/should_deflate%3f-i.rinu[U:RDoc::AnyMethod[iI"should_deflate?:ETI"#Rack::Deflater#should_deflate?;TF: privateo:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"+Whether the body should be compressed.;T: @fileI"lib/rack/deflater.rb;T:0@omit_headings_from_table_of_contents_below000[I"!(env, status, headers, body);T@FI" Deflater;TcRDoc::NormalClass00PK!B\ ;share/gems/doc/rack-2.2.4/ri/Rack/Events/make_response-i.rinu[U:RDoc::AnyMethod[iI"make_response:ETI"Rack::Events#make_response;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/events.rb;T:0@omit_headings_from_table_of_contents_below000[I"(status, headers, body);T@ FI" Events;TcRDoc::NormalClass00PK!伞Sshare/gems/doc/rack-2.2.4/ri/Rack/Events/EventedBodyProxy/cdesc-EventedBodyProxy.rinu[U:RDoc::NormalClass[iI"EventedBodyProxy:ETI"#Rack::Events::EventedBodyProxy;TI"Rack::BodyProxy;To:RDoc::Markup::Document: @parts[: @file0:0@omit_headings_from_table_of_contents_below0[[[[[I" class;T[[: public[[:protected[[: private[[I" instance;T[[; [[; [[; [[[U:RDoc::Context::Section[i0o;;[; 0; 0[I"lib/rack/events.rb;TI"Rack::Events;TcRDoc::NormalClassPK!V7share/gems/doc/rack-2.2.4/ri/Rack/Events/on_finish-i.rinu[U:RDoc::AnyMethod[iI"on_finish:ETI"Rack::Events#on_finish;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/events.rb;T:0@omit_headings_from_table_of_contents_below000[I"(request, response);T@ FI" Events;TcRDoc::NormalClass00PK!ֹ1share/gems/doc/rack-2.2.4/ri/Rack/Events/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"Rack::Events::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/events.rb;T:0@omit_headings_from_table_of_contents_below000[I"(app, handlers);T@ FI" Events;TcRDoc::NormalClass00PK!h~Sshare/gems/doc/rack-2.2.4/ri/Rack/Events/BufferedResponse/cdesc-BufferedResponse.rinu[U:RDoc::NormalClass[iI"BufferedResponse:ETI"#Rack::Events::BufferedResponse;TI"Rack::Response::Raw;To:RDoc::Markup::Document: @parts[: @file0:0@omit_headings_from_table_of_contents_below0[[[[[I" class;T[[: public[[:protected[[: private[[I" instance;T[[; [[; [[; [[[U:RDoc::Context::Section[i0o;;[; 0; 0[I"lib/rack/events.rb;TI"Rack::Events;TcRDoc::NormalClassPK!!r\:share/gems/doc/rack-2.2.4/ri/Rack/Events/make_request-i.rinu[U:RDoc::AnyMethod[iI"make_request:ETI"Rack::Events#make_request;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/events.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@ FI" Events;TcRDoc::NormalClass00PK!u6share/gems/doc/rack-2.2.4/ri/Rack/Events/on_error-i.rinu[U:RDoc::AnyMethod[iI" on_error:ETI"Rack::Events#on_error;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/events.rb;T:0@omit_headings_from_table_of_contents_below000[I"(request, response, e);T@ FI" Events;TcRDoc::NormalClass00PK!K,7share/gems/doc/rack-2.2.4/ri/Rack/Events/on_commit-i.rinu[U:RDoc::AnyMethod[iI"on_commit:ETI"Rack::Events#on_commit;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/events.rb;T:0@omit_headings_from_table_of_contents_below000[I"(request, response);T@ FI" Events;TcRDoc::NormalClass00PK!| j+6share/gems/doc/rack-2.2.4/ri/Rack/Events/on_start-i.rinu[U:RDoc::AnyMethod[iI" on_start:ETI"Rack::Events#on_start;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/events.rb;T:0@omit_headings_from_table_of_contents_below000[I"(request, response);T@ FI" Events;TcRDoc::NormalClass00PK!g2share/gems/doc/rack-2.2.4/ri/Rack/Events/call-i.rinu[U:RDoc::AnyMethod[iI" call:ETI"Rack::Events#call;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/events.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@ FI" Events;TcRDoc::NormalClass00PK! 8share/gems/doc/rack-2.2.4/ri/Rack/Events/cdesc-Events.rinu[U:RDoc::NormalClass[iI" Events:ETI"Rack::Events;TI" Object;To:RDoc::Markup::Document: @parts[o;;[o:RDoc::Markup::Verbatim;[I"GThis middleware provides hooks to certain places in the request / ;T: @format0o:RDoc::Markup::Paragraph;[I"Oresponse lifecycle. This is so that middleware that don't need to filter ;TI"Othe response data can safely leave it alone and not have to send messages ;TI"'down the traditional "rack stack".;To:RDoc::Markup::BlankLineo; ;[I"The events are:;T@o:RDoc::Markup::List: @type: BULLET: @items[ o:RDoc::Markup::ListItem: @label0;[ o; ;[I" on_start(request, response);T@o; ;[ I"EThis event is sent at the start of the request, before the next ;TI"Nmiddleware in the chain is called. This method is called with a request ;TI"Nobject, and a response object. Right now, the response object is always ;TI"Fnil, but in the future it may actually be a real response object.;T@o;;0;[ o; ;[I"!on_commit(request, response);T@o; ;[ I"MThe response has been committed. The application has returned, but the ;TI"Mresponse has not been sent to the webserver yet. This method is always ;TI"Icalled with a request object and the response object. The response ;TI"Oobject is constructed from the rack triple that the application returned. ;TI"DChanges may still be made to the response object at this point.;T@o;;0;[ o; ;[I"on_send(request, response);T@o; ;[ I"OThe webserver has started iterating over the response body and presumably ;TI"Ohas started sending data over the wire. This method is always called with ;TI"Ga request object and the response object. The response object is ;TI"Nconstructed from the rack triple that the application returned. Changes ;TI"LSHOULD NOT be made to the response object as the webserver has already ;TI"Mstarted sending data. Any mutations will likely result in an exception.;T@o;;0;[ o; ;[I"!on_finish(request, response);T@o; ;[ I"MThe webserver has closed the response, and all data has been written to ;TI"Jthe response socket. The request and response object should both be ;TI"Mread-only at this point. The body MAY NOT be available on the response ;TI"6object as it may have been flushed to the socket.;T@o;;0;[ o; ;[I"'on_error(request, response, error);T@o; ;[I"KAn exception has occurred in the application or an `on_commit` event. ;TI"KThis method will get the request, the response (if available) and the ;TI"exception that was raised.;T@o; ;[I" ## Order;T@o; ;[ I"P`on_start` is called on the handlers in the order that they were passed to ;TI"Nthe constructor. `on_commit`, on_send`, `on_finish`, and `on_error` are ;TI"Mcalled in the reverse order. `on_finish` handlers are called inside an ;TI"K`ensure` block, so they are guaranteed to be called even if something ;TI"Mraises an exception. If something raises an exception in a `on_finish` ;TI"(method, then nothing is guaranteed.;T: @fileI"lib/rack/events.rb;T:0@omit_headings_from_table_of_contents_below0;0;0[[[[[I" class;T[[: public[[I"new;TI"lib/rack/events.rb;T[:protected[[: private[[I" instance;T[[;[[I" call;T@l[;[[;[ [I"make_request;T@l[I"make_response;T@l[I"on_commit;T@l[I" on_error;T@l[I"on_finish;T@l[I" on_start;T@l[[U:RDoc::Context::Section[i0o;;[;0;0[@`I" Rack;TcRDoc::NormalModulePK! g>share/gems/doc/rack-2.2.4/ri/Rack/Events/Abstract/on_send-i.rinu[U:RDoc::AnyMethod[iI" on_send:ETI"#Rack::Events::Abstract#on_send;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/events.rb;T:0@omit_headings_from_table_of_contents_below000[I"(req, res);T@ FI" Abstract;TcRDoc::NormalModule00PK!Ud@share/gems/doc/rack-2.2.4/ri/Rack/Events/Abstract/on_finish-i.rinu[U:RDoc::AnyMethod[iI"on_finish:ETI"%Rack::Events::Abstract#on_finish;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/events.rb;T:0@omit_headings_from_table_of_contents_below000[I"(req, res);T@ FI" Abstract;TcRDoc::NormalModule00PK!"PvCshare/gems/doc/rack-2.2.4/ri/Rack/Events/Abstract/cdesc-Abstract.rinu[U:RDoc::NormalModule[iI" Abstract:ETI"Rack::Events::Abstract;T0o:RDoc::Markup::Document: @parts[o;;[: @fileI"lib/rack/events.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[[:protected[[: private[[I" instance;T[[; [ [I"on_commit;TI"lib/rack/events.rb;T[I" on_error;T@"[I"on_finish;T@"[I" on_send;T@"[I" on_start;T@"[; [[; [[[U:RDoc::Context::Section[i0o;;[; 0; 0[@ I"Rack::Events;TcRDoc::NormalClassPK!j  ?share/gems/doc/rack-2.2.4/ri/Rack/Events/Abstract/on_error-i.rinu[U:RDoc::AnyMethod[iI" on_error:ETI"$Rack::Events::Abstract#on_error;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/events.rb;T:0@omit_headings_from_table_of_contents_below000[I"(req, res, e);T@ FI" Abstract;TcRDoc::NormalModule00PK!87L_@share/gems/doc/rack-2.2.4/ri/Rack/Events/Abstract/on_commit-i.rinu[U:RDoc::AnyMethod[iI"on_commit:ETI"%Rack::Events::Abstract#on_commit;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/events.rb;T:0@omit_headings_from_table_of_contents_below000[I"(req, res);T@ FI" Abstract;TcRDoc::NormalModule00PK!x?share/gems/doc/rack-2.2.4/ri/Rack/Events/Abstract/on_start-i.rinu[U:RDoc::AnyMethod[iI" on_start:ETI"$Rack::Events::Abstract#on_start;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/events.rb;T:0@omit_headings_from_table_of_contents_below000[I"(req, res);T@ FI" Abstract;TcRDoc::NormalModule00PK!'0Gshare/gems/doc/rack-2.2.4/ri/Rack/ConditionalGet/modified_since%3f-i.rinu[U:RDoc::AnyMethod[iI"modified_since?:ETI")Rack::ConditionalGet#modified_since?;TF: privateo:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"MWhether the Last-Modified response header matches the If-Modified-Since ;TI"?request header. If so, the request has not been modified.;T: @fileI" lib/rack/conditional_get.rb;T:0@omit_headings_from_table_of_contents_below000[I"(modified_since, headers);T@FI"ConditionalGet;TcRDoc::NormalClass00PK!dq$9share/gems/doc/rack-2.2.4/ri/Rack/ConditionalGet/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"Rack::ConditionalGet::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI" lib/rack/conditional_get.rb;T:0@omit_headings_from_table_of_contents_below000[I" (app);T@ FI"ConditionalGet;TcRDoc::NormalClass00PK!xӉ>share/gems/doc/rack-2.2.4/ri/Rack/ConditionalGet/fresh%3f-i.rinu[U:RDoc::AnyMethod[iI" fresh?:ETI" Rack::ConditionalGet#fresh?;TF: privateo:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"AReturn whether the response has not been modified since the ;TI"last request.;T: @fileI" lib/rack/conditional_get.rb;T:0@omit_headings_from_table_of_contents_below000[I"(env, headers);T@FI"ConditionalGet;TcRDoc::NormalClass00PK!8pkHHHshare/gems/doc/rack-2.2.4/ri/Rack/ConditionalGet/cdesc-ConditionalGet.rinu[U:RDoc::NormalClass[iI"ConditionalGet:ETI"Rack::ConditionalGet;TI" Object;To:RDoc::Markup::Document: @parts[o;;[ o:RDoc::Markup::Paragraph;[ I"EMiddleware that enables conditional GET using If-None-Match and ;TI"IIf-Modified-Since. The application should set either or both of the ;TI"HLast-Modified or Etag response headers according to RFC 2616. When ;TI"Jeither of the conditions is met, the response body is set to be zero ;TI"?length and the response status is set to 304 Not Modified.;To:RDoc::Markup::BlankLineo; ;[I"LApplications that defer response body generation until the body's each ;TI"Mmessage is received will avoid response body generation completely when ;TI"a conditional GET matches.;T@o; ;[I"9Adapted from Michael Klishin's Merb implementation: ;TI"jhttps://github.com/wycats/merb/blob/master/merb-core/lib/merb-core/rack/middleware/conditional_get.rb;T: @fileI" lib/rack/conditional_get.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[[I"new;TI" lib/rack/conditional_get.rb;T[:protected[[: private[[I" instance;T[[; [[I" call;T@+[;[[;[ [I"etag_matches?;T@+[I" fresh?;T@+[I"modified_since?;T@+[I"to_rfc2822;T@+[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I" Rack;TcRDoc::NormalModulePK!w@share/gems/doc/rack-2.2.4/ri/Rack/ConditionalGet/to_rfc2822-i.rinu[U:RDoc::AnyMethod[iI"to_rfc2822:ETI"$Rack::ConditionalGet#to_rfc2822;TF: privateo:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"KReturn a Time object for the given string (which should be in RFC2822 ;TI"4format), or nil if the string cannot be parsed.;T: @fileI" lib/rack/conditional_get.rb;T:0@omit_headings_from_table_of_contents_below000[I" (since);T@FI"ConditionalGet;TcRDoc::NormalClass00PK!DEshare/gems/doc/rack-2.2.4/ri/Rack/ConditionalGet/etag_matches%3f-i.rinu[U:RDoc::AnyMethod[iI"etag_matches?:ETI"'Rack::ConditionalGet#etag_matches?;TF: privateo:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"PWhether the ETag response header matches the If-None-Match request header. ;TI".If so, the request has not been modified.;T: @fileI" lib/rack/conditional_get.rb;T:0@omit_headings_from_table_of_contents_below000[I"(none_match, headers);T@FI"ConditionalGet;TcRDoc::NormalClass00PK!9:share/gems/doc/rack-2.2.4/ri/Rack/ConditionalGet/call-i.rinu[U:RDoc::AnyMethod[iI" call:ETI"Rack::ConditionalGet#call;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"share/gems/doc/rack-2.2.4/ri/Rack/Reloader/Stat/safe_stat-i.rinu[U:RDoc::AnyMethod[iI"safe_stat:ETI"#Rack::Reloader::Stat#safe_stat;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/reloader.rb;T:0@omit_headings_from_table_of_contents_below000[I" (file);T@ FI" Stat;TcRDoc::NormalModule00PK!mUU<share/gems/doc/rack-2.2.4/ri/Rack/Reloader/cdesc-Reloader.rinu[U:RDoc::NormalClass[iI" Reloader:ETI"Rack::Reloader;TI" Object;To:RDoc::Markup::Document: @parts[o;;[o:RDoc::Markup::Paragraph;[I"$High performant source reloader;To:RDoc::Markup::BlankLineo; ;[I"(This class acts as Rack middleware.;T@o; ;[I"QWhat makes it especially suited for use in a production environment is that ;TI"Oany file will only be checked once and there will only be made one system ;TI"call stat(2).;T@o; ;[I"OPlease note that this will not reload files in the background, it does so ;TI"only when actively called.;T@o; ;[I"NIt is performing a check/reload cycle at the start of every request, but ;TI"Galso respects a cool down time, during which nothing will be done.;T: @fileI"lib/rack/reloader.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[[I"new;TI"lib/rack/reloader.rb;T[:protected[[: private[[I" instance;T[[; [[I" call;T@.[I" reload!;T@.[I"safe_load;T@.[;[[;[[[U:RDoc::Context::Section[i0o;;[; 0; 0[@"I" Rack;TcRDoc::NormalModulePK!4share/gems/doc/rack-2.2.4/ri/Rack/Reloader/call-i.rinu[U:RDoc::AnyMethod[iI" call:ETI"Rack::Reloader#call;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/reloader.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@ FI" Reloader;TcRDoc::NormalClass00PK!_y/share/gems/doc/rack-2.2.4/ri/Rack/File/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"Rack::Files::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/files.rb;T:0@omit_headings_from_table_of_contents_below000[I"6(root, headers = {}, default_mime = 'text/plain');T@ FI" Files;TcRDoc::NormalClass00PK!Ҿ0share/gems/doc/rack-2.2.4/ri/Rack/File/root-i.rinu[U:RDoc::Attr[iI" root:ETI"Rack::Files#root;TI"R;T: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/files.rb;T:0@omit_headings_from_table_of_contents_below0F@ I"Rack::Files;TcRDoc::NormalClass0PK!i/share/gems/doc/rack-2.2.4/ri/Rack/File/get-i.rinu[U:RDoc::AnyMethod[iI"get:ETI"Rack::Files#get;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/files.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@ FI" Files;TcRDoc::NormalClass00PK!_UC0share/gems/doc/rack-2.2.4/ri/Rack/File/fail-i.rinu[U:RDoc::AnyMethod[iI" fail:ETI"Rack::Files#fail;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/files.rb;T:0@omit_headings_from_table_of_contents_below000[I"!(status, body, headers = {});T@ FI" Files;TcRDoc::NormalClass00PK!448share/gems/doc/rack-2.2.4/ri/Rack/File/method_added-c.rinu[U:RDoc::AnyMethod[iI"method_added:ETI"Rack::Files::method_added;TT: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"@todo remove in 3.0;T: @fileI"lib/rack/files.rb;T:0@omit_headings_from_table_of_contents_below000[I" (name);T@TI" Files;TcRDoc::NormalClass00PK!ldd5share/gems/doc/rack-2.2.4/ri/Rack/File/mime_type-i.rinu[U:RDoc::AnyMethod[iI"mime_type:ETI"Rack::Files#mime_type;TF: privateo:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"@The MIME type for the contents of the file located at @path;T: @fileI"lib/rack/files.rb;T:0@omit_headings_from_table_of_contents_below000[I"(path, default_mime);T@FI" Files;TcRDoc::NormalClass00PK!Kcڄ4share/gems/doc/rack-2.2.4/ri/Rack/File/filesize-i.rinu[U:RDoc::AnyMethod[iI" filesize:ETI"Rack::Files#filesize;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/files.rb;T:0@omit_headings_from_table_of_contents_below000[I" (path);T@ FI" Files;TcRDoc::NormalClass00PK!t0share/gems/doc/rack-2.2.4/ri/Rack/File/call-i.rinu[U:RDoc::AnyMethod[iI" call:ETI"Rack::Files#call;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/files.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@ FI" Files;TcRDoc::NormalClass00PK!+S3share/gems/doc/rack-2.2.4/ri/Rack/File/serving-i.rinu[U:RDoc::AnyMethod[iI" serving:ETI"Rack::Files#serving;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/files.rb;T:0@omit_headings_from_table_of_contents_below000[I"(request, path);T@ FI" Files;TcRDoc::NormalClass00PK!R3L444share/gems/doc/rack-2.2.4/ri/Rack/File/cdesc-File.rinu[U:RDoc::NormalClass[iI" File:ETI"Rack::File;TI" Object;To:RDoc::Markup::Document: @parts[o;;[o:RDoc::Markup::Paragraph;[ I"QRack::Files serves files below the +root+ directory given, according to the ;TI"$path info of the Rack request. ;TI"Me.g. when Rack::Files.new("/etc") is used, you can access 'passwd' file ;TI"$as http://localhost:9292/passwd;To:RDoc::Markup::BlankLineo; ;[I"IHandlers can detect if bodies are a Rack::Files, and use mechanisms ;TI"!like sendfile on the +path+.;T: @fileI"lib/rack/files.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[ I" root;TI"R;T: publicFI"lib/rack/files.rb;T[U:RDoc::Constant[iI"ALLOWED_VERBS;TI"Rack::Files::ALLOWED_VERBS;T; 0o;;[; @; 0@I" Files;TcRDoc::NormalClass0U;[iI"ALLOW_HEADER;TI"Rack::Files::ALLOW_HEADER;T; 0o;;[; @; 0@@&@'0U;[iI"MULTIPART_BOUNDARY;TI"$Rack::Files::MULTIPART_BOUNDARY;T; 0o;;[; @; 0@@&@'0[[[I" class;T[[; [[I"method_added;T@[I"new;T@[:protected[[: private[[I" instance;T[[; [[I" call;T@[I"get;T@[I" serving;T@[;[[;[[I" fail;T@[I" filesize;T@[I"mime_type;T@[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I"lib/rack/server.rb;TI"lib/rack/utils.rb;TI" Rack;TcRDoc::NormalModulePK!q x99.share/gems/doc/rack-2.2.4/ri/Rack/release-c.rinu[U:RDoc::AnyMethod[iI" release:ETI"Rack::release;TT: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"0Return the Rack release as a dotted string.;T: @fileI"lib/rack/version.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@FI" Rack;TcRDoc::NormalModule00PK!>share/gems/doc/rack-2.2.4/ri/Rack/Builder/new_from_string-c.rinu[U:RDoc::AnyMethod[iI"new_from_string:ETI"#Rack::Builder::new_from_string;TT: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"BEvaluate the given +builder_script+ string in the context of ;TI"9a Rack::Builder block, returning a Rack application.;T: @fileI"lib/rack/builder.rb;T:0@omit_headings_from_table_of_contents_below000[I"((builder_script, file = "(rackup)");T@FI" Builder;TcRDoc::NormalClass00PK!2share/gems/doc/rack-2.2.4/ri/Rack/Builder/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"Rack::Builder::new;TT: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"KInitialize a new Rack::Builder instance. +default_app+ specifies the ;TI"Cdefault application if +run+ is not called later. If a block ;TI"=is given, it is evaluted in the context of the instance.;T: @fileI"lib/rack/builder.rb;T:0@omit_headings_from_table_of_contents_below000[I" (default_app = nil, &block);T@FI" Builder;TcRDoc::NormalClass00PK!h>5share/gems/doc/rack-2.2.4/ri/Rack/Builder/warmup-i.rinu[U:RDoc::AnyMethod[iI" warmup:ETI"Rack::Builder#warmup;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"[Takes a lambda or block that is used to warm-up the application. This block is called ;TI"7before the Rack application is returned by to_app.;To:RDoc::Markup::BlankLineo:RDoc::Markup::Verbatim; [ I"warmup do |app| ;TI"+ client = Rack::MockRequest.new(app) ;TI" client.get('/') ;TI" end ;TI" ;TI"use SomeMiddleware ;TI"run MyApp;T: @format0: @fileI"lib/rack/builder.rb;T:0@omit_headings_from_table_of_contents_below000[I"(prc = nil, &block);T@FI" Builder;TcRDoc::NormalClass00PK!t8ä9share/gems/doc/rack-2.2.4/ri/Rack/Builder/parse_file-c.rinu[U:RDoc::AnyMethod[iI"parse_file:ETI"Rack::Builder::parse_file;TT: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I";Parse the given config file to get a Rack application.;To:RDoc::Markup::BlankLineo; ; [ I":If the config file ends in +.ru+, it is treated as a ;TI"8rackup file and the contents will be treated as if ;TI"=specified inside a Rack::Builder block, using the given ;TI" options.;T@o; ; [ I"5If the config file does not end in +.ru+, it is ;TI"9required and Rack will use the basename of the file ;TI"Bto guess which constant will be the Rack application to run. ;TI"4The options given will be ignored in this case.;T@o; ; [I"Examples:;T@o:RDoc::Markup::Verbatim; [I"+Rack::Builder.parse_file('config.ru') ;TI"6# Rack application built using Rack::Builder.new ;TI" ;TI"(Rack::Builder.parse_file('app.rb') ;TI"8# requires app.rb, which can be anywhere in Ruby's ;TI"8# load path. After requiring, assumes App constant ;TI"!# contains Rack application ;TI" ;TI"-Rack::Builder.parse_file('./my_app.rb') ;TI"4# requires ./my_app.rb, which should be in the ;TI"6# process's current directory. After requiring, ;TI"7# assumes MyApp constant contains Rack application;T: @format0: @fileI"lib/rack/builder.rb;T:0@omit_headings_from_table_of_contents_below000[I")(config, opts = Server::Options.new);T@,FI" Builder;TcRDoc::NormalClass00PK!Zڲ:share/gems/doc/rack-2.2.4/ri/Rack/Builder/cdesc-Builder.rinu[U:RDoc::NormalClass[iI" Builder:ETI"Rack::Builder;TI" Object;To:RDoc::Markup::Document: @parts[o;;[o:RDoc::Markup::Paragraph;[I"HRack::Builder implements a small DSL to iteratively construct Rack ;TI"applications.;To:RDoc::Markup::BlankLineo; ;[I" Example:;T@o:RDoc::Markup::Verbatim;[I"require 'rack/lobster' ;TI" app = Rack::Builder.new do ;TI" use Rack::CommonLogger ;TI" use Rack::ShowExceptions ;TI" map "/lobster" do ;TI" use Rack::Lint ;TI" run Rack::Lobster.new ;TI" end ;TI" end ;TI" ;TI" run app ;T: @format0o; ;[I"Or;T@o; ;[ I" app = Rack::Builder.app do ;TI" use Rack::CommonLogger ;TI"L run lambda { |env| [200, {'Content-Type' => 'text/plain'}, ['OK']] } ;TI" end ;TI" ;TI" run app ;T; 0o; ;[I"M+use+ adds middleware to the stack, +run+ dispatches to an application. ;TI"GYou can use +map+ to construct a Rack::URLMap in a convenient way.;T: @fileI"lib/rack/builder.rb;T:0@omit_headings_from_table_of_contents_below0; 0;0[[U:RDoc::Constant[iI"UTF_8_BOM;TI"Rack::Builder::UTF_8_BOM;T: public0o;;[o; ;[I"ihttps://stackoverflow.com/questions/2223882/whats-the-difference-between-utf-8-and-utf-8-without-bom;T; @2;0@2@cRDoc::NormalClass0[[[I" class;T[[;[ [I"app;TI"lib/rack/builder.rb;T[I"load_file;T@H[I"new;T@H[I"new_from_string;T@H[I"parse_file;T@H[:protected[[: private[[I" instance;T[[;[ [I" call;T@H[I"freeze_app;T@H[I"map;T@H[I"run;T@H[I" to_app;T@H[I"use;T@H[I" warmup;T@H[;[[;[[I"generate_map;T@H[[U:RDoc::Context::Section[i0o;;[; 0;0[@2I" Rack;TcRDoc::NormalModulePK!rث8share/gems/doc/rack-2.2.4/ri/Rack/Builder/load_file-c.rinu[U:RDoc::AnyMethod[iI"load_file:ETI"Rack::Builder::load_file;TT: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"8Load the given file as a rackup file, treating the ;TI";contents as if specified inside a Rack::Builder block.;To:RDoc::Markup::BlankLineo; ; [I"9Treats the first comment at the beginning of a line ;TI"8that starts with a backslash as options similar to ;TI"-options passed on a rackup command line.;T@o; ; [I":Ignores content in the file after +__END__+, so that ;TI"8use of +__END__+ will not result in a syntax error.;T@o; ; [I"Example config.ru file:;T@o:RDoc::Markup::Verbatim; [ I"$ cat config.ru ;TI" ;TI"#\ -p 9393 ;TI" ;TI"use Rack::ContentLength ;TI"require './app.rb' ;TI" run App;T: @format0: @fileI"lib/rack/builder.rb;T:0@omit_headings_from_table_of_contents_below000[I"'(path, opts = Server::Options.new);T@%FI" Builder;TcRDoc::NormalClass00PK!I#Y2share/gems/doc/rack-2.2.4/ri/Rack/Builder/run-i.rinu[U:RDoc::AnyMethod[iI"run:ETI"Rack::Builder#run;TF: publico:RDoc::Markup::Document: @parts[ o:RDoc::Markup::Paragraph; [I"]Takes an argument that is an object that responds to #call and returns a Rack response. ;TI"2The simplest form of this is a lambda object:;To:RDoc::Markup::BlankLineo:RDoc::Markup::Verbatim; [I"Lrun lambda { |env| [200, { "Content-Type" => "text/plain" }, ["OK"]] } ;T: @format0o; ; [I"(However this could also be a class:;T@o; ; [ I"class Heartbeat ;TI" def self.call(env) ;TI": [200, { "Content-Type" => "text/plain" }, ["OK"]] ;TI" end ;TI" end ;TI" ;TI"run Heartbeat;T; 0: @fileI"lib/rack/builder.rb;T:0@omit_headings_from_table_of_contents_below000[I" (app);T@FI" Builder;TcRDoc::NormalClass00PK!*Y2share/gems/doc/rack-2.2.4/ri/Rack/Builder/map-i.rinu[U:RDoc::AnyMethod[iI"map:ETI"Rack::Builder#map;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"[Creates a route within the application. Routes under the mapped path will be sent to ;TI"athe Rack application specified by run inside the block. Other requests will be sent to the ;TI" "text/plain" }, ["OK"]] } ;T: @format0o; ; [I"_All requests through to this application will first be processed by the middleware class. ;TI"\The +call+ method in this example sets an additional environment key which then can be ;TI"/referenced in the application if required.;T: @fileI"lib/rack/builder.rb;T:0@omit_headings_from_table_of_contents_below000[I" (middleware, *args, &block);T@#FI" Builder;TcRDoc::NormalClass00PK!)k3share/gems/doc/rack-2.2.4/ri/Rack/Builder/call-i.rinu[U:RDoc::AnyMethod[iI" call:ETI"Rack::Builder#call;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"MCall the Rack application generated by this builder instance. Note that ;TI"Jthis rebuilds the Rack application and runs the warmup code (if any) ;TI"Severy time it is called, so it should not be used if performance is important.;T: @fileI"lib/rack/builder.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@FI" Builder;TcRDoc::NormalClass00PK!%LD9share/gems/doc/rack-2.2.4/ri/Rack/Builder/freeze_app-i.rinu[U:RDoc::AnyMethod[iI"freeze_app:ETI"Rack::Builder#freeze_app;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"_Freeze the app (set using run) and all middleware instances when building the application ;TI"in to_app.;T: @fileI"lib/rack/builder.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@FI" Builder;TcRDoc::NormalClass00PK!໡;share/gems/doc/rack-2.2.4/ri/Rack/Builder/generate_map-i.rinu[U:RDoc::AnyMethod[iI"generate_map:ETI"Rack::Builder#generate_map;TF: privateo:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"MGenerate a URLMap instance by generating new Rack applications for each ;TI" map block in this instance.;T: @fileI"lib/rack/builder.rb;T:0@omit_headings_from_table_of_contents_below000[I"(default_app, mapping);T@FI" Builder;TcRDoc::NormalClass00PK!}2share/gems/doc/rack-2.2.4/ri/Rack/Builder/app-c.rinu[U:RDoc::AnyMethod[iI"app:ETI"Rack::Builder::app;TT: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"ICreate a new Rack::Builder instance and return the Rack application ;TI"generated from it.;T: @fileI"lib/rack/builder.rb;T:0@omit_headings_from_table_of_contents_below000[I" (default_app = nil, &block);T@FI" Builder;TcRDoc::NormalClass00PK!U7share/gems/doc/rack-2.2.4/ri/Rack/Static/can_serve-i.rinu[U:RDoc::AnyMethod[iI"can_serve:ETI"Rack::Static#can_serve;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/static.rb;T:0@omit_headings_from_table_of_contents_below000[I" (path);T@ FI" Static;TcRDoc::NormalClass00PK!m $1share/gems/doc/rack-2.2.4/ri/Rack/Static/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"Rack::Static::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/static.rb;T:0@omit_headings_from_table_of_contents_below000[I"(app, options = {});T@ FI" Static;TcRDoc::NormalClass00PK!f?share/gems/doc/rack-2.2.4/ri/Rack/Static/add_index_root%3f-i.rinu[U:RDoc::AnyMethod[iI"add_index_root?:ETI"!Rack::Static#add_index_root?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/static.rb;T:0@omit_headings_from_table_of_contents_below000[I" (path);T@ FI" Static;TcRDoc::NormalClass00PK!+TT>share/gems/doc/rack-2.2.4/ri/Rack/Static/applicable_rules-i.rinu[U:RDoc::AnyMethod[iI"applicable_rules:ETI""Rack::Static#applicable_rules;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I".Convert HTTP header rules to HTTP headers;T: @fileI"lib/rack/static.rb;T:0@omit_headings_from_table_of_contents_below000[I" (path);T@FI" Static;TcRDoc::NormalClass00PK!HDD8share/gems/doc/rack-2.2.4/ri/Rack/Static/cdesc-Static.rinu[U:RDoc::NormalClass[iI" Static:ETI"Rack::Static;TI" Object;To:RDoc::Markup::Document: @parts[o;;[o:RDoc::Markup::Paragraph;[ I"FThe Rack::Static middleware intercepts requests for static files ;TI"O(javascript files, images, stylesheets, etc) based on the url prefixes or ;TI"Oroute mappings passed in the options, and serves them using a Rack::Files ;TI"Oobject. This allows a Rack stack to serve both static and dynamic content.;To:RDoc::Markup::BlankLineo; ;[I"Examples:;T@o; ;[I"NServe all requests beginning with /media from the "media" folder located ;TI"+in the current directory (ie media/*):;T@o:RDoc::Markup::Verbatim;[I"+use Rack::Static, :urls => ["/media"] ;T: @format0o; ;[I"LSame as previous, but instead of returning 404 for missing files under ;TI"&/media, call the next middleware:;T@o; ;[I"=use Rack::Static, :urls => ["/media"], :cascade => true ;T; 0o; ;[I"PServe all requests beginning with /css or /images from the folder "public" ;TI"Din the current directory (ie public/css/* and public/images/*):;T@o; ;[I"Guse Rack::Static, :urls => ["/css", "/images"], :root => "public" ;T; 0o; ;[I"OServe all requests to / with "index.html" from the folder "public" in the ;TI".current directory (ie public/index.html):;T@o; ;[I"Iuse Rack::Static, :urls => {"/" => 'index.html'}, :root => 'public' ;T; 0o; ;[I"IServe all requests normally from the folder "public" in the current ;TI";directory but uses index.html as default route for "/";T@o; ;[I"Cuse Rack::Static, :urls => [""], :root => 'public', :index => ;TI"'index.html' ;T; 0o; ;[I"0Set custom HTTP Headers for based on rules:;T@o; ;[4I"- use Rack::Static, :root => 'public', ;TI" :header_rules => [ ;TI"J [rule, {header_field => content, header_field => content}], ;TI"0 [rule, {header_field => content}] ;TI" ] ;TI" ;TI" Rules for selecting files: ;TI" ;TI"1) All files ;TI" Provide the :all symbol ;TI"# :all => Matches every file ;TI" ;TI"2) Folders ;TI", Provide the folder path as a string ;TI"N '/folder' or '/folder/subfolder' => Matches files in a certain folder ;TI" ;TI"3) File Extensions ;TI"0 Provide the file extensions as an array ;TI"K ['css', 'js'] or %w(css js) => Matches files ending in .css or .js ;TI" ;TI"%4) Regular Expressions / Regexp ;TI"% Provide a regular expression ;TI"B %r{\.(?:css|js)\z} => Matches files ending in .css or .js ;TI"H /\.(?:eot|ttf|otf|woff2|woff|svg)\z/ => Matches files ending in ;TI"S the most common web font formats (.eot, .ttf, .otf, .woff2, .woff, .svg) ;TI"N Note: This Regexp is available as a shortcut, using the :fonts rule ;TI" ;TI"5) Font Shortcut ;TI"" Provide the :fonts symbol ;TI"_ :fonts => Uses the Regexp rule stated right above to match all common web font endings ;TI" ;TI"Rule Ordering: ;TI"> Rules are applied in the order that they are provided. ;TI"5 List rather general rules above special ones. ;TI" ;TI" 'public', ;TI" :header_rules => [ ;TI"K # Cache all static files in public caches (e.g. Rack::Cache) ;TI"+ # as well as in the browser ;TI"G [:all, {'Cache-Control' => 'public, max-age=31536000'}], ;TI" ;TI"K # Provide web fonts with cross-origin access-control-headers ;TI"\ # Firefox requires this when serving assets using a Content Delivery Network ;TI"? [:fonts, {'Access-Control-Allow-Origin' => '*'}] ;TI" ];T; 0: @fileI"lib/rack/static.rb;T:0@omit_headings_from_table_of_contents_below0; 0;0[[[[[I" class;T[[: public[[I"new;TI"lib/rack/static.rb;T[:protected[[: private[[I" instance;T[[;[ [I"add_index_root?;T@|[I"applicable_rules;T@|[I" call;T@|[I"can_serve;T@|[I"overwrite_file_path;T@|[I"route_file;T@|[;[[;[[[U:RDoc::Context::Section[i0o;;[; 0;0[@pI" Rack;TcRDoc::NormalModulePK!rQ  Ashare/gems/doc/rack-2.2.4/ri/Rack/Static/overwrite_file_path-i.rinu[U:RDoc::AnyMethod[iI"overwrite_file_path:ETI"%Rack::Static#overwrite_file_path;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/static.rb;T:0@omit_headings_from_table_of_contents_below000[I" (path);T@ FI" Static;TcRDoc::NormalClass00PK!^,8share/gems/doc/rack-2.2.4/ri/Rack/Static/route_file-i.rinu[U:RDoc::AnyMethod[iI"route_file:ETI"Rack::Static#route_file;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/static.rb;T:0@omit_headings_from_table_of_contents_below000[I" (path);T@ FI" Static;TcRDoc::NormalClass00PK!;2share/gems/doc/rack-2.2.4/ri/Rack/Static/call-i.rinu[U:RDoc::AnyMethod[iI" call:ETI"Rack::Static#call;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/static.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@ FI" Static;TcRDoc::NormalClass00PK!J!!/share/gems/doc/rack-2.2.4/ri/Rack/cdesc-Rack.rinu[U:RDoc::NormalModule[iI" Rack:ET@0o:RDoc::Markup::Document: @parts[Fo;;[: @fileI"lib/rack.rb;T:0@omit_headings_from_table_of_contents_below0o;;[; I"&lib/rack/auth/abstract/handler.rb;T; 0o;;[; I"&lib/rack/auth/abstract/request.rb;T; 0o;;[; I"lib/rack/auth/basic.rb;T; 0o;;[; I" lib/rack/auth/digest/md5.rb;T; 0o;;[; I""lib/rack/auth/digest/nonce.rb;T; 0o;;[; I"#lib/rack/auth/digest/params.rb;T; 0o;;[; I"$lib/rack/auth/digest/request.rb;T; 0o;;[; I"lib/rack/body_proxy.rb;T; 0o;;[; I"lib/rack/builder.rb;T; 0o;;[; I"lib/rack/cascade.rb;T; 0o;;[; I"lib/rack/chunked.rb;T; 0o;;[; I"lib/rack/common_logger.rb;T; 0o;;[; I" lib/rack/conditional_get.rb;T; 0o;;[; I"lib/rack/config.rb;T; 0o;;[; I"lib/rack/content_length.rb;T; 0o;;[; I"lib/rack/content_type.rb;T; 0o;;[o:RDoc::Markup::Paragraph;[I"(Regexp has `match?` since Ruby 2.4 ;TI";so to support Ruby < 2.4 we need to define this method;T; I" lib/rack/core_ext/regexp.rb;T; 0o;;[; I"lib/rack/deflater.rb;T; 0o;;[; I"lib/rack/directory.rb;T; 0o;;[; I"lib/rack/etag.rb;T; 0o;;[; I"lib/rack/events.rb;T; 0o;;[; I"lib/rack/file.rb;T; 0o;;[; I"lib/rack/files.rb;T; 0o;;[; I"lib/rack/handler.rb;T; 0o;;[; I"lib/rack/handler/cgi.rb;T; 0o;;[; I" lib/rack/handler/fastcgi.rb;T; 0o;;[; I"lib/rack/handler/lsws.rb;T; 0o;;[; I"lib/rack/handler/scgi.rb;T; 0o;;[; I"lib/rack/handler/thin.rb;T; 0o;;[; I" lib/rack/handler/webrick.rb;T; 0o;;[; I"lib/rack/head.rb;T; 0o;;[; I"lib/rack/lint.rb;T; 0o;;[; I"lib/rack/lobster.rb;T; 0o;;[; I"lib/rack/lock.rb;T; 0o;;[; I"lib/rack/logger.rb;T; 0o;;[; I"lib/rack/media_type.rb;T; 0o;;[; I" lib/rack/method_override.rb;T; 0o;;[; I"lib/rack/mime.rb;T; 0o;;[; I"lib/rack/mock.rb;T; 0o;;[; I"lib/rack/multipart.rb;T; 0o;;[; I"$lib/rack/multipart/generator.rb;T; 0o;;[; I"!lib/rack/multipart/parser.rb;T; 0o;;[; I"(lib/rack/multipart/uploaded_file.rb;T; 0o;;[; I"lib/rack/null_logger.rb;T; 0o;;[; I"lib/rack/query_parser.rb;T; 0o;;[; I"lib/rack/recursive.rb;T; 0o;;[; I"lib/rack/reloader.rb;T; 0o;;[; I"lib/rack/request.rb;T; 0o;;[; I"lib/rack/response.rb;T; 0o;;[; I"!lib/rack/rewindable_input.rb;T; 0o;;[; I"lib/rack/runtime.rb;T; 0o;;[; I"lib/rack/sendfile.rb;T; 0o;;[; I"lib/rack/server.rb;T; 0o;;[; I"$lib/rack/session/abstract/id.rb;T; 0o;;[; I"lib/rack/session/cookie.rb;T; 0o;;[; I"!lib/rack/session/memcache.rb;T; 0o;;[; I"lib/rack/session/pool.rb;T; 0o;;[; I" lib/rack/show_exceptions.rb;T; 0o;;[; I"lib/rack/show_status.rb;T; 0o;;[; I"lib/rack/static.rb;T; 0o;;[; I" lib/rack/tempfile_reaper.rb;T; 0o;;[; I"lib/rack/urlmap.rb;T; 0o;;[; I"lib/rack/utils.rb;T; 0o;;[o; ;[I"DThe Rack main module, serving as a namespace for all core Rack ;TI"modules and classes.;To:RDoc::Markup::BlankLineo; ;[I"QAll modules meant for use in your application are autoloaded here, ;TI"Iso it should be enough just to require 'rack' in your code.;T; I"lib/rack/version.rb;T; 0; 0; 0[[AU:RDoc::Constant[iI"HTTP_HOST;TI"Rack::HTTP_HOST;T: public0o;;[; @ ; 0@ @cRDoc::NormalModule0U; [iI"HTTP_PORT;TI"Rack::HTTP_PORT;T;0o;;[; @ ; 0@ @@0U; [iI"HTTP_VERSION;TI"Rack::HTTP_VERSION;T;0o;;[; @ ; 0@ @@0U; [iI" HTTPS;TI"Rack::HTTPS;T;0o;;[; @ ; 0@ @@0U; [iI"PATH_INFO;TI"Rack::PATH_INFO;T;0o;;[; @ ; 0@ @@0U; [iI"REQUEST_METHOD;TI"Rack::REQUEST_METHOD;T;0o;;[; @ ; 0@ @@0U; [iI"REQUEST_PATH;TI"Rack::REQUEST_PATH;T;0o;;[; @ ; 0@ @@0U; [iI"SCRIPT_NAME;TI"Rack::SCRIPT_NAME;T;0o;;[; @ ; 0@ @@0U; [iI"QUERY_STRING;TI"Rack::QUERY_STRING;T;0o;;[; @ ; 0@ @@0U; [iI"SERVER_PROTOCOL;TI"Rack::SERVER_PROTOCOL;T;0o;;[; @ ; 0@ @@0U; [iI"SERVER_NAME;TI"Rack::SERVER_NAME;T;0o;;[; @ ; 0@ @@0U; [iI"SERVER_PORT;TI"Rack::SERVER_PORT;T;0o;;[; @ ; 0@ @@0U; [iI"CACHE_CONTROL;TI"Rack::CACHE_CONTROL;T;0o;;[; @ ; 0@ @@0U; [iI" EXPIRES;TI"Rack::EXPIRES;T;0o;;[; @ ; 0@ @@0U; [iI"CONTENT_LENGTH;TI"Rack::CONTENT_LENGTH;T;0o;;[; @ ; 0@ @@0U; [iI"CONTENT_TYPE;TI"Rack::CONTENT_TYPE;T;0o;;[; @ ; 0@ @@0U; [iI"SET_COOKIE;TI"Rack::SET_COOKIE;T;0o;;[; @ ; 0@ @@0U; [iI"TRANSFER_ENCODING;TI"Rack::TRANSFER_ENCODING;T;0o;;[; @ ; 0@ @@0U; [iI"HTTP_COOKIE;TI"Rack::HTTP_COOKIE;T;0o;;[; @ ; 0@ @@0U; [iI" ETAG;TI"Rack::ETAG;T;0o;;[; @ ; 0@ @@0U; [iI"GET;TI"Rack::GET;T;0o;;[o; ;[I"HTTP method verbs;T; @ ; 0@ @@0U; [iI" POST;TI"Rack::POST;T;0o;;[; @ ; 0@ @@0U; [iI"PUT;TI"Rack::PUT;T;0o;;[; @ ; 0@ @@0U; [iI" PATCH;TI"Rack::PATCH;T;0o;;[; @ ; 0@ @@0U; [iI" DELETE;TI"Rack::DELETE;T;0o;;[; @ ; 0@ @@0U; [iI" HEAD;TI"Rack::HEAD;T;0o;;[; @ ; 0@ @@0U; [iI" OPTIONS;TI"Rack::OPTIONS;T;0o;;[; @ ; 0@ @@0U; [iI" LINK;TI"Rack::LINK;T;0o;;[; @ ; 0@ @@0U; [iI" UNLINK;TI"Rack::UNLINK;T;0o;;[; @ ; 0@ @@0U; [iI" TRACE;TI"Rack::TRACE;T;0o;;[; @ ; 0@ @@0U; [iI"RACK_VERSION;TI"Rack::RACK_VERSION;T;0o;;[o; ;[I"Rack environment variables;T; @ ; 0@ @@0U; [iI"RACK_TEMPFILES;TI"Rack::RACK_TEMPFILES;T;0o;;[; @ ; 0@ @@0U; [iI"RACK_ERRORS;TI"Rack::RACK_ERRORS;T;0o;;[; @ ; 0@ @@0U; [iI"RACK_LOGGER;TI"Rack::RACK_LOGGER;T;0o;;[; @ ; 0@ @@0U; [iI"RACK_INPUT;TI"Rack::RACK_INPUT;T;0o;;[; @ ; 0@ @@0U; [iI"RACK_SESSION;TI"Rack::RACK_SESSION;T;0o;;[; @ ; 0@ @@0U; [iI"RACK_SESSION_OPTIONS;TI"Rack::RACK_SESSION_OPTIONS;T;0o;;[; @ ; 0@ @@0U; [iI"RACK_SHOWSTATUS_DETAIL;TI"!Rack::RACK_SHOWSTATUS_DETAIL;T;0o;;[; @ ; 0@ @@0U; [iI"RACK_MULTITHREAD;TI"Rack::RACK_MULTITHREAD;T;0o;;[; @ ; 0@ @@0U; [iI"RACK_MULTIPROCESS;TI"Rack::RACK_MULTIPROCESS;T;0o;;[; @ ; 0@ @@0U; [iI"RACK_RUNONCE;TI"Rack::RACK_RUNONCE;T;0o;;[; @ ; 0@ @@0U; [iI"RACK_URL_SCHEME;TI"Rack::RACK_URL_SCHEME;T;0o;;[; @ ; 0@ @@0U; [iI"RACK_HIJACK;TI"Rack::RACK_HIJACK;T;0o;;[; @ ; 0@ @@0U; [iI"RACK_IS_HIJACK;TI"Rack::RACK_IS_HIJACK;T;0o;;[; @ ; 0@ @@0U; [iI"RACK_HIJACK_IO;TI"Rack::RACK_HIJACK_IO;T;0o;;[; @ ; 0@ @@0U; [iI"RACK_RECURSIVE_INCLUDE;TI"!Rack::RACK_RECURSIVE_INCLUDE;T;0o;;[; @ ; 0@ @@0U; [iI"RACK_MULTIPART_BUFFER_SIZE;TI"%Rack::RACK_MULTIPART_BUFFER_SIZE;T;0o;;[; @ ; 0@ @@0U; [iI"$RACK_MULTIPART_TEMPFILE_FACTORY;TI"*Rack::RACK_MULTIPART_TEMPFILE_FACTORY;T;0o;;[; @ ; 0@ @@0U; [iI"RACK_REQUEST_FORM_INPUT;TI""Rack::RACK_REQUEST_FORM_INPUT;T;0o;;[; @ ; 0@ @@0U; [iI"RACK_REQUEST_FORM_HASH;TI"!Rack::RACK_REQUEST_FORM_HASH;T;0o;;[; @ ; 0@ @@0U; [iI"RACK_REQUEST_FORM_VARS;TI"!Rack::RACK_REQUEST_FORM_VARS;T;0o;;[; @ ; 0@ @@0U; [iI"RACK_REQUEST_COOKIE_HASH;TI"#Rack::RACK_REQUEST_COOKIE_HASH;T;0o;;[; @ ; 0@ @@0U; [iI"RACK_REQUEST_COOKIE_STRING;TI"%Rack::RACK_REQUEST_COOKIE_STRING;T;0o;;[; @ ; 0@ @@0U; [iI"RACK_REQUEST_QUERY_HASH;TI""Rack::RACK_REQUEST_QUERY_HASH;T;0o;;[; @ ; 0@ @@0U; [iI"RACK_REQUEST_QUERY_STRING;TI"$Rack::RACK_REQUEST_QUERY_STRING;T;0o;;[; @ ; 0@ @@0U; [iI"(RACK_METHODOVERRIDE_ORIGINAL_METHOD;TI".Rack::RACK_METHODOVERRIDE_ORIGINAL_METHOD;T;0o;;[; @ ; 0@ @@0U; [iI"&RACK_SESSION_UNPACKED_COOKIE_DATA;TI",Rack::RACK_SESSION_UNPACKED_COOKIE_DATA;T;0o;;[; @ ; 0@ @@0U; [iI" File;TI"Rack::File;T;I"Rack::Files;To;;[; @R; 0@R@@0U; [iI" VERSION;TI"Rack::VERSION;T;0o;;[o; ;[I"2The Rack protocol version number implemented.;T; @; 0@@@0U; [iI" RELEASE;TI"Rack::RELEASE;T;0o;;[; @; 0@@@0[[[I" class;T[[;[[I" release;TI"lib/rack/version.rb;T[I" version;T@S[:protected[[: private[[I" instance;T[[;[[;[[;[[[U:RDoc::Context::Section[i0o;;[; 0; 0[F@ @@@@@@@!@$@'@*@-@0@3@6@9@<@C@F@I@L@O@R@U@X@[@^@a@d@g@j@m@p@s@v@y@|@@}@@@@@@@@@@@@@@@@@@@@@@@@@@@cRDoc::TopLevelPK!A2share/gems/doc/rack-2.2.4/ri/Rack/Runtime/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"Rack::Runtime::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/runtime.rb;T:0@omit_headings_from_table_of_contents_below000[I"(app, name = nil);T@ FI" Runtime;TcRDoc::NormalClass00PK!Ũ@:share/gems/doc/rack-2.2.4/ri/Rack/Runtime/cdesc-Runtime.rinu[U:RDoc::NormalClass[iI" Runtime:ETI"Rack::Runtime;TI" Object;To:RDoc::Markup::Document: @parts[o;;[o:RDoc::Markup::Paragraph;[I"BSets an "X-Runtime" response header, indicating the response ;TI"$time of the request, in seconds;To:RDoc::Markup::BlankLineo; ;[I"GYou can put it right before the application to see the processing ;TI"Itime, or before all the other middlewares to include time for them, ;TI" too.;T: @fileI"lib/rack/runtime.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[[I"new;TI"lib/rack/runtime.rb;T[:protected[[: private[[I" instance;T[[; [[I" call;T@$[;[[;[[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I" Rack;TcRDoc::NormalModulePK!C3share/gems/doc/rack-2.2.4/ri/Rack/Runtime/call-i.rinu[U:RDoc::AnyMethod[iI" call:ETI"Rack::Runtime#call;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/runtime.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@ FI" Runtime;TcRDoc::NormalClass00PK!8""Jshare/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/unpacked_cookie_data-i.rinu[U:RDoc::AnyMethod[iI"unpacked_cookie_data:ETI"/Rack::Session::Cookie#unpacked_cookie_data;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/session/cookie.rb;T:0@omit_headings_from_table_of_contents_below000[I"(request);T@ FI" Cookie;TcRDoc::NormalClass00PK!..Nshare/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/persistent_session_id%21-i.rinu[U:RDoc::AnyMethod[iI"persistent_session_id!:ETI"1Rack::Session::Cookie#persistent_session_id!;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/session/cookie.rb;T:0@omit_headings_from_table_of_contents_below000[I"(data, sid = nil);T@ FI" Cookie;TcRDoc::NormalClass00PK!Z  Eshare/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/Identity/decode-i.rinu[U:RDoc::AnyMethod[iI" decode:ETI"+Rack::Session::Cookie::Identity#decode;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/session/cookie.rb;T:0@omit_headings_from_table_of_contents_below000[I" (str);T@ FI" Identity;TcRDoc::NormalClass00PK!ng77Kshare/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/Identity/cdesc-Identity.rinu[U:RDoc::NormalClass[iI" Identity:ETI"$Rack::Session::Cookie::Identity;TI" Object;To:RDoc::Markup::Document: @parts[o;;[o:RDoc::Markup::Paragraph;[I"(Use no encoding for session cookies;T: @fileI"lib/rack/session/cookie.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[[:protected[[: private[[I" instance;T[[; [[I" decode;TI"lib/rack/session/cookie.rb;T[I" encode;T@&[; [[;[[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I"Rack::Session::Cookie;TcRDoc::NormalClassPK!  Eshare/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/Identity/encode-i.rinu[U:RDoc::AnyMethod[iI" encode:ETI"+Rack::Session::Cookie::Identity#encode;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/session/cookie.rb;T:0@omit_headings_from_table_of_contents_below000[I" (str);T@ FI" Identity;TcRDoc::NormalClass00PK!  9share/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"Rack::Session::Cookie::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/session/cookie.rb;T:0@omit_headings_from_table_of_contents_below000[I"(app, options = {});T@ TI" Cookie;TcRDoc::NormalClass00PK!]p@share/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/cdesc-Cookie.rinu[U:RDoc::NormalClass[iI" Cookie:ETI"Rack::Session::Cookie;TI"-Rack::Session::Abstract::PersistedSecure;To:RDoc::Markup::Document: @parts[o;;[o:RDoc::Markup::Paragraph;[ I"LRack::Session::Cookie provides simple cookie based session management. ;TI"PBy default, the session is a Ruby Hash stored as base64 encoded marshalled ;TI"Ldata set to :key (default: rack.session). The object that encodes the ;TI"Msession data is configurable and must respond to +encode+ and +decode+. ;TI"9Both methods must take a string and return a string.;To:RDoc::Markup::BlankLineo; ;[I"LWhen the secret key is set, cookie data is checked for data integrity. ;TI"MThe old secret key is also accepted and allows graceful secret rotation.;T@o; ;[I" Example:;T@o:RDoc::Markup::Verbatim;[ I"8use Rack::Session::Cookie, :key => 'rack.session', ;TI"6 :domain => 'foo.com', ;TI". :path => '/', ;TI": :expire_after => 2592000, ;TI"8 :secret => 'change_me', ;TI"@ :old_secret => 'also_change_me' ;TI" ;TI""All parameters are optional. ;T: @format0o; ;[I"*Example of a cookie with no encoding:;T@o; ;[I".Rack::Session::Cookie.new(application, { ;TI"5 :coder => Rack::Session::Cookie::Identity.new ;TI"}) ;T; 0o; ;[I".Example of a cookie with custom encoding:;T@o; ;[ I".Rack::Session::Cookie.new(application, { ;TI" :coder => Class.new { ;TI"+ def encode(str); str.reverse; end ;TI"+ def decode(str); str.reverse; end ;TI" }.new ;TI"});T; 0: @fileI"lib/rack/session/cookie.rb;T:0@omit_headings_from_table_of_contents_below0; 0;0[[ I" coder;TI"R;T: publicFI"lib/rack/session/cookie.rb;T[[[[I" class;T[[;[[I"new;T@?[:protected[[: private[[I" instance;T[[;[[;[[;[[I"delete_session;T@?[I"digest_match?;T@?[I"extract_session_id;T@?[I"find_session;T@?[I"generate_hmac;T@?[I"persistent_session_id!;T@?[I" secure?;T@?[I"unpacked_cookie_data;T@?[I"write_session;T@?[[U:RDoc::Context::Section[i0o;;[; 0;0[@:I"Rack::Session;TcRDoc::NormalModulePK!)..Cshare/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/write_session-i.rinu[U:RDoc::AnyMethod[iI"write_session:ETI"(Rack::Session::Cookie#write_session;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/session/cookie.rb;T:0@omit_headings_from_table_of_contents_below000[I"((req, session_id, session, options);T@ FI" Cookie;TcRDoc::NormalClass00PK!UEshare/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/digest_match%3f-i.rinu[U:RDoc::AnyMethod[iI"digest_match?:ETI"(Rack::Session::Cookie#digest_match?;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/session/cookie.rb;T:0@omit_headings_from_table_of_contents_below000[I"(data, digest);T@ FI" Cookie;TcRDoc::NormalClass00PK!(?share/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/secure%3f-i.rinu[U:RDoc::AnyMethod[iI" secure?:ETI""Rack::Session::Cookie#secure?;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/session/cookie.rb;T:0@omit_headings_from_table_of_contents_below000[I"(options);T@ FI" Cookie;TcRDoc::NormalClass00PK!|Bshare/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/find_session-i.rinu[U:RDoc::AnyMethod[iI"find_session:ETI"'Rack::Session::Cookie#find_session;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/session/cookie.rb;T:0@omit_headings_from_table_of_contents_below000[I"(req, sid);T@ FI" Cookie;TcRDoc::NormalClass00PK!/;Jshare/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/Base64/JSON/cdesc-JSON.rinu[U:RDoc::NormalClass[iI" JSON:ETI"(Rack::Session::Cookie::Base64::JSON;TI""Rack::Session::Cookie::Base64;To:RDoc::Markup::Document: @parts[o;;[o:RDoc::Markup::Paragraph;[I"IN.B. Unlike other encoding methods, the contained objects must be a ;TI":valid JSON composite type, either a Hash or an Array.;T: @fileI"lib/rack/session/cookie.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[[:protected[[: private[[I" instance;T[[; [[I" decode;TI"lib/rack/session/cookie.rb;T[I" encode;T@'[; [[;[[[U:RDoc::Context::Section[i0o;;[; 0; 0[@@ cRDoc::NormalClassPK!B6  Hshare/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/Base64/JSON/decode-i.rinu[U:RDoc::AnyMethod[iI" decode:ETI"/Rack::Session::Cookie::Base64::JSON#decode;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/session/cookie.rb;T:0@omit_headings_from_table_of_contents_below000[I" (str);T@ TI" JSON;TcRDoc::NormalClass00PK! ق  Hshare/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/Base64/JSON/encode-i.rinu[U:RDoc::AnyMethod[iI" encode:ETI"/Rack::Session::Cookie::Base64::JSON#encode;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/session/cookie.rb;T:0@omit_headings_from_table_of_contents_below000[I" (obj);T@ TI" JSON;TcRDoc::NormalClass00PK!z|00Gshare/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/Base64/cdesc-Base64.rinu[U:RDoc::NormalClass[iI" Base64:ETI""Rack::Session::Cookie::Base64;TI" Object;To:RDoc::Markup::Document: @parts[o;;[o:RDoc::Markup::Paragraph;[I"%Encode session cookies as Base64;T: @fileI"lib/rack/session/cookie.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[[:protected[[: private[[I" instance;T[[; [[I" decode;TI"lib/rack/session/cookie.rb;T[I" encode;T@&[; [[;[[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I"Rack::Session::Cookie;TcRDoc::NormalClassPK!  Cshare/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/Base64/decode-i.rinu[U:RDoc::AnyMethod[iI" decode:ETI")Rack::Session::Cookie::Base64#decode;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/session/cookie.rb;T:0@omit_headings_from_table_of_contents_below000[I" (str);T@ FI" Base64;TcRDoc::NormalClass00PK!)=(Kshare/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/Base64/Marshal/decode-i.rinu[U:RDoc::AnyMethod[iI" decode:ETI"2Rack::Session::Cookie::Base64::Marshal#decode;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/session/cookie.rb;T:0@omit_headings_from_table_of_contents_below000[I" (str);T@ TI" Marshal;TcRDoc::NormalClass00PK!\06FFPshare/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/Base64/Marshal/cdesc-Marshal.rinu[U:RDoc::NormalClass[iI" Marshal:ETI"+Rack::Session::Cookie::Base64::Marshal;TI""Rack::Session::Cookie::Base64;To:RDoc::Markup::Document: @parts[o;;[o:RDoc::Markup::Paragraph;[I"4Encode session cookies as Marshaled Base64 data;T: @fileI"lib/rack/session/cookie.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[[:protected[[: private[[I" instance;T[[; [[I" decode;TI"lib/rack/session/cookie.rb;T[I" encode;T@&[; [[;[[[U:RDoc::Context::Section[i0o;;[; 0; 0[@@ cRDoc::NormalClassPK!Kshare/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/Base64/Marshal/encode-i.rinu[U:RDoc::AnyMethod[iI" encode:ETI"2Rack::Session::Cookie::Base64::Marshal#encode;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/session/cookie.rb;T:0@omit_headings_from_table_of_contents_below000[I" (str);T@ TI" Marshal;TcRDoc::NormalClass00PK!$oKshare/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/Base64/ZipJSON/decode-i.rinu[U:RDoc::AnyMethod[iI" decode:ETI"2Rack::Session::Cookie::Base64::ZipJSON#decode;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/session/cookie.rb;T:0@omit_headings_from_table_of_contents_below000[I" (str);T@ TI" ZipJSON;TcRDoc::NormalClass00PK!gzPshare/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/Base64/ZipJSON/cdesc-ZipJSON.rinu[U:RDoc::NormalClass[iI" ZipJSON:ETI"+Rack::Session::Cookie::Base64::ZipJSON;TI""Rack::Session::Cookie::Base64;To:RDoc::Markup::Document: @parts[o;;[: @fileI"lib/rack/session/cookie.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[[:protected[[: private[[I" instance;T[[; [[I" decode;TI"lib/rack/session/cookie.rb;T[I" encode;T@#[; [[; [[[U:RDoc::Context::Section[i0o;;[; 0; 0[@@ cRDoc::NormalClassPK!XKshare/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/Base64/ZipJSON/encode-i.rinu[U:RDoc::AnyMethod[iI" encode:ETI"2Rack::Session::Cookie::Base64::ZipJSON#encode;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/session/cookie.rb;T:0@omit_headings_from_table_of_contents_below000[I" (obj);T@ TI" ZipJSON;TcRDoc::NormalClass00PK!  Cshare/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/Base64/encode-i.rinu[U:RDoc::AnyMethod[iI" encode:ETI")Rack::Session::Cookie::Base64#encode;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/session/cookie.rb;T:0@omit_headings_from_table_of_contents_below000[I" (str);T@ FI" Base64;TcRDoc::NormalClass00PK!⃦Hshare/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/extract_session_id-i.rinu[U:RDoc::AnyMethod[iI"extract_session_id:ETI"-Rack::Session::Cookie#extract_session_id;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/session/cookie.rb;T:0@omit_headings_from_table_of_contents_below000[I"(request);T@ FI" Cookie;TcRDoc::NormalClass00PK!HYfCshare/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/generate_hmac-i.rinu[U:RDoc::AnyMethod[iI"generate_hmac:ETI"(Rack::Session::Cookie#generate_hmac;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/session/cookie.rb;T:0@omit_headings_from_table_of_contents_below000[I"(data, secret);T@ FI" Cookie;TcRDoc::NormalClass00PK!##Lshare/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/SessionId/cookie_value-i.rinu[U:RDoc::Attr[iI"cookie_value:ETI"2Rack::Session::Cookie::SessionId#cookie_value;TI"R;T: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/session/cookie.rb;T:0@omit_headings_from_table_of_contents_below0F@ I"%Rack::Session::Cookie::SessionId;TcRDoc::NormalClass0PK!}˧Cshare/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/SessionId/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"*Rack::Session::Cookie::SessionId::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/session/cookie.rb;T:0@omit_headings_from_table_of_contents_below000[I"(session_id, cookie_value);T@ TI"SessionId;TcRDoc::NormalClass00PK!/Mshare/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/SessionId/cdesc-SessionId.rinu[U:RDoc::NormalClass[iI"SessionId:ETI"%Rack::Session::Cookie::SessionId;TI"&DelegateClass(Session::SessionId);To:RDoc::Markup::Document: @parts[o;;[: @fileI"lib/rack/session/cookie.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[ I"cookie_value;TI"R;T: publicFI"lib/rack/session/cookie.rb;T[[[[I" class;T[[; [[I"new;T@[:protected[[: private[[I" instance;T[[; [[; [[; [[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I"Rack::Session::Cookie;TcRDoc::NormalClassPK!''Dshare/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/delete_session-i.rinu[U:RDoc::AnyMethod[iI"delete_session:ETI")Rack::Session::Cookie#delete_session;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/session/cookie.rb;T:0@omit_headings_from_table_of_contents_below000[I"(req, session_id, options);T@ FI" Cookie;TcRDoc::NormalClass00PK!U!G;share/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/coder-i.rinu[U:RDoc::Attr[iI" coder:ETI" Rack::Session::Cookie#coder;TI"R;T: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/session/cookie.rb;T:0@omit_headings_from_table_of_contents_below0F@ I"Rack::Session::Cookie;TcRDoc::NormalClass0PK! `a9share/gems/doc/rack-2.2.4/ri/Rack/Session/Pool/mutex-i.rinu[U:RDoc::Attr[iI" mutex:ETI"Rack::Session::Pool#mutex;TI"R;T: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/session/pool.rb;T:0@omit_headings_from_table_of_contents_below0F@ I"Rack::Session::Pool;TcRDoc::NormalClass0PK!iF(7share/gems/doc/rack-2.2.4/ri/Rack/Session/Pool/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"Rack::Session::Pool::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/session/pool.rb;T:0@omit_headings_from_table_of_contents_below000[I"(app, options = {});T@ TI" Pool;TcRDoc::NormalClass00PK! ++Ashare/gems/doc/rack-2.2.4/ri/Rack/Session/Pool/write_session-i.rinu[U:RDoc::AnyMethod[iI"write_session:ETI"&Rack::Session::Pool#write_session;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/session/pool.rb;T:0@omit_headings_from_table_of_contents_below000[I",(req, session_id, new_session, options);T@ FI" Pool;TcRDoc::NormalClass00PK!1C2=share/gems/doc/rack-2.2.4/ri/Rack/Session/Pool/with_lock-i.rinu[U:RDoc::AnyMethod[iI"with_lock:ETI""Rack::Session::Pool#with_lock;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/session/pool.rb;T:0@omit_headings_from_table_of_contents_below00I";T[I" (req);T@ FI" Pool;TcRDoc::NormalClass00PK!Q  @share/gems/doc/rack-2.2.4/ri/Rack/Session/Pool/find_session-i.rinu[U:RDoc::AnyMethod[iI"find_session:ETI"%Rack::Session::Pool#find_session;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/session/pool.rb;T:0@omit_headings_from_table_of_contents_below000[I"(req, sid);T@ FI" Pool;TcRDoc::NormalClass00PK!_e8share/gems/doc/rack-2.2.4/ri/Rack/Session/Pool/pool-i.rinu[U:RDoc::Attr[iI" pool:ETI"Rack::Session::Pool#pool;TI"R;T: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/session/pool.rb;T:0@omit_headings_from_table_of_contents_below0F@ I"Rack::Session::Pool;TcRDoc::NormalClass0PK!A<share/gems/doc/rack-2.2.4/ri/Rack/Session/Pool/cdesc-Pool.rinu[U:RDoc::NormalClass[iI" Pool:ETI"Rack::Session::Pool;TI"-Rack::Session::Abstract::PersistedSecure;To:RDoc::Markup::Document: @parts[o;;[ o:RDoc::Markup::Paragraph;[ I"JRack::Session::Pool provides simple cookie based session management. ;TI"5Session data is stored in a hash held by @pool. ;TI"CIn the context of a multithreaded environment, sessions being ;TI"7committed to the pool is done in a merging manner.;To:RDoc::Markup::BlankLineo; ;[I"JThe :drop option is available in rack.session.options if you wish to ;TI":explicitly remove the session from the session cache.;T@o; ;[I" Example:;To:RDoc::Markup::Verbatim;[ I"myapp = MyRackApp.new ;TI"0sessioned = Rack::Session::Pool.new(myapp, ;TI" :domain => 'foo.com', ;TI" :expire_after => 2592000 ;TI") ;TI")Rack::Handler::WEBrick.run sessioned;T: @format0: @fileI"lib/rack/session/pool.rb;T:0@omit_headings_from_table_of_contents_below0; 0;0[[ I" mutex;TI"R;T: publicFI"lib/rack/session/pool.rb;T[ I" pool;T@(;F@)[U:RDoc::Constant[iI"DEFAULT_OPTIONS;TI")Rack::Session::Pool::DEFAULT_OPTIONS;T;0o;;[; @$;0@$@cRDoc::NormalClass0[[[I" class;T[[;[[I"new;T@)[:protected[[: private[[I" instance;T[[;[ [I"delete_session;T@)[I"find_session;T@)[I"generate_sid;T@)[I"with_lock;T@)[I"write_session;T@)[;[[;[[I"get_session_with_fallback;T@)[[U:RDoc::Context::Section[i0o;;[; 0;0[@$I"Rack::Session;TcRDoc::NormalModulePK!.k@share/gems/doc/rack-2.2.4/ri/Rack/Session/Pool/generate_sid-i.rinu[U:RDoc::AnyMethod[iI"generate_sid:ETI"%Rack::Session::Pool#generate_sid;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/session/pool.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ TI" Pool;TcRDoc::NormalClass00PK!g  Bshare/gems/doc/rack-2.2.4/ri/Rack/Session/Pool/delete_session-i.rinu[U:RDoc::AnyMethod[iI"delete_session:ETI"'Rack::Session::Pool#delete_session;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/session/pool.rb;T:0@omit_headings_from_table_of_contents_below000[I"(req, session_id, options);T@ FI" Pool;TcRDoc::NormalClass00PK!dp""Mshare/gems/doc/rack-2.2.4/ri/Rack/Session/Pool/get_session_with_fallback-i.rinu[U:RDoc::AnyMethod[iI"get_session_with_fallback:ETI"2Rack::Session::Pool#get_session_with_fallback;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/session/pool.rb;T:0@omit_headings_from_table_of_contents_below000[I" (sid);T@ FI" Pool;TcRDoc::NormalClass00PK!Ȑ:share/gems/doc/rack-2.2.4/ri/Rack/Session/cdesc-Session.rinu[U:RDoc::NormalModule[iI" Session:ETI"Rack::Session;T0o:RDoc::Markup::Document: @parts[ o;;[: @fileI"lib/rack.rb;T:0@omit_headings_from_table_of_contents_below0o;;[; I"$lib/rack/session/abstract/id.rb;T; 0o;;[; I"lib/rack/session/cookie.rb;T; 0o;;[; I"!lib/rack/session/memcache.rb;T; 0o;;[; I"lib/rack/session/pool.rb;T; 0; 0; 0[[U:RDoc::Constant[iI" Memcache;TI"Rack::Session::Memcache;T: public0o;;[; @; 0@@cRDoc::NormalModule0[[[I" class;T[[; [[:protected[[: private[[I" instance;T[[; [[; [[;[[[U:RDoc::Context::Section[i0o;;[; 0; 0[ @ @@@@I" Rack;T@"PK!)kAshare/gems/doc/rack-2.2.4/ri/Rack/Session/SessionId/hash_sid-i.rinu[U:RDoc::AnyMethod[iI" hash_sid:ETI"&Rack::Session::SessionId#hash_sid;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"$lib/rack/session/abstract/id.rb;T:0@omit_headings_from_table_of_contents_below000[I" (sid);T@ FI"SessionId;TcRDoc::NormalClass00PK!8YEshare/gems/doc/rack-2.2.4/ri/Rack/Session/SessionId/cookie_value-i.rinu[U:RDoc::Attr[iI"cookie_value:ETI"*Rack::Session::SessionId#cookie_value;TI"R;T: publico:RDoc::Markup::Document: @parts[: @fileI"$lib/rack/session/abstract/id.rb;T:0@omit_headings_from_table_of_contents_below0F@ I"Rack::Session::SessionId;TcRDoc::NormalClass0PK!K %  Ashare/gems/doc/rack-2.2.4/ri/Rack/Session/SessionId/empty%3f-i.rinu[U:RDoc::AnyMethod[iI" empty?:ETI"$Rack::Session::SessionId#empty?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"$lib/rack/session/abstract/id.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI"SessionId;TcRDoc::NormalClass00PK!A  <share/gems/doc/rack-2.2.4/ri/Rack/Session/SessionId/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI""Rack::Session::SessionId::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI"$lib/rack/session/abstract/id.rb;T:0@omit_headings_from_table_of_contents_below000[I"(public_id);T@ FI"SessionId;TcRDoc::NormalClass00PK!Cshare/gems/doc/rack-2.2.4/ri/Rack/Session/SessionId/private_id-i.rinu[U:RDoc::AnyMethod[iI"private_id:ETI"(Rack::Session::SessionId#private_id;TF: publico:RDoc::Markup::Document: @parts[: @fileI"$lib/rack/session/abstract/id.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI"SessionId;TcRDoc::NormalClass00PK!?Bshare/gems/doc/rack-2.2.4/ri/Rack/Session/SessionId/public_id-i.rinu[U:RDoc::Attr[iI"public_id:ETI"'Rack::Session::SessionId#public_id;TI"R;T: publico:RDoc::Markup::Document: @parts[: @fileI"$lib/rack/session/abstract/id.rb;T:0@omit_headings_from_table_of_contents_below0F@ I"Rack::Session::SessionId;TcRDoc::NormalClass0PK!..=share/gems/doc/rack-2.2.4/ri/Rack/Session/SessionId/to_s-i.rinu[U:RDoc::Attr[iI" to_s:ETI""Rack::Session::SessionId#to_s;TI"R;T: publico:RDoc::Markup::Document: @parts[: @fileI"$lib/rack/session/abstract/id.rb;T:0@omit_headings_from_table_of_contents_below0F@ I"Rack::Session::SessionId;TcRDoc::NormalClass0PK!(i  @share/gems/doc/rack-2.2.4/ri/Rack/Session/SessionId/inspect-i.rinu[U:RDoc::AnyMethod[iI" inspect:ETI"%Rack::Session::SessionId#inspect;TF: publico:RDoc::Markup::Document: @parts[: @fileI"$lib/rack/session/abstract/id.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI"SessionId;TcRDoc::NormalClass00PK!wFFshare/gems/doc/rack-2.2.4/ri/Rack/Session/SessionId/cdesc-SessionId.rinu[U:RDoc::NormalClass[iI"SessionId:ETI"Rack::Session::SessionId;TI" Object;To:RDoc::Markup::Document: @parts[o;;[: @fileI"$lib/rack/session/abstract/id.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[ I"cookie_value;TI"R;T: publicFI"$lib/rack/session/abstract/id.rb;T[ I"public_id;T@; F@[ I" to_s;T@; F@[U:RDoc::Constant[iI"ID_VERSION;TI")Rack::Session::SessionId::ID_VERSION;T; 0o;;[; @; 0@@cRDoc::NormalClass0[[[I" class;T[[; [[I"new;T@[:protected[[: private[[I" instance;T[[; [[I" empty?;T@[I" inspect;T@[I"private_id;T@[; [[;[[I" hash_sid;T@[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I"Rack::Session;TcRDoc::NormalModulePK!l$$Nshare/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/cookie_value-i.rinu[U:RDoc::AnyMethod[iI"cookie_value:ETI"4Rack::Session::Abstract::Persisted#cookie_value;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"$lib/rack/session/abstract/id.rb;T:0@omit_headings_from_table_of_contents_below000[I" (data);T@ FI"Persisted;TcRDoc::NormalClass00PK!B!y++Rshare/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/force_options%3f-i.rinu[U:RDoc::AnyMethod[iI"force_options?:ETI"6Rack::Session::Abstract::Persisted#force_options?;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"$lib/rack/session/abstract/id.rb;T:0@omit_headings_from_table_of_contents_below000[I"(options);T@ FI"Persisted;TcRDoc::NormalClass00PK!zA((Lshare/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/sid_secure-i.rinu[U:RDoc::Attr[iI"sid_secure:ETI"2Rack::Session::Abstract::Persisted#sid_secure;TI"R;T: publico:RDoc::Markup::Document: @parts[: @fileI"$lib/rack/session/abstract/id.rb;T:0@omit_headings_from_table_of_contents_below0F@ I"'Rack::Session::Abstract::Persisted;TcRDoc::NormalClass0PK!wɘDDZshare/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/forced_session_update%3f-i.rinu[U:RDoc::AnyMethod[iI"forced_session_update?:ETI">Rack::Session::Abstract::Persisted#forced_session_update?;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"$lib/rack/session/abstract/id.rb;T:0@omit_headings_from_table_of_contents_below000[I"(session, options);T@ FI"Persisted;TcRDoc::NormalClass00PK!yJ"MMPshare/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/commit_session-i.rinu[U:RDoc::AnyMethod[iI"commit_session:ETI"6Rack::Session::Abstract::Persisted#commit_session;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [ I"GAcquires the session from the environment and the session id from ;TI"Jthe session options and passes them to #write_session. If successful ;TI"Fand the :defer option is not true, a cookie will be added to the ;TI"$response with the session's id.;T: @fileI"$lib/rack/session/abstract/id.rb;T:0@omit_headings_from_table_of_contents_below000[I"(req, res);T@FI"Persisted;TcRDoc::NormalClass00PK! ::Ushare/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/security_matches%3f-i.rinu[U:RDoc::AnyMethod[iI"security_matches?:ETI"9Rack::Session::Abstract::Persisted#security_matches?;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"$lib/rack/session/abstract/id.rb;T:0@omit_headings_from_table_of_contents_below000[I"(request, options);T@ FI"Persisted;TcRDoc::NormalClass00PK!2TZSshare/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/commit_session%3f-i.rinu[U:RDoc::AnyMethod[iI"commit_session?:ETI"7Rack::Session::Abstract::Persisted#commit_session?;TF: privateo:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"^Session should be committed if it was loaded, any of specific options like :renew, :drop ;TI"[or :expire_after was given and the security permissions match. Skips if skip is given.;T: @fileI"$lib/rack/session/abstract/id.rb;T:0@omit_headings_from_table_of_contents_below000[I"(req, session, options);T@FI"Persisted;TcRDoc::NormalClass00PK!:ϧEshare/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI",Rack::Session::Abstract::Persisted::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI"$lib/rack/session/abstract/id.rb;T:0@omit_headings_from_table_of_contents_below000[I"(app, options = {});T@ FI"Persisted;TcRDoc::NormalClass00PK!0Tshare/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/current_session_id-i.rinu[U:RDoc::AnyMethod[iI"current_session_id:ETI":Rack::Session::Abstract::Persisted#current_session_id;TF: privateo:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"9Returns the current session id from the SessionHash.;T: @fileI"$lib/rack/session/abstract/id.rb;T:0@omit_headings_from_table_of_contents_below000[I" (req);T@FI"Persisted;TcRDoc::NormalClass00PK!Qc$$Ishare/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/context-i.rinu[U:RDoc::AnyMethod[iI" context:ETI"/Rack::Session::Abstract::Persisted#context;TF: publico:RDoc::Markup::Document: @parts[: @fileI"$lib/rack/session/abstract/id.rb;T:0@omit_headings_from_table_of_contents_below000[I"(env, app = @app);T@ FI"Persisted;TcRDoc::NormalClass00PK!3!!Oshare/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/write_session-i.rinu[U:RDoc::AnyMethod[iI"write_session:ETI"5Rack::Session::Abstract::Persisted#write_session;TF: privateo:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"IAll thread safety and session storage procedures should occur here. ;TI"JMust return the session id if the session was saved successfully, or ;TI"-false if the session could not be saved.;T: @fileI"$lib/rack/session/abstract/id.rb;T:0@omit_headings_from_table_of_contents_below000[I"!(req, sid, session, options);T@FI"Persisted;TcRDoc::NormalClass00PK!f%%Nshare/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/find_session-i.rinu[U:RDoc::AnyMethod[iI"find_session:ETI"4Rack::Session::Abstract::Persisted#find_session;TF: privateo:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [ I"KAll thread safety and session retrieval procedures should occur here. ;TI"*Should return [session_id, session]. ;TI"HIf nil is provided as the session id, generation of a new valid id ;TI"should occur within.;T: @fileI"$lib/rack/session/abstract/id.rb;T:0@omit_headings_from_table_of_contents_below000[I"(env, sid);T@FI"Persisted;TcRDoc::NormalClass00PK!Oshare/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/session_class-i.rinu[U:RDoc::AnyMethod[iI"session_class:ETI"5Rack::Session::Abstract::Persisted#session_class;TF: privateo:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"FAllow subclasses to prepare_session for different Session classes;T: @fileI"$lib/rack/session/abstract/id.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@FI"Persisted;TcRDoc::NormalClass00PK!~GLshare/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/set_cookie-i.rinu[U:RDoc::AnyMethod[iI"set_cookie:ETI"2Rack::Session::Abstract::Persisted#set_cookie;TF: privateo:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"LSets the cookie back to the client with session id. We skip the cookie ;TI"Osetting if the value didn't change (sid is the same) or expires was given.;T: @fileI"$lib/rack/session/abstract/id.rb;T:0@omit_headings_from_table_of_contents_below000[I"(request, res, cookie);T@FI"Persisted;TcRDoc::NormalClass00PK!O`##Nshare/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/make_request-i.rinu[U:RDoc::AnyMethod[iI"make_request:ETI"4Rack::Session::Abstract::Persisted#make_request;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"$lib/rack/session/abstract/id.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@ FI"Persisted;TcRDoc::NormalClass00PK! JcTshare/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/extract_session_id-i.rinu[U:RDoc::AnyMethod[iI"extract_session_id:ETI":Rack::Session::Abstract::Persisted#extract_session_id;TF: privateo:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I",Extract session id from request object.;T: @fileI"$lib/rack/session/abstract/id.rb;T:0@omit_headings_from_table_of_contents_below000[I"(request);T@FI"Persisted;TcRDoc::NormalClass00PK!--Sshare/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/loaded_session%3f-i.rinu[U:RDoc::AnyMethod[iI"loaded_session?:ETI"7Rack::Session::Abstract::Persisted#loaded_session?;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"$lib/rack/session/abstract/id.rb;T:0@omit_headings_from_table_of_contents_below000[I"(session);T@ FI"Persisted;TcRDoc::NormalClass00PK!Nshare/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/generate_sid-i.rinu[U:RDoc::AnyMethod[iI"generate_sid:ETI"4Rack::Session::Abstract::Persisted#generate_sid;TF: privateo:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"BGenerate a new session id using Ruby #rand. The size of the ;TI"6session id is controlled by the :sidbits option. ;TI"GMonkey patch this to use custom methods for session id generation.;T: @fileI"$lib/rack/session/abstract/id.rb;T:0@omit_headings_from_table_of_contents_below000[I"(secure = @sid_secure);T@FI"Persisted;TcRDoc::NormalClass00PK!e22Qshare/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/default_options-i.rinu[U:RDoc::Attr[iI"default_options:ETI"7Rack::Session::Abstract::Persisted#default_options;TI"R;T: publico:RDoc::Markup::Document: @parts[: @fileI"$lib/rack/session/abstract/id.rb;T:0@omit_headings_from_table_of_contents_below0F@ I"'Rack::Session::Abstract::Persisted;TcRDoc::NormalClass0PK!hY Oshare/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/cdesc-Persisted.rinu[U:RDoc::NormalClass[iI"Persisted:ETI"'Rack::Session::Abstract::Persisted;TI" Object;To:RDoc::Markup::Document: @parts[o;;[o:RDoc::Markup::Paragraph;[ I"JID sets up a basic framework for implementing an id based sessioning ;TI"Lservice. Cookies sent to the client for maintaining sessions will only ;TI"Econtain an id reference. Only #find_session, #write_session and ;TI"4#delete_session are required to be overwritten.;To:RDoc::Markup::BlankLineo; ;[I"!All parameters are optional.;To:RDoc::Markup::List: @type: BULLET: @items[ o:RDoc::Markup::ListItem: @label0;[o; ;[I">:key determines the name of the cookie, by default it is ;TI"'rack.session';To;;0;[o; ;[I"K:path, :domain, :expire_after, :secure, and :httponly set the related ;TI"3cookie options as by Rack::Response#set_cookie;To;;0;[o; ;[I"O:skip will not a set a cookie in the response nor update the session state;To;;0;[o; ;[I"O:defer will not set a cookie in the response but still update the session ;TI"'state if it is used with a backend;To;;0;[o; ;[I"K:renew (implementation dependent) will prompt the generation of a new ;TI"Jsession id, and migration of data to be referenced at the new id. If ;TI"E:defer is set, it will be overridden and the cookie will be set.;To;;0;[o; ;[I"I:sidbits sets the number of bits in length that a generated session ;TI"id will be.;T@o; ;[ I"IThese options can be set on a per request basis, at the location of ;TI"Fenv['rack.session.options']. Additionally the id of the ;TI"Hsession can be found within the options hash at the key :id. It is ;TI"0highly not recommended to change its value.;T@o; ;[I"(Is Rack::Utils::Context compatible.;T@o; ;[I"JNot included by default; you must require 'rack/session/abstract/id' ;TI" to use.;T: @fileI"$lib/rack/session/abstract/id.rb;T:0@omit_headings_from_table_of_contents_below0;0;0[[ I"default_options;TI"R;T: publicFI"$lib/rack/session/abstract/id.rb;T[ I"key;T@O;F@P[ I"sid_secure;T@O;F@P[U:RDoc::Constant[iI"DEFAULT_OPTIONS;TI"8Rack::Session::Abstract::Persisted::DEFAULT_OPTIONS;T;0o;;[;@K;0@K@cRDoc::NormalClass0[[[I" class;T[[;[[I"new;T@P[:protected[[: private[[I" instance;T[[;[[I" call;T@P[I"commit_session;T@P[I" context;T@P[;[[;[[I"commit_session?;T@P[I"cookie_value;T@P[I"current_session_id;T@P[I"delete_session;T@P[I"extract_session_id;T@P[I"find_session;T@P[I"force_options?;T@P[I"forced_session_update?;T@P[I"generate_sid;T@P[I"initialize_sid;T@P[I"load_session;T@P[I"loaded_session?;T@P[I"make_request;T@P[I"prepare_session;T@P[I"security_matches?;T@P[I"session_class;T@P[I"session_exists?;T@P[I"set_cookie;T@P[I"write_session;T@P[[U:RDoc::Context::Section[i0o;;[;0;0[@KI"Rack::Session::Abstract;TcRDoc::NormalModulePK!ONshare/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/load_session-i.rinu[U:RDoc::AnyMethod[iI"load_session:ETI"4Rack::Session::Abstract::Persisted#load_session;TF: privateo:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"IExtracts the session id from provided cookies and passes it and the ;TI""environment to #find_session.;T: @fileI"$lib/rack/session/abstract/id.rb;T:0@omit_headings_from_table_of_contents_below000[I" (req);T@FI"Persisted;TcRDoc::NormalClass00PK!;f$$Pshare/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/initialize_sid-i.rinu[U:RDoc::AnyMethod[iI"initialize_sid:ETI"6Rack::Session::Abstract::Persisted#initialize_sid;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"$lib/rack/session/abstract/id.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI"Persisted;TcRDoc::NormalClass00PK!AQshare/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/prepare_session-i.rinu[U:RDoc::AnyMethod[iI"prepare_session:ETI"7Rack::Session::Abstract::Persisted#prepare_session;TF: privateo:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"LSets the lazy session at 'rack.session' and places options and session ;TI"*metadata into 'rack.session.options'.;T: @fileI"$lib/rack/session/abstract/id.rb;T:0@omit_headings_from_table_of_contents_below000[I" (req);T@FI"Persisted;TcRDoc::NormalClass00PK!7jrrSshare/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/session_exists%3f-i.rinu[U:RDoc::AnyMethod[iI"session_exists?:ETI"7Rack::Session::Abstract::Persisted#session_exists?;TF: privateo:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"(Check if the session exists or not.;T: @fileI"$lib/rack/session/abstract/id.rb;T:0@omit_headings_from_table_of_contents_below000[I" (req);T@FI"Persisted;TcRDoc::NormalClass00PK!j>Fshare/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/call-i.rinu[U:RDoc::AnyMethod[iI" call:ETI",Rack::Session::Abstract::Persisted#call;TF: publico:RDoc::Markup::Document: @parts[: @fileI"$lib/rack/session/abstract/id.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@ FI"Persisted;TcRDoc::NormalClass00PK!!Pshare/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/delete_session-i.rinu[U:RDoc::AnyMethod[iI"delete_session:ETI"6Rack::Session::Abstract::Persisted#delete_session;TF: privateo:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"IAll thread safety and session destroy procedures should occur here. ;TI"<Dshare/gems/doc/rack-2.2.4/ri/Rack/NullLogger/datetime_format%3d-i.rinu[U:RDoc::AnyMethod[iI"datetime_format=:ETI"&Rack::NullLogger#datetime_format=;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/null_logger.rb;T:0@omit_headings_from_table_of_contents_below000[I"(datetime_format);T@ FI"NullLogger;TcRDoc::NormalClass00PK!  >share/gems/doc/rack-2.2.4/ri/Rack/NullLogger/formatter%3d-i.rinu[U:RDoc::AnyMethod[iI"formatter=:ETI" Rack::NullLogger#formatter=;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/null_logger.rb;T:0@omit_headings_from_table_of_contents_below000[I"(formatter);T@ FI"NullLogger;TcRDoc::NormalClass00PK!5!C:share/gems/doc/rack-2.2.4/ri/Rack/NullLogger/error%3f-i.rinu[U:RDoc::AnyMethod[iI" error?:ETI"Rack::NullLogger#error?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/null_logger.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI"NullLogger;TcRDoc::NormalClass00PK!d8share/gems/doc/rack-2.2.4/ri/Rack/NullLogger/%3c%3c-i.rinu[U:RDoc::AnyMethod[iI"<<:ETI"Rack::NullLogger#<<;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/null_logger.rb;T:0@omit_headings_from_table_of_contents_below000[I" (msg);T@ FI"NullLogger;TcRDoc::NormalClass00PK!nvm;share/gems/doc/rack-2.2.4/ri/Rack/NullLogger/formatter-i.rinu[U:RDoc::AnyMethod[iI"formatter:ETI"Rack::NullLogger#formatter;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/null_logger.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI"NullLogger;TcRDoc::NormalClass00PK!BO7share/gems/doc/rack-2.2.4/ri/Rack/NullLogger/level-i.rinu[U:RDoc::AnyMethod[iI" level:ETI"Rack::NullLogger#level;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/null_logger.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI"NullLogger;TcRDoc::NormalClass00PK!  Ashare/gems/doc/rack-2.2.4/ri/Rack/NullLogger/datetime_format-i.rinu[U:RDoc::AnyMethod[iI"datetime_format:ETI"%Rack::NullLogger#datetime_format;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/null_logger.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI"NullLogger;TcRDoc::NormalClass00PK!j9share/gems/doc/rack-2.2.4/ri/Rack/NullLogger/warn%3f-i.rinu[U:RDoc::AnyMethod[iI" warn?:ETI"Rack::NullLogger#warn?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/null_logger.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI"NullLogger;TcRDoc::NormalClass00PK!,8?share/gems/doc/rack-2.2.4/ri/Rack/NullLogger/sev_threshold-i.rinu[U:RDoc::AnyMethod[iI"sev_threshold:ETI"#Rack::NullLogger#sev_threshold;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/null_logger.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI"NullLogger;TcRDoc::NormalClass00PK!67share/gems/doc/rack-2.2.4/ri/Rack/NullLogger/close-i.rinu[U:RDoc::AnyMethod[iI" close:ETI"Rack::NullLogger#close;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/null_logger.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI"NullLogger;TcRDoc::NormalClass00PK!).6share/gems/doc/rack-2.2.4/ri/Rack/NullLogger/call-i.rinu[U:RDoc::AnyMethod[iI" call:ETI"Rack::NullLogger#call;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/null_logger.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@ FI"NullLogger;TcRDoc::NormalClass00PK!p9share/gems/doc/rack-2.2.4/ri/Rack/NullLogger/unknown-i.rinu[U:RDoc::AnyMethod[iI" unknown:ETI"Rack::NullLogger#unknown;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/null_logger.rb;T:0@omit_headings_from_table_of_contents_below000[I"(progname = nil, &block);T@ FI"NullLogger;TcRDoc::NormalClass00PK!bKg7share/gems/doc/rack-2.2.4/ri/Rack/NullLogger/fatal-i.rinu[U:RDoc::AnyMethod[iI" fatal:ETI"Rack::NullLogger#fatal;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/null_logger.rb;T:0@omit_headings_from_table_of_contents_below000[I"(progname = nil, &block);T@ FI"NullLogger;TcRDoc::NormalClass00PK!o:share/gems/doc/rack-2.2.4/ri/Rack/NullLogger/debug%3f-i.rinu[U:RDoc::AnyMethod[iI" debug?:ETI"Rack::NullLogger#debug?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/null_logger.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI"NullLogger;TcRDoc::NormalClass00PK!nn2":share/gems/doc/rack-2.2.4/ri/Rack/Lobster/cdesc-Lobster.rinu[U:RDoc::NormalClass[iI" Lobster:ETI"Rack::Lobster;TI" Object;To:RDoc::Markup::Document: @parts[o;;[o:RDoc::Markup::Paragraph;[I"*Paste has a Pony, Rack has a Lobster!;T: @fileI"lib/rack/lobster.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[U:RDoc::Constant[iI"LobsterString;TI"!Rack::Lobster::LobsterString;T: public0o;;[; @; 0@@cRDoc::NormalClass0U; [iI"LambdaLobster;TI"!Rack::Lobster::LambdaLobster;T; 0o;;[; @; 0@@@0[[[I" class;T[[; [[:protected[[: private[[I" instance;T[[; [[I" call;TI"lib/rack/lobster.rb;T[;[[;[[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I" Rack;TcRDoc::NormalModulePK!}3share/gems/doc/rack-2.2.4/ri/Rack/Lobster/call-i.rinu[U:RDoc::AnyMethod[iI" call:ETI"Rack::Lobster#call;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/lobster.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@ FI" Lobster;TcRDoc::NormalClass00PK!9\Eshare/gems/doc/rack-2.2.4/ri/Rack/MethodOverride/allowed_methods-i.rinu[U:RDoc::AnyMethod[iI"allowed_methods:ETI")Rack::MethodOverride#allowed_methods;TF: privateo:RDoc::Markup::Document: @parts[: @fileI" lib/rack/method_override.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI"MethodOverride;TcRDoc::NormalClass00PK!RHshare/gems/doc/rack-2.2.4/ri/Rack/MethodOverride/cdesc-MethodOverride.rinu[U:RDoc::NormalClass[iI"MethodOverride:ETI"Rack::MethodOverride;TI" Object;To:RDoc::Markup::Document: @parts[o;;[: @fileI" lib/rack/method_override.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[ U:RDoc::Constant[iI"HTTP_METHODS;TI"'Rack::MethodOverride::HTTP_METHODS;T: public0o;;[; @; 0@@cRDoc::NormalClass0U; [iI"METHOD_OVERRIDE_PARAM_KEY;TI"4Rack::MethodOverride::METHOD_OVERRIDE_PARAM_KEY;T; 0o;;[; @; 0@@@0U; [iI" HTTP_METHOD_OVERRIDE_HEADER;TI"6Rack::MethodOverride::HTTP_METHOD_OVERRIDE_HEADER;T; 0o;;[; @; 0@@@0U; [iI"ALLOWED_METHODS;TI"*Rack::MethodOverride::ALLOWED_METHODS;T; 0o;;[; @; 0@@@0[[[I" class;T[[; [[I"new;TI" lib/rack/method_override.rb;T[:protected[[: private[[I" instance;T[[; [[I" call;T@3[I"method_override;T@3[; [[;[[I"allowed_methods;T@3[I"method_override_param;T@3[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I" Rack;TcRDoc::NormalModulePK!:<((Kshare/gems/doc/rack-2.2.4/ri/Rack/MethodOverride/method_override_param-i.rinu[U:RDoc::AnyMethod[iI"method_override_param:ETI"/Rack::MethodOverride#method_override_param;TF: privateo:RDoc::Markup::Document: @parts[: @fileI" lib/rack/method_override.rb;T:0@omit_headings_from_table_of_contents_below000[I" (req);T@ FI"MethodOverride;TcRDoc::NormalClass00PK!l9share/gems/doc/rack-2.2.4/ri/Rack/MethodOverride/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"Rack::MethodOverride::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI" lib/rack/method_override.rb;T:0@omit_headings_from_table_of_contents_below000[I" (app);T@ FI"MethodOverride;TcRDoc::NormalClass00PK!NsEshare/gems/doc/rack-2.2.4/ri/Rack/MethodOverride/method_override-i.rinu[U:RDoc::AnyMethod[iI"method_override:ETI")Rack::MethodOverride#method_override;TF: publico:RDoc::Markup::Document: @parts[: @fileI" lib/rack/method_override.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@ FI"MethodOverride;TcRDoc::NormalClass00PK! !fL:share/gems/doc/rack-2.2.4/ri/Rack/MethodOverride/call-i.rinu[U:RDoc::AnyMethod[iI" call:ETI"Rack::MethodOverride#call;TF: publico:RDoc::Markup::Document: @parts[: @fileI" lib/rack/method_override.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@ FI"MethodOverride;TcRDoc::NormalClass00PK!Aа((>share/gems/doc/rack-2.2.4/ri/Rack/Server/handle_profiling-i.rinu[U:RDoc::AnyMethod[iI"handle_profiling:ETI""Rack::Server#handle_profiling;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/server.rb;T:0@omit_headings_from_table_of_contents_below00I";T[I"'(heapfile, profile_mode, filename);T@ FI" Server;TcRDoc::NormalClass00PK! 04share/gems/doc/rack-2.2.4/ri/Rack/Server/server-i.rinu[U:RDoc::AnyMethod[iI" server:ETI"Rack::Server#server;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/server.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Server;TcRDoc::NormalClass00PK!m7share/gems/doc/rack-2.2.4/ri/Rack/Server/write_pid-i.rinu[U:RDoc::AnyMethod[iI"write_pid:ETI"Rack::Server#write_pid;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/server.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Server;TcRDoc::NormalClass00PK!eГ3share/gems/doc/rack-2.2.4/ri/Rack/Server/start-c.rinu[U:RDoc::AnyMethod[iI" start:ETI"Rack::Server::start;TT: publico:RDoc::Markup::Document: @parts[ o:RDoc::Markup::Paragraph; [I"MStart a new rack server (like running rackup). This will parse ARGV and ;TI"Jprovide standard ARGV rackup options, defaulting to load 'config.ru'.;To:RDoc::Markup::BlankLineo; ; [I"NProviding an options hash will prevent ARGV parsing and will not include ;TI"any default options.;T@o; ; [I"JThis method can be used to very easily launch a CGI application, for ;TI" example:;T@o:RDoc::Markup::Verbatim; [ I"Rack::Server.start( ;TI" :app => lambda do |e| ;TI"A [200, {'Content-Type' => 'text/html'}, ['hello world']] ;TI" end, ;TI" :server => 'cgi' ;TI") ;T: @format0o; ; [I"MFurther options available here are documented on Rack::Server#initialize;T: @fileI"lib/rack/server.rb;T:0@omit_headings_from_table_of_contents_below000[I"(options = nil);T@#FI" Server;TcRDoc::NormalClass00PK!@x9share/gems/doc/rack-2.2.4/ri/Rack/Server/wrapped_app-i.rinu[U:RDoc::AnyMethod[iI"wrapped_app:ETI"Rack::Server#wrapped_app;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/server.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Server;TcRDoc::NormalClass00PK!+2P;share/gems/doc/rack-2.2.4/ri/Rack/Server/parse_options-i.rinu[U:RDoc::AnyMethod[iI"parse_options:ETI"Rack::Server#parse_options;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/server.rb;T:0@omit_headings_from_table_of_contents_below000[I" (args);T@ FI" Server;TcRDoc::NormalClass00PK!q 1share/gems/doc/rack-2.2.4/ri/Rack/Server/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"Rack::Server::new;TT: publico:RDoc::Markup::Document: @parts[ o:RDoc::Markup::Paragraph; [I"Options may include:;To:RDoc::Markup::List: @type: BULLET: @items[o:RDoc::Markup::ListItem: @label0; [o; ; [I" :app;To:RDoc::Markup::Verbatim; [I"@a rack application to run (overrides :config and :builder) ;T: @format0o;;0; [o; ; [I" :builder;To;; [I"/a string to evaluate a Rack::Builder from ;T;0o;;0; [o; ; [I" :config;To;; [I"4a rackup configuration file path to load (.ru) ;T;0o;;0; [o; ; [I":environment;To;; [ I"=this selects the middleware that will be wrapped around ;TI"6your application. Default options available are: ;TI"= - development: CommonLogger, ShowExceptions, and Lint ;TI"" - deployment: CommonLogger ;TI"# - none: no extra middleware ;TI"Jnote: when the server is a cgi server, CommonLogger is not included. ;T;0o;;0; [o; ; [I" :server;To;; [I">choose a specific Rack::Handler, e.g. cgi, fcgi, webrick ;T;0o;;0; [o; ; [I":daemonize;To;; [I"Cif true, the server will daemonize itself (fork, detach, etc) ;T;0o;;0; [o; ; [I" :pid;To;; [I".path to write a pid file after daemonize ;T;0o;;0; [o; ; [I" :Host;To;; [I"Dthe host address to bind to (used by supporting Rack::Handler) ;T;0o;;0; [o; ; [I" :Port;To;; [I"webrick access log options (or supporting Rack::Handler) ;T;0o;;0; [o; ; [I" :debug;To;; [I"*turn on debug output ($DEBUG = true) ;T;0o;;0; [o; ; [I" :warn;To;; [I"#turn on warnings ($-w = true) ;T;0o;;0; [o; ; [I" :include;To;; [I"#add given paths to $LOAD_PATH ;T;0o;;0; [o; ; [I" :require;To;; [I"!require the given libraries ;T;0o; ; [I"AAdditional options for profiling app initialization include:;To; ; ; ;[o;;0; [o; ; [I":heapfile;To;; [I">location for ObjectSpace.dump_all to write the output to ;T;0o;;0; [o; ; [I":profile_file;To;; [I"Qlocation for CPU/Memory (StackProf) profile output (defaults to a tempfile) ;T;0o;;0; [o; ; [I":profile_mode;To;; [I"-StackProf profile mode (cpu|wall|object);T;0: @fileI"lib/rack/server.rb;T:0@omit_headings_from_table_of_contents_below000[I"(options = nil);T@FI" Server;TcRDoc::NormalClass00PK!X;share/gems/doc/rack-2.2.4/ri/Rack/Server/daemonize_app-i.rinu[U:RDoc::AnyMethod[iI"daemonize_app:ETI"Rack::Server#daemonize_app;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/server.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Server;TcRDoc::NormalClass00PK!>Ѐ@share/gems/doc/rack-2.2.4/ri/Rack/Server/logging_middleware-c.rinu[U:RDoc::AnyMethod[iI"logging_middleware:ETI"%Rack::Server::logging_middleware;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/server.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Server;TcRDoc::NormalClass00PK!"  Bshare/gems/doc/rack-2.2.4/ri/Rack/Server/Options/handler_opts-i.rinu[U:RDoc::AnyMethod[iI"handler_opts:ETI"'Rack::Server::Options#handler_opts;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/server.rb;T:0@omit_headings_from_table_of_contents_below000[I"(options);T@ FI" Options;TcRDoc::NormalClass00PK!ȌAshare/gems/doc/rack-2.2.4/ri/Rack/Server/Options/cdesc-Options.rinu[U:RDoc::NormalClass[iI" Options:ETI"Rack::Server::Options;TI" Object;To:RDoc::Markup::Document: @parts[o;;[: @fileI"lib/rack/server.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[[:protected[[: private[[I" instance;T[[; [[I"handler_opts;TI"lib/rack/server.rb;T[I" parse!;T@#[; [[; [[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I"Rack::Server;TcRDoc::NormalClassPK!ٛ>share/gems/doc/rack-2.2.4/ri/Rack/Server/Options/parse%21-i.rinu[U:RDoc::AnyMethod[iI" parse!:ETI"!Rack::Server::Options#parse!;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/server.rb;T:0@omit_headings_from_table_of_contents_below000[I" (args);T@ FI" Options;TcRDoc::NormalClass00PK!$$Oshare/gems/doc/rack-2.2.4/ri/Rack/Server/build_app_and_options_from_config-i.rinu[U:RDoc::AnyMethod[iI"&build_app_and_options_from_config:ETI"3Rack::Server#build_app_and_options_from_config;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/server.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Server;TcRDoc::NormalClass00PK!1share/gems/doc/rack-2.2.4/ri/Rack/Server/app-i.rinu[U:RDoc::AnyMethod[iI"app:ETI"Rack::Server#app;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/server.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Server;TcRDoc::NormalClass00PK!ѽ?share/gems/doc/rack-2.2.4/ri/Rack/Server/make_profile_name-i.rinu[U:RDoc::AnyMethod[iI"make_profile_name:ETI"#Rack::Server#make_profile_name;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/server.rb;T:0@omit_headings_from_table_of_contents_below00I" filename;T[I"(filename);T@ FI" Server;TcRDoc::NormalClass00PK!t28share/gems/doc/rack-2.2.4/ri/Rack/Server/middleware-c.rinu[U:RDoc::AnyMethod[iI"middleware:ETI"Rack::Server::middleware;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/server.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Server;TcRDoc::NormalClass00PK!av7share/gems/doc/rack-2.2.4/ri/Rack/Server/build_app-i.rinu[U:RDoc::AnyMethod[iI"build_app:ETI"Rack::Server#build_app;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/server.rb;T:0@omit_headings_from_table_of_contents_below000[I" (app);T@ FI" Server;TcRDoc::NormalClass00PK!bJ5share/gems/doc/rack-2.2.4/ri/Rack/Server/options-i.rinu[U:RDoc::Attr[iI" options:ETI"Rack::Server#options;TI"W;T: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/server.rb;T:0@omit_headings_from_table_of_contents_below0F@ I"Rack::Server;TcRDoc::NormalClass0PK! {=share/gems/doc/rack-2.2.4/ri/Rack/Server/default_options-i.rinu[U:RDoc::AnyMethod[iI"default_options:ETI"!Rack::Server#default_options;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/server.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Server;TcRDoc::NormalClass00PK!~ʜ 8share/gems/doc/rack-2.2.4/ri/Rack/Server/middleware-i.rinu[U:RDoc::AnyMethod[iI"middleware:ETI"Rack::Server#middleware;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/server.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Server;TcRDoc::NormalClass00PK!FZ8share/gems/doc/rack-2.2.4/ri/Rack/Server/opt_parser-i.rinu[U:RDoc::AnyMethod[iI"opt_parser:ETI"Rack::Server#opt_parser;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/server.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Server;TcRDoc::NormalClass00PK!6:share/gems/doc/rack-2.2.4/ri/Rack/Server/check_pid%21-i.rinu[U:RDoc::AnyMethod[iI"check_pid!:ETI"Rack::Server#check_pid!;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/server.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Server;TcRDoc::NormalClass00PK!-Dshare/gems/doc/rack-2.2.4/ri/Rack/Server/pidfile_process_status-i.rinu[U:RDoc::AnyMethod[iI"pidfile_process_status:ETI"(Rack::Server#pidfile_process_status;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/server.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Server;TcRDoc::NormalClass00PK!ʯ^  Cshare/gems/doc/rack-2.2.4/ri/Rack/Server/build_app_from_string-i.rinu[U:RDoc::AnyMethod[iI"build_app_from_string:ETI"'Rack::Server#build_app_from_string;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/server.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Server;TcRDoc::NormalClass00PK!L3share/gems/doc/rack-2.2.4/ri/Rack/Server/start-i.rinu[U:RDoc::AnyMethod[iI" start:ETI"Rack::Server#start;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/server.rb;T:0@omit_headings_from_table_of_contents_below000[I" (&block);T@ FI" Server;TcRDoc::NormalClass00PK!K8share/gems/doc/rack-2.2.4/ri/Rack/Server/cdesc-Server.rinu[U:RDoc::NormalClass[iI" Server:ETI"Rack::Server;TI" Object;To:RDoc::Markup::Document: @parts[o;;[: @fileI"lib/rack/server.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[ I" options;TI"W;T: publicFI"lib/rack/server.rb;T[[[[I" class;T[[; [ [I"&default_middleware_by_environment;T@[I"logging_middleware;T@[I"middleware;T@[I"new;T@[I" start;T@[:protected[[: private[[I" instance;T[[; [ [I"app;T@[I"default_options;T@[I"middleware;T@[I" options;T@[I" server;T@[I" start;T@[; [[; [[I"build_app;T@[I"&build_app_and_options_from_config;T@[I"build_app_from_string;T@[I"check_pid!;T@[I"daemonize_app;T@[I"handle_profiling;T@[I"make_profile_name;T@[I"opt_parser;T@[I"parse_options;T@[I"pidfile_process_status;T@[I"wrapped_app;T@[I"write_pid;T@[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I" Rack;TcRDoc::NormalModulePK!B;$$Oshare/gems/doc/rack-2.2.4/ri/Rack/Server/default_middleware_by_environment-c.rinu[U:RDoc::AnyMethod[iI"&default_middleware_by_environment:ETI"4Rack::Server::default_middleware_by_environment;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/server.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Server;TcRDoc::NormalClass00PK!:share/gems/doc/rack-2.2.4/ri/Rack/Cascade/cdesc-Cascade.rinu[U:RDoc::NormalClass[iI" Cascade:ETI"Rack::Cascade;TI" Object;To:RDoc::Markup::Document: @parts[o;;[o:RDoc::Markup::Paragraph;[ I"DRack::Cascade tries a request on several apps, and returns the ;TI"Gfirst response that is not 404 or 405 (or in a list of configured ;TI"Lstatus codes). If all applications tried return one of the configured ;TI",status codes, return the last response.;T: @fileI"lib/rack/cascade.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[ I" apps;TI"R;T: publicFI"lib/rack/cascade.rb;T[U:RDoc::Constant[iI" NotFound;TI"Rack::Cascade::NotFound;T; 0o;;[o; ;[I"deprecated, no longer used;T; @; 0@@cRDoc::NormalClass0[[[I" class;T[[; [[I"new;T@[:protected[[: private[[I" instance;T[[; [ [I"<<;T@[I"add;T@[I" call;T@[I" include?;T@[;[[;[[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I" Rack;TcRDoc::NormalModulePK!ƦN2share/gems/doc/rack-2.2.4/ri/Rack/Cascade/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"Rack::Cascade::new;TT: publico:RDoc::Markup::Document: @parts[ o:RDoc::Markup::Paragraph; [I"CSet the apps to send requests to, and what statuses result in ;TI"cascading. Arguments:;To:RDoc::Markup::BlankLineo; ; [I"/apps: An enumerable of rack applications. ;TI"Ocascade_for: The statuses to use cascading for. If a response is received;To:RDoc::Markup::Verbatim; [I"(from an app, the next app is tried.;T: @format0: @fileI"lib/rack/cascade.rb;T:0@omit_headings_from_table_of_contents_below000[I"%(apps, cascade_for = [404, 405]);T@FI" Cascade;TcRDoc::NormalClass00PK!,553share/gems/doc/rack-2.2.4/ri/Rack/Cascade/apps-i.rinu[U:RDoc::Attr[iI" apps:ETI"Rack::Cascade#apps;TI"R;T: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I".An array of applications to try in order.;T: @fileI"lib/rack/cascade.rb;T:0@omit_headings_from_table_of_contents_below0F@I"Rack::Cascade;TcRDoc::NormalClass0PK!gD TT9share/gems/doc/rack-2.2.4/ri/Rack/Cascade/include%3f-i.rinu[U:RDoc::AnyMethod[iI" include?:ETI"Rack::Cascade#include?;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"share/gems/doc/rack-2.2.4/ri/Rack/Files/BaseIterator/path-i.rinu[U:RDoc::Attr[iI" path:ETI"#Rack::Files::BaseIterator#path;TI"R;T: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/files.rb;T:0@omit_headings_from_table_of_contents_below0F@ I"Rack::Files::BaseIterator;TcRDoc::NormalClass0PK!d>''Ishare/gems/doc/rack-2.2.4/ri/Rack/Files/BaseIterator/each_range_part-i.rinu[U:RDoc::AnyMethod[iI"each_range_part:ETI".Rack::Files::BaseIterator#each_range_part;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/files.rb;T:0@omit_headings_from_table_of_contents_below00I" part;T[I"(file, range);T@ FI"BaseIterator;TcRDoc::NormalClass00PK!΍Kshare/gems/doc/rack-2.2.4/ri/Rack/Files/BaseIterator/multipart_heading-i.rinu[U:RDoc::AnyMethod[iI"multipart_heading:ETI"0Rack::Files::BaseIterator#multipart_heading;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/files.rb;T:0@omit_headings_from_table_of_contents_below000[I" (range);T@ FI"BaseIterator;TcRDoc::NormalClass00PK!'Z=share/gems/doc/rack-2.2.4/ri/Rack/Files/BaseIterator/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"#Rack::Files::BaseIterator::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/files.rb;T:0@omit_headings_from_table_of_contents_below000[I"(path, ranges, options);T@ FI"BaseIterator;TcRDoc::NormalClass00PK!w~lJshare/gems/doc/rack-2.2.4/ri/Rack/Files/BaseIterator/cdesc-BaseIterator.rinu[U:RDoc::NormalClass[iI"BaseIterator:ETI"Rack::Files::BaseIterator;TI" Object;To:RDoc::Markup::Document: @parts[o;;[: @fileI"lib/rack/files.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[ I" options;TI"R;T: publicFI"lib/rack/files.rb;T[ I" path;T@; F@[ I" ranges;T@; F@[[[[I" class;T[[; [[I"new;T@[:protected[[: private[[I" instance;T[[; [[I" bytesize;T@[I" close;T@[I" each;T@[; [[; [[I"each_range_part;T@[I"multipart?;T@[I"multipart_heading;T@[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I"Rack::Files;TcRDoc::NormalClassPK!+>share/gems/doc/rack-2.2.4/ri/Rack/Files/BaseIterator/each-i.rinu[U:RDoc::AnyMethod[iI" each:ETI"#Rack::Files::BaseIterator#each;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/files.rb;T:0@omit_headings_from_table_of_contents_below00I"multipart_heading(range);T[I"();T@ FI"BaseIterator;TcRDoc::NormalClass00PK!θ+Ashare/gems/doc/rack-2.2.4/ri/Rack/Files/BaseIterator/options-i.rinu[U:RDoc::Attr[iI" options:ETI"&Rack::Files::BaseIterator#options;TI"R;T: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/files.rb;T:0@omit_headings_from_table_of_contents_below0F@ I"Rack::Files::BaseIterator;TcRDoc::NormalClass0PK!^ @share/gems/doc/rack-2.2.4/ri/Rack/Files/BaseIterator/ranges-i.rinu[U:RDoc::Attr[iI" ranges:ETI"%Rack::Files::BaseIterator#ranges;TI"R;T: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/files.rb;T:0@omit_headings_from_table_of_contents_below0F@ I"Rack::Files::BaseIterator;TcRDoc::NormalClass0PK!`+dFshare/gems/doc/rack-2.2.4/ri/Rack/Files/BaseIterator/multipart%3f-i.rinu[U:RDoc::AnyMethod[iI"multipart?:ETI")Rack::Files::BaseIterator#multipart?;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/files.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI"BaseIterator;TcRDoc::NormalClass00PK!uꅨ?share/gems/doc/rack-2.2.4/ri/Rack/Files/BaseIterator/close-i.rinu[U:RDoc::AnyMethod[iI" close:ETI"$Rack::Files::BaseIterator#close;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/files.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI"BaseIterator;TcRDoc::NormalClass00PK!IBshare/gems/doc/rack-2.2.4/ri/Rack/Files/BaseIterator/bytesize-i.rinu[U:RDoc::AnyMethod[iI" bytesize:ETI"'Rack::Files::BaseIterator#bytesize;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/files.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI"BaseIterator;TcRDoc::NormalClass00PK!Kcڄ5share/gems/doc/rack-2.2.4/ri/Rack/Files/filesize-i.rinu[U:RDoc::AnyMethod[iI" filesize:ETI"Rack::Files#filesize;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/files.rb;T:0@omit_headings_from_table_of_contents_below000[I" (path);T@ FI" Files;TcRDoc::NormalClass00PK!ihBshare/gems/doc/rack-2.2.4/ri/Rack/Files/Iterator/cdesc-Iterator.rinu[U:RDoc::NormalClass[iI" Iterator:ETI"Rack::Files::Iterator;TI"Rack::Files::BaseIterator;To:RDoc::Markup::Document: @parts[o;;[: @fileI"lib/rack/files.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[[:protected[[: private[[I" instance;T[[; [[; [[; [[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I"Rack::Files;TcRDoc::NormalClassPK!t1share/gems/doc/rack-2.2.4/ri/Rack/Files/call-i.rinu[U:RDoc::AnyMethod[iI" call:ETI"Rack::Files#call;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/files.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@ FI" Files;TcRDoc::NormalClass00PK!+S4share/gems/doc/rack-2.2.4/ri/Rack/Files/serving-i.rinu[U:RDoc::AnyMethod[iI" serving:ETI"Rack::Files#serving;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/files.rb;T:0@omit_headings_from_table_of_contents_below000[I"(request, path);T@ FI" Files;TcRDoc::NormalClass00PK!۽gg9share/gems/doc/rack-2.2.4/ri/Rack/MockRequest/delete-i.rinu[U:RDoc::AnyMethod[iI" delete:ETI"Rack::MockRequest#delete;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"CMake a DELETE request and return a MockResponse. See #request.;T: @fileI"lib/rack/mock.rb;T:0@omit_headings_from_table_of_contents_below000[I"(uri, opts = {});T@FI"MockRequest;TcRDoc::NormalClass00PK!+q;dd8share/gems/doc/rack-2.2.4/ri/Rack/MockRequest/patch-i.rinu[U:RDoc::AnyMethod[iI" patch:ETI"Rack::MockRequest#patch;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"BMake a PATCH request and return a MockResponse. See #request.;T: @fileI"lib/rack/mock.rb;T:0@omit_headings_from_table_of_contents_below000[I"(uri, opts = {});T@FI"MockRequest;TcRDoc::NormalClass00PK!Ӕ{{:share/gems/doc/rack-2.2.4/ri/Rack/MockRequest/env_for-c.rinu[U:RDoc::AnyMethod[iI" env_for:ETI"Rack::MockRequest::env_for;TT: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I">Return the Rack environment used for a request to +uri+. ;TI"IAll options that are strings are added to the returned environment. ;TI" Options:;To:RDoc::Markup::List: @type: NOTE: @items[ o:RDoc::Markup::ListItem: @label[I" :fatal ;T; [o; ; [I"DWhether to raise an exception if request outputs to rack.errors;To;;[I" :input ;T; [o; ; [I"The rack.input to set;To;;[I" :method ;T; [o; ; [I"#The HTTP request method to use;To;;[I" :params ;T; [o; ; [I"The params to use;To;;[I":script_name ;T; [o; ; [I"The SCRIPT_NAME to set;T: @fileI"lib/rack/mock.rb;T:0@omit_headings_from_table_of_contents_below000[I"(uri = "", opts = {});T@5FI"MockRequest;TcRDoc::NormalClass00PK!4I6share/gems/doc/rack-2.2.4/ri/Rack/MockRequest/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"Rack::MockRequest::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/mock.rb;T:0@omit_headings_from_table_of_contents_below000[I" (app);T@ FI"MockRequest;TcRDoc::NormalClass00PK!Bm:share/gems/doc/rack-2.2.4/ri/Rack/MockRequest/request-i.rinu[U:RDoc::AnyMethod[iI" request:ETI"Rack::MockRequest#request;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"AMake a request using the given request method for the given ;TI"You can pass a hash with additional configuration to the ;TI"get/post/put/patch/delete.;To:RDoc::Markup::List: @type: NOTE: @items[o:RDoc::Markup::ListItem: @label[I":input;T;[o; ;[I"2A String or IO-like to be used as rack.input.;To;;[I":fatal;T;[o; ;[I";Raise a FatalWarning if the app writes to rack.errors.;To;;[I":lint;T;[o; ;[I"3If true, wrap the application in a Rack::Lint.;T: @fileI"lib/rack/mock.rb;T:0@omit_headings_from_table_of_contents_below0;0;0[[U:RDoc::Constant[iI"DEFAULT_ENV;TI"#Rack::MockRequest::DEFAULT_ENV;T: public0o;;[;@3;0@3@cRDoc::NormalClass0[[[I" class;T[[;[[I" env_for;TI"lib/rack/mock.rb;T[I"new;T@F[I"parse_uri_rfc2396;T@F[:protected[[: private[[I" instance;T[[;[ [I" delete;T@F[I"get;T@F[I" head;T@F[I" options;T@F[I" patch;T@F[I" post;T@F[I"put;T@F[I" request;T@F[;[[;[[[U:RDoc::Context::Section[i0o;;[;0;0[@3I" Rack;TcRDoc::NormalModulePK!~{^aa7share/gems/doc/rack-2.2.4/ri/Rack/MockRequest/post-i.rinu[U:RDoc::AnyMethod[iI" post:ETI"Rack::MockRequest#post;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"AMake a POST request and return a MockResponse. See #request.;T: @fileI"lib/rack/mock.rb;T:0@omit_headings_from_table_of_contents_below000[I"(uri, opts = {});T@FI"MockRequest;TcRDoc::NormalClass00PK! 48share/gems/doc/rack-2.2.4/ri/Rack/Config/cdesc-Config.rinu[U:RDoc::NormalClass[iI" Config:ETI"Rack::Config;TI" Object;To:RDoc::Markup::Document: @parts[o;;[ o:RDoc::Markup::Paragraph;[I"HRack::Config modifies the environment using the block given during ;TI"initialization.;To:RDoc::Markup::BlankLineo; ;[I" Example:;To:RDoc::Markup::Verbatim;[I"use Rack::Config do |env| ;TI"$ env['my-key'] = 'some-value' ;TI"end;T: @format0: @fileI"lib/rack/config.rb;T:0@omit_headings_from_table_of_contents_below0; 0;0[[[[[I" class;T[[: public[[I"new;TI"lib/rack/config.rb;T[:protected[[: private[[I" instance;T[[;[[I" call;T@'[;[[;[[[U:RDoc::Context::Section[i0o;;[; 0;0[@I" Rack;TcRDoc::NormalModulePK!^1share/gems/doc/rack-2.2.4/ri/Rack/Config/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"Rack::Config::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/config.rb;T:0@omit_headings_from_table_of_contents_below000[I"(app, &block);T@ FI" Config;TcRDoc::NormalClass00PK!.2share/gems/doc/rack-2.2.4/ri/Rack/Config/call-i.rinu[U:RDoc::AnyMethod[iI" call:ETI"Rack::Config#call;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/config.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@ FI" Config;TcRDoc::NormalClass00PK![cBB.share/gems/doc/rack-2.2.4/ri/Rack/version-c.rinu[U:RDoc::AnyMethod[iI" version:ETI"Rack::version;TT: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"9Return the Rack protocol version as a dotted string.;T: @fileI"lib/rack/version.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@FI" Rack;TcRDoc::NormalModule00PK!LL@share/gems/doc/rack-2.2.4/ri/Rack/Directory/check_forbidden-i.rinu[U:RDoc::AnyMethod[iI"check_forbidden:ETI"$Rack::Directory#check_forbidden;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"fRack response to use for requests with paths outside the root, or nil if path is inside the root.;T: @fileI"lib/rack/directory.rb;T:0@omit_headings_from_table_of_contents_below000[I"(path_info);T@FI"Directory;TcRDoc::NormalClass00PK!Y8jwxxNshare/gems/doc/rack-2.2.4/ri/Rack/Directory/DirectoryBody/DIR_FILE_escape-i.rinu[U:RDoc::AnyMethod[iI"DIR_FILE_escape:ETI"3Rack::Directory::DirectoryBody#DIR_FILE_escape;TF: privateo:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"6Escape each element in the array of html strings.;T: @fileI"lib/rack/directory.rb;T:0@omit_headings_from_table_of_contents_below000[I" (htmls);T@FI"DirectoryBody;TcRDoc::NormalClass00PK!.55Cshare/gems/doc/rack-2.2.4/ri/Rack/Directory/DirectoryBody/each-i.rinu[U:RDoc::AnyMethod[iI" each:ETI"(Rack::Directory::DirectoryBody#each;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/directory.rb;T:0@omit_headings_from_table_of_contents_below00I"/DIR_PAGE_HEADER % [ show_path, show_path ];T[I"();T@ FI"DirectoryBody;TcRDoc::NormalClass00PK!ºɀPshare/gems/doc/rack-2.2.4/ri/Rack/Directory/DirectoryBody/cdesc-DirectoryBody.rinu[U:RDoc::NormalClass[iI"DirectoryBody:ETI"#Rack::Directory::DirectoryBody;TI"%Struct.new(:root, :path, :files);To:RDoc::Markup::Document: @parts[o;;[o:RDoc::Markup::Paragraph;[I"HBody class for directory entries, showing an index page with links ;TI"to each file.;T: @fileI"lib/rack/directory.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[[:protected[[: private[[I" instance;T[[; [[I" each;TI"lib/rack/directory.rb;T[; [[;[[I"DIR_FILE_escape;T@'[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I"Rack::Directory;TcRDoc::NormalClassPK!7___4share/gems/doc/rack-2.2.4/ri/Rack/Directory/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"Rack::Directory::new;TT: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I">Set the root directory and application for serving files.;T: @fileI"lib/rack/directory.rb;T:0@omit_headings_from_table_of_contents_below000[I"(root, app = nil);T@FI"Directory;TcRDoc::NormalClass00PK!">В5share/gems/doc/rack-2.2.4/ri/Rack/Directory/root-i.rinu[U:RDoc::Attr[iI" root:ETI"Rack::Directory#root;TI"R;T: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"GThe root of the directory hierarchy. Only requests for files and ;TI"Internals of request handling. Similar to call but does ;TI"'not remove body for HEAD requests.;T: @fileI"lib/rack/directory.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@FI"Directory;TcRDoc::NormalClass00PK!Mx||?share/gems/doc/rack-2.2.4/ri/Rack/Directory/list_directory-i.rinu[U:RDoc::AnyMethod[iI"list_directory:ETI"#Rack::Directory#list_directory;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"9Rack response to use for directories under the root.;T: @fileI"lib/rack/directory.rb;T:0@omit_headings_from_table_of_contents_below000[I"#(path_info, path, script_name);T@FI"Directory;TcRDoc::NormalClass00PK!x>share/gems/doc/rack-2.2.4/ri/Rack/Directory/cdesc-Directory.rinu[U:RDoc::NormalClass[iI"Directory:ETI"Rack::Directory;TI" Object;To:RDoc::Markup::Document: @parts[o;;[o:RDoc::Markup::Paragraph;[ I"MRack::Directory serves entries below the +root+ given, according to the ;TI"Qpath info of the Rack request. If a directory is found, the file's contents ;TI"Pwill be presented in an html based index. If a file is found, the env will ;TI"&be passed to the specified +app+.;To:RDoc::Markup::BlankLineo; ;[I"NIf +app+ is not specified, a Rack::Files of the same +root+ will be used.;T: @fileI"lib/rack/directory.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[ I" root;TI"R;T: publicFI"lib/rack/directory.rb;T[ U:RDoc::Constant[iI" DIR_FILE;TI"Rack::Directory::DIR_FILE;T; 0o;;[; @; 0@@cRDoc::NormalClass0U;[iI"DIR_PAGE_HEADER;TI"%Rack::Directory::DIR_PAGE_HEADER;T; 0o;;[; @; 0@@@%0U;[iI"DIR_PAGE_FOOTER;TI"%Rack::Directory::DIR_PAGE_FOOTER;T; 0o;;[; @; 0@@@%0U;[iI"FILESIZE_FORMAT;TI"%Rack::Directory::FILESIZE_FORMAT;T; 0o;;[o; ;[I"Stolen from Ramaze;T; @; 0@@@%0[[[I" class;T[[; [[I"new;T@[:protected[[: private[[I" instance;T[[; [[I" call;T@[I"check_bad_request;T@[I"check_forbidden;T@[I"entity_not_found;T@[I"filesize_format;T@[I"get;T@[I"list_directory;T@[I"list_path;T@[I" stat;T@[;[[;[[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I" Rack;TcRDoc::NormalModulePK!\$Bshare/gems/doc/rack-2.2.4/ri/Rack/Directory/check_bad_request-i.rinu[U:RDoc::AnyMethod[iI"check_bad_request:ETI"&Rack::Directory#check_bad_request;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"SRack response to use for requests with invalid paths, or nil if path is valid.;T: @fileI"lib/rack/directory.rb;T:0@omit_headings_from_table_of_contents_below000[I"(path_info);T@FI"Directory;TcRDoc::NormalClass00PK!RR@share/gems/doc/rack-2.2.4/ri/Rack/Directory/filesize_format-i.rinu[U:RDoc::AnyMethod[iI"filesize_format:ETI"$Rack::Directory#filesize_format;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"&Provide human readable file sizes;T: @fileI"lib/rack/directory.rb;T:0@omit_headings_from_table_of_contents_below000[I" (int);T@FI"Directory;TcRDoc::NormalClass00PK!/Q5share/gems/doc/rack-2.2.4/ri/Rack/Directory/call-i.rinu[U:RDoc::AnyMethod[iI" call:ETI"Rack::Directory#call;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/directory.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@ FI"Directory;TcRDoc::NormalClass00PK!fAshare/gems/doc/rack-2.2.4/ri/Rack/Directory/entity_not_found-i.rinu[U:RDoc::AnyMethod[iI"entity_not_found:ETI"%Rack::Directory#entity_not_found;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"MRack response to use for unreadable and non-file, non-directory entries.;T: @fileI"lib/rack/directory.rb;T:0@omit_headings_from_table_of_contents_below000[I"(path_info);T@FI"Directory;TcRDoc::NormalClass00PK!n:share/gems/doc/rack-2.2.4/ri/Rack/Directory/list_path-i.rinu[U:RDoc::AnyMethod[iI"list_path:ETI"Rack::Directory#list_path;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"DRack response to use for files and directories under the root. ;TI"LUnreadable and non-file, non-directory entries will get a 404 response.;T: @fileI"lib/rack/directory.rb;T:0@omit_headings_from_table_of_contents_below000[I"((env, path, path_info, script_name);T@FI"Directory;TcRDoc::NormalClass00PK!*Ѧbb5share/gems/doc/rack-2.2.4/ri/Rack/Directory/stat-i.rinu[U:RDoc::AnyMethod[iI" stat:ETI"Rack::Directory#stat;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"KFile::Stat for the given path, but return nil for missing/bad entries.;T: @fileI"lib/rack/directory.rb;T:0@omit_headings_from_table_of_contents_below000[I" (path);T@FI"Directory;TcRDoc::NormalClass00PK!ͯ{>>7share/gems/doc/rack-2.2.4/ri/Rack/Chunked/Body/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"Rack::Chunked::Body::new;TT: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"+Store the response body to be chunked.;T: @fileI"lib/rack/chunked.rb;T:0@omit_headings_from_table_of_contents_below000[I" (body);T@FI" Body;TcRDoc::NormalClass00PK!9ddBshare/gems/doc/rack-2.2.4/ri/Rack/Chunked/Body/yield_trailers-i.rinu[U:RDoc::AnyMethod[iI"yield_trailers:ETI"'Rack::Chunked::Body#yield_trailers;TF: privateo:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"?Do nothing as this class does not support trailer headers.;T: @fileI"lib/rack/chunked.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@FI" Body;TcRDoc::NormalClass00PK!88share/gems/doc/rack-2.2.4/ri/Rack/Chunked/Body/each-i.rinu[U:RDoc::AnyMethod[iI" each:ETI"Rack::Chunked::Body#each;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I":For each element yielded by the response body, yield ;TI"%the element in chunked encoding.;T: @fileI"lib/rack/chunked.rb;T:0@omit_headings_from_table_of_contents_below00I"[size, term, b, term].join;T[I" (&block);T@FI" Body;TcRDoc::NormalClass00PK!nPP9share/gems/doc/rack-2.2.4/ri/Rack/Chunked/Body/close-i.rinu[U:RDoc::AnyMethod[iI" close:ETI"Rack::Chunked::Body#close;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I">Close the response body if the response body supports it.;T: @fileI"lib/rack/chunked.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@FI" Body;TcRDoc::NormalClass00PK!?<share/gems/doc/rack-2.2.4/ri/Rack/Chunked/Body/cdesc-Body.rinu[U:RDoc::NormalClass[iI" Body:ETI"Rack::Chunked::Body;TI" Object;To:RDoc::Markup::Document: @parts[o;;[o:RDoc::Markup::Paragraph;[I"1A body wrapper that emits chunked responses.;T: @fileI"lib/rack/chunked.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[U:RDoc::Constant[iI" TERM;TI"Rack::Chunked::Body::TERM;T: public0o;;[; @; 0@@cRDoc::NormalClass0U; [iI" TAIL;TI"Rack::Chunked::Body::TAIL;T; 0o;;[; @; 0@@@0[[[I" class;T[[; [[I"new;TI"lib/rack/chunked.rb;T[:protected[[: private[[I" instance;T[[; [[I" close;T@*[I" each;T@*[;[[;[[I"yield_trailers;T@*[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I"Rack::Chunked;T@PK!K/TiiJshare/gems/doc/rack-2.2.4/ri/Rack/Chunked/TrailerBody/cdesc-TrailerBody.rinu[U:RDoc::NormalClass[iI"TrailerBody:ETI"Rack::Chunked::TrailerBody;TI"Rack::Chunked::Body;To:RDoc::Markup::Document: @parts[o;;[o:RDoc::Markup::Paragraph;[ I"CA body wrapper that emits chunked responses and also supports ;TI"Gsending Trailer headers. Note that the response body provided to ;TI"Binitialize must have a +trailers+ method that returns a hash ;TI"Dof trailer headers, and the rack response itself should have a ;TI"CTrailer header listing the headers that the +trailers+ method ;TI"will return.;T: @fileI"lib/rack/chunked.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[[:protected[[: private[[I" instance;T[[; [[; [[;[[I"yield_trailers;TI"lib/rack/chunked.rb;T[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I"Rack::Chunked;TcRDoc::NormalClassPK!ttIshare/gems/doc/rack-2.2.4/ri/Rack/Chunked/TrailerBody/yield_trailers-i.rinu[U:RDoc::AnyMethod[iI"yield_trailers:ETI".Rack::Chunked::TrailerBody#yield_trailers;TF: privateo:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"+Yield strings for each trailer header.;T: @fileI"lib/rack/chunked.rb;T:0@omit_headings_from_table_of_contents_below00I""#{k}: #{v}\r\n";T[I"();T@FI"TrailerBody;TcRDoc::NormalClass00PK!Ĩ2share/gems/doc/rack-2.2.4/ri/Rack/Chunked/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"Rack::Chunked::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/chunked.rb;T:0@omit_headings_from_table_of_contents_below000[I" (app);T@ FI" Chunked;TcRDoc::NormalClass00PK!!2:share/gems/doc/rack-2.2.4/ri/Rack/Chunked/cdesc-Chunked.rinu[U:RDoc::NormalClass[iI" Chunked:ETI"Rack::Chunked;TI" Object;To:RDoc::Markup::Document: @parts[o;;[ o:RDoc::Markup::Paragraph;[I"JMiddleware that applies chunked transfer encoding to response bodies ;TI"@when the response does not include a Content-Length header.;To:RDoc::Markup::BlankLineo; ;[I"LThis supports the Trailer response header to allow the use of trailing ;TI"Qheaders in the chunked encoding. However, using this requires you manually ;TI"Ispecify a response body that supports a +trailers+ method. Example:;T@o:RDoc::Markup::Verbatim;[I":[200, { 'Trailer' => 'Expires'}, ["Hello", "World"]] ;TI"# error raised ;TI" ;TI"body = ["Hello", "World"] ;TI"def body.trailers ;TI"& { 'Expires' => Time.now.to_s } ;TI" end ;TI",[200, { 'Trailer' => 'Expires'}, body] ;TI"# No exception raised;T: @format0: @fileI"lib/rack/chunked.rb;T:0@omit_headings_from_table_of_contents_below0; 0;0[[[[I"Rack::Utils;To;;[; @#;0I"lib/rack/chunked.rb;T[[I" class;T[[: public[[I"new;T@+[:protected[[: private[[I" instance;T[[;[[I" call;T@+[I"chunkable_version?;T@+[;[[;[[[U:RDoc::Context::Section[i0o;;[; 0;0[@#I" Rack;TcRDoc::NormalModulePK!Z#3share/gems/doc/rack-2.2.4/ri/Rack/Chunked/call-i.rinu[U:RDoc::AnyMethod[iI" call:ETI"Rack::Chunked#call;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"AIf the rack app returns a response that should have a body, ;TI"Dbut does not have Content-Length or Transfer-Encoding headers, ;TI":modify the response to use chunked Transfer-Encoding.;T: @fileI"lib/rack/chunked.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@FI" Chunked;TcRDoc::NormalClass00PK!XcttCshare/gems/doc/rack-2.2.4/ri/Rack/Chunked/chunkable_version%3f-i.rinu[U:RDoc::AnyMethod[iI"chunkable_version?:ETI"%Rack::Chunked#chunkable_version?;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"HWhether the HTTP version supports chunked encoding (HTTP 1.1 does).;T: @fileI"lib/rack/chunked.rb;T:0@omit_headings_from_table_of_contents_below000[I" (ver);T@FI" Chunked;TcRDoc::NormalClass00PK!/}}4share/gems/doc/rack-2.2.4/ri/Rack/Mime/match%3f-c.rinu[U:RDoc::AnyMethod[iI" match?:ETI"Rack::Mime::match?;TT: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"NReturns true if the given value is a mime match for the given mime match ;TI"$specification, false otherwise.;To:RDoc::Markup::BlankLineo:RDoc::Markup::Verbatim; [I"6Rack::Mime.match?('text/html', 'text/*') => true ;TI"2Rack::Mime.match?('text/plain', '*') => true ;TI"@Rack::Mime.match?('text/html', 'application/json') => false;T: @format0: @fileI"lib/rack/mime.rb;T:0@omit_headings_from_table_of_contents_below000[I"(value, matcher);T@FI" Mime;TcRDoc::NormalModule00PK!4share/gems/doc/rack-2.2.4/ri/Rack/Mime/cdesc-Mime.rinu[U:RDoc::NormalModule[iI" Mime:ETI"Rack::Mime;T0o:RDoc::Markup::Document: @parts[o;;[: @fileI"lib/rack/mime.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[U:RDoc::Constant[iI"MIME_TYPES;TI"Rack::Mime::MIME_TYPES;T: public0o;;[ o:RDoc::Markup::Paragraph;[I">List of most common mime-types, selected various sources ;TI"Baccording to their usefulness in a webserving scope for Ruby ;TI" users.;To:RDoc::Markup::BlankLineo; ;[I"DTo amend this list with your local mime.types list you can use:;T@o:RDoc::Markup::Verbatim;[I"!require 'webrick/httputils' ;TI"Blist = WEBrick::HTTPUtils.load_mime_types('/etc/mime.types') ;TI")Rack::Mime::MIME_TYPES.merge!(list) ;T: @format0o; ;[I"PN.B. On Ubuntu the mime.types file does not include the leading period, so ;TI"Dusers may need to modify the data before merging into the hash.;T; @ ; 0@ @cRDoc::NormalModule0[[[I" class;T[[; [[I" match?;TI"lib/rack/mime.rb;T[I"mime_type;T@2[:protected[[: private[[I" instance;T[[; [[;[[;[[@1@2[@4@2[[U:RDoc::Context::Section[i0o;;[; 0; 0[@ I" Rack;T@(PK!KK5share/gems/doc/rack-2.2.4/ri/Rack/Mime/mime_type-c.rinu[U:RDoc::AnyMethod[iI"mime_type:ETI"Rack::Mime::mime_type;TT: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"GReturns String with mime type if found, otherwise use +fallback+. ;TI"A+ext+ should be filename extension in the '.ext' format that;To:RDoc::Markup::Verbatim; [I"!File.extname(file) returns. ;T: @format0o; ; [I"!+fallback+ may be any object;To:RDoc::Markup::BlankLineo; ; [I".Also see the documentation for MIME_TYPES;T@o; ; [I" Usage:;To; ; [I""Rack::Mime.mime_type('.foo') ;T; 0o; ; [I"This is a shortcut for:;To; ; [I"ERack::Mime::MIME_TYPES.fetch('.foo', 'application/octet-stream');T; 0: @fileI"lib/rack/mime.rb;T:0@omit_headings_from_table_of_contents_below000[I"1(ext, fallback = 'application/octet-stream');T@%FI" Mime;TcRDoc::NormalModule00PK!5 }}4share/gems/doc/rack-2.2.4/ri/Rack/Mime/match%3f-i.rinu[U:RDoc::AnyMethod[iI" match?:ETI"Rack::Mime#match?;TF: privateo:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"NReturns true if the given value is a mime match for the given mime match ;TI"$specification, false otherwise.;To:RDoc::Markup::BlankLineo:RDoc::Markup::Verbatim; [I"6Rack::Mime.match?('text/html', 'text/*') => true ;TI"2Rack::Mime.match?('text/plain', '*') => true ;TI"@Rack::Mime.match?('text/html', 'application/json') => false;T: @format0: @fileI"lib/rack/mime.rb;T:0@omit_headings_from_table_of_contents_below000[I"(value, matcher);T@FI" Mime;TcRDoc::NormalModule00PK!HKK5share/gems/doc/rack-2.2.4/ri/Rack/Mime/mime_type-i.rinu[U:RDoc::AnyMethod[iI"mime_type:ETI"Rack::Mime#mime_type;TF: privateo:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"GReturns String with mime type if found, otherwise use +fallback+. ;TI"A+ext+ should be filename extension in the '.ext' format that;To:RDoc::Markup::Verbatim; [I"!File.extname(file) returns. ;T: @format0o; ; [I"!+fallback+ may be any object;To:RDoc::Markup::BlankLineo; ; [I".Also see the documentation for MIME_TYPES;T@o; ; [I" Usage:;To; ; [I""Rack::Mime.mime_type('.foo') ;T; 0o; ; [I"This is a shortcut for:;To; ; [I"ERack::Mime::MIME_TYPES.fetch('.foo', 'application/octet-stream');T; 0: @fileI"lib/rack/mime.rb;T:0@omit_headings_from_table_of_contents_below000[I"1(ext, fallback = 'application/octet-stream');T@%FI" Mime;TcRDoc::NormalModule00PK!a:share/gems/doc/rack-2.2.4/ri/Rack/BodyProxy/closed%3f-i.rinu[U:RDoc::AnyMethod[iI" closed?:ETI"Rack::BodyProxy#closed?;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"CWhether the proxy is closed. The proxy starts as not closed, ;TI"3and becomes closed on the first call to close.;T: @fileI"lib/rack/body_proxy.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@FI"BodyProxy;TcRDoc::NormalClass00PK!sI/4share/gems/doc/rack-2.2.4/ri/Rack/BodyProxy/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"Rack::BodyProxy::new;TT: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"CSet the response body to wrap, and the block to call when the ;TI""response has been fully sent.;T: @fileI"lib/rack/body_proxy.rb;T:0@omit_headings_from_table_of_contents_below000[I"(body, &block);T@FI"BodyProxy;TcRDoc::NormalClass00PK!att?share/gems/doc/rack-2.2.4/ri/Rack/BodyProxy/method_missing-i.rinu[U:RDoc::AnyMethod[iI"method_missing:ETI"#Rack::BodyProxy#method_missing;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"2Delegate missing methods to the wrapped body.;T: @fileI"lib/rack/body_proxy.rb;T:0@omit_headings_from_table_of_contents_below000[I"!(method_name, *args, &block);T@FI"BodyProxy;TcRDoc::NormalClass00PK!gJ;>share/gems/doc/rack-2.2.4/ri/Rack/BodyProxy/cdesc-BodyProxy.rinu[U:RDoc::NormalClass[iI"BodyProxy:ETI"Rack::BodyProxy;TI" Object;To:RDoc::Markup::Document: @parts[o;;[o:RDoc::Markup::Paragraph;[I"=Proxy for response bodies allowing calling a block when ;TI"Dthe response body is closed (after the response has been fully ;TI"sent to the client).;T: @fileI"lib/rack/body_proxy.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[[I"new;TI"lib/rack/body_proxy.rb;T[:protected[[: private[[I" instance;T[[; [ [I" close;T@[I" closed?;T@[I"method_missing;T@[I"respond_to_missing?;T@[; [[;[[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I" Rack;TcRDoc::NormalModulePK!| ÎFshare/gems/doc/rack-2.2.4/ri/Rack/BodyProxy/respond_to_missing%3f-i.rinu[U:RDoc::AnyMethod[iI"respond_to_missing?:ETI"(Rack::BodyProxy#respond_to_missing?;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"share/gems/doc/rack-2.2.4/ri/Rack/Response/Raw/get_header-i.rinu[U:RDoc::AnyMethod[iI"get_header:ETI"#Rack::Response::Raw#get_header;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I" (key);T@ FI"Raw;TcRDoc::NormalClass00PK!ձ=ii;share/gems/doc/rack-2.2.4/ri/Rack/Response/Raw/cdesc-Raw.rinu[U:RDoc::NormalClass[iI"Raw:ETI"Rack::Response::Raw;TI" Object;To:RDoc::Markup::Document: @parts[o;;[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[ I" headers;TI"R;T: publicFI"lib/rack/response.rb;T[ I" status;TI"RW;T; F@[[[I" Helpers;To;;[; @; 0@[[I" class;T[[; [[I"new;T@[:protected[[: private[[I" instance;T[[; [ [I"delete_header;T@[I"get_header;T@[I"has_header?;T@[I"set_header;T@[; [[; [[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I"Rack::Response;TcRDoc::NormalClassPK!(Ashare/gems/doc/rack-2.2.4/ri/Rack/Response/Raw/has_header%3f-i.rinu[U:RDoc::AnyMethod[iI"has_header?:ETI"$Rack::Response::Raw#has_header?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I" (key);T@ FI"Raw;TcRDoc::NormalClass00PK!z? 7share/gems/doc/rack-2.2.4/ri/Rack/Response/Raw/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"Rack::Response::Raw::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"(status, headers);T@ FI"Raw;TcRDoc::NormalClass00PK!*uAshare/gems/doc/rack-2.2.4/ri/Rack/Response/Raw/delete_header-i.rinu[U:RDoc::AnyMethod[iI"delete_header:ETI"&Rack::Response::Raw#delete_header;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I" (key);T@ FI"Raw;TcRDoc::NormalClass00PK!>share/gems/doc/rack-2.2.4/ri/Rack/Response/Raw/set_header-i.rinu[U:RDoc::AnyMethod[iI"set_header:ETI"#Rack::Response::Raw#set_header;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I" (key, v);T@ FI"Raw;TcRDoc::NormalClass00PK!}:share/gems/doc/rack-2.2.4/ri/Rack/Response/Raw/status-i.rinu[U:RDoc::Attr[iI" status:ETI"Rack::Response::Raw#status;TI"RW;T: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below0F@ I"Rack::Response::Raw;TcRDoc::NormalClass0PK!;share/gems/doc/rack-2.2.4/ri/Rack/Response/Raw/headers-i.rinu[U:RDoc::Attr[iI" headers:ETI" Rack::Response::Raw#headers;TI"R;T: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below0F@ I"Rack::Response::Raw;TcRDoc::NormalClass0PK![:share/gems/doc/rack-2.2.4/ri/Rack/Response/get_header-i.rinu[U:RDoc::AnyMethod[iI"get_header:ETI"Rack::Response#get_header;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[[I"[];To;; [; @ ; 0I" (key);T@ FI" Response;TcRDoc::NormalClass00PK![w:share/gems/doc/rack-2.2.4/ri/Rack/Response/chunked%3f-i.rinu[U:RDoc::AnyMethod[iI" chunked?:ETI"Rack::Response#chunked?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Response;TcRDoc::NormalClass00PK!>Cw8share/gems/doc/rack-2.2.4/ri/Rack/Response/empty%3f-i.rinu[U:RDoc::AnyMethod[iI" empty?:ETI"Rack::Response#empty?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Response;TcRDoc::NormalClass00PK!/3=share/gems/doc/rack-2.2.4/ri/Rack/Response/has_header%3f-i.rinu[U:RDoc::AnyMethod[iI"has_header?:ETI"Rack::Response#has_header?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I" (key);T@ FI" Response;TcRDoc::NormalClass00PK!+D>3share/gems/doc/rack-2.2.4/ri/Rack/Response/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"Rack::Response::new;TT: publico:RDoc::Markup::Document: @parts[ o:RDoc::Markup::Paragraph; [I"DInitialize the response object with the specified body, status ;TI"and headers.;To:RDoc::Markup::BlankLineo; ; [ I":@param body [nil, #each, #to_str] the response body. ;TI"B@param status [Integer] the integer status as defined by the ;TI"HTTP protocol RFCs. ;TI"C@param headers [#each] a list of key-value header pairs which ;TI"'conform to the HTTP protocol RFCs.;T@o; ; [I"DProviding a body which responds to #to_str is legacy behaviour.;T: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below00I" self;T[I"-(body = nil, status = 200, headers = {});T@FI" Response;TcRDoc::NormalClass00PK!5%Gshare/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/do_not_cache%21-i.rinu[U:RDoc::AnyMethod[iI"do_not_cache!:ETI"*Rack::Response::Helpers#do_not_cache!;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"ZSpecifies that the content shouldn't be cached. Overrides `cache!` if already called.;T: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@FI" Helpers;TcRDoc::NormalModule00PK!1d>  Hshare/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/unprocessable%3f-i.rinu[U:RDoc::AnyMethod[iI"unprocessable?:ETI"+Rack::Response::Helpers#unprocessable?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!QDshare/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/not_found%3f-i.rinu[U:RDoc::AnyMethod[iI"not_found?:ETI"'Rack::Response::Helpers#not_found?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!z@share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/location-i.rinu[U:RDoc::AnyMethod[iI" location:ETI"%Rack::Response::Helpers#location;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!UBshare/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/invalid%3f-i.rinu[U:RDoc::AnyMethod[iI" invalid?:ETI"%Rack::Response::Helpers#invalid?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!|w  Hshare/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/informational%3f-i.rinu[U:RDoc::AnyMethod[iI"informational?:ETI"+Rack::Response::Helpers#informational?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!tyEshare/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/delete_cookie-i.rinu[U:RDoc::AnyMethod[iI"delete_cookie:ETI"*Rack::Response::Helpers#delete_cookie;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"(key, value = {});T@ FI" Helpers;TcRDoc::NormalModule00PK!hZLshare/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/moved_permanently%3f-i.rinu[U:RDoc::AnyMethod[iI"moved_permanently?:ETI"/Rack::Response::Helpers#moved_permanently?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!Gh?share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/etag%3d-i.rinu[U:RDoc::AnyMethod[iI" etag=:ETI""Rack::Response::Helpers#etag=;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"(v);T@ FI" Helpers;TcRDoc::NormalModule00PK!&OzBshare/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/media_type-i.rinu[U:RDoc::AnyMethod[iI"media_type:ETI"'Rack::Response::Helpers#media_type;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!=VCshare/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/redirect%3f-i.rinu[U:RDoc::AnyMethod[iI"redirect?:ETI"&Rack::Response::Helpers#redirect?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!%{Nshare/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/precondition_failed%3f-i.rinu[U:RDoc::AnyMethod[iI"precondition_failed?:ETI"1Rack::Response::Helpers#precondition_failed?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!6MyBshare/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/created%3f-i.rinu[U:RDoc::AnyMethod[iI" created?:ETI"%Rack::Response::Helpers#created?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!pCCshare/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/accepted%3f-i.rinu[U:RDoc::AnyMethod[iI"accepted?:ETI"&Rack::Response::Helpers#accepted?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!P4Bshare/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/add_header-i.rinu[U:RDoc::AnyMethod[iI"add_header:ETI"'Rack::Response::Helpers#add_header;TF: publico:RDoc::Markup::Document: @parts[ o:RDoc::Markup::Paragraph; [I"0Add a header that may have multiple values.;To:RDoc::Markup::BlankLineo; ; [I" Example:;To:RDoc::Markup::Verbatim; [ I"3response.add_header 'Vary', 'Accept-Encoding' ;TI"*response.add_header 'Vary', 'Cookie' ;TI" ;TI"Hassert_equal 'Accept-Encoding,Cookie', response.get_header('Vary') ;T: @format0o; ; [I"Ahttp://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2;T: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I" (key, v);T@FI" Helpers;TcRDoc::NormalModule00PK!Jc  Gshare/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/server_error%3f-i.rinu[U:RDoc::AnyMethod[iI"server_error?:ETI"*Rack::Response::Helpers#server_error?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!aBshare/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/include%3f-i.rinu[U:RDoc::AnyMethod[iI" include?:ETI"%Rack::Response::Helpers#include?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I" (header);T@ FI" Helpers;TcRDoc::NormalModule00PK!Fshare/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/bad_request%3f-i.rinu[U:RDoc::AnyMethod[iI"bad_request?:ETI")Rack::Response::Helpers#bad_request?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!  Fshare/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/content_length-i.rinu[U:RDoc::AnyMethod[iI"content_length:ETI"+Rack::Response::Helpers#content_length;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!E Eshare/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/successful%3f-i.rinu[U:RDoc::AnyMethod[iI"successful?:ETI"(Rack::Response::Helpers#successful?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!Bshare/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/set_cookie-i.rinu[U:RDoc::AnyMethod[iI"set_cookie:ETI"'Rack::Response::Helpers#set_cookie;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"(key, value);T@ FI" Helpers;TcRDoc::NormalModule00PK!iLshare/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/set_cookie_header%3d-i.rinu[U:RDoc::AnyMethod[iI"set_cookie_header=:ETI"/Rack::Response::Helpers#set_cookie_header=;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"(v);T@ FI" Helpers;TcRDoc::NormalModule00PK!`,8  Eshare/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/cache_control-i.rinu[U:RDoc::AnyMethod[iI"cache_control:ETI"*Rack::Response::Helpers#cache_control;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!3(  Gshare/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/unauthorized%3f-i.rinu[U:RDoc::AnyMethod[iI"unauthorized?:ETI"*Rack::Response::Helpers#unauthorized?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!H*a=share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/ok%3f-i.rinu[U:RDoc::AnyMethod[iI"ok?:ETI" Rack::Response::Helpers#ok?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!LzIshare/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/set_cookie_header-i.rinu[U:RDoc::AnyMethod[iI"set_cookie_header:ETI".Rack::Response::Helpers#set_cookie_header;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK![Qm>share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/append-i.rinu[U:RDoc::AnyMethod[iI" append:ETI"#Rack::Response::Helpers#append;TF:protectedo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I" (chunk);T@ FI" Helpers;TcRDoc::NormalModule00PK!WIshare/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/media_type_params-i.rinu[U:RDoc::AnyMethod[iI"media_type_params:ETI".Rack::Response::Helpers#media_type_params;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!&t  Hshare/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/cache_control%3d-i.rinu[U:RDoc::AnyMethod[iI"cache_control=:ETI"+Rack::Response::Helpers#cache_control=;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"(v);T@ FI" Helpers;TcRDoc::NormalModule00PK!M SSDshare/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/content_type-i.rinu[U:RDoc::AnyMethod[iI"content_type:ETI")Rack::Response::Helpers#content_type;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"*Get the content type of the response.;T: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@FI" Helpers;TcRDoc::NormalModule00PK!2^<share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/etag-i.rinu[U:RDoc::AnyMethod[iI" etag:ETI"!Rack::Response::Helpers#etag;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!T>lEshare/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/no_content%3f-i.rinu[U:RDoc::AnyMethod[iI"no_content?:ETI"(Rack::Response::Helpers#no_content?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!b_bJDshare/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/forbidden%3f-i.rinu[U:RDoc::AnyMethod[iI"forbidden?:ETI"'Rack::Response::Helpers#forbidden?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!t3aaGshare/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/content_type%3d-i.rinu[U:RDoc::AnyMethod[iI"content_type=:ETI"*Rack::Response::Helpers#content_type=;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"*Set the content type of the response.;T: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"(content_type);T@FI" Helpers;TcRDoc::NormalModule00PK!5Mshare/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/method_not_allowed%3f-i.rinu[U:RDoc::AnyMethod[iI"method_not_allowed?:ETI"0Rack::Response::Helpers#method_not_allowed?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!g  Gshare/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/client_error%3f-i.rinu[U:RDoc::AnyMethod[iI"client_error?:ETI"*Rack::Response::Helpers#client_error?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!'C55@share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/cache%21-i.rinu[U:RDoc::AnyMethod[iI" cache!:ETI"#Rack::Response::Helpers#cache!;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"0Specify that the content should be cached. ;TI"N@param duration [Integer] The number of seconds until the cache expires. ;TI"r@option directive [String] The cache control directive, one of "public", "private", "no-cache" or "no-store".;T: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"+(duration = 3600, directive: "public");T@FI" Helpers;TcRDoc::NormalModule00PK!̋$Hshare/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/buffered_body%21-i.rinu[U:RDoc::AnyMethod[iI"buffered_body!:ETI"+Rack::Response::Helpers#buffered_body!;TF:protectedo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!"@"**Cshare/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/cdesc-Helpers.rinu[U:RDoc::NormalModule[iI" Helpers:ETI"Rack::Response::Helpers;T0o:RDoc::Markup::Document: @parts[o;;[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[[:protected[[: private[[I" instance;T[[; [+[I"accepted?;TI"lib/rack/response.rb;T[I"add_header;T@"[I"bad_request?;T@"[I" cache!;T@"[I"cache_control;T@"[I"cache_control=;T@"[I"client_error?;T@"[I"content_length;T@"[I"content_type;T@"[I"content_type=;T@"[I" created?;T@"[I"delete_cookie;T@"[I"do_not_cache!;T@"[I" etag;T@"[I" etag=;T@"[I"forbidden?;T@"[I" include?;T@"[I"informational?;T@"[I" invalid?;T@"[I" location;T@"[I"location=;T@"[I"media_type;T@"[I"media_type_params;T@"[I"method_not_allowed?;T@"[I"moved_permanently?;T@"[I"no_content?;T@"[I"not_found?;T@"[I"ok?;T@"[I"precondition_failed?;T@"[I"redirect?;T@"[I"redirection?;T@"[I"server_error?;T@"[I"set_cookie;T@"[I"set_cookie_header;T@"[I"set_cookie_header=;T@"[I"successful?;T@"[I"unauthorized?;T@"[I"unprocessable?;T@"[; [[I" append;T@"[I"buffered_body!;T@"[; [[[U:RDoc::Context::Section[i0o;;[; 0; 0[@ I"Rack::Response;TcRDoc::NormalClassPK!#F  Cshare/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/location%3d-i.rinu[U:RDoc::AnyMethod[iI"location=:ETI"&Rack::Response::Helpers#location=;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"(location);T@ FI" Helpers;TcRDoc::NormalModule00PK!Fshare/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/redirection%3f-i.rinu[U:RDoc::AnyMethod[iI"redirection?:ETI")Rack::Response::Helpers#redirection?;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Helpers;TcRDoc::NormalModule00PK!l6share/gems/doc/rack-2.2.4/ri/Rack/Response/header-i.rinu[U:RDoc::Attr[iI" header:ETI"Rack::Response#header;TI"R;T: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below0F@ I"Rack::Response;TcRDoc::NormalClass0PK! 6share/gems/doc/rack-2.2.4/ri/Rack/Response/%5b%5d-c.rinu[U:RDoc::AnyMethod[iI"[]:ETI"Rack::Response::[];TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"(status, headers, body);T@ FI" Response;TcRDoc::NormalClass00PK!  8share/gems/doc/rack-2.2.4/ri/Rack/Response/redirect-i.rinu[U:RDoc::AnyMethod[iI" redirect:ETI"Rack::Response#redirect;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"(target, status = 302);T@ FI" Response;TcRDoc::NormalClass00PK!gA6share/gems/doc/rack-2.2.4/ri/Rack/Response/%5b%5d-i.rinu[U:RDoc::AnyMethod[iI"[]:ETI"Rack::Response#[];TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I" (key);T@ FI" Response;TcRDoc::NormalClass0[I"Rack::Response;TFI"get_header;TPK!!mf<share/gems/doc/rack-2.2.4/ri/Rack/Response/cdesc-Response.rinu[U:RDoc::NormalClass[iI" Response:ETI"Rack::Response;TI" Object;To:RDoc::Markup::Document: @parts[o;;[ o:RDoc::Markup::Paragraph;[I"ERack::Response provides a convenient interface to create a Rack ;TI"response.;To:RDoc::Markup::BlankLineo; ;[I"CIt allows setting of headers and cookies, and provides useful ;TI";defaults (an OK response with empty headers and body).;T@o; ;[ I"GYou can use Response#write to iteratively generate your response, ;TI"Ebut note that this is buffered by Rack::Response until you call ;TI"H+finish+. +finish+ however can take a block inside which calls to ;TI"4+write+ are synchronous with the Rack response.;T@o; ;[I"DYour application's +call+ should end returning Response#finish.;T: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[ [ I" body;TI"RW;T: publicFI"lib/rack/response.rb;T[ I" header;TI"R;T; F@%[ I" headers;T@(; F@%[ I" length;T@$; F@%[ I" status;T@$; F@%[U:RDoc::Constant[iI" CHUNKED;TI"Rack::Response::CHUNKED;T; 0o;;[; @ ; 0@ @cRDoc::NormalClass0U;[iI"STATUS_WITH_NO_ENTITY_BODY;TI"/Rack::Response::STATUS_WITH_NO_ENTITY_BODY;T; 0o;;[; @ ; 0@ @@60[[I" Helpers;To;;[; @ ; 0@%[[I" class;T[[; [[I"[];T@%[I"new;T@%[:protected[[: private[[I" instance;T[[; [[I"[];T@%[I"[]=;T@%[I" chunked?;T@%[I" close;T@%[I"delete_header;T@%[I" each;T@%[I" empty?;T@%[I" finish;T@%[I"get_header;T@%[I"has_header?;T@%[I" redirect;T@%[I"set_header;T@%[I" to_a;T@%[I" write;T@%[;[[;[[[U:RDoc::Context::Section[i0o;;[; 0; 0[@ I"$lib/rack/session/abstract/id.rb;TI" Rack;TcRDoc::NormalModulePK!"6share/gems/doc/rack-2.2.4/ri/Rack/Response/finish-i.rinu[U:RDoc::AnyMethod[iI" finish:ETI"Rack::Response#finish;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I"MGenerate a response array consistent with the requirements of the SPEC. ;TI"E@return [Array] a 3-tuple suitable of `[status, headers, body]` ;TI"Nwhich is suitable to be returned from the middleware `#call(env)` method.;T: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[[I" to_a;To;; [; @; 0I" (&block);T@FI" Response;TcRDoc::NormalClass00PK! ʋ4share/gems/doc/rack-2.2.4/ri/Rack/Response/each-i.rinu[U:RDoc::AnyMethod[iI" each:ETI"Rack::Response#each;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"(&callback);T@ FI" Response;TcRDoc::NormalClass00PK!_K6share/gems/doc/rack-2.2.4/ri/Rack/Response/length-i.rinu[U:RDoc::Attr[iI" length:ETI"Rack::Response#length;TI"RW;T: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below0F@ I"Rack::Response;TcRDoc::NormalClass0PK!Fl44share/gems/doc/rack-2.2.4/ri/Rack/Response/body-i.rinu[U:RDoc::Attr[iI" body:ETI"Rack::Response#body;TI"RW;T: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below0F@ I"Rack::Response;TcRDoc::NormalClass0PK!0?=share/gems/doc/rack-2.2.4/ri/Rack/Response/delete_header-i.rinu[U:RDoc::AnyMethod[iI"delete_header:ETI"!Rack::Response#delete_header;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I" (key);T@ FI" Response;TcRDoc::NormalClass00PK!.s:share/gems/doc/rack-2.2.4/ri/Rack/Response/set_header-i.rinu[U:RDoc::AnyMethod[iI"set_header:ETI"Rack::Response#set_header;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[[I"[]=;To;; [; @ ; 0I" (key, v);T@ FI" Response;TcRDoc::NormalClass00PK!Ɵ5share/gems/doc/rack-2.2.4/ri/Rack/Response/write-i.rinu[U:RDoc::AnyMethod[iI" write:ETI"Rack::Response#write;TF: publico:RDoc::Markup::Document: @parts[o:RDoc::Markup::Paragraph; [I".Append to body and update Content-Length.;To:RDoc::Markup::BlankLineo; ; [I"5NOTE: Do not mix #write and direct #body access!;T: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I" (chunk);T@FI" Response;TcRDoc::NormalClass00PK!RP6share/gems/doc/rack-2.2.4/ri/Rack/Response/status-i.rinu[U:RDoc::Attr[iI" status:ETI"Rack::Response#status;TI"RW;T: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below0F@ I"Rack::Response;TcRDoc::NormalClass0PK!V}U5share/gems/doc/rack-2.2.4/ri/Rack/Response/close-i.rinu[U:RDoc::AnyMethod[iI" close:ETI"Rack::Response#close;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" Response;TcRDoc::NormalClass00PK!.7share/gems/doc/rack-2.2.4/ri/Rack/Response/headers-i.rinu[U:RDoc::Attr[iI" headers:ETI"Rack::Response#headers;TI"R;T: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below0F@ I"Rack::Response;TcRDoc::NormalClass0PK!h4share/gems/doc/rack-2.2.4/ri/Rack/Response/to_a-i.rinu[U:RDoc::AnyMethod[iI" to_a:ETI"Rack::Response#to_a;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I" (&block);T@ FI" Response;TcRDoc::NormalClass0[I"Rack::Response;TFI" finish;TPK!<9share/gems/doc/rack-2.2.4/ri/Rack/Response/%5b%5d%3d-i.rinu[U:RDoc::AnyMethod[iI"[]=:ETI"Rack::Response#[]=;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/response.rb;T:0@omit_headings_from_table_of_contents_below000[I" (key, v);T@ FI" Response;TcRDoc::NormalClass0[I"Rack::Response;TFI"set_header;TPK!}9share/gems/doc/rack-2.2.4/ri/Rack/ForwardRequest/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"Rack::ForwardRequest::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/recursive.rb;T:0@omit_headings_from_table_of_contents_below000[I"(url, env = {});T@ TI"ForwardRequest;TcRDoc::NormalClass00PK!2Hshare/gems/doc/rack-2.2.4/ri/Rack/ForwardRequest/cdesc-ForwardRequest.rinu[U:RDoc::NormalClass[iI"ForwardRequest:ETI"Rack::ForwardRequest;TI"Exception;To:RDoc::Markup::Document: @parts[o;;[o:RDoc::Markup::Paragraph;[I"GRack::ForwardRequest gets caught by Rack::Recursive and redirects ;TI"-the current request to the app at +url+.;To:RDoc::Markup::BlankLineo:RDoc::Markup::Verbatim;[I"+raise ForwardRequest.new("/not-found");T: @format0: @fileI"lib/rack/recursive.rb;T:0@omit_headings_from_table_of_contents_below0; 0;0[[ I"env;TI"R;T: publicFI"lib/rack/recursive.rb;T[ I"url;T@;F@[[[[I" class;T[[;[[I"new;T@[:protected[[: private[[I" instance;T[[;[[;[[;[[[U:RDoc::Context::Section[i0o;;[; 0;0[@I" Rack;TcRDoc::NormalModulePK!L9share/gems/doc/rack-2.2.4/ri/Rack/ForwardRequest/env-i.rinu[U:RDoc::Attr[iI"env:ETI"Rack::ForwardRequest#env;TI"R;T: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/recursive.rb;T:0@omit_headings_from_table_of_contents_below0F@ I"Rack::ForwardRequest;TcRDoc::NormalClass0PK!'9share/gems/doc/rack-2.2.4/ri/Rack/ForwardRequest/url-i.rinu[U:RDoc::Attr[iI"url:ETI"Rack::ForwardRequest#url;TI"R;T: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/recursive.rb;T:0@omit_headings_from_table_of_contents_below0F@ I"Rack::ForwardRequest;TcRDoc::NormalClass0PK!{;;Bshare/gems/doc/rack-2.2.4/ri/Rack/ContentType/cdesc-ContentType.rinu[U:RDoc::NormalClass[iI"ContentType:ETI"Rack::ContentType;TI" Object;To:RDoc::Markup::Document: @parts[o;;[ o:RDoc::Markup::Paragraph;[I"DSets the Content-Type header on responses which don't have one.;To:RDoc::Markup::BlankLineo; ;[I"Builder Usage:;To:RDoc::Markup::Verbatim;[I")use Rack::ContentType, "text/plain" ;T: @format0o; ;[I"CWhen no content type argument is provided, "text/html" is the ;TI" default.;T: @fileI"lib/rack/content_type.rb;T:0@omit_headings_from_table_of_contents_below0; 0;0[[[[I"Rack::Utils;To;;[; @;0I"lib/rack/content_type.rb;T[[I" class;T[[: public[[I"new;T@$[:protected[[: private[[I" instance;T[[;[[I" call;T@$[;[[;[[[U:RDoc::Context::Section[i0o;;[; 0;0[@I" Rack;TcRDoc::NormalModulePK!ה6share/gems/doc/rack-2.2.4/ri/Rack/ContentType/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"Rack::ContentType::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/content_type.rb;T:0@omit_headings_from_table_of_contents_below000[I"&(app, content_type = "text/html");T@ FI"ContentType;TcRDoc::NormalClass00PK!_W7share/gems/doc/rack-2.2.4/ri/Rack/ContentType/call-i.rinu[U:RDoc::AnyMethod[iI" call:ETI"Rack::ContentType#call;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/content_type.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@ FI"ContentType;TcRDoc::NormalClass00PK!<` 3''4share/gems/doc/rack-2.2.4/ri/Rack/ETag/cdesc-ETag.rinu[U:RDoc::NormalClass[iI" ETag:ETI"Rack::ETag;TI" Object;To:RDoc::Markup::Document: @parts[o;;[ o:RDoc::Markup::Paragraph;[I"=Automatically sets the ETag header on all String bodies.;To:RDoc::Markup::BlankLineo; ;[I"PThe ETag header is skipped if ETag or Last-Modified headers are sent or if ;TI"La sendfile body (body.responds_to :to_path) is given (since such cases ;TI"(should be handled by apache/nginx).;T@o; ;[I"OOn initialization, you can pass two parameters: a Cache-Control directive ;TI"Lused when Etag is absent and a directive when it is present. The first ;TI"Xdefaults to nil, while the second defaults to "max-age=0, private, must-revalidate";T: @fileI"lib/rack/etag.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[U:RDoc::Constant[iI"ETAG_STRING;TI"Rack::ETag::ETAG_STRING;T: public0o;;[; @; 0@@cRDoc::NormalClass0U; [iI"DEFAULT_CACHE_CONTROL;TI"&Rack::ETag::DEFAULT_CACHE_CONTROL;T;0o;;[; @; 0@@@%0[[[I" class;T[[;[[I"new;TI"lib/rack/etag.rb;T[:protected[[: private[[I" instance;T[[;[[I" call;T@5[;[[;[ [I"digest_body;T@5[I"etag_body?;T@5[I"etag_status?;T@5[I"skip_caching?;T@5[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I" Rack;TcRDoc::NormalModulePK!s$$/share/gems/doc/rack-2.2.4/ri/Rack/ETag/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"Rack::ETag::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/etag.rb;T:0@omit_headings_from_table_of_contents_below000[I"I(app, no_cache_control = nil, cache_control = DEFAULT_CACHE_CONTROL);T@ FI" ETag;TcRDoc::NormalClass00PK! 67share/gems/doc/rack-2.2.4/ri/Rack/ETag/digest_body-i.rinu[U:RDoc::AnyMethod[iI"digest_body:ETI"Rack::ETag#digest_body;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/etag.rb;T:0@omit_headings_from_table_of_contents_below000[I" (body);T@ FI" ETag;TcRDoc::NormalClass00PK!Ծ/:share/gems/doc/rack-2.2.4/ri/Rack/ETag/etag_status%3f-i.rinu[U:RDoc::AnyMethod[iI"etag_status?:ETI"Rack::ETag#etag_status?;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/etag.rb;T:0@omit_headings_from_table_of_contents_below000[I" (status);T@ FI" ETag;TcRDoc::NormalClass00PK!lH;share/gems/doc/rack-2.2.4/ri/Rack/ETag/skip_caching%3f-i.rinu[U:RDoc::AnyMethod[iI"skip_caching?:ETI"Rack::ETag#skip_caching?;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/etag.rb;T:0@omit_headings_from_table_of_contents_below000[I"(headers);T@ FI" ETag;TcRDoc::NormalClass00PK!lG0share/gems/doc/rack-2.2.4/ri/Rack/ETag/call-i.rinu[U:RDoc::AnyMethod[iI" call:ETI"Rack::ETag#call;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/etag.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@ FI" ETag;TcRDoc::NormalClass00PK!M8share/gems/doc/rack-2.2.4/ri/Rack/ETag/etag_body%3f-i.rinu[U:RDoc::AnyMethod[iI"etag_body?:ETI"Rack::ETag#etag_body?;TF: privateo:RDoc::Markup::Document: @parts[: @fileI"lib/rack/etag.rb;T:0@omit_headings_from_table_of_contents_below000[I" (body);T@ FI" ETag;TcRDoc::NormalClass00PK!8share/gems/doc/rack-2.2.4/ri/Rack/ContentLength/new-c.rinu[U:RDoc::AnyMethod[iI"new:ETI"Rack::ContentLength::new;TT: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/content_length.rb;T:0@omit_headings_from_table_of_contents_below000[I" (app);T@ FI"ContentLength;TcRDoc::NormalClass00PK!e Fshare/gems/doc/rack-2.2.4/ri/Rack/ContentLength/cdesc-ContentLength.rinu[U:RDoc::NormalClass[iI"ContentLength:ETI"Rack::ContentLength;TI" Object;To:RDoc::Markup::Document: @parts[o;;[o:RDoc::Markup::Paragraph;[ I"ESets the Content-Length header on responses that do not specify ;TI"Ca Content-Length or Transfer-Encoding header. Note that this ;TI"@does not fix responses that have an invalid Content-Length ;TI"header specified.;T: @fileI"lib/rack/content_length.rb;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[I"Rack::Utils;To;;[; @; 0I"lib/rack/content_length.rb;T[[I" class;T[[: public[[I"new;T@[:protected[[: private[[I" instance;T[[; [[I" call;T@[; [[;[[[U:RDoc::Context::Section[i0o;;[; 0; 0[@I" Rack;TcRDoc::NormalModulePK!9share/gems/doc/rack-2.2.4/ri/Rack/ContentLength/call-i.rinu[U:RDoc::AnyMethod[iI" call:ETI"Rack::ContentLength#call;TF: publico:RDoc::Markup::Document: @parts[: @fileI"lib/rack/content_length.rb;T:0@omit_headings_from_table_of_contents_below000[I" (env);T@ FI"ContentLength;TcRDoc::NormalClass00PK!Qzz7share/gems/doc/ruby-lsapi-5.7/ri/Kernel/cdesc-Kernel.rinu[U:RDoc::NormalModule[iI" Kernel:ET@0o:RDoc::Markup::Document: @parts[: @file0:0@omit_headings_from_table_of_contents_below0[[[[[I" class;T[[: public[[:protected[[: private[[I" instance;T[[; [[I"eval_string_wrap;TI"ext/lsapi/lsruby.c;T[; [[; [[[U:RDoc::Context::Section[i0o;;[; 0; 0[I"ext/lsapi/lsruby.c;T@*cRDoc::TopLevelPK!yW֌[[=share/gems/doc/ruby-lsapi-5.7/ri/Kernel/eval_string_wrap-i.rinu[U:RDoc::AnyMethod[iI"eval_string_wrap:ETI"Kernel#eval_string_wrap;TF: publico:RDoc::Markup::Document: @parts[ o:RDoc::Markup::Verbatim; [ I"2 static int chdir_file( const char * pFile ) ;TI" { ;TI"+ char * p = strrchr( pFile, '/' ); ;TI" int ret; ;TI" if ( !p ) ;TI" return -1; ;TI" p = 0; ;T: @format0o:RDoc::Markup::Paragraph; [I"ret = chdir( pFile );;To; ; [I"p = '/'; ;T; 0o; ; [I"return ret; ;TI"};T: @fileI"ext/lsapi/lsruby.c;T:0@omit_headings_from_table_of_contents_below000[I" (p1);T@FI" Kernel;TcRDoc::NormalModule00PK!@)share/gems/doc/ruby-lsapi-5.7/ri/cache.rinu[{:ancestors{I" LSAPI:ET[I" Object;T@ [I"BasicObject;T:attributes{:class_methods{@[ I" accept;TI"accept_new_connection;TI"postfork_child;TI"postfork_parent;T:c_class_variables{ I"ext/lsapi/lsapidef.h;T{I"ext/lsapi/lsapilib.c;T{I"ext/lsapi/lsapilib.h;T{I"ext/lsapi/lsruby.c;T{I" cLSAPI;TI" LSAPI;TI"rb_cObject;T@ I"rb_mKernel;TI" Kernel;T: c_singleton_class_variables{ @{@{@{@{: encodingIu: Encoding UTF-8;F:instance_methods{@[I"<<;TI" binmode;TI" close;TI" each;TI"eof;TI" eof?;TI" flush;TI" getc;TI" gets;TI" isatty;TI" print;TI" printf;TI" process;TI" putc;TI" puts;TI" read;TI" readline;TI" reopen;TI" rewind;TI" sync;TI" sync=;TI" tty?;TI" write;T@ [I"eval_string_wrap;T: main0: modules[@ @@ : pages[I" README;TI"ext/lsapi/Makefile;T: titleI"!ruby-lsapi-5.7 Documentation;TPK!l[--;share/gems/doc/ruby-lsapi-5.7/ri/ext/lsapi/page-Makefile.rinu[U:RDoc::TopLevel[ iI"ext/lsapi/Makefile:ETcRDoc::Parser::Simpleo:RDoc::Markup::Document: @parts[$o:RDoc::Markup::Paragraph;[I"SHELL = /bin/sh;To:RDoc::Markup::BlankLineo; ;[ I"9# V=0 quiet, V=1 verbose. other values don't work. ;TI" V = 1 ;TI"Q1 = $(V:1=) ;TI"Q = $(Q1:0=@) ;TI"ECHO1 = $(V:1=@ :) ;TI"ECHO = $(ECHO1:0=@ echo) ;TI"NULLCMD = :;T@o; ;[I"5#### Start of system configuration section. ####;T@o; ;[7I"srcdir = . ;TI"5topdir = /opt/cpanel/ea-ruby27/root/usr/include ;TI"hdrdir = $(topdir) ;TI":arch_hdrdir = /opt/cpanel/ea-ruby27/root/usr/include ;TI"PATH_SEPARATOR = : ;TI":VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby ;TI"7prefix = $(DESTDIR)/opt/cpanel/ea-ruby27/root/usr ;TI">rubysitearchprefix = $(sitearchlibdir)/$(RUBY_BASE_NAME) ;TI"Jrubyarchprefix = $(DESTDIR)/opt/cpanel/ea-ruby27/root/usr/lib64/ruby ;TI"/rubylibprefix = $(exec_prefix)/share/ruby ;TI"rubyarchdir = $(rubyarchprefix)/$(ruby_version_dir_name) ;TI"localstatedir = $(DESTDIR)/opt/cpanel/ea-ruby27/root/var ;TI"Csharedstatedir = $(DESTDIR)/opt/cpanel/ea-ruby27/root/var/lib ;TI";sysconfdir = $(DESTDIR)/opt/cpanel/ea-ruby27/root/etc ;TI">datadir = $(DESTDIR)/opt/cpanel/ea-ruby27/root/usr/share ;TI"#datarootdir = $(prefix)/share ;TI"Clibexecdir = $(DESTDIR)/opt/cpanel/ea-ruby27/root/usr/libexec ;TI"=sbindir = $(DESTDIR)/opt/cpanel/ea-ruby27/root/usr/sbin ;TI"!bindir = $(exec_prefix)/bin ;TI"archdir = $(rubyarchdir);T@o; ;[I"CC_WRAPPER = ;TI"CC = gcc ;TI"CXX = g++ ;TI"LIBRUBY = $(LIBRUBY_SO) ;TI"-LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a ;TI"+LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME) ;TI">LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static $(MAINLIBS) ;TI" empty = ;TI"OUTFLAG = -o $(empty) ;TI"COUTFLAG = -o $(empty) ;TI"CSRCFLAG = $(empty);T@o; ;[I"RUBY_EXTCONF_H = ;TI"7cflags = $(optflags) $(debugflags) $(warnflags) ;TI"cxxflags = ;TI"optflags = -O3 ;TI"debugflags = -ggdb3 ;TI"*warnflags = -Wall -Wextra -Wdeprecated-declarations -Wduplicated-cond -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wwrite-strings -Wimplicit-fallthrough=0 -Wmissing-noreturn -Wno-cast-function-type -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-packed-bitfield-compat -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wsuggest-attribute=format -Wsuggest-attribute=noreturn -Wunused-variable ;TI"cppflags = ;TI"CCDLFLAGS = -fPIC ;TI"vCFLAGS = $(CCDLFLAGS) -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -fPIC $(ARCH_FLAG) ;TI"WINCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir)/ruby/backward -I$(hdrdir) -I$(srcdir) ;TI"DEFS = ;TI"/CPPFLAGS = $(DEFS) $(cppflags) -DRUBY_2 ;TI"pCXXFLAGS = $(CCDLFLAGS) -O2 -g -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -fexceptions -fstack-protector-strong -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection $(ARCH_FLAG) ;TI"{ldflags = -L. -Wl,-rpath=/opt/cpanel/ea-ruby27/root/usr/lib64 -fstack-protector-strong -rdynamic -Wl,-export-dynamic ;TI"Adldflags = -Wl,-rpath=/opt/cpanel/ea-ruby27/root/usr/lib64 ;TI"ARCH_FLAG = -m64 ;TI"4DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG) ;TI"LDSHARED = $(CC) -shared ;TI"!LDSHAREDXX = $(CXX) -shared ;TI" AR = ar ;TI"EXEEXT = ;T@o; ;[ I"+RUBY_INSTALL_NAME = $(RUBY_BASE_NAME) ;TI"RUBY_SO_NAME = ruby ;TI"RUBYW_INSTALL_NAME = ;TI"DRUBY_VERSION_NAME = $(RUBY_BASE_NAME)-$(ruby_version_dir_name) ;TI"RUBYW_BASE_NAME = rubyw ;TI"RUBY_BASE_NAME = ruby;T@o; ;[ I"arch = x86_64-linux ;TI"sitearch = $(arch) ;TI"ruby_version = 2.7.0 ;TI"(ruby = $(bindir)/$(RUBY_BASE_NAME) ;TI"RUBY = $(ruby) ;TI"-BUILTRUBY = $(bindir)/$(RUBY_BASE_NAME) ;TI"ruby_headers = $(hdrdir)/ruby.h $(hdrdir)/ruby/backward.h $(hdrdir)/ruby/ruby.h $(hdrdir)/ruby/defines.h $(hdrdir)/ruby/missing.h $(hdrdir)/ruby/intern.h $(hdrdir)/ruby/st.h $(hdrdir)/ruby/subst.h $(arch_hdrdir)/ruby/config.h;T@o; ;[I"RM = rm -f ;TI"'RM_RF = $(RUBY) -run -e rm -- -rf ;TI"2RMDIRS = rmdir --ignore-fail-on-non-empty -p ;TI""MAKEDIRS = /usr/bin/mkdir -p ;TI"#INSTALL = /usr/bin/install -c ;TI"'INSTALL_PROG = $(INSTALL) -m 0755 ;TI"&INSTALL_DATA = $(INSTALL) -m 644 ;TI"COPY = cp ;TI"TOUCH = exit >;T@o; ;[I"3#### End of system configuration section. ####;T@o; ;[ I"preload = ;TI"libpath = . $(archlibdir) ;TI"$LIBPATH = -L. -L$(archlibdir) ;TI"DEFFILE = ;T@o; ;[I"CLEANFILES = mkmf.log ;TI"DISTCLEANFILES = ;TI"DISTCLEANDIRS = ;T@o; ;[I"extout = ;TI"extout_prefix = ;TI"target_prefix = ;TI"LOCAL_LIBS = ;TI",LIBS = $(LIBRUBYARG_SHARED) -lm -lc ;TI"%ORIG_SRCS = lsapilib.c lsruby.c ;TI"SRCS = $(ORIG_SRCS) ;TI" OBJS = lsapilib.o lsruby.o ;TI"6HDRS = $(srcdir)/lsapidef.h $(srcdir)/lsapilib.h ;TI"LOCAL_HDRS = ;TI"TARGET = lsapi ;TI"TARGET_NAME = lsapi ;TI"(TARGET_ENTRY = Init_$(TARGET_NAME) ;TI"DLLIB = $(TARGET).so ;TI"EXTSTATIC = ;TI"STATIC_LIB = ;T@o; ;[I"TIMESTAMP_DIR = . ;TI"BINDIR = $(bindir) ;TI"0RUBYCOMMONDIR = $(sitedir)$(target_prefix) ;TI"3RUBYLIBDIR = $(sitelibdir)$(target_prefix) ;TI"4RUBYARCHDIR = $(sitearchdir)$(target_prefix) ;TI"8HDRDIR = $(rubyhdrdir)/ruby$(target_prefix) ;TI"@ARCHHDRDIR = $(rubyhdrdir)/$(arch)/ruby$(target_prefix) ;TI"TARGET_SO_DIR = ;TI".TARGET_SO = $(TARGET_SO_DIR)$(DLLIB) ;TI"#CLEANLIBS = $(TARGET_SO) ;TI"CLEANOBJS = *.o *.bak;T@o; ;[ I"all: $(DLLIB) ;TI"static: $(STATIC_LIB) ;TI"6.PHONY: all install static install-so install-rb ;TI"1.PHONY: clean clean-so clean-static clean-rb;T@o:RDoc::Markup::List: @type: NOTE: @items[o:RDoc::Markup::ListItem: @label[ I"clean-static;TI"clean-rb-default;TI" clean-rb;TI" clean-so;T;[o; ;[I";clean: clean-so clean-static clean-rb-default clean-rb;To:RDoc::Markup::Verbatim;[I"@-$(Q)$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES) .*.time ;T: @format0o; ; ; ;[o;;[ I"distclean-rb-default;TI"distclean-rb;TI"distclean-so;TI"distclean-static;T;[/o; ;[I"Udistclean: clean distclean-so distclean-static distclean-rb-default distclean-rb;To;;[I"?-$(Q)$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log ;TI"8-$(Q)$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES) ;TI":-$(Q)$(RMDIRS) $(DISTCLEANDIRS) 2> /dev/null || true ;T;0o; ;[I"realclean: distclean ;TI"#install: install-so install-rb;T@o; ;[I"z2share/gems/doc/ruby-lsapi-5.7/ri/LSAPI/accept-c.rinu[U:RDoc::AnyMethod[iI" accept:ETI"LSAPI::accept;TT: publico:RDoc::Markup::Document: @parts[: @fileI"ext/lsapi/lsruby.c;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" LSAPI;TcRDoc::NormalClass00PK!~0share/gems/doc/ruby-lsapi-5.7/ri/LSAPI/getc-i.rinu[U:RDoc::AnyMethod[iI" getc:ETI"LSAPI#getc;TF: publico:RDoc::Markup::Document: @parts[: @fileI"ext/lsapi/lsruby.c;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" LSAPI;TcRDoc::NormalClass00PK!O 3share/gems/doc/ruby-lsapi-5.7/ri/LSAPI/process-i.rinu[U:RDoc::AnyMethod[iI" process:ETI"LSAPI#process;TF: publico:RDoc::Markup::Document: @parts[: @fileI"ext/lsapi/lsruby.c;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" LSAPI;TcRDoc::NormalClass00PK!3II5share/gems/doc/ruby-lsapi-5.7/ri/LSAPI/cdesc-LSAPI.rinu[U:RDoc::NormalClass[iI" LSAPI:ET@I" Object;To:RDoc::Markup::Document: @parts[o;;[: @fileI"ext/lsapi/lsruby.c;T:0@omit_headings_from_table_of_contents_below0; 0; 0[[[[[I" class;T[[: public[ [I" accept;TI"ext/lsapi/lsruby.c;T[I"accept_new_connection;T@[I"postfork_child;T@[I"postfork_parent;T@[:protected[[: private[[I" instance;T[[; [[I"<<;T@[I" binmode;T@[I" close;T@[I" each;T@[I"eof;T@[I" eof?;T@[I" flush;T@[I" getc;T@[I" gets;T@[I" isatty;T@[I" print;T@[I" printf;T@[I" process;T@[I" putc;T@[I" puts;T@[I" read;T@[I" readline;T@[I" reopen;T@[I" rewind;T@[I" sync;T@[I" sync=;T@[I" tty?;T@[I" write;T@[; [[; [[[U:RDoc::Context::Section[i0o;;[; 0; 0[@ @ cRDoc::TopLevelPK! T=0share/gems/doc/ruby-lsapi-5.7/ri/LSAPI/gets-i.rinu[U:RDoc::AnyMethod[iI" gets:ETI"LSAPI#gets;TF: publico:RDoc::Markup::Document: @parts[: @fileI"ext/lsapi/lsruby.c;T:0@omit_headings_from_table_of_contents_below000[I"();T@ FI" LSAPI;TcRDoc::NormalClass00PK!:gy>/share/gems/doc/ruby-lsapi-5.7/ri/page-README.rinu[U:RDoc::TopLevel[ iI" README:ETcRDoc::Parser::Simpleo:RDoc::Markup::Document: @parts[Mo:RDoc::Markup::Paragraph;[I"%lsapi - LSAPI extension for Ruby;TS:RDoc::Markup::Heading: leveli%: textI";To:RDoc::Markup::BlankLineo; ;[I" INSTALL;TS:RDoc::Markup::Rule: weighti @o:RDoc::Markup::Verbatim;[I"$ ruby setup.rb config ;TI"$ ruby setup.rb setup ;TI"# ruby setup.rb install ;T: @format0o; ;[I" USAGE;TS;;i@o; ;[ I"General CGI scripts ;TI"^^^^^^^^^^^^^^^^^^^ ;TI"SThe most efficient way to use LSAPI interface is to modify your CGI scripts. ;TI" ;TI" ... ;TI" ;TI" end ;T;0o; ;[I"LThere is no need to change the way that how CGI environment variables ;TI"(are being accessed in your scripts.;T@o; ;[I"7You can find some examples under examples/ folder.;T@o; ;[ I"Ruby Script Runner ;TI"^^^^^^^^^^^^^^^^^^ ;TI"OIf you don't want to change your existing Ruby CGI code, you can use our ;TI"FRuby script runner under scripts/ folder. You need to configure ;TI"Ilsruby_runner.rb as a LSAPI application, then add a script handler ;TI"for "rb" suffix.;T@@o; ;[I"Rails dispatcher ;TI"^^^^^^^^^^^^^^^^;T@o; ;[I"RWith Ruby LSAPI, we proudly provide a optimum platform for Rails application ;TI"Ndeployment. Ruby LSAPI has the following advantages over other solutions.;T@o;;[ I"M* Easy configuration, deploy a Rails application only take a few clicks ;TI") with our Rails easy configuration ;TI"M* Fast startup, the expensive Rails framework initialization only takes ;TI"= place once when multiple processes need to be started ;TI"J* Resource efficience, ruby processes can be started on demand, idle ;TI" process will be stop. ;T;0o; ;[I"DTo use LSAPI with Ruby on Rails, please check out our toturial ;TI"7http://www.litespeedtech.com/support/wiki/doku.php;T@o; ;[I"MThere are a few environment variables that can be tweaked to tune ruby ;TI"LSAPI process.;T@o:RDoc::Markup::List: @type: BULLET: @items[o:RDoc::Markup::ListItem: @label0;[o; ;[I"/LSAPI_CHILDREN (default: 0);T@o; ;[ I"MLSAPI_CHILDREN controls the maximum number of children processes can be ;TI"Ostarted by the first ruby process started by web server. When set to <=1, ;TI"Pthe first ruby process will handle request by itself, without starting any ;TI"Rchild process. When LSAPI_CHILDREN is >1, the LSAPI application is stared in ;TI"O"Self Managed Mode", which will start children processes based on demand. ;TI"JWith Rails easy configuration, LSAPI_CHILDREN is set to the value of ;TI"C"Max Connections" by web server, no need to set it explicitly.;T@o; ;[I"OUsually, there is no need to set value of LSAPI_CHILDREN over 100 in most ;TI"server environment.;T@o;;;;[o;;0;[o; ;[I"/LSAPI_AVOID_FORK (default: 0);T@o; ;[ I"NLSAPI_AVOID_FORK specifies the policy of the internal process manager in ;TI"P"Self Managed Mode". When set to 0, the internal process manager will stop ;TI"Kand start children process on demand to save system resource. This is ;TI"Lpreferred in a shared hosting environment. When set to 1, the internal ;TI"Pprocess manager will try to avoid freqently stopping and starting children ;TI"Hprocess. This might be preferred in a dedicate hosting environment.;T@o;;;;[o;;0;[o; ;[I"HLSAPI_EXTRA_CHILDREN (default: 1/3 of LSAPI_CHILDREN or 0);T@o; ;[ I"RLSAPI_EXTRA_CHILDREN controls the maximum number of extra children processes ;TI"Hcan be started when some or all existing children processes are in ;TI"Qmalfunctioning state. Total number of children processes will be reduced to ;TI"@LSAPI_CHILDREN level as soon as service is back to normal. ;TI"DWhen LSAPI_AVOID_FORK is set to 0, the default value is 1/3 of ;TI"OLSAPI_CHIDLREN, When LSAPI_AVOID_FORK is set to 1, the default value is 0.;T@o;;;;[o;;0;[o; ;[I"9LSAPI_MAX_REQS (default value: 10000);T@o; ;[I"HLSAPI_MAX_REQS specifies the maximum number of requests each child ;TI"Kprocess will handle before it exits automatically. This parameter can ;TI"Phelp reducing memory usage when there are memory leaks in the application. ;T@o;;;;[o;;0;[o; ;[I"?LSAPI_MAX_IDLE (default value: 300 seconds);T@o; ;[I"HIn Self Managed Mode, LSAPI_MAX_IDLE controls how long a idle child;T@o; ;[I"Hprocess will wait for a new request before exit. This option help ;TI"8releasing system resources taken by idle processes.;T@o;;;;[o;;0;[o; ;[I"LSAPI_MAX_IDLE_CHILDREN;To;;[I">(default value: 1/3 of LSAPI_CHILDREN or LSAPI_CHILDREN) ;T;0o; ;[ I"JIn Self Managed Mode, LSAI_MAX_IDLE_CHILDREN controls how many idle ;TI"Gchildren processes are allowed. Excessive idle children processes ;TI"+will be killed by the parent process. ;TI"DWhen LSAPI_AVOID_FORK is set to 0, the default value is 1/3 of ;TI"JLSAPI_CHIDLREN, When LSAPI_AVOID_FORK is set to 1, the default value ;TI"is LSAPI_CHILDREN.;T@o;;;;[o;;0;[o; ;[I"?LSAPI_MAX_PROCESS_TIME (default value: 300 seconds);T@o; ;[ I"HIn Self Managed Mode, LSAPI_MAX_PROCESS_TIME controls the maximum ;TI"Kprocessing time allowed when processing a request. If a child process ;TI"Jcan not finish processing of a request in the given time period, it ;TI"Mwill be killed by the parent process. This option can help getting rid ;TI"&of dead or runaway child process.;T@o;;;;[o;;0;[o; ;[I")) (Japanese);To;;0;[o; ;[I"@(()) (English);T@o; ;[I"Copyright;TS;;i @o; ;[I"4Copyright (C) 2006 Lite Speed Technologies Inc.;T: @file@:0@omit_headings_from_table_of_contents_below0PK!GB N7share/gems/doc/ruby-lsapi-5.7/ri/Object/cdesc-Object.rinu[U:RDoc::NormalClass[iI" Object:ET@I"BasicObject;To:RDoc::Markup::Document: @parts[: @file0:0@omit_headings_from_table_of_contents_below0[[U:RDoc::Constant[iI" STDERR;TI"Object::STDERR;T: public0o;;[; I"ext/lsapi/lsruby.c;T; 0@@cRDoc::NormalClass0U; [iI"ENV;TI"Object::ENV;T; 0o;;[o:RDoc::Markup::Paragraph;[I"Nredefine ENV using a hash table, should be faster than char **environment;To:RDoc::Markup::BlankLine; @; 0@@@0[[[I" class;T[[; [[:protected[[: private[[I" instance;T[[; [[;[[;[[[U:RDoc::Context::Section[i0o;;[; 0; 0[@@cRDoc::TopLevelPK!CP>>lib.podnu6$PK! OO>lib.pmnu6$PK!D ]bin/rackupnuȯPK!͟E+lib64/gems/ruby/ruby-lsapi-5.7/gem_make.outnu[PK!1lib64/gems/ruby/ruby-lsapi-5.7/gem.build_completenu[PK!'ثث'lib64/gems/ruby/ruby-lsapi-5.7/lsapi.sonuȯPK!O '/lib64/gems/ruby/ruby-lsapi-5.7/mkmf.lognu[PK!K%,tshare/gems/specifications/rack-2.2.4.gemspecnu[PK!io#0share/gems/specifications/ruby-lsapi-5.7.gemspecnu[PK!)+UU%share/gems/gems/rack-2.2.4/bin/rackupnuȯPK!8 '\share/gems/gems/rack-2.2.4/CHANGELOG.mdnu[PK!12ff-Mshare/gems/gems/rack-2.2.4/example/lobster.runu[PK!Z6sNshare/gems/gems/rack-2.2.4/example/protectedlobster.rbnu[PK!P&K6Pshare/gems/gems/rack-2.2.4/example/protectedlobster.runu[PK!$'Qshare/gems/gems/rack-2.2.4/rack.gemspecnu[PK!gs.s.&Xshare/gems/gems/rack-2.2.4/README.rdocnu[PK!L+نshare/gems/gems/rack-2.2.4/contrib/rdoc.cssnu[PK!qsAA0ѣshare/gems/gems/rack-2.2.4/contrib/rack_logo.svgnu[PK!1X_._.+#share/gems/gems/rack-2.2.4/contrib/rack.svgnu[PK!Nź\\+share/gems/gems/rack-2.2.4/contrib/rack.pngnu[PK!4TT&5rshare/gems/gems/rack-2.2.4/MIT-LICENSEnu[PK!..&vshare/gems/gems/rack-2.2.4/lib/rack.rbnu[PK!K,0share/gems/gems/rack-2.2.4/lib/rack/files.rbnu[PK!V.share/gems/gems/rack-2.2.4/lib/rack/version.rbnu[PK!c,,6share/gems/gems/rack-2.2.4/lib/rack/method_override.rbnu[PK! .share/gems/gems/rack-2.2.4/lib/rack/chunked.rbnu[PK!ߺww3share/gems/gems/rack-2.2.4/lib/rack/handler/scgi.rbnu[PK!٥CC3~share/gems/gems/rack-2.2.4/lib/rack/handler/thin.rbnu[PK! 3$share/gems/gems/rack-2.2.4/lib/rack/handler/lsws.rbnu[PK! 6share/gems/gems/rack-2.2.4/lib/rack/handler/fastcgi.rbnu[PK!O !2xshare/gems/gems/rack-2.2.4/lib/rack/handler/cgi.rbnu[PK!M6share/gems/gems/rack-2.2.4/lib/rack/handler/webrick.rbnu[PK!qQ-share/gems/gems/rack-2.2.4/lib/rack/events.rbnu[PK!kNN.share/gems/gems/rack-2.2.4/lib/rack/request.rbnu[PK!E/Pshare/gems/gems/rack-2.2.4/lib/rack/deflater.rbnu[PK!+uu.dshare/gems/gems/rack-2.2.4/lib/rack/runtime.rbnu[PK!82hshare/gems/gems/rack-2.2.4/lib/rack/null_logger.rbnu[PK!t-꟯ 2mshare/gems/gems/rack-2.2.4/lib/rack/show_status.rbnu[PK!JO} } .{share/gems/gems/rack-2.2.4/lib/rack/handler.rbnu[PK!Lź5share/gems/gems/rack-2.2.4/lib/rack/session/cookie.rbnu[PK!  3՞share/gems/gems/rack-2.2.4/lib/rack/session/pool.rbnu[PK!vn7:share/gems/gems/rack-2.2.4/lib/rack/session/memcache.rbnu[PK!`};};:share/gems/gems/rack-2.2.4/lib/rack/session/abstract/id.rbnu[PK!|O2GG,mshare/gems/gems/rack-2.2.4/lib/rack/utils.rbnu[PK!Zs@+j- share/gems/gems/rack-2.2.4/lib/rack/head.rbnu[PK!x0/ share/gems/gems/rack-2.2.4/lib/rack/directory.rbnu[PK!3.5.5-G share/gems/gems/rack-2.2.4/lib/rack/server.rbnu[PK!ydy y /P} share/gems/gems/rack-2.2.4/lib/rack/reloader.rbnu[PK!v+( share/gems/gems/rack-2.2.4/lib/rack/etag.rbnu[PK!/KII- share/gems/gems/rack-2.2.4/lib/rack/static.rbnu[PK!OW޹ : share/gems/gems/rack-2.2.4/lib/rack/multipart/generator.rbnu[PK!cY(>ص share/gems/gems/rack-2.2.4/lib/rack/multipart/uploaded_file.rbnu[PK!]> -(-(7A share/gems/gems/rack-2.2.4/lib/rack/multipart/parser.rbnu[PK!UE 6 share/gems/gems/rack-2.2.4/lib/rack/conditional_get.rbnu[PK!ox.2 share/gems/gems/rack-2.2.4/lib/rack/cascade.rbnu[PK!mZ05056s share/gems/gems/rack-2.2.4/lib/rack/show_exceptions.rbnu[PK!m&0 / share/gems/gems/rack-2.2.4/lib/rack/recursive.rbnu[PK!ܼŚ6i6 share/gems/gems/rack-2.2.4/lib/rack/tempfile_reaper.rbnu[PK!\e e 7d9 share/gems/gems/rack-2.2.4/lib/rack/rewindable_input.rbnu[PK!,]3360E share/gems/gems/rack-2.2.4/lib/rack/core_ext/regexp.rbnu[PK!*k/F share/gems/gems/rack-2.2.4/lib/rack/sendfile.rbnu[PK!!3-!-!+\ share/gems/gems/rack-2.2.4/lib/rack/mock.rbnu[PK!D-|~ share/gems/gems/rack-2.2.4/lib/rack/logger.rbnu[PK!۷_B B 0Y share/gems/gems/rack-2.2.4/lib/rack/multipart.rbnu[PK!z 4 share/gems/gems/rack-2.2.4/lib/rack/common_logger.rbnu[PK!l9? .1 share/gems/gems/rack-2.2.4/lib/rack/builder.rbnu[PK!uc c 6a share/gems/gems/rack-2.2.4/lib/rack/auth/digest/md5.rbnu[PK!ٓ:* share/gems/gems/rack-2.2.4/lib/rack/auth/digest/request.rbnu[PK!q8] share/gems/gems/rack-2.2.4/lib/rack/auth/digest/nonce.rbnu[PK!XGG9 share/gems/gems/rack-2.2.4/lib/rack/auth/digest/params.rbnu[PK!fmRX1f share/gems/gems/rack-2.2.4/lib/rack/auth/basic.rbnu[PK!#8AA< share/gems/gems/rack-2.2.4/lib/rack/auth/abstract/request.rbnu[PK!^..<` share/gems/gems/rack-2.2.4/lib/rack/auth/abstract/handler.rbnu[PK!aGi{{+ share/gems/gems/rack-2.2.4/lib/rack/lint.rbnu[PK!hcc3\ share/gems/gems/rack-2.2.4/lib/rack/query_parser.rbnu[PK!Z  -w share/gems/gems/rack-2.2.4/lib/rack/urlmap.rbnu[PK!CXX+? share/gems/gems/rack-2.2.4/lib/rack/file.rbnu[PK!š3 share/gems/gems/rack-2.2.4/lib/rack/content_type.rbnu[PK!P91 share/gems/gems/rack-2.2.4/lib/rack/body_proxy.rbnu[PK!i\-x share/gems/gems/rack-2.2.4/lib/rack/config.rbnu[PK!󸐷1o share/gems/gems/rack-2.2.4/lib/rack/media_type.rbnu[PK!ԍ.h share/gems/gems/rack-2.2.4/lib/rack/lobster.rbnu[PK! |+ share/gems/gems/rack-2.2.4/lib/rack/lock.rbnu[PK!?5ğ share/gems/gems/rack-2.2.4/lib/rack/content_length.rbnu[PK!h##/ share/gems/gems/rack-2.2.4/lib/rack/response.rbnu[PK! Տ+= share/gems/gems/rack-2.2.4/lib/rack/mime.rbnu[PK!gmD #'I share/gems/gems/rack-2.2.4/Rakefilenu[PK!88$W share/gems/gems/rack-2.2.4/SPEC.rdocnu[PK!%m+ *$ share/gems/gems/rack-2.2.4/CONTRIBUTING.mdnu[PK!##BB'} share/gems/gems/ruby-lsapi-5.7/setup.rbnu[PK!sHH7+ share/gems/gems/ruby-lsapi-5.7/scripts/lsruby_runner.rbnuȯPK! \i$i$1/ share/gems/gems/ruby-lsapi-5.7/ext/lsapi/Makefilenu[PK!G,=333T share/gems/gems/ruby-lsapi-5.7/ext/lsapi/lsapidef.hnu[PK!:%g share/gems/gems/ruby-lsapi-5.7/ext/lsapi/.sitearchdir.timenu[PK!6}[[1g share/gems/gems/ruby-lsapi-5.7/ext/lsapi/lsruby.cnu[PK!x{<<3 share/gems/gems/ruby-lsapi-5.7/ext/lsapi/extconf.rbnu[PK!0L;1! share/gems/gems/ruby-lsapi-5.7/ext/lsapi/lsruby.onu[PK!'ثث1share/gems/gems/ruby-lsapi-5.7/ext/lsapi/lsapi.sonuȯPK! 3O8aa3Lshare/gems/gems/ruby-lsapi-5.7/ext/lsapi/lsapilib.cnu[PK!Y//3share/gems/gems/ruby-lsapi-5.7/ext/lsapi/lsapilib.hnu[PK!b@((3Nshare/gems/gems/ruby-lsapi-5.7/ext/lsapi/lsapilib.onu[PK!3Bxshare/gems/gems/ruby-lsapi-5.7/rails/dispatch.lsapinuȯPK!G9zshare/gems/gems/ruby-lsapi-5.7/examples/lsapi_with_cgi.rbnuȯPK!M4{share/gems/gems/ruby-lsapi-5.7/examples/testlsapi.rbnuȯPK!{8,U}share/gems/gems/ruby-lsapi-5.7/lsapi.gemspecnu[PK!^wͱ%:share/gems/gems/ruby-lsapi-5.7/READMEnu[PK!9ʹPP@share/gems/cache/rack-2.2.4.gemnu[PK!|x#share/gems/cache/ruby-lsapi-5.7.gemnu[PK!äGshare/gems/doc/rack-2.2.4/ri/WEBrick/HTTPResponse/cdesc-HTTPResponse.rinu[PK!B;;Cshare/gems/doc/rack-2.2.4/ri/WEBrick/HTTPResponse/setup_header-i.rinu[PK!ͣ;share/gems/doc/rack-2.2.4/ri/WEBrick/HTTPResponse/rack-i.rinu[PK!ֵNNIshare/gems/doc/rack-2.2.4/ri/WEBrick/HTTPResponse/_rack_setup_header-i.rinu[PK!&NڧRR5ܻshare/gems/doc/rack-2.2.4/ri/WEBrick/cdesc-WEBrick.rinu[PK!jII%share/gems/doc/rack-2.2.4/ri/cache.rinu[PK! =L^OO/share/gems/doc/rack-2.2.4/ri/FCGI/cdesc-FCGI.rinu[PK!8i share/gems/doc/rack-2.2.4/ri/FCGI/Stream/cdesc-Stream.rinu[PK!\KKG share/gems/doc/rack-2.2.4/ri/FCGI/Stream/_rack_read_without_buffer-i.rinu[PK!#'222b share/gems/doc/rack-2.2.4/ri/FCGI/Stream/read-i.rinu[PK!o$1share/gems/doc/rack-2.2.4/ri/page-CHANGELOG_md.rinu[PK!4Hshare/gems/doc/rack-2.2.4/ri/page-CONTRIBUTING_md.rinu[PK!.u>u>0cshare/gems/doc/rack-2.2.4/ri/page-README_rdoc.rinu[PK!585 share/gems/doc/rack-2.2.4/ri/Rack/ShowStatus/new-c.rinu[PK!CS,DD@6 share/gems/doc/rack-2.2.4/ri/Rack/ShowStatus/cdesc-ShowStatus.rinu[PK!S6I: share/gems/doc/rack-2.2.4/ri/Rack/ShowStatus/call-i.rinu[PK!RC; share/gems/doc/rack-2.2.4/ri/Rack/QueryParser/normalize_params-i.rinu[PK!)АE2> share/gems/doc/rack-2.2.4/ri/Rack/QueryParser/parse_nested_query-i.rinu[PK!h{((60A share/gems/doc/rack-2.2.4/ri/Rack/QueryParser/new-c.rinu[PK!TT>B share/gems/doc/rack-2.2.4/ri/Rack/QueryParser/parse_query-i.rinu[PK! BE share/gems/doc/rack-2.2.4/ri/Rack/QueryParser/cdesc-QueryParser.rinu[PK!LBI share/gems/doc/rack-2.2.4/ri/Rack/QueryParser/new_space_limit-i.rinu[PK!}ё>KK share/gems/doc/rack-2.2.4/ri/Rack/QueryParser/make_params-i.rinu[PK!tSS\L share/gems/doc/rack-2.2.4/ri/Rack/QueryParser/ParamsTooDeepError/cdesc-ParamsTooDeepError.rinu[PK!LE   BO share/gems/doc/rack-2.2.4/ri/Rack/QueryParser/new_depth_limit-i.rinu[PK!-##I1Q share/gems/doc/rack-2.2.4/ri/Rack/QueryParser/params_hash_has_key%3f-i.rinu[PK!,,?R share/gems/doc/rack-2.2.4/ri/Rack/QueryParser/make_default-c.rinu[PK!&;hT share/gems/doc/rack-2.2.4/ri/Rack/QueryParser/unescape-i.rinu[PK!5bU share/gems/doc/rack-2.2.4/ri/Rack/QueryParser/InvalidParameterError/cdesc-InvalidParameterError.rinu[PK! ss\X share/gems/doc/rack-2.2.4/ri/Rack/QueryParser/ParameterTypeError/cdesc-ParameterTypeError.rinu[PK!qQ  B[ share/gems/doc/rack-2.2.4/ri/Rack/QueryParser/key_space_limit-i.rinu[PK!\=w] share/gems/doc/rack-2.2.4/ri/Rack/QueryParser/Params/new-c.rinu[PK!XZ@^ share/gems/doc/rack-2.2.4/ri/Rack/QueryParser/Params/key%3f-i.rinu[PK!9@S` share/gems/doc/rack-2.2.4/ri/Rack/QueryParser/Params/%5b%5d-i.rinu[PK!">a share/gems/doc/rack-2.2.4/ri/Rack/QueryParser/Params/to_h-i.rinu[PK!Df share/gems/doc/rack-2.2.4/ri/Rack/QueryParser/Params/cdesc-Params.rinu[PK! ==Hki share/gems/doc/rack-2.2.4/ri/Rack/QueryParser/Params/to_params_hash-i.rinu[PK!۷#C k share/gems/doc/rack-2.2.4/ri/Rack/QueryParser/Params/%5b%5d%3d-i.rinu[PK!\E_Fl share/gems/doc/rack-2.2.4/ri/Rack/QueryParser/params_hash_type%3f-i.rinu[PK!C  D$n share/gems/doc/rack-2.2.4/ri/Rack/QueryParser/param_depth_limit-i.rinu[PK!O6o share/gems/doc/rack-2.2.4/ri/Rack/Recursive/_call-i.rinu[PK!N8q share/gems/doc/rack-2.2.4/ri/Rack/Recursive/include-i.rinu[PK!~q214kr share/gems/doc/rack-2.2.4/ri/Rack/Recursive/new-c.rinu[PK!K|>s share/gems/doc/rack-2.2.4/ri/Rack/Recursive/cdesc-Recursive.rinu[PK!s5w share/gems/doc/rack-2.2.4/ri/Rack/Recursive/call-i.rinu[PK!H:rx share/gems/doc/rack-2.2.4/ri/Rack/MockResponse/%3d%7e-i.rinu[PK!6hhDy share/gems/doc/rack-2.2.4/ri/Rack/MockResponse/cdesc-MockResponse.rinu[PK!,̓E:} share/gems/doc/rack-2.2.4/ri/Rack/MockResponse/errors-i.rinu[PK!*o<4 share/gems/doc/rack-2.2.4/ri/Rack/MockResponse/empty%3f-i.rinu[PK!Y9 share/gems/doc/rack-2.2.4/ri/Rack/MockResponse/match-i.rinu[PK!|Ed22D share/gems/doc/rack-2.2.4/ri/Rack/MockResponse/original_headers-i.rinu[PK![o: share/gems/doc/rack-2.2.4/ri/Rack/MockResponse/cookie-i.rinu[PK!Z ""7 share/gems/doc/rack-2.2.4/ri/Rack/MockResponse/new-c.rinu[PK!O8 share/gems/doc/rack-2.2.4/ri/Rack/MockResponse/body-i.rinu[PK!  ; share/gems/doc/rack-2.2.4/ri/Rack/MockResponse/cookies-i.rinu[PK!)..Nt share/gems/doc/rack-2.2.4/ri/Rack/MockResponse/identify_cookie_attributes-i.rinu[PK!6PM share/gems/doc/rack-2.2.4/ri/Rack/MockResponse/parse_cookies_from_header-i.rinu[PK!K<<B share/gems/doc/rack-2.2.4/ri/Rack/Multipart/extract_multipart-c.rinu[PK!F;NNHi share/gems/doc/rack-2.2.4/ri/Rack/Multipart/UploadedFile/local_path-i.rinu[PK!`$$K/ share/gems/doc/rack-2.2.4/ri/Rack/Multipart/UploadedFile/respond_to%3f-i.rinu[PK!Rcs33BΑ share/gems/doc/rack-2.2.4/ri/Rack/Multipart/UploadedFile/path-i.rinu[PK!qNIAs share/gems/doc/rack-2.2.4/ri/Rack/Multipart/UploadedFile/new-c.rinu[PK!=)mmNi share/gems/doc/rack-2.2.4/ri/Rack/Multipart/UploadedFile/cdesc-UploadedFile.rinu[PK!{7]OT share/gems/doc/rack-2.2.4/ri/Rack/Multipart/UploadedFile/original_filename-i.rinu[PK!p ttJg share/gems/doc/rack-2.2.4/ri/Rack/Multipart/UploadedFile/content_type-i.rinu[PK!WTs#88@U share/gems/doc/rack-2.2.4/ri/Rack/Multipart/parse_multipart-c.rinu[PK!d share/gems/doc/rack-2.2.4/ri/Rack/Multipart/MultipartPartLimitError/cdesc-MultipartPartLimitError.rinu[PK!n >Z share/gems/doc/rack-2.2.4/ri/Rack/Multipart/Generator/new-c.rinu[PK!],,L share/gems/doc/rack-2.2.4/ri/Rack/Multipart/Generator/content_for_other-i.rinu[PK!(D6 share/gems/doc/rack-2.2.4/ri/Rack/Multipart/cdesc-Multipart.rinu[PK!+ H׺ share/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/handle_mime_body-i.rinu[PK!-l  ?f share/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/on_read-i.rinu[PK!qL share/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/handle_consume_token-i.rinu[PK!,4={ share/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/state-i.rinu[PK!>.ȻH share/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/handle_mime_head-i.rinu[PK!ېK| share/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/handle_fast_forward-i.rinu[PK! cE share/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/full_boundary-i.rinu[PK!E*&&; share/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/new-c.rinu[PK!)R>+ share/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/result-i.rinu[PK!O<  B share/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/run_parser-i.rinu[PK!XmEEN share/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/tag_multipart_encoding-i.rinu[PK!ɷO share/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/BoundedIO/cdesc-BoundedIO.rinu[PK!g+377= share/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/parse-c.rinu[PK!;*$B share/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/cdesc-Parser.rinu[PK!Q%%R share/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/Collector/check_open_files-i.rinu[PK!1f+//N share/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/Collector/on_mime_body-i.rinu[PK!Dp''SS share/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/Collector/MimePart/get_data-i.rinu[PK!/Ĉ00W share/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/Collector/MimePart/cdesc-MimePart.rinu[PK!3 E share/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/Collector/new-c.rinu[PK! V< share/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/Collector/TempfilePart/file%3f-i.rinu[PK!88_ share/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/Collector/TempfilePart/cdesc-TempfilePart.rinu[PK!#FVT share/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/Collector/TempfilePart/close-i.rinu[PK!g**PK share/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/Collector/on_mime_finish-i.rinu[PK!F share/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/Collector/each-i.rinu[PK!9yyO share/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/Collector/cdesc-Collector.rinu[PK!:JJNy share/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/Collector/on_mime_head-i.rinu[PK!c44[A share/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/Collector/BufferPart/cdesc-BufferPart.rinu[PK!NRT share/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/Collector/BufferPart/file%3f-i.rinu[PK!'R share/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/Collector/BufferPart/close-i.rinu[PK! \g7D< share/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/get_filename-i.rinu[PK!_F share/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/parse_boundary-c.rinu[PK!eHX share/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/consume_boundary-i.rinu[PK!gų((O share/gems/doc/rack-2.2.4/ri/Rack/Multipart/Parser/handle_empty_content%21-i.rinu[PK!1l1 share/gems/doc/rack-2.2.4/ri/Rack/Logger/new-c.rinu[PK!:  8 share/gems/doc/rack-2.2.4/ri/Rack/Logger/cdesc-Logger.rinu[PK!/'e2f share/gems/doc/rack-2.2.4/ri/Rack/Logger/call-i.rinu[PK!OAE share/gems/doc/rack-2.2.4/ri/Rack/ShowExceptions/accepts_html%3f-i.rinu[PK!!!JA!share/gems/doc/rack-2.2.4/ri/Rack/ShowExceptions/prefers_plaintext%3f-i.rinu[PK!9QD!share/gems/doc/rack-2.2.4/ri/Rack/ShowExceptions/dump_exception-i.rinu[PK!ˍ9o!share/gems/doc/rack-2.2.4/ri/Rack/ShowExceptions/new-c.rinu[PK!_i<!share/gems/doc/rack-2.2.4/ri/Rack/ShowExceptions/pretty-i.rinu[PK!Ĉ`OOH\!share/gems/doc/rack-2.2.4/ri/Rack/ShowExceptions/cdesc-ShowExceptions.rinu[PK!o  ># !share/gems/doc/rack-2.2.4/ri/Rack/ShowExceptions/template-i.rinu[PK!';: !share/gems/doc/rack-2.2.4/ri/Rack/ShowExceptions/call-i.rinu[PK!Ƹ5 !share/gems/doc/rack-2.2.4/ri/Rack/Request/params-i.rinu[PK!f 2_!share/gems/doc/rack-2.2.4/ri/Rack/Request/new-c.rinu[PK!4ώB!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/server_name-i.rinu[PK!n;%!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/POST-i.rinu[PK!&jj@^!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/delete%3f-i.rinu[PK!T=8!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/ssl%3f-i.rinu[PK!F  F!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/accept_encoding-i.rinu[PK!my`C!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/query_string-i.rinu[PK!"JJ!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/forwarded_authority-i.rinu[PK!ehB$!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/server_port-i.rinu[PK!|_E;!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/path-i.rinu[PK!tXC!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/path_info%3d-i.rinu[PK!nZ[[>q !share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/referer-i.rinu[PK!j=:"!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/scheme-i.rinu[PK!ppy#jj@#!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/unlink%3f-i.rinu[PK!"HH:{%!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/GET-i.rinu[PK!*fd?WW;-'!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/host-i.rinu[PK!ygg?(!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/trace%3f-i.rinu[PK! >l=*!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/params-i.rinu[PK!|E"-!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/multithread%3f-i.rinu[PK!""@.!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/authority-i.rinu[PK!+  F/1!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/default_session-i.rinu[PK!:^!(?2!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/fullpath-i.rinu[PK!kG4!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/forwarded_scheme-i.rinu[PK!#dd>5!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/post%3f-i.rinu[PK!F..Fw7!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/content_charset-i.rinu[PK!*eA:!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/media_type-i.rinu[PK!iB&=!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/parse_query-i.rinu[PK!G`%%O>!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/parse_http_accept_header-i.rinu[PK!1`gg@L@!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/wrap_ipv6-i.rinu[PK!~e$$E#B!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/host_with_port-i.rinu[PK!ɰAC!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/user_agent-i.rinu[PK!@K/E!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/extract_proto_header-i.rinu[PK!;=F!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/xhr%3f-i.rinu[PK!v;*H!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/port-i.rinu[PK!]tGGEI!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/host_authority-i.rinu[PK!V Paa=GK!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/get%3f-i.rinu[PK!!XCM!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/query_parser-i.rinu[PK!75  EN!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/request_method-i.rinu[PK!.u  EP!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/content_length-i.rinu[PK!дdd>Q!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/link%3f-i.rinu[PK!C_S!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/form_data%3f-i.rinu[PK!ovx9V!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/ip-i.rinu[PK![>.X!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/session-i.rinu[PK!$-++?Y!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/referrer-i.rinu[PK!.7DD=2[!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/%5b%5d-i.rinu[PK!ىF\!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/split_authority-i.rinu[PK!>J6  Fo^!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/parse_multipart-i.rinu[PK!˭-  G_!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/trusted_proxy%3f-i.rinu[PK!|gg?ua!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/patch%3f-i.rinu[PK!єooCKc!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/update_param-i.rinu[PK!^F\mmA-f!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/options%3f-i.rinu[PK!X|  F h!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/session_options-i.rinu[PK!;W11Ri!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/reject_trusted_ip_addresses-i.rinu[PK!kWB@k!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/script_name-i.rinu[PK!dd>l!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/head%3f-i.rinu[PK!qx?n!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/hostname-i.rinu[PK!XHq!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/media_type_params-i.rinu[PK!  F t!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/accept_language-i.rinu[PK!R<@u!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/path_info-i.rinu[PK!?s1H?v!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/base_url-i.rinu[PK!yCkx!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/content_type-i.rinu[PK!Id;y!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/body-i.rinu[PK!7x>E{!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/cookies-i.rinu[PK!91  E|!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/forwarded_port-i.rinu[PK!aa=.~!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/put%3f-i.rinu[PK!AD!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/forwarded_for-i.rinu[PK!x#zHx!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/parseable_data%3f-i.rinu[PK!)E!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/script_name%3d-i.rinu[PK!4eeC"!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/delete_param-i.rinu[PK!5#>>@!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/values_at-i.rinu[PK!A[[:!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/url-i.rinu[PK!w5=m!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/logger-i.rinu[PK!AhGԌ!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/server_authority-i.rinu[PK!yEЎ!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/allowed_scheme-i.rinu[PK!  CV!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/split_header-i.rinu[PK!jBՑ!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/cdesc-Helpers.rinu[PK!ls@!share/gems/doc/rack-2.2.4/ri/Rack/Request/Helpers/%5b%5d%3d-i.rinu[PK!È*8!share/gems/doc/rack-2.2.4/ri/Rack/Request/ip_filter-c.rinu[PK!e|P;!share/gems/doc/rack-2.2.4/ri/Rack/Request/update_param-i.rinu[PK!s:M!share/gems/doc/rack-2.2.4/ri/Rack/Request/cdesc-Request.rinu[PK!z>;:!share/gems/doc/rack-2.2.4/ri/Rack/Request/delete_param-i.rinu[PK! @LL=!share/gems/doc/rack-2.2.4/ri/Rack/Request/Env/get_header-i.rinu[PK!)g||@[!share/gems/doc/rack-2.2.4/ri/Rack/Request/Env/has_header%3f-i.rinu[PK!)hL6G!share/gems/doc/rack-2.2.4/ri/Rack/Request/Env/new-c.rinu[PK!e8=!share/gems/doc/rack-2.2.4/ri/Rack/Request/Env/add_header-i.rinu[PK!ӏ?!share/gems/doc/rack-2.2.4/ri/Rack/Request/Env/fetch_header-i.rinu[PK!S446!share/gems/doc/rack-2.2.4/ri/Rack/Request/Env/env-i.rinu[PK!t˰  B!share/gems/doc/rack-2.2.4/ri/Rack/Request/Env/cdesc-Env.rinu[PK!mii>!share/gems/doc/rack-2.2.4/ri/Rack/Request/Env/each_header-i.rinu[PK!_ ph/!share/gems/doc/rack-2.2.4/ri/Rack/Lock/new-c.rinu[PK!.v:ZZ4J!share/gems/doc/rack-2.2.4/ri/Rack/Lock/cdesc-Lock.rinu[PK!DE2!share/gems/doc/rack-2.2.4/ri/Rack/Lock/unlock-i.rinu[PK!HU0R!share/gems/doc/rack-2.2.4/ri/Rack/Lock/call-i.rinu[PK!]L!share/gems/doc/rack-2.2.4/ri/Rack/RegexpExtensions/cdesc-RegexpExtensions.rinu[PK! Ҡ@!share/gems/doc/rack-2.2.4/ri/Rack/RegexpExtensions/match%3f-i.rinu[PK!Q3a!share/gems/doc/rack-2.2.4/ri/Rack/Handler/pick-c.rinu[PK!0U<!share/gems/doc/rack-2.2.4/ri/Rack/Handler/CGI/send_body-c.rinu[PK!e:M!share/gems/doc/rack-2.2.4/ri/Rack/Handler/CGI/cdesc-CGI.rinu[PK!e6 ?!share/gems/doc/rack-2.2.4/ri/Rack/Handler/CGI/send_headers-c.rinu[PK!6-!share/gems/doc/rack-2.2.4/ri/Rack/Handler/CGI/run-c.rinu[PK!{8!share/gems/doc/rack-2.2.4/ri/Rack/Handler/CGI/serve-c.rinu[PK!D?!share/gems/doc/rack-2.2.4/ri/Rack/Handler/WEBrick/shutdown-c.rinu[PK!=U:e!share/gems/doc/rack-2.2.4/ri/Rack/Handler/WEBrick/new-c.rinu[PK!! ,D!share/gems/doc/rack-2.2.4/ri/Rack/Handler/WEBrick/valid_options-c.rinu[PK!/5:Z!share/gems/doc/rack-2.2.4/ri/Rack/Handler/WEBrick/run-c.rinu[PK!  >!share/gems/doc/rack-2.2.4/ri/Rack/Handler/WEBrick/service-i.rinu[PK!u55BS!share/gems/doc/rack-2.2.4/ri/Rack/Handler/WEBrick/cdesc-WEBrick.rinu[PK!Q$.6!share/gems/doc/rack-2.2.4/ri/Rack/Handler/default-c.rinu[PK!<T!share/gems/doc/rack-2.2.4/ri/Rack/Handler/Thin/cdesc-Thin.rinu[PK!̯A!share/gems/doc/rack-2.2.4/ri/Rack/Handler/Thin/valid_options-c.rinu[PK!N|  7!share/gems/doc/rack-2.2.4/ri/Rack/Handler/Thin/run-c.rinu[PK!:!share/gems/doc/rack-2.2.4/ri/Rack/Handler/cdesc-Handler.rinu[PK! @!share/gems/doc/rack-2.2.4/ri/Rack/Handler/FastCGI/send_body-c.rinu[PK!~""CS!share/gems/doc/rack-2.2.4/ri/Rack/Handler/FastCGI/send_headers-c.rinu[PK!XFD!share/gems/doc/rack-2.2.4/ri/Rack/Handler/FastCGI/valid_options-c.rinu[PK!J  :l!share/gems/doc/rack-2.2.4/ri/Rack/Handler/FastCGI/run-c.rinu[PK!gB!share/gems/doc/rack-2.2.4/ri/Rack/Handler/FastCGI/cdesc-FastCGI.rinu[PK!}  <p!share/gems/doc/rack-2.2.4/ri/Rack/Handler/FastCGI/serve-c.rinu[PK!Z|l7!share/gems/doc/rack-2.2.4/ri/Rack/Handler/register-c.rinu[PK!L=R!share/gems/doc/rack-2.2.4/ri/Rack/Handler/LSWS/send_body-c.rinu[PK!ݢ@!share/gems/doc/rack-2.2.4/ri/Rack/Handler/LSWS/send_headers-c.rinu[PK!-"<F!share/gems/doc/rack-2.2.4/ri/Rack/Handler/LSWS/cdesc-LSWS.rinu[PK!)/7!share/gems/doc/rack-2.2.4/ri/Rack/Handler/LSWS/run-c.rinu[PK!EY9"share/gems/doc/rack-2.2.4/ri/Rack/Handler/LSWS/serve-c.rinu[PK!"6%%Cw"share/gems/doc/rack-2.2.4/ri/Rack/Handler/SCGI/process_request-i.rinu[PK!K7"share/gems/doc/rack-2.2.4/ri/Rack/Handler/SCGI/new-c.rinu[PK! H7v"share/gems/doc/rack-2.2.4/ri/Rack/Handler/SCGI/app-i.rinu[PK!,A"share/gems/doc/rack-2.2.4/ri/Rack/Handler/SCGI/valid_options-c.rinu[PK!:aI ""<K"share/gems/doc/rack-2.2.4/ri/Rack/Handler/SCGI/cdesc-SCGI.rinu[PK!_m7 "share/gems/doc/rack-2.2.4/ri/Rack/Handler/SCGI/run-c.rinu[PK!pJa2A "share/gems/doc/rack-2.2.4/ri/Rack/Handler/get-c.rinu[PK!Y: "share/gems/doc/rack-2.2.4/ri/Rack/Handler/try_require-c.rinu[PK!wt/"share/gems/doc/rack-2.2.4/ri/Rack/Head/new-c.rinu[PK!f884&"share/gems/doc/rack-2.2.4/ri/Rack/Head/cdesc-Head.rinu[PK!0"share/gems/doc/rack-2.2.4/ri/Rack/Head/call-i.rinu[PK!B^cc8"share/gems/doc/rack-2.2.4/ri/Rack/Utils/escape_html-i.rinu[PK!k{b  A"share/gems/doc/rack-2.2.4/ri/Rack/Utils/parse_cookies_header-i.rinu[PK!à##FQ"share/gems/doc/rack-2.2.4/ri/Rack/Utils/make_delete_cookie_header-i.rinu[PK!}}8"share/gems/doc/rack-2.2.4/ri/Rack/Utils/escape_path-i.rinu[PK!&<"share/gems/doc/rack-2.2.4/ri/Rack/Utils/key_space_limit-c.rinu[PK!wF9"share/gems/doc/rack-2.2.4/ri/Rack/Utils/HeaderHash/cdesc-HeaderHash.rinu[PK!?3"share/gems/doc/rack-2.2.4/ri/Rack/Utils/parse_nested_query-i.rinu[PK!7@ "share/gems/doc/rack-2.2.4/ri/Rack/Utils/Context/cdesc-Context.rinu[PK!M^8$"share/gems/doc/rack-2.2.4/ri/Rack/Utils/Context/new-c.rinu[PK!>^<%&"share/gems/doc/rack-2.2.4/ri/Rack/Utils/Context/context-i.rinu[PK!_^8'"share/gems/doc/rack-2.2.4/ri/Rack/Utils/Context/app-i.rinu[PK!=K8("share/gems/doc/rack-2.2.4/ri/Rack/Utils/Context/for-i.rinu[PK!,9)9G*"share/gems/doc/rack-2.2.4/ri/Rack/Utils/Context/call-i.rinu[PK!y>+"share/gems/doc/rack-2.2.4/ri/Rack/Utils/Context/recontext-i.rinu[PK!uU553-"share/gems/doc/rack-2.2.4/ri/Rack/Utils/escape-i.rinu[PK!4."share/gems/doc/rack-2.2.4/ri/Rack/Utils/rfc2109-i.rinu[PK!I4  D1"share/gems/doc/rack-2.2.4/ri/Rack/Utils/delete_cookie_header%21-i.rinu[PK!SF7u3"share/gems/doc/rack-2.2.4/ri/Rack/Utils/clock_time-i.rinu[PK!yFA4"share/gems/doc/rack-2.2.4/ri/Rack/Utils/default_query_parser-c.rinu[PK!!4C6"share/gems/doc/rack-2.2.4/ri/Rack/Utils/rfc2822-i.rinu[PK!Ə++A7"share/gems/doc/rack-2.2.4/ri/Rack/Utils/select_best_encoding-i.rinu[PK!#849"share/gems/doc/rack-2.2.4/ri/Rack/Utils/build_query-i.rinu[PK!vy  8:"share/gems/doc/rack-2.2.4/ri/Rack/Utils/parse_query-i.rinu[PK! : <"share/gems/doc/rack-2.2.4/ri/Rack/Utils/unescape_path-i.rinu[PK!  <>"share/gems/doc/rack-2.2.4/ri/Rack/Utils/get_byte_ranges-i.rinu[PK![h??"share/gems/doc/rack-2.2.4/ri/Rack/Utils/build_nested_query-i.rinu[PK!V<A"share/gems/doc/rack-2.2.4/ri/Rack/Utils/clean_path_info-i.rinu[PK!iAB"share/gems/doc/rack-2.2.4/ri/Rack/Utils/multipart_part_limit-c.rinu[PK! ?C"share/gems/doc/rack-2.2.4/ri/Rack/Utils/key_space_limit%3d-c.rinu[PK!U5hE"share/gems/doc/rack-2.2.4/ri/Rack/Utils/q_values-i.rinu[PK!#fBee;F"share/gems/doc/rack-2.2.4/ri/Rack/Utils/secure_compare-i.rinu[PK! VE5I"share/gems/doc/rack-2.2.4/ri/Rack/Utils/unescape-i.rinu[PK!nO 6K"share/gems/doc/rack-2.2.4/ri/Rack/Utils/cdesc-Utils.rinu[PK!R:X"share/gems/doc/rack-2.2.4/ri/Rack/Utils/valid_path%3f-i.rinu[PK!8 Z"share/gems/doc/rack-2.2.4/ri/Rack/Utils/byte_ranges-i.rinu[PK!ã:k\"share/gems/doc/rack-2.2.4/ri/Rack/Utils/parse_cookies-i.rinu[PK!p8 A]"share/gems/doc/rack-2.2.4/ri/Rack/Utils/add_cookie_to_header-i.rinu[PK!,*A[_"share/gems/doc/rack-2.2.4/ri/Rack/Utils/param_depth_limit%3d-c.rinu[PK!+?8`"share/gems/doc/rack-2.2.4/ri/Rack/Utils/status_code-i.rinu[PK!=A4b"share/gems/doc/rack-2.2.4/ri/Rack/Utils/set_cookie_header%21-i.rinu[PK!&29c"share/gems/doc/rack-2.2.4/ri/Rack/Utils/best_q_match-i.rinu[PK!'H(f"share/gems/doc/rack-2.2.4/ri/Rack/Utils/add_remove_cookie_to_header-i.rinu[PK!VL >Sh"share/gems/doc/rack-2.2.4/ri/Rack/Utils/param_depth_limit-c.rinu[PK!6+k1i"share/gems/doc/rack-2.2.4/ri/Rack/URLMap/new-c.rinu[PK!B3k"share/gems/doc/rack-2.2.4/ri/Rack/URLMap/remap-i.rinu[PK!08el"share/gems/doc/rack-2.2.4/ri/Rack/URLMap/casecmp%3f-i.rinu[PK!Dvjj8m"share/gems/doc/rack-2.2.4/ri/Rack/URLMap/cdesc-URLMap.rinu[PK!!q2r"share/gems/doc/rack-2.2.4/ri/Rack/URLMap/call-i.rinu[PK! yy7s"share/gems/doc/rack-2.2.4/ri/Rack/MediaType/params-c.rinu[PK!a>v"share/gems/doc/rack-2.2.4/ri/Rack/MediaType/cdesc-MediaType.rinu[PK!ѧӭCy"share/gems/doc/rack-2.2.4/ri/Rack/MediaType/strip_doublequotes-c.rinu[PK!i-l5{"share/gems/doc/rack-2.2.4/ri/Rack/MediaType/type-c.rinu[PK!ڻF~"share/gems/doc/rack-2.2.4/ri/Rack/RewindableInput/make_rewindable-i.rinu[PK!~.K<<X"share/gems/doc/rack-2.2.4/ri/Rack/RewindableInput/filesystem_has_posix_semantics%3f-i.rinu[PK!;:ׁ"share/gems/doc/rack-2.2.4/ri/Rack/RewindableInput/new-c.rinu[PK!F9JG"share/gems/doc/rack-2.2.4/ri/Rack/RewindableInput/cdesc-RewindableInput.rinu[PK!=t  ;"share/gems/doc/rack-2.2.4/ri/Rack/RewindableInput/each-i.rinu[PK!WA  ; "share/gems/doc/rack-2.2.4/ri/Rack/RewindableInput/read-i.rinu[PK!J`  ="share/gems/doc/rack-2.2.4/ri/Rack/RewindableInput/rewind-i.rinu[PK!2^APP<"share/gems/doc/rack-2.2.4/ri/Rack/RewindableInput/close-i.rinu[PK!Bd+R;"share/gems/doc/rack-2.2.4/ri/Rack/RewindableInput/gets-i.rinu[PK!)*K  E""share/gems/doc/rack-2.2.4/ri/Rack/Auth/Basic/Request/credentials-i.rinu[PK!\I  E"share/gems/doc/rack-2.2.4/ri/Rack/Auth/Basic/Request/cdesc-Request.rinu[PK!CB"share/gems/doc/rack-2.2.4/ri/Rack/Auth/Basic/Request/basic%3f-i.rinu[PK!C/B"share/gems/doc/rack-2.2.4/ri/Rack/Auth/Basic/Request/username-i.rinu[PK!5R];"share/gems/doc/rack-2.2.4/ri/Rack/Auth/Basic/challenge-i.rinu[PK!S>j:n"share/gems/doc/rack-2.2.4/ri/Rack/Auth/Basic/valid%3f-i.rinu[PK! LQQ;Қ"share/gems/doc/rack-2.2.4/ri/Rack/Auth/Basic/cdesc-Basic.rinu[PK!-X6"share/gems/doc/rack-2.2.4/ri/Rack/Auth/Basic/call-i.rinu[PK!=B"share/gems/doc/rack-2.2.4/ri/Rack/Auth/AbstractRequest/scheme-i.rinu[PK!Bn"share/gems/doc/rack-2.2.4/ri/Rack/Auth/AbstractRequest/params-i.rinu[PK!0/D"share/gems/doc/rack-2.2.4/ri/Rack/Auth/AbstractRequest/valid%3f-i.rinu[PK!jO|"share/gems/doc/rack-2.2.4/ri/Rack/Auth/AbstractRequest/cdesc-AbstractRequest.rinu[PK!u1?"share/gems/doc/rack-2.2.4/ri/Rack/Auth/AbstractRequest/new-c.rinu[PK!XCp"share/gems/doc/rack-2.2.4/ri/Rack/Auth/AbstractRequest/request-i.rinu[PK!,A"share/gems/doc/rack-2.2.4/ri/Rack/Auth/AbstractRequest/parts-i.rinu[PK!d_G|"share/gems/doc/rack-2.2.4/ri/Rack/Auth/AbstractRequest/provided%3f-i.rinu[PK!|L++M "share/gems/doc/rack-2.2.4/ri/Rack/Auth/AbstractRequest/authorization_key-i.rinu[PK!wuO"share/gems/doc/rack-2.2.4/ri/Rack/Auth/AbstractHandler/cdesc-AbstractHandler.rinu[PK!)aPG "share/gems/doc/rack-2.2.4/ri/Rack/Auth/AbstractHandler/bad_request-i.rinu[PK!RkA"share/gems/doc/rack-2.2.4/ri/Rack/Auth/AbstractHandler/realm-i.rinu[PK!3//?:"share/gems/doc/rack-2.2.4/ri/Rack/Auth/AbstractHandler/new-c.rinu[PK! ==Hط"share/gems/doc/rack-2.2.4/ri/Rack/Auth/AbstractHandler/unauthorized-i.rinu[PK!~T4"share/gems/doc/rack-2.2.4/ri/Rack/Auth/cdesc-Auth.rinu[PK!-+H"share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Request/respond_to%3f-i.rinu[PK!<Iw"share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Request/correct_uri%3f-i.rinu[PK!  A"share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Request/params-i.rinu[PK!v@"share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Request/nonce-i.rinu[PK!,$$I"share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Request/method_missing-i.rinu[PK!rƨw  A"share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Request/method-i.rinu[PK!(wnnF"share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Request/cdesc-Request.rinu[PK!жD  D"share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Request/digest%3f-i.rinu[PK!i PFu"share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/MD5/valid_digest%3f-i.rinu[PK!VU9"share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/MD5/A2-i.rinu[PK!79`"share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/MD5/KD-i.rinu[PK!-U  ="share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/MD5/digest-i.rinu[PK!@F"share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/MD5/challenge-i.rinu[PK!w="share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/MD5/params-i.rinu[PK!2##89"share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/MD5/H-i.rinu[PK!Yb?"share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/MD5/valid%3f-i.rinu[PK!˴mhG6"share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/MD5/passwords_hashed-i.rinu[PK!'':"share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/MD5/new-c.rinu[PK!|JX"share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/MD5/passwords_hashed%3f-i.rinu[PK!Y@  C"share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/MD5/valid_qop%3f-i.rinu[PK!mu9d"share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/MD5/A1-i.rinu[PK!:AA>"share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/MD5/cdesc-MD5.rinu[PK!知9E"share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/MD5/valid_nonce%3f-i.rinu[PK![;"share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/MD5/call-i.rinu[PK!4$=m"share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/MD5/opaque-i.rinu[PK!l'F"share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/MD5/valid_opaque%3f-i.rinu[PK! gm:h"share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/MD5/md5-i.rinu[PK!?"share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Nonce/digest-i.rinu[PK!,A["share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Nonce/valid%3f-i.rinu[PK!''<"share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Nonce/new-c.rinu[PK!O^Cc"share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Nonce/time_limit-c.rinu[PK!hfA"share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Nonce/fresh%3f-i.rinu[PK!HXBa"share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Nonce/cdesc-Nonce.rinu[PK!_A"share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Nonce/stale%3f-i.rinu[PK!eiD?"share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Nonce/private_key-c.rinu[PK!L8;="share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Nonce/to_s-i.rinu[PK!d  >8"share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Nonce/parse-c.rinu[PK!ޘu  ="share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Params/new-c.rinu[PK!@y  A("share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Params/dequote-c.rinu[PK!N+@"share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Params/%5b%5d-i.rinu[PK!>#share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Params/to_s-i.rinu[PK!)K  ?#share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Params/parse-c.rinu[PK!OZ y##L#share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Params/split_header_value-c.rinu[PK!D#share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Params/cdesc-Params.rinu[PK!x?#share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Params/quote-i.rinu[PK!hCu #share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/Params/%5b%5d%3d-i.rinu[PK!jj= #share/gems/doc/rack-2.2.4/ri/Rack/Auth/Digest/cdesc-Digest.rinu[PK!J9#share/gems/doc/rack-2.2.4/ri/Rack/TempfileReaper/new-c.rinu[PK!䱦H1#share/gems/doc/rack-2.2.4/ri/Rack/TempfileReaper/cdesc-TempfileReaper.rinu[PK!GX:#share/gems/doc/rack-2.2.4/ri/Rack/TempfileReaper/call-i.rinu[PK!% 3 #share/gems/doc/rack-2.2.4/ri/Rack/Sendfile/new-c.rinu[PK!^  >#share/gems/doc/rack-2.2.4/ri/Rack/Sendfile/map_accel_path-i.rinu[PK!JC9#share/gems/doc/rack-2.2.4/ri/Rack/Sendfile/variation-i.rinu[PK!<77<u#share/gems/doc/rack-2.2.4/ri/Rack/Sendfile/cdesc-Sendfile.rinu[PK!~4+#share/gems/doc/rack-2.2.4/ri/Rack/Sendfile/call-i.rinu[PK!3/YCn,#share/gems/doc/rack-2.2.4/ri/Rack/Lint/LintError/cdesc-LintError.rinu[PK!xҵ/g.#share/gems/doc/rack-2.2.4/ri/Rack/Lint/new-c.rinu[PK!țI/#share/gems/doc/rack-2.2.4/ri/Rack/Lint/ErrorWrapper/cdesc-ErrorWrapper.rinu[PK!U**41#share/gems/doc/rack-2.2.4/ri/Rack/Lint/cdesc-Lint.rinu[PK!N}I84#share/gems/doc/rack-2.2.4/ri/Rack/Lint/InputWrapper/cdesc-InputWrapper.rinu[PK!5K76#share/gems/doc/rack-2.2.4/ri/Rack/Lint/HijackWrapper/cdesc-HijackWrapper.rinu[PK! eTuuC:8#share/gems/doc/rack-2.2.4/ri/Rack/Lint/Assertion/cdesc-Assertion.rinu[PK!gg7":#share/gems/doc/rack-2.2.4/ri/Rack/CommonLogger/log-i.rinu[PK!-gwJ;#share/gems/doc/rack-2.2.4/ri/Rack/CommonLogger/extract_content_length-i.rinu[PK!TjXROO7>#share/gems/doc/rack-2.2.4/ri/Rack/CommonLogger/new-c.rinu[PK!dG@@D@#share/gems/doc/rack-2.2.4/ri/Rack/CommonLogger/cdesc-CommonLogger.rinu[PK!-8F#share/gems/doc/rack-2.2.4/ri/Rack/CommonLogger/call-i.rinu[PK!OZ3I#share/gems/doc/rack-2.2.4/ri/Rack/Deflater/new-c.rinu[PK!*l <O#share/gems/doc/rack-2.2.4/ri/Rack/Deflater/cdesc-Deflater.rinu[PK!D8DDInT#share/gems/doc/rack-2.2.4/ri/Rack/Deflater/GzipStream/cdesc-GzipStream.rinu[PK!5' >+W#share/gems/doc/rack-2.2.4/ri/Rack/Deflater/GzipStream/new-c.rinu[PK!x{)ZZ?lZ#share/gems/doc/rack-2.2.4/ri/Rack/Deflater/GzipStream/each-i.rinu[PK!"Tbb@5\#share/gems/doc/rack-2.2.4/ri/Rack/Deflater/GzipStream/write-i.rinu[PK!$׷II@^#share/gems/doc/rack-2.2.4/ri/Rack/Deflater/GzipStream/close-i.rinu[PK!N!4_#share/gems/doc/rack-2.2.4/ri/Rack/Deflater/call-i.rinu[PK!z_llAa#share/gems/doc/rack-2.2.4/ri/Rack/Deflater/should_deflate%3f-i.rinu[PK!B\ ;b#share/gems/doc/rack-2.2.4/ri/Rack/Events/make_response-i.rinu[PK!伞Sod#share/gems/doc/rack-2.2.4/ri/Rack/Events/EventedBodyProxy/cdesc-EventedBodyProxy.rinu[PK!V7f#share/gems/doc/rack-2.2.4/ri/Rack/Events/on_finish-i.rinu[PK!ֹ1g#share/gems/doc/rack-2.2.4/ri/Rack/Events/new-c.rinu[PK!h~SQi#share/gems/doc/rack-2.2.4/ri/Rack/Events/BufferedResponse/cdesc-BufferedResponse.rinu[PK!!r\:uk#share/gems/doc/rack-2.2.4/ri/Rack/Events/make_request-i.rinu[PK!u6l#share/gems/doc/rack-2.2.4/ri/Rack/Events/on_error-i.rinu[PK!K,7Hn#share/gems/doc/rack-2.2.4/ri/Rack/Events/on_commit-i.rinu[PK!| j+6o#share/gems/doc/rack-2.2.4/ri/Rack/Events/on_start-i.rinu[PK!g2q#share/gems/doc/rack-2.2.4/ri/Rack/Events/call-i.rinu[PK! 8kr#share/gems/doc/rack-2.2.4/ri/Rack/Events/cdesc-Events.rinu[PK! g>n#share/gems/doc/rack-2.2.4/ri/Rack/Events/Abstract/on_send-i.rinu[PK!Ud@#share/gems/doc/rack-2.2.4/ri/Rack/Events/Abstract/on_finish-i.rinu[PK!"PvCX#share/gems/doc/rack-2.2.4/ri/Rack/Events/Abstract/cdesc-Abstract.rinu[PK!j  ?ʅ#share/gems/doc/rack-2.2.4/ri/Rack/Events/Abstract/on_error-i.rinu[PK!87L_@B#share/gems/doc/rack-2.2.4/ri/Rack/Events/Abstract/on_commit-i.rinu[PK!x?#share/gems/doc/rack-2.2.4/ri/Rack/Events/Abstract/on_start-i.rinu[PK!'0G/#share/gems/doc/rack-2.2.4/ri/Rack/ConditionalGet/modified_since%3f-i.rinu[PK!dq$9#share/gems/doc/rack-2.2.4/ri/Rack/ConditionalGet/new-c.rinu[PK!xӉ>#share/gems/doc/rack-2.2.4/ri/Rack/ConditionalGet/fresh%3f-i.rinu[PK!8pkHHH#share/gems/doc/rack-2.2.4/ri/Rack/ConditionalGet/cdesc-ConditionalGet.rinu[PK!w@#share/gems/doc/rack-2.2.4/ri/Rack/ConditionalGet/to_rfc2822-i.rinu[PK!DEϗ#share/gems/doc/rack-2.2.4/ri/Rack/ConditionalGet/etag_matches%3f-i.rinu[PK!9: #share/gems/doc/rack-2.2.4/ri/Rack/ConditionalGet/call-i.rinu[PK!NIJ3#share/gems/doc/rack-2.2.4/ri/Rack/Reloader/new-c.rinu[PK!{{9s#share/gems/doc/rack-2.2.4/ri/Rack/Reloader/safe_load-i.rinu[PK!̊9W#share/gems/doc/rack-2.2.4/ri/Rack/Reloader/reload%21-i.rinu[PK!.K=Š#share/gems/doc/rack-2.2.4/ri/Rack/Reloader/Stat/cdesc-Stat.rinu[PK!ߞ@#share/gems/doc/rack-2.2.4/ri/Rack/Reloader/Stat/figure_path-i.rinu[PK!g  =T#share/gems/doc/rack-2.2.4/ri/Rack/Reloader/Stat/rotation-i.rinu[PK!N4>ͦ#share/gems/doc/rack-2.2.4/ri/Rack/Reloader/Stat/safe_stat-i.rinu[PK!mUU<;#share/gems/doc/rack-2.2.4/ri/Rack/Reloader/cdesc-Reloader.rinu[PK!4#share/gems/doc/rack-2.2.4/ri/Rack/Reloader/call-i.rinu[PK!_y/R#share/gems/doc/rack-2.2.4/ri/Rack/File/new-c.rinu[PK!Ҿ0ů#share/gems/doc/rack-2.2.4/ri/Rack/File/root-i.rinu[PK!i/#share/gems/doc/rack-2.2.4/ri/Rack/File/get-i.rinu[PK!_UC0K#share/gems/doc/rack-2.2.4/ri/Rack/File/fail-i.rinu[PK!448#share/gems/doc/rack-2.2.4/ri/Rack/File/method_added-c.rinu[PK!ldd5H#share/gems/doc/rack-2.2.4/ri/Rack/File/mime_type-i.rinu[PK!Kcڄ4#share/gems/doc/rack-2.2.4/ri/Rack/File/filesize-i.rinu[PK!t0h#share/gems/doc/rack-2.2.4/ri/Rack/File/call-i.rinu[PK!+S3#share/gems/doc/rack-2.2.4/ri/Rack/File/serving-i.rinu[PK!R3L444 #share/gems/doc/rack-2.2.4/ri/Rack/File/cdesc-File.rinu[PK!q x99.#share/gems/doc/rack-2.2.4/ri/Rack/release-c.rinu[PK!><#share/gems/doc/rack-2.2.4/ri/Rack/Builder/new_from_string-c.rinu[PK!2l#share/gems/doc/rack-2.2.4/ri/Rack/Builder/new-c.rinu[PK!h>5#share/gems/doc/rack-2.2.4/ri/Rack/Builder/warmup-i.rinu[PK!t8ä9#share/gems/doc/rack-2.2.4/ri/Rack/Builder/parse_file-c.rinu[PK!Zڲ:#share/gems/doc/rack-2.2.4/ri/Rack/Builder/cdesc-Builder.rinu[PK!rث8#share/gems/doc/rack-2.2.4/ri/Rack/Builder/load_file-c.rinu[PK!I#Y2#share/gems/doc/rack-2.2.4/ri/Rack/Builder/run-i.rinu[PK!*Y2#share/gems/doc/rack-2.2.4/ri/Rack/Builder/map-i.rinu[PK!ϑMM5#share/gems/doc/rack-2.2.4/ri/Rack/Builder/to_app-i.rinu[PK!~Z:2#share/gems/doc/rack-2.2.4/ri/Rack/Builder/use-i.rinu[PK!)k3#share/gems/doc/rack-2.2.4/ri/Rack/Builder/call-i.rinu[PK!%LD9"#share/gems/doc/rack-2.2.4/ri/Rack/Builder/freeze_app-i.rinu[PK!໡;#share/gems/doc/rack-2.2.4/ri/Rack/Builder/generate_map-i.rinu[PK!}2 #share/gems/doc/rack-2.2.4/ri/Rack/Builder/app-c.rinu[PK!U7 #share/gems/doc/rack-2.2.4/ri/Rack/Static/can_serve-i.rinu[PK!m $1g#share/gems/doc/rack-2.2.4/ri/Rack/Static/new-c.rinu[PK!f?#share/gems/doc/rack-2.2.4/ri/Rack/Static/add_index_root%3f-i.rinu[PK!+TT>3#share/gems/doc/rack-2.2.4/ri/Rack/Static/applicable_rules-i.rinu[PK!HDD8#share/gems/doc/rack-2.2.4/ri/Rack/Static/cdesc-Static.rinu[PK!rQ  A$share/gems/doc/rack-2.2.4/ri/Rack/Static/overwrite_file_path-i.rinu[PK!^,8 $share/gems/doc/rack-2.2.4/ri/Rack/Static/route_file-i.rinu[PK!;2~ $share/gems/doc/rack-2.2.4/ri/Rack/Static/call-i.rinu[PK!J!!/ $share/gems/doc/rack-2.2.4/ri/Rack/cdesc-Rack.rinu[PK!A2&/$share/gems/doc/rack-2.2.4/ri/Rack/Runtime/new-c.rinu[PK!Ũ@:0$share/gems/doc/rack-2.2.4/ri/Rack/Runtime/cdesc-Runtime.rinu[PK!C33$share/gems/doc/rack-2.2.4/ri/Rack/Runtime/call-i.rinu[PK!8""JA5$share/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/unpacked_cookie_data-i.rinu[PK!..N6$share/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/persistent_session_id%21-i.rinu[PK!Z  E8$share/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/Identity/decode-i.rinu[PK!ng77K :$share/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/Identity/cdesc-Identity.rinu[PK!  E<$share/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/Identity/encode-i.rinu[PK!  9?>$share/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/new-c.rinu[PK!]p@?$share/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/cdesc-Cookie.rinu[PK!)..CH$share/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/write_session-i.rinu[PK!UEJ$share/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/digest_match%3f-i.rinu[PK!(?L$share/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/secure%3f-i.rinu[PK!|BM$share/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/find_session-i.rinu[PK!/;JO$share/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/Base64/JSON/cdesc-JSON.rinu[PK!B6  HR$share/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/Base64/JSON/decode-i.rinu[PK! ق  HS$share/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/Base64/JSON/encode-i.rinu[PK!z|00G%U$share/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/Base64/cdesc-Base64.rinu[PK!  CW$share/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/Base64/decode-i.rinu[PK!)=(KHY$share/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/Base64/Marshal/decode-i.rinu[PK!\06FFPZ$share/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/Base64/Marshal/cdesc-Marshal.rinu[PK!K]$share/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/Base64/Marshal/encode-i.rinu[PK!$oK*_$share/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/Base64/ZipJSON/decode-i.rinu[PK!gzP`$share/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/Base64/ZipJSON/cdesc-ZipJSON.rinu[PK!XK)c$share/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/Base64/ZipJSON/encode-i.rinu[PK!  Cd$share/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/Base64/encode-i.rinu[PK!⃦H3f$share/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/extract_session_id-i.rinu[PK!HYfCg$share/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/generate_hmac-i.rinu[PK!##LUi$share/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/SessionId/cookie_value-i.rinu[PK!}˧Cj$share/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/SessionId/new-c.rinu[PK!/Ml$share/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/SessionId/cdesc-SessionId.rinu[PK!''Do$share/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/delete_session-i.rinu[PK!U!G;p$share/gems/doc/rack-2.2.4/ri/Rack/Session/Cookie/coder-i.rinu[PK! `a9!r$share/gems/doc/rack-2.2.4/ri/Rack/Session/Pool/mutex-i.rinu[PK!iF(7s$share/gems/doc/rack-2.2.4/ri/Rack/Session/Pool/new-c.rinu[PK! ++At$share/gems/doc/rack-2.2.4/ri/Rack/Session/Pool/write_session-i.rinu[PK!1C2=v$share/gems/doc/rack-2.2.4/ri/Rack/Session/Pool/with_lock-i.rinu[PK!Q  @w$share/gems/doc/rack-2.2.4/ri/Rack/Session/Pool/find_session-i.rinu[PK!_e8zy$share/gems/doc/rack-2.2.4/ri/Rack/Session/Pool/pool-i.rinu[PK!A<z$share/gems/doc/rack-2.2.4/ri/Rack/Session/Pool/cdesc-Pool.rinu[PK!.k@<$share/gems/doc/rack-2.2.4/ri/Rack/Session/Pool/generate_sid-i.rinu[PK!g  B$share/gems/doc/rack-2.2.4/ri/Rack/Session/Pool/delete_session-i.rinu[PK!dp""MB$share/gems/doc/rack-2.2.4/ri/Rack/Session/Pool/get_session_with_fallback-i.rinu[PK!Ȑ:$share/gems/doc/rack-2.2.4/ri/Rack/Session/cdesc-Session.rinu[PK!)kAۈ$share/gems/doc/rack-2.2.4/ri/Rack/Session/SessionId/hash_sid-i.rinu[PK!8YE]$share/gems/doc/rack-2.2.4/ri/Rack/Session/SessionId/cookie_value-i.rinu[PK!K %  A$share/gems/doc/rack-2.2.4/ri/Rack/Session/SessionId/empty%3f-i.rinu[PK!A  <d$share/gems/doc/rack-2.2.4/ri/Rack/Session/SessionId/new-c.rinu[PK!Cݎ$share/gems/doc/rack-2.2.4/ri/Rack/Session/SessionId/private_id-i.rinu[PK!?Ba$share/gems/doc/rack-2.2.4/ri/Rack/Session/SessionId/public_id-i.rinu[PK!..=$share/gems/doc/rack-2.2.4/ri/Rack/Session/SessionId/to_s-i.rinu[PK!(i  @Z$share/gems/doc/rack-2.2.4/ri/Rack/Session/SessionId/inspect-i.rinu[PK!wFFՔ$share/gems/doc/rack-2.2.4/ri/Rack/Session/SessionId/cdesc-SessionId.rinu[PK!l$$N7$share/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/cookie_value-i.rinu[PK!B!y++Rٙ$share/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/force_options%3f-i.rinu[PK!zA((L$share/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/sid_secure-i.rinu[PK!wɘDDZ*$share/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/forced_session_update%3f-i.rinu[PK!yJ"MMP$share/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/commit_session-i.rinu[PK! ::Uš$share/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/security_matches%3f-i.rinu[PK!2TZS$share/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/commit_session%3f-i.rinu[PK!:ϧE$share/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/new-c.rinu[PK!0T$share/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/current_session_id-i.rinu[PK!Qc$$I$share/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/context-i.rinu[PK!3!!O\$share/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/write_session-i.rinu[PK!f%%N$share/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/find_session-i.rinu[PK!O$share/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/session_class-i.rinu[PK!~GL$share/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/set_cookie-i.rinu[PK!O`##N$share/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/make_request-i.rinu[PK! JcT$share/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/extract_session_id-i.rinu[PK!--S$share/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/loaded_session%3f-i.rinu[PK!Nf$share/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/generate_sid-i.rinu[PK!e22Q$share/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/default_options-i.rinu[PK!hY O$share/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/cdesc-Persisted.rinu[PK!ON$share/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/load_session-i.rinu[PK!;f$$P$share/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/initialize_sid-i.rinu[PK!AQ$share/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/prepare_session-i.rinu[PK!7jrrS$share/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/session_exists%3f-i.rinu[PK!j>F$share/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/call-i.rinu[PK!!Pr$share/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/delete_session-i.rinu[PK!e?#E$share/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/Persisted/key-i.rinu[PK!c7ȘD^$share/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/cdesc-Abstract.rinu[PK!U:g00Tj$share/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/PersistedSecure/cookie_value-i.rinu[PK!')99o$share/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/PersistedSecure/SecureSessionHash/cdesc-SecureSessionHash.rinu[PK!XK //`$share/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/PersistedSecure/SecureSessionHash/%5b%5d-i.rinu[PK!<..U$share/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/PersistedSecure/session_class-i.rinu[PK!Va88Zh$share/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/PersistedSecure/extract_session_id-i.rinu[PK!}hh[*$share/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/PersistedSecure/cdesc-PersistedSecure.rinu[PK!40,,T$share/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/PersistedSecure/generate_sid-i.rinu[PK!,J$share/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/SessionHash/delete-i.rinu[PK!ʃJa$share/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/SessionHash/values-i.rinu[PK![I$share/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/SessionHash/clear-i.rinu[PK!EL$share/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/SessionHash/empty%3f-i.rinu[PK!s=K$share/gems/doc/rack-2.2.4/ri/Rack/Session/Abstract/SessionHash/replace-i.rinu[PK!@<DC%share/gems/doc/rack-2.2.4/ri/Rack/NullLogger/datetime_format%3d-i.rinu[PK!  >=E%share/gems/doc/rack-2.2.4/ri/Rack/NullLogger/formatter%3d-i.rinu[PK!5!C:F%share/gems/doc/rack-2.2.4/ri/Rack/NullLogger/error%3f-i.rinu[PK!d8H%share/gems/doc/rack-2.2.4/ri/Rack/NullLogger/%3c%3c-i.rinu[PK!nvm;wI%share/gems/doc/rack-2.2.4/ri/Rack/NullLogger/formatter-i.rinu[PK!BO7J%share/gems/doc/rack-2.2.4/ri/Rack/NullLogger/level-i.rinu[PK!  AAL%share/gems/doc/rack-2.2.4/ri/Rack/NullLogger/datetime_format-i.rinu[PK!j9M%share/gems/doc/rack-2.2.4/ri/Rack/NullLogger/warn%3f-i.rinu[PK!,8?O%share/gems/doc/rack-2.2.4/ri/Rack/NullLogger/sev_threshold-i.rinu[PK!67P%share/gems/doc/rack-2.2.4/ri/Rack/NullLogger/close-i.rinu[PK!).6Q%share/gems/doc/rack-2.2.4/ri/Rack/NullLogger/call-i.rinu[PK!p9TS%share/gems/doc/rack-2.2.4/ri/Rack/NullLogger/unknown-i.rinu[PK!bKg7T%share/gems/doc/rack-2.2.4/ri/Rack/NullLogger/fatal-i.rinu[PK!o:DV%share/gems/doc/rack-2.2.4/ri/Rack/NullLogger/debug%3f-i.rinu[PK!nn2":W%share/gems/doc/rack-2.2.4/ri/Rack/Lobster/cdesc-Lobster.rinu[PK!}3Z%share/gems/doc/rack-2.2.4/ri/Rack/Lobster/call-i.rinu[PK!9\E&\%share/gems/doc/rack-2.2.4/ri/Rack/MethodOverride/allowed_methods-i.rinu[PK!RH]%share/gems/doc/rack-2.2.4/ri/Rack/MethodOverride/cdesc-MethodOverride.rinu[PK!:<((K#b%share/gems/doc/rack-2.2.4/ri/Rack/MethodOverride/method_override_param-i.rinu[PK!l9c%share/gems/doc/rack-2.2.4/ri/Rack/MethodOverride/new-c.rinu[PK!NsE3e%share/gems/doc/rack-2.2.4/ri/Rack/MethodOverride/method_override-i.rinu[PK! !fL:f%share/gems/doc/rack-2.2.4/ri/Rack/MethodOverride/call-i.rinu[PK!Aа((>2h%share/gems/doc/rack-2.2.4/ri/Rack/Server/handle_profiling-i.rinu[PK! 04i%share/gems/doc/rack-2.2.4/ri/Rack/Server/server-i.rinu[PK!m7k%share/gems/doc/rack-2.2.4/ri/Rack/Server/write_pid-i.rinu[PK!eГ3tl%share/gems/doc/rack-2.2.4/ri/Rack/Server/start-c.rinu[PK!@x9p%share/gems/doc/rack-2.2.4/ri/Rack/Server/wrapped_app-i.rinu[PK!+2P; r%share/gems/doc/rack-2.2.4/ri/Rack/Server/parse_options-i.rinu[PK!q 1xs%share/gems/doc/rack-2.2.4/ri/Rack/Server/new-c.rinu[PK!X;}%share/gems/doc/rack-2.2.4/ri/Rack/Server/daemonize_app-i.rinu[PK!>Ѐ@~%share/gems/doc/rack-2.2.4/ri/Rack/Server/logging_middleware-c.rinu[PK!"  Bh%share/gems/doc/rack-2.2.4/ri/Rack/Server/Options/handler_opts-i.rinu[PK!ȌA%share/gems/doc/rack-2.2.4/ri/Rack/Server/Options/cdesc-Options.rinu[PK!ٛ>%%share/gems/doc/rack-2.2.4/ri/Rack/Server/Options/parse%21-i.rinu[PK!$$O%share/gems/doc/rack-2.2.4/ri/Rack/Server/build_app_and_options_from_config-i.rinu[PK!11%share/gems/doc/rack-2.2.4/ri/Rack/Server/app-i.rinu[PK!ѽ?y%share/gems/doc/rack-2.2.4/ri/Rack/Server/make_profile_name-i.rinu[PK!t28%share/gems/doc/rack-2.2.4/ri/Rack/Server/middleware-c.rinu[PK!av7`%share/gems/doc/rack-2.2.4/ri/Rack/Server/build_app-i.rinu[PK!bJ5%share/gems/doc/rack-2.2.4/ri/Rack/Server/options-i.rinu[PK! {= %share/gems/doc/rack-2.2.4/ri/Rack/Server/default_options-i.rinu[PK!~ʜ 8x%share/gems/doc/rack-2.2.4/ri/Rack/Server/middleware-i.rinu[PK!FZ8Ր%share/gems/doc/rack-2.2.4/ri/Rack/Server/opt_parser-i.rinu[PK!6:3%share/gems/doc/rack-2.2.4/ri/Rack/Server/check_pid%21-i.rinu[PK!-D%share/gems/doc/rack-2.2.4/ri/Rack/Server/pidfile_process_status-i.rinu[PK!ʯ^  C%share/gems/doc/rack-2.2.4/ri/Rack/Server/build_app_from_string-i.rinu[PK!L3%share/gems/doc/rack-2.2.4/ri/Rack/Server/start-i.rinu[PK!K8%share/gems/doc/rack-2.2.4/ri/Rack/Server/cdesc-Server.rinu[PK!B;$$O,%share/gems/doc/rack-2.2.4/ri/Rack/Server/default_middleware_by_environment-c.rinu[PK!:ϝ%share/gems/doc/rack-2.2.4/ri/Rack/Cascade/cdesc-Cascade.rinu[PK!ƦN2%share/gems/doc/rack-2.2.4/ri/Rack/Cascade/new-c.rinu[PK!,553ۤ%share/gems/doc/rack-2.2.4/ri/Rack/Cascade/apps-i.rinu[PK!gD TT9s%share/gems/doc/rack-2.2.4/ri/Rack/Cascade/include%3f-i.rinu[PK!s920%share/gems/doc/rack-2.2.4/ri/Rack/Cascade/add-i.rinu[PK!*-8  5%share/gems/doc/rack-2.2.4/ri/Rack/Cascade/%3c%3c-i.rinu[PK!a|3%share/gems/doc/rack-2.2.4/ri/Rack/Cascade/call-i.rinu[PK!_y0%share/gems/doc/rack-2.2.4/ri/Rack/Files/new-c.rinu[PK!Ҿ1)%share/gems/doc/rack-2.2.4/ri/Rack/Files/root-i.rinu[PK!i0j%share/gems/doc/rack-2.2.4/ri/Rack/Files/get-i.rinu[PK!_UC1%share/gems/doc/rack-2.2.4/ri/Rack/Files/fail-i.rinu[PK!449%share/gems/doc/rack-2.2.4/ri/Rack/Files/method_added-c.rinu[PK!ldd6%share/gems/doc/rack-2.2.4/ri/Rack/Files/mime_type-i.rinu[PK!CE5,,6z%share/gems/doc/rack-2.2.4/ri/Rack/Files/cdesc-Files.rinu[PK!NО-> %share/gems/doc/rack-2.2.4/ri/Rack/Files/BaseIterator/path-i.rinu[PK!d>''Iv%share/gems/doc/rack-2.2.4/ri/Rack/Files/BaseIterator/each_range_part-i.rinu[PK!΍K%share/gems/doc/rack-2.2.4/ri/Rack/Files/BaseIterator/multipart_heading-i.rinu[PK!'Z=%share/gems/doc/rack-2.2.4/ri/Rack/Files/BaseIterator/new-c.rinu[PK!w~lJ(%share/gems/doc/rack-2.2.4/ri/Rack/Files/BaseIterator/cdesc-BaseIterator.rinu[PK!+>"%share/gems/doc/rack-2.2.4/ri/Rack/Files/BaseIterator/each-i.rinu[PK!θ+A%share/gems/doc/rack-2.2.4/ri/Rack/Files/BaseIterator/options-i.rinu[PK!^ @%share/gems/doc/rack-2.2.4/ri/Rack/Files/BaseIterator/ranges-i.rinu[PK!`+dF%share/gems/doc/rack-2.2.4/ri/Rack/Files/BaseIterator/multipart%3f-i.rinu[PK!uꅨ? %share/gems/doc/rack-2.2.4/ri/Rack/Files/BaseIterator/close-i.rinu[PK!IBv%share/gems/doc/rack-2.2.4/ri/Rack/Files/BaseIterator/bytesize-i.rinu[PK!Kcڄ5%share/gems/doc/rack-2.2.4/ri/Rack/Files/filesize-i.rinu[PK!ihBC%share/gems/doc/rack-2.2.4/ri/Rack/Files/Iterator/cdesc-Iterator.rinu[PK!t1X%share/gems/doc/rack-2.2.4/ri/Rack/Files/call-i.rinu[PK!+S4%share/gems/doc/rack-2.2.4/ri/Rack/Files/serving-i.rinu[PK!۽gg9%share/gems/doc/rack-2.2.4/ri/Rack/MockRequest/delete-i.rinu[PK!+q;dd8%share/gems/doc/rack-2.2.4/ri/Rack/MockRequest/patch-i.rinu[PK!Ӕ{{:%share/gems/doc/rack-2.2.4/ri/Rack/MockRequest/env_for-c.rinu[PK!4I6%share/gems/doc/rack-2.2.4/ri/Rack/MockRequest/new-c.rinu[PK!Bm:%share/gems/doc/rack-2.2.4/ri/Rack/MockRequest/request-i.rinu[PK!{G^^62%share/gems/doc/rack-2.2.4/ri/Rack/MockRequest/put-i.rinu[PK!"D+^^6%share/gems/doc/rack-2.2.4/ri/Rack/MockRequest/get-i.rinu[PK!#̐D%share/gems/doc/rack-2.2.4/ri/Rack/MockRequest/parse_uri_rfc2396-c.rinu[PK!JcP%share/gems/doc/rack-2.2.4/ri/Rack/MockRequest/FatalWarning/cdesc-FatalWarning.rinu[PK!3Qaaa7%share/gems/doc/rack-2.2.4/ri/Rack/MockRequest/head-i.rinu[PK!JLkk:%share/gems/doc/rack-2.2.4/ri/Rack/MockRequest/options-i.rinu[PK!`N%share/gems/doc/rack-2.2.4/ri/Rack/MockRequest/FatalWarner/cdesc-FatalWarner.rinu[PK!S3E%share/gems/doc/rack-2.2.4/ri/Rack/MockRequest/FatalWarner/string-i.rinu[PK!Do%share/gems/doc/rack-2.2.4/ri/Rack/MockRequest/FatalWarner/flush-i.rinu[PK!NC%share/gems/doc/rack-2.2.4/ri/Rack/MockRequest/FatalWarner/puts-i.rinu[PK!D[%share/gems/doc/rack-2.2.4/ri/Rack/MockRequest/FatalWarner/write-i.rinu[PK!8B%share/gems/doc/rack-2.2.4/ri/Rack/MockRequest/cdesc-MockRequest.rinu[PK!~{^aa73%share/gems/doc/rack-2.2.4/ri/Rack/MockRequest/post-i.rinu[PK! 48%share/gems/doc/rack-2.2.4/ri/Rack/Config/cdesc-Config.rinu[PK!^1A%share/gems/doc/rack-2.2.4/ri/Rack/Config/new-c.rinu[PK!.2%share/gems/doc/rack-2.2.4/ri/Rack/Config/call-i.rinu[PK![cBB.&share/gems/doc/rack-2.2.4/ri/Rack/version-c.rinu[PK!LL@&share/gems/doc/rack-2.2.4/ri/Rack/Directory/check_forbidden-i.rinu[PK!Y8jwxxN&share/gems/doc/rack-2.2.4/ri/Rack/Directory/DirectoryBody/DIR_FILE_escape-i.rinu[PK!.55C&share/gems/doc/rack-2.2.4/ri/Rack/Directory/DirectoryBody/each-i.rinu[PK!ºɀP)&share/gems/doc/rack-2.2.4/ri/Rack/Directory/DirectoryBody/cdesc-DirectoryBody.rinu[PK!7___4) &share/gems/doc/rack-2.2.4/ri/Rack/Directory/new-c.rinu[PK!">В5 &share/gems/doc/rack-2.2.4/ri/Rack/Directory/root-i.rinu[PK!{{4&share/gems/doc/rack-2.2.4/ri/Rack/Directory/get-i.rinu[PK!Mx||?&share/gems/doc/rack-2.2.4/ri/Rack/Directory/list_directory-i.rinu[PK!x>&share/gems/doc/rack-2.2.4/ri/Rack/Directory/cdesc-Directory.rinu[PK!\$B&share/gems/doc/rack-2.2.4/ri/Rack/Directory/check_bad_request-i.rinu[PK!RR@&share/gems/doc/rack-2.2.4/ri/Rack/Directory/filesize_format-i.rinu[PK!/Q5&share/gems/doc/rack-2.2.4/ri/Rack/Directory/call-i.rinu[PK!fA&share/gems/doc/rack-2.2.4/ri/Rack/Directory/entity_not_found-i.rinu[PK!n: &share/gems/doc/rack-2.2.4/ri/Rack/Directory/list_path-i.rinu[PK!*Ѧbb5A"&share/gems/doc/rack-2.2.4/ri/Rack/Directory/stat-i.rinu[PK!ͯ{>>7$&share/gems/doc/rack-2.2.4/ri/Rack/Chunked/Body/new-c.rinu[PK!9ddB%&share/gems/doc/rack-2.2.4/ri/Rack/Chunked/Body/yield_trailers-i.rinu[PK!88'&share/gems/doc/rack-2.2.4/ri/Rack/Chunked/Body/each-i.rinu[PK!nPP9)&share/gems/doc/rack-2.2.4/ri/Rack/Chunked/Body/close-i.rinu[PK!?<;+&share/gems/doc/rack-2.2.4/ri/Rack/Chunked/Body/cdesc-Body.rinu[PK!K/TiiJ.&share/gems/doc/rack-2.2.4/ri/Rack/Chunked/TrailerBody/cdesc-TrailerBody.rinu[PK!ttIl2&share/gems/doc/rack-2.2.4/ri/Rack/Chunked/TrailerBody/yield_trailers-i.rinu[PK!Ĩ2Y4&share/gems/doc/rack-2.2.4/ri/Rack/Chunked/new-c.rinu[PK!!2:5&share/gems/doc/rack-2.2.4/ri/Rack/Chunked/cdesc-Chunked.rinu[PK!Z#3;&share/gems/doc/rack-2.2.4/ri/Rack/Chunked/call-i.rinu[PK!XcttC:=&share/gems/doc/rack-2.2.4/ri/Rack/Chunked/chunkable_version%3f-i.rinu[PK!/}}4!?&share/gems/doc/rack-2.2.4/ri/Rack/Mime/match%3f-c.rinu[PK!4B&share/gems/doc/rack-2.2.4/ri/Rack/Mime/cdesc-Mime.rinu[PK!KK5F&share/gems/doc/rack-2.2.4/ri/Rack/Mime/mime_type-c.rinu[PK!5 }}4J&share/gems/doc/rack-2.2.4/ri/Rack/Mime/match%3f-i.rinu[PK!HKK5}M&share/gems/doc/rack-2.2.4/ri/Rack/Mime/mime_type-i.rinu[PK!a:-Q&share/gems/doc/rack-2.2.4/ri/Rack/BodyProxy/closed%3f-i.rinu[PK!sI/4)S&share/gems/doc/rack-2.2.4/ri/Rack/BodyProxy/new-c.rinu[PK!att?U&share/gems/doc/rack-2.2.4/ri/Rack/BodyProxy/method_missing-i.rinu[PK!gJ;>V&share/gems/doc/rack-2.2.4/ri/Rack/BodyProxy/cdesc-BodyProxy.rinu[PK!| ÎF/Z&share/gems/doc/rack-2.2.4/ri/Rack/BodyProxy/respond_to_missing%3f-i.rinu[PK! eԇ63\&share/gems/doc/rack-2.2.4/ri/Rack/BodyProxy/close-i.rinu[PK!*> ^&share/gems/doc/rack-2.2.4/ri/Rack/Response/Raw/get_header-i.rinu[PK!ձ=ii;_&share/gems/doc/rack-2.2.4/ri/Rack/Response/Raw/cdesc-Raw.rinu[PK!(A`b&share/gems/doc/rack-2.2.4/ri/Rack/Response/Raw/has_header%3f-i.rinu[PK!z? 7c&share/gems/doc/rack-2.2.4/ri/Rack/Response/Raw/new-c.rinu[PK!*uA5e&share/gems/doc/rack-2.2.4/ri/Rack/Response/Raw/delete_header-i.rinu[PK!>f&share/gems/doc/rack-2.2.4/ri/Rack/Response/Raw/set_header-i.rinu[PK!}:h&share/gems/doc/rack-2.2.4/ri/Rack/Response/Raw/status-i.rinu[PK!;{i&share/gems/doc/rack-2.2.4/ri/Rack/Response/Raw/headers-i.rinu[PK![:j&share/gems/doc/rack-2.2.4/ri/Rack/Response/get_header-i.rinu[PK![w:al&share/gems/doc/rack-2.2.4/ri/Rack/Response/chunked%3f-i.rinu[PK!>Cw8m&share/gems/doc/rack-2.2.4/ri/Rack/Response/empty%3f-i.rinu[PK!/3=o&share/gems/doc/rack-2.2.4/ri/Rack/Response/has_header%3f-i.rinu[PK!+D>3p&share/gems/doc/rack-2.2.4/ri/Rack/Response/new-c.rinu[PK!5%Gs&share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/do_not_cache%21-i.rinu[PK!1d>  Hu&share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/unprocessable%3f-i.rinu[PK!QDw&share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/not_found%3f-i.rinu[PK!z@x&share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/location-i.rinu[PK!UBgz&share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/invalid%3f-i.rinu[PK!|w  H{&share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/informational%3f-i.rinu[PK!tyE]}&share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/delete_cookie-i.rinu[PK!hZL~&share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/moved_permanently%3f-i.rinu[PK!Gh?{&share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/etag%3d-i.rinu[PK!&OzB&share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/media_type-i.rinu[PK!=VC[&share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/redirect%3f-i.rinu[PK!%{NЄ&share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/precondition_failed%3f-i.rinu[PK!6MyBf&share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/created%3f-i.rinu[PK!pCC؇&share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/accepted%3f-i.rinu[PK!P4BM&share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/add_header-i.rinu[PK!Jc  Gr&share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/server_error%3f-i.rinu[PK!aB&share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/include%3f-i.rinu[PK!Fk&share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/bad_request%3f-i.rinu[PK!  F&share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/content_length-i.rinu[PK!E Ek&share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/successful%3f-i.rinu[PK!B&share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/set_cookie-i.rinu[PK!iLf&share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/set_cookie_header%3d-i.rinu[PK!`,8  E&share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/cache_control-i.rinu[PK!3(  Gv&share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/unauthorized%3f-i.rinu[PK!H*a=&share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/ok%3f-i.rinu[PK!LzIZ&share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/set_cookie_header-i.rinu[PK![Qm>&share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/append-i.rinu[PK!WIW&share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/media_type_params-i.rinu[PK!&t  H&share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/cache_control%3d-i.rinu[PK!M SSDg&share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/content_type-i.rinu[PK!2^<.&share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/etag-i.rinu[PK!T>lE&share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/no_content%3f-i.rinu[PK!b_bJD &share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/forbidden%3f-i.rinu[PK!t3aaG&share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/content_type%3d-i.rinu[PK!5M]&share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/method_not_allowed%3f-i.rinu[PK!g  G&share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/client_error%3f-i.rinu[PK!'C55@q&share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/cache%21-i.rinu[PK!̋$H&share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/buffered_body%21-i.rinu[PK!"@"**C&share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/cdesc-Helpers.rinu[PK!#F  C:&share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/location%3d-i.rinu[PK!F&share/gems/doc/rack-2.2.4/ri/Rack/Response/Helpers/redirection%3f-i.rinu[PK!l65&share/gems/doc/rack-2.2.4/ri/Rack/Response/header-i.rinu[PK! 6&share/gems/doc/rack-2.2.4/ri/Rack/Response/%5b%5d-c.rinu[PK!  8&share/gems/doc/rack-2.2.4/ri/Rack/Response/redirect-i.rinu[PK!gA6b&share/gems/doc/rack-2.2.4/ri/Rack/Response/%5b%5d-i.rinu[PK!!mf<޾&share/gems/doc/rack-2.2.4/ri/Rack/Response/cdesc-Response.rinu[PK!"6 &share/gems/doc/rack-2.2.4/ri/Rack/Response/finish-i.rinu[PK! ʋ4&share/gems/doc/rack-2.2.4/ri/Rack/Response/each-i.rinu[PK!_K6&share/gems/doc/rack-2.2.4/ri/Rack/Response/length-i.rinu[PK!Fl44P&share/gems/doc/rack-2.2.4/ri/Rack/Response/body-i.rinu[PK!0?=&share/gems/doc/rack-2.2.4/ri/Rack/Response/delete_header-i.rinu[PK!.s:&share/gems/doc/rack-2.2.4/ri/Rack/Response/set_header-i.rinu[PK!Ɵ5&share/gems/doc/rack-2.2.4/ri/Rack/Response/write-i.rinu[PK!RP6&share/gems/doc/rack-2.2.4/ri/Rack/Response/status-i.rinu[PK!V}U5&share/gems/doc/rack-2.2.4/ri/Rack/Response/close-i.rinu[PK!.7C&share/gems/doc/rack-2.2.4/ri/Rack/Response/headers-i.rinu[PK!h4&share/gems/doc/rack-2.2.4/ri/Rack/Response/to_a-i.rinu[PK!<9&share/gems/doc/rack-2.2.4/ri/Rack/Response/%5b%5d%3d-i.rinu[PK!}9&share/gems/doc/rack-2.2.4/ri/Rack/ForwardRequest/new-c.rinu[PK!2H &share/gems/doc/rack-2.2.4/ri/Rack/ForwardRequest/cdesc-ForwardRequest.rinu[PK!L9t&share/gems/doc/rack-2.2.4/ri/Rack/ForwardRequest/env-i.rinu[PK!'9&share/gems/doc/rack-2.2.4/ri/Rack/ForwardRequest/url-i.rinu[PK!{;;B.&share/gems/doc/rack-2.2.4/ri/Rack/ContentType/cdesc-ContentType.rinu[PK!ה6&share/gems/doc/rack-2.2.4/ri/Rack/ContentType/new-c.rinu[PK!_W7X&share/gems/doc/rack-2.2.4/ri/Rack/ContentType/call-i.rinu[PK!<` 3''4&share/gems/doc/rack-2.2.4/ri/Rack/ETag/cdesc-ETag.rinu[PK!s$$/F&share/gems/doc/rack-2.2.4/ri/Rack/ETag/new-c.rinu[PK! 67&share/gems/doc/rack-2.2.4/ri/Rack/ETag/digest_body-i.rinu[PK!Ծ/:&&share/gems/doc/rack-2.2.4/ri/Rack/ETag/etag_status%3f-i.rinu[PK!lH;&share/gems/doc/rack-2.2.4/ri/Rack/ETag/skip_caching%3f-i.rinu[PK!lG0&share/gems/doc/rack-2.2.4/ri/Rack/ETag/call-i.rinu[PK!M88&share/gems/doc/rack-2.2.4/ri/Rack/ETag/etag_body%3f-i.rinu[PK!8&share/gems/doc/rack-2.2.4/ri/Rack/ContentLength/new-c.rinu[PK!e F&share/gems/doc/rack-2.2.4/ri/Rack/ContentLength/cdesc-ContentLength.rinu[PK!9o&share/gems/doc/rack-2.2.4/ri/Rack/ContentLength/call-i.rinu[PK!Qzz7&share/gems/doc/ruby-lsapi-5.7/ri/Kernel/cdesc-Kernel.rinu[PK!yW֌[[=&share/gems/doc/ruby-lsapi-5.7/ri/Kernel/eval_string_wrap-i.rinu[PK!@)&share/gems/doc/ruby-lsapi-5.7/ri/cache.rinu[PK!l[--;k'share/gems/doc/ruby-lsapi-5.7/ri/ext/lsapi/page-Makefile.rinu[PK!3`31'share/gems/doc/ruby-lsapi-5.7/ri/LSAPI/sync%3d-i.rinu[PK!bA2'share/gems/doc/ruby-lsapi-5.7/ri/LSAPI/accept_new_connection-c.rinu[PK!] 4>4'share/gems/doc/ruby-lsapi-5.7/ri/LSAPI/readline-i.rinu[PK!m";5'share/gems/doc/ruby-lsapi-5.7/ri/LSAPI/postfork_parent-c.rinu[PK!*26'share/gems/doc/ruby-lsapi-5.7/ri/LSAPI/tty%3f-i.rinu[PK!dU&218'share/gems/doc/ruby-lsapi-5.7/ri/LSAPI/printf-i.rinu[PK!+B2}9'share/gems/doc/ruby-lsapi-5.7/ri/LSAPI/reopen-i.rinu[PK!V3:'share/gems/doc/ruby-lsapi-5.7/ri/LSAPI/binmode-i.rinu[PK!Î2<'share/gems/doc/ruby-lsapi-5.7/ri/LSAPI/isatty-i.rinu[PK!7/Z='share/gems/doc/ruby-lsapi-5.7/ri/LSAPI/eof-i.rinu[PK!A1>'share/gems/doc/ruby-lsapi-5.7/ri/LSAPI/flush-i.rinu[PK!nA0?'share/gems/doc/ruby-lsapi-5.7/ri/LSAPI/puts-i.rinu[PK!|2"A'share/gems/doc/ruby-lsapi-5.7/ri/LSAPI/eof%3f-i.rinu[PK!0eB'share/gems/doc/ruby-lsapi-5.7/ri/LSAPI/each-i.rinu[PK!_$0C'share/gems/doc/ruby-lsapi-5.7/ri/LSAPI/read-i.rinu[PK!2D'share/gems/doc/ruby-lsapi-5.7/ri/LSAPI/%3c%3c-i.rinu[PK!z{2-F'share/gems/doc/ruby-lsapi-5.7/ri/LSAPI/rewind-i.rinu[PK!^0tG'share/gems/doc/ruby-lsapi-5.7/ri/LSAPI/sync-i.rinu[PK!{1H'share/gems/doc/ruby-lsapi-5.7/ri/LSAPI/write-i.rinu[PK!+1I'share/gems/doc/ruby-lsapi-5.7/ri/LSAPI/print-i.rinu[PK!1DK'share/gems/doc/ruby-lsapi-5.7/ri/LSAPI/close-i.rinu[PK!Q0L'share/gems/doc/ruby-lsapi-5.7/ri/LSAPI/putc-i.rinu[PK!m:M'share/gems/doc/ruby-lsapi-5.7/ri/LSAPI/postfork_child-c.rinu[PK!v>z2+O'share/gems/doc/ruby-lsapi-5.7/ri/LSAPI/accept-c.rinu[PK!~0sP'share/gems/doc/ruby-lsapi-5.7/ri/LSAPI/getc-i.rinu[PK!O 3Q'share/gems/doc/ruby-lsapi-5.7/ri/LSAPI/process-i.rinu[PK!3II5R'share/gems/doc/ruby-lsapi-5.7/ri/LSAPI/cdesc-LSAPI.rinu[PK! T=0V'share/gems/doc/ruby-lsapi-5.7/ri/LSAPI/gets-i.rinu[PK!:gy>/W'share/gems/doc/ruby-lsapi-5.7/ri/page-README.rinu[PK!GB N7&t'share/gems/doc/ruby-lsapi-5.7/ri/Object/cdesc-Object.rinu[PK| w'