Browse Source

remove timeline sequencer mixer

tags/v1.2.1
Nils 5 years ago
parent
commit
80e9f4bd09
100 changed files with 0 additions and 17061 deletions
  1. +0
    -100
      FL/About_Dialog.fl
  2. +0
    -162
      FL/Fl_Blink_Button.H
  3. +0
    -124
      FL/Fl_DialX.C
  4. +0
    -36
      FL/Fl_DialX.H
  5. +0
    -72
      FL/Fl_Flip_Button.H
  6. +0
    -237
      FL/Fl_Flowpack.H
  7. +0
    -78
      FL/Fl_Labelpad_Group.H
  8. +0
    -338
      FL/Fl_Menu_Settings.C
  9. +0
    -43
      FL/Fl_Menu_Settings.H
  10. +0
    -212
      FL/Fl_Packscroller.H
  11. +0
    -250
      FL/Fl_Scalepack.C
  12. +0
    -43
      FL/Fl_Scalepack.H
  13. +0
    -341
      FL/Fl_SliderX.C
  14. +0
    -50
      FL/Fl_SliderX.H
  15. +0
    -113
      FL/Fl_Sometimes_Input.H
  16. +0
    -76
      FL/Fl_Sometimes_Pack.H
  17. +0
    -53
      FL/Fl_Text_Edit_Window.fl
  18. +0
    -234
      FL/Fl_Value_SliderX.C
  19. +0
    -100
      FL/Fl_Value_SliderX.H
  20. +0
    -132
      FL/New_Project_Dialog.fl
  21. +0
    -52
      FL/event_name.C
  22. +0
    -20
      FL/event_name.H
  23. +0
    -103
      FL/focus_frame.C
  24. +0
    -22
      FL/focus_frame.H
  25. +0
    -61
      FL/img_io_input_connector_10x10_png.h
  26. +0
    -63
      FL/img_io_output_connector_10x10_png.h
  27. +0
    -1
      FL/lib
  28. +0
    -61
      FL/menu_popup.C
  29. +0
    -26
      FL/menu_popup.H
  30. +0
    -40
      FL/test_press.C
  31. +0
    -20
      FL/test_press.H
  32. +0
    -163
      FL/util/ntk-perf.C
  33. +0
    -29
      FL/wscript
  34. +0
    -0
      README.md
  35. +0
    -515
      mixer/doc/MANUAL.html
  36. +0
    -543
      mixer/doc/MANUAL.mu
  37. +0
    -23
      mixer/doc/Makefile
  38. BIN
      mixer/doc/controls.png
  39. BIN
      mixer/doc/group-dropdown.png
  40. +0
    -1
      mixer/doc/icon.png
  41. BIN
      mixer/doc/mixer-strips.png
  42. BIN
      mixer/doc/modules.png
  43. +0
    -461
      mixer/doc/mup.css
  44. BIN
      mixer/doc/new-project.png
  45. BIN
      mixer/doc/non-mixer-and-non-daw-in-patchage.png
  46. BIN
      mixer/doc/non-mixer-complex.png
  47. BIN
      mixer/doc/single-strip.png
  48. BIN
      mixer/doc/spatialization-console.png
  49. BIN
      mixer/doc/spatialization-in-mpe.png
  50. BIN
      mixer/doc/spatialization-on-strip.png
  51. BIN
      mixer/doc/spatializer-module.png
  52. BIN
      mixer/icons/hicolor/128x128/apps/non-mixer.png
  53. BIN
      mixer/icons/hicolor/16x16/apps/non-mixer.png
  54. BIN
      mixer/icons/hicolor/192x192/apps/non-mixer.png
  55. BIN
      mixer/icons/hicolor/256x256/apps/non-mixer.png
  56. BIN
      mixer/icons/hicolor/32x32/apps/non-mixer.png
  57. BIN
      mixer/icons/hicolor/36x36/apps/non-mixer.png
  58. BIN
      mixer/icons/hicolor/48x48/apps/non-mixer.png
  59. BIN
      mixer/icons/hicolor/512x512/apps/non-mixer.png
  60. BIN
      mixer/icons/hicolor/64x64/apps/non-mixer.png
  61. BIN
      mixer/icons/hicolor/72x72/apps/non-mixer.png
  62. BIN
      mixer/icons/hicolor/96x96/apps/non-mixer.png
  63. +0
    -155
      mixer/icons/hicolor/scalable/apps/non-mixer.svg
  64. +0
    -774
      mixer/icons/icon-16x16.xpm
  65. +0
    -155
      mixer/icons/icon-large.svg
  66. +0
    -1
      mixer/icons/icon-small.svg
  67. +0
    -9
      mixer/non-mixer.desktop.in
  68. BIN
      mixer/pixmaps/panner-plane-502x502.png
  69. BIN
      mixer/pixmaps/panner-plane-802x802.png
  70. BIN
      mixer/pixmaps/panner-plane-92x92.png
  71. BIN
      mixer/pixmaps/panner-sphere-502x502.png
  72. BIN
      mixer/pixmaps/panner-sphere-802x802.png
  73. BIN
      mixer/pixmaps/panner-sphere-92x92.png
  74. +0
    -206
      mixer/src/AUX_Module.C
  75. +0
    -61
      mixer/src/AUX_Module.H
  76. +0
    -991
      mixer/src/Chain.C
  77. +0
    -149
      mixer/src/Chain.H
  78. +0
    -994
      mixer/src/Controller_Module.C
  79. +0
    -127
      mixer/src/Controller_Module.H
  80. +0
    -256
      mixer/src/DPM.C
  81. +0
    -107
      mixer/src/DPM.H
  82. +0
    -142
      mixer/src/Gain_Module.C
  83. +0
    -50
      mixer/src/Gain_Module.H
  84. +0
    -303
      mixer/src/Group.C
  85. +0
    -102
      mixer/src/Group.H
  86. +0
    -730
      mixer/src/JACK_Module.C
  87. +0
    -87
      mixer/src/JACK_Module.H
  88. +0
    -828
      mixer/src/LADSPAInfo.C
  89. +0
    -208
      mixer/src/LADSPAInfo.h
  90. +0
    -101
      mixer/src/Meter.H
  91. +0
    -267
      mixer/src/Meter_Indicator_Module.C
  92. +0
    -83
      mixer/src/Meter_Indicator_Module.H
  93. +0
    -185
      mixer/src/Meter_Module.C
  94. +0
    -51
      mixer/src/Meter_Module.H
  95. +0
    -1310
      mixer/src/Mixer.C
  96. +0
    -176
      mixer/src/Mixer.H
  97. +0
    -1263
      mixer/src/Mixer_Strip.C
  98. +0
    -188
      mixer/src/Mixer_Strip.H
  99. +0
    -1426
      mixer/src/Module.C
  100. +0
    -578
      mixer/src/Module.H

+ 0
- 100
FL/About_Dialog.fl View File

@@ -1,100 +0,0 @@
# data file for the Fltk User Interface Designer (fluid)
version 1.0300
header_name {.H}
code_name {.C}
decl {\#include <FL/Fl.H>} {private local
}

decl {\#include <FL/Fl_Shared_Image.H>} {private local
}

decl {\#include <FL/filename.H>} {private local
}

Function {open_url( const char *url )} {open return_type void
} {
code {fl_open_uri( url );} {}
}

class About_Dialog {open
} {
Function {About_Dialog( const char *logo_filename )} {open
} {
code {make_window( logo_filename );} {}
}
Function {run()} {open return_type void
} {
code {window->show();

while ( window->shown() )
Fl::wait();

delete window;} {}
}
Function {make_window( const char *logo_filename )} {open private
} {
Fl_Window window {
label About
callback {o->hide();

if ( logo_box->image() )
{
((Fl_Shared_Image*)logo_box->image())->release();
logo_box->image( 0 );
}} open selected
private xywh {879 215 560 695} type Double
visible
} {
Fl_Tabs {} {open
xywh {0 352 558 296}
} {
Fl_Group {} {
label Credits open
xywh {2 386 553 261}
} {
Fl_Box credits {
label {}
xywh {5 389 545 249} box ROUNDED_BOX color 46 labelsize 18
}
}
Fl_Group {} {
label License open
xywh {2 378 553 268} hide
} {
Fl_Box copyright {
label COPYRIGHT
xywh {43 389 462 22} labeltype SHADOW_LABEL labelfont 1 labelsize 18
}
Fl_Box {} {
label {This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.}
xywh {10 414 535 225} box ROUNDED_BOX color 46 labelfont 1 labelsize 12 labelcolor 53 align 144
}
}
}
Fl_Box logo_box {
label VERSION
xywh {5 5 550 305} color 48 labelfont 1 labelsize 18 align 16
code0 {o->image( Fl_Shared_Image::get( logo_filename ) );}
code1 {o->label( VERSION );}
}
Fl_Return_Button {} {
label Rock
callback {o->window()->do_callback();}
xywh {400 660 76 30}
}
Fl_Button website_url {
label {http://non-daw.tuxfamily.org}
callback {open_url( o->label() );}
xywh {125 660 245 30} color 14 labeltype SHADOW_LABEL labelcolor 6
}
Fl_Box title {
label TITLE
xywh {5 317 545 29} labeltype SHADOW_LABEL labelfont 3 labelsize 17
}
}
}
}

+ 0
- 162
FL/Fl_Blink_Button.H View File

@@ -1,162 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2008 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

#pragma once

#include <FL/Fl_Button.H>
#include <FL/Fl.H>

/* Kind of like Fl_Light_Button except that the whole thing is the
* indicator and it can optionally blink */

class Fl_Blink_Button : public Fl_Button
{
bool _on;
int _blink_interval;
bool _blinking;
bool _ignore_input;

static void
update_cb ( void *v )
{
((Fl_Blink_Button*)v)->update_cb();
}


float
blink_interval_as_fraction_of_seceond ( void ) const
{
return (float)_blink_interval / 1000;
}

void
update_cb ( void )
{
Fl::repeat_timeout( blink_interval_as_fraction_of_seceond(), update_cb, this );

_on = ! _on;

redraw();
}
public:

enum
{
SLOW=500,
MEDIUM=300,
FAST=100,
DEFAULT=500
};

Fl_Blink_Button ( int X, int Y, int W, int H, const char *L=0 )
: Fl_Button( X, Y, W, H, L )
{
_blinking = true;
_on = false;
_ignore_input = false;
_blink_interval = DEFAULT;

type( FL_TOGGLE_BUTTON );
}

virtual
~Fl_Blink_Button ()
{
if ( value() )
Fl::remove_timeout( update_cb, this );
}
void ignore_input ( bool b )
{
_ignore_input = b;
}

bool ignore_input ( void ) const
{
return _ignore_input;
}

void blink ( bool b )
{
_blinking = b;
if ( ! b )
_on = true;
}

bool blink ( void ) const
{
return _blinking;
}

void
blink_interval ( float v )
{
_blink_interval = v * 1000;
if ( value() )
{
Fl::remove_timeout( update_cb, this );
Fl::add_timeout( blink_interval_as_fraction_of_seceond(), update_cb, this );
}
}

virtual void value ( float v )
{
bool b = v;
if ( b != value() )
{
if ( b )
{
if ( _blinking )
{
/* just to be safe.. */
Fl::remove_timeout( update_cb, this );
Fl::add_timeout( blink_interval_as_fraction_of_seceond(), update_cb, this );
}
Fl_Button::value( b );
redraw();
}
else
{
Fl_Button::value( b );
Fl::remove_timeout( update_cb, this );
redraw();
}
}
}

virtual float value ( void ) { return (bool)Fl_Button::value(); }

virtual void
draw ( void )
{
draw_box( value() ? box() : down_box(), x(), y(), w(), h(),
( value() != 0 && _on ) ? selection_color() : color() );
draw_label();
}

virtual int handle ( int m )
{
if ( _ignore_input )
return 0;
else
return Fl_Button::handle( m );
}
};

+ 0
- 124
FL/Fl_DialX.C View File

@@ -1,124 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2013 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

#include "Fl_DialX.H"
#include <FL/Fl.H>
#include <FL/fl_draw.H>

void
Fl_DialX::draw ( void )
{
int X,Y,S;
int act = active_r();

{
int ox, oy, ww, hh, side;
ox = x();
oy = y();
ww = w();
hh = h();
if (ww > hh)
{
side = hh;
ox = ox + (ww - side) / 2;
}
else
{
side = ww;
oy = oy + (hh - side) / 2;
}
side = w() > h() ? hh : ww;

X = ox;
Y = oy;
S = side;
}

draw_box();
draw_label();

double angle = ( angle2() - angle1() ) * ( value() - minimum()) / ( maximum() - minimum() ) + angle1();

fl_draw_box( box(), X, Y, S, S, color() );
/* shrink a bit */
int OX = x();
int OY = y();
X += S / 8;
Y += S / 8;
int OS = S;
S -= S / 4;
fl_line_style( FL_SOLID, S / 12 );
/* background arc */

Fl_Color c = fl_darker( color() );
if ( !act )
c = fl_inactive( c );
fl_color( c );
fl_arc( X, Y, S, S, 270 - angle1(), 270 - angle2() );
/* foreground arc */
c = selection_color();

if ( !act )
c = fl_inactive( c );

fl_color(c);
fl_arc( X, Y, S, S, 270 - angle1(), 270 - angle );

fl_line_style( FL_SOLID, 0 );
if ( act )
{
int W = OS;
int H = OS;

fl_push_matrix();
fl_translate(OX+W/2, OY+H/2);
fl_scale(W, H);
fl_rotate(310+angle);
fl_color( fl_color_add_alpha( FL_WHITE, 127 ));
fl_begin_polygon(); fl_circle(-0.26, 0.26, 0.12); fl_end_polygon();
fl_color( FL_WHITE );
fl_begin_polygon(); fl_circle(-0.26, 0.26, 0.06); fl_end_polygon();
fl_pop_matrix();
}
fl_color( fl_contrast( labelcolor(), color() ) );
if ( Fl::belowmouse() == this )
{
char s[128];
fl_font( FL_HELVETICA, 9 );
char buf[128];
format(buf);
snprintf( s, sizeof( s ), buf, value() );

fl_color( FL_FOREGROUND_COLOR );
fl_draw( s, X, Y, S, S, FL_ALIGN_CENTER );
}
}

+ 0
- 36
FL/Fl_DialX.H View File

@@ -1,36 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2013 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

#pragma once

#include <FL/Fl_Dial.H>

class Fl_DialX : public Fl_Dial
{

public:

Fl_DialX ( int X, int Y, int W, int H, const char *L=0 ) : Fl_Dial(X,Y,W,H,L)
{
}

virtual void draw ( void );
virtual ~Fl_DialX() { }
};

+ 0
- 72
FL/Fl_Flip_Button.H View File

@@ -1,72 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2008 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

/* Simple extension of Fl_Button to support different lables for the
* two button states. Simpler than using a an Fl_Choice when all you
* need is two states. Set the label to "foo/bar" for "foo" to be the
* off label and "bar" the on. Obviously you should make sure that
* each label will fit. */

#pragma once

#include <FL/Fl_Button.H>

#include <stdlib.h>
#include <stdio.h>

class Fl_Flip_Button : public Fl_Button
{

char *_off;
char *_on;

public:

Fl_Flip_Button ( int X, int Y, int W, int H, const char *L = 0 ) :
Fl_Button( X, Y, W, H, 0 )
{
sscanf( L, "%m[^/]/%ms", &_off, &_on );

type( FL_TOGGLE_BUTTON );
}

virtual ~Fl_Flip_Button ( )
{
if ( _off ) free( _off );
if ( _on ) free( _on );
}

protected:

virtual void
draw ( void )
{
if ( value() )
{
if ( label() != _on )
label( _on );
}
else
if ( label() != _off )
label( _off );

draw_box( box(), x(), y(), w(), h(), value() ? selection_color() : color() );
draw_label();
}
};

+ 0
- 237
FL/Fl_Flowpack.H View File

@@ -1,237 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2009 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

#pragma once

#include <FL/Fl_Group.H>
#include <FL/Fl_Pack.H>

class Fl_Flowpack : public Fl_Group
{
int _hspacing;
int _vspacing;
bool _flow;
bool _flowdown;
int _initial_height;
int _initial_width;

public:

Fl_Flowpack ( int X, int Y, int W, int H, const char *L = 0 )
: Fl_Group( X, Y, W, H, L )
{
resizable( 0 );
_hspacing = _vspacing = 0;
_initial_width = W;
_initial_height = H;
_flow = true;
_flowdown = false;
}

virtual ~Fl_Flowpack ( )
{
}


void vspacing ( int v ) { _vspacing = v; }
int vspacing ( void ) const { return _vspacing; };

void hspacing ( int h ) { _hspacing = h; }
int hspacing ( void ) const { return _hspacing; };

bool flow ( void ) const { return _flow; }
void flow ( bool v ) { _flow = v; }

bool flowdown ( void ) const { return _flowdown; }
void flowdown ( bool v ) { _flowdown = v; }

void
add ( Fl_Widget *w )
{
Fl_Group::add( w );
dolayout();
}

void
remove ( Fl_Widget *w )
{
Fl_Group::remove( w );
dolayout();
}

void
resize ( int X, int Y, int W, int H )
{
_initial_width = W;
_initial_height = H;

layout();

Fl_Group::resize( X, Y, w(), h() );
}

void
draw ( void )
{
layout();
Fl_Group::draw();
}

void dolayout ( void )
{
layout();
}

void
layout ( void )
{
resizable( 0 );

int W;
int H;
int X = 0;
int Y = 0;
int LW = 0;
int LH = 0;
int LX = 0;
int LY = 0;
int RH = 0;
// int RY = 0;
int CW = 0;

if ( _flow )
{
H = 0;
W = 0;
}
else
{
H = _initial_height;
W = _initial_width;
}

for ( int i = 0; i < children(); ++i )
{
Fl_Widget *o = child( i );

if ( ! o->visible() )
continue;
if ( _flow )
{
if ( _flowdown )
{
if ( Y + o->h() <= _initial_height )
{
/* if it'll fit in this column, put it below the previous widget */
X = LX;
}
else
{
Y = H;
CW = 0;
}

CW = o->w() > CW ? o->w() : CW;
RH = Y + o->h() > RH ? Y + o->h() : RH;
}
else
{
if ( X + o->w() >= _initial_width )
{
/* maybe wrap to the next row */
H += RH + _vspacing;
// RY = Y;
RH = 0;
if ( X > W )
W = X;

X = 0;
}
else
{
/* otherwise, put it in the next column */
Y = H;

}

RH = o->h() > RH ? o->h() : RH;

}
}

LW = o->w();
LH = o->h();

LX = X;
LY = Y;

if ( _flow )
{
if ( _flowdown )
{
Y += LH + _vspacing;
X += CW + _hspacing;
}
else
{
Y += RH + _vspacing;
X += LW + _hspacing;
}
}
else
{
if ( type() == Fl_Pack::HORIZONTAL )
{
X += LW + _hspacing;
LH = _initial_height;
W = X;
}
else
{
Y += LH + _vspacing;
LW = _initial_width;
H = Y;
}
}


if ( ! ( o->x() == x() + LX &&
o->y() == y() + LY &&
o->w() == LW &&
o->h() == LH ) )
o->resize( x() + LX,
y() + LY,
LW,
LH);
}

if ( _flow )
{
H += RH;
if ( X > W )
W = X;

/* if ( _flowdown ) */
/* H = _initial_height; */
}
Fl_Group::resize( x(), y(), W, H );
}
};

+ 0
- 78
FL/Fl_Labelpad_Group.H View File

@@ -1,78 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2009 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

/* wrap a widget in a group as wide as the widget's label. This is
* useful when you want to put labeled widgets into a pack */

#include <FL/Fl_Widget.H>
#include <FL/Fl_Group.H>
#include <FL/fl_draw.H>

class Fl_Labelpad_Group : public Fl_Group
{
public:

static void measure_label ( Fl_Widget *o, int &W, int &H )
{
W = fl_width( o->label() );
H = fl_height();
}

Fl_Labelpad_Group ( Fl_Widget *o ) : Fl_Group( 0, 0, 50, 50, 0 )
{
resizable( 0 );

end();

add( o );

fl_font( o->labelfont(), o->labelsize() );

int W, H;

measure_label( o, W, H );

// set size to contain widget
if ( o->align() & ( FL_ALIGN_TOP | FL_ALIGN_BOTTOM ) )
size( W > o->w() ? W : o->w(), o->h() + H );
if ( o->align() & ( FL_ALIGN_LEFT | FL_ALIGN_RIGHT ) )
size( o->w() + W, H > o->h() ? H : o->h() );

// center widget in group
if ( o->align() & FL_ALIGN_TOP )
o->position( x() + w() / 2 - (o->w() / 2 ), y() + H );
else if ( o->align() & FL_ALIGN_BOTTOM )
o->position( x() + w() / 2 - (o->w() / 2 ), y() );
else if ( o->align() & FL_ALIGN_RIGHT )
o->position( x(), y() );
else if ( o->align() & FL_ALIGN_LEFT )
o->position( x() + W, y() );
else
{
/* TODO: other alignments */
}
resizable(o);
init_sizes();
}

virtual ~Fl_Labelpad_Group ( )
{
}
};

+ 0
- 338
FL/Fl_Menu_Settings.C View File

@@ -1,338 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2008 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

#include "Fl_Menu_Settings.H"

#include <string.h>

/* code to dump and restore (portions of) an Fl_Menu_ */

#define MAX_PATH 1024

void
Fl_Menu_Settings::remove_ampersands ( char *str, int n )
{
char *d = str;
char *s = str;

while ( n-- )
{
if ( *s == '&' )
{
++s;
continue;
}

*(d++) = *(s++);
}

*d = '\0';
}

void
Fl_Menu_Settings::indent ( FILE *fp, int n )
{
while ( n-- )
fprintf( fp, "\t" );
}

int
Fl_Menu_Settings::item_pathname_x ( char *path, int n, const Fl_Menu_Item *item )
{
int r = Fl_Menu_::item_pathname( path, n, item );

remove_ampersands( path, n );

return r;
}

/** dump options from submenu /menu/ of menubar /bar/ to file /fp/ */
const Fl_Menu_Item *
Fl_Menu_Settings::dump ( Fl_Menu_ *bar, const Fl_Menu_Item *menu, FILE *fp, int depth )
{
static char path[256];
const Fl_Menu_Item *m = menu;

for ( ; m->text; ++m )
{
bool is_radio = false;

if ( m->flags & FL_SUBMENU )
// if ( m->submenu() )
{
strcpy( path, m->text );
remove_ampersands( path, strlen( path ) );

indent( fp, depth );
fprintf( fp, "%s\n", path );

/* recurse */
m = dump( bar, ++m, fp, depth + 1 );

// ++m;

// m = dump( bar, m->flags & FL_SUBMENU_POINTER ? (Fl_Menu_Item*) m->user_data() : m, fp, depth + 1 );

if ( ! depth )
break;
else
continue;
}

if ( m->radio() )
is_radio = true;

// bar->item_pathname( path, sizeof( path ) - 1, m );
item_pathname_x( path, sizeof( path ) - 1, m );


if ( m->flags & FL_MENU_TOGGLE || m->flags & FL_MENU_RADIO )
{
if ( ! is_radio )
{
indent( fp, depth );

fprintf( fp, "%s\n", rindex( path, '/' ) + 1 );

indent( fp, depth + 1 );

fprintf( fp, "%s\n", m->flags & FL_MENU_VALUE ? "true" : "false" );
}
else if ( m->flags & FL_MENU_VALUE )
{
*rindex( path, '/' ) = '\0';

indent( fp, depth );

fprintf( fp, "%s\n", path + strlen( path ) + 1 );
}
}

}

return m;
}

/** dump menu to file /name/ starting at /item. */
int
Fl_Menu_Settings::dump ( const Fl_Menu_Item *item, const char *name )
{
FILE *fp = fopen( name, "w" );

if ( ! fp )
return false;

dump( this, item, fp, 0 );

fclose( fp );


return true;
}

#define strlcat strncat

/* taken from Fl_Menu_.cxx and modified to ignore hotkeys and case */
const Fl_Menu_Item *
Fl_Menu_Settings::find_item_x ( const char *name, const Fl_Menu_Item *item )
{
char menupath [ MAX_PATH ] = ""; // File/Export

const Fl_Menu_Item *m = item ? item : menu();

int depth = 0;

while ( depth >= 0 )
for ( ;m ; ++m )
{
if ( m->flags & FL_SUBMENU )
{
// IT'S A SUBMENU
// we do not support searches through FL_SUBMENU_POINTER links
if ( menupath[0] )
strlcat( menupath, "/", sizeof( menupath ) );

strlcat( menupath, m->label(), sizeof( menupath ) );

remove_ampersands( menupath, strlen( menupath ) );

if ( ! strcasecmp( menupath, name ) )
return m;
else
{
++depth;
continue;
}
}
else
{
if ( ! m->label() )
{
// END OF SUBMENU? Pop back one level.
char *ss = strrchr( menupath, '/' );
if ( ss )
*ss = 0;
else
menupath[0] = '\0';

--depth;
++m;

break;
}

// IT'S A MENU ITEM
char itempath[ MAX_PATH ]; // eg. Edit/Copy
strcpy( itempath, menupath );

if ( itempath[0] )
strlcat( itempath, "/", sizeof( itempath ) );

strlcat( itempath, m->label(), sizeof( itempath ) );

remove_ampersands( itempath, strlen( itempath ) );

if ( !strcasecmp( itempath, name ) )
return m;
}
}

return ( Fl_Menu_Item * )0;
}


static void
path_push ( char *path, const char *s )
{
strcat( path, s );
strcat( path, "/" );
}

static void
path_pop ( char *path )
{
char *s;

int l = strlen( path );

if ( ! l )
return;

if ( path[ l - 1 ] == '/' )
path[ l - 1 ] = '\0';

s = rindex( path, '/' );

if ( s )
*(s + 1) = '\0';
else
*path = '\0';
}

void
Fl_Menu_Settings::load ( Fl_Menu_ *bar, const Fl_Menu_Item *item, FILE *fp, int depth, char *path, int pmax )
{
char line[256];

while ( ! feof( fp ) )
{
*line = '\0';

fgets( line, sizeof( line ), fp );

if ( *line == '#' )
continue;

line[ strlen( line ) - 1 ] = '\0';

int ld = strspn( line, "\t" );

if ( ld > depth )
{
path_push( path, line + ld );

++depth;

// load( bar, item, fp, depth + 1, path, pmax );
/* */;
}
else if ( ld < depth )
{
/* we should know the path and the value now */

// path_pop( path );
*rindex( path, '/' ) = '\0';

// printf( "%s = %s\n", path, path + strlen( path ) + 1 );

const Fl_Menu_Item *it = find_item_x( path, item + 1 );

if ( it && it->radio() ) /* radio button */
{
bar->picked( it );

path_pop( path );
}
else /* toggle */
{
*rindex( path, '/' ) = '\0';

if ( ( it = find_item_x( path, item + 1 ) ) && it->checkbox() )
{
int v = 0 == strcasecmp( "true", (path + strlen( path ) + 1 ) );

if ( v != ( it->value() != 0 ) /* grr, FLTK */ )
bar->picked( it );
}

}

while ( ld < depth )
{
path_pop( path );
depth--;
}

path_push( path, line + ld );
}
else /* d == depth */
{
/* doesn't apply? */
}
}
}

/** load settings from file /name/ into menu starting at /item */
int
Fl_Menu_Settings::load ( const Fl_Menu_Item *item, const char *name )
{
FILE *fp = fopen( name, "r" );

if ( ! fp )
return false;

char path[ MAX_PATH ];
path[0] = '\0';

load( this, item, fp, 0, path, sizeof( path ) );

fclose( fp );

return true;
}

+ 0
- 43
FL/Fl_Menu_Settings.H View File

@@ -1,43 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2008 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/



#include <FL/Fl_Menu_.H>
#include <stdio.h>

class Fl_Menu_Settings : public Fl_Menu_
{

void remove_ampersands ( char *str, int n );
void indent ( FILE *fp, int n );
const Fl_Menu_Item * dump ( Fl_Menu_ *bar, const Fl_Menu_Item *menu, FILE *fp, int depth );
void load ( Fl_Menu_ *bar, const Fl_Menu_Item *item, FILE *fp, int depth, char *path, int pmax );

public:


int item_pathname_x ( char *path, int n, const Fl_Menu_Item *item );
const Fl_Menu_Item * find_item_x ( const char *name, const Fl_Menu_Item *item );

int dump ( const Fl_Menu_Item *item, const char *name );
int load ( const Fl_Menu_Item *item, const char *name );


};

+ 0
- 212
FL/Fl_Packscroller.H View File

@@ -1,212 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2010 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

/* Scrolling group suitable for containing a single child (a
* pack). When the Fl_Packscroller is resized, the child will be resized
* too. No scrollbars are displayed, but the widget responds to
* FL_MOUSEWHEEL events. */

#pragma once

#include <FL/Fl_Group.H>
#include <FL/fl_draw.H>
#include <FL/Fl.H>

/* FIXME: Optimize scroll */

class Fl_Packscroller : public Fl_Group
{
int _increment;
int _yposition;
static const int sbh = 15; /* scroll button height */

public:

Fl_Packscroller ( int X, int Y, int W, int H, const char *L = 0 ) : Fl_Group( X, Y, W, H, L )
{
_increment = 30;
_yposition = 0;
// color( FL_WHITE );
}

int increment ( void ) const { return _increment; }
void increment ( int v ) { _increment = v; }

void yposition ( int v )
{
if ( ! children() )
return;

int Y = v;

if ( Y > 0 )
Y = 0;

const int H = h();
// - (sbh * 2);

Fl_Widget *o = child( 0 );

if ( o->h() > H &&
Y + o->h() < H )
Y = H - o->h();
else if ( o->h() < H )
Y = 0;

if ( _yposition != Y )
{
_yposition = Y;

damage( FL_DAMAGE_SCROLL );
}
}

int yposition ( void ) const
{
if ( children() )
return child( 0 )->y() - (y() + sbh);

return 0;
}

void bbox ( int &X, int &Y, int &W, int &H )
{
X = x();
Y = y() + ( sbh * top_sb_visible() );
W = w();
H = h() - ( sbh * ( top_sb_visible() + bottom_sb_visible() ) );
}

int top_sb_visible ( void )
{
return children() && child(0)->y() != y() ? 1 : 0;
}

int bottom_sb_visible ( void )
{
if ( children() )
{
Fl_Widget *o = child( 0 );
if ( o->h() > h() && o->y() + o->h() != y() + h() )
return 1;
}

return 0;
}

virtual void
draw ( void )
{
if ( damage() & FL_DAMAGE_ALL )
{
fl_rectf( x(), y(), w(), h(), color() );
}

if ( ! children() )
return;

Fl_Widget *o = child( 0 );

o->position( x(), y() + _yposition );

const int top_sb = top_sb_visible();
const int bottom_sb = bottom_sb_visible();
fl_push_clip( x(), y() + ( sbh * top_sb ), w(), h() - (sbh * (top_sb + bottom_sb) ));
draw_children();

fl_pop_clip();
fl_font( FL_HELVETICA, 12 );
if ( top_sb )
{
fl_draw_box( box(), x(), y(), w(), sbh, color() );
fl_color( fl_contrast( FL_FOREGROUND_COLOR, color() ) );
fl_draw( "@2<", x(), y(), w(), sbh, FL_ALIGN_CENTER );
}
if ( bottom_sb )
{
fl_draw_box( box(), x(), y() + h() - sbh, w(), sbh, color() );
fl_color( fl_contrast( FL_FOREGROUND_COLOR, color() ) );
fl_draw( "@2>", x(), y() + h() - sbh, w(), sbh, FL_ALIGN_CENTER );
}
}

virtual int
handle ( int m )
{
switch ( m )
{
case FL_PUSH:
if ( top_sb_visible() &&
Fl::event_inside( x(), y(), w(), sbh ) )
{
return 1;
}
else if ( bottom_sb_visible() &&
Fl::event_inside( x(), y() + h() - sbh, w(), sbh ) )
{
return 1;
}
break;
case FL_RELEASE:
{
if ( top_sb_visible() &&
Fl::event_inside( x(), y(), w(), sbh ) )
{
yposition( yposition() + ( h() / 4 ) );
return 1;
}
else if ( bottom_sb_visible() &&
Fl::event_inside( x(), y() + h() - sbh, w(), sbh ) )
{
yposition( yposition() - (h() / 4 ) );
return 1;
}
break;
}
case FL_KEYBOARD:
{
if ( Fl::event_key() == FL_Up )
{
yposition( yposition() + ( h() / 4 ) );
return 1;
}
else if ( Fl::event_key() == FL_Down )
{
yposition( yposition() - (h() / 4 ) );
return 1;
}
break;
}
case FL_MOUSEWHEEL:
{
yposition( yposition() - ( Fl::event_dy() * _increment ) );

return 1;
}
}

return Fl_Group::handle( m );
}
};

+ 0
- 250
FL/Fl_Scalepack.C View File

@@ -1,250 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2008 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/


/* Fl_Scalepack

This is similar to an Fl_Pack, but instead of the pack resizing
itself to enclose its children, this pack resizes its children to
fit itself. Of course, this only works well with highly flexible
widgets, but the task comes up often enough to warrent this class.

If and child happens to be the resizable() widget, then it will be
resized so the all the other children can fit around it, with their
current sizes (and the size of the Fl_Scalepack) maintained.

NOTES: An Fl_Pack as a direct child will not work, because Fl_Pack
changes its size in draw(), which throws off our resize
calculation. The whole idea of widgets being able to resize
themselves within draw() is horribly broken...
*/

#include "Fl_Scalepack.H"

#include <FL/Fl.H>
#include <FL/fl_draw.H>
#include <stdio.h>

Fl_Scalepack::Fl_Scalepack ( int X, int Y, int W, int H, const char *L ) :
Fl_Group( X, Y, W, H, L )
{
resizable( 0 );
_spacing = 0;
}

void
Fl_Scalepack::resize ( int X, int Y, int W, int H )
{
/* Fl_Group's resize will change our child widget sizes, which
interferes with our own resizing method. */
long dx = X - x();
long dy = Y - y();
bool r = W != w() || H != h();

Fl_Widget::resize( X, Y, W, H );

Fl_Widget*const* a = array();

for (int i=children(); i--;)
{
Fl_Widget* o = *a++;

o->position( o->x() + dx, o->y() + dy );
}

if ( r )
redraw();
}

void
Fl_Scalepack::draw ( void )
{

if ( resizable() == this )
/* this resizable( this ) is the default for Fl_Group and is
* reset by Fl_Group::clear(), but it is not our default... */
resizable( 0 );

int tx = x() + Fl::box_dx( box() );
int ty = y() + Fl::box_dy( box() );
int tw = w() - Fl::box_dw( box() );
int th = h() - Fl::box_dh( box() );

if ( damage() & FL_DAMAGE_ALL )
{
draw_box();

draw_label();
}

int v = 0;

int cth = 0;
int ctw = 0;

Fl_Widget * const * a = array();

for ( int i = children(); i--; )
{
Fl_Widget *o = *a++;

if ( o->visible() )
{
++v;

if ( o != this->resizable() )
{
cth += o->h();
ctw += o->w();
}

cth += _spacing;
ctw += _spacing;
}
}

ctw -= _spacing;
cth -= _spacing;

if ( 0 == v )
return;

if ( this->resizable() )
{
int pos = 0;

Fl_Widget * const * a = array();

for ( int i = children(); i--; )
{
Fl_Widget *o = *a++;

if ( o->visible() )
{
int X, Y, W, H;

if ( type() == HORIZONTAL )
{
X = tx + pos;
Y = ty;
W = o->w();
H = th;
}
else
{
X = tx;
Y = ty + pos;
W = tw;
H = o->h();
}

if ( this->resizable() == o )
{
if ( type() == HORIZONTAL )
W = tw - ctw - 3;
else
H = th - cth;
}

if (X != o->x() || Y != o->y() || W != o->w() || H != o->h() )
{
o->resize(X,Y,W,H);
o->clear_damage(FL_DAMAGE_ALL);
}

if ( damage() & FL_DAMAGE_ALL )
{
draw_child( *o );
draw_outside_label( *o );
}
else
update_child( *o );

/* if ( this->resizable() == o ) */
/* fl_rect( o->x(), o->y(), o->w(), o->h(), type() == VERTICAL ? FL_GREEN : FL_BLUE ); */

if ( type() == HORIZONTAL )
pos += o->w() + spacing();
else
pos += o->h() + spacing();

}
}
}
else
{
int sz = 0;
int pos = 0;

if ( type() == HORIZONTAL )
sz = (tw - (_spacing * (v - 1))) / v;
else
sz = (th - (_spacing * (v - 1))) / v;

Fl_Widget * const * a = array();

for ( int i = children(); i--; )
{
Fl_Widget *o = *a++;

if ( o->visible() )
{
int X, Y, W, H;

if ( type() == HORIZONTAL )
{
X = tx + pos;
Y = ty;
W = sz;
H = th;
}
else
{
X = tx;
Y = ty + pos;
W = tw;
H = sz;
}

if (X != o->x() || Y != o->y() || W != o->w() || H != o->h() )
{
o->resize(X,Y,W,H);
o->clear_damage(FL_DAMAGE_ALL);
}

if ( damage() & FL_DAMAGE_ALL )
{
draw_child( *o );
draw_outside_label( *o );
}
else
update_child( *o );

// fl_rect( o->x(), o->y(), o->w(), o->h(), type() == VERTICAL ? FL_RED : FL_YELLOW );

if ( type() == HORIZONTAL )
pos += o->w() + spacing();
else
pos += o->h() + spacing();

}
}
}
}

+ 0
- 43
FL/Fl_Scalepack.H View File

@@ -1,43 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2008 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

#pragma once

#include <FL/Fl_Group.H>

class Fl_Scalepack : public Fl_Group
{

int _spacing;

public:

enum { VERTICAL, HORIZONTAL };

Fl_Scalepack ( int X, int Y, int W, int H, const char *L = 0 );
virtual ~Fl_Scalepack ( ) { }

int spacing ( void ) const { return _spacing; }
void spacing ( int v ) { _spacing = v; redraw(); }

virtual void resize ( int, int, int, int );

virtual void draw ( void );

};

+ 0
- 341
FL/Fl_SliderX.C View File

@@ -1,341 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2013 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

#include "Fl_SliderX.H"
#include <FL/Fl.H>
#include <FL/fl_draw.H>

#include <math.h>

void
Fl_SliderX::draw ( int X, int Y, int W, int H)
{
slider_size( horizontal() ? H / (float)W : W / (float)H );

int act = active_r();

if (damage()&FL_DAMAGE_ALL) draw_box();
int ww = (horizontal() ? W : H);
int hh = (horizontal() ? H : W);
int xx, S;
xx = slider_position( value(), ww );

S = (horizontal() ? H : W );
int xsl, ysl, wsl, hsl;
if (horizontal()) {
xsl = X+xx;
wsl = S;
ysl = Y + hh/2;
hsl = hh/4;
} else {
ysl = Y+xx;
hsl = S;
xsl = X + hh/2;
wsl = hh/4;
}

{
fl_push_clip(X, Y, W, H);
draw_box();
fl_pop_clip();
}
//draw_bg(X, Y, W, H);

fl_line_style( FL_SOLID, hh/6 );
Fl_Color c = fl_darker(color());

if ( !act )
c = fl_inactive(c);

fl_color(c);

if ( horizontal() )
fl_line ( X + S/2, Y + hh/2, X + W - S/2, Y + hh/2 );
else
fl_line ( X + hh/2, Y + S/2, X + hh/2, Y + H - S/2 );

c = selection_color();

if ( !act )
c = fl_inactive(c);

fl_color( c );

if ( horizontal() )
fl_line ( X + S/2, ysl, xsl + S/2, ysl );
else
fl_line ( X + S/2, Y + H - S/2, xsl, ysl + (S/2) );
fl_line_style( FL_SOLID, 0 );

if ( act )
{
fl_push_matrix();
if ( horizontal() )
fl_translate( xsl + (hh/2), ysl);
else
fl_translate( xsl, ysl + (hh/2) );
fl_color( fl_color_add_alpha( FL_WHITE, 127 ));
fl_begin_polygon(); fl_circle(0.0,0.0, hh/3); fl_end_polygon();
fl_color( FL_WHITE );
fl_begin_polygon(); fl_circle(0.0,0.0, hh/6); fl_end_polygon();
fl_pop_matrix();
}
draw_label(xsl, ysl, wsl, hsl);

if (Fl::focus() == this) {
draw_focus();
}

/* draw(x()+Fl::box_dx(box()), */
/* y()+Fl::box_dy(box()), */
/* w()-Fl::box_dw(box()), */
/* h()-Fl::box_dh(box())); */

}

/** return a value between 0.0 and 1.0 which represents the current slider position. */
int
Fl_SliderX::slider_position ( double value, int w )
{
double A = minimum();
double B = maximum();
if (B == A) return 0;
bool flip = B < A;
if (flip) {A = B; B = minimum();}
// if (!horizontal()) flip = !flip;
// if both are negative, make the range positive:
if (B <= 0) {flip = !flip; double t = A; A = -B; B = -t; value = -value;}
double fraction;
if (!log()) {
// linear slider
fraction = (value-A)/(B-A);
} else if (A > 0) {
// logatithmic slider
if (value <= A) fraction = 0;
else fraction = (::log(value)-::log(A))/(::log(B)-::log(A));
} else if (A == 0) {
// squared slider
if (value <= 0) fraction = 0;
else fraction = sqrt(value/B);
} else {
// squared signed slider
if (value < 0) fraction = (1-sqrt(value/A))*.5;
else fraction = (1+sqrt(value/B))*.5;
}
if (flip) fraction = 1-fraction;
w -= int(slider_size()*w+.5); if (w <= 0) return 0;
if (fraction >= 1) return w;
else if (fraction <= 0) return 0;
else return int(fraction*w+.5);
}

double
Fl_SliderX::slider_value ( int X, int w )
{
w -= int(slider_size()*w+.5); if (w <= 0) return minimum();
double A = minimum();
double B = maximum();
bool flip = B < A;
if (flip) {A = B; B = minimum();}
// if (!horizontal()) flip = !flip;
if (flip) X = w-X;
double fraction = double(X)/w;
if (fraction <= 0) return A;
if (fraction >= 1) return B;
// if both are negative, make the range positive:
flip = (B <= 0);
if (flip) {double t = A; A = -B; B = -t; fraction = 1-fraction;}
double value;
double derivative;
if (!log()) {
// linear slider
value = fraction*(B-A)+A;
derivative = (B-A)/w;
} else if (A > 0) {
// log slider
double d = (::log(B)-::log(A));
value = exp(fraction*d+::log(A));
derivative = value*d/w;
} else if (A == 0) {
// squared slider
value = fraction*fraction*B;
derivative = 2*fraction*B/w;
} else {
// squared signed slider
fraction = 2*fraction - 1;
if (fraction < 0) B = A;
value = fraction*fraction*B;
derivative = 4*fraction*B/w;
}
// find nicest multiple of 10,5, or 2 of step() that is close to 1 pixel:
if (step() && derivative > step()) {
double w = log10(derivative);
double l = ceil(w);
int num = 1;
int i; for (i = 0; i < l; i++) num *= 10;
int denom = 1;
for (i = -1; i >= l; i--) denom *= 10;
if (l-w > 0.69897) denom *= 5;
else if (l-w > 0.30103) denom *= 2;
value = floor(value*denom/num+.5)*num/denom;
}
if (flip) return -value;
return value;

}

int Fl_SliderX::handle(int event, int X, int Y, int W, int H) {
// Fl_Widget_Tracker wp(this);
switch (event) {
case FL_PUSH: {
Fl_Widget_Tracker wp(this);
if (!Fl::event_inside(X, Y, W, H)) return 0;
handle_push();
if (wp.deleted()) return 1; }
// fall through ...
case FL_DRAG: {

static int offcenter;

int ww = (horizontal() ? W : H);

if ( event == FL_PUSH )
{
int x = slider_position( value(), ww );

offcenter = (horizontal() ? (Fl::event_x()-X) - x : (Fl::event_y()-Y) - x );
}

try_again:

int mx = (horizontal() ? Fl::event_x()-X : Fl::event_y()-Y) - offcenter;
double v = slider_value( mx, ww );

if (event == FL_PUSH ) // && v == value()) {
{
int os = int(slider_size()*ww+0.5)/2;
if ( abs( offcenter ) > os )
{
offcenter = os;
event = FL_DRAG;
goto try_again;
}
}

handle_drag(clamp(v));
} return 1;
case FL_RELEASE:
handle_release();
return 1;
case FL_KEYBOARD:
{ Fl_Widget_Tracker wp(this);
switch (Fl::event_key()) {
case FL_Up:
if (horizontal()) return 0;
handle_push();
if (wp.deleted()) return 1;
handle_drag(clamp(increment(value(),-1)));
if (wp.deleted()) return 1;
handle_release();
return 1;
case FL_Down:
if (horizontal()) return 0;
handle_push();
if (wp.deleted()) return 1;
handle_drag(clamp(increment(value(),1)));
if (wp.deleted()) return 1;
handle_release();
return 1;
case FL_Left:
if (!horizontal()) return 0;
handle_push();
if (wp.deleted()) return 1;
handle_drag(clamp(increment(value(),-1)));
if (wp.deleted()) return 1;
handle_release();
return 1;
case FL_Right:
if (!horizontal()) return 0;
handle_push();
if (wp.deleted()) return 1;
handle_drag(clamp(increment(value(),1)));
if (wp.deleted()) return 1;
handle_release();
return 1;
default:
return 0;
}
}
// break not required because of switch...
case FL_FOCUS :
case FL_UNFOCUS :
if (Fl::visible_focus()) {
redraw();
return 1;
} else return 0;
case FL_ENTER :
case FL_LEAVE :
return 1;
case FL_MOUSEWHEEL :
{
if ( this != Fl::belowmouse() )
return 0;
if (Fl::e_dy==0)
return 0;
const int steps = Fl::event_ctrl() ? 128 : 16;
const float step = fabs( maximum() - minimum() ) / (float)steps;

int dy = Fl::e_dy;

/* slider is in 'upside down' configuration, invert meaning of mousewheel */
if ( minimum() > maximum() )
dy = 0 - dy;

handle_drag(clamp(value() + step * dy));
return 1;
}
default:
return 0;
}
}

int Fl_SliderX::handle(int event) {
if (event == FL_PUSH && Fl::visible_focus()) {
Fl::focus(this);
redraw();
}

return handle(event,
x()+Fl::box_dx(box()),
y()+Fl::box_dy(box()),
w()-Fl::box_dw(box()),
h()-Fl::box_dh(box()));
}

+ 0
- 50
FL/Fl_SliderX.H View File

@@ -1,50 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2013 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

#pragma once

#include <FL/Fl_Slider.H>

class Fl_SliderX : public Fl_Slider
{
bool _log;


public:

void log ( bool v ) { _log = v; }
bool log ( void ) const { return _log; }

Fl_SliderX( int X, int Y, int W, int H, const char *L=0 ) : Fl_Slider(X,Y,W,H,L)
{
_log = 0;
}

virtual ~Fl_SliderX ( ) { };

virtual int slider_position ( double value, int w );
virtual double slider_value ( int X, int w );

virtual void draw ( int X, int Y, int W, int H );
virtual void draw ( void ) { draw(x(),y(),w(),h()); }


virtual int handle(int event, int X, int Y, int W, int H);
virtual int handle(int event);
};

+ 0
- 113
FL/Fl_Sometimes_Input.H View File

@@ -1,113 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2008 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

#pragma once

/* Just like an Fl_Input, except that when not being edited it
* displays just like a label. */

#include <FL/fl_draw.H>
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Input.H>

class Fl_Sometimes_Input : public Fl_Input
{
Fl_Boxtype _up_box;

public:

Fl_Sometimes_Input ( int X, int Y, int W, int H, const char *L=0 )
: Fl_Input( X, Y, W, H, L )
{
clear_visible_focus();
up_box( FL_NO_BOX );
when(FL_WHEN_ENTER_KEY);
}

void up_box ( Fl_Boxtype b ) { _up_box = b; }
Fl_Boxtype up_box ( void ) const { return _up_box; }

virtual void
draw ( void )
{
if ( this == Fl::focus() )
Fl_Input::draw();
else
{
fl_draw_box( up_box(), x(), y(), w(), h(), color() );

Fl_Color c = fl_contrast( textcolor(), color() );

fl_color( active_r() ? c : fl_inactive( c ) );

fl_font( textfont(), textsize() );
fl_draw( value(), x(), y(), w(), h(), (Fl_Align)(FL_ALIGN_CENTER | FL_ALIGN_CLIP) );
}
}

virtual void
take_focus ( void )
{
set_visible_focus();
Fl_Widget::take_focus();
clear_visible_focus();
}

virtual int
handle ( int m )
{
int r = 0;

switch ( m )
{
case FL_KEYDOWN:
{
if ( ( Fl::event_key() == FL_Enter ||
Fl::event_key() == FL_Tab ) )
{
Fl::focus( NULL );
r = 1;
}
break;
}
case FL_FOCUS:
redraw();
r = 1;
break;
case FL_UNFOCUS:
do_callback();
r = 1;
break;
case FL_PUSH:
take_focus();
redraw();
r = 1;
break;
case FL_DND_ENTER:
return 0;
case FL_PASTE:
return 0;
default:
break;
}
return Fl_Input::handle( m ) | r;
}
};

+ 0
- 76
FL/Fl_Sometimes_Pack.H View File

@@ -1,76 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2012 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

#pragma once

#include <FL/Fl_Pack.H>

class Fl_Sometimes_Pack : public Fl_Pack
{
bool _pack;

public:

Fl_Sometimes_Pack ( int X, int Y, int W, int H, const char *L=0 ) : Fl_Pack(X,Y,W,H,L)
{
_pack = true;
}

virtual ~Fl_Sometimes_Pack ( )
{
}

void pack ( bool b )
{
if ( b != _pack )
redraw();

_pack = b;
}

bool pack ( void ) const
{
return _pack;
}

virtual void draw ( void )
{
/* draw_box(); */

if ( _pack )
{
Fl_Pack::draw();
}
else
{
if ( children() )
{
for ( int i = 0; i < children(); i++ )
{
Fl_Widget *o = child( i );

o->resize( x(),y(),w(), o->h() );
}
resize( x(), y(), w(), child(0)->h() );
}

Fl_Group::draw();
}
}
};

+ 0
- 53
FL/Fl_Text_Edit_Window.fl View File

@@ -1,53 +0,0 @@
# data file for the Fltk User Interface Designer (fluid)
version 1.0300
header_name {.H}
code_name {.C}
decl {\#include <string.h>} {private local
}

widget_class Fl_Text_Edit_Window {open
xywh {377 295 355 410} type Double resizable
code0 {this->size_range( 0, 0, 400, 400 );}
class Fl_Double_Window modal visible
} {
Fl_Box title_box {
label {<title>}
xywh {5 7 345 28}
}
Fl_Text_Editor text_editor {selected
xywh {5 37 345 341} resizable
code0 {o->buffer( new Fl_Text_Buffer );}
}
Fl_Group {} {open
xywh {5 383 345 27}
} {
Fl_Return_Button return_button {
label {<return>}
callback {hide();}
xywh {250 383 100 25}
}
Fl_Box {} {
label {<empty>}
xywh {5 386 240 19} resizable
code0 {o->labeltype( FL_NO_LABEL );}
}
}
}

Function {fl_text_edit( const char *title, const char *button_text, const char *initial_text, int W = 355, int H = 410 )} {open C return_type {char *}
} {
code {Fl_Text_Edit_Window tew( 355, 410, title );

tew.size( W, H );
tew.return_button->label( button_text );
tew.title_box->label( title );
if ( initial_text )
tew.text_editor->buffer()->text( initial_text );

tew.show();

while ( tew.shown() )
Fl::wait();
return strdup( tew.text_editor->buffer()->text() );} {}
}

+ 0
- 234
FL/Fl_Value_SliderX.C View File

@@ -1,234 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2012 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/


#include "Fl_Value_SliderX.H"

#include <FL/Fl.H>
#include <FL/fl_draw.H>
#include <math.h>

void Fl_Value_SliderX::input_cb(Fl_Widget*, void* v) {
Fl_Value_SliderX& t = *(Fl_Value_SliderX*)v;
double nv;
if ((t.step() - floor(t.step()))>0.0 || t.step() == 0.0)
nv = strtod(t.input.value(), 0);
else
nv = strtol(t.input.value(), 0, 0);

if (nv != t.value() || t.when() & FL_WHEN_NOT_CHANGED) {

if ( ! t.soft())
nv = t.clamp(nv);
t.set_value(nv);
t.set_changed();
if (t.when())
{
t.value_damage();
t.do_callback();
}
}
}

void Fl_Value_SliderX::value_damage() {
char buf[128];
format(buf);
input.value(buf);
input.mark(input.position()); // turn off selection highlight
redraw();
}


Fl_Value_SliderX::~Fl_Value_SliderX ( void )
{
if (input.parent() == (Fl_Group *)this)
input.parent(0); // *revert* ctor kludge!
}

/**
Creates a new Fl_Value_SliderX widget using the given
position, size, and label string. The default boxtype is FL_DOWN_BOX.
*/
Fl_Value_SliderX::Fl_Value_SliderX(int X, int Y, int W, int H, const char*l)
: Fl_SliderX(X,Y,W,H,l),input(X, Y, W, H, 0) {
step(1,100);

soft_ = 0;
if (input.parent()) // defeat automatic-add
input.parent()->remove(input);
input.parent((Fl_Group *)this); // kludge!
input.callback(input_cb, this);
input.when(FL_WHEN_ENTER_KEY);
align(FL_ALIGN_LEFT);
value_damage();
textsize(9);
set_flag(SHORTCUT_LABEL);

}

void Fl_Value_SliderX::draw() {

int sxx = x(), syy = y(), sww = w(), shh = h();
int bxx = x(), byy = y(), bww = w(), bhh = h();
if (horizontal()) {
input.resize(x(), y(), 35, h());
bww = 35; sxx += 35; sww -= 35;
} else {
input.resize(x(), y(), w(), 25 );
syy += 25; bhh = 25; shh -= 25;
}
if (damage()&FL_DAMAGE_ALL) draw_box(box(),sxx,syy,sww,shh,color());
Fl_SliderX::draw(sxx+Fl::box_dx(box()),
syy+Fl::box_dy(box()),
sww-Fl::box_dw(box()),
shh-Fl::box_dh(box()));
draw_box(box(),bxx,byy,bww,bhh,color());

if (damage()&~FL_DAMAGE_CHILD) input.clear_damage(FL_DAMAGE_ALL);
input.box(box());
input.color(color(), selection_color());
Fl_Widget *i = &input; i->draw(); // calls protected input.draw()
input.clear_damage();
}

int Fl_Value_SliderX::handle(int event) {
if (event == FL_PUSH && Fl::visible_focus()) {
Fl::focus(this);
redraw();
}

int sxx = x(), syy = y(), sww = w(), shh = h();
if (horizontal()) {
sxx += 35; sww -= 35;
} else {
syy += 25; shh -= 25;
}

double v;
int delta;
int mx = Fl::event_x_root();
static int ix, drag;
// input.when(when());
switch (event) {
case FL_ENTER:
return 1;
case FL_LEAVE:
if ( ! drag )
fl_cursor( FL_CURSOR_DEFAULT );
return 1;
case FL_MOVE:
if ( drag || Fl::event_inside( &input ) )
fl_cursor( FL_CURSOR_WE );
else
fl_cursor( FL_CURSOR_DEFAULT );
return 1;
case FL_PUSH:
// if (!step()) goto DEFAULT;
if ( Fl::event_inside(&input) )
{
input.handle(event);
ix = mx;
drag = Fl::event_button();
handle_push();
return 1;
}
goto DEFAULT;
break;
case FL_DRAG:
{
if ( ! drag )
goto DEFAULT;

fl_cursor( FL_CURSOR_WE );
// if (!step()) goto DEFAULT;
delta = mx-ix;
if (!horizontal())
delta = -delta;

if (delta > 5) delta -= 5;
else if (delta < -5) delta += 5;
else delta = 0;

float S = fabs( maximum() - minimum() );

switch (drag) {
case 3: v = previous_value() + ( S * delta * 0.0100f); break;
case 2: v = previous_value() + ( S * delta * 0.0010f); break;
default:v = previous_value() + ( S * delta * 0.0005f); break;
}

v = round(v);
v = soft()?softclamp(v):clamp(v);
handle_drag(v);
value_damage();
return 1;
}
case FL_RELEASE:

if ( ! drag )
goto DEFAULT;

// if (!step()) goto DEFAULT;
if (value() != previous_value() || !Fl::event_is_click())
handle_release();

drag = 0;

fl_cursor( FL_CURSOR_DEFAULT );

/* else { */
/* Fl_Widget_Tracker wp(&input); */
/* input.handle(FL_PUSH); */
/* if (wp.exists()) */
/* input.handle(FL_RELEASE); */
/* } */
return 1;
case FL_FOCUS:
return input.take_focus();
case FL_UNFOCUS:
{
input_cb(&input,this);
return 1;
}
case FL_PASTE:
return 0;
case FL_SHORTCUT:
return input.handle(event);
}

DEFAULT:
int r = Fl_SliderX::handle(event,
sxx+Fl::box_dx(box()),
syy+Fl::box_dy(box()),
sww-Fl::box_dw(box()),
shh-Fl::box_dh(box()));

if ( r )
{
return r;
}
else
{
input.type(((step() - floor(step()))>0.0 || step() == 0.0) ? FL_FLOAT_INPUT : FL_INT_INPUT);
return input.handle(event);
}
}


+ 0
- 100
FL/Fl_Value_SliderX.H View File

@@ -1,100 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2009 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

#ifndef Fl_Value_SliderX_H
#define Fl_Value_SliderX_H

#include "Fl_SliderX.H"
#include <FL/Fl_Input.H>

/**
The Fl_Value_SliderX widget is a Fl_SliderX widget
with a box displaying the current value.
<P ALIGN=CENTER>\image html value_slider.png
\image latex value_slider.png "Fl_Value_SliderX" width=4cm
*/
class FL_EXPORT Fl_Value_SliderX : public Fl_SliderX {
/* This is the encapsulated Fl_input attribute to which
this class delegates the value font, color and shortcut */
Fl_Input input;

private:
char soft_;
static void input_cb(Fl_Widget*,void*);
virtual void value_damage(); // cause damage() due to value() changing

protected:
void draw();
public:
int handle(int);
Fl_Value_SliderX(int x,int y,int w,int h, const char *l = 0);
virtual ~Fl_Value_SliderX ( );

/** See void Fl_Value_Input::soft(char s) */
void soft(char s) {soft_ = s;}
/**
If "soft" is turned on, the user is allowed to drag
the value outside the range. If they drag the value to one of
the ends, let go, then grab again and continue to drag, they can
get to any value. The default is true.
*/
char soft() const {return soft_;}
/**
Returns the current shortcut key for the Input.
\see Fl_Value_Input::shortcut(int)
*/
int shortcut() const {return input.shortcut();}
/**
Sets the shortcut key to \p s. Setting this
overrides the use of '&' in the label(). The value is a bitwise
OR of a key and a set of shift flags, for example FL_ALT | 'a'
, FL_ALT | (FL_F + 10), or just 'a'. A value
of 0 disables the shortcut.
The key can be any value returned by
Fl::event_key(), but will usually be an ASCII letter. Use
a lower-case letter unless you require the shift key to be held down.
The shift flags can be any set of values accepted by
Fl::event_state(). If the bit is on that shift key must
be pushed. Meta, Alt, Ctrl, and Shift must be off if they are not in
the shift flags (zero for the other bits indicates a "don't care"
setting).
*/
void shortcut(int s) {input.shortcut(s);}
/** Gets the typeface of the text in the value box. */
Fl_Font textfont() const {return input.textfont();}
/** Sets the typeface of the text in the value box. */
void textfont(Fl_Font s) {input.textfont(s);}
/** Gets the size of the text in the value box. */
Fl_Fontsize textsize() const {return input.textsize();}
/** Sets the size of the text in the value box. */
void textsize(Fl_Fontsize s) {input.textsize(s);}
/** Gets the color of the text in the value box. */
Fl_Color textcolor() const {return input.textcolor();}
/** Sets the color of the text in the value box.*/
void textcolor(Fl_Color n) {input.textcolor(n);}
/** Gets the color of the text cursor. The text cursor is black by default. */
Fl_Color cursor_color() const {return input.cursor_color();}
/** Sets the color of the text cursor. The text cursor is black by default. */
void cursor_color(Fl_Color n) {input.cursor_color(n);}
};

#endif


+ 0
- 132
FL/New_Project_Dialog.fl View File

@@ -1,132 +0,0 @@
# data file for the Fltk User Interface Designer (fluid)
version 1.0300
header_name {.H}
code_name {.C}
comment {//
// Copyright (C) 2008 Jonathan Moore Liles
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 2
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
//
} {in_source in_header
}

decl {\#include <stdlib.h>} {private local
}

decl {\#include <string.h>} {private local
}

decl {\#include <stdio.h>} {private local
}

decl {\#include <FL/Fl_File_Chooser.H>} {private local
}

class New_Project_Dialog {open
} {
Function {New_Project_Dialog()} {open
} {
code {_default_path = 0;
path = 0;
make_window();} {}
}
Function {run()} {open return_type void
} {
code {_directory->value( _default_path );

_window->show();

while ( _window->shown() )
Fl::wait();} {}
}
Function {make_window()} {open
} {
Fl_Window _window {
label {New Project} open selected
xywh {743 696 550 105} type Double modal visible
} {
Fl_File_Input _name {
label {Named:}
xywh {75 55 375 35}
}
Fl_Button {} {
label Browse
callback {_directory->value( fl_dir_chooser( "Directory for new project", NULL, 0 ) );}
xywh {455 15 80 35}
}
Fl_Return_Button {} {
label Create
callback {if ( strlen( _directory->value() ) && strlen( _name->value() ) )
{
char pat[1024];
snprintf( pat, sizeof( pat ), "%s/%s", _directory->value(), _name->value() );
path = strdup( pat );
_default_path = _directory->value() ? strdup( _directory->value() ) : 0;

//if ( ! Project::create( pat, _template->text( _template->value() ) ) )
// fl_alert( "Error creating project!" );

_window->hide();
}}
xywh {455 55 80 35}
}
Fl_File_Input _directory {
label {Where:}
callback {if ( ! fl_filename_isdir( o->value() ) )
{
fl_alert( "Must be a directory" );
o->value( "" );
return;
}

// write_line( user_config_dir, "default_path", o->value() );}
xywh {75 15 375 35}
code0 {\#include <FL/filename.H>}
code1 {char *v = NULL;}
code2 {// read_line( user_config_dir, "default_path", &v );}
code3 {o->value( v );}
}
}
}
decl {char *path;} {public local
}
decl {char *_default_path} {private local
}
Function {default_path( char *s )} {open return_type void
} {
code {_default_path = s;} {}
}
Function {default_path()} {open return_type {char *}
} {
code {return _default_path;} {}
}
}

Function {new_project_chooser( char **default_path)} {open C return_type {char*}
} {
code {New_Project_Dialog nsd;

nsd.default_path( *default_path );

nsd.run();

if ( nsd.default_path() )
*default_path = nsd.default_path();

return nsd.path;} {}
}

+ 0
- 52
FL/event_name.C View File

@@ -1,52 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2008 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

static const char *event_names[] =
{
"FL_NO_EVENT",
"FL_PUSH",
"FL_RELEASE",
"FL_ENTER",
"FL_LEAVE",
"FL_DRAG",
"FL_FOCUS",
"FL_UNFOCUS",
"FL_KEYDOWN",
"FL_KEYUP",
"FL_CLOSE",
"FL_MOVE",
"FL_SHORTCUT",
"FL_DEACTIVATE",
"FL_ACTIVATE",
"FL_HIDE",
"FL_SHOW",
"FL_PASTE",
"FL_SELECTIONCLEAR",
"FL_MOUSEWHEEL",
"FL_DND_ENTER",
"FL_DND_DRAG",
"FL_DND_LEAVE",
"FL_DND_RELEASE",
};

const char *
event_name ( int m )
{
return event_names[ m ];
}

+ 0
- 20
FL/event_name.H View File

@@ -1,20 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2008 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

const char *event_name ( int m );

+ 0
- 103
FL/focus_frame.C View File

@@ -1,103 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2012 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

#include <FL/Fl.H>
#include <FL/fl_draw.H>

void
draw_focus_frame ( int x, int y, int w, int h, Fl_Color c )
{
fl_push_clip( x, y, w, h );

// fl_color( fl_color_average( FL_GRAY, c, 0.50 ) );
/* fl_color( fl_color_add_alpha( c, 100 ) ); */

/* fl_line_style( FL_DASH, 2 ); */

/* fl_rect( x, y, w, h ); */

fl_line_style( FL_SOLID, 3 );

fl_color( c );

int l = 15;

fl_line( x, y, x + l, y );
fl_line( x, y + l, x, y );

fl_line( x + w - 1, y, x + w - l - 1, y );
fl_line( x + w - 1, y, x + w - 1, y + l - 1 );

fl_line( x, y + h - 1, x, y + h - l - 1);
fl_line( x, y + h - 1, x + l, y + h - 1 );

fl_line( x + w - 1, y + h - 1, x + w - 1, y + h - l - 1 );
fl_line( x + w - 1, y + h - 1, x + w - l, y + h - 1 );

fl_line_style( FL_SOLID, 0 );

fl_pop_clip();
}

void
draw_selection_frame ( int x, int y, int w, int h, Fl_Color c )
{
fl_push_clip( x, y, w, h );

fl_color( fl_color_average( FL_GRAY, c, 0.50 ) );
/// fl_color( fl_color_add_alpha( c, 100 ) );

fl_line_style( FL_DASH, 2 );

fl_rect( x, y, w, h );

fl_line_style( FL_SOLID, 3 );

fl_color( c );

int l = 15;

fl_line( x, y, x + l, y );
fl_line( x, y + l, x, y );

fl_line( x + w - 1, y, x + w - l - 1, y );
fl_line( x + w - 1, y, x + w - 1, y + l - 1 );

fl_line( x, y + h - 1, x, y + h - l - 1);
fl_line( x, y + h - 1, x + l, y + h - 1 );

fl_line( x + w - 1, y + h - 1, x + w - 1, y + h - l - 1 );
fl_line( x + w - 1, y + h - 1, x + w - l, y + h - 1 );

fl_line_style( FL_SOLID, 0 );

fl_pop_clip();
}

bool
focused_r ( Fl_Widget *w )
{
for ( Fl_Widget *p = Fl::focus(); p; p = p->parent() )
if ( p == w )
return true;
return false;
}

+ 0
- 22
FL/focus_frame.H View File

@@ -1,22 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2012 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

void draw_focus_frame ( int x, int y, int w, int h, Fl_Color c );
void draw_selection_frame ( int x, int y, int w, int h, Fl_Color c );
bool focused_r ( Fl_Widget *w );

+ 0
- 61
FL/img_io_input_connector_10x10_png.h View File

@@ -1,61 +0,0 @@
/*******************************************************************************/
/* Copyright (C) 2013 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

static unsigned char img_io_input_connector_10x10_png[] = {
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0a,
0x08, 0x06, 0x00, 0x00, 0x00, 0x8d, 0x32, 0xcf, 0xbd, 0x00, 0x00, 0x00,
0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64,
0x88, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x00,
0x9e, 0x00, 0x00, 0x00, 0x9e, 0x01, 0x22, 0xcb, 0xc6, 0x03, 0x00, 0x00,
0x00, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61,
0x72, 0x65, 0x00, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x6e, 0x6b, 0x73, 0x63,
0x61, 0x70, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x9b, 0xee, 0x3c, 0x1a, 0x00,
0x00, 0x01, 0x51, 0x49, 0x44, 0x41, 0x54, 0x18, 0x95, 0x3d, 0xd0, 0xb1,
0x6a, 0xdb, 0x40, 0x1c, 0xc0, 0xe1, 0x9f, 0x72, 0x7f, 0xcc, 0x21, 0xbc,
0xc5, 0x87, 0xb0, 0xb7, 0x18, 0x6c, 0xa8, 0x49, 0x37, 0x1b, 0x8c, 0x26,
0xdb, 0x19, 0xfb, 0x0e, 0x7e, 0x82, 0xee, 0x21, 0x53, 0xe9, 0x14, 0x42,
0x37, 0x37, 0x7b, 0x9e, 0xa2, 0x63, 0x07, 0x6b, 0xd6, 0xec, 0xc5, 0xe0,
0x80, 0xc1, 0x08, 0xac, 0x66, 0xf0, 0xa0, 0xb3, 0x90, 0x4e, 0xa7, 0x4e,
0xed, 0xf6, 0xcd, 0x5f, 0xd0, 0xb6, 0x2d, 0x00, 0xfb, 0xfd, 0xfe, 0x4b,
0x59, 0x96, 0x8f, 0x4d, 0xd3, 0xdc, 0x01, 0x4e, 0x44, 0xf2, 0x30, 0x0c,
0x9f, 0x86, 0xc3, 0xe1, 0x6f, 0x80, 0xa0, 0x6d, 0x5b, 0x76, 0xbb, 0xdd,
0xb7, 0xf3, 0xf9, 0xfc, 0x35, 0x4d, 0xd3, 0x5e, 0x96, 0x65, 0x78, 0xef,
0x19, 0x0c, 0x06, 0x4c, 0xa7, 0xd3, 0x8f, 0x28, 0x8a, 0x7e, 0x4e, 0x26,
0x93, 0xef, 0x6a, 0xbd, 0x5e, 0x3f, 0x9c, 0x4e, 0xa7, 0x1f, 0x49, 0x92,
0xf4, 0x2e, 0x97, 0x0b, 0xdb, 0xed, 0x96, 0xe3, 0xf1, 0x88, 0x31, 0x86,
0x2c, 0xcb, 0x42, 0x63, 0xcc, 0x7d, 0x5d, 0xd7, 0xbb, 0x1b, 0x6b, 0xed,
0x73, 0x9a, 0xa6, 0xb7, 0x00, 0x4a, 0x29, 0x44, 0x04, 0x11, 0x41, 0x29,
0x05, 0x40, 0x9a, 0xa6, 0xbd, 0xb2, 0x2c, 0x1f, 0xc5, 0x39, 0x67, 0xac,
0xb5, 0x78, 0xef, 0x09, 0x82, 0x80, 0xd5, 0x6a, 0x45, 0x10, 0x04, 0xb4,
0x6d, 0x8b, 0x73, 0x8e, 0xa2, 0x28, 0x68, 0x9a, 0xe6, 0x4e, 0x00, 0xf1,
0xde, 0x93, 0x24, 0x09, 0x45, 0x51, 0x10, 0xc7, 0x31, 0x22, 0x42, 0x92,
0x24, 0x68, 0xad, 0x59, 0x2e, 0x97, 0x00, 0xee, 0x46, 0x29, 0xf5, 0xde,
0xed, 0x76, 0xb9, 0x5e, 0xaf, 0x78, 0xef, 0xa9, 0xaa, 0x8a, 0xaa, 0xaa,
0xfe, 0x5b, 0x6b, 0x8d, 0x88, 0xe4, 0xa2, 0xb5, 0x7e, 0x99, 0xcd, 0x66,
0x9f, 0xf2, 0x3c, 0xef, 0x59, 0x6b, 0x31, 0xc6, 0x00, 0x10, 0xc7, 0x31,
0x9d, 0x4e, 0x87, 0xf9, 0x7c, 0xfe, 0x11, 0x86, 0xe1, 0x93, 0xda, 0x6c,
0x36, 0x7b, 0x6b, 0x6d, 0xd8, 0xef, 0xf7, 0x3f, 0x5b, 0x6b, 0xc3, 0xba,
0xae, 0x01, 0x30, 0xc6, 0xb0, 0x58, 0x2c, 0xfe, 0x44, 0x51, 0xf4, 0x3a,
0x1e, 0x8f, 0xdf, 0x82, 0x7f, 0xe1, 0x87, 0xc3, 0xe1, 0xc1, 0x5a, 0xfb,
0xec, 0x9c, 0x33, 0x80, 0x28, 0xa5, 0xde, 0xb5, 0xd6, 0x2f, 0xa3, 0xd1,
0xe8, 0x17, 0xc0, 0x5f, 0xd1, 0x17, 0xa6, 0x12, 0x83, 0xc3, 0x30, 0x9b,
0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82

};
static unsigned int img_io_input_connector_10x10_png_len = 468;

+ 0
- 63
FL/img_io_output_connector_10x10_png.h View File

@@ -1,63 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2013 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

static unsigned char img_io_output_connector_10x10_png[] = {
0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x0a,
0x08, 0x06, 0x00, 0x00, 0x00, 0x8d, 0x32, 0xcf, 0xbd, 0x00, 0x00, 0x00,
0x04, 0x73, 0x42, 0x49, 0x54, 0x08, 0x08, 0x08, 0x08, 0x7c, 0x08, 0x64,
0x88, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x00,
0x9e, 0x00, 0x00, 0x00, 0x9e, 0x01, 0x22, 0xcb, 0xc6, 0x03, 0x00, 0x00,
0x00, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61,
0x72, 0x65, 0x00, 0x77, 0x77, 0x77, 0x2e, 0x69, 0x6e, 0x6b, 0x73, 0x63,
0x61, 0x70, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x9b, 0xee, 0x3c, 0x1a, 0x00,
0x00, 0x01, 0x61, 0x49, 0x44, 0x41, 0x54, 0x18, 0x95, 0x35, 0xd0, 0xbf,
0x6a, 0xc2, 0x40, 0x00, 0x07, 0xe0, 0xdf, 0xfd, 0x89, 0xe4, 0x32, 0xc4,
0x40, 0xed, 0x22, 0x9c, 0x50, 0x24, 0x99, 0x1c, 0xdc, 0x33, 0x38, 0x64,
0xec, 0x03, 0x14, 0x9c, 0xd4, 0xb9, 0x7b, 0xe9, 0x54, 0x3a, 0x95, 0xd2,
0xb1, 0x1d, 0x74, 0xeb, 0xe4, 0xec, 0xd2, 0x31, 0x01, 0x9f, 0x40, 0x04,
0xe9, 0x10, 0x85, 0x06, 0x1c, 0x6d, 0x40, 0x34, 0xe4, 0xd0, 0x0b, 0x5e,
0xa7, 0x7e, 0x8f, 0xf0, 0x11, 0x63, 0x0c, 0x00, 0x60, 0xbd, 0x5e, 0xdf,
0x96, 0x65, 0xf9, 0xa0, 0xb5, 0xbe, 0x21, 0x84, 0x54, 0x9c, 0xf3, 0x9d,
0x10, 0xe2, 0x31, 0x08, 0x82, 0x18, 0x00, 0x88, 0x31, 0x06, 0xab, 0xd5,
0xea, 0x69, 0xbb, 0xdd, 0xde, 0x27, 0x49, 0xd2, 0xb0, 0x6d, 0x1b, 0x8c,
0x31, 0x14, 0x45, 0x81, 0x28, 0x8a, 0x72, 0x29, 0xe5, 0x7b, 0xa7, 0xd3,
0x79, 0x66, 0xfd, 0x7e, 0x3f, 0xca, 0xb2, 0xec, 0x6d, 0x36, 0x9b, 0x35,
0x84, 0x10, 0x18, 0x8d, 0x46, 0xe8, 0x76, 0xbb, 0x58, 0x2e, 0x97, 0x58,
0x2c, 0x16, 0x4e, 0xb3, 0xd9, 0xec, 0x00, 0xf8, 0xa6, 0x4a, 0xa9, 0x97,
0x38, 0x8e, 0xaf, 0x00, 0x40, 0x6b, 0x8d, 0xf3, 0xf9, 0x8c, 0xd3, 0xe9,
0x04, 0xad, 0x35, 0x00, 0x20, 0x49, 0x92, 0x46, 0x59, 0x96, 0x0f, 0xbc,
0xaa, 0xaa, 0xeb, 0xe3, 0xf1, 0x08, 0xc6, 0x18, 0x2e, 0x97, 0x0b, 0xc6,
0xe3, 0x31, 0x8c, 0x31, 0xa0, 0x94, 0xa2, 0x56, 0xab, 0xe1, 0x70, 0x38,
0x40, 0x6b, 0x7d, 0xc3, 0x8d, 0x31, 0x9c, 0x52, 0x8a, 0xe1, 0x70, 0x08,
0xcf, 0xf3, 0x30, 0x9d, 0x4e, 0xa1, 0xb5, 0xc6, 0x60, 0x30, 0x40, 0x51,
0x14, 0x98, 0x4c, 0x26, 0x20, 0x84, 0x54, 0xd4, 0xb2, 0xac, 0x1f, 0xd7,
0x75, 0xe1, 0xba, 0x2e, 0x38, 0xe7, 0x70, 0x1c, 0x07, 0x42, 0x08, 0x30,
0xc6, 0x60, 0xdb, 0x36, 0x3c, 0xcf, 0x03, 0xe7, 0x7c, 0x47, 0xd2, 0x34,
0xbd, 0xdd, 0x6c, 0x36, 0x9f, 0xf3, 0xf9, 0xbc, 0x51, 0xaf, 0xd7, 0x91,
0x65, 0x19, 0x00, 0xa0, 0xd5, 0x6a, 0x41, 0x29, 0x85, 0x30, 0x0c, 0xf3,
0x76, 0xbb, 0x7d, 0x47, 0x7d, 0xdf, 0xff, 0x92, 0x52, 0x7e, 0xf4, 0x7a,
0xbd, 0x3c, 0xcf, 0x73, 0xfc, 0xdb, 0xef, 0xf7, 0x08, 0xc3, 0xf0, 0x57,
0x4a, 0xf9, 0x1e, 0x04, 0x41, 0x4c, 0xfe, 0xc3, 0xd3, 0x34, 0x8d, 0x94,
0x52, 0x2f, 0x55, 0x55, 0x5d, 0x1b, 0x63, 0xb8, 0x65, 0x59, 0x3f, 0x8e,
0xe3, 0xbc, 0xfa, 0xbe, 0xff, 0x05, 0x00, 0x7f, 0xb0, 0xa3, 0x9e, 0x20,
0x9c, 0xde, 0x99, 0x8e, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44,
0xae, 0x42, 0x60, 0x82
};
static unsigned int img_io_output_connector_10x10_png_len = 484;

+ 0
- 1
FL/lib View File

@@ -1 +0,0 @@
../lib

+ 0
- 61
FL/menu_popup.C View File

@@ -1,61 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2008 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

#include <FL/Fl.H>
#include <FL/Fl_Menu_.H>
#include <FL/Fl_Menu_Item.H>

/** popup menu and execute callback */
bool
menu_popup ( Fl_Menu_ *m, int X, int Y )
{
const Fl_Menu_Item *r = m->menu()->popup( X, Y, m->label() );

if ( r )
{
m->value( r );
if ( r->callback() )
r->do_callback( static_cast<Fl_Widget*>(m) );
else if ( m->callback() )
m->do_callback( static_cast<Fl_Widget*>(m), m->user_data() );

return true;
}

return false;
}

/** popup menu and execute callback */
bool
menu_popup ( Fl_Menu_ *m )
{
return menu_popup( m, Fl::event_x(), Fl::event_y() );
}

/** set a single callback for all items in menu. */
void
menu_set_callback( Fl_Menu_Item *menu, void (*callback)( Fl_Widget *, void * ), void *user_data )
{
for ( int i = menu->size(); i--; )
if ( menu[i].label() && ! menu[i].submenu() )
{
menu[i].callback( callback );
menu[i].user_data( user_data );
}
}

+ 0
- 26
FL/menu_popup.H View File

@@ -1,26 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2008 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

class Fl_Menu_;
struct Fl_Menu_Item;
class Fl_Widget;

bool menu_popup ( Fl_Menu_ *m, int X, int Y );
bool menu_popup ( Fl_Menu_ *m );
void menu_set_callback ( Fl_Menu_Item *menu, void (*callback)( Fl_Widget *, void * ), void *user_data );

+ 0
- 40
FL/test_press.C View File

@@ -1,40 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2008 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

/* Fl::test_shortcut() is broken for use in FL_PUSH handlers etc,
* because it relies on Fl::event_text(), which isn't cleared as it
* should be--and there's no official way to clear it. Therefore, we
* provide a test_press() function instead, which, unlike
* test_shortcut(), does not treat a missing FL_SHIFT as "don't care". */

#include <FL/Fl.H>

int
test_press ( unsigned long e )
{
if ( Fl::event_text()[0] )
((char *)Fl::event_text())[0] = '\0';

const int mod_mask = FL_SHIFT | FL_ALT | FL_CTRL;

if ( ( e & mod_mask ) != ( Fl::event_state() & mod_mask ) )
return false;
else
return Fl::test_shortcut( e );
}

+ 0
- 20
FL/test_press.H View File

@@ -1,20 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2008 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

int test_press ( unsigned long e );

+ 0
- 163
FL/util/ntk-perf.C View File

@@ -1,163 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2012 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

#include <FL/Fl.H>
#include <FL/Fl_Double_Window.H>
#include <FL/Fl_Single_Window.H>
#include <FL/Fl_Pack.H>
#include <FL/Fl_Choice.H>
#include <FL/fl_draw.H>
#include <sys/time.h>
#include <stdio.h>

static Fl_Boxtype boxtype = FL_UP_BOX;

#include <unistd.h>

unsigned long long tv_to_ts ( timeval *tv )
{
return tv->tv_sec * 1e6 + tv->tv_usec;
}

unsigned long long get_ts ( void )
{
struct timeval then;
gettimeofday( &then, NULL );

return tv_to_ts( &then );
}

class PerfTest : public Fl_Widget
{
public:

PerfTest ( int X, int Y, int W, int H, const char *L=0 ) : Fl_Widget( X, Y, W, H, L )
{
align(FL_ALIGN_TOP | FL_ALIGN_RIGHT |FL_ALIGN_INSIDE);
box(FL_UP_BOX);
labelcolor( FL_WHITE );
use_cairo = false;
}

bool use_cairo;

void draw ( void )
{
if ( use_cairo )
fl_push_use_cairo(true);

fl_rectf( x(), y(), w(), h(), FL_BLACK );

unsigned long long then = get_ts();

fl_push_clip( x(), y(), w(), h() );

int count = 400;

/* draw stuff */
int i = 0;
for ( ; i < count; ++i )
fl_draw_box( boxtype, x(), y(), w(), h(), fl_lighter( FL_BLACK ) );

fl_pop_clip();

unsigned long long now = get_ts();

double elapsedms = (now - then) / 1000.0;

static char text[256];
sprintf( text, "Drew %i boxes in in %fms", i, elapsedms );

fl_color( FL_RED );
fl_draw( text, x(), y(), w(), h(), FL_ALIGN_CENTER | FL_ALIGN_INSIDE );

draw_label();

if ( use_cairo )
fl_pop_use_cairo();
}
};


void
boxtype_cb ( Fl_Widget *w, void *v )
{
const char *picked = ((Fl_Choice*)w)->mvalue()->label();

if ( !strcmp( picked, "UP_BOX" ) )
boxtype = FL_UP_BOX;
else if ( !strcmp( picked, "FLAT_BOX" ) )
boxtype = FL_FLAT_BOX;
else if ( !strcmp( picked, "ROUNDED_BOX" ) )
boxtype = FL_ROUNDED_BOX;
else if ( !strcmp( picked, "OVAL_BOX" ) )
boxtype = FL_OVAL_BOX;
w->window()->redraw();
}

int
main ( int argc, char **argv )
{
{
Fl_Single_Window *w = new Fl_Single_Window( 800, 600 );
{ Fl_Choice *o = new Fl_Choice( 0, 0, 200, 24, "Boxtype" );
o->align( FL_ALIGN_RIGHT );

o->callback( boxtype_cb, NULL );

o->add( "UP_BOX" );
o->add( "FLAT_BOX" );
o->add( "ROUNDED_BOX" );
o->add( "OVAL_BOX" );
}

{
Fl_Pack *o = new Fl_Pack( 0, 24, 800, 600 - 24 );
o->type( 0 );
{
PerfTest *o = new PerfTest( 0,0, 800, 400, "Xlib" );
}

{
PerfTest *o = new PerfTest( 0,0, 800, 400, "Cairo" );
o->use_cairo = true;
}

o->end();
}
w->end();
w->show();
}

/* { */
/* Fl_Single_Window *w = new Fl_Single_Window( 800, 600 ); */

/* PerfTest *o = new PerfTest( 0,0, 800, 600 ); */
/* w->end(); */
/* w->show(); */
/* } */

Fl::run();
}

+ 0
- 29
FL/wscript View File

@@ -1,29 +0,0 @@
#!/usr/bin/env python

def options(opt):
pass

def configure(conf):
pass

def build(bld):
bld.stlib(
source =
'''
About_Dialog.fl
Fl_Menu_Settings.C
Fl_Scalepack.C
Fl_Text_Edit_Window.fl
Fl_Value_SliderX.C
Fl_DialX.C
Fl_SliderX.C
New_Project_Dialog.fl
event_name.C
menu_popup.C
test_press.C
focus_frame.C
''',
includes = '.',
export_incdirs = [ '.' 'FL' ],
uselib = 'PTHREAD NTK',
target = 'fl_widgets')

README.build → README.md View File


+ 0
- 515
mixer/doc/MANUAL.html View File

@@ -1,515 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head>
<meta name="generator" content="Generated by MUP v3.5">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link type="text/css" rel="stylesheet" href="mup.css">
<title>Non Mixer User Manual</title>
</head>
<body>

<div id=cover>
<h1>Non Mixer User Manual</h1>
<h3></h3>
<address>
Jonathan Moore Liles <a href="mailto:male@tuxfamily.org">&lt;male@tuxfamily.org&gt;</a><br>
<br>

</address><hr></div>
<div id=body>
<div id=toc>
<h1 id=toc>Table Of Contents</h1>
<ul>
<li><a href="#n:1.">1. Non Mixer User Manual</a>
<ul><li><a href="#n:1.1.">1.1. Mixer Groups</a>

<ul><li><a href="#n:1.1.1.">1.1.1. How to Choose Groupings</a>

<li><a href="#n:1.1.2.">1.1.2. Considering JACK Overhead</a>

<li><a href="#n:1.1.3.">1.1.3. Creating a New Group</a>

<li><a href="#n:1.1.4.">1.1.4. Adding a Strip to an Existing Group</a>

<li><a href="#n:1.1.5.">1.1.5. Removing a Strip from a Group</a>

<li><a href="#n:1.1.6.">1.1.6. Removing a Group</a>

<li><a href="#n:1.1.7.">1.1.7. Monitoring Group DSP Load</a>

</ul><li><a href="#n:1.2.">1.2. Mixer Strips</a>

<ul><li><a href="#n:1.2.1.">1.2.1. Navigation</a>

<li><a href="#n:1.2.2.">1.2.2. Control</a>

<li><a href="#n:1.2.3.">1.2.3. Signal Chain</a>

<ul><li><a href="#n:1.2.3.1.">1.2.3.1. Modules</a>

<ul><li><a href="#n:1.2.3.1.1.">1.2.3.1.1. OSC Control</a>

<li><a href="#n:1.2.3.1.2.">1.2.3.1.2. MIDI Control</a>

<li><a href="#n:1.2.3.1.3.">1.2.3.1.3. Manipulation</a>

<li><a href="#n:1.2.3.1.4.">1.2.3.1.4. Module Parameter Editor</a>

<li><a href="#n:1.2.3.1.5.">1.2.3.1.5. Controls</a>

<ul><li><a href="#n:1.2.3.1.5.1.">1.2.3.1.5.1. Control Voltages</a>

</ul><li><a href="#n:1.2.3.1.6.">1.2.3.1.6. Spatialization </a>

<ul><li><a href="#n:1.2.3.1.6.1.">1.2.3.1.6.1. Spatializer Module</a>

<ul><li><a href="#n:1.2.3.1.6.1.1.">1.2.3.1.6.1.1. Reverb Routing</a>

</ul><li><a href="#n:1.2.3.1.6.2.">1.2.3.1.6.2. LADSPA Plugins</a>

</ul></ul></ul></ul><li><a href="#n:1.3.">1.3. Spatialization Console</a>

<li><a href="#n:1.4.">1.4. Projects</a>

<ul><li><a href="#n:1.4.1.">1.4.1. JACK I/O</a>

</ul></ul></ul></ul><hr></div>
<h1 id="n:1.">1. Non Mixer User Manual</h1>
<center><div class="fig image"><table id="Fig.1.1" border=1>
<caption>
<strong>Fig. 1.1.</strong> Mixer
</caption>

<tr><td><img src="non-mixer-complex.png" alt="fig. 1.1"></td></tr>
</table></div></center>
<p>
The Non-Mixer is a stand-alone audio mixer, utilizing JACK as an audio subsystem. At the time of writing, the architecture of Non-Mixer is unique. By making the mixer stand-alone, concepts such as busses, sends, and inserts are eliminated, as the same goals can be achieved by simply adding more strips to the mixer.
</p>
<p>
Start by creating a new project (menu item <tt>Project/New</tt>).
</p>
<center><div class="fig image"><table id="Fig.1.2" border=1>
<caption>
<strong>Fig. 1.2.</strong> New Project
</caption>

<tr><td><img src="new-project.png" alt="fig. 1.2"></td></tr>
</table></div></center>
<p>
After the project has been created. Hit <tt>a</tt> or choose <tt>Mixer/Add Strip</tt> from the menu to add a new strip to the mixer.
</p>
<h2 id="n:1.1.">1.1. Mixer Groups</h2>
<center><div class="fig image"><table border=1>
<tr><td><img src="group-dropdown.png" alt="fig. "></td></tr>
</table></div></center>
<p>
Groups serve several purposes. Firstly, they allow for some organization of strips. Groups also allow parallel relationships of mixer strips to be made explicit. This has important performance implications in JACK2. Non Mixer supports an unlimited number of groups, each of which can contain an unlimited number of mixer strips.
</p>
<h3 id="n:1.1.1.">1.1.1. How to Choose Groupings</h3>
<p>
All strips in a group should be completely parallel with no feedback loop connections. A typical group might be named 'Input' and contain all input strips (strips that accept input from Non Timeline and have outputs all connecting to some master bus).
</p>
<p>
To put it another way, if you have 100 inputs strips with identical output configurations (e.g. stereo or B-Format), that all connect to a master bus, then you have a candidate for a group.
</p>
<h3 id="n:1.1.2.">1.1.2. Considering JACK Overhead</h3>
<p>
JACK provides immense flexibility. But, as in most situations, that flexibility comes with a cost. In JACK the cost is a context switch per client. This applies <i>even for many clients which belong to the same process</i>, as in Non Mixer. Various factors go into determining the price of a context switch on any given system. It's not very expensive, but it does add up. It becomes problematic in sessions involving many clients (think 100s), each of which having a small DSP load (often smaller than the cost of JACK's context context switch). JACK <b>could</b> be smart enough to recognize that some clients belong to the same process and could be executed serially without requiring a context switch, but at the time of writing neither JACK1 nor JACK2's scheduling is that smart.
</p>
<p>
If you're mixing a normal song (couple of dozen tracks) at low latency, this overhead will probably account for less than 1% of the total DSP load. If you're mixing an entire orchestra at ultra-low latency, then it might account for a quarter or more of the total DSP load.
</p>
<p>
Groups mitigate this cost by reducing the number of JACK clients required for a mix. Strips in a group will execute serially without context switches or thread synchronization--reducing the total JACK overhead. However, if you have several groups, then they may all by run in parallel by JACK2.
</p>
<p>
<p>
To illustrate this point here are some figures from an actual song session including the whole Non suite plus a sampler, a synth and an ambisonics convolution reverb with a total of 13 strips in 4 groups in different configurations on the same system.
</p>
<p>
JACK's DSP load figures are interpreted thus: if at a 2.7ms software latency setting the average time a proces cycle takes to complete is 2.7ms, then the DSP load is 100%. The usable ceiling on DSP load is 80%. This is true for both JACK1 and JACK2. The difference is that JACK2 may use all available CPU cores to execute the graph (if there are enough clients in parallel signal flow).
</p>
<p>
32-bit Intel Core2 Duo @1.6Ghz -r 48000 -p 256 -n 2 (5.3ms)
</p>
<center><div class="fig table"><table border=1>
<tr><th>JACK Ver</th><th>Groups</th><th>DSP Load</th></tr>
<tr><td>JACK1</td><td>N</td><td>39%</td></tr>
<tr><td>JACK1</td><td>Y</td><td>27%</td></tr>
<tr><td>JACK2</td><td>N</td><td>24%</td></tr>
<tr><td>JACK2</td><td>Y</td><td>31%</td></tr>
</table></div></center>
<p>
AMD FX-8350 @ 4.2Ghz 64-bit -r 48000 -p 256 -n 2 (5.3ms)
</p>
<center><div class="fig table"><table border=1>
<tr><th>JACK Ver</th><th>Groups</th><th>DSP Load</th></tr>
<tr><td>JACK1</td><td>N</td><td>28%</td></tr>
<tr><td>JACK1</td><td>Y</td><td>12%</td></tr>
<tr><td>JACK2</td><td>N</td><td>12%</td></tr>
<tr><td>JACK2</td><td>Y</td><td>11%</td></tr>
</table></div></center>
<p>
AMD FX-8350 @ 4.2Ghz 64-bit -r 48000 -p 128 -n 2 (2.7ms)
</p>
<center><div class="fig table"><table border=1>
<tr><th>JACK Ver</th><th>Groups</th><th>DSP Load</th></tr>
<tr><td>JACK1</td><td>N</td><td>29%</td></tr>
<tr><td>JACK1</td><td>Y</td><td>17%</td></tr>
<tr><td>JACK2</td><td>N</td><td>17%</td></tr>
<tr><td>JACK2</td><td>Y</td><td>17%</td></tr>
</table></div></center>
<p>
AMD FX-8350 @ 4.2Ghz 64-bit -r 48000 -p 32 -n 2 (0.7ms)
</p>
<center><div class="fig table"><table border=1>
<tr><th>JACK Ver</th><th>Groups</th><th>DSP Load</th></tr>
<tr><td>JACK1</td><td>N</td><td>x</td></tr>
<tr><td>JACK1</td><td>Y</td><td>x</td></tr>
<tr><td>JACK2</td><td>N</td><td>43%</td></tr>
<tr><td>JACK2</td><td>Y</td><td>41%</td></tr>
</table></div></center>
<p>
As you can see, for multiprocessor systems, JACK2 clearly has an advantage even without grouping.
</p>
<p>
Of course, results will vary depending on the system and the mix. On the dual core system, performance actually degraded with JACK2 when using groups--this is because the number of parallel flows that JACK2 detected was reduced and the second core was being under utilized. Similarly, the performance of the 8-core AMD system doesn't seem that great even in the ungrouped mode--this is because the DSP load of each individual client is around the same as the cost of the context switching. It's a wash either way (if each strip had more or more complex modules on it, then the ungrouped mode would probably perform better). Since JACK1 cannot take advantage of more than 1 CPU core, there is no benefit to parallelism and grouped mode always outperforms ungrouped mode.
</p>
<p>
So, for maximum capacity the combination of a multicore CPU with JACK2 and mixer groups is best.
</p>
<h3 id="n:1.1.3.">1.1.3. Creating a New Group</h3>
<p>
Groups can be created by selecting the group dropdown on any mixer strip and choosing 'New Group'. A window will popup asking for a group name. Group names must be unique. The group will then be created and the selected strip added to it.
</p>
<h3 id="n:1.1.4.">1.1.4. Adding a Strip to an Existing Group</h3>
<p>
To add a strip to an existing group, simply select a group name from the group dropdown on the strip.
</p>
<h3 id="n:1.1.5.">1.1.5. Removing a Strip from a Group</h3>
<p>
Select '---' from the group dropdown. The strip will be removed from the group and will run in an independent JACK client.
</p>
<h3 id="n:1.1.6.">1.1.6. Removing a Group</h3>
<p>
Groups are destroyed automatically as soon as they contain zero strips.
</p>
<h3 id="n:1.1.7.">1.1.7. Monitoring Group DSP Load</h3>
<p>
Above the grop dropdown on each strip is a DSP load meter for the selected group. For ungrouped strips or strips which are the only one in their group, this is simply the DSP load of the single strip.
</p>
<p>
If DSP usage goes up when strips are fed silence, then you're probably running a plugin which has denormal issues.
</p>
<h2 id="n:1.2.">1.2. Mixer Strips</h2>
<center><div class="fig image"><table id="Fig.1.3" border=1>
<caption>
<strong>Fig. 1.3.</strong> Mixer Strip
</caption>

<tr><td><img src="single-strip.png" alt="fig. 1.3"></td></tr>
</table></div></center>
<p>
Each mixer strip has a name and color, each of which may be defined by the user. Names, but not colors, must be unique. In addition, each strip has controls to move it left or right (the arrows) in the display and to remove it entirely (the 'X').
</p>
<p>
Strips start out in <i>narrow</i> mode, with the <i>fader</i> view enabled. Click the desired button to toggle the mode or view.
</p>
<p>
<p>
The fader view comprises a large gain control and digital peak meter indicator. These are automatically connected to the default gain and meter modules of the strip's signal chain.
</p>
<p>
To see how an audio signal traveling through this strip will be processed, switch to its <i>signal</i> view.
</p>
<h3 id="n:1.2.1.">1.2.1. Navigation</h3>
<p>
A strip is focused when you click on it. Focus can be moved among strips with the <tt>Tab</tt> and <tt>Shift-Tab</tt> keys.
</p>
<h3 id="n:1.2.2.">1.2.2. Control</h3>
<p>
The focused strip can be moved in the display order via the <tt>[</tt> and <tt>]</tt> keys. <tt>Delete</tt> removes a strip (with confirmation dialog). <tt>n</tt> and <tt>w</tt> set the focused strip's width to <i>narrow</i> or <i>wide</i>, respectively, and <tt>f</tt> and <tt>s</tt> switch between <i>fader</i> and <i>signal</i> views. The strip's context menu can be invoked without the mouse by hitting the <tt>Menu</tt> key (assuming your keyboard has one).
</p>
<h3 id="n:1.2.3.">1.2.3. Signal Chain</h3>
<p>
The signal chain view of a mixer strip provides a way to view and manipulate the signal processing of a mixer strip.
</p>
<h4 id="n:1.2.3.1.">1.2.3.1. Modules</h4>
<center><div class="fig image"><table id="Fig.1.4" border=1>
<caption>
<strong>Fig. 1.4.</strong> Modules
</caption>

<tr><td><img src="modules.png" alt="fig. 1.4"></td></tr>
</table></div></center>
<p>
All signal processing in Non Mixer occurs in <i>Modules</i>. Modules are signal processing abstractions providing ports for audio and control I/O and, in addition, some simple user interface. Sink and source modules carry audio out of and into JACK.
</p>
<p>
Modules are displayed as named blocks. Some modules (e.g. the Meter module) may have additional GUI components.
</p>
<p>
Each module has zero or more audio I/O ports and zero or more control ports. Audio routing between modules is handled automatically. Modules with mono audio configurations (one channel in, one channel out) can be automatically adjusted to support any number of discrete channels. Modules with more (related) channels, however, introduce restrictions on the order in which modules can be chained.
</p>
<p>
An indicator in the upper left-hand corner of each module block indicates whether the module has any parameters bound to controls.
</p>
<p>
Non Mixer has several built-in modules. They are:
</p>
<dl>
<dt><em>JACK</em></dt>
<dd>Performs JACK I/O</dd>
<dt><em>Gain</em></dt>
<dd>Applies gain in dB</dd>
<dt><em>Meter</em></dt>
<dd>Digital Peak Meter</dd>
<dt><em>Mono Pan</em></dt>
<dd>Performs intensity panning of a mono signal into a stereo signal.</dd>
<dt><em>Aux</em></dt>
<dd>Provides auxiliary outputs</dd>
<dt><em>Spatializer</em></dt>
<dd>Provides advanced Ambisonics spatialization with distance simulation.</dd>
<dt><em>Plugin</em></dt>
<dd>Hosts a LADSPA plugin</dd>
</dl>
<h5 id="n:1.2.3.1.1.">1.2.3.1.1. OSC Control</h5>
<p>
The input parameters of all modules are controllable via OSC, regardless of whether the parameter is set as controllable.
</p>
<p>
The format of the automatically generated OSC path names is as follows:
</p>
<div class="fig example"><table width=100%><tr><td><pre>
/strip/[STRIP_NAME]/[MODULE_NAME]/[PARAMETER_NAME]
</pre></td></tr>
</table></div>
<p>
The UDP port that the OSC server binds to can be set by providing the <tt>--osc-port</tt> command-line option. Without this option, a random port will be bound automatically (the exact OSC URL will always be printed to the console as a line beginning with "OSC: ").
</p>
<p>
The default path accepts a float value between 0.0 and 1.0 (a Control Voltage like signal) which will be automatically scaled to the allowable range of the control.
</p>
<p>
A path ending in /unscaled is also available, which accepts exact values, which will be clamped to the allowable range. For example:
</p>
<div class="fig example"><table width=100%><tr><td><pre>
/strip/[STRIP_NAME]/[MODULE_NAME]/[PARAMETER_NAME]/unscaled
</pre></td></tr>
</table></div>
<p>
If same module/plugin is used twice in a signal chain (e.g. multiple Gain stages), then a position dependent sequence number will be appended to the module name. For example, a path might look like the following:
</p>
<div class="fig example"><table width=100%><tr><td><pre>
/strip/Foo/Gain.1/Gain_(dB)
</pre></td></tr>
</table></div>
<p>
For the second instance of the Gain module on the strip named 'Foo'.
</p>
<p>
There's a possibility to get exact OSC path for module controls. For this you need to switch strip mode to 'Signl', right click a module, for example 'Gain', and open 'Edit parameters' dialog. OSC path will be shown in a statusbar of the main window when you hover a parameter.
</p>
<p>
Non-DAW accesses these same signals via a more advanced signal routing layer on top of OSC. Any module parameter is easily controlled via Control Sequences in Non-DAW without the need to specify an OSC URL.
</p>
<h5 id="n:1.2.3.1.2.">1.2.3.1.2. MIDI Control</h5>
<p>
Automatic translation between MIDI and Non's OSC Signals can be achieved by adding the headless program <tt>non-midi-mapper</tt> (included in the Non-Mixer distribution) to an NSM session.
</p>
<p>
Non-MIDI-Mapper provides JACK MIDI input and output ports that can be connected to a suitable controller device.
</p>
<p>
In Non-Mixer, the <tt>Remote Control/Start Learning</tt> menu item enters learning mode in which Non Mixer can be taught which controls to associated with which MIDI messages by clicking a control in Non-Mixer and moving the desired control on the MIDI device. <tt>Remote Control/End Learning</tt> ends the learning session.
</p>
<p>
The mapping will be saved with the NSM session.
</p>
<h5 id="n:1.2.3.1.3.">1.2.3.1.3. Manipulation</h5>
<p>
Left-clicking on a module brings up a Module Parameter Editor window for the selected module.
</p>
<p>
Right-clicking on a module brings up a context menu allowing you manipulate the module, as well as to pick a new module to insert before the selected one in the chain.
</p>
<p>
Middle-clicking on a module toggles its activation state (the audio signal will bypass inactive modules).
</p>
<p>
Control+Right-clicking on a module causes it to be removed from the chain (modules added by default cannot be removed).
</p>
<p>
The focused module may also be controlled via the keyboard. <tt>Menu</tt> brings up the context menu for the focused module. <tt>Space</tt> opens the module parameter editor, <tt>b</tt> toggles the bypassed state, and <tt>Delete</tt> removes the module from the chain (without confirmation!). <tt>Control-X</tt>, <tt>Control-C</tt> and <tt>Control-V</tt>, cut, copy, and paste modules, respectively. Modules may be copied within or across chain boundaries. The normal module I/O constraints also apply to pasted modules.
</p>
<h5 id="n:1.2.3.1.4.">1.2.3.1.4. Module Parameter Editor</h5>
<center><div class="fig image"><table id="Fig.1.5" border=1>
<caption>
<strong>Fig. 1.5.</strong> Module Parameter Editor
</caption>

<tr><td><img src="module-parameter-editor.png" alt="fig. 1.5"></td></tr>
</table></div></center>
<p>
The Module Parameter Editor is used to alter the values of a module's parameters, and in addition, to bind its parameters to controls. A menu button in the upper left-hand corner allows you to select between knob, vertical slider and horizontal slider controls.
</p>
<p>
Underneath each control is a bind button. Clicking adds a new control to the chain's <i>Controls</i> view and binds it to the parameter in question. For simplicity, only one control at a time may be bound to a given parameter.
</p>
<h5 id="n:1.2.3.1.5.">1.2.3.1.5. Controls</h5>
<center><div class="fig image"><table id="Fig.1.6" border=1>
<caption>
<strong>Fig. 1.6.</strong> Control View
</caption>

<tr><td><img src="controls.png" alt="fig. 1.6"></td></tr>
</table></div></center>
<p>
The control view of a chain groups together all of the controls bound to parameters of modules in that chain. The default mode of controls is <i>Manual</i>. Right click on a control to bring up a menu which will allow you to select one of the available control I/O methods to use. When <i>Control Voltage</i> (CV) is selected, a CV input port will be created on the containing mixer strip's JACK client. The control will now accept values from that input. A control bound and configured in this way can then be connected to the output of a Non-DAW control sequence using your favorite connection manager.
</p>
<div class=admonition>
<table width=100%>
<tr><td>NOTE:
All knob and slider controls respond to mousewheel
events. Hold down the `Ctrl` key while scrolling the mousewheel to
achieve finer resolution.
</td></table>
</div>
<h6 id="n:1.2.3.1.5.1.">1.2.3.1.5.1. Control Voltages</h6>
<p>
The control voltage concept should be familiar to anyone who has experience with analog modular synthesizers. MIDI, while having definite advantages in many respects, multiplexes control data in such a way as to make connecting one MIDI control to a parameter involve a significant inconvenience, usually requiring the adjustment of settings on both ends of the connection in order to separate the control data streams.
</p>
<p>
Control Voltages, on the other hand, provide a simple 1:1 source to sink relationship and offer much higher resolution, both in time and value, than can be natively expressed through MIDI. The chief advantage of CV in the context of Non-DAW is the ease with which an control sequence can be connected to a mixer module parameter. If you have a MIDI controller that you'd like to use to control parameters of Non-Mixer, consider <i>jm2cv</i>, a JACK MIDI to Control Voltage daemon which was written by Peter Nelson specifically for use with Non-Mixer. jm2cv can be acquired by:
</p>
<div class="fig example"><table width=100%><tr><td><pre>
git clone git://fuzzle.org/jm2cv.git
</pre></td></tr>
</table></div>
<div class=admonition>
<table width=100%>
<tr><td>NOTE:
The use of Control Signals (OSC) should be preferred for most types
of parameter automation, as LADSPA plugins are incapable of
processing Control Voltage signals at full audio resolution anyway.
</td></table>
</div>
<h5 id="n:1.2.3.1.6.">1.2.3.1.6. Spatialization </h5>
<h6 id="n:1.2.3.1.6.1.">1.2.3.1.6.1. Spatializer Module</h6>
<center><div class="fig image"><table border=1>
<tr><td><img src="spatializer-module.png" alt="fig. "></td></tr>
</table></div></center>
<p>
The Spatializer Module included with Non Mixer allows one to not only control the position of a sound source (angle and elevation), but also to control it's apparent distance from the listener.
</p>
<p>
Distance cues are based on physical properties--the speed of sound in air, the damping effect of humidity, the ratio of reverb early and late reflections, the volume of the sound.
</p>
<p>
In legacy mixers, all of these properties must be controlled individually by the engineer. This is nearly always a process of trial and error. Much of a studio engineers' skill lies in his ability to guess at these values and arrive at a reasonably realistic sounding result.
</p>
<p>
Non Mixer eliminates the guesswork and combines all of these controls into a single spatialization point encoding both a sound source's position relative to the listener and its distance. No matter where the point is placed, the result will be realistic.
</p>
<p>
Use of the Spatializer Modules eliminates much complexity from the mixing process. No more back and forth, no more guessing at values for reverb sends and predelay and EQ. The Spatializer does it all for you.
</p>
<p>
The B-Format outputs of the Spatializer Module are in the order standard order WXYZ.
</p>
<p>
All Spatializer Module instances will present controls and aziumuth, elevation, and radius. Additionally, a <i>Highpass</i> control is provided to compensate for the proximity effect in close-mic'd signals. The default cutoff is 200Hz. Adjust it according to the nature of the input signal.
</p>
<p>
A Spatializer Module fed stereo input will perform stereo encoding and will present a <i>Width</i> control.
</p>
<h7 id="n:1.2.3.1.6.1.1.">1.2.3.1.6.1.1. Reverb Routing</h7>
<p>
The Spatializer module is intended to work with an external reverb engine having Ambisonics B-Format inputs for early reflections and a Mono input for reverb tail (and, of course, B-Format outputs).
</p>
<center><div class="fig image"><table border=1>
<tr><td><img src="reverb-routing.png" alt="fig. "></td></tr>
</table></div></center>
<p>
The Spatializer Module has two sets auxiliary outputs for reverb send. One, consisting of a single mono signal, is intended to be connected to the input of a reverb tail, otherwise known as a diffuse field. Another set of outputs in B-Format is indended to be connected to the B-Format inputs of an early reflection reverb engine. The output of the reverb engine should be 100% 'wet'.
</p>
<p>
I have crafted several jconvolver config files that meet these specifications. They can be found in <a class=ext href="http://non.tuxfamily.org/ambiverb.tar.bz2">ambiverb.tar.bz2</a>
</p>
<p>
The main outputs of the strip should go to a master bus, into which the output of the reverb engine is also fed.
</p>
<h6 id="n:1.2.3.1.6.2.">1.2.3.1.6.2. LADSPA Plugins</h6>
<p>
There are several Ambisonics panners/encoders released as LADSPA plugins. When one of these plugins is added to a strip, Non Mixer will detect its parameter signature and create a Spatialization Control for it just as with the Spatializer Module.
</p>
<center><div class="fig image"><table id="Fig.1.7" border=1>
<caption>
<strong>Fig. 1.7.</strong> Spatialization Control on a Strip
</caption>

<tr><td><img src="spatialization-on-strip.png" alt="fig. 1.7"></td></tr>
</table></div></center>
<p>
Whenever a module is added to a strip whose set of parameters include parameters named Azimuth and Elevation (and perhaps Radius), Non-Mixer will detect this and automatically attach a Spatializer control to these parameters. The Spatializer will be displayed at the bottom of the mixer strip. A larger version of the control may also be found in the Module Parameter Editor.
</p>
<center><div class="fig image"><table id="Fig.1.8" border=1>
<caption>
<strong>Fig. 1.8.</strong> Spatialization Control in the Module Parameter Editor
</caption>

<tr><td><img src="spatialization-in-mpe.png" alt="fig. 1.8"></td></tr>
</table></div></center>
<p>
The spatialization control may be visualized as moving the sound source across the surface of a hemispherical dome enclosing the listener.
</p>
<p>
The output of the spatializing plugin may be routed into a decoding plugin following it the same strip or, more usefully, the output of a number of Ambisonic panning plugins on different strips may be routed (through JACK) into a single master decoder instance on a final strip.
</p>
<h2 id="n:1.3.">1.3. Spatialization Console</h2>
<center><div class="fig image"><table border=1>
<tr><td><img src="spatialization-console.png" alt="fig. "></td></tr>
</table></div></center>
<p>
The Spatialization Console allows the user to view and control all of the source positions in an Ambisonics mix at once.
</p>
<p>
The visibility of the Spatialization Console may be toggled with the <tt>F8</tt> key.
</p>
<p>
The console will display a point for each Spatializer Module or other Ambisonics panner plugin contained in the mix.
</p>
<p>
There are two projections available, Planar and Spherical. The range of the view can be adjusted with the range dropdown in the lower lefthand corner.
</p>
<h2 id="n:1.4.">1.4. Projects</h2>
<p>
A Non-Mixer project is a directory where Non-Mixer keeps the strip settings, project specific settings, and some meta-data. A project is completely self-contained. You can rename a project as simply as:
</p>
<div class="fig example"><table width=100%><tr><td><pre>
$ mv Project-A Project-B
</pre></td></tr>
</table></div>
<h3 id="n:1.4.1.">1.4.1. JACK I/O</h3>
<p>
Each mixer strip is presented as a separate JACK "client". This helps to avoid the necessity of internally duplicating JACK's routing logic and, with JACK2, permits the possibility of parallel execution of mixer strip signal chains.
</p>
<p>
The JACK client name of each strip will correspond to the name of the strip.
</p>
<div class=admonition>
<table width=100%>
<tr><td>NOTE:
The JACK API makes implementing this far more difficult and kludgey than it should have to be.
Please petition your local JACK developer to accept jack_client_set_name() into the API.
</td></table>
</div>
<center><div class="fig image"><table id="Fig.1.9" border=1>
<caption>
<strong>Fig. 1.9.</strong> Patchage
</caption>

<tr><td><img src="non-mixer-and-non-daw-in-patchage.png" alt="fig. 1.9"></td></tr>
</table></div></center>
</div>
</body>
</html>

+ 0
- 543
mixer/doc/MANUAL.mu View File

@@ -1,544 +0,0 @@

! title Non Mixer User Manual
! author Jonathan Moore Liles #(email,male@tuxfamily.org)


: Non Mixer User Manual

/ Mixer
< non-mixer-complex.png

The Non-Mixer is a stand-alone audio mixer, utilizing JACK as an
audio subsystem. At the time of writing, the architecture of
Non-Mixer is unique. By making the mixer stand-alone, concepts such
as busses, sends, and inserts are eliminated, as the same goals can
be achieved by simply adding more strips to the mixer.

Start by creating a new project (menu item `Project\/New`).

/ New Project
< new-project.png

After the project has been created. Hit `a` or choose `Mixer\/Add
Strip` from the menu to add a new strip to the mixer.

:: Mixer Groups

< group-dropdown.png

Groups serve several purposes. Firstly, they allow for some
organization of strips. Groups also allow parallel relationships of
mixer strips to be made explicit. This has important performance
implications in JACK2. Non Mixer supports an unlimited number of
groups, each of which can contain an unlimited number of mixer
strips.

::: How to Choose Groupings
All strips in a group should be completely parallel with no feedback
loop connections. A typical group might be named 'Input' and contain
all input strips (strips that accept input from Non Timeline and
have outputs all connecting to some master bus).

To put it another way, if you have 100 inputs strips with identical
output configurations (e.g. stereo or B-Format), that all connect to
a master bus, then you have a candidate for a group.

::: Considering JACK Overhead

JACK provides immense flexibility. But, as in most situations, that
flexibility comes with a cost. In JACK the cost is a context switch
per client. This applies /even for many clients which belong to the
same process/, as in Non Mixer. Various factors go into determining
the price of a context switch on any given system. It's not very
expensive, but it does add up. It becomes problematic in sessions
involving many clients (think 100s), each of which having a small
DSP load (often smaller than the cost of JACK's context context
switch). JACK *could* be smart enough to recognize that some clients
belong to the same process and could be executed serially without
requiring a context switch, but at the time of writing neither JACK1
nor JACK2's scheduling is that smart.

If you're mixing a normal song (couple of dozen tracks) at low
latency, this overhead will probably account for less than 1% of the
total DSP load. If you're mixing an entire orchestra at ultra-low
latency, then it might account for a quarter or more of the total
DSP load.

Groups mitigate this cost by reducing the number of JACK clients
required for a mix. Strips in a group will execute serially without
context switches or thread synchronization--reducing the total JACK
overhead. However, if you have several groups, then they may all by
run in parallel by JACK2.

A mixer which uses a single JACK client (which is basically the way
everything other than Non Mixer has been designed) is not a viable
solution by this author's definition, because such a mixer cannot be
from/to any other JACK clients without introducing an extra period
of latency.

To illustrate this point here are some figures from an actual song
session including the whole Non suite plus a sampler, a synth and an
ambisonics convolution reverb with a total of 13 strips in 4 groups
in different configurations on the same system.

JACK's DSP load figures are interpreted thus: if at a 2.7ms software
latency setting the average time a proces cycle takes to complete is
2.7ms, then the DSP load is 100%. The usable ceiling on DSP load is
80%. This is true for both JACK1 and JACK2. The difference is that
JACK2 may use all available CPU cores to execute the graph (if
there are enough clients in parallel signal flow).

32-bit Intel Core2 Duo @1.6Ghz -r 48000 -p 256 -n 2 (5.3ms)

[[ JACK Ver, Groups, DSP Load
[[ JACK1, N, 39%
[[ JACK1, Y, 27%
[[ JACK2, N, 24%
[[ JACK2, Y, 31%

AMD FX-8350 @ 4.2Ghz 64-bit -r 48000 -p 256 -n 2 (5.3ms)

[[ JACK Ver, Groups, DSP Load
[[ JACK1, N, 28%
[[ JACK1, Y, 12%
[[ JACK2, N, 12%
[[ JACK2, Y, 11%

AMD FX-8350 @ 4.2Ghz 64-bit -r 48000 -p 128 -n 2 (2.7ms)

[[ JACK Ver, Groups, DSP Load
[[ JACK1, N, 29%
[[ JACK1, Y, 17%
[[ JACK2, N, 17%
[[ JACK2, Y, 17%

AMD FX-8350 @ 4.2Ghz 64-bit -r 48000 -p 32 -n 2 (0.7ms)

[[ JACK Ver, Groups, DSP Load
[[ JACK1, N, x
[[ JACK1, Y, x
[[ JACK2, N, 43%
[[ JACK2, Y, 41%

As you can see, for multiprocessor systems, JACK2 clearly has an
advantage even without grouping.

Of course, results will vary depending on the system and the mix. On
the dual core system, performance actually degraded with JACK2 when
using groups--this is because the number of parallel flows that
JACK2 detected was reduced and the second core was being under
utilized. Similarly, the performance of the 8-core AMD system
doesn't seem that great even in the ungrouped mode--this is because
the DSP load of each individual client is around the same as the
cost of the context switching. It's a wash either way (if each strip
had more or more complex modules on it, then the ungrouped mode
would probably perform better). Since JACK1 cannot take advantage of
more than 1 CPU core, there is no benefit to parallelism and grouped
mode always outperforms ungrouped mode.

So, for maximum capacity the combination of a multicore CPU with
JACK2 and mixer groups is best.

# All strips in a group *MUST* have the same output configuration. All
# outputs will be mixed together by identity. That is, the 'AUX \(A\)'
# outputs of each strip will be mixed together into a single 'AUX \(A\)'
# output of the group. A strip within a group whose output
# configuration differs from the group configuration will be marked as
# invalid and will not be executed.

::: Creating a New Group

Groups can be created by selecting the group dropdown on any mixer
strip and choosing 'New Group'. A window will popup asking for a
group name. Group names must be unique. The group will then be
created and the selected strip added to it.

::: Adding a Strip to an Existing Group

To add a strip to an existing group, simply select a group name from
the group dropdown on the strip.

::: Removing a Strip from a Group
Select '---' from the group dropdown. The strip will be removed from
the group and will run in an independent JACK client.

::: Removing a Group

Groups are destroyed automatically as soon as they contain zero
strips.

::: Monitoring Group DSP Load

Above the grop dropdown on each strip is a DSP load meter for the
selected group. For ungrouped strips or strips which are the only
one in their group, this is simply the DSP load of the single strip.

If DSP usage goes up when strips are fed silence, then you're
probably running a plugin which has denormal issues.

:: Mixer Strips

/ Mixer Strip
< single-strip.png

Each mixer strip has a name and color, each of which may be defined
by the user. Names, but not colors, must be unique. In addition,
each strip has controls to move it left or right (the arrows) in the
display and to remove it entirely (the 'X').

Strips start out in /narrow/ mode, with the /fader/ view
enabled. Click the desired button to toggle the mode or view.

Each strip has a context menu which lists the available options
and their associated key-bindings. To bring up the context menu, `Right

The fader view comprises a large gain control and digital peak meter
indicator. These are automatically connected to the default gain and
meter modules of the strip's signal chain.

To see how an audio signal traveling through this strip will be
processed, switch to its /signal/ view.

::: Navigation

A strip is focused when you click on it. Focus can be moved among
strips with the `Tab` and `Shift-Tab` keys.

::: Control

The focused strip can be moved in the display order via the `[` and
`]` keys. `Delete` removes a strip (with confirmation dialog). `n`
and `w` set the focused strip's width to /narrow/ or /wide/,
respectively, and `f` and `s` switch between /fader/ and /signal/
views. The strip's context menu can be invoked without the mouse by
hitting the `Menu` key (assuming your keyboard has one).
::: Signal Chain

The signal chain view of a mixer strip provides a way to view and
manipulate the signal processing of a mixer strip.

:::: Modules

/ Modules
< modules.png

All signal processing in Non Mixer occurs in /Modules/. Modules are
signal processing abstractions providing ports for audio and control
I\/O and, in addition, some simple user interface. Sink and source
modules carry audio out of and into JACK.

Modules are displayed as named blocks. Some modules (e.g. the Meter
module) may have additional GUI components.

Each module has zero or more audio I\/O ports and zero or more
control ports. Audio routing between modules is handled
automatically. Modules with mono audio configurations (one channel
in, one channel out) can be automatically adjusted to support any
number of discrete channels. Modules with more (related) channels,
however, introduce restrictions on the order in which modules can be
chained.

An indicator in the upper left-hand corner of each module block
indicates whether the module has any parameters bound to controls.

Non Mixer has several built-in modules. They are:

= JACK
= Performs JACK I\/O
= Gain
= Applies gain in dB
= Meter
= Digital Peak Meter
= Mono Pan
= Performs intensity panning of a mono signal into a stereo signal.
= Aux
= Provides auxiliary outputs
= Spatializer
= Provides advanced Ambisonics spatialization with distance simulation.
= Plugin
= Hosts a LADSPA plugin

::::: OSC Control

The input parameters of all modules are controllable via OSC,
regardless of whether the parameter is set as controllable.

The format of the automatically generated OSC path names is as follows:

> /strip/[STRIP_NAME]/[MODULE_NAME]/[PARAMETER_NAME]

The UDP port that the OSC server binds to can be set by providing
the `--osc-port` command-line option. Without this option, a random
port will be bound automatically (the exact OSC URL will always be
printed to the console as a line beginning with "OSC: ").

The default path accepts a float value between 0.0 and 1.0 (a
Control Voltage like signal) which will be automatically scaled to
the allowable range of the control.

A path ending in \/unscaled is also available, which accepts exact values,
which will be clamped to the allowable range. For example:

> /strip/[STRIP_NAME]/[MODULE_NAME]/[PARAMETER_NAME]/unscaled

If same module\/plugin is used twice in a signal chain
(e.g. multiple Gain stages), then a position dependent sequence
number will be appended to the module name. For example, a path
might look like the following:

> /strip/Foo/Gain.1/Gain_(dB)

For the second instance of the Gain module on the strip named 'Foo'.

There's a possibility to get exact OSC path for module controls.
For this you need to switch strip mode to 'Signl', right click a
module, for example 'Gain', and open 'Edit parameters' dialog. OSC
path will be shown in a statusbar of the main window when you
hover a parameter.

Non-DAW accesses these same signals via a more advanced signal
routing layer on top of OSC. Any module parameter is easily
controlled via Control Sequences in Non-DAW without the need to
specify an OSC URL.


::::: MIDI Control

Automatic translation between MIDI and Non's OSC Signals can be
achieved by adding the headless program `non-midi-mapper` (included in the
Non-Mixer distribution) to an NSM session.

Non-MIDI-Mapper provides JACK MIDI input and output ports that can be
connected to a suitable controller device.

In Non-Mixer, the `Remote Control\/Start Learning` menu item enters learning
mode in which Non Mixer can be taught which controls to associated with which
MIDI messages by clicking a control in Non-Mixer and moving the desired control
on the MIDI device. `Remote Control\/End Learning` ends the learning session.

The mapping will be saved with the NSM session.

::::: Manipulation

Left-clicking on a module brings up a Module Parameter Editor window
for the selected module.

Right-clicking on a module brings up a context menu allowing you
manipulate the module, as well as to pick a new module to insert
before the selected one in the chain.

Middle-clicking on a module toggles its activation state (the audio
signal will bypass inactive modules).

Control+Right-clicking on a module causes it to be removed from the
chain (modules added by default cannot be removed).

The focused module may also be controlled via the keyboard. `Menu`
brings up the context menu for the focused module. `Space` opens the
module parameter editor, `b` toggles the bypassed state, and
`Delete` removes the module from the chain (without confirmation!).
`Control-X`, `Control-C` and `Control-V`, cut, copy, and paste
modules, respectively. Modules may be copied within or across chain
boundaries. The normal module I\/O constraints also apply to pasted
modules.

::::: Module Parameter Editor

/ Module Parameter Editor
< module-parameter-editor.png

The Module Parameter Editor is used to alter the values of a
module's parameters, and in addition, to bind its parameters to
controls. A menu button in the upper left-hand corner allows you to
select between knob, vertical slider and horizontal slider controls.

Underneath each control is a bind button. Clicking adds a new
control to the chain's /Controls/ view and binds it to the parameter
in question. For simplicity, only one control at a time may be bound
to a given parameter.

::::: Controls

/ Control View
< controls.png

The control view of a chain groups together all of the controls
bound to parameters of modules in that chain. The default mode of
controls is /Manual/. Right click on a control to bring up a menu
which will allow you to select one of the available control I\/O
methods to use. When /Control Voltage/ (CV) is selected, a CV input
port will be created on the containing mixer strip's JACK
client. The control will now accept values from that input. A
control bound and configured in this way can then be connected to
the output of a Non-DAW control sequence using your favorite
connection manager.

{ NOTE:
{ All knob and slider controls respond to mousewheel
{ events. Hold down the `Ctrl` key while scrolling the mousewheel to
{ achieve finer resolution.

:::::: Control Voltages

The control voltage concept should be familiar to anyone who has
experience with analog modular synthesizers. MIDI, while having
definite advantages in many respects, multiplexes control data in
such a way as to make connecting one MIDI control to a parameter
involve a significant inconvenience, usually requiring the
adjustment of settings on both ends of the connection in order to
separate the control data streams.

Control Voltages, on the other hand, provide a simple 1:1 source to
sink relationship and offer much higher resolution, both in time and
value, than can be natively expressed through MIDI. The chief
advantage of CV in the context of Non-DAW is the ease with which an
control sequence can be connected to a mixer module parameter. If
you have a MIDI controller that you'd like to use to control
parameters of Non-Mixer, consider /jm2cv/, a JACK MIDI to Control
Voltage daemon which was written by Peter Nelson specifically for
use with Non-Mixer. jm2cv can be acquired by:

> git clone git://fuzzle.org/jm2cv.git


{ NOTE:
{ The use of Control Signals (OSC) should be preferred for most types
{ of parameter automation, as LADSPA plugins are incapable of
{ processing Control Voltage signals at full audio resolution anyway.

::::: Spatialization

:::::: Spatializer Module

< spatializer-module.png

The Spatializer Module included with Non Mixer allows one to not
only control the position of a sound source (angle and elevation),
but also to control it's apparent distance from the listener.

Distance cues are based on physical properties--the speed of sound
in air, the damping effect of humidity, the ratio of reverb early and
late reflections, the volume of the sound.

In legacy mixers, all of these properties must be controlled
individually by the engineer. This is nearly always a process of
trial and error. Much of a studio engineers' skill lies in his
ability to guess at these values and arrive at a reasonably
realistic sounding result.

Non Mixer eliminates the guesswork and combines all of these
controls into a single spatialization point encoding both a sound
source's position relative to the listener and its distance. No
matter where the point is placed, the result will be realistic.

Use of the Spatializer Modules eliminates much complexity from the
mixing process. No more back and forth, no more guessing at values
for reverb sends and predelay and EQ. The Spatializer does it all
for you.

The B-Format outputs of the Spatializer Module are in the order
standard order WXYZ.

All Spatializer Module instances will present controls and aziumuth,
elevation, and radius. Additionally, a /Highpass/ control is
provided to compensate for the proximity effect in close-mic'd
signals. The default cutoff is 200Hz. Adjust it according to the
nature of the input signal.

A Spatializer Module fed stereo input will perform stereo encoding
and will present a /Width/ control.

::::::: Reverb Routing

The Spatializer module is intended to work with an external reverb
engine having Ambisonics B-Format inputs for early reflections and a
Mono input for reverb tail (and, of course, B-Format outputs).

< reverb-routing.png

The Spatializer Module has two sets auxiliary outputs for reverb
send. One, consisting of a single mono signal, is intended to be
connected to the input of a reverb tail, otherwise known as a
diffuse field. Another set of outputs in B-Format is indended to be
connected to the B-Format inputs of an early reflection reverb
engine. The output of the reverb engine should be 100% 'wet'.

I have crafted several jconvolver config files that meet these
specifications. They can be found in #(url,http:\/\/non.tuxfamily.org\/ambiverb.tar.bz2,ambiverb.tar.bz2)

The main outputs of the strip should go to a master bus, into which
the output of the reverb engine is also fed.

:::::: LADSPA Plugins

There are several Ambisonics panners\/encoders released as LADSPA
plugins. When one of these plugins is added to a strip, Non Mixer
will detect its parameter signature and create a Spatialization
Control for it just as with the Spatializer Module.

/ Spatialization Control on a Strip
< spatialization-on-strip.png

Whenever a module is added to a strip whose set of parameters
include parameters named Azimuth and Elevation (and perhaps Radius),
Non-Mixer will detect this and automatically attach a Spatializer
control to these parameters. The Spatializer will be displayed at
the bottom of the mixer strip. A larger version of the control may
also be found in the Module Parameter Editor.

/ Spatialization Control in the Module Parameter Editor
< spatialization-in-mpe.png

The spatialization control may be visualized as moving the sound
source across the surface of a hemispherical dome enclosing the
listener.

The output of the spatializing plugin may be routed into a decoding
plugin following it the same strip or, more usefully, the output of
a number of Ambisonic panning plugins on different strips may be
routed (through JACK) into a single master decoder instance on a
final strip.

:: Spatialization Console

< spatialization-console.png

The Spatialization Console allows the user to view and control all
of the source positions in an Ambisonics mix at once.

The visibility of the Spatialization Console may be toggled with the `F8` key.

The console will display a point for each Spatializer Module or
other Ambisonics panner plugin contained in the mix.

There are two projections available, Planar and Spherical. The range
of the view can be adjusted with the range dropdown in the lower
lefthand corner.

:: Projects

A Non-Mixer project is a directory where Non-Mixer keeps the strip
settings, project specific settings, and some meta-data. A project
is completely self-contained. You can rename a project as simply as:

> $ mv Project-A Project-B

::: JACK I/O

Each mixer strip is presented as a separate JACK "client". This
helps to avoid the necessity of internally duplicating JACK's
routing logic and, with JACK2, permits the possibility of parallel
execution of mixer strip signal chains.

The JACK client name of each strip will correspond to the name of the strip.

{ NOTE:
{ The JACK API makes implementing this far more difficult and kludgey than it should have to be.
{ Please petition your local JACK developer to accept jack_client_set_name() into the API.

/ Patchage
< non-mixer-and-non-daw-in-patchage.png

+ 0
- 23
mixer/doc/Makefile View File

@@ -1,23 +0,0 @@

SRCS=$(wildcard *.mu)

OBJS=$(SRCS:.mu=.html)

%.html: %.mu
@ echo Mupping $<...
@ mup.wrapper html $<

.PHONY: all clean

all: $(OBJS)

upload: all
@ rsync -L mup.css MANUAL.html *.png ssh.tuxfamily.org:/home/non/non-mixer.tuxfamily.org-web/htdocs

install:
@ install -d "$(DESTDIR)$(DOCUMENT_PATH)"/non-mixer
@ cp $(OBJS) *.png mup.css ../../COPYING "$(DESTDIR)$(DOCUMENT_PATH)"/non-mixer
# @ ln -sf $(PIXMAP_PATH)/logo.png $(DOCUMENT_PATH)

clean:
rm -f $(OBJS)

BIN
mixer/doc/controls.png View File

Before After
Width: 235  |  Height: 288  |  Size: 11KB

BIN
mixer/doc/group-dropdown.png View File

Before After
Width: 133  |  Height: 198  |  Size: 8.1KB

+ 0
- 1
mixer/doc/icon.png View File

@@ -1 +0,0 @@
../icons/hicolor/256x256/apps/non-mixer.png

BIN
mixer/doc/mixer-strips.png View File

Before After
Width: 669  |  Height: 605  |  Size: 14KB

BIN
mixer/doc/modules.png View File

Before After
Width: 102  |  Height: 472  |  Size: 13KB

+ 0
- 461
mixer/doc/mup.css View File

@@ -1,461 +0,0 @@

/* Example CSS Style for MUP */

body
{
font: normal normal 14pt "Helvetica", sans-serif;
/* background: url("http://non.tuxfamily.org/background-pattern.png") fixed; */
background-color: #121212; color: lightgray; padding: 0; margin: 0;
}

a:link {
color: white;
}
a:visited {
color: olive;
}
a:active {
color: white;
}
a:link:hover {
text-decoration: underline;
}

/* #(url) */
a.ext:link {
color: red;
text-decoration: none;
border-bottom: dashed silver 1;
}
a.ext:visited {
color: darkred;
border-bottom: dashed silver 1;
text-decoration: none;
}

/* #(ref) */
a.int:link {
border-bottom: dashed silver 0.15em;
}
a.int:link:hover {
text-decoration: none;
color: white;
}

/*
a[href^="#"]:link {
border-bottom: dashed silver 0.15em;
}
a[href^="#"]:link:hover {
text-decoration: none;
color: white;
}
*/

p:contains("Warning:") {
background: #d00;
color: white;
border: dotted gray 0.5em;
display: block;
}

/* First letter of first paragraph of every chapter */
/*
h1 + p:first-letter {
text-transform: uppercase;
float: left;
line-height: 0.8em;
font-size: 350%;
font-family: Serif;
letter-spacing: 0;
margin-right: 0.1em;
margin-top: 0.1em;
border: solid gray 1px;
padding: 1px;
color: #d00;
text-shadow: #666 3px 3px 3px;
}
*/
/* First paragraph of every chapter */
/*
h1 + p {
text-indent: 0;
}
*/

/* cover */
#cover * {
background: transparent;
}
#cover {
position: relative;
/* background: #da0;*/
background: #555;
color: #aaa;
text-align: center;
margin: 0;
padding: 0.5em;
border-top: 4px solid black;
border-bottom: 4px solid black;
}
#cover h1, #cover h3 {
text-shadow: #222 0.2em 0.2em 0.2em;
color: white;
border: none;
letter-spacing: 0.2em;
line-height: 0.8em;
margin-left: 2em;
margin-right: 2em;
}
#cover h1:before, #cover h1:after {
/* content: "::"; */
font-size: 300%;
color: black;
}
#cover h1:before {
position: absolute;
top: 0.2em;
left: 0.1em;
}
#cover h1:after {
position: absolute;
top: 0.2em;
right: 0.1em;
}
#cover hr {
display: none;
}

hr:first-child {
display: none;
}

hr {
height: 0.2em;
background: #555;
color: #555;
margin-left: 0.5em;
}

#cover a:visited {
color: black;
}

/* endnote */
#endnote {
color: black;
}

/* TOC */
#toc {
position: relative;
}
#toc hr {
}
#toc h1 {
}
#toc ul {
font-size: 125%;
font-weight: bold;
margin-bottom: 1em;
}
#toc ul ul {
font-size: 90%;
font-weight: normal;
margin-bottom: 0;
}
#toc li {
list-style: none;

}
#toc a:link {
border-bottom: 0;
}

/* */
#body {
position: relative;
margin: 0 auto;
padding: 0.5em;
max-width: 900px;
background-color: #1c1c1c;
}
/* ;, : */
h1 {
color: #fff;
border-bottom: solid #444 0.1em;
text-shadow: 1px 1px 2px #000;

}
/* ::, :::, ::::, :::::, :::::: */
h2, h3, h4, h5, h6 {
color: #fff;
text-shadow: 1px 1px 2px #000;
}

/* tables, figures */
.fig caption {
color: gray;
text-align: center;
/* Required for Mozilla */
margin: auto;
}
.fig table {
border: none;
margin: auto;
/* border-collapse: collapse; */
}
/* / */
.fig.table th {
border: none;
background: gray;
color: black;
}
/* [ */
.fig.table td {
border: none;
background: silver;
color: black;
padding-left: 1em;
padding-right: 1em;
padding-top: 0.2em;
padding-bottom: 0.2em;
}
/* < */

.fig.image table {
border: none;
background: transparent;
max-width: 100%;
}
.fig.image tr, .fig.image td {
border: none;
background: transparent;
padding: 0;
}

.fig.image img
{
max-width: 900px;
}

/* */
p {
margin-right: 2%;
text-align: justify;
text-indent: 1em;
}
/* > */
.example *
{
background: transparent;
}
.example table
{
margin: 0;
padding: 0;
table-layout: fixed;
width: 100%;
caption-side: top;
overflow: auto;
}
.example caption
{
caption-side: top;

}
.example {
}
.example p {
display: inline;
margin: 0;
padding: 0;
text-align: center;
}
.example pre {
margin-top: 0;
font-family: Monospace;
padding: 1em;
border: solid 1px black;
background: #222;
color: white;
display: block;
overflow: auto;
/* Every browser should support border radii */
/* -moz-border-radius: 0.5em;
border-radius: 0.5em; */
}
/* " */
/*
.quote:before {
float: left;
font-size: 500%;
content: "\201C";
}
*/
/*
blockquote:after {
content: "\201D";
}*/
.quote blockquote {
padding: 0.5em;
margin-left: 0.5em;
font-family: Serif;
border-left: solid 0.4em gray;
/* background: #333; */
color: white;
}
/* ^ */
small {
/*
color: silver;
font-size: 50%;
*/
}
.footnote p {
color: silver;
margin: 0;
}

/* Popup footnotes */
.footnote p {
display: none;
}
.footnote p:target {
display: block;
overflow: auto;
position: fixed;
left: auto;
bottom: 0;
right: 0;
max-width: 50%;
border: solid 0.3em white;
-moz-border-radius: 0.5em;
background: black;
padding: 0.2em;
}

/* { */
.admonition * {
background: transparent;
color: white;
}
.admonition dl
{
display: table;
margin: 0;
padding: 0;
background: #333;
border: dotted black 0.3em;
width: 90%
margin-top: 0.5em;
margin-bottom: 0.5em;
}
.admonition dt
{
display: table-cell;
vertical-align: center;
border-right: solid silver 0.4em;
font-weight: bold;
font-size: 115%;
font-family: Serif;
background: gray;
width: 0;
text-shadow: black 0.15em 0.15em 0.15em;
}
.admonition dd
{
padding-left: 0.4em;
display: table-cell;
width: 100%;
text-align: justify;
}

.admonition table
{
margin: 0;
padding: 0;
background: #333;
border: dotted black 0.3em;
width: 90%
margin-top: 0.5em;
margin-bottom: 0.5em;
}
.admonition td {
width: 100%;
text-align: justify;
}
.admonition td:first-child:contains("Warning:") {
background: #900;
}
.admonition td:first-child:contains("Caution:") {
background: #960;
}
.admonition td:first-child:contains("Note:") {
background: #690;
}
.admonition td:first-child {
border-right: solid silver 0.4em;
font-weight: bold;
font-size: 115%;
font-family: Serif;
background: gray;
width: 0;
text-shadow: black 0.15em 0.15em 0.15em;
}


/* #(b) */
/* b { color: olive; } */
/* #(c) */
tt {
color: #7f0;
}
/* ! keywords ... */
p em {
color: gray;
font-style: normal;
font-weight: bold;
}

/* *, + */
/* Bullet, numbe */
li {
color: #f0f;
}
/* Text */
li span, li p {
color: white;
}
li p {
color: red;
display: block;
}
ul {
list-style-type: square;
}
dl {
margin-left: 2%;
margin-top: 1em;
}
/* = */
dt {
background: #181818;
padding: 0.2em;
font-variant: small-caps;
font-weight: bold;
color: #f0f;
}
dd {
color: white;
text-align: justify;
margin-right: 5%;
}
dt a:link, dt a:visited {
color: #f0f;
}
dt a:link:hover {
color: silver;
text-decoration: underline;
}

BIN
mixer/doc/new-project.png View File

Before After
Width: 550  |  Height: 105  |  Size: 8.2KB

BIN
mixer/doc/non-mixer-and-non-daw-in-patchage.png View File

Before After
Width: 990  |  Height: 433  |  Size: 23KB

BIN
mixer/doc/non-mixer-complex.png View File

Before After
Width: 1582  |  Height: 979  |  Size: 126KB

BIN
mixer/doc/single-strip.png View File

Before After
Width: 98  |  Height: 436  |  Size: 18KB

BIN
mixer/doc/spatialization-console.png View File

Before After
Width: 850  |  Height: 850  |  Size: 437KB

BIN
mixer/doc/spatialization-in-mpe.png View File

Before After
Width: 761  |  Height: 563  |  Size: 163KB

BIN
mixer/doc/spatialization-on-strip.png View File

Before After
Width: 102  |  Height: 440  |  Size: 18KB

BIN
mixer/doc/spatializer-module.png View File

Before After
Width: 126  |  Height: 360  |  Size: 12KB

BIN
mixer/icons/hicolor/128x128/apps/non-mixer.png View File

Before After
Width: 128  |  Height: 128  |  Size: 10KB

BIN
mixer/icons/hicolor/16x16/apps/non-mixer.png View File

Before After
Width: 16  |  Height: 16  |  Size: 1.3KB

BIN
mixer/icons/hicolor/192x192/apps/non-mixer.png View File

Before After
Width: 192  |  Height: 192  |  Size: 17KB

BIN
mixer/icons/hicolor/256x256/apps/non-mixer.png View File

Before After
Width: 256  |  Height: 256  |  Size: 20KB

BIN
mixer/icons/hicolor/32x32/apps/non-mixer.png View File

Before After
Width: 32  |  Height: 32  |  Size: 2.3KB

BIN
mixer/icons/hicolor/36x36/apps/non-mixer.png View File

Before After
Width: 36  |  Height: 36  |  Size: 3.0KB

BIN
mixer/icons/hicolor/48x48/apps/non-mixer.png View File

Before After
Width: 48  |  Height: 48  |  Size: 4.1KB

BIN
mixer/icons/hicolor/512x512/apps/non-mixer.png View File

Before After
Width: 512  |  Height: 512  |  Size: 20KB

BIN
mixer/icons/hicolor/64x64/apps/non-mixer.png View File

Before After
Width: 64  |  Height: 64  |  Size: 5.0KB

BIN
mixer/icons/hicolor/72x72/apps/non-mixer.png View File

Before After
Width: 72  |  Height: 72  |  Size: 6.5KB

BIN
mixer/icons/hicolor/96x96/apps/non-mixer.png View File

Before After
Width: 96  |  Height: 96  |  Size: 8.4KB

+ 0
- 155
mixer/icons/hicolor/scalable/apps/non-mixer.svg View File

@@ -1,155 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->

<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1"
width="512"
height="512"
id="svg3137">
<defs
id="defs3139">
<linearGradient
x1="0"
y1="150"
x2="300"
y2="150"
id="linearGradient3813"
xlink:href="#SVGID_1_"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-5.5328369e-8,-300.00001)" />
<linearGradient
x1="149.9995"
y1="4"
x2="149.9995"
y2="304"
id="SVGID_1_"
gradientUnits="userSpaceOnUse">
<stop
id="stop6"
style="stop-color:#fffdf7;stop-opacity:1"
offset="0.3398" />
<stop
id="stop22"
style="stop-color:#20fb00;stop-opacity:1"
offset="0.99440002" />
</linearGradient>
<linearGradient
x1="0"
y1="150"
x2="300"
y2="150"
id="linearGradient3135"
xlink:href="#SVGID_1_"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.7066667,0,0,1.7066667,-186.78068,-642.00002)" />
</defs>
<metadata
id="metadata3142">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
transform="translate(-130,186.78068)"
id="layer1">
<rect
width="512"
height="512"
x="-186.78067"
y="-642"
transform="matrix(0,1,-1,0,0,0)"
id="rect24"
style="fill:url(#linearGradient3135);fill-opacity:1" />
<rect
width="435.42188"
height="65.710075"
x="173.40906"
y="196.90019"
id="rect28"
style="fill:none" />
<g
id="g3571">
<path
d="m 321.16035,174.86778 0,94.91448 -21.57414,0 0,-64.07754 -8.61793,64.07754 -15.30122,0 -9.08693,-62.6119 0,62.6119 -21.57414,0 0,-94.91448 31.95083,0 c 0.93797,5.70629 1.9346,12.42866 2.98989,20.16713 l 3.40028,24.15365 5.62803,-44.32078 32.18533,0"
id="path3531"
style="font-size:120.06476593px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Impact;-inkscape-font-specification:Impact Bold" />
<path
d="m 355.74932,174.86778 0,94.91448 -24.68128,0 0,-94.91448 24.68128,0"
id="path3533"
style="font-size:120.06476593px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Impact;-inkscape-font-specification:Impact Bold" />
<path
d="m 415.78171,174.86778 -8.61793,41.97576 13.01483,52.93872 -22.86389,0 c -2.73589,-9.45822 -5.23724,-20.96832 -7.50405,-34.53035 -0.62537,5.97982 -1.48521,12.33089 -2.57952,19.05325 l -2.34501,15.4771 -24.03641,0 8.91106,-52.93872 -8.91106,-41.97576 23.86053,0 c 0.4299,2.61869 1.28973,6.9765 2.57952,13.07345 1.01614,4.65103 1.85644,8.91113 2.52089,12.78034 l 5.27628,-25.85379 20.69476,0"
id="path3535"
style="font-size:120.06476593px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Impact;-inkscape-font-specification:Impact Bold" />
<path
d="m 423.69613,174.86778 41.15501,0 0,18.99462 -16.47373,0 0,17.99799 15.41848,0 0,18.05661 -15.41848,0 0,20.87064 18.11524,0 0,18.99462 -42.79652,0 0,-94.91448"
id="path3537"
style="font-size:120.06476593px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Impact;-inkscape-font-specification:Impact Bold" />
<path
d="m 343.65625,361.65625 0,94.90625 24.65625,0 0,-42.78125 c 3.40023,5e-5 5.49954,0.60095 6.28125,1.8125 0.82072,1.21163 1.24997,4.35667 1.25,9.4375 l 0,31.53125 22.90625,0 0,-25.03125 c -7e-5,-7.66035 -0.22639,-12.31937 -0.65625,-14 -0.3909,-1.71964 -1.41321,-3.62386 -3.09375,-5.65625 -1.68065,-2.0323 -4.95836,-3.63211 -9.84375,-4.84375 5.39348,-0.50804 9.00677,-2.05327 10.84375,-4.59375 1.83687,-2.54038 2.74993,-7.48814 2.75,-14.875 -7e-5,-8.09022 -1.31895,-13.98231 -3.9375,-17.65625 -2.57957,-3.71285 -5.91969,-6.00723 -10.0625,-6.90625 -4.10382,-0.89883 -11.97812,-1.34366 -23.625,-1.34375 l -17.46875,0 z M 368.3125,377.875 c 2.85307,7e-5 4.81971,0.46833 5.875,1.40625 1.09431,0.93809 1.65622,2.92814 1.65625,5.9375 l 0,5.21875 c -3e-5,4.182 -0.58536,6.65589 -1.71875,7.4375 -1.09438,0.74264 -3.0376,1.12506 -5.8125,1.125 l 0,-21.125 z"
transform="translate(130,-186.78068)"
id="path3560"
style="font-size:120.06476593px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Impact;-inkscape-font-specification:Impact Bold" />
</g>
<polygon
points="300,0 300,110.426 150,188 0,110.426 0,0 "
transform="matrix(1.7066667,0,0,1.7066667,130,-186.78068)"
id="polygon26"
style="fill:#000200" />
<g
id="g3518">
<path
d="m 247.89101,-128.45434 c -6e-5,1.1566 -0.40483,2.19744 -1.21431,3.12252 -0.8096,0.9253 -1.85043,1.38789 -3.12252,1.38778 -1.96608,0.23141 -3.29604,0.46271 -3.98988,0.69389 -3.58516,1.3879 -5.37771,4.22129 -5.37767,8.50019 l 0,82.226277 c -4e-5,4.510316 -1.33,8.44237 -3.98988,11.796175 -3.2382,4.279007 -8.03762,6.418507 -14.39827,6.418507 -6.12941,0 -10.81318,-2.081676 -14.05133,-6.245034 -2.77558,-3.469453 -4.16336,-7.459332 -4.16336,-11.969648 l 0,-82.226277 c 0,-4.5102 1.32996,-8.44225 3.98989,-11.79618 3.23815,-4.27888 7.97974,-6.41838 14.2248,-6.4185 l 27.40876,0 1.04083,0 0.6939,0.34694 c 1.96597,0.92531 2.94898,2.3131 2.94904,4.16336"
id="path3502"
style="font-size:173.47315979px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#e6e6e6;fill-opacity:1;stroke:none;font-family:Syndrome BRK;-inkscape-font-specification:Syndrome BRK" />
<path
d="m 261.59539,-128.45434 c -7e-5,1.27225 -0.46266,2.37091 -1.38779,3.29599 -0.92525,0.9253 -2.02391,1.38789 -3.29599,1.38779 -1.15655,1e-4 -2.19738,-0.46249 -3.12251,-1.38779 -0.92525,-0.92508 -1.38785,-2.02374 -1.38779,-3.29599 -6e-5,-1.27202 0.40471,-2.31286 1.21431,-3.12252 0.92513,-0.92507 2.02379,-1.38766 3.29599,-1.38778 1.27208,1.2e-4 2.37074,0.40489 3.29599,1.21431 0.92513,0.80966 1.38772,1.90832 1.38779,3.29599"
id="path3500"
style="font-size:173.47315979px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#e6e6e6;fill-opacity:1;stroke:none;font-family:Syndrome BRK;-inkscape-font-specification:Syndrome BRK" />
<path
d="m 316.23944,-32.523683 c -1.3e-4,4.510316 -1.33009,8.44237 -3.98989,11.796175 -3.23828,4.279007 -7.97987,6.418507 -14.2248,6.418507 -6.12948,0 -10.81325,-2.081676 -14.05132,-6.245034 -2.77566,-3.469453 -4.16345,-7.459332 -4.16336,-11.969648 l 0,-82.226277 c -9e-5,-2.77547 -0.80963,-4.97279 -2.42862,-6.59198 -1.61917,-1.61897 -3.87432,-2.42852 -6.76546,-2.42862 -1.15656,1e-4 -2.1974,-0.46249 -3.12251,-1.38779 -0.92527,-0.92508 -1.38786,-2.02374 -1.38779,-3.29599 -7e-5,-1.27202 0.4047,-2.31286 1.21431,-3.12252 0.92512,-0.92507 2.02378,-1.38766 3.29599,-1.38778 l 27.40876,0 c 6.01363,1.2e-4 10.6974,2.08179 14.05133,6.24503 2.77545,3.46957 4.16323,7.45945 4.16336,11.96965 l 0,82.226277"
id="path3489"
style="font-size:173.47315979px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#e6e6e6;fill-opacity:1;stroke:none;font-family:Syndrome BRK;-inkscape-font-specification:Syndrome BRK" />
<path
d="m 363.27506,-32.523683 c -5e-5,2.775586 0.80949,4.972911 2.42862,6.59198 1.61904,1.619093 3.81636,2.428634 6.59198,2.428625 1.27208,9e-6 2.37075,0.462603 3.29599,1.387785 0.92513,0.925197 1.38773,2.023859 1.38779,3.29599 -6e-5,1.156491 -0.46266,2.197329 -1.38779,3.122517 -0.92524,0.92519 -2.02391,1.387785 -3.29599,1.387785 l -27.40876,0 c -4.51032,0 -8.44237,-1.32996 -11.79617,-3.989883 -4.27902,-3.238158 -6.41852,-7.979753 -6.41851,-14.224799 l 0,-82.226277 c -10e-6,-4.5102 1.32995,-8.44225 3.98988,-11.79618 3.23815,-4.27888 7.97975,-6.41838 14.2248,-6.4185 l 27.40876,0 1.04084,0 0.69389,0.34694 c 1.96598,0.92531 2.94899,2.3131 2.94905,4.16336 -6e-5,1.1566 -0.40483,2.19744 -1.21432,3.12252 -0.80959,0.9253 -1.85043,1.38789 -3.12251,1.38778 -1.96608,0.23141 -3.29604,0.46271 -3.98989,0.69389 -3.58515,1.3879 -5.37771,4.22129 -5.37766,8.50019 l 0,82.226277"
id="path3510"
style="font-size:173.47315979px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#e6e6e6;fill-opacity:1;stroke:none;font-family:Syndrome BRK;-inkscape-font-specification:Syndrome BRK" />
<path
d="m 390.68381,-128.45434 c -6e-5,1.27225 -0.46266,2.37091 -1.38778,3.29599 -0.92526,0.9253 -2.02392,1.38789 -3.29599,1.38779 -1.15655,1e-4 -2.19739,-0.46249 -3.12252,-1.38779 -0.92525,-0.92508 -1.38784,-2.02374 -1.38778,-3.29599 -6e-5,-1.27202 0.40471,-2.31286 1.21431,-3.12252 0.92513,-0.92507 2.02379,-1.38766 3.29599,-1.38778 1.27207,1.2e-4 2.37073,0.40489 3.29599,1.21431 0.92512,0.80966 1.38772,1.90832 1.38778,3.29599"
id="path3508"
style="font-size:173.47315979px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#e6e6e6;fill-opacity:1;stroke:none;font-family:Syndrome BRK;-inkscape-font-specification:Syndrome BRK" />
<path
d="m 390.68381,-18.819303 c -6e-5,1.156491 -0.46266,2.197329 -1.38778,3.122517 -0.92526,0.92519 -2.02392,1.387785 -3.29599,1.387785 -1.2722,0 -2.37086,-0.40477 -3.29599,-1.214312 -0.8096,-0.925188 -1.21437,-2.02385 -1.21431,-3.29599 -6e-5,-1.272131 0.40471,-2.370793 1.21431,-3.29599 0.80948,-0.925182 1.90814,-1.387776 3.29599,-1.387785 1.27207,9e-6 2.37073,0.462603 3.29599,1.387785 0.92512,0.925197 1.38772,2.023859 1.38778,3.29599"
id="path3506"
style="font-size:173.47315979px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#e6e6e6;fill-opacity:1;stroke:none;font-family:Syndrome BRK;-inkscape-font-specification:Syndrome BRK" />
<path
d="m 445.32786,-32.523683 c -1.2e-4,6.129397 -2.0818,10.813168 -6.24503,14.051326 -3.46958,2.775572 -7.45946,4.163356 -11.96965,4.163356 l -27.40876,0 c -1.27221,0 -2.37088,-0.40477 -3.29599,-1.214312 -0.80962,-0.925188 -1.21439,-2.02385 -1.21431,-3.29599 -8e-5,-1.272131 0.40469,-2.370793 1.21431,-3.29599 0.80946,-0.925182 1.90813,-1.387776 3.29599,-1.387785 3.46938,9e-6 6.01365,-1.214302 7.63282,-3.642937 1.04075,-1.50342 1.56117,-3.295974 1.56126,-5.377668 l 0,-82.226277 c -9e-5,-2.77547 -0.80963,-4.97279 -2.42863,-6.59198 -1.61916,-1.61897 -3.87431,-2.42852 -6.76545,-2.42862 -1.15657,1e-4 -2.1974,-0.46249 -3.12252,-1.38779 -0.92526,-0.92508 -1.38786,-2.02374 -1.38778,-3.29599 -8e-5,-1.27202 0.40469,-2.31286 1.21431,-3.12252 0.92511,-0.92507 2.02378,-1.38766 3.29599,-1.38778 l 27.40876,0 c 6.01362,1.2e-4 10.69739,2.08179 14.05132,6.24503 2.77545,3.46957 4.16324,7.45945 4.16336,11.96965 l 0,82.226277"
id="path3491"
style="font-size:173.47315979px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#e6e6e6;fill-opacity:1;stroke:none;font-family:Syndrome BRK;-inkscape-font-specification:Syndrome BRK" />
<path
d="m 506.06786,-128.45434 c -6e-5,1.1566 -0.40483,2.19744 -1.21431,3.12252 -0.8096,0.9253 -1.85044,1.38789 -3.12252,1.38778 -1.96608,0.23141 -3.29604,0.46271 -3.98988,0.69389 -3.58516,1.3879 -5.37771,4.22129 -5.37767,8.50019 l 0,82.226277 c -4e-5,4.510316 -1.33,8.44237 -3.98988,11.796175 -3.2382,4.279007 -8.03762,6.418507 -14.39827,6.418507 -6.12941,0 -10.81318,-2.081676 -14.05133,-6.245034 -2.77558,-3.469453 -4.16336,-7.459332 -4.16336,-11.969648 l 0,-82.226277 c 0,-4.5102 1.32996,-8.44225 3.98989,-11.79618 3.23815,-4.27888 7.97974,-6.41838 14.2248,-6.4185 l 27.40875,0 1.04084,0 0.6939,0.34694 c 1.96597,0.92531 2.94898,2.3131 2.94904,4.16336"
id="path3516"
style="font-size:173.47315979px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#e6e6e6;fill-opacity:1;stroke:none;font-family:Syndrome BRK;-inkscape-font-specification:Syndrome BRK" />
<path
d="m 519.77224,-128.45434 c -7e-5,1.27225 -0.46266,2.37091 -1.38779,3.29599 -0.92525,0.9253 -2.02392,1.38789 -3.29599,1.38779 -1.15655,1e-4 -2.19738,-0.46249 -3.12251,-1.38779 -0.92525,-0.92508 -1.38785,-2.02374 -1.38779,-3.29599 -6e-5,-1.27202 0.40471,-2.31286 1.21431,-3.12252 0.92513,-0.92507 2.02379,-1.38766 3.29599,-1.38778 1.27207,1.2e-4 2.37074,0.40489 3.29599,1.21431 0.92513,0.80966 1.38772,1.90832 1.38779,3.29599"
id="path3514"
style="font-size:173.47315979px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#e6e6e6;fill-opacity:1;stroke:none;font-family:Syndrome BRK;-inkscape-font-specification:Syndrome BRK" />
<path
d="m 574.41628,-32.523683 c -1.2e-4,4.510316 -1.33008,8.44237 -3.98988,11.796175 -3.23828,4.279007 -7.97988,6.418507 -14.2248,6.418507 -6.12948,0 -10.81325,-2.081676 -14.05132,-6.245034 -2.77566,-3.469453 -4.16345,-7.459332 -4.16336,-11.969648 l 0,-82.226277 c -9e-5,-2.77547 -0.80963,-4.97279 -2.42862,-6.59198 -1.61917,-1.61897 -3.87432,-2.42852 -6.76546,-2.42862 -1.15656,1e-4 -2.1974,-0.46249 -3.12251,-1.38779 -0.92527,-0.92508 -1.38786,-2.02374 -1.38779,-3.29599 -7e-5,-1.27202 0.4047,-2.31286 1.21431,-3.12252 0.92512,-0.92507 2.02378,-1.38766 3.29599,-1.38778 l 27.40876,0 c 6.01363,1.2e-4 10.6974,2.08179 14.05133,6.24503 2.77545,3.46957 4.16323,7.45945 4.16335,11.96965 l 0,82.226277"
id="path3493"
style="font-size:173.47315979px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#e6e6e6;fill-opacity:1;stroke:none;font-family:Syndrome BRK;-inkscape-font-specification:Syndrome BRK" />
</g>
</g>
</svg>

+ 0
- 774
mixer/icons/icon-16x16.xpm View File

@@ -1,774 +0,0 @@
/* XPM */
static char *icon_16x16[] = {
/* columns rows colors chars-per-pixel */
"512 512 256 2 ",
" c #000201B10001",
". c #05970A5D04FE",
"X c #08080B610707",
"o c #09F70C1F09F7",
"O c #05E1106A044B",
"+ c #08271144066D",
"@ c #08B31B1B05B0",
"# c #0CEC119F0C59",
"$ c #0C651B8009E8",
"% c #105919620E7C",
"& c #12E714E912E7",
"* c #169019791650",
"= c #18181D1D1717",
"- c #1B061D321AF0",
"; c #0D4623CE09A6",
": c #11B324240E88",
"> c #11832BD60D46",
", c #0E6432DD0934",
"< c #12EA32D40DAF",
"1 c #132F3E260C6C",
"2 c #17172704144E",
"3 c #1E4C22501DCB",
"4 c #173D37C611F5",
"5 c #1A5C3D4F14A3",
"6 c #1E543E2318F0",
"7 c #20A129FF1E49",
"8 c #20A137571C9C",
"9 c #21B523D621A5",
"0 c #24C229EF239A",
"q c #2B8A2D8C2B8A",
"w c #295C38D225F3",
"e c #2E2A30642E0E",
"r c #30B13ABB2E2E",
"t c #327E34A63258",
"y c #372E393E3729",
"u c #3ABB3BF33ABB",
"i c #157545C60DCE",
"p c #187F59590EA8",
"a c #1B824832142A",
"s c #1BE555301301",
"d c #224A48481BCD",
"f c #255E5A131CD6",
"g c #1E5E62621394",
"h c #1D4B6CBE1150",
"j c #1F1F75751212",
"k c #2558688D1A8F",
"l c #25D469BB1AE1",
"z c #23687EC3157C",
"x c #26B57A1B19BB",
"c c #2A9C467F257B",
"v c #318742982D83",
"b c #2A185874222B",
"n c #378D42423434",
"m c #3F2B404E3F0E",
"M c #3A65555534DF",
"N c #2C9364312309",
"B c #2BD66ACE21BE",
"V c #331969D02976",
"C c #369D76762BF9",
"Z c #395977772ECF",
"A c #41A853863CD6",
"S c #434368BE3B91",
"D c #443A453B443A",
"F c #479D4AF54545",
"G c #4C2D4D334C25",
"H c #494954AA45F0",
"J c #525255554F4F",
"K c #543155325431",
"L c #572C592E5681",
"P c #5B655C665B65",
"I c #4A4A6666446F",
"U c #515171C74A75",
"Y c #5AD165795743",
"T c #59DA777752D2",
"R c #616177775ADB",
"E c #61AA62AB61AA",
"W c #676768686767",
"Q c #6B786C796B78",
"! c #6AA576ED6603",
"~ c #732D742E732D",
"^ c #777778787777",
"/ c #7B207C217B20",
"( c #2B3C8BF21C61",
") c #287E95EB176D",
"_ c #2B8F93BE1B9C",
"` c #30309D9D1F1F",
"' c #2E6EA7D71BAC",
"] c #3123ABAB1E3B",
"[ c #32B3BB3B1D1D",
"{ c #36B786DC298D",
"} c #336293AA23DE",
"| c #345F9C0D23CE",
" . c #3A9E93A12C1E",
".. c #3B9890792DB9",
"X. c #39709A192A18",
"o. c #36B7A7EC249C",
"O. c #34F5AD8D226D",
"+. c #3C9BA4CD2BDB",
"@. c #3CD8AD762AC6",
"#. c #3AB1B7F226EC",
"$. c #4225876A3619",
"%. c #45459A9A36D2",
"&. c #40A0ACAC2F0F",
"*. c #4096B7612D83",
"=. c #4406A2F0340D",
"-. c #44AEAE53336F",
";. c #4747A4A43838",
":. c #4B5AA4493C00",
">. c #4BE9AD513B70",
",. c #47D1B82E35BF",
"<. c #34DFC51A1EC9",
"1. c #22C0FBFB02B4",
"2. c #2727FBFB0808",
"3. c #2B2BFBFB0C45",
"4. c #2EAFFBFB1090",
"5. c #3252FBFB1454",
"6. c #35F6FBFB18D9",
"7. c #3A5AFBFB1CBD",
"8. c #3A69C8992481",
"9. c #3B89D4162424",
"0. c #3EBFD6152767",
"q. c #3E0BE84E248B",
"w. c #3E3EFBFB2121",
"e. c #42E6D43A2C36",
"r. c #449ADD322C82",
"t. c #4A1FC6303621",
"y. c #4A03D44533D0",
"u. c #4B34D6323506",
"i. c #5252D4693D3D",
"p. c #4242F47326A7",
"a. c #4174FBFB24CD",
"s. c #45C5FBFA29A9",
"d. c #4915FBFA2DC6",
"f. c #4B26E60A32A0",
"g. c #4CC3E94B340C",
"h. c #4C19F58E3198",
"j. c #4DADFBFA32B2",
"k. c #5191FBFB36B6",
"l. c #5353F3B33939",
"z. c #55B5FBFB3AFA",
"x. c #58D8FBFB3EBE",
"c. c #4E4A9791413F",
"v. c #4EE899CC420F",
"b. c #552A91BC499F",
"n. c #5D7D888854B4",
"m. c #63A390105A5A",
"M. c #5401A30946B7",
"N. c #5322AD994374",
"B. c #5535AC0B4686",
"V. c #5833ABBD49DC",
"C. c #593EB7304920",
"Z. c #66CDA9425A5A",
"A. c #6CED878765A5",
"S. c #718892636923",
"D. c #7DD3852F7A24",
"F. c #7B3B98987373",
"G. c #7733AE5D6BE5",
"H. c #57E3C80D44E8",
"J. c #5AA6D4CC467B",
"K. c #6161D38A4DE0",
"L. c #6819CF095656",
"P. c #68A2D4FD561C",
"I. c #5ABAE70643E4",
"U. c #5E08F59F459B",
"Y. c #5C8DFBFB4300",
"T. c #6060FBFB4747",
"R. c #63B9F4F44BF6",
"E. c #6449FBFB4BCA",
"W. c #6A25EAEA5499",
"Q. c #6A95F2F2537E",
"!. c #6BCDFBFB53B5",
"~. c #73DAF55B5D5D",
"^. c #7308FBFB5BA3",
"/. c #7E7EC3C37070",
"(. c #774FE836639E",
"). c #7A7AF4F4653A",
"_. c #7777FBFA60B6",
"`. c #7AFDFBFA64E7",
"'. c #7EBEFBFA696A",
"]. c #848498987D7D",
"[. c #8517AFAF7B7B",
"{. c #8767CACA7999",
"}. c #83AFFBFB6DF6",
"|. c #8F8FE4637DFE",
" X c #86C6FBFB71B1",
".X c #8A8AFBFB7575",
"XX c #8DF4FC2E79E0",
"oX c #91BCFCFC7DFE",
"OX c #83B084B183B0",
"+X c #878788888787",
"@X c #8B198C1A8B19",
"#X c #8D5A93C68ABD",
"$X c #909098988A8A",
"%X c #94A495A594A4",
"&X c #9B5D9C5E9B5D",
"*X c #9292B1A189A9",
"=X c #9D1DA5249999",
"-X c #A2A2B2329B5B",
";X c #A3C1A4C2A3C1",
":X c #A7A7A8A8A7A7",
">X c #AC53ACD4AC53",
",X c #AE6EBABAA767",
"<X c #B2F2B2F2B2F2",
"1X c #BB6ABB6ABB6A",
"2X c #9573C5E789DF",
"3X c #9729D92188AD",
"4X c #A626C6C69C1C",
"5X c #A5A5D90B98B2",
"6X c #9A9AE8E88A8A",
"7X c #9595FCFC8282",
"8X c #9919FCFC8646",
"9X c #9ABAF4948868",
"0X c #9D1AFCFC8A68",
"qX c #A0DFFCFC8E8C",
"wX c #A8A8E8E89A1A",
"eX c #A67BF3739616",
"rX c #A57EFCFC9388",
"tX c #A8A8FCFC9797",
"yX c #AC9EFCFC9BE7",
"uX c #B5A3D22DABB4",
"iX c #B92AEB07AC01",
"pX c #B529F5DEA660",
"aX c #B461FCFCA451",
"sX c #BBACFCFCAC19",
"dX c #BEBEF1F1B1B1",
"fX c #BFBFFCFAB0B0",
"gX c #C4A7D563BBF4",
"hX c #C5E5EACABA5A",
"jX c #C318FCFCB49F",
"kX c #C747F5F5BA3A",
"lX c #C745FCFAB939",
"zX c #CA5DFCFCBD0D",
"xX c #C4A4C4A4C4A4",
"cX c #CDC2CDC2CDC2",
"vX c #CE9BD972C5F8",
"bX c #D457D457D457",
"nX c #DC2FDC2FDC2F",
"mX c #D53FEAD5CB60",
"MX c #CECEF7F7C1C1",
"NX c #CEFDFCFCC156",
"BX c #D29FFCFBC592",
"VX c #D680F59FCA74",
"CX c #D6D1FCFCCA5B",
"ZX c #DA38FCFBCE2C",
"AX c #DADAF1F1D1D1",
"SX c #DE18FCFBD29A",
"DX c #E2E2EFEFD8D8",
"FX c #E1DAFCFCD6CF",
"GX c #E2E2F59FD8D8",
"HX c #E5A0FCFADB1A",
"JX c #EA1CFCFCDF11",
"KX c #E6E4E6E4E6E4",
"LX c #EB6BF777E1E1",
"PX c #ED1BFCF9E311",
"IX c #F138FCF6E734",
"UX c #F30FFCFCEA06",
/* pixels */
" . . . . . . . . . . . . . . . ",
" . . . . . . . . . . . . . ",
" . . . . . . . . . . . . . . . . . ",
" . . . . . . . . . . . . . . . . . . . . . . . ",
". . . . . . . . . . . . . . . . . . . . . . . . . . ",
" . . . . . . . . . . . . . . . . . . . . . ",
" . . . . . . . . . . ",
" . . . . . . . . . . . . . . . . . . . . . . . ",
" . . . . . . . . . . . . . . . . . . . . ",
" . . . . . . . . . ",
" . . . . . . . . . . . . . . . . . . . . . . . . . ",
" . . . . . . . . . . . . . . . . . . . . . ",
" . . . . . . . . . . . . . . . . . . . . . ",
" . . . . . . . . . . . . . . . . . . . . . . . . . ",
" . . . . . . . . . . ",
" . . . . . . . . . . . . . . . . . . ",
" . . . . . . . . . . . . . . . . . . ",
" . . . . . . . . . . . ",
" . . . . . . . . . . . . . . . . . . . . . ",
" . . . . . . . . . . . . . . . . . . . . . . . ",
" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
" . . . . . . . . . . . . . . . . . . ",
" . . . . . . . . . ",
" . . . . . . . . . . . . . . . . ",
" . . . . . . . . . . . . . . . . ",
". . . . . . . . . . . . . . . ",
" . . . . . . . . . . . . . . . . . . . . . . . . ",
" . . . . . . . . . . . . . . . . . . . . . . ",
". . . . . . . . . . . . . . . . . . . . ",
" . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
" . . . . . . . . . . . . . ",
" . . . . . . . . . . . . . . . . ",
" . . . . . . . . . ",
" . . . . . . . . . . . . . . . . . ",
" . . . . . . . . . . . . . . . . . . . . ",
" . . . . . . . . . . . . . . . . . . . . . . . . . ",
" . . . . . . . . . . . . . . . . . . . . . . . ",
" . . . . . . . . . . . . . . . . . . . . ",
" . . . . . . . . . . . . . . . . . ",
". . . . . . . . . . . . . . ",
" . . . . . . . . . . . . . . . . . . . ",
" . . . . . . . . . . . . . . . ",
" . . . . . . . . . . . . . . . . . . . . . . . ",
" . . . . . . . . . . . . . . . . . ",
". . . . . . . . . . . . . . . . . . . . . . . . . . . . . ",
" . . . . . . . . . . . . . . . . ",
" . . . . . . . . . . . . . . ",
" . . . . . . . . . . . . . . ",
" . . . . . . . ",
" . . . . . . . . . ",
" . . . . . . . . . . . . . ",
" . . . . . . . . . . ",
" . . . . . . . . . . . ",
" . . . . . . * 3 9 e e e r e e e e e e r e e e e e e e t r e e e e e e e r & O 3 3 # 0 e e e r e e e e e e e t e e e e e e e e r e e e e e e 3 9 o . % 9 3 r e e e e e e e e e e e e r e e r e e e e e e e e e e e & - 3 . . # 0 e r e e e e e e e q r r e q e e e e r e e e e e e e t 9 9 # . # - 9 r e e e e e e e q r e e e e e e e e e e e e e r e e e e - - 3 . O 9 e e e e e r e e e e e e e e e e t e e e e r e e e e e 9 3 & . . . ",
" . . O F OX<XnXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXnX~ . ~ bXKXKXnXW % &XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXcX;X! e . D D.>XbXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXD.+ W bXKXKXnX~ # %XnXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXcX:X~ y . y / >XbXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX+Xo L cXKXKXnXOX+ X OXnXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXbX>X^ y . . . . . ",
" . . & / bXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX:X. #XKXKXKXKXKXKX#X % xXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxXP O # ~ cXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX<X# / KXKXKXKXKXKX;X X <XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXcXE + . + W xXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxX* . W KXKXKXKXKXKX<XO . :XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXcX~ # . ",
" W nXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXW y KXKXKXKXKXKXKXKXt / KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxXu . L bXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX/ 0 KXKXKXKXKXKXKXKXG W KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXcXD G bXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX@X % KXKXKXKXKXKXKXKXP K KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXbXK . ",
" . . . . # :XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX<X ^ KXKXKXKXKXKXKXKX~ 1XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX^ # %XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxX E KXKXKXKXKXKXKXKX+X :XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX+X. . +XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXnX G KXKXKXKXKXKXKXKX;X %XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX&XX . . . ",
" * 1XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxX +XKXKXKXKXKXKXKXKXOX xXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX%X. o <XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXnX ~ KXKXKXKXKXKXKXKX%X <XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX;X. . . ;XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX# P KXKXKXKXKXKXKXKX>X ;XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX<X# . . ",
" . . . . . X <XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX:X W KXKXKXKXKXKXKXKXE :XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX+X . . ;XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX1X G KXKXKXKXKXKXKXKX^ %XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX&X. %XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXcX u KXKXKXKXKXKXKXKX@X / KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX>X. . . . . ",
" . . @XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXu & nXKXKXKXKXKXKXbX& G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXP . ^ KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJ # cXKXKXKXKXKXKXKX9 u KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXQ W KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXW . xXKXKXKXKXKXKXKXt 0 KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXOX . . . ",
" . D KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXOX G KXKXKXKXKXKXF @XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXbX- r KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX%X u nXKXKXKXKXKXL ^ KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXnX0 9 nXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX:X e bXKXKXKXKXKXW E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy . . . ",
" . . # cXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXnXxX:XJ t ;XnXnX;Xq P 1XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX;X O xXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxX>XP q &XnXnX:Xy G <XnXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX<XO . <XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxX<XW . 7 %XnXnX>XD m >XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxX. . ",
" . . . . Q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXbXOXD - X & 0 L &XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXr L KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXnX+XG - . . * 9 J %XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG D KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX#XG 9 & 9 G @XnXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXP . . ",
". . cXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX%X# . . 3 :XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX;X 1XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX;X= = &XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX<X >XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX>X9 . & +XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxX . . ",
" . . . G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX~ . . @XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX- t KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX+X . . ^ KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXt 0 KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX%X. . W KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXF ",
" . . . %XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX&X . O <XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXP / KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX>X. ;XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX~ E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX1X# @XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX+X . . ",
" . xXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX3 q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX&X <XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXr . - nXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX>X =XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXD . o nXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxX . . . ",
" . . . . = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX:X . <XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXcX X KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX1X . . &XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXnX bXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXcX . +XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX& . . . . . ",
" . y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXW . . Q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXX 7 KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX/ . . P KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX3 . # KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX#X D KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXt . . . ",
" . . . . . . F KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXD F KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX- y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL r KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXr 3 KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXQ . . . 3 KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXD ",
" L KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXr . y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXe F KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXD . . . 9 KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXD e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXP # KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXY . . . . ",
" . . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXr . . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy J KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJ u KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . . O KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . ",
" . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXD . . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE ",
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy . G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . . . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . ",
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . . . ",
" . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq r KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG n KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . . . ",
" . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXn G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG u KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . ",
" . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy . G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE ",
" . . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . ",
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXe . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . ",
" . . . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . ",
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy . G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK O KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . ",
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJ y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . . ",
" . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy J KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJ . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . . . ",
" . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXD = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG . y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . ",
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . . . = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG . y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE ",
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . . . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy . G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . ",
" . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXu G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG u KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . ",
" . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . r KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG n KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE ",
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . - KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . . . . ",
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXe . . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . ",
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . ",
" . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . . . ",
" . . . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE ",
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy . G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJ y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . ",
" . . . . . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXn J KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG . y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . . . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . ",
" E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . . . r KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy . G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXD * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . ",
" . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . ",
" . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . . . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . ",
" . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG . n KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . . ",
" . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG u KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . . ",
" . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXD . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK O KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXY . . . ",
" . . . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXe . . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXu G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . . . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXW . ",
" . . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXr e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE ",
" . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . . . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . . . ",
" E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXn G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . . = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . ",
" . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy . G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJ . y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . ",
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq r KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy J KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXD . . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXW . . ",
" . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy . G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . . ",
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . . . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . ",
" . . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG . y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE ",
" . . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXu G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG u KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE ",
" . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXD . . = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG n KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . . ",
" . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . . = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . ",
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . ",
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . ",
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . . . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . . ",
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXe . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXD . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . ",
" . . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy J KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG . y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . O KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . ",
" . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXu J KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJ y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . ",
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . . r KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy . . G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . ",
" . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG u KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . . . ",
" . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXe . . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXn G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . . . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . . . X KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE ",
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXD . . . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG n KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . . ",
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . ",
" . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG . y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . ",
" . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXe q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK X KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . ",
" . . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXr r KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy J KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . - KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . ",
" . . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG . y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . ",
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy . G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXD . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG . y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . ",
" . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJ y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . ",
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXe . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXu G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXY . . . . . ",
" . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . . O KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXW . . . ",
" . . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXu G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm - KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE ",
" . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXn G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG u KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . ",
" . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG u KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . ",
" . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy . G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXD = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG n KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE ",
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . . . ",
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . ",
" . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXe . . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . . = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXW . . . ",
" . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXe . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG u KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . ",
" . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXu G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE ",
" . . . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXn G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXJ . y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . ",
" . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy J KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . ",
" . . . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . r KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE ",
" E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXu G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . ",
" . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXe . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . . . ",
" . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG n KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . . . . . . ",
" . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG u KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . ",
" . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXe . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXu G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE ",
" . . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXe . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXn G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . . . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . ",
" . . . . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy J KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . . . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE . . ",
" . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXD * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXH y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . O KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE ",
". . P KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX0 0 KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXt F KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXD . 3 KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG t KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG . KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXP . . . . ",
" . G KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX* . . . * KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX9 m KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm 9 KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXm . cXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG . . . ",
" . . y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX . O KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX% y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX~ . . K KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXt # KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXe . . . xXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy . . . ",
" 0 KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXcX bXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXnX = KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX>X . . %XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX& KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX% >XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX0 . . . . . ",
" . . . cXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX=X . . . ;XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX>X nXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX0 . % nXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXbX >XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxX ~ KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXcX . . ",
" . . . . &XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXW . . E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX~ ;XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX&X . #XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX;X ~ KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX#X . y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX&X . ",
" . . . Y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . . q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy ! KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE r KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXK . # nXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXP . . ",
" . . . . X nXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX>X . >XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX1X - KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX/ O Q KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX= . <XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXcX. OXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXbX# ",
" ^ KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXG . D KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . ;XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxXK = * E 1XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX&X J KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX~ . . . 3 KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXOX . . . ",
" . . * nXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxX. 1XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXcXX e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXcX<X&XD.0 * Q &X=XW # q OX;X<XcXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq xXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXnX* . &XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXnX- . . . ",
". . . P KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXq . . . 0 KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy @XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXE r bXKXKXKXKXcXr E KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXOX y KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXL . & bXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXW . . . . . . ",
" ;XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX/ . . ~ KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX+X # xXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXy O xXKXKXKXKXKXKXcX# e KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxX+ . / KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX;X . . . . F KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX>X . . ",
" . . . . . 3 cXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX<XO . >XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX1X# 3 cXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX>X D KXKXKXKXKXKXKXKXW +XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXcX3 X 1XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXcX* . @XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXbX- ",
" . . . e nXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxX* . & xXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxX- 0 cXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXbX Q KXKXKXKXKXKXKXKX%X <XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxX9 * xXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXbX0 . . :XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXnXt . . ",
" . . . . q cXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX>X& . . % <XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX1X= . . * <XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXbX ~ KXKXKXKXKXKXKXKX%X <XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX;X& . = 1XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxX0 . . . O &XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXcXq . . ",
" . * ;XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX/ . . . . X D.KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX+XO W nXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX&X m KXKXKXKXKXKXKXKXK OXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXbXK . +XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX=X# E nXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX;X% . . . . ",
" . . . F 1XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX;Xq . q ;XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX>Xt . 3 +XnXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXbX3 . 1XKXKXKXKXKXKX>X. 3 nXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXbX~ & . r :XKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX1Xm . . - @XnXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxXF . . . ",
" . . t D.xXKXKXKXKXKXKXKXKXKXnX>X~ 9 . . . 3 Q <XKXKXKXKXKXKXKXKXKXKX<X^ q . % Q :XnXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXxXt = <XKXKXKXKX;X& D bXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXbX;XE # 3 ~ <XKXKXKXKXKXKXKXKXKXKX<X/ e . . . & E >XnXKXKXKXKXKXKXKXKXKX1X+Xy . . ",
" . & y K E Q Q P G 9 . . . . # t G E Q Q E G q . . . e D P W Q Q Q Q Q Q Q Q Q Q Q Q ! Q Q Q Q Q Q Q Q Q Q Q Q Q Q W D X y E E 0 # D W Q Q Q Q Q Q Q Q Q Q Q Q Q Q W Q Q Q Q Q ! Q Q Q Q Q Q Q L F r # t G E Q Q E G q X . . . # 0 F P Q W W J e o . . . . . ",
" . . . . . . . . ",
" . . . . . . . . . ",
" . . . . . . . . . . . . ",
" . . . . . . . . . . . . . . . . . . ",
" . . . . . . . . . . . . . . . . . . ",
" . . . . . . . . . . . . . . . . . . . . ",
" . . . . . . . . . . . . . . . . . . ",
" . . . . . . . . . . . . . . . . . . . . . ",
" . . . . . . . . . . . . . . ",
" . . . . . . . . . . . . . . . ",
" . . . . . . . . . . . . . . . . . . . . . . ",
" . . . . . . . . . . . . . . . . . . . . . . . . . ",
" . . . . . . . . . . . . . . . . ",
" . . . . . . . . . . . . . . . . . ",
" . . . . . . . . . . . . . ",
"H . . . . . . . . . . . . . . . . H ",
"UXvXK . . . . . . . . . . . . . . . . . . . . . . . . J vXUX",
"UXUXUXxXH . . . . . . . . . . . . . . . . . H xXUXUXUX",
"UXUXIXIXUX1Xn . . . . . . . . . . . . . . . . . . m 1XUXUXUXUXUX",
"UXUXUXUXUXUXUX,Xt . . . . . . . . . . . . . . . . . t ,XUXUXUXUXUXUXUX",
"UXUXUXUXUXUXUXUXUX,Xr . . . . . . . . . . . . . . . . e ,XUXUXUXUXUXUXUXUXUX",
"UXUXUXUXIXUXUXUXUXUXIX=X0 . . . . . . . . . . . . . . . . . . w -XIXIXIXUXUXUXUXIXUXIXIX",
"UXIXIXIXIXUXIXIXIXUXIXIXIX=X9 . . . . . . . . . . . . . . . . . 9 =XPXUXIXIXIXUXUXIXIXIXIXUXIX",
"IXIXIXIXIXIXIXIXIXIXIXIXIXIXPX$X3 . . . . . . . . . . . . . . . . . = $XLXIXIXIXIXIXIXIXIXIXIXIXIXIXIX",
"IXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXPX$X= . . . . . . . . . . * $XPXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIXIX",
"PXIXPXIXIXIXIXIXIXPXIXIXPXIXIXPXPXIXDXD.% . . . . . . . . . . . . . . . . . . . . . . . % D.DXIXPXIXIXIXIXPXIXIXIXPXIXIXIXPXIXIXIX",
"IXPXIXPXIXJXIXIXIXPXPXPXIXPXIXPXPXIXIXPXDX].o . . . . . . . . . . . . . . . . . # D.DXIXIXIXPXIXPXPXPXIXPXPXPXPXPXPXIXPXIXPXPX",
"JXPXIXPXPXPXPXPXPXPXPXIXPXPXPXPXPXPXPXPXPXIXAX! + . . . . . . . . . . . . . . . . . . X ~ AXLXLXPXPXPXIXIXPXPXPXPXPXPXPXPXIXPXPXPXPXPXPX",
"PXPXPXJXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXLXLXPXAX! O . . . . . . . . . . . . X ! AXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPX",
"PXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXvXY . . . . . . . . . . . . . . . . . . . . . . Y vXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPXPX",
"PXPXJXPXPXPXJXPXPXPXJXPXPXPXJXPXPXPXJXPXPXPXPXPXPXPXPXPXvXL . . . . . . . . . . . . . R vXPXJXPXPXJXPXPXPXJXPXPXPXJXPXJXPXPXPXPXJXPXJXPXPXJXPXPXPX",
"JXJXPXPXJXJXJXPXJXJXPXPXJXJXJXPXJXJXPXJXJXPXJXJXJXPXJXPXJXPXgXH . . . . . . . . . . . J gXPXJXJXPXPXJXJXPXPXJXPXJXPXJXJXJXPXJXPXJXPXPXPXJXPXPXJXJXPXJX",
"JXJXJXJXPXJXPXJXJXJXJXJXPXJXPXJXJXPXJXJXJXPXJXPXJXJXJXJXJXJXJXPXuXD . . . . . . . . . . . . . . . . . . . F 1XJXJXJXPXJXJXJXJXJXJXJXJXJXJXJXJXJXPXJXJXJXJXJXJXJXJXJXJXJXPXJXJX",
"PXJXJXJXJXJXJXJXPXJXJXJXJXJXJXJXJXJXPXJXJXJXJXJXPXJXJXJXPXJXJXJXPXJXuXn . . . . . . . . . . . . . . m uXJXJXJXJXJXJXJXJXPXJXJXJXPXJXPXJXJXJXJXJXPXJXPXJXJXJXJXJXJXJXJXJXJXPX",
"JXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX,Xr . . . . . . . . . . . . . . . . . . r ,XJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJXJX",
"HXJXJXJXJXJXJXJXJXJXHXPXJXJXHXJXJXJXHXJXJXHXJXJXJXHXJXJXJXJXJXJXPXHXJXJXJXHX,Xq . . . . . . . . . . . . . . e ,XHXJXJXJXJXJXJXHXJXJXJXJXJXHXHXJXHXPXJXJXJXJXJXJXHXJXJXJXHXJXJXHXJXJXJXJXHXJX",
"HXJXHXHXHXHXHXJXHXHXJXHXHXHXJXJXHXJXJXHXJXHXHXJXHXJXHXJXHXHXHXHXHXJXHXJXHXJXJXHX=X7 . . . . . . . . . . . . . . . . . . 7 -XHXHXHXHXJXHXHXHXHXJXHXHXHXJXHXJXJXJXHXHXHXHXHXHXHXJXJXHXJXHXJXHXHXJXHXJXHXJXJXHX",
"JXHXHXJXJXHXHXHXJXHXPXHXHXJXJXHXHXJXHXJXJXJXJXHXJXJXHXHXJXJXJXHXJXHXHXPXJXJXHXHXHXHX-X3 . . . . . . . . . . . . . . 3 -XGXHXHXPXHXJXHXJXJXJXJXHXHXJXHXJXHXHXHXJXPXHXHXJXHXHXHXJXHXJXHXJXHXHXJXJXHXHXJXHXHXJX",
"JXHXHXJXHXHXHXHXJXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXJXHXHXHXHXHXHXHXHXHXHXHXJXHXHXHXSX#X3 . . . . . . . . . . . . 2 $XSXJXHXHXJXHXHXHXHXHXHXHXHXHXHXJXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXJXHXHXHXHXHXHXJXHXJXHXHX",
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXFX#X* . . . . . . . . . . . . . . . * #XFXHXHXHXHXHXHXHXHXHXHXHXHXHXJXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXJXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
"HXHXHXHXHXHXHXHXHXHXFXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXFXHXHXFXHXHXHXHXHXHXHXHXHXHXAXF.# . . . . . . . . . . . . . . . # D.AXHXHXFXGXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHX",
"HXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXAXD.# . . . . . . . . . . . . . . . . . # D.AXHXFXFXHXHXFXHXHXHXHXHXHXHXHXHXHXFXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXHXFXHXHXHXHXHXHXHXHXHXHXFX",
"HXHXHXHXHXHXHXFXHXHXFXHXHXFXHXFXHXHXHXFXHXFXFXHXFXHXHXFXFXHXFXHXHXFXHXFXHXFXFXHXHXHXGXHXFXHXFXFXSXHXFXmX! + . . . . . . . . . . . . # ! mXFXFXHXFXHXHXFXHXHXHXHXFXHXFXHXFXFXHXHXHXHXHXHXHXHXHXFXHXHXFXHXHXFXHXHXFXHXFXHXHXFXHXHXHXFXHXHXFXHXFXHX",
"HXFXHXFXHXHXFXHXFXFXFXFXHXFXHXHXFXHXHXHXHXFXFXHXHXFXHXFXHXFXHXFXHXFXHXHXFXHXFXHXHXHXHXFXFXHXHXFXHXHXHXHXHXmX! . . . . . . . . . . . . . X ! mXSXHXHXFXHXHXHXFXHXHXFXHXHXFXFXHXFXFXHXFXFXFXHXFXHXHXHXFXHXFXHXFXHXHXFXHXFXFXHXHXHXHXFXFXFXFXHXHXFXHXHXFXHX",
"FXFXFXHXFXFXFXFXFXFXFXHXHXFXFXFXFXFXFXFXFXHXFXFXFXFXFXHXFXFXHXFXFXFXFXFXFXFXHXFXFXFXFXHXFXFXFXFXFXFXSXHXSXHXGXhXY . . . . . . . . . . . . . . . . . Y gXHXFXHXFXHXFXFXFXFXFXFXFXFXFXFXFXHXFXFXHXFXFXHXFXFXHXFXFXFXFXFXHXFXFXFXFXFXFXHXFXFXFXFXFXHXFXFXFXFXFXHXFXFXFXFX",
"FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXHXSXHXSXFXgXP o . . . . . . . . . . . . . . . . . . . X Y gXFXSXHXSXHXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX",
"FXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXHXSXHXFXFXHXuXJ . . . . . . . . . . . H uXHXSXHXHXSXHXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFX",
"FXFXSXFXFXFXFXFXFXFXSXFXFXFXSXFXFXFXFXFXFXFXFXFXSXFXFXFXFXFXSXFXFXSXFXFXFXFXSXFXSXFXFXFXFXFXFXFXFXFXFXSXFXHXSXFXFXFXFXFXSXuXD o . . . . . . . . . . . . . . I uXHXSXHXFXSXSXFXHXSXFXFXFXSXFXFXFXFXSXFXFXFXFXFXFXSXFXFXFXSXSXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXFXSXFXFXFXFXFXFXFXFXFXSX",
"SXSXFXFXFXSXFXSXFXSXFXSXSXSXFXFXFXSXSXSXSXFXSXSXFXFXSXFXSXFXSXFXFXFXSXFXSXSXFXFXFXSXFXSXSXFXSXFXSXFXSXHXSXSXFXSXSXFXSXFXSXFXSX,Xn . . . . . . . . . . . . n ,XFXSXHXSXSXSXHXSXSXSXSXSXSXFXFXSXSXFXSXFXSXSXFXSXFXFXFXFXSXFXSXFXFXSXFXFXSXSXSXFXSXSXSXSXSXSXFXFXSXFXSXFXFXSXFXSXFXSXSXSXFXSXFX",
"SXSXFXSXSXFXSXSXSXFXSXSXSXFXFXSXFXSXSXFXSXSXSXFXSXSXSXSXSXFXSXSXSXSXSXFXSXFXFXSXSXSXSXSXSXSXFXSXSXSXSXSXSXHXSXSXFXSXSXSXSXSXSXSXSX-Xr . . . . . . . . . . . . . . . . e -XFXSXFXSXSXSXSXFXSXSXSXSXSXSXSXFXSXSXSXFXFXSXSXSXSXSXSXFXSXSXFXSXFXSXSXSXSXSXSXSXSXSXFXSXSXFXSXFXSXFXSXSXSXSXSXSXSXSXSXSXFXFXSXSXFX",
"FXSXSXSXSXSXSXSXSXFXSXFXSXSXSXSXSXSXSXSXFXSXSXSXSXSXFXSXSXSXSXFXSXFXSXSXSXSXSXSXFXFXSXSXFXSXSXSXSXFXSXSXSXSXSXSXSXSXFXSXFXSXSXSXSXFXSX4Xw . . . . . . . . . . r 4XSXSXSXSXSXSXSXSXSXSXSXFXSXSXHXFXSXSXSXFXSXSXSXSXFXSXFXFXSXSXSXSXSXSXSXSXSXSXSXFXSXSXFXSXSXFXFXSXSXSXSXSXSXFXSXFXSXSXFXSXSXSXSXSXSXSXSX",
"SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX*X7 . . . . . . . . . . . . 9 *XAXFXZXZXFXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXZXSXSXSXZXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSX",
"SXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXZXSXSXZXSXSXSXSXSXSXZXSXSXSXSXSXSXSXSXSXSXSXSXSXZXSXSXSXSXSXSXSXSXSXSXSXSXSXZXZXSXSXSXSXSXSXSXSXSXZX*X7 . . . . . . . . . . . . . . . 7 *XZXSXSXZXFXSXFXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXSXZXSXSXSXSXZXSXSXSXSXSXZXSXSXSXSXZXSXSXSXSXSXSXSXSX",
"ZXSXZXSXZXSXSXSXZXSXZXSXZXSXZXSXZXSXZXSXSXSXSXSXSXSXSXZXZXSXSXZXSXZXZXSXZXSXSXSXZXSXSXSXZXSXSXZXSXZXZXSXZXSXSXSXSXZXSXSXSXSXSXSXSXZXSXSXSXZXSXSXVX].* . . . . . . . . . . . * ].ZXZXFXSXZXSXZXZXZXSXZXSXZXZXSXSXZXZXSXSXSXZXSXSXSXZXSXSXZXSXSXSXSXSXSXSXSXZXSXZXSXSXSXSXSXSXCXSXSXZXSXSXZXSXSXZXSXZXSXSXZXSXSXZXSXSXSXZXZXSXSXZXSX",
"SXSXZXSXSXZXSXSXSXZXSXZXSXZXSXZXSXSXSXSXSXZXZXSXZXZXSXSXSXSXZXSXZXSXSXZXSXSXZXSXSXZXZXSXSXSXZXSXZXSXSXSXSXZXSXZXSXSXSXZXZXSXZXZXSXSXSXZXSXSXZXZXSXSXVX].= . . . . . . . . . . . . . = ].CXSXSXZXFXZXSXZXFXSXSXZXSXZXSXSXZXSXZXSXZXZXSXSXZXZXSXSXZXSXZXSXZXZXSXSXZXZXSXSXZXSXSXSXZXSXZXSXSXSXZXSXZXSXSXZXSXSXZXSXZXSXSXZXSXSXSXZXSXSXSXZXZXSXZX",
"ZXSXSXSXCXSXSXCXSXZXSXZXZXSXZXSXZXZXSXZXZXSXZXZXZXSXZXZXSXZXZXSXSXZXZXSXZXSXZXZXZXZXZXZXZXSXZXZXZXZXSXZXZXSXZXZXZXZXSXZXZXSXZXSXZXZXSXZXZXSXZXSXZXSXZXZXVXA.& . . . . . . . . . . . . # A.VXZXSXZXSXZXZXZXSXSXZXZXZXSXZXSXZXZXSXZXSXZXSXZXSXZXSXZXSXZXSXZXSXZXSXZXSXZXSXZXSXZXZXSXZXSXZXSXSXSXCXSXSXSXZXZXSXZXSXZXSXZXSXZXZXSXZXSXZXZXSXSXZXZXZXZXSX",
"SXCXCXSXSXCXSXCXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXSXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXmXA.o . . . . . . . . . o S.mXSXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXCXSXCXCXCXSXSXCXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXSXZXZX",
"CXCXSXZXCXZXCXSXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXSXZXhX! + . . . . . . . . . . # ! hXZXZXCXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXCXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXCXZXZXZXZXZXZXZXZXZXZXZXCXSXZXCXCXCXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXCXZXZXZXZX",
"CXSXCXZXSXCXSXCXZXZXCXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXhX! + . . . . . . . . . . . . . . . . . O R hXCXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXCXZXZXCXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXCXZXSXCXZXSXCXSXZXCXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZXZX",
"CXZXCXZXCXZXZXZXCXZXZXCXZXZXZXCXZXZXCXZXCXZXZXZXCXZXCXZXCXZXCXZXZXCXZXZXZXZXZXCXZXZXZXCXZXCXZXZXCXZXZXZXCXZXZXZXZXZXCXZXZXZXZXZXZXZXZXCXCXZXCXZXZXZXCXZXZXZXCXZXZXCXZXZXhXI . . . . . . . . . . . . . o o U gXZXZXZXZXZXZXZXCXZXCXZXZXZXZXZXCXZXCXZXZXCXZXZXZXCXZXCXZXZXCXZXZXZXCXZXZXZXCXZXCXZXZXZXCXZXZXZXZXCXZXZXCXZXSXCXCXZXCXZXZXZXZXZXCXZXCXZXZXCXZXCXZXCXZXCXCXCXZXZXZXCXZXCXZX",
"ZXCXZXZXZXCXCXCXCXCXCXZXCXCXZXCXCXCXCXZXCXCXCXZXZXZXCXZXZXCXZXZXCXZXCXCXCXCXCXCXCXCXCXZXCXZXCXCXCXCXCXCXZXCXCXZXCXCXCXZXCXCXCXCXCXCXCXZXCXZXCXZXCXCXZXCXCXCXCXCXZXCXCXCXZXZXgXI . . . . . . . . . . . . . . . L gXCXZXCXCXCXCXCXCXZXCXCXCXCXCXCXCXZXCXCXCXCXCXCXCXCXZXCXZXCXCXCXZXCXCXZXCXCXCXCXZXZXCXCXCXZXCXCXCXCXCXCXCXZXCXCXCXCXCXCXZXCXCXCXCXCXCXCXZXCXCXZXZXCXZXZXZXCXCXZXCXCXZXZXCXCXCX",
"CXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXZXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXZXCXCXCXuXH . . . . . . . . . H uXBXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCX",
"CXCXCXCXCXCXCXCXCXZXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXZXCXCXCXCXCXCXCXCXCXCXZXCXCXCXCXCXCXCXCXCXuXH . . . . . . . H uXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXZXCXCXCXCXCXZXCXCXCXCXCXCXCXCXCXCXCXZXCXCXCXCXCXCXCXCXCXCXCXZXCXCXZXCXCXCXCXCXZXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCX",
"CXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXBXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCX4Xy . . . . . . . . . . . . . . n 4XCXCXCXCXCXCXCXCXCXCXBXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXBXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXBXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXCXBXCXCXCXCXCX",
"CXBXBXCXCXCXCXBXCXBXCXCXCXCXBXCXCXCXBXCXBXCXCXCXCXBXBXCXBXCXCXBXCXCXCXBXCXCXCXCXCXBXCXCXCXCXBXCXCXCXCXCXCXBXCXCXCXCXBXCXCXCXCXCXCXCXCXBXBXCXCXBXCXCXBXCXCXCXCXCXBXCXCXBXCXBXCXCXCXCXBXCXBXCX-Xw . . . . . . . . . . . r 4XCXCXBXCXBXCXCXBXCXCXCXCXCXCXCXCXCXCXCXBXCXCXCXCXBXCXCXCXCXCXCXCXBXCXCXCXCXCXCXCXBXCXCXCXCXCXCXCXBXCXCXCXCXBXCXCXCXBXBXCXCXCXCXCXBXCXCXCXBXCXCXCXBXCXCXCXCXCXCXBXBXCXBXCXCXCXBXCXCXCXCXCXCXCX",
"CXBXCXBXCXBXBXCXBXCXCXBXCXBXCXBXBXCXBXCXCXBXCXBXCXBXCXBXBXCXBXCXCXCXBXCXCXBXBXCXBXCXCXBXCXBXCXBXCXBXBXCXBXBXCXBXCXBXCXBXCXBXBXCXBXCXBXCXBXCXBXCXBXBXCXCXCXCXBXCXBXCXBXCXBXCXBXCXBXCXCXBXBXCXBXCX2Xq . . . . . . . . . . . . . . w 2XCXCXCXBXCXBXCXCXCXCXBXCXCXBXBXCXBXCXCXCXBXCXBXCXBXCXCXCXBXBXCXCXBXCXBXCXBXCXBXBXCXBXBXCXBXCXCXBXBXBXCXBXBXCXBXCXCXBXBXCXCXBXBXCXBXCXBXCXBXBXCXCXBXCXCXCXBXCXBXBXBXCXCXBXCXCXCXBXBXCXBXCXBXCXBXBX",
"BXCXBXBXBXCXBXBXBXBXBXBXBXCXBXBXCXBXBXBXCXBXBXBXBXCXBXBXCXBXBXBXBXBXBXBXBXBXCXBXBXBXBXBXBXCXBXBXBXCXBXBXBXCXBXBXBXCXBXBXBXCXBXBXCXBXBXBXCXBXBXBXCXBXBXBXBXBXBXBXCXBXBXBXBXBXCXBXBXCXBXBXCXBXBXBXCXMX*X8 . . . . . . . . . . . 7 *XBXCXBXBXBXBXCXBXBXBXBXBXBXBXBXCXBXBXBXBXBXBXCXBXBXBXBXBXBXBXBXCXBXBXBXBXCXBXBXBXCXBXBXBXCXBXBXBXBXBXCXBXBXBXCXBXBXBXBXCXBXBXCXBXCXBXBXBXCXBXBXCXBXBXBXBXBXBXBXBXCXBXBXBXCXBXBXBXBXCXBXBXCXBXBXBXCXBX",
"BXBXBXBXBXBXBXBXBXBXCXBXBXBXBXCXBXBXBXBXCXBXBXCXBXBXCXBXBXBXBXCXBXBXBXBXCXBXBXCXBXBXBXBXCXBXBXBXBXCXBXBXBXCXBXBXCXBXBXBXCXBXCXBXBXBXBXBXCXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXCXBXBXCXBXBXBXBXCXBXCXBXBX*X3 . . . . . . . . . . . . . . . 3 *XMXBXBXCXBXBXBXBXBXBXBXBXBXBXBXBXBXBXCXBXBXCXBXBXBXBXCXBXCXBXBXBXBXCXBXBXBXCXBXBXBXCXBXBXCXBXCXBXBXCXBXBXBXBXCXBXBXBXBXCXBXBXBXCXBXBXCXBXCXBXBXBXBXBXCXBXCXBXBXBXBXCXBXBXCXBXBXCXBXBXBXCXBXBXBXBXBXCXBXBX",
"BXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXkXF.= . . . . . . . . . * ].zXBXMXCXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBX",
"BXBXBXBXBXBXBXBXBXBXBXBXBXBXNXBXBXBXBXBXBXBXBXNXBXBXBXBXBXBXNXBXBXBXNXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXNXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXNXBXBXBXBXBXBXBXBXMXF.* . . . . . . . % F.zXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXNXBXNXBXBXBXBXBXBXNXBXBXBXBXNXBXBXBXBXBXBXNXBXBXBXBXBXBXBXBXBXNXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXNXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXBX",
"BXBXBXBXNXBXBXBXNXBXNXBXBXBXBXNXBXNXBXNXNXBXNXBXNXBXNXBXBXBXBXNXBXBXBXNXNXNXBXNXBXNXBXNXBXNXNXBXNXBXNXBXBXBXBXNXBXzXBXNXNXBXzXBXBXNXNXBXNXBXNXBXBXNXNXBXBXBXBXNXBXBXNXBXNXBXNXBXNXBXNXBXBXBXBXNXMXBXMXNXNXMXBXBXBXMXA.# . . . . . . . . . . . & A.kXBXBXzXBXBXNXNXBXNXBXzXBXBXBXBXBXBXzXBXBXBXNXBXNXBXBXNXNXBXNXBXBXBXNXBXBXNXBXNXNXBXBXBXNXBXBXBXBXzXNXBXzXBXBXBXBXNXBXBXzXBXBXBXBXNXNXBXBXzXNXBXNXBXBXNXNXBXNXBXBXNXNXNXBXNXBXNXNXBXNXBXNXNXBXNXNXBXBXNXNXBXNXBXNXBX",
"NXBXNXBXBXBXBXNXBXNXBXBXBXBXBXBXBXNXBXNXBXBXBXNXBXNXBXNXBXBXBXBXBXBXNXBXBXBXNXBXBXBXNXBXBXNXNXBXNXBXBXBXNXBXNXBXNXBXBXBXBXzXzXBXBXNXBXNXBXBXBXNXNXBXNXBXNXBXBXBXNXBXBXNXNXBXBXNXBXNXBXBXBXBXBXBXBXBXzXBXBXBXNXBXNXBXBXhXA.# . . . . . . . . . . . . + A.kXBXBXBXNXBXNXBXBXBXBXzXzXBXBXBXBXBXBXBXBXBXzXBXBXBXBXNXNXBXNXBXNXBXNXNXBXBXBXNXBXBXNXBXNXBXBXBXNXBXBXBXNXBXBXBXzXBXzXBXBXNXBXBXzXBXBXBXBXBXNXBXBXNXBXNXNXBXBXNXBXNXBXBXBXBXNXBXNXBXNXNXBXNXBXBXNXBXBXNXBXBXNXBXNXBXNXBX",
"NXBXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXBXNXNXNXNXNXNXNXNXNXBXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXBXNXNXBXNXNXNXNXBXNXNXBXNXzXBXBXBXBXBXNXBXNXBXzXBXBXNXBXNXNXNXNXNXNXNXNXNXNXBXNXNXNXNXNXNXNXNXNXNXNXNXzXNXBXBXNXNXNXNXNXBXNXNXBXhXR o . . . . # n.hXNXNXMXzXBXNXBXNXNXzXBXBXBXBXBXBXzXzXBXzXBXzXBXBXBXBXzXNXBXBXNXNXNXBXNXNXBXNXNXNXBXNXNXNXNXNXNXBXzXBXzXNXBXBXNXNXNXBXBXzXBXNXBXzXBXBXBXzXBXBXzXBXNXBXNXNXBXNXNXBXNXNXBXNXNXNXNXNXNXBXNXNXBXNXNXNXNXNXNXNXNXNXNXNXNXNXBXNXNX",
"NXNXNXNXNXNXNXBXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXBXNXNXNXNXNXNXNXNXNXNXBXNXNXNXNXNXBXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXBXNXzXBXzXBXzXBXNXNXNXNXNXNXzXBXNXNXNXBXNXNXNXNXBXNXNXNXNXNXBXNXNXNXNXNXNXNXNXNXBXzXBXNXBXNXNXNXNXNXNXNXNXNXNXiXR . . . . . . . . . R iXMXBXNXBXBXzXBXNXNXNXNXNXBXzXBXBXzXzXBXBXzXBXzXBXBXBXBXzXBXNXNXNXNXNXNXNXNXNXNXNXNXNXNXBXNXNXNXNXNXNXBXNXNXBXNXNXNXNXNXNXNXBXNXNXNXzXBXzXBXBXzXzXBXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXBXNXNXNXNXNXNXNXBXNXNXNXNXNXBXNXNXNXBXNXNXNXNX",
"NXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXzXBXzXBXzXBXzXNXNXNXNXNXNXNXzXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXzXBXzXBXzXNXNXNXNXNXNXNXNXNXNXNXzXiXU . . . . . . . . . . . . . . . . . I iXNXBXMXzXBXzXNXBXzXNXNXNXNXNXNXNXzXBXzXBXBXzXBXBXzXzXzXzXzXBXzXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXzXNXNXNXNXNXNXzXBXzXNXNXNXNXNXNXBXzXNXBXzXBXzXBXzXBXzXBXzXNXNXzXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNX",
"NXNXNXNXNXNXNXNXNXNXNXNXNXNXNXzXNXNXNXzXBXNXNXNXNXBXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXzXNXNXNXNXNXBXzXBXzXzXBXzXBXzXBXzXBXNXNXNXNXzXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXBXNXNXNXNXBXNXNXNXNXNXzXBXNXNXNXNXNXNXNXNXNXzXNXNXNXNXNXMXNXNXuXU . . . . . . . . . . I uXNXNXNXzXNXNXNXzXNXNXNXNXNXBXNXNXNXNXNXBXzXBXzXBXzXzXBXzXBXzXBXBXBXBXBXNXNXBXNXNXNXNXNXNXNXNXNXzXBXNXNXNXNXNXNXNXzXNXNXNXNXNXNXNXBXNXNXBXzXBXzXBXzXzXBXNXzXNXBXzXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXNXBXzXNXNXNXNXNXNXNXNXNXNXNXNX",
"NXNXNXNXNXNXNXzXNXNXNXzXNXNXNXNXNXNXNXNXzXNXzXNXNXzXNXzXNXNXzXNXNXzXNXNXNXzXNXNXzXNXzXNXNXNXNXNXzXNXNXNXzXBXzXBXBXzXBXzXBXzXBXzXNXzXNXNXNXNXNXNXzXNXNXNXNXNXzXNXNXNXNXzXzXNXzXNXNXzXNXzXNXNXNXNXzXNXBXzXNXNXzXNXNXNXNXNXNXNXNXzXMXMXNXzXNX4XH . . . . . . . . . H uXNXNXNXNXNXNXNXNXNXNXNXNXNXzXNXzXNXzXNXBXzXzXBXzXBXzXBXBXzXBXzXBXzXzXzXzXzXNXNXzXNXzXNXzXNXzXNXNXNXNXzXNXNXzXNXNXNXNXNXNXNXNXzXzXBXNXzXNXzXzXBXzXBXzXBXBXzXNXBXzXzXNXBXzXNXNXNXNXNXzXNXzXNXzXNXNXNXNXzXNXNXNXNXzXBXNXzXNXNXNXNXNXNXNXNXNXlX",
"NXNXlXNXNXzXzXNXNXzXzXNXNXzXNXNXNXNXNXzXNXNXNXzXBXzXzXNXzXNXNXNXzXNXzXNXNXNXNXNXzXNXNXzXNXNXzXNXzXNXzXzXzXzXzXBXzXzXzXzXzXBXBXzXNXNXzXNXNXNXzXNXzXNXzXNXNXzXNXlXNXzXzXNXNXNXNXzXzXBXzXNXNXzXNXNXzXBXzXzXzXNXNXNXNXNXzXNXNXzXzXNXNXzXzXNXzXNXNX5XA . . . . . . . I 4XNXzXNXNXNXNXNXNXzXNXzXNXzXNXzXNXNXzXNXzXBXzXzXzXzXzXzXzXBXzXBXzXzXzXBXzXzXBXzXzXNXNXNXzXNXNXzXNXNXzXzXNXNXNXNXNXzXNXzXNXzXNXNXzXzXNXNXzXBXzXNXBXzXzXBXzXBXzXBXzXNXBXzXzXNXBXzXzXzXNXNXzXNXNXzXNXNXzXNXNXNXzXzXzXzXNXzXzXNXzXNXNXNXNXNXlXNXNXNX",
"zXlXNXzXzXNXzXzXzXNXzXzXNXzXzXzXzXzXNXzXzXzXzXzXzXNXzXzXNXzXzXzXzXNXzXzXzXzXzXzXzXzXNXzXzXzXNXzXzXzXNXzXzXBXzXzXzXBXzXzXzXzXzXzXzXzXzXzXzXNXzXNXzXNXzXzXNXlXNXNXzXNXzXzXzXzXzXzXzXzXzXzXNXzXzXzXzXzXNXzXNXzXzXzXzXzXNXzXzXNXzXzXzXNXzXzXNXzXNXNXzX4Xn . . . . . . . . . . n 2XzXzXzXNXzXNXlXNXfXlXNXNXzXzXNXNXzXzXzXNXzXzXzXNXzXBXzXzXzXzXzXzXzXzXzXzXzXBXzXzXzXzXzXzXzXzXzXNXzXzXNXzXzXzXzXzXzXNXzXzXzXNXzXzXzXzXNXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXNXzXzXzXzXzXNXzXzXzXzXNXzXzXzXNXzXzXzXzXNXzXNXzXNXzXzXNXzXNXlXNXlXNXNXNXlX",
"zXzXzXzXNXzXzXzXzXNXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXNXzXzXzXNXzXzXzXNXzXzXzXzXzXzXzXNXzXzXzXzXzXzXzXBXzXzXzXzXzXzXzXzXzXzXzXzXNXzXzXNXzXNXNXlXNXlXNXzXNXzXzXzXzXzXzXzXNXzXzXzXzXzXzXzXzXzXzXzXNXzXNXzXzXNXlXNXNXzXNXNXzXzXNXzXNXNXzXNXzXzX2Xn . . . . . . r 4XzXzXMXzXzXzXNXzXNXzXNXNXNXlXNXzXNXzXNXzXMXzXzXzXzXBXzXzXzXzXzXzXzXzXzXzXBXzXzXzXzXzXzXzXzXzXzXBXzXzXzXzXzXzXzXzXzXzXzXzXNXzXzXzXzXzXNXzXzXzXzXzXBXzXzXzXzXzXzXzXzXzXzXzXBXzXzXzXzXzXzXzXzXzXzXNXzXzXBXzXzXzXNXzXzXzXzXzXBXzXzXzXzXzXzXzXNXzXzXlXNXlXNX",
"zXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXlXNXNXlXNXlXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXNXzXNXlXNXfXNXlXzXzXzXzXzXzXzXzXzXzXzXzXNX*Xw . . . . . . . . 0 2XzXlXzXzXzXzXzXzXzXzXzXzXzXlXNXNXlXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXNXlXNXlX",
"zXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXlXlXNXNXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXlXzXzXNXNXNXfXNXzXzXzXzXzXzXzXzXzXzXzXzXzXzXlX[.7 . . . . . . . . . 0 *XlXzXzXzXzXzXzXzXzXzXzXzXzXNXlXlXNXfXNXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXlXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXlXzX",
"zXzXlXzXzXzXzXlXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXlXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXlXzXzXlXlXlXNXfXNXzXzXlXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXlXzXlXzXlXzXfXNXNXlXzXzXlXzXzXlXzXlXzXzXlXzXzXzXzXlXlX[.7 . . . . . . . . . . . . . . . 3 [.lXzXlXzXlXzXzXlXzXlXzXzXlXzXlXzXlXlXNXfXNXzXlXzXlXzXzXlXzXlXzXzXzXzXzXzXzXzXzXzXlXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXlXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXzXlXzXlXzXzXzXzXzXzXzXzXzXlXzXzXzXzXzXzXzXzXzXzXzXlXzXlXzXzXzXzXzXlXzXzXlX",
"lXlXlXlXlXNXlXlXNXlXlXNXlXlXlXNXlXlXlXlXlXlXlXNXlXlXNXlXlXNXlXlXlXlXNXlXlXNXlXlXlXNXlXlXlXlXlXlXNXlXlXlXlXlXlXlXlXlXlXlXNXlXlXlXlXlXNXlXlXzXzXlXNXlXlXlXlXlXlXlXlXlXlXlXlXNXlXlXNXlXlXNXlXlXlXlXzXlXzXlXzXlXzXlXlXzXlXzXlXzXlXzXlXlXzXlXzXlXzXlXlXzXlXzXlXzXlXlXzXlXjXF.= . . . . . . . : F.jXlXzXlXlXlXzXlXlXzXlXlXzXlXlXzXlXlXlXzXlXlXzXzXlXlXzXlXlXlXzXlXlXzXlXlXlXNXlXlXNXNXlXlXlXNXlXlXlXlXlXlXlXNXlXlXNXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXNXlXlXNXlXlXlXlXNXlXlXNXlXlXNXlXlXlXlXlXlXlXlXlXNXlXlXNXlXlXlXlXlXlXlXlXNXlXlXlXNXNXlXlXNXlXlXlXlXlXlXlXlXlXlXlXlXlXlX",
"lXlXNXlXlXlXlXNXlXlXlXlXNXlXlXlXlXNXlXlXNXlXlXlXNXlXlXlXlXlXlXlXNXlXlXlXlXlXlXlXlXlXlXNXlXlXNXlXlXlXlXNXlXlXNXlXlXlXNXlXlXlXlXlXNXlXlXlXzXlXlXlXlXlXlXNXlXlXNXlXlXlXNXlXlXlXlXlXlXlXlXlXlXNXlXlXlXzXlXzXlXzXlXlXlXlXzXlXzXlXzXlXzXzXlXzXlXzXlXlXlXlXzXlXzXlXzXlXlXzXlXlXjXF.% . . . . . . . . . . * F.kXlXlXzXlXlXzXlXzXzXlXlXzXlXzXzXlXzXlXzXlXlXzXzXlXlXzXzXlXlXzXzXlXlXzXzXlXlXlXlXlXlXlXlXlXlXlXlXlXNXlXlXNXNXlXlXlXlXlXlXlXlXlXlXNXNXlXlXlXNXlXlXNXlXlXlXlXlXlXNXlXlXlXlXlXlXlXlXlXlXlXlXNXlXNXNXlXlXlXlXlXlXlXNXlXlXNXNXlXlXlXlXlXlXlXlXlXlXlXlXlXlXNXNXlXNXlXNXlXlXNXlXlX",
"lXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXzXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXdXA.# . . . . . # A.dXlXlXlXlXlXlXlXlXlXlXlXlXlXlXzXlXzXzXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXjXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXjXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlX",
"lXlXlXlXlXlXlXlXjXlXlXlXlXjXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXjXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXdXA.# . . . . . . . . . # A.dXjXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXzXfXzXlXlXlXlXlXlXlXlXzXzXfXzXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXjXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXlXjXlXlXlXlXlXlXlX",
"lXlXlXjXlXlXjXjXlXlXlXjXlXjXlXlXlXjXlXlXjXlXlXjXlXlXlXjXlXlXjXjXjXjXlXlXjXlXlXlXlXlXjXlXjXlXlXlXlXlXlXjXlXlXjXlXlXlXlXlXlXlXjXjXlXlXjXlXjXlXlXlXlXlXlXjXlXlXjXlXlXlXlXlXlXjXlXlXlXlXjXlXlXjXlXlXlXlXlXjXlXjXlXlXjXjXlXlXlXlXjXjXlXlXlXjXjXlXlXlXlXjXlXlXjXlXlXlXlXlXlXjXlXlXjXjXjXlXiXT . . . . . . + T iXjXlXlXjXlXlXjXlXlXlXjXlXlXlXlXlXlXjXzXlXfXfXfXlXlXlXjXlXlXfXlXlXfXzXfXlXlXzXlXlXjXlXlXjXlXlXlXlXfXlXlXlXlXlXjXlXlXjXlXlXlXjXlXjXlXjXjXlXlXlXlXjXjXlXlXlXlXjXlXlXlXlXlXlXlXjXlXjXlXlXlXjXlXlXlXlXlXjXlXjXjXlXlXjXlXjXjXlXlXlXlXlXlXjXlXlXjXjXlXjXjXlXlXlXjXlXlXjXlXjXlXlXlXjXlXjXlXlX",
"lXjXlXlXjXlXlXlXlXjXlXlXlXjXlXjXlXlXlXjXlXlXjXlXlXjXlXlXjXlXlXlXlXlXlXjXlXlXjXlXjXlXlXjXlXlXjXlXlXjXjXlXjXlXlXjXlXlXjXlXlXjXlXlXjXlXjXlXlXlXjXlXlXjXlXlXjXlXlXjXlXlXlXjXlXjXlXjXjXlXjXlXlXjXlXjXlXjXlXlXlXjXlXjXlXlXlXjXjXlXlXlXlXjXjXlXlXlXjXlXlXlXlXjXlXlXjXlXlXjXjXlXjXlXlXlXlXjXjXlXiXT . . . . . . . . . . . + R iXjXlXlXlXjXlXjXlXjXlXjXlXlXlXjXlXlXjXlXlXfXzXzXlXzXzXfXlXjXlXlXlXlXlXlXlXzXzXfXfXjXlXjXlXjXlXlXjXjXlXlXlXlXlXjXlXjXlXlXlXjXjXlXlXlXlXlXlXlXlXjXlXlXlXlXlXjXlXlXlXlXjXjXlXjXjXlXlXlXlXlXjXlXlXlXjXjXjXlXlXlXlXlXlXlXlXlXlXlXlXjXjXlXjXlXlXjXlXlXlXlXlXlXlXlXlXlXlXlXlXlXjXjXjXlXlXlXlXlXjX",
"jXlXjXlXjXlXjXlXlXjXjXjXlXlXjXjXlXjXjXjXlXjXlXjXlXjXjXjXjXlXjXlXjXlXjXlXlXjXlXlXjXlXjXlXlXjXjXlXjXlXlXjXjXlXjXlXjXlXlXjXjXlXjXlXlXjXlXjXlXjXlXlXjXlXjXjXjXlXjXjXjXlXjXlXjXlXjXlXlXjXlXjXlXlXjXlXjXlXjXjXlXlXjXlXjXlXjXlXjXlXlXjXjXlXlXjXlXjXjXlXjXlXjXlXlXjXjXlXjXlXlXjXjXlXjXlXjXlXlXjXlXjXwXI . . . . . . O I uXjXlXlXjXjXjXlXjXlXlXlXjXlXlXjXlXlXjXlXjXjXjXzXfXlXlXfXlXfXlXlXlXfXlXfXlXlXzXfXlXlXlXlXlXlXjXjXlXjXlXlXjXlXlXjXlXjXlXjXjXlXjXjXlXjXlXjXlXjXjXlXjXjXlXjXjXlXjXlXjXlXjXjXlXjXlXjXlXjXlXjXlXjXlXlXjXlXjXlXjXjXlXjXlXjXjXjXlXjXjXjXlXlXlXlXjXjXjXlXjXlXjXjXjXlXjXjXjXlXjXjXjXlXlXlXjXjXlXjXlXjXlX",
"jXjXjXjXjXlXjXjXjXjXlXjXjXjXjXjXjXjXlXjXjXjXjXjXjXjXlXjXjXlXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXlXjXjXjXjXjXjXlXjXjXjXjXlXjXjXjXjXjXjXjXjXjXjXjXlXjXjXjXjXjXjXlXjXjXjXjXlXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXlXjXjXjXjXjXjXjXjXlXzXjXwXI . . . . . . . . . . . . I wXlXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXlXfXjXjXjXlXjXjXfXlXfXfXzXfXlXlXfXlXlXfXlXfXfXfXzXfXfXlXfXjXlXfXjXlXjXjXjXjXfXjXjXjXjXjXjXlXjXjXjXjXlXjXjXjXlXjXjXjXjXjXlXjXjXjXjXjXjXjXjXjXjXjXjXjXlXjXjXjXjXjXjXjXjXlXjXjXjXjXjXjXjXlXjXjXjXlXjXjXjXjXjXjXlXjXjXjXjXjXlXjXjXjXjXlXjXjXjXjXjXjXjXjXlXjXjXjXjXjX",
"jXjXjXjXjXjXjXjXjXjXjXjXfXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXfXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXfXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXfXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXfXjXjXjXjXjXjXjXjXjXjXjXjXjXjX5XM . . . . . A 5XjXjXjXjXjXfXjXjXjXjXjXfXjXjXjXjXjXjXfXfXfXlXjXjXjXjXjXfXlXfXfXlXfXfXfXzXzXfXfXzXlXfXfXfXfXfXzXfXzXfXlXfXfXlXfXlXjXjXlXfXfXlXlXfXlXfXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjX",
"jXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXfXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXfXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjX4XM . . . . . . . . . . . M 5XjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXfXjXjXlXlXfXjXjXjXjXfXlXlXfXjXjXlXfXfXfXfXfXfXfXfXlXfXlXlXfXfXfXzXfXfXlXlXfXlXfXjXjXfXlXfXlXfXlXfXfXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjX",
"jXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXfXjXjXjXjXjXjXjXfXjXjXjXfXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXfXjXjXjXjXjXjXjXfXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXfXjXfXjXjXjXjXjXjXjXjXjXfXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXfXjXjXjXjXjXjXfXjXjXjXjXjXjXjX2Xv . . . . . . n 2XjXjXjXjXfXjXjXjXfXjXjXjXjXjXjXjXjXjXjXjXjXjXfXlXfXfXjXjXjXjXfXlXfXlXjXjXjXfXfXzXfXlXzXfXfXfXfXfXlXlXfXfXfXfXlXfXlXfXjXjXjXjXlXjXfXfXfXlXfXlXfXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXfXjXjXjXjXjXjXjXjXjXjXjXjXjXjXfXjXjXjXjXjXjXjXjXfXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXjXfXjXfXjXjXjXjXjXjXfXjXjXjXjXjXjXjXjX",
"jXfXfXjXfXjXfXfXfXjXfXjXfXjXfXjXfXjXfXjXjXfXjXfXfXjXfXjXfXjXjXfXjXjXjXfXfXfXjXfXjXsXjXjXfXjXsXjXjXjXfXjXfXjXfXfXjXfXfXjXfXfXfXjXfXjXjXfXfXfXjXfXjXfXjXjXjXfXfXjXjXfXjXfXfXjXjXfXfXjXfXjXfXfXjXfXjXjXfXjXjXfXjXfXjXfXjXjXjXfXfXjXjXjXfXjXfXjXfXjXjXfXfXjXfXfXjXfXjXjXfXjXfXjXfXjXjXfXfXjXfXjXjXfXjXjXfXjXjXjXjXjX2Xv . . . . . v 2XjXjXjXjXfXjXfXjXjXfXjXjXfXjXfXjXjXfXjXfXjXfXjXjXfXfXfXlXfXjXfXjXfXfXfXfXjXjXfXlXfXfXlXfXfXfXlXfXlXfXfXfXfXzXfXfXfXfXfXfXjXfXfXjXfXjXlXfXfXfXlXfXjXjXfXjXfXjXfXjXfXfXjXfXjXfXfXjXjXfXfXjXfXjXfXjXjXfXfXjXfXjXfXfXfXjXfXjXjXfXjXfXfXfXfXjXfXjXjXfXjXjXjXsXfXjXfXfXfXfXjXfXjXfXjXjXfXjXjXfXjXfXjXjXjXfXfXjXfXfXjXfX",
"fXfXfXfXfXjXfXfXfXjXfXjXjXfXfXfXfXfXfXfXfXjXfXfXfXfXjXfXfXfXfXfXfXfXfXfXfXfXfXjXjXfXfXjXjXfXfXfXfXfXfXjXfXfXjXfXjXfXfXfXfXjXfXjXjXfXjXfXfXfXfXjXjXfXfXfXfXjXjXfXjXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXjXfXjXfXfXfXfXfXfXfXfXjXjXfXfXfXjXfXfXfXfXfXfXfXfXfXfXjXfXjXfXfXjXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXjXfX*Xw . . . . . . . 0 *XsXfXfXjXjXfXfXfXfXjXfXfXjXjXjXfXfXfXfXfXfXfXjXfXfXfXfXfXfXfXfXfXfXfXfXjXfXfXjXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXjXfXfXfXfXjXfXfXfXjXfXfXfXfXjXfXfXfXfXfXfXfXfXfXfXjXfXfXfXjXfXfXfXjXjXfXfXfXfXjXfXjXfXjXsXjXfXfXjXfXfXjXfXjXfXjXfXfXjXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX",
"fXjXfXfXfXfXjXfXfXfXfXfXfXfXjXfXjXjXfXfXfXfXjXfXfXfXfXfXjXfXjXfXjXfXjXfXjXfXfXfXfXjXjXsXfXfXjXjXfXjXfXfXjXfXfXfXfXfXfXjXfXfXfXfXfXfXfXfXjXfXfXfXfXfXfXjXfXfXfXfXfXfXjXfXfXjXfXjXfXfXfXjXfXsXfXfXfXjXfXfXfXfXjXfXfXfXfXjXfXjXfXfXfXfXfXfXjXfXfXfXjXfXjXfXfXjXfXfXfXfXfXfXjXfXfXfXfXfXjXfXjXjXfXfXfXjXfXfXfXjXfXjXfXfXsXfX[.7 . . . . . . 8 [.fXfXfXfXfXfXfXfXjXfXfXfXfXfXfXfXfXfXjXfXfXjXfXjXfXfXjXfXjXfXfXfXfXjXfXfXfXfXfXfXfXfXfXfXfXfXfXlXfXfXfXfXlXfXfXfXlXfXfXfXfXfXjXfXjXfXjXfXfXjXfXjXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXjXfXfXfXfXfXfXfXjXfXfXfXjXfXfXfXfXjXfXfXfXfXfXfXfXjXfXjXjXfXfXfXjXfXfXfXjXjXfXfXfXfXjXfXjXfXfXjXfXjXfXjXfXfXjXfXjX",
"fXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXsXjXfXfXfXfXfXfXfXjXfXfXjXfXfXfXfXfXjXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXdX[.2 . . . . . . . . . . . 3 G.fXjXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXsXjXfXsXfXfXfXfXfXjXfXfXfXfXfXjXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfX",
"fXfXfXfXfXsXfXfXfXsXfXfXfXfXfXsXfXfXfXfXsXfXfXfXfXfXfXsXfXfXfXfXfXfXfXsXfXfXfXfXfXsXfXfXfXsXfXsXfXfXfXfXsXsXfXfXsXfXfXfXsXfXsXjXfXfXfXsXfXfXfXfXsXfXfXfXfXfXsXfXfXfXfXsXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXsXfXfXfXfXsXfXfXfXfXfXfXfXfXsXfXfXfXfXfXsXfXfXfXfXfXfXfXfXfXsXfXfXfXfXfXfXfXfXfXsXfXfXfXfXfXfXfXsXfXfXfXfXsXfXfXfXsXfXsXS.: . . . . . : S.sXfXfXfXfXsXfXfXfXfXsXfXfXfXfXfXfXfXsXfXfXfXfXsXfXfXfXfXsXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXsXfXfXfXfXsXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXfXsXfXfXfXfXsXfXfXfXfXfXfXfXsXfXfXsXsXjXsXjXsXfXsXfXsXfXsXfXfXsXsXfXfXfXfXfXfXsXfXfXfXfXsXfXfXfX",
"fXfXsXfXsXfXfXfXsXfXsXfXsXsXfXsXfXfXsXfXfXsXfXsXfXfXfXsXfXsXfXfXsXsXfXsXfXsXfXfXfXsXfXsXfXfXfXsXfXsXfXfXsXfXfXsXfXjXsXsXsXfXsXsXsXsXfXsXsXfXsXsXfXsXfXfXsXsXfXsXfXsXfXfXfXsXfXsXfXfXsXfXfXsXfXfXfXfXsXfXfXsXfXfXfXsXfXsXfXfXsXfXsXfXfXfXsXfXfXsXfXfXsXfXfXsXfXfXfXfXsXfXfXsXfXfXsXfXfXsXfXsXfXsXfXfXsXsXfXfXsXfXsXfXsXfXsXfXsXfXfXsXS.% . . . . . . . X % S.sXsXfXfXfXsXfXfXfXsXfXsXfXfXsXfXsXfXfXsXfXsXfXsXfXsXfXfXsXsXfXsXfXsXfXsXsXfXsXfXfXfXsXfXfXfXfXsXsXfXfXfXsXfXfXsXfXfXsXfXfXsXfXfXfXsXfXfXsXsXfXfXsXfXsXfXsXfXfXfXsXsXsXfXfXfXsXfXfXfXfXfXfXfXsXfXsXfXfXfXfXfXsXfXfXsXfXsXfXjXsXsXfXsXfXfXsXfXsXfXsXfXsXfXsXsXfXsXfXfXsXfXsXfXfXsXfXsXfXsXsXfXfXsXsXsXfXfXfXsXfXfXsXfXsXfXfXsXfXfXsXfX",
"sXsXsXsXsXsXsXsXsXsXfXsXsXfXfXsXsXsXsXsXfXsXsXfXsXsXsXfXsXsXsXsXsXfXsXfXfXsXsXsXfXsXsXfXsXsXsXfXfXsXsXsXsXsXsXfXsXsXsXsXfXsXsXfXsXfXsXfXfXsXsXfXfXsXsXfXsXfXsXfXsXsXsXsXfXsXsXfXsXsXsXsXfXsXsXsXsXsXsXsXfXsXsXsXfXsXsXsXsXsXsXsXfXsXsXsXsXsXsXfXsXsXsXsXsXfXsXsXsXsXsXsXsXsXsXsXsXsXsXfXsXfXsXfXsXsXsXfXsXsXfXsXfXsXsXsXfXsXfXsXfXsXsXpXm.+ . . . . . # n.pXfXsXsXsXsXsXfXsXsXfXsXsXfXsXsXsXsXfXsXfXsXsXfXsXfXsXfXsXsXsXfXsXfXsXfXsXfXsXfXfXsXsXsXfXsXsXsXsXfXsXsXsXsXsXsXsXsXsXsXsXsXsXfXsXsXfXsXsXsXsXfXsXsXfXsXfXsXsXsXsXsXsXfXfXsXsXsXsXsXsXsXsXsXsXsXsXsXfXsXfXsXsXsXsXsXsXsXsXsXsXsXsXsXsXfXsXsXfXsXfXsXsXsXfXsXsXfXfXsXsXsXsXsXfXsXsXfXsXsXsXfXsXsXsXfXsXsXsXsXfXsXsXsXfXsXsXsXfXsXsXsXfXsX",
"fXsXfXsXsXsXsXsXfXsXfXsXsXfXsXsXsXsXsXsXsXsXfXsXsXsXsXfXsXsXsXsXfXsXsXfXsXsXsXsXsXsXfXsXfXsXsXfXsXsXsXsXfXsXsXsXsXfXfXsXsXsXsXsXfXsXsXfXsXsXfXsXsXfXsXsXsXsXsXfXsXsXsXsXsXsXfXsXsXsXsXfXfXsXsXfXsXsXsXfXsXsXsXsXsXsXsXfXsXfXfXsXsXsXsXsXfXsXfXsXsXsXsXfXsXsXsXsXfXsXsXfXsXfXfXsXsXfXsXsXfXsXsXfXsXsXsXsXsXfXsXfXsXfXsXsXsXsXsXsXsXsXfXsXsXiXm.& . . . . . & A.pXfXfXsXsXsXsXsXfXsXsXsXsXsXfXsXsXsXsXfXsXsXsXfXsXsXfXsXsXfXsXfXsXsXsXfXsXsXsXfXsXsXsXsXsXsXsXsXfXsXsXfXsXsXfXsXsXsXsXfXfXsXsXfXsXsXfXsXsXsXsXsXsXsXsXfXsXfXsXfXfXsXsXfXsXsXsXsXsXsXsXfXsXsXsXsXsXsXsXfXsXsXsXsXsXfXsXsXfXsXsXsXsXsXjXsXsXsXsXfXsXfXsXfXfXsXfXsXsXsXsXsXfXsXsXfXfXsXsXsXsXsXsXfXfXsXsXsXsXsXsXfXsXsXsXfXsXsXfXsXfXsXsXfXsXsX",
"sXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXfXfXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXfXsXsXwXT . . . . . . . X T wXsXsXsXsXsXsXsXsXsXsXsXsXfXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXfXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXfXsXsXsXsXsXsXsXsXsXsXfXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsX",
"sXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXfXwXT + . . . . . . X T wXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXfXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXaXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsX",
"sXsXsXaXsXsXsXsXsXsXaXsXsXsXsXsXsXsXaXsXsXaXsXsXsXsXaXsXsXsXsXsXaXsXsXsXsXaXsXsXsXsXsXsXaXsXsXsXaXsXsXsXsXsXsXsXsXsXsXsXsXaXsXaXsXsXsXsXsXaXsXsXaXsXsXsXsXsXsXsXsXsXsXsXaXsXsXsXsXsXsXsXaXsXsXsXsXsXsXsXsXaXsXsXsXsXaXsXsXsXsXsXsXaXsXsXsXsXsXaXsXsXsXsXaXsXsXsXsXsXsXsXsXaXsXsXsXsXaXsXsXsXaXsXsXsXsXsXsXsXaXsXsXsXsXsXsXsXsXsXsXsXaXsXsXsXaXsXsXaXsX5XI . . . . . X I 5XaXsXsXsXsXsXsXaXsXsXsXaXsXsXsXsXsXsXsXaXsXsXsXaXsXsXsXsXsXsXaXaXsXsXsXsXsXaXsXsXsXaXsXsXaXsXsXsXsXsXaXsXsXsXaXsXaXsXsXsXsXsXsXsXaXsXaXsXsXsXaXsXsXaXsXsXaXsXsXaXsXsXsXsXsXsXsXsXsXsXaXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXaXsXsXsXsXsXaXsXsXaXsXsXsXsXsXsXsXsXsXaXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXaXsXsXsXaXsXaXsXsXsXsXaXsX",
"sXsXaXsXaXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXaXsXsXaXsXsXaXsXsXsXsXsXaXsXsXsXsXsXsXsXsXaXsXsXsXsXsXsXsXsXsXsXsXaXsXaXsXsXaXsXaXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXaXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXaXsXsXsXsXsXsXsXaXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXaXsXsXsXsXsXsXsXsXaXsX5XI O . . . . . . . . . I 5XsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXaXsXaXsXsXsXsXsXsXsXsXsXaXsXsXsXsXsXsXaXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXaXsXsXsXsXsXsXsXsXsXsXsXsXsXaXsXsXsXsXaXsXaXsXaXsXsXsXaXsXsXsXsXsXsXsXsXaXsXsXsXaXsXaXaXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXsXaXsXsXsXsXsXsXsXaXsXsXsXsXsXsXsXsXsXsXsXsXsXaXsXsXsXsXsXsXaXsXaXsXsXsXsXsXsXsXsXsX",
"sXsXsXsXsXsXaXsXsXaXsXaXsXaXsXsXsXaXsXsXaXsXaXsXsXsXaXsXaXsXaXsXsXsXaXsXsXaXsXaXsXsXaXsXsXsXsXsXsXaXsXaXsXsXaXsXsXsXaXsXsXsXsXsXaXsXsXaXsXaXsXaXaXsXsXsXsXsXsXsXsXsXaXsXaXsXaXsXaXsXsXaXsXaXsXaXsXsXsXaXsXaXsXaXsXaXsXaXsXsXaXsXsXaXsXaXsXsXsXsXsXsXsXaXsXaXsXaXsXaXsXaXsXaXsXaXsXsXsXaXsXaXsXsXsXsXaXsXsXaXsXsXaXsXaXsXaXsXaXsXsXsXsXsXaXsXaXsXsXaXsXsXaXsXsX3XA . . . . . M 3XsXaXsXsXaXsXaXsXsXaXsXsXaXsXsXsXaXaXsXaXsXsXaXsXsXaXsXaXsXsXsXsXsXsXsXaXsXsXaXaXsXsXsXsXaXsXsXsXaXsXsXsXaXsXsXaXsXaXsXsXsXaXsXsXaXsXaXsXaXsXsXsXsXsXaXsXaXsXsXsXsXaXsXaXsXsXsXsXaXsXaXsXsXsXsXsXsXsXaXsXsXaXsXaXsXsXaXsXsXaXsXsXsXsXsXsXsXsXaXsXsXaXsXsXaXsXaXsXaXaXsXsXaXsXsXaXsXaXsXsXaXsXsXsXsXaXsXsXaXsXaXsXsXaXsXsXsXaXsXsXaXsXsXsXsXsXsXsXaXsXaXsXaXsXsX",
"sXaXsXaXsXaXsXaXaXsXaXsXaXsXsXaXaXsXaXsXsXaXaXsXsXaXsXaXsXaXsXaXsXsXsXsXaXsXaXsXaXsXsXaXsXaXsXaXsXsXaXsXaXsXsXsXaXsXaXsXsXaXsXaXaXsXaXsXaXsXaXsXsXaXsXaXsXsXsXaXsXaXsXsXaXsXaXsXsXaXsXaXsXaXsXaXaXsXaXsXsXaXsXaXaXsXsXsXaXsXaXsXaXsXsXsXsXaXsXaXsXaXsXaXsXsXsXsXsXsXaXsXaXsXaXsXaXsXsXaXsXaXsXaXsXaXsXaXsXaXsXaXsXaXsXaXaXsXaXsXsXsXsXsXaXsXaXsXaXsXaXsXsXsXsXaXsX2XM . . . . . M 2XaXsXaXsXaXsXaXsXaXsXsXaXsXaXsXsXaXsXsXsXaXsXaXsXsXsXsXsXaXaXsXsXsXaXsXaXsXaXsXsXsXsXaXsXaXsXaXsXaXaXsXaXsXsXsXaXsXaXsXaXsXaXsXaXsXsXsXsXsXsXsXsXsXaXsXaXsXaXsXsXaXsXsXaXsXaXsXaXsXsXaXsXaXaXsXaXsXaXsXaXsXsXsXsXaXsXaXsXaXsXaXsXaXaXaXsXsXaXsXaXsXsXsXsXaXsXsXaXsXaXsXaXsXsXsXaXsXaXsXaXsXaXsXsXsXaXsXsXaXsXaXsXaXsXaXsXsXaXsXaXsXsXaXsXaXaXsXsXaXaXsXaXsXaXsXaXsX",
"aXsXaXsXaXsXaXsXsXaXsXaXsXaXsXaXsXaXsXaXsXaXsXaXaXsXaXsXaXsXaXsXaXaXaXaXsXaXsXaXaXaXaXsXaXsXaXsXaXaXsXaXaXaXaXaXsXaXsXsXaXsXaXsXsXaXsXaXsXaXsXaXaXsXsXaXaXaXaXsXaXsXaXsXaXaXsXaXaXsXaXsXaXsXaXsXsXaXsXsXaXsXaXsXsXaXaXsXaXsXaXaXsXaXaXaXaXsXaXsXaXsXaXsXaXaXaXaXaXaXsXaXsXsXaXsXaXaXaXsXaXsXaXsXaXsXaXsXaXsXsXaXaXsXaXsXaXsXaXsXaXaXaXaXsXaXsXsXsXaXsXaXaXaXaXsXaXsXsX{.v . . . . . . . . v {.sXsXsXaXsXaXsXaXsXaXsXaXaXsXaXsXaXsXaXaXaXsXaXsXaXaXaXaXaXaXsXsXaXaXaXaXsXaXaXsXaXaXaXaXsXaXsXsXaXaXsXsXaXsXaXaXaXsXaXsXaXsXaXsXaXsXaXaXaXaXaXaXaXaXaXaXaXsXaXsXaXsXaXaXsXsXaXsXaXsXaXaXsXaXsXaXsXaXsXsXaXsXaXaXaXaXsXsXaXaXsXaXsXaXsXaXsXaXaXsXaXsXaXaXaXaXsXaXaXsXaXsXaXsXaXaXaXsXaXsXaXsXaXsXaXaXaXaXaXaXsXaXsXaXsXaXsXaXsXsXaXsXaXaXsXaXsXaXsXaXsXsXaXsXaXsXaXsXaX",
"aXsXsXaXsXaXsXaXaXsXsXsXsXaXaXsXaXsXsXaXaXaXsXsXsXaXsXaXsXaXsXaXaXsXaXsXaXsXaXsXsXsXaXaXsXaXsXaXaXsXsXaXsXsXaXsXaXaXsXaXsXaXsXaXaXaXaXsXaXsXaXsXaXaXsXsXaXsXsXaXsXaXaXsXsXsXaXsXsXaXsXaXsXaXsXaXaXsXsXaXsXaXsXaXaXsXaXaXaXsXsXaXaXsXsXaXaXsXaXaXsXaXsXaXaXsXaXsXaXsXaXsXaXaXsXaXsXsXaXaXsXaXsXaXsXaXaXsXsXsXaXsXsXaXsXaXsXaXaXaXaXsXaXsXaXsXsXaXaXaXsXsXsXaXsXaXsXaXaXsXsX{.r . . . r {.sXsXsXsXaXsXsXaXaXsXaXsXaXaXsXsXaXaXaXsXsXaXsXaXsXsXaXaXsXsXaXsXaXaXsXaXsXaXsXsXaXaXsXsXaXaXsXsXaXsXaXaXsXaXaXsXsXaXsXaXsXaXsXaXsXaXaXsXsXaXsXaXsXaXsXsXaXsXsXsXsXsXaXaXsXsXaXsXaXaXaXsXsXsXaXsXaXsXaXsXaXaXaXsXsXsXaXaXsXaXsXaXsXsXsXaXaXaXsXsXaXaXsXsXaXsXaXsXaXaXsXsXaXsXaXaXsXsXsXsXaXaXsXaXsXaXsXaXsXsXsXaXaXsXaXsXaXsXaXaXaXaXaXsXsXsXaXsXaXsXaXsXaXaXaXsXsXsXaXaXsX",
"aXaXaXaXsXaXaXaXaXaXaXaXaXsXaXaXsXaXaXsXaXsXaXaXsXaXaXaXsXaXaXaXaXaXaXsXaXaXsXaXaXaXaXsXaXaXsXaXsXaXaXsXaXaXsXaXaXsXaXaXsXaXaXsXaXsXsXaXaXaXsXaXsXaXaXaXaXaXsXaXaXaXsXaXaXaXsXaXsXaXaXaXsXaXaXsXaXaXaXaXsXaXaXaXaXaXsXaXaXaXsXaXsXaXaXsXsXaXaXsXsXaXaXsXaXaXsXaXaXaXsXaXaXsXaXaXaXaXaXsXaXaXsXaXaXaXsXaXaXaXaXaXsXaXaXaXsXaXsXaXaXaXsXaXaXaXaXaXaXsXaXaXaXsXaXaXaXaXsXaXaXsXaX[.w . . . . w [.aXsXaXaXsXaXsXaXaXaXsXaXaXsXaXsXaXaXsXaXsXaXaXsXaXaXaXaXsXaXaXaXaXsXaXsXaXaXsXaXaXsXaXsXaXaXsXaXaXsXaXaXsXaXaXaXsXaXaXsXaXaXaXaXsXaXaXaXsXaXaXaXaXaXsXaXaXaXsXaXaXaXaXaXsXaXaXaXaXaXsXaXsXaXaXsXaXaXaXaXsXaXaXaXsXaXaXaXsXaXaXaXsXaXaXaXaXaXsXaXaXsXaXsXaXaXsXaXsXaXaXsXaXaXsXaXsXaXaXaXaXaXsXaXaXaXaXaXsXaXaXaXaXaXsXaXaXsXaXaXaXsXsXaXsXaXaXsXaXaXaXaXsXaXsXaXsXaXaXaXsXaXaX",
"aXsXaXaXaXaXaXsXaXaXsXaXaXaXaXsXsXaXaXaXaXsXaXaXaXaXaXaXaXaXaXsXaXsXaXaXaXaXsXaXaXaXaXsXaXaXsXaXaXaXaXaXaXaXsXaXaXaXaXsXaXaXaXaXaXaXaXsXaXaXsXaXaXaXaXsXaXaXsXaXaXsXaXaXsXaXaXaXaXaXaXaXsXaXaXaXaXaXsXaXaXaXaXsXaXaXaXsXaXsXaXaXsXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXsXaXaXsXaXaXaXsXaXaXsXaXaXaXsXaXaXaXaXaXaXaXaXsXaXsXaXaXaXaXaXaXsXaXaXaXsXaXaXsXaXaXaXsXaXaXaXaXaXpX[.8 . . . . 8 [.aXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXsXaXaXaXsXaXaXaXaXaXaXsXaXaXaXaXaXaXaXsXaXaXaXaXaXaXsXaXaXsXsXaXaXaXaXaXaXaXaXaXaXsXaXaXaXsXaXsXaXaXsXaXaXaXaXaXsXaXaXaXaXsXaXsXaXaXaXsXaXaXaXaXaXaXaXaXaXsXaXaXaXsXaXaXsXaXaXaXaXsXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXsXaXaXaXaXsXaXaXaXaXaXsXaXaXsXaXaXsXaXaXaXsXaXaXaXaXsXsXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXsX",
"aXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXsXaXpXG.2 X . . 2 G.aXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaX",
"aXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXpXm.% X . . . . . . 2 S.pXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXaXaX",
"aXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXS.: . . . . . . : S.yXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXsXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaX",
"aXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXyXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXyXaXaXaXaXaXaXaXaXaXaXaXaXaXaXyXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXyXaXaXaXaXaXaXaXaXaXaXaXaXaXaXyXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXyXaXaXaXyXaXaXaXaXyXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXyXaXaXaXaXyXaXaXaXeXn.# . . & n.wXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXyXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXyXaXaXaXaXaXaXaXaXaXaXyXaXaXaXyXaXaXaXaXaXaXaXaXaXaXaXaXaXyXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXyXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXyXaXaXaX",
"aXaXaXaXyXaXaXaXyXaXaXaXaXyXaXaXaXaXyXaXaXaXaXyXaXaXaXyXaXaXaXyXaXyXaXaXaXyXaXaXaXaXaXyXaXaXaXyXaXaXaXyXaXaXaXaXaXaXaXyXaXaXaXaXaXaXyXaXaXaXaXyXaXaXaXaXaXyXaXaXyXaXyXaXaXyXaXaXaXaXyXaXaXaXaXyXaXaXyXaXyXaXaXaXyXaXyXaXaXyXaXyXaXaXaXyXaXaXaXyXaXaXyXaXaXyXaXaXaXaXaXaXyXaXyXaXaXaXyXaXaXaXaXyXaXaXaXaXaXaXaXaXaXyXaXaXaXaXaXyXaXaXyXaXyXaXaXaXyXaXaXyXaXaXaXyXaXaXaXyXaXaXaXaXaXyXaXaXaXaXyXaXaXaXeXn.+ . . . . . + n.eXaXaXaXaXyXaXyXaXaXaXyXaXaXaXyXaXaXaXaXyXaXaXaXaXaXyXaXaXyXaXyXaXaXaXaXaXyXaXaXaXyXaXaXaXyXaXaXyXaXaXaXyXaXaXyXaXaXaXyXaXaXaXyXaXaXyXaXaXaXyXaXaXaXyXaXaXaXyXaXaXaXaXaXaXyXaXaXaXaXyXaXaXaXaXaXaXaXaXaXyXaXaXyXaXaXaXaXyXaXaXaXaXaXyXyXaXaXaXaXyXaXaXyXaXyXaXaXaXaXaXaXaXyXaXaXyXaXaXaXaXyXaXaXyXaXaXyXaXaXyXaXaXyXaXaXaXyXaXyXaXaXaXaXaXaXaXyXaXyXaXaXaXyXaXyXaXaXaXyXaXaXaXyXaXaXaXaXyXaXaXaXaXaXyX",
"aXaXaXaXaXaXyXaXaXaXyXaXaXaXaXaXaXaXaXaXaXyXaXaXaXaXaXaXaXyXaXaXaXaXaXaXaXaXaXaXyXaXaXaXaXyXaXaXyXaXyXaXaXaXaXyXaXyXaXaXyXaXyXyXaXaXaXaXyXaXaXaXaXaXyXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXyXaXaXaXaXyXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXyXaXaXaXaXaXaXaXaXaXaXaXaXaXaXyXaXaXaXaXyXaXaXyXaXyXaXaXaXaXyXaXaXyXaXaXaXaXaXaXyXaXaXaXaXaXaXaXaXaXaXyXaXaXaXaXyXaXaXyXaXyXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXyXaXwXU # . . . + T wXaXaXaXaXaXaXyXaXaXaXaXaXaXaXyXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXyXaXaXaXaXaXaXaXyXaXaXaXaXaXaXaXaXaXaXaXaXaXyXaXaXaXyXaXaXaXaXyXaXaXaXaXyXaXaXyXaXyXaXaXaXaXaXaXyXaXaXyXaXyXaXaXaXaXyXaXaXyXaXaXaXaXyXaXaXaXyXaXaXaXaXyXaXaXaXaXaXaXyXaXaXaXaXaXaXaXaXaXaXyXaXaXyXaXaXaXaXyXaXaXyXaXaXaXaXaXaXaXaXaXaXaXyXaXaXaXyXaXaXaXaXaXyXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXaXyXaXaXaXaXaXaXaXaXaXaXaXaXaX",
"aXyXaXyXyXaXyXaXyXaXaXaXyXaXyXaXyXaXyXaXaXaXyXaXyXaXyXaXaXaXaXyXaXyXaXyXyXaXyXaXaXaXaXyXaXaXyXaXaXaXaXaXyXyXaXaXaXyXaXyXaXaXaXaXyXaXyXaXaXaXaXyXyXaXaXaXaXyXaXyXyXaXyXaXaXyXaXaXyXaXyXaXaXaXaXyXaXaXyXaXaXyXaXyXyXaXyXaXaXyXaXyXyXaXyXaXaXaXaXyXyXaXyXaXaXyXyXaXaXyXaXyXaXaXaXyXaXaXyXaXaXaXaXaXaXyXaXaXyXaXaXaXaXyXyXaXaXaXaXyXyXaXyXaXaXyXaXyXaXaXaXyXaXaXyXaXaXaXaXaXaXyXaXyXaXaXyXaXyXaXyXaXaXaXaXaXaXyXwXU . . . . . X T 6XyXaXyXaXyXaXyXaXaXaXaXyXaXyXyXaXyXaXaXyXaXyXyXaXyXaXyXaXaXyXyXaXyXaXaXyXaXyXaXaXaXyXaXyXyXaXaXaXyXaXaXyXyXaXaXyXyXaXaXyXaXaXaXyXaXaXyXaXaXaXaXaXaXyXaXaXyXaXaXaXaXaXaXyXaXyXaXaXyXaXaXaXaXaXaXyXaXaXyXaXaXaXaXyXaXaXaXyXaXaXaXyXyXaXaXaXaXyXaXyXaXaXaXyXyXaXyXaXyXaXyXaXaXaXaXaXaXyXaXyXaXaXaXaXyXaXaXyXyXaXaXyXaXyXaXaXyXaXyXaXyXaXaXyXaXaXaXyXaXyXyXaXyXaXyXaXyXaXaXyXaXyXyXaXyXaXaXyXaXyXyXaXyXaXyXaXaXyX",
"aXyXyXaXaXyXaXyXaXyXaXaXyXaXyXaXaXyXaXyXaXyXaXyXyXaXyXaXyXyXaXaXaXaXyXaXyXaXyXaXaXyXyXaXyXaXaXyXyXaXyXaXaXyXaXyXaXaXyXaXyXaXyXaXyXaXyXaXyXaXyXaXaXyXaXaXyXaXyXaXaXyXaXyXaXyXaXyXyXaXyXaXyXaXyXaXaXyXaXyXyXaXyXaXaXyXaXaXyXaXaXaXyXaXyXaXyXaXyXaXaXyXaXaXyXaXyXaXaXyXaXyXyXaXyXaXaXyXaXyXaXaXaXyXyXaXaXyXaXyXyXaXaXyXaXyXyXyXaXaXaXyXaXyXyXaXyXaXaXyXaXaXyXaXaXyXyXaXyXaXyXaXyXaXaXaXyXyXaXyXaXyXyXaXyXaXyXyXaXyX5XS . . . I 3XaXyXaXyXaXaXyXaXyXaXyXaXyXaXyXaXaXyXyXaXyXaXaXaXaXaXaXaXaXaXaXyXaXyXaXaXyXaXyXaXyXyXaXaXyXaXyXaXyXaXyXaXaXyXaXaXyXaXyXaXaXyXaXyXyXaXaXyXaXaXyXyXaXyXaXyXaXyXaXyXyXaXyXaXyXyXaXaXaXyXaXyXaXyXaXyXyXaXaXaXyXaXyXaXyXaXaXyXaXyXyXaXaXaXaXaXyXaXyXaXyXaXaXaXaXaXaXyXaXyXaXaXyXaXyXaXyXyXaXaXaXyXaXaXyXaXyXaXyXaXaXaXaXaXyXaXaXyXaXaXaXyXaXyXaXyXaXyXaXyXaXyXaXaXaXyXaXyXaXyXaXaXaXaXaXyXaXaXyXaXaXaXaXaXaXaXyXaXyXaX",
"yXaXyXaXyXaXyXaXaXyXyXyXaXyXaXaXaXyXyXaXyXaXyXaXaXyXaXaXyXaXyXyXyXaXyXaXaXyXaXyXaXyXaXyXaXyXyXaXaXaXyXaXyXaXyXaXyXaXyXaXaXyXaXyXaXyXaXyXaXyXaXyXyXaXyXyXaXyXaXyXyXaXyXaXyXaXyXaXaXyXaXyXaXyXyXyXyXaXyXaXaXyXaXyXyXaXyXaXyXyXyXaXaXyXaXyXaXyXaXyXyXaXyXyXaXyXaXaXyXaXyXaXaXyXyXyXaXyXyXaXyXyXyXaXyXyXyXaXyXaXaXyXyXaXyXaXyXaXyXyXyXaXyXaXyXaXyXaXaXyXyXaXyXyXyXaXyXyXaXyXaXyXaXyXyXaXyXaXyXaXyXaXaXyXaXaXyXaXyXaXyXaX6XI . . . . I 6XaXyXyXaXyXaXyXyXaXyXaXyXaXyXyXyXaXyXyXaXaXyXaXyXyXyXyXyXyXyXyXyXaXyXyXaXyXyXaXyXaXyXyXaXyXyXaXyXaXyXyXaXyXyXyXaXyXyXaXyXaXyXyXaXyXaXaXyXaXyXyXaXyXaXaXyXyXaXyXaXyXaXyXaXyXaXyXaXyXyXyXaXyXaXyXaXyXaXyXyXyXyXyXyXaXyXyXyXyXaXyXaXaXyXyXyXyXyXaXyXyXyXaXyXyXyXyXyXyXaXyXaXyXaXaXyXaXyXyXaXyXyXyXaXyXyXyXaXaXyXaXyXyXyXyXyXaXyXyXaXyXyXyXaXyXaXyXaXyXaXyXaXyXaXyXyXyXaXyXaXyXaXyXyXyXyXyXaXyXyXyXyXyXaXyXyXyXyXaXyXaXyX",
"yXaXyXyXyXyXyXaXaXyXaXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXaXyXaXyXyXaXyXyXyXaXyXyXyXyXyXyXaXyXyXyXyXyXyXaXyXyXyXyXyXyXaXyXyXyXaXyXyXaXyXyXyXyXyXyXyXaXyXyXyXyXaXyXyXyXyXyXyXyXyXyXyXyXaXyXaXyXaXyXyXaXyXyXyXyXaXyXyXyXyXaXyXaXyXyXyXyXaXyXyXyXyXyXyXaXyXyXyXyXyXyXaXaXyXyXyXaXyXaXyXaXyXyXyXaXyXyXyXyXyXyXyXaXaXyXaXaXyXyXyXyXaXyXyXaXyXaXyXyXyXyXyXyXyXyXyXyXyXaXyXyXaXyXyXyXyXyXyXyXyXaXyXyXyXyXyXyXyXyXaXyXyXyXyXyXyX3XM . M 3XyXaXyXaXaXyXyXyXaXyXyXyXyXaXyXyXaXyXyXaXyXyXaXaXyXyXaXaXyXyXaXyXyXyXyXyXyXyXyXaXyXyXyXaXyXaXyXaXyXaXyXyXyXyXaXyXyXyXaXyXyXyXyXyXyXyXaXyXaXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXaXyXyXyXyXaXyXaXyXyXyXyXyXaXaXyXaXaXyXaXaXyXaXaXyXyXyXyXyXyXaXaXyXaXaXyXyXyXyXaXaXyXaXyXyXyXyXyXyXyXyXyXyXaXyXyXyXyXaXyXyXyXyXaXaXyXyXyXyXaXyXyXyXaXyXyXaXyXyXyXyXaXyXyXaXyXyXyXyXaXyXyXyXaXyXaXyXyXyXaXyXyXyXaXyXyXaXaXyXyXaXyXyXyXyXaXyXyXyXyX",
"yXyXyXaXyXaXyXyXyXyXyXyXaXyXaXyXyXaXaXyXyXaXyXaXaXyXaXyXyXyXyXyXaXyXyXyXaXyXyXyXyXaXyXaXyXyXyXaXaXyXaXyXyXyXyXaXaXyXyXyXyXaXyXyXyXaXyXyXaXyXaXyXaXyXyXyXyXaXyXaXaXyXaXyXyXaXaXyXyXaXyXaXyXyXyXyXaXyXyXyXaXyXyXaXyXaXaXyXyXyXyXyXaXyXyXyXaXyXaXyXaXyXyXyXaXyXyXaXyXyXyXyXaXaXyXyXyXyXyXyXyXaXyXyXaXyXaXyXaXyXyXyXyXyXyXyXaXaXyXyXaXyXyXyXaXyXaXyXyXaXaXyXaXyXaXyXaXyXyXyXaXaXyXyXyXaXyXaXyXyXaXyXaXyXaXyXyXyXyXaXyXaXyXaXyXyX3XM . . . . M 3XyXyXyXyXyXyXyXyXaXyXyXyXaXyXyXaXyXaXyXyXyXaXaXyXyXyXyXyXyXyXyXaXyXyXaXyXaXyXaXyXyXyXyXaXyXaXyXyXyXyXyXyXaXyXaXyXaXyXaXyXyXyXaXyXaXyXaXyXyXyXyXyXyXaXyXaXyXaXyXaXaXyXyXaXyXaXaXyXaXyXyXyXyXyXyXaXyXaXyXyXyXyXyXyXyXyXyXyXyXyXaXyXaXyXaXyXyXyXyXyXyXyXaXaXyXyXyXyXyXyXyXaXaXyXaXyXaXyXyXyXyXaXaXyXaXyXaXyXyXyXyXyXaXyXyXyXaXaXyXyXyXaXyXyXaXaXyXyXyXaXyXyXaXaXyXyXyXaXyXyXyXyXaXyXyXyXyXaXyXaXaXyXyXyXaXyXyXyXyXaXyXyXaXaXyXyX",
"yXyXyXyXyXyXaXyXyXyXaXyXyXyXaXyXyXyXaXyXyXyXyXyXyXyXyXaXyXyXyXyXyXyXyXyXaXyXyXaXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXaXyXyXyXyXyXaXyXyXaXyXaXyXyXyXyXyXyXyXyXyXyXyXyXaXyXyXyXyXyXyXyXyXyXaXyXyXyXaXaXyXyXyXyXaXyXyXyXaXyXyXaXyXyXyXyXyXyXaXyXyXyXyXyXyXyXaXyXyXyXyXyXaXyXyXyXyXyXaXyXyXyXyXyXyXyXaXyXyXyXyXyXyXyXyXyXaXyXyXyXaXyXyXyXyXyXyXyXyXyXyXyXaXyXyXyXaXyXyXyXyXyXaXyXyXyXyXaXyXyXyXyXyXyXaXyXyXyXaXyXyXyXyXyXyXyXyXyXyXyXyX{.r . . . c {.yXyXyXyXyXaXyXyXyXaXyXyXyXyXyXyXyXyXyXyXyXaXyXyXyXyXaXyXyXyXyXyXyXaXyXyXyXyXyXyXyXyXaXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXaXyXyXyXaXyXyXyXyXyXyXyXaXyXyXyXyXyXyXaXyXyXyXaXyXyXyXyXyXyXaXyXyXyXyXaXyXyXyXaXyXaXyXaXyXyXyXaXyXyXyXyXyXyXyXyXyXyXyXyXaXyXyXaXyXyXyXyXyXyXyXyXaXyXyXyXaXyXyXyXyXyXyXyXyXaXyXyXyXaXyXyXyXyXyXaXyXyXyXaXyXyXyXaXyXyXyXyXyXaXyXyXyXyXyXaXyXyXyXaXyXyXyXaXyXyXyXyXyXyXyXyXyXyXyXaXyXyXyXyXaXyXyXyXaXyX",
"yXaXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXaXyXyXyXyXyXyXyXyXyXyXyXaXyXyXyXyXyXyXyXyXaXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXaXyXyXyXyXyXyXyXyXyXyXyXyXyXaXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXaXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXaXyXyXyXyXyXyXyXaXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXaXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXaXyXyXyXyXyXyXyXyXyXyXyXyXaXyXyXyXaXyXyXyXyXyXyX{.w . . . . w {.yXyXyXaXyXyXyXyXyXyXyXyXyXyXyXaXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXaXyXyXyXyXyXyXyXyXyXyXaXyXyXaXyXyXyXyXyXyXaXyXyXyXyXyXyXyXyXyXyXyXaXyXyXyXyXaXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXaXyXaXyXyXyXyXyXyXyXyXyXyXyXyXyXyXaXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXaXyXyXyXyXyXyXyXyXyXyXyXyXyXyX",
"yXyXyXyXyXyXyXyXyXyXyXyXyXrXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXtXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXtXyXyXyX/.8 . 8 /.yXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXtXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXtXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyX",
"yXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXtXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXG.7 . . . 7 G.yXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXtXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyX",
"yXyXyXtXyXyXyXyXyXyXyXyXyXyXyXyXyXyXtXyXyXyXrXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXrXyXtXyXyXtXyXyXyXyXyXyXyXyXyXrXyXyXyXyXyXyXyXyXyXtXyXyXyXyXyXyXyXyXyXyXyXtXyXyXtXyXyXtXyXyXyXyXyXtXyXyXyXyXtXyXyXyXtXyXyXtXyXyXyXyXyXyXyXyXyXtXyXyXyXtXyXyXyXtXyXyXyXyXyXyXtXyXyXyXyXtXyXyXtXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXtXyXyXyXrXyXyXyXtXyXyXyXyXyXtXyXyXyXyXyXyXyXyXyXyXyXtXyXyXtXyXyXyXtXyXyXyXyXyXtXyXtXyXtXyXyXtXyXyXyXyXyXyXtXyXyXyXyXG.3 . . 2 G.tXyXyXyXtXyXyXyXyXyXtXyXyXyXyXyXtXyXyXyXyXyXyXtXyXyXyXyXyXyXyXyXyXyXyXyXyXtXyXyXyXyXyXyXtXyXyXyXyXtXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXtXyXyXyXtXyXyXyXtXyXyXyXyXyXtXyXyXyXyXyXyXyXyXtXyXtXyXyXyXyXtXyXyXyXyXyXyXyXyXyXtXyXyXyXyXyXyXyXyXyXtXyXyXyXyXtXyXtXyXyXyXyXtXyXyXyXyXyXyXyXyXyXyXyXrXyXyXyXrXyXyXyXrXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXyXrXyXyXyXyXyXyXrXyXyXrXyXyXyXyXyXyXyXyXtXyXtXyXyXyXyXtXyXyXyXyXyXtXyXyXyXtXyXtXyXyXyXyXyXyXyX",
"yXyXyXtXtXtXtXyXyXtXtXyXyXrXyXtXyXyXyXtXyXtXyXyXyXyXrXyXrXyXyXrXyXyXrXyXyXyXrXyXyXyXyXrXyXyXyXyXyXtXyXyXyXrXtXyXyXyXyXyXyXyXyXyXtXtXtXyXyXtXyXyXtXyXtXyXyXrXyXtXtXyXtXyXtXyXyXtXtXyXtXtXtXyXyXtXtXyXtXtXyXyXtXtXyXtXtXyXtXyXtXtXyXtXtXyXtXyXyXtXtXyXtXyXtXyXtXyXyXtXyXtXyXtXyXtXtXyXtXyXyXtXyXtXyXyXyXtXtXyXtXyXtXtXtXyXyXyXyXtXyXtXyXyXrXtXyXyXtXtXyXtXyXyXtXyXyXrXrXyXyXtXtXyXyXtXyXyXyXtXyXyXyXtXtXyXtXyXyXtXtXyXyXtXyXtXtXyXtXyXtXyXtXyXtXtXrXeXZ.3 . . 3 Z.tXyXyXtXyXtXyXtXtXyXtXyXyXtXtXyXtXtXyXyXtXtXyXyXtXyXtXyXrXyXrXyXtXyXyXyXtXyXyXyXtXyXtXyXtXyXyXtXtXyXtXyXtXyXtXtXtXyXtXtXtXyXyXyXyXtXtXyXtXtXtXyXtXyXyXyXtXyXyXtXtXtXyXtXtXyXtXtXtXyXtXyXtXyXyXyXtXyXtXtXyXyXyXyXtXtXtXyXtXtXyXyXtXtXyXtXtXtXyXtXyXrXtXyXtXyXyXtXtXyXtXtXyXyXyXtXtXtXyXyXrXyXrXyXyXyXyXyXyXyXyXtXyXyXrXyXrXyXrXyXyXrXyXyXrXyXrXyXrXyXrXyXyXyXyXyXyXrXyXyXyXyXyXyXyXrXtXyXtXyXtXyXyXtXtXyXyXyXyXtXtXyXtXyXyXtXtXyXyXtXyXyXtXtXyXtXyXrX",
"tXyXtXyXtXtXtXtXrXtXtXtXtXyXrXyXtXtXtXtXtXyXrXyXrXyXyXrXrXyXyXrXyXrXyXyXrXyXyXrXrXyXyXrXyXrXrXyXrXtXyXtXtXyXtXyXrXyXyXrXrXyXyXrXtXtXtXtXtXtXyXtXtXtXtXtXtXrXyXyXtXyXtXyXtXtXtXyXtXyXtXyXtXtXtXtXtXtXtXtXtXtXyXtXyXtXtXtXtXtXtXtXtXtXyXtXtXtXtXtXtXtXtXtXtXtXtXtXtXyXtXyXtXyXtXyXtXtXtXtXtXyXtXyXtXyXtXtXtXtXtXyXtXyXtXtXtXtXtXtXtXyXtXtXyXtXrXyXyXrXrXyXtXtXtXtXtXyXtXyXrXtXyXtXtXtXyXtXtXtXyXtXtXtXtXtXtXtXtXyXtXtXtXyXtXtXtXtXyXtXtXtXyXtXyXtXtXtXtXrXm.% . . . % m.eXtXtXtXtXyXtXyXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXyXyXtXtXtXrXyXyXrXyXrXyXrXyXtXtXyXtXtXtXtXtXtXtXtXtXtXyXtXtXtXtXtXtXyXtXtXtXtXtXtXtXtXtXtXtXtXtXyXyXtXtXtXtXtXtXtXtXyXtXyXyXtXyXtXtXtXtXtXyXtXtXtXtXtXtXtXtXtXtXtXtXyXtXyXtXtXtXtXtXtXyXtXyXtXtXtXtXyXtXtXtXyXtXyXtXyXtXtXtXtXtXtXtXyXtXyXyXrXrXyXyXrXrXyXyXrXrXyXtXyXyXtXyXrXrXyXyXrXrXyXyXrXrXyXyXrXrXyXyXrXrXyXyXrXrXyXrXyXyXrXyXrXyXyXtXtXtXtXtXyXtXyXtXyXtXrXrXyXrXyXtXtXtXtXtXtXtXyXrXyXtXyXyXtXtXtX",
"tXtXtXtXyXtXyXtXyXtXyXtXyXrXyXtXyXtXyXtXyXrXyXtXyXrXyXrXyXyXrXyXrXyXrXrXyXrXyXrXyXyXrXyXyXrXyXyXyXtXtXtXyXrXyXrXyXrXrXyXyXrXrXyXyXtXyXtXtXtXtXtXtXyXtXyXtXyXtXtXtXtXtXtXyXtXtXtXtXtXtXtXyXtXyXtXtXyXtXyXtXtXtXtXtXtXtXyXyXtXtXtXtXtXtXtXtXyXtXyXtXyXtXyXtXyXtXyXtXtXtXtXtXtXtXtXtXyXtXyXtXtXtXtXtXtXtXtXyXtXtXtXtXtXtXyXtXyXtXtXyXrXyXyXrXyXyXtXtXyXtXtXtXtXyXyXyXrXyXrXyXtXrXyXtXtXtXtXtXtXtXtXtXtXyXtXtXyXtXtXtXyXtXtXtXyXtXyXtXtXtXyXtXtXtXtXtXtXtXtXtXqXn.$ . . : m.qXtXtXtXtXtXtXtXtXtXtXyXtXyXyXtXyXtXyXtXtXyXtXtXtXtXtXtXtXyXyXtXtXyXtXyXtXtXtXtXyXrXtXyXtXtXtXyXtXyXtXtXtXtXyXtXyXtXyXrXtXyXtXyXtXyXtXtXyXtXyXtXtXtXtXtXtXyXtXtXyXtXtXtXtXtXtXtXtXtXtXyXtXtXtXtXtXyXtXtXyXtXyXtXyXtXtXtXtXtXtXyXtXyXtXtXtXtXtXtXtXyXtXtXyXyXtXtXtXtXtXtXyXtXyXtXyXtXtXtXtXtXrXyXyXrXyXyXyXyXrXyXyXrXtXyXrXyXyXyXyXyXrXyXrXyXrXyXyXrXyXyXyXyXrXyXyXyXrXyXyXrXyXrXyXyXrXyXrXyXyXtXyXtXtXtXtXtXyXrXtXyXyXtXyXrXyXtXyXtXyXtXtXtXtXtXtXyXrXyXrXyX",
"yXrXrXyXyXrXyXrXtXtXrXyXtXtXyXrXtXtXtXtXyXrXyXtXtXtXyXrXyXyXrXtXyXrXyXrXyXrXyXyXrXrXyXrXrXyXrXrXyXrXyXrXrXyXyXrXrXyXyXrXyXrXrXyXtXtXyXrXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXrXyXrXrXyXrXrXyXrXyXrXyXtXtXtXtXrXyXyXrXyXrXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXyXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXeXn.+ . . # n.eXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXtXyXrXtXtXtXtXtXtXtXtXyXrXtXyXtXtXtXtXtXtXyXrXtXrXyXrXyXtXtXtXtXtXyXrXrXyXrXyXtXtXtXtXtXtXtXtXtXtXtXtXrXyXrXrXyXrXrXyXrXrXyXrXrXyXrXrXyXrXrXyXrXyXyXrXrXyXyXrXtXyXyXrXrXtXtXtXyXrXyXrXyXrXyXyXrXrXyXrX",
"rXrXyXrXrXyXrXyXrXrXyXrXrXtXrXyXrXtXtXtXrXrXrXtXtXrXrXyXrXrXrXtXrXrXrXyXyXrXrXrXrXyXyXrXyXrXrXyXrXyXrXyXyXrXrXyXyXrXrXyXrXyXrXrXrXtXrXyXtXtXtXtXtXrXtXtXrXtXtXtXtXtXtXtXtXtXtXrXtXtXrXtXtXtXrXtXtXtXtXrXtXtXrXtXtXtXrXtXtXtXtXtXtXtXtXtXrXtXtXtXtXtXrXtXtXtXtXrXtXtXrXtXrXtXtXrXtXtXtXtXtXrXtXtXtXtXtXtXrXtXtXtXtXtXtXtXrXtXtXtXyXrXrXyXrXrXyXrXrXrXrXrXtXrXtXrXtXrXrXyXrXyXrXrXtXtXrXtXtXtXrXtXtXtXrXyXtXtXrXtXtXtXrXtXtXtXtXrXtXtXrXtXtXtXrXtXrXtXtXtXtXrXeXrXtX6XU + O U 6XtXrXtXrXyXtXtXtXtXtXrXtXtXtXtXtXtXtXtXtXtXrXtXtXtXtXtXtXrXtXrXtXtXtXrXtXrXtXtXtXtXtXrXtXtXtXtXrXtXtXrXtXtXtXtXrXtXtXtXrXtXtXtXrXtXtXtXrXtXtXrXtXrXtXtXtXtXrXtXrXtXrXtXtXtXrXtXtXtXtXrXtXtXtXrXtXtXtXtXrXtXtXtXrXtXtXtXtXrXtXtXrXtXtXtXtXtXrXtXrXtXtXtXrXtXtXtXtXrXtXtXtXtXrXtXtXtXrXyXtXrXtXrXrXyXtXrXtXrXrXyXyXrXrXrXrXtXrXtXrXyXrXrXrXrXtXtXrXtXrXtXtXtXtXrXtXtXyXrXrXyXyXrXyXrXrXyXyXrXyXrXrXyXrXyXrXrXyXrXrXyXyXrXrXyXrXrXrXyXtXtXtXrXrXrXrXyXyXrXrXrXrXyXyXrX",
"rXyXrXyXrXrXrXrXtXrXyXrXtXrXrXrXrXtXrXtXrXyXrXrXrXrXrXrXyXrXtXrXrXyXrXrXrXyXrXyXrXrXrXrXyXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXyXrXyXtXrXrXrXrXrXtXrXtXrXtXrXtXrXtXrXrXtXrXtXtXrXrXtXrXtXrXtXrXtXtXrXtXrXtXtXrXtXrXtXtXrXtXrXtXrXtXrXrXrXtXrXtXrXtXrXrXtXrXtXrXtXtXtXrXtXrXtXtXtXtXtXrXrXtXrXtXrXtXrXtXrXrXrXrXtXrXtXrXtXrXrXrXtXrXtXyXrXrXrXyXyXrXrXyXrXyXrXtXtXrXtXrXrXrXrXrXtXrXyXrXtXrXtXrXtXrXtXrXrXrXrXrXrXtXrXrXtXrXtXrXtXtXtXtXrXtXrXtXrXtXrXtXtXtXrXrXtXrXtXtXtXrX6XU . . . O U 6XtXtXrXrXrXtXrXrXrXtXrXtXrXtXrXrXrXtXrXrXtXrXtXrXtXrXrXrXtXrXtXrXtXrXtXtXtXrXtXrXrXtXrXrXtXrXtXrXtXtXrXtXrXrXtXrXtXrXtXrXtXrXtXrXtXrXtXtXrXtXrXtXtXrXtXrXtXrXtXrXtXtXrXrXtXtXrXtXrXtXrXrXtXrXtXtXtXrXtXrXtXrXtXtXrXtXrXtXrXtXrXrXtXrXtXtXtXrXrXtXrXtXtXrXtXrXtXrXrXtXrXtXtXrXtXtXrXrXrXrXrXtXrXrXtXrXrXrXrXtXtXrXtXrXrXrXyXrXtXtXrXyXrXrXrXyXrXtXrXtXrXtXtXtXrXrXtXrXtXyXrXyXrXrXyXrXrXyXrXrXrXyXrXrXrXrXrXrXyXrXrXrXrXrXrXrXrXrXyXrXrXrXyXrXtXrXyXrXrXrXyXrXyXrXrXrXrX",
"rXrXrXrXyXrXrXyXrXyXrXrXrXyXrXyXtXrXtXrXrXrXyXrXyXrXyXrXrXrXrXyXrXrXyXyXrXrXrXrXyXrXyXrXrXrXyXrXrXyXrXyXrXrXyXrXrXrXyXrXrXrXrXrXrXyXrXyXrXtXrXtXtXtXtXrXtXtXrXrXtXrXtXrXrXtXtXrXtXrXtXrXtXtXrXtXrXtXrXtXtXrXtXrXtXtXrXtXrXtXrXtXtXtXrXtXrXtXrXtXrXtXtXtXrXtXrXtXtXrXtXtXtXrXrXtXrXtXrXtXrXtXtXtXrXtXrXtXtXrXtXtXrXtXtXtXtXtXrXtXrXrXyXyXrXrXrXyXrXrXyXrXrXtXtXtXrXyXyXrXtXrXtXrXtXrXtXtXrXtXtXrXrXyXrXyXrXtXrXrXrXtXtXtXrXtXrXrXrXtXrXtXtXtXrXrXtXrXrXtXtXrXtXrXrXtXtXtXrX6XS . . S 6XrXrXtXrXtXtXrXrXtXrXtXrXrXtXtXtXrXtXtXrXrXtXrXtXrXtXrXtXrXrXtXtXtXtXtXrXtXrXtXtXtXtXtXrXtXtXrXtXrXtXtXrXrXrXtXtXrXtXrXtXtXtXrXtXrXtXrXtXtXrXtXrXtXrXtXtXtXtXtXtXrXtXrXtXtXtXrXtXtXrXtXrXtXtXrXtXrXrXtXtXrXtXrXtXrXrXtXrXtXrXtXrXtXtXrXtXrXrXtXtXtXrXtXtXrXtXrXtXrXrXtXrXyXrXtXtXrXrXtXrXtXrXyXrXtXtXrXyXrXyXrXrXtXtXtXrXtXtXrXtXrXrXtXrXrXyXyXrXrXtXtXrXrXtXrXrXtXtXrXtXrXrXrXrXrXrXrXrXyXrXrXyXrXrXrXyXrXrXyXrXrXyXrXyXrXyXrXyXrXrXrXrXyXrXrXtXrXrXrXyXrXrXrXrXrXyXrXyXrX",
"rXrXrXyXrXrXrXrXrXrXrXrXrXtXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXyXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXyXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXtXrXrXrXrXrXrXrXrXrXrXtXrXrXrXrXrXrXrXtXrXrXrXrXrXrXrXrXrXrXrXrXrXtXrXrXrXtXrXrXtXrXrXrXtXrXtXrXrXtXrXrXrXrXrXrXrXtXrXrXrXtXrXtXrXrXrXrXrXrXrXtXrXrXrXrXrXrXrXrXrXrXrXrXrXtXrXrXrXrXrXrXrXrXrXrXrXrXrXtXrXrXrXrXrXtXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXtXrXrXrXrXrXtXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXtXrXrXrXrXtXrXrXtX|.S . X o S 3XrXrXrXtXrXrXrXrXrXtXrXrXrXrXrXrXrXtXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXtXrXrXrXrXtXrXrXrXtXrXrXtXrXrXrXrXrXrXrXrXrXrXrXtXrXrXrXrXtXrXrXtXrXrXrXrXrXrXrXrXtXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXtXtXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXtXrXrXtXrXrXtXrXrXtXrXrXrXrXrXrXrXtXrXrXrXrXrXtXrXrXrXrXrXrXrXrXrXtXrXrXrXrXrXrXtXrXrXrXrXtXrXrXrXtXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXyXrXrXrXtXrXrXrXtXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXtXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrX",
"rXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXeXrXtX{.M . M {.rXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrX",
"rXrXrXrXrXrXrXrXrXrXrXrXrXqXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXqXrXrXrXrXqXrXrXrXrXrXrXrXrXrXrXqXrXrXrXrXrXrXrXrXqXrXrXrXrXrXrXrXqXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXqXrXrXrXrXrXtXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXqXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXqXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXqXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXqXrXrXrX{.M . M {.tXrXrXqXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXqXrXrXrXrXrXrXqXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXqXrXrXrXrXrXrXrXrXrXrXqXrXrXrXrXrXrXrXrXrXqXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXqXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXqXrXrXrXrXrXqXrXrXrXrXrXrXrXrXqXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXqXrXrXrXrXqXrXrXrXrXrXrXrXrXrXrXqXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXqXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrXrX",
"qXrXqXrXqXrXqXrXqXrXqXrXrXrXqXrXrXrXrXqXrXrXqXrXrXrXqXrXqXrXrXrXqXrXqXrXqXrXqXrXrXrXrXqXrXrXrXqXqXrXrXrXrXrXqXqXrXqXrXrXrXqXrXrXqXrXrXrXrXqXrXrXqXrXqXrXrXqXrXqXqXrXqXrXqXrXqXrXrXrXrXqXrXrXrXrXqXrXqXrXqXrXrXqXrXqXrXqXrXrXrXqXqXrXqXrX0XrXrX0XrXrXrX0XqXrXqXrXqXqXrXrXrXqXrXrXqXrXqXrXrXqXrXqXqXrXqXrXrXqXrXqXrXrXqXrXqXrXqXrXrXrXqXqXrXrXqXrXqXrXqXrXqXrXqXrXrXqXrXrXqXrXqXrXqXrXrXrXrXqXrXqXrXqXrXrXrXrXqXrXqXrXrXrXqXrXqXrXrXrXrXrXrXqXrXqXqXrXrXqXrXqXrXqXqXrXqXrXrXqXrXrXrXrXqXrXqX/.c . . w {.rXrXrXqXrXrXqXrXqXrXqXqXrXqXrXrXrXqXrXrX0XrXrXrXrXrXqXrXqXrXrXqXrXrXrXqXrXqXrXrXrXqXqXrXqXrXqXrXrXrXqXqXrXrXrXrXrXrXqXqXrXqXrXrXrXrXqXrXrXqXrXqXrXrXqXrXqXrXrXrXqXrXqXqXrXrXrXrXrXqXrXrXrXrXqXrXqXrXqXrXqXrXrXrXrXrXrXqXrXrXqXrXqXrXqXrXrXqXrXqXrXqXrXqXrXrXrXrXqXrXrXrXrXrXqXrXrXrXqXrXqXrXrXrXrXqXrXrXrXrXqXrXqXrXqXqXrXqXrXqXrXqXrXqXrXrXqXrXqXrXrXqXrXqXrXqXrXrXrXrXqXqXrXrXrXqXqXrXqXrXqXrXqXrXrXrXrXrXrXrXqXrXrXrXqXqXrXrXrXrXqXrXrXqXrXqXrXqXrXqXrXrXrXrXrXrXqXqXrXrXrXqXrXqXrXrXrX",
"rXqXrXqXrXqXrXrXrXrXqXrXqXrXrXqXqXrXqXrXrXrXrXrXqXrXrXrXqXrXqXrXrXrXqXrXqXrXrXqXqXrXqXrXrXqXqXrXrXqXqXrXrXrXrXqXqXrXrXrXrXqXqXrXrXqXrXqXrXrXrXqXrXqXrXrXrXqXrXrXqXrXqXrXqXrXqXrX0XrXqXrXrXrXqXrXrXrXqXrXqXrXrXrXrXrXrXrXrXqXrXqXrXqXrXqXrXrXrXqXrXrXqXrXqXrXrXqXrXrXrXrXqXrXqXrXrXqXrXqXrXrXrXrXqXrXqXrXqXrXqXrXrXqXrXqXrXrXrXqXrXqXrXrXrXqXqXrXqXrXqXrXrXqXrXqXqXrXrXqXrXqXrXrXqXrXrXrXrXqXrXrXqXrXrXqXrXqXrXrXqXrXrXrXrXqXrXqXqXrXqXrXqXrXqXrXrXqXqXrXrXrXrXqXrXrXqXrXqXrXrXqXrXrXrXrXrXqX9X{.c w /.rXqXrXqXrXqXrXqXrXqXrXrXqXrXqXrXqXqXrXrXrXrXqXrXrXqXqXrXrXrXrXqXrXqXrXqXrXqXrXrXqXqXrXrXrXrXqXrXrXqXrXqXrXrXqXrXrXrXrXrXqXrXqXrXqXrXrXqXrXqXrXqXrXrXrXrXqXrXrXrXrXrXrXrXqXrXqXrXqXrXrXqXrXqXrXrXqXrXqXrXrXrXrXrXqXrXqXrXrXrXrXrXrXrXqXrXqXrXqXrXqXrXrXrXqXrXrXqXqXrXrXqXrXrXrXrXrXrXqXrXrXqXrXrXrXrXqXrXrXqXrXqXrXqXrXqXrXrXrXrXrXrXqXqXrXrXrXrXrXrXqXqXrXrXrXqXrXqXrXrXqXrXqXrXrXqXrXrXrXrXqXrXrXqXrXqXrXrXqXrXrXrXrXrXrXrXrXrXrXrXrXqXrXqXrXrXrXqXrXqXrXrXqXqXrXqXrXrXqXrXqXqXrXrXqXrXqXrXrX",
"rXqXqXrXqXrXqXqXqXqXqXrXqXqXqXrXqXrXqXrXqXqXqXqXrXqXqXrXqXrXqXqXqXqXrXqXrXqXrXqXrXqXrXqXqXrXqXrXqXrXrXqXqXqXrXqXqXqXqXqXqXrXrXqXqXrXrXqXqXqXqXrXrXqXqXqXqXrXqXrXqXrXqXrXrXrXqXrX0XrXrXqX0XrXrXqXqXrXrXqXrXqXqXrXqXqXqXqXqXrXqXrXrXqXrXqXqXqXqXrXqXrXrXqXrXqXrXqXqXqXqXrXrXqXqXqXqXrXqXrXqXqXqXrXrXqXrXrXrXqXrXqXrXqXrXqXqXqXqXrXrXqXqXqXqXrXrXqXrXqXrXqXqXrXqXrXqXqXqXrXqXrXqXqXrXqXqXqXrXqXqXrXqXqXqXrXqXrXqXqXrXqXqXqXrXqXrXqXrXqXrXrXrXqXrXrXqXrXrXqXqXqXrXqXqXqXqXrXqXqXqXrXqXqXqXqXqXrXqXrX0X/.7 8 /.qXqXrXrXqXqXqXrXqXrXqXrXrXqXrXqXrXqXrXrXqXqXqXrXqXqXrXqXrXqXqXqXrXrXqXrXrXrXqXrXrXqXrXrXqXqXqXrXqXqXrXqXrXqXqXrXqXqXqXqXqXqXrXqXqXqXrXqXrXqXrXqXqXrXqXqXqXrXqXqXrXqXqXqXqXqXrXqXqXqXrXqXrXqXrXqXqXqXrXqXrXqXqXqXrXqXrXqXrXqXqXqXqXqXqXqXrXqXqXqXrXqXrXqXqXrXqXqXqXqXrXqXqXrXqXqXqXqXqXqXrXqXqXqXrXqXqXrXqXqXqXqXrXqXrXqXqXrXqXqXqXqXqXqXrXrXqXqXqXqXqXqXrXrXqXqXqXrXqXrXrXqXrXqXrXqXqXrXqXqXqXrXqXqXqXrXqXqXqXrXqXqXqXqXqXqXqXqXqXqXqXqXrXqXrXqXqXqXqXrXqXqXqXrXqXrXqXrXrXqXrXqXrXqXqXqXrXqXrXqXqX",
"qXqXqXqXqXqXqXqXqXqXqXqXqXrXqXqXqXrXqXqXqXqXqXqXqXqXqXqXqXqXqXrXqXqXqXqXqXqXqXqXqXqXqXrXqXqXqXqXqXqXqXrXqXqXqXqXqXqXqXqXqXqXqXrXqXqXrXqXqXqXqXqXrXqXqXqXqXqXqXqXqXrXqXqXqXqXqXqXrXrX0XrXrXqX0XrXqXqXqXqXqXqXqXqXqXqXqXrXqXqXqXqX0XrXqXqXqXqXqXqXqXqXqXqXqXrXqXrXqXqXqXqXqXqXqXrXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXrXqXqXqXqXqXqXrXqXqXqXrXqXqXqXqXqXrXqXqXqXqXqXrXqXrXqXqXqXqXqXqXqXrXqXqXqXqXqXrXqXrXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXrXqXqXqXqXqXqXqXqXqXrXqXqXqXqXrXqXqXqXqXqX0XqXqXG.8 8 G.qX0XqXqXqXqXqXqXqXrXqXqXqXqXqXqXqXqXqXqXqXqXrXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXrXqXqXqXqXqXqXqXqXqXqXrXqXqXqXrXqXqXqXqXqXqXqXqXqXrXqXqXqXqXrXqXqXqXqXqXqXqXqXrXqXqXqXqXqXqXqXqXqXrXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXrXqXqXqXqXqXqXqXqXqXqXrXqXqXqXqXrXqXqXqXrXqXqXqXrXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXrXqXqX0XqXqXqXqXqXqXrXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXrXrXqXqXqXqXqXqXqXqXrXqXqXqXqXrXqXqXqXqXqXqXqXqXqXqXqXqXrXqXqXqXqXqXqXrXqXqXqXqXqXqXqXqXqXqXrXqXqXqXrXqXqX",
"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XqXrX0X0XqXqX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XqX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XqXqXqXZ.2 . > Z.rX0XqXqX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX",
"qXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XqXqXrX0XqXqXqXqXqXqXqXqXqX0XrX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XZ.: : Z.9XqXqX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XqX0XqXqXqXqXqXqX",
"qXqXqXqXqXqXqXqXqXqX0XqX0XqXqXqXqXqXqX0XqXqXqXqXqX0XqXqXqXqXqXqXqXqXqXqXqXqX0XqXqXqXqXqXqXqXqXqXqXqX0X0XqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XqXqXqXqXqXqXqXqX0XqXqXqXqXqX0XqXqXqXqX0XqXqXqXqXqXqXqXqX0XqXqX0XqXqX0XqXqXqXqXqXqXqXqXqXqXqXqX0XrXqXqXqXqXqXqXqXqX0XrX0XrXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XqXqXqXqX0XqXqXqXqXqXqXqXqX0XqXqX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XqXqXqX0XqXqX0XqXqXqXqXqXqXqXqX0XqXqXqXqXqXqXqXqXqXqXqXqX0XqXqXqX0XqXqXqXqXqXqXqXqXqXqX0XqXqXqXqXqXqXqXqXqXqXqX0XqXqXqXqXqXqXqXqXqX0Xm.% % m.0XqXqXqXqXqXqXqXqXqXqXqX0XqX0XqXqXqXqXqXqXqXqXqX0XqXqXqXqXqXqXqXqXqXqXqXqX0XqXqXqXqXqXqX0XqXqXqX0XqXqXqXqXqXqXqXqXqXqXqX0X0XqXqXqXqXqXqXqXqXqX0XqXqXqX0XqXqXqXqXqXqXqX0XqX0XqXqXqXqXqXqXqXqXqX0XqXqXqXqXqXqXqXqXqXqXqXqXqX0XqXqXqXqXqXqXqXqXqXqXqX0XqXqXqXqX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XqXqXqX0XqXqXqX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XqXqXqXqXqXqXqXqXqX0XqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqXqX0XqXqXqXqX0XqXqXqXqXqXqXqXqXqXqXqX0X0XqXqXqXqXqX",
"0X0XqXqX0XqXqXqX0XqX0XqXqX0XqXqXqXqXqX0XqX0X0X0X0XqX0XqXqX0XqXqXqX0XqXqX0XqXqXqXqX0X0XqXqXqX0XqX0XqXqX0X0XqXqXqX0XqXqXqX0XqXqX0XqX0XqXqXqX0X0XqXqX0X0XqX0XqXqXqXqXqX0XqX0XqX0XqX0XqXqX0XrX0X0XrXqXqXqXqX0XqXqXqX0XqX0XqXqXqX0XqX0XqX0X0X0XqX0X0XqX0XqXqXqX0XqX0X0X0XqX0X0XqX0XqXqX0X0XqX0XqXqXqXqXqXqX0XqX0X0XqXqX0XqX0XqX0XqXqX0X0XqX0XqX0XqXqX0XqX0XqXqXqX0XqX0XqX0XqXqX0XqX0XqXqXqX0X0XqXqXqX0XqX0XqXqX0XqX0XqX0X0XqX0XqXqX0XqXqX0XqXqX0X0XqX0X0XqX0X0XqXqXqX0XqXqXqXqX0XqXqX0XqX0X0X0XqX0XqX0XqXqX0XqXqXqX9XqXqX9Xb.% : b.6XqXqXqX0XqXqX0XqX0XqXqXqXqX0X0XqX0XqXqX0X0XqXqXqX0XqX0XqXqX0XqXqX0XqXqX0XqX0XqXqXqXqXqX0X0XqXqX0X0XqX0X0XqX0X0XqXqXqXqXqX0X0XqX0XqX0X0XqXqXqXqXqXqXqX0XqXqXqXqXqX0XqX0XqXqX0XqX0X0XqX8XqXqXqXqXqXqXqX0XqXqX0XqXqX0XqXqX0XqXqXqX0XqX0X0XqXqX0XqX0XqX0XqXqX0XqXqXqXqXqXqXqXqXqX0XqXqXqX0XqX0XqXqXqX0XqXqXqX0XqXqXqXqX0XqXqX0X0X0X0XqXqXqXqXqXqX0X0XqXqXqXqX0XqXqXqX0X0XqXqX0X0X0XqX0XqXqXqX0XqXqXqX0XqX0XqXqX0X0XqXqX0XqXqXqX0X0XqXqXqX0XqX0X0XqX0XqXqX0XqXqXqX0XqXqX0XqXqXqX0X0XqX0XqX0XqX0XqXqXqX0XqX0XqXqXqXqXqXqXqX",
"0XqX0XqX0XqX0X0XqX0X0X0XqX0XqXqX0X0X0XqXqX0X0X0X0X0XqX0X0XqX0X0X0X0X0X0X0X0X0X0X0XqXqXqX0XqX0XqX0X0X0X0XqX0X0XqXqX0X0X0XqX0XqX0XqX0X0X0X0XqX0X0X0XqX0XqX0X0X0X0X0X0X0X0XqX0X0X0XqX0X0X0X0X0X0X0X0X0X0X0X0X0X0XqX0XqX0X0X0XqX0XqX0X0X0XrX0X0X0XqXqX0X0X0XqX0X0X0X0XqX0X0XqXqX0X0X0XqX0X0X0X0X8XqX0X0X0XqX0XqX0X0XqX0X0XqX0XqX0X0XqX0X0XqX0X0X0X0XqXqX0X0X0XqX0XqX0X0XqX0X0XqX0X0X0X0X0XqX0X0X0XqX0X0XqX0X0XqX0X0X0XqX0X0XqX0XqX0X0X0X0X0X0XqX0X0XqX0X0XqX0X0X0XqXqXqX8XqX8XqX0XqX0X0X0XqXqX0X0X0XqX0XqX0X0X0XqX0X0X0X0X0X6Xb.# + b.9XqX0X0X0X0XqX0X0XqXqX0X0X0XqX0XqX0X0XqX0X0XqX0X0X0XqX0XqX0X0X0X0X0X0X0X0X0XqX0XqX0X0X0X0X0XqX0X0X0XqX0X0XqX0X0X0XqX0XqX0X0XqX0X0X0X0X0XqX0XqX0X0X0XqX0X0X0X0X0X0X0X0X0X0XqX0X0XqX0X0XqX0XqXqXqX8X0XqX0X0X0X0X0X0X0X0X0X0XqX0X0X0X0XqX0XqX0X0X0XqXqX0X0X0X0X0X0XqX0X0X8XqXqX8XqX8X0X0X0X0X0XqX0X0X0X0X0XqX0X0X0XqX0X0X0XqX0X0X0XqX0XqX0XqX0X0X0X0X0XqX0X0XqXqX0X0X0X0X0XqX0X0X0XqX0XqX0XqX0X0X0X0X0XqX0XqX0X0X0XqX0X0XqX0X0X0X0XqX0X0X0XqX0X0XqX0X0X0X0X0X0X0X0X0XqXqX0X0X0X0X0XqX0X0XqX0X0XqXqXqX0XqX0XqX0X0X0X0X0X0X0X0X",
"0X0XqX0X0X0X0XqX0X0X0X0XqXqX0X0X0XqX0XqX0X0X0X0XqX0X0X0X0X0XqX0XqX0X0X0XqX0XqX0XqX0XqX0XqX0X8XqXqX0X0XqX0X0X0X0X0X0X0X0XqX0XqX0X0X0X0XqX0XqX0X0X0X0XqX0X0X0X0X0X0X0X0X0X0X0XqX0X0XqX0XqX0XqXqX0X0X0X0XqX0X0X0X0XqX0X0X0X0XqX0X0X0X0X0XqX0X0X0X0X0X0XqX0X0X0X0XqX0X0XqX0X0X0XqXqX0X0X0XqX0XqX0X0XqX0X0XqX0X0X0X0XqX0X0X0XqX8XqXqX0XqX0XqX0X0X0XqX0X0X0X0X0X0X0X0X0XqX0X0X0XqX0X0X0XqX0X0X0X0XqX0X0XqX0XqX0XqX0XqX0X0X0XqX0X0X0X0X0XqX0X0XqX0XqX0X0X0X0X0X0XqX0X0X0XqX0XqX0X0X0X0XqX0X0X0X0XqX0X0X0X0X0X0X0X0X0X0X0X0XqX0X0X0X6XS S |.0X0X0XqX0XqX0X0X0X0X0X0X0X0X0X0XqX0X0XqX0X0XqX0X0X0X0X0XqX0X0X0XqX0XqX0X0X0XqX0X0XqX0X0X0XqX0XqX0X0X0XqX0XqX0X0X0X0X0X0X0X0X0X0X0X0X0XqX0X0X0X0X0X0X0XqX0X0X0X0X0XqX0X0X0XqX0X0X0X0X0X0X0X0X0XqX0XqX0XqXqX0X0XqX0X0X0X0X0X0X0XqX0X0XqX0XqX0X0X0X0X0X0XqX0X0X0X0X0X0X0X0X0X0X0XqX0X0X0X0X0X0X0X0X0X0XqX0X0X0X0X0X0X0XqX0X0X0X0X0X0X0X0X0X0X0X0X0X0X0XqX0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0XqX0X0X0X0XqX0X0X0X0XqX0X0X0XqX0XqX0XqX0X0X0X0X0X0X0X0X0X0XqX0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0XqX0X0X0X0XqX0X0XqXqX0XqX0X0X0X0X0XqX0X0XqX",
"0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X8XqXqX8XqXqX8XqX0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0XqX0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0XqX8XqX0X8X0XqX0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X7X8X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X8XqX0X0X0X0X0X0X0X0X0X0X",
"0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X8X0X0X0X8X0X8X0X0X0X0X0X0X0X0X0X0X8X8X0X8X8XqX8X0X0X0X8X0X0X0X0XqX0X8X0X8XqX8XqX0X8X8X0X0X8X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X8X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X8X0X0X0X0X0X0X8X8X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X8X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X8X8X0X0X8X0X8X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X8X8X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X8X0X0X0X0X0X0X0X0X0X0X0X0X8X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X8X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X8X8X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X8X8X0X0X8X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X8X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X8X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X8X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X0X8X0X0X0X0X0X0X0X0X",
"0X0X0X0X0X8X0X0X0X0X8X0X0X8X0X0X8X0X8X0X0X0X8X0X0X0X0X0X0X0X0X0X0X0X8X0X0X8X0X0X0X0X0X0X0X0X8X0X8X0X8X0X0X0X8X0X0X0X0X0X0X8X0X8X0X0X0X0X0X0X0X0X8X0X0X0X0X0X8X0X0X0X0X0X0X0X0X0X0X0X8X0X0X8X0X8X8X0X8X0X0X0X8X0X0X0X0X0X0X8X0X0X0X0X0X0X0X0X0X0X8X0X0X0X8X0X8X0X0X8X0X0X0X8X0X8X0X0X8X0X0X0X0X0X8X0X8X0X0X0X0X8X0X0X0X0X0X0X0X0X8XqX8XqX8X0X0X8X0X8X0X8X0X0X0X0X8X0X0X0X0X0X0X0X0X0X8X0X0X0X0X0X0X8X0X8X0X8X0X8X8X0X8X0X0X0X8X0X0X0X0X0X0X8X0X0X0X8X0X8X0X0X0X0X8X0X8X0X0X0X8X0X0X0X0X8X0X0X0X0X0X0X8X0X0X0X0X0X0X0X0X0X0X0X8X0X0X0X0X0X8X0X8X0X0X8X0X8X0X0X0X0X8X0X0X0X0X0X0X0X0X0X8X0X0X0X0X0X0X8X0X8X0X0X8X0X8X0X0X8X0X0X0X0X0X0X0X0X8X0X8X0X0X8X0X8X0X0X0X0X0X0X0X0X8X0X0X0X8X0X8X0X0X0X0X0X0X8X0X0X0X8X0X8X0X0X0X0X0X0X0X0X8X0X0X0X0X8X0X8X0X8X0X0X8X0X0X8X0X0X8X0X0X8X0X0X8X0X8X0X0X0X0X0X0X0X0X0X0X0X0X8X0X0X0X0X0X0X0X8X0X0X8X0X0X0X8X0X0X0X0X0X8X0X8X0X0X0X0X0X0X0X0X0X0X0X0X0X8X0X0X8X0X0X0X0X0X0X8X0X0X0X8X0X0X0X0X0X0X0X0X0X0X8X0X0X0X0X8X0X8X0X8X0X0X0X8X0X0X0X0X0X0X8X0X0X0X0X8X0X0X0X0X0X0X0X0X0X8X0X0X8X0X0X8X0X8X0X8X0X8XqX8XqX0X0X8X0X8X0X0X8X",
"8X0X0X0X8X0X0X8X8X0X0X0X8X0X0X8X0X0X0X0X0X0X8X0X0X0X0X8X0X0X0X0X0X0X0X0X8X0X8X0X0X8X0X0X0X0X0X0X0X0X0X8X0X0X0X0X0X0X8X0X0X0X8X0X0X8X0X0X8X0X0X0X0X0X0X0X8X0X0X8X8X0X0X0X0X8X0X0X8X0X0X0X0X0X0X0X0X0X0X8X0X0X0X0X0X0X0X0X0X0X8X0X0X8X0X0X0X0X0X0X0X8X0X0X8X0X0X0X0X8X0X0X8X0X0X0X8X0X0X0X0X0X0X8X0X0X0X0X0X0X0X0X0X0X0X8X0X0XqX8X0X0X8XqX0X0X0X8X0X0X0X0X0X0X0X0X0X0X0X0X8X0X0X0X0X0X8X0X0X0X0X8X0X0X8X0X0X0X0X0X0X0X0X8X0X0X0X0X0X0X8X0X8X0X8X0X0X0X0X0X0X8X0X8X0X0X0X0X0X8X0X8X0X0X0X0X0X8X0X0X0X0X0X8X0X0X0X0X8X0X0X0X8X0X0X0X8X0X8X0X0X0X8X0X0X0X0X0X0X0X0X0X0X0X0X0X8X0X0X0X0X0X8X0X0X0X0X8X0X0X8X0X0X0X0X0X0X0X8X0X0X8X0X0X8X0X8X0X0X0X0X0X0X0X0X0X0X0X0X0X0X8X0X8X0X0X8X0X0X8X0X0X8X0X8X0X0X8X0X8X0X0X0X0X8X0X0X0X0X8X0X0X0X0X0X0X0X0X8X0X0X8X0X8X0X0X0X0X0X0X0X0X8X0X0X8X0X0X8X0X0X8X0X8X0X0X8X0X0X0X8X0X0X0X0X0X0X0X0X0X0X0X0X8X8X0X0X0X0X0X8X0X8X0X0X0X0X0X8X0X0X8X0X8X0X0X8X0X0X8X0X0X0X0X0X8X0X0X0X0X0X0X0X8X0X0X8X0X8X0X0X0X8X0X0X8X8X0X0X0X0X0X0X8X0X0X8X0X8X0X8X0X0X8X0X0X8X0X0X8X0X0X0X0X0X0X0X8X0X0X0X0X8X0X8X0X0X0X0X0X0X0X0X8X0X0X8XqX0X0X8X0X",
"8X8X8X0X8X8X0X0X0X0X8X0X0X8X8X0X8X0X8X8X8X0X8X0X0X8X0X8X8X8X8X0X8X8X0X8X8X0X0X8X8XqX8X0X8X8X8X8X8X8X8XqX0X8X8X0X8X8X0X0X8X0X0X8X0X8X0X8X8X0X8X8X8X8X0X0X0X8X0X8X0X0X8X8X8X0X8X8X0X8X8X8X8X0X8X8X8X8X8X0X0X8X8X0X8X8X8X8X8X0X0X8X0X0X0X8X8X8X8X8X8X0X0X0X0X8X8X0X8X0X0X0X8X8X8X0X0X0X8X0X8X8X0X8X8X0X8X8X8X0X7X0X8X8X0X8X8X8X8X0X8X8X0X8X8X8XqX8X8X0X8X0X8X8X8X8X0X8X8X0X0X8X8X0X8X8X0X0X8X8X8X0X8X0X0X8X8X0X8X8X0X8X0X8X8X8X8X0X8X8X0X0X8X0X0X8X8X0X8X0X8X0X8X0X0X8X8X0X8X0X0X8X8X8X8X0X8X0X8X8X8X0X8X0X8X8X8X8X0X8X8X0X8X8X8X0X0X8X0X0X8X0X0X8X8X0X8X0X8X8X8X8X0X8X8X0X8X8X8X0X8X8X0X0X8X8X0X8X8X0X8X0X8X0X8X8X0X8X0X8X0X8X8X0X0X8X0X0X8X8X0X8X8X0X8X0X8X8X8X8X8X0X8X0X8X0X0X8X0X0X0X8X8X0X8X0X8X0X0X0X8X8X0X8X0X0X8X0X8X0X8X8X8X0X8X8X8X8X0X0X8X0X0X8X8X8X0X0X8X8X8X0X8X0X8X0X0X0X0X8X8X0X8X0X0X8X0X8X8X0X8X0X8X8X0X8X8X0X8X0X0X8X8X0X0X8X8X8X8X0X8X0X0X8X8X0X8X0X8X8X0X8X8X0X8X0X0X8X8X0X8X0X0X8X0X8X8X0X8X8X0X8X8X0X8X0X0X8X0X8X8X0X0X8X0X0X0X0X8X0X8X8X8X0X0X0X0X8X0X8X0X0X8X0X0X8X8X0X0X0X8X8X8X0X8X0X8X0X8X0X8X0X8X0X8X0X0X8X8X0X8X8X0X8X8X8X0X8X0X8X0X8X",
"8X0X8X8X8X0X8X8X8X8X0X8X8X8X8X0X0X8X8X0X8X8X8X8X8X8X8X0X8X8X8X8X8X9X8X0X8X0X8X8X8X8X8X8X8X8X8X0X8X0X8X8X8X8X0X8X8X8X0X8X8X0X8X8X8X0X8X8X8X8X8X0X8X0X8X8X8X8X8X8X8X8X8X0X8X8X8X8X8X0X8X0X8X8X8X0X8X0X8X8X8X8X0X8X8X8X0X8X8X0X8X8X8X8X8X0X8X8X8X0X8X0X8X8X8X8X8X8X8X0X8X8X8X8X8X8X7X0X8X8X8X8X8X8X8X8X8X0X8X8X8X8X8X8X8X8X8X8X8X8X8X0X8X0X8X8X8X8X0X8X8X0X8X8X8X8X8X8X0X8X8X8X8X8X8X8X8X0X8X0X8X8X0X8X8X0X8X8X8X0X8X8X8X8X8X8X0X8X8X8X0X8X8X0X8X8X0X8X8X8X8X8X8X8X8X8X0X8X8X8X8X8X0X8X0X8X8X8X8X8X0X8X8X8X8X0X8X8X8X8X0X8X8X8X8X8X8X8X0X8X8X0X8X8X0X8X8X0X8X8X8X8X8X8X0X8X8X8X8X8X8X8X0X8X8X0X8X8X0X8X8X0X8X8X0X0X8X8X8X0X8X8X0X8X8X8X8X0X8X0X8X8X0X8X8X0X8X8X8X8X8X8X0X8X8X0X8X8X8X8X0X8X0X8X8X8X8X0X8X8X8X8X8X8X8X8X0X8X8X8X8X0X8X8X0X8X0X8X0X8X8X8X8X8X8X0X8X8X8X8X0X8X8X8X8X0X8X8X0X8X0X8X8X8X8X0X8X8X8X8X0X8X8X0X8X8X8X8X8X8X8X0X8X8X8X0X8X0X8X8X8X0X8X0X8X8X8X8X8X8X8X0X8X0X8X0X8X8X8X8X8X8X8X8X8X8X0X8X8X0X8X8X8X0X8X8X8X8X8X8X8X8X8X8X8X8X8X8X0X8X8X8X8X0X8X8X0X8X8X8X0X8X8X0X8X0X8X0X8X8X8X8X8X8X8X8X8X8X0X8X8X8X8X8X8X8X8X8X8X0X8X8X8X8X8X0X8X8X8X8X8X8X",
"8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X0X8X8X8X8X8X8X8X8X8X8X8X0X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X0X8X8X8X8X8X8X8X8X8X0X8X8X8X8X8X8X8X0X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X0X8X8X0X7X8X8X0X8X8X8X8X8X8X7X0X8X8X8X8X8X0X8X8X8X0X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X0X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X0X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X0X8X8X8X8X8X8X8X8X8X8X8X0X8X8X8X8X8X0X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X0X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X0X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8XoX0X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X0X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X0X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X0X8X8X8X8X8X8X8X8X8X8X8X8X8X0X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X7X0X8X8X8X8X8X8X8X8X8X8X8X8X8X0X8X8X8X8X8X8X0X8X8X8X8X8X8X8X8X8X0X8X8X8X8X0X8X8X8X8X",
"8X8X8X8X8X8X7X8X8X8X8X7X8X8X7X8X8X8X7X8X8X8X8X7XoX8X8X8X8XoX8X8X8X8X8X8X8X7X8X8X7X8X8X7X7X8X8X7X8X8X8X8X8X8X7X8X8X8X8X8X7X8X8X7X8X8X7X8X8X7X8X7X8X8X8X8X8X7X8X8X8X8X8X8X8X8X8X8X8X8X8X8X7X8X8X7X8X8X8X8X8X8X8X7X8X8X8X7X8X8X8X8X8X7X8X8X8X7X8X7X8X8X7X8X8X8X8X8X8X7X8X8X7X0X7X0X7X8X8X8X8X8X8X8X0X7X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8XoX8X8X8X8X8X8XoX8X8X8X8X8X7X8X8X8X7X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X8X8X7X8X8X8X8X7X8X8X7X8X8X8X8X8X7X8X8X8X8X8X7X8X8X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X8X8X8X8XoX8X8X8X0X8X8X8X8X8X8XoX8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X7X8X7X8X8X8X8X7X8X8X8X8X7X8X8X7X8XoX8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X7X8X8X8X8X7X8X8X8X8X7X8X8X8X8X8X8X8X8X8X8X8X8X8X7X8X8X8X7X8X8X8X7X8X8X8X8X7X8X8X8X8X8X8X8X8X8X8X8X8X7X8X8X8X8X7X8X8X8X8X8X8X7X8X8X7X8X8X8X8X8X8X7X8X8X7X8X8X8X7X0X7X0X7X0X7X7X0X0X7X7X0X7X8X8X8X8X8X8X8X8X8X8X8X7X8X8X8X8X7X8X8X7X8X8X8X8X8X8X8X8X8X8X8X8X8X",
"8X7X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X7X8X8X7X8X8X7X7X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X7X8X8X8X7X8X8X7X8X8X8X8X8X7X8X7X0X7X7X0X8X7X8X8X7X0X8X7X8X8X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X7X8X8X8X8X7X8X7X8X8X7X8X8X7X7X8X8X8X8X8X8XoX8X8X8X8X8X8XoX8X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X7X8X8X7X8X8X8X8X7X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X7X8X8X8X7X8X8X8X8X8X7X8X8X8X8X8X8X8X8X8X7X8X8X8X8X7X8X8X7X8X8X7X7X8X8X0X0X8X0XoXoX8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X7X8X8X7X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8X8XoX8X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X8X8X8X7X8X8X8X7X0X0X7X7X0X7X7X0X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X8X8X8X8X8X8X7X8X8X8X8X8X8X8X7X8XoX8X",
"7X8X7X8X7X8X8X8X7X8X8X8X7X8X7X8X7X8X8X7X8X8X8X8X8X8X8X8X8X8X7X8X8X7X7X8X7X8X8X7X8X8X7X8X8X8X8X7X7X8X7X8X7X8X8X8X8X8X8X8X8X7X7X8X8X7X7X8X7X7X8X8X7X7X7X8X7X8X8X7X8X7X7X8X7X7X7X7X7X8X8X7X7X8X7X7X7X8X8X8X7X8X7X8X8X8X8X8X7X8X8X7X7X8X7X7X7X7X8X8X8X7X8X8X8X7X7X7X8X7X8X7X7X8X0X7X7X8X7X7X8X8X7X8X8X7X7X0X7X8X8X8X7X8X7X8X7X8X7X8X8X8X8X8X8X8X8X8X8X8XoX8X8X8X8X8X8X7X8X8X7X8X7X7X7X8X7X8X8X7X8X7X8XoX8X8X8X8X8X8XoX8X8X8X8X8X8X8X8X8X7X8X7X8X7X7X7X8X7X8X8X7X7X8X7X7X7X8X7X8X7X7X7X8X8X8X7X8X7X7X8X7X7X7X7X7X8X8X7X8X7X8X7X8X7X7X7X8X8X7X8X8X7X7X7X8X7X7X8X8X8X7X7X7X7X8X7X8X7X7X8X8X8X8X7X8X8X7X8XoX0XoXoX0XoX8XoX8X8X8X8X8X8X8X7X8X7X7X8X8X8X7X7X8X7X7X8X8X8X7X7X8X8X7X8X7X7X7X7X8X8X7X8X7X7X7X7X8X8X7X8X7X7X7X7X7X8X8X8X8X7X8X8X8X8X8XoX8X8X8XoX8X8X8X8X8X8X8X8X8X7X8X7X8X7X7X8X8X7X8X8X7X7X7X7X8X7X8X8X7X7X8X7X8X7X7X7X7X8X8X7X7X8X8X8X8X7X8X7X8X7X7X8X8X7X8X8X8X7X8X8X7X7X8X8X7X7X7X7X8X8X8X7X8X8X8X7X8X8X7X8X8X7X7X8X8X7X7X8X7X8X8X7X8X7X8X7X8X8X8X7X8X7X8X7X8X7X8X7X0X7X7X7X7X7X7X8X7X7X8X8X8X7X8X7X8X8X7X8X8X7X8X8X7X7X8X7X8X8X8X8X7X8X7X8X8X8X8X8X8X8X8X",
"7X7X8X7X7X7X7X7X7X7X7X7X8X7X7X7X8X7X7X7X7X7XoX8X8XoXoX8X8XoX8X8X7X8X7X7X8X7X7X7X7X7X7X7X7X7X7X7X8XoX8X7X8XoX7X7XoX8XoX8X7X8X8XoX8X7X7X7X7X8X7X7X8X7X8X7X7X7X7X7X7X8X7X7X7X7X7X7X7X7X8X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X8X7X7X7X7X7X7X7X8X7X7X7X7X7X7X8X7X7X7X7X7X8X7X7X7X7X7X7X7X7X8X7X7X7X7X7X7X7X7X7X7X7X7X7X7X8X7X7X7X9X7X8XoX8XoXoX8XoX8XoXoX8X8X7X7X7X7X8X7X7X7X7X7X7X7X7X7X7X8X7X8X7X7X8X8XoX8X8XoX8XoXoX8XoX8X8XoXoX8X7X7X7X7X8X7X7X7X7X7X7X7X8X7X7X7X8X7X8X7X7X7X7X7X7X7X7X7X7X7X8X7X7X7X7X7X7X8X7X7X7X7X8X7X7X7X7X7X7X7X8X7X7X7X7X7X7X7X8X7X7X7X7X7X8X7X8X7X7X7X7X7X7X7X7X7X7X7X8X7X8X8XoX8X0XoX8X8XoX8XoX8X8XoX8XoX7X7X8X7X7X7X7X7X7X7X8X7X7X7X7X7X7X8X7X7X7X7X7X7X7X8X7X7X7X7X7X7X7X7X7X8X7X7X7X7X7X8X7X7X7X7X7X7X8XoX8XoX8XoX8XoXoX8XoX8X8XoXoX8X7X7X7X7X8X7X7X7X7X7X7X7X8X7X7X7X7X7X8X7X7X8X7X7X7X7X7X7X7X8X7X7X7X8X7X7X7X7X7X7X7X7X7X7X7X7X8X7X7X7X7X8X7X8X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X8X7X7X7X7X7X7X7X7X8X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X8X7X7X7X7X7X7X7X7X7X7X0X7X7X7X7X7X7X7X7X8X7X7X7X7X7X7X7X7X8X7X7X8XoX7X7X8X7X7X7X7X7XoX8XoX8X8XoX",
"7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7XoXoX8XoX8XoX8XoX7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7XoX7X7X7X7X7X7X7X7X7X7X7XoX8XoX8X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7XoX8XoX8XoX8X8XoX8XoX8X8XoX8X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X8XoX8XoXoX8X8XoX8XoX8XoXoX8XoX8X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7XoX8XoX8X8XoX8XoX8XoX8XoX8XoX8X8X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X8XoX8X8XoX8XoX8X8XoX8XoXoX8XoX8X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7XoX8X7X7X7X7X7X7X7X7X7X7X7X7X7X7X",
"7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X8X8X8XoX8X8XoXoX8X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X8X7X7X7X7X7X7X7X7X7X7X8X8XoX7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X8XoX8XoX8XoX8XoXoX8XoX8X8XoX7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7XoX8XoX8X8X8XoX8XoX8XoX8X8X8X8XoX7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X0XoX8XoXoX8XoX8XoX8XoX8XoX8X8XoX7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7XoX8XoX8X8XoX8X8XoX8XoX8X8X8X8XoX7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X8XoX7X7X7X7X7X7X7X7X7X7X7X7X7X7X",
"7X7X7X7X7XoXoX7X7XoX7X7X7X7X7X7X7X7XoX7XoX7X8XoXoX8X8XoXoX8XoX8X7X7X7X7XoX7X7X7X7X7X7X7X7X7X7X7XoX8XoX7X7X7XoX7XoX7X7XoXoX8XoX8X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X.X7X7X7X7X7X7X7X7X7X7X7X7X7X7XXXXX7X7XXX7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7XoX7X7X7X7X7X7X7XoX7X7X7X7X7X7X7X7XoX7X7X7X7X7X7X7X7X7X7XoX7X7X7XoXoX8X8XoXoX8X8X8X8XoXoXoX7XoX8XXX7X7X7X7X7X7X7X7X7X7X7X7X7X7X7XoX8XoX8XoXoX8XoX8XoX8XoXoXoXoX8X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7XoX7X7X7X7X7X7X7X7X7X7X7XoX7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7XoX8XoXoX8XoX8XoXoXoX8XoX8XoX8XoX7X7X7X7X7X7X7X7X7X7X7X7X7X7XoX7X7X7X7X7X7X7X7X7X7X7X7X7XXX7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X8XoXoX8XoX8X8XoX8XoX8XoXoXoXoX8X7X7X7X7X7X7X7X7X7X7X7X7XoX7X7X7X7XXX7X7X7X7X7X7X7XXXXX7XXX7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7XXX7X7X7X7X7X7X7XXX7XXXXX7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7XoX7X7XoX7X7X7X7X7XoX7XoX7X7X7XoX7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7XoX7XoX7X7X7X7X7XoX7XoX7X7X7X7X7XoX7X7X7XoX7X7X7XoX7XoX7X7X7XoX8XoX8X",
"oXoX7XoX7XoX7X7XoX7XoX7XoX7XoXoX7XoX7X7X7XoXoX7XoXoX7XoXoX8XoXoXoX7XoX7X7XoXoX7XoX7XoXoX7XoXoX7X7XoX7XoX7XoX7X7X7XoX7XoX7XoXoXoXoX7XoXoX7XoXoX7XoXoX7XoXoX7XoX7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X.X7XXX7X7X7X7X7X7X7X7X7X7X7XXX7X7X7X7X7XXX7X7XXX7XXX7X7X7X7X7XXX7X7X7X7XoX7XoX7XoXoX7XoX7XoXoX7XoXoX7XoXoX7XoXoXoX7XoXoXoX7X7X7XoXoXoX8XoXoX8XoXoXoXoXoXoX8XoX7X7XoX7X7X7X7X7X7XXX7X7XXX7X7XXX7X7X7XoX8XoXoXoX8XoXoXoX8XoXoX8XoXoXoXoX7XoXoX7XoXoX7X7XoX7XoXoX7XoXoX7X7X7X7X.X7X7X7X7X.X7X7X7X7X7X7XoX7XoX7XoXoXoX7XoX7XoX7XoX7XoX7X7X7X7XoXoX7XoX7X7XoXoX7XoX7X7XoX7X7X7X7X.X7X7X7X7X.X7X7X7X7X7X7XoX8XoX0XoXoXoXoX8X8XoXoXoXoXoX8X7XoX7XoXoX7XoXoX7XoXoX7XoX7X7XoX7X7X7X7XXX7X7XXX7X7X7X7X7X7XXX7X7X7X7X7X7X7XXX7X7XXX7XXX7X7X7X7XoXoX8XoXoXoXoXoXoX8XoXoX8XoXoXoX7XoXoX7XoXoX7XoXoX7XoX7X7XoXoX7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7XXX7XXX7X7X7X7X7X7XXX7X7XXXoX7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7X7XXX7XXX7X7X7X7XoX7XoX7XoX7XoX7X7X7XoX7X7XoX7X7XoX7X7XoX7X7XoX7XoX7XoX7XoXoXoX7XoXoX7XoX7XoX7X7X7XoXoX7XoX7XoX7X7XoXoX7XoX7X7XoX7XoX7XoX7XoX7X7XoX7X7XoX7XoXoXoX",
"oX7XoX7XoXoX7XoXoXoX7X7XoXoXoXoX7XoX7XoXoXoXoX7XoX8XoXoXoX8X8XoX7XoXoX7XoXoXoXoXoXoX7XoXoXoXoXoXoXoXoX7XoXoXoXoX7XoX7XoXoXoX7XoXoXoX7X7XoXoXoXoX7X7XoXoX7XoXoXoXoXoXoX7XoX7X7XoXoXoXoX7X7XoXoXoX7XXX7XXX7X7XXX7X7X.X7X7XXX7XXX7X7X.X7X.X7X.X7X7X7X7XXXXX7X7X7XXXoXoX7XoXoX7XoXoXoXoXoXoX7XoX7XoXoX7XoX7XoXoXoX7XoX7XoXoXoX7XoX7XoXoXoX7X7XoXoXoX7XoXoXoXoX7X7XoX7X7XXX7XoXoX7X7XoXoX7XoXoXoX7XXXoXoX7XoXoX9XoXoX8XoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoX7X.X.X7X7X.X7X7XXX7X7XXX7X7X7X7XXX7X7X7XXX7X7XXXoXoX7X7XoXoXoXoX7XXXXX7XXX7X7X7XXX7X7X7XXX7X7X7X7X7X7X.X7X7X7X7X7X.X.X7X7X'.7X7X7XoXoX7XoXoXoXoXoX8XoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoX8XoXoXoXoX7X7XoXoX7XXXXX7X7X7XXX7X7X7XXX7X7XXX7X7X7X7X7X7X7X'..X7X7X'.7X7XoXoXoXoXoXoXoXoX8XoXoXoXoXoXoXoXoXoX8XoXoXoXoXoXoXoXoX9XoXoXoXoXXXXX7XXX.X7X7X.X7X7X7X7X.X7X7X'.7XXX7X7XXX7X7X7XXXXX7X7XoX7XoXoX'.7X7X7X.X7X7X7X7X7X7X7X'.7X7X7XoXoX7X7XoXoXoXoX7X7XXX7XoXoX7X7XoXoXoXoX7X7XoXoX7XoXoXoXoX7XoX7XoXoXoXoX7X7XoXoXoXoX7XoXoX7XoX7XoXoXoXoX7XoX7XoXoXoXoX7X7XoXoXoXoX7XoXoXoXoX7X7XoXoXoXoX7XoXoX7X",
"oXoXoX7XoXoXoXoX7XoXoXoXoX7X7XoX7XoXoXoX7XoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoX7XoX7XoXoXoXoX7XoXoXoX7XoXoX7XoX7XoX7XoXoXoX7XoX7XoX7XoXoXoXoX7X7XoXoXoXoX7XoXoX7XoX7X7XoXoXoXoXoXoX7X7XoXoXoXoX7X7X7X7XXX7X7XXXXX7X7X7X7X7X.X7X7X7X7X7X7X7X7X7X.X7XXX7X7X7X7XXX7XXXoXoXoXoXoXoXoXoXoXoXoXoX7XoXoXoXoXoXoX7XoX7XoXoXoXoXoX7XoXoXoX7X7X7XoXoXoXoX7X7XoXoX7X7XoXoXoX7XXX7XXX7X7XoXoXoXXX7XoXoX7XoX7X7XoXoXoXoXoXoXoXoXoXoXoXoXoXoXoX8XoXoXoX8XoXoXoXoXoXoX8XoXoXoXoXoX7X7X7X7X7X7X.X7X7X7XXX7X7XXXXX7X7XXXXX7X7XXX7X7X7XoXoXoXoX7X7XoXXX7X7X7X7X7XXXXX7X7XXXXX7X7XXXXX.X7X7X7X.X7X.X7X7X7X7X7X7X7X7X7XoXoXoXoX9XoXoXoXoXoXoXoXoXoXoXoX8XoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXXXXX7X7XoX7X7XoXXXXX7X7XXXXX7X7XXX7X7XXX.X7X.X7X7X7X7X7X7X7X7X7XoXoXoX8XoXoXoXoXoXoXoXoXoXoXoX8XoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoX7X7X7X7X7X7X7X7X.X7X7X.X7X7X7X7X7X7XXX7XXX7XXX7X7X7X7XXXoX7XoX7X7X7XXX7X7X7X7X.X7X.X7X7X7X7X7X7X7XoXoXoXoX7X7XoXoXoXXX7X7XoXoXoXoX7X7XoXoXoXoXoXoXoXoX7XoXoXoX7XoX7X7XoXoXoXoX7XoX7XoXoXoXoXoXoXoX7XoX7XoXoXoX7XoX7XoXoXoX9XoXoXoXoXoX7XoXoXoXoXoX7X7XoXoXoXoXoX",
"oXoXoXoXoXoX7XoXoXoXoXoXoXoXoXoXoXoXoXoX7XoXoXoXoXoXoXoXoXoXoXoXoXoXoXoX7XoXoXoXoXoXoXoXoX7XoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXXX7XXX7XXX7X7XXX7X.X7X.X7X7X7XXX7X7X.X7X7X.X7X7XXX7X7X7XXX7XXX7XoX7XoXoXoXoX7XoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoX7X7X7XXXoXoXoXoX7X7XoXoXoXoXXX7XoXoXoXoXoXoXoXoXoXoXoX8XoXoXoXoXoX8XoXoXoXoXoXoXoXoXoXoXoXoXoXoX7X.X7X7X7X7X7X7X7XXX7XXX7X7XXX7X7X7XXX7X7XXXXX7XoXoXoXoXoX7XoXoX7XXX7XXXXX7X7X7XXX7XXX7XXX7XXX7X7X7X7X.X7X7X.X7X7X7X7X7X7X7X7X7XoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoX8XoXoXoXoXoXoXoXoXoXoXoXoXoX7XXXoXoXoXoX7XoX7XXX7XXX7XXX7XXX7X7XXX7X7X7X.X7X7X.X7X7X7X7X7X7XoXoXoXoXoXoXoX7XoXoXoX8XoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXXX7XXX7X.X7X7X7X7X7X7X7X7X7X7X7X7XXXXX7X7XXX7X7XXX7XXX7XoXoXoXoX7X7X7X7X7X7X7X7X7X7X.X.X7X.X'.7XoXoXoXoXoXoXoXoX7XoX7XXXoXoXoXoXoXoXoXoXoXoX7XoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoX7XoXoX7XoXoXoXoXoXoX7XoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoX7X",
"oXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoX7XXX7XXXXX7XXX7X7X.X7X7X.X7X.X7X.X7X7X.X7X7X7X.X7XXXXXXX7XXX7XXXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXXXXXXX7XoXoXoXoXXXoXoXoXoXoXoXXXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoX.X7X7X.X.X.X7X.XXX7XXX7XXXXX7XXXXXXX7XXXXX7XXXXXoXoXoXoXoXXXoXoXXX7XoXXX7XXXXXXX7XXX7XXX7XXX7XXX.X7X.X7X.X7X7X7X'.7X7X.X.X7X7X'.oXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXXX7XoXoXoXoXoXoXXX7XXX7XXX7XXX7XXXXX7XXX.X7X7X7X7X7X7X.X.X7X7X'.oXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoX7XXX7XXX7X7X.X.X7X.X.X7X7X7X'.7XXX7XXX7XXX7XXXXX7XXX7XXXoXoXoXoX.X7X7X'..X7X.X.X.X7X7X7X7X7X7X7XoXoXoXoXoXoXoXoXXXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoX",
"oXoXoXoXoX.XoXoXoXoXXXXXXXoXoXoXoXoXoXoXXXXXoXoXoXoXoXoXoXoX.XoXoXXXoXoXXXoXoXoXoXXXoXoXoXoXoXoXoXoXoXoXXXoXXXoXXXoXXXoXXXXXoXoXoXoXoXoXXX7XXX7XoXXXoXoXXXoXoXoXXXoXoXoXoXoXXXoX.XoXoXXXoXoXXXXXXXXXXX7X7X7XXXXX7XXX.X7X.X7X.X7X7X7X.X7X.X7X.X7X.X7X7XXX7X7X.X7XoXoXoXoXoXXXoXoXoXoXXXoXoXXXXXoXoXXXXXoXoXoXoXXXoXXXoXoXoXoXoXXXXXXXoXoXXXoXoXXXoXoXXXoXXXoXXXoXXXXXoXoXXXoXoXoXXXoXoXoXXXoXXXoXoXoXXXXXoXoXoXXXoXoXoXoXXXoXXXoXoXoXoXXXoXXXoXoXoXoXoXoXoXoXXXoX.X7X.X7X7X7X.X7X7X.X7XXX7X.X7X.XXX7X7XXX7XXX7XXXXXoXoXoXoXXXXXXXXXoXXXoXXXXX7X7XXXXXXXXXXXXX7X7X7X.X.X7X.X7X7X.X.X7X.X7X7X.X7X.XXXoXoXXXoXoXXXoXoXoXoXoXXXoXoXoXoXoXoXoXoXoXXXXXoXoXoXoXXXoXoXoXXXoXXXoXoXXX7XoXXXXX7XXXXX7XXXXXXX7XXX7X'.7X7X.X.X7X.X7X7X.X7X.XoXoXXXoXXXoXoXoXoXoXoXoXoXXXoXXXoXoXoXoXXXoXoXoXoXoXoXoXXXoXoXoX'.7X7X7X7X.X.X7X7X.X7X7X.X7X.X7XXXXX7XXXXXXX.X7XXXXXXXoXoXXXXXoX7X.X.X7X.X7X7X7X7X.X.X7X.X7X.X7XoX.XoXoXoXoXoXoXoXXXoXoXoXXXoXXXoXoXoXoXoXoXoXoXXXoXoXoXXXoXoXXXoXoX.XoXoXoXoXoXoXoXXXXXoXoXoXXXoXoXoXoXoXoXoX.XoXoXoXoXXXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoX",
"oX.XoXoXoXoXoXoXXXoXoXoXoXoXXXoXoX.XoXoXoXoXoXXX.XoXoX.XXXoXoXoXoXoXXXoXoXoXXXoXoXoXoXXXXXoXXXoXoXXXXXoXoXXXoXoXoXoXoXoXoXoXoXXXoXXXoXXXXXXXXXXXoXoXXXoXoXXXXXoXoXXXoXXXXXoXoXoXoXoXoXoXXXoXoXoX7X7XXXXXXXXXXX7X.X7X7X.X7X.X7X.X.X.X7X.X7X.X7X.X7X.X.X7X.X.X7X.XXXXXoXXXoXoXXXoXXXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoXoX.XXXXXoXoXoXoXoXXXoXoXXXoXXXoXoXXXXX7X7XXXXX7XXXoXXXoXoXXXoXXXoXXXoXoXXXoXXXoXoXoXoXXXoXXXoXoXXXoXXXoXoXoXoXoXoXoXoXoXoXXXoXoXoXoXXXoXoXoX7X.X7X.X.X7X7X.X.X7X7XXX7X7X.X7XXXXXXXXXXXXX7XXXoXoXXXoXoXoXoX7X7XXXXXoX7XXXXXXXXX7XXX7X7X.XXXXX.X7X7X7X7X.X.X7X7X.X7X.X.X7X7X7XoXoXXXoXoXoXoXXXoXoXXXoXXXoXoXoXoXoXoXXXXXoXoXoXoXoXoXoXoXoXoXXXoXoXXXoXXX7XXXXX7XXXXXXXXX7XXX7XXXXXXX7X7X7X7X7X7X.X7X7X.X7X7X7XXXoXoXXXoXoXXXoXoXoXoXoXoXoXXXoXoXoXoXoXoXoXXXoXoXoXoXoXoXoXXXoX7X7X'.7X.X7X7X7X.X7X.X.X7X.X7X.X7XXXXXXXXX7X7X.X7XXXoXXXoXoXoXoX7X7X7X.X'.7X.X7X.X7X7X.X7X.X7X.XoXoXoXoXXXoXXXoXoXoXXXoXoXoXoXXXoXoX.XoX.XoX.XoXoXoXXXoXoXXXoXoX.XoXoXoXXX7XoX.XoXXXoXoXXXXXoXoX.XoXoXoX.XoXoXoXoX.XoXoXoXoXXXoXoXoX.XoX.XoXoXoXoX.XoXoXoX.XoXoX",
"oX.X.XoXoX.X.XoXXXoXoXXXXXXX.XoXoX.XoXXXoXoXoX.XoXoX.XoXoX.XoXoXoXoXXXoXoXXXoXXXoXoXXXoXoXoXXXXXXXoXXXoXXXoXXXoXXXoXoXXXoXXXXXXX7XXXXXXXXX7X7XXX.XoXoXoXXXoXXXoXoXXXXXoXoXoXoXXXoXoX.XoXXXoXXXXX'.7XXX7XXX7XXXXX.X7X7X.X.X7X.X7X.X7X.X7X7X.X.X7X.X7X7X.X.X7X.X7XXXoXoXoXXXoXXXoXoXoXoXXX.XoXoXXXXXXXoXXXoXXXXXXXoXXX.XoXoX.XXXoXoXXXXXXXoXXXXXoXoXXXXXoXXXXXXXXXXXoXXXoXoXXXoXoXXXoXoXoXXXoXXXoXXXoXoXoXoXXXXXXX.XoXoXoXXXXXoXXXoX.X.XoXoXXXXXoXoXXXXXoXXXoXXXXX.X7X.X7X7X.X.X7X7X.X.X7XXX.X7X.XXXXXXX7XXXXXXXXXoXXXoXXXXXXXoXXXXXoXXXoXXXXXXXXXXX7XXXXX.X7X.X7X7X7X.X.X.X.X7X.X.X7X.X7X.X7X.X.XoXXXXXoXXXoXXXXXoXoXXXoXXXoXXXoXoXoXXXoXXXoXoXoXXXoXoXXXoXXXoXXXXXoXXXoXXXXXXX7XXXXX7XXXXXXXXX7XXX7XXXXX'.7X'.'..X7X7X.X.X7X'.7XXXoXoXXXXXXXXXXXXXoXXX.X.XoXoXoXXXoXXXoXoXXXoXXXoXoXXXoXoXXXoXXX'.'.7X7X7X7X.X7X7X.X7X7X7X7X.X7X7XXXXXXX7XXX.X7XXXXXXX7XXXoXXXoX'.'.7X7X7X7X.X.X7X'..X7X7X.X.X7XoXXXoXoXXXoXXXXX.XoXXXoXXXXXoXoX.XoX.XoXoXoXoXoXoXXXoXXXXXoXXXoXoXoXoXoXoXoXoX.XoXoXXXoXXXoXoXXXoXoX.XoXoXoX.XoX.XoX.XoXXXoXoXXX.XoXoXoXoXoX.XoX.XoX.XoXoXoX.XoX",
".XoXoX.XoXoXoX.XXXXXXXXXoXXXoXXXXXoXXXXX.XXXoXXXoX.XoXoX.XoX.XoX.X.XoX.XXXoX.XoX.X.XoX.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXoXXXXXXXXXXXXXXXXXXXoX.X.XoXXXXXXXXX.XoXXX.X.XoX.XoX.XXXoX.XXXoXXXXX'.7XXXXXXXXXXXXX.X7X.X7X.X.X7X.X7X.X7X.X.X7X7X'.XXXXXXXX7X.X7X.XXXXXXXXXXXXXXXXX.XoX.XoXXXXXXXoXXXXXXXoX.XoXXXXXXXXXoXoX.XoXXXXXXXoXXXXXXXXXXXXXXXXXoX.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXoX.X.XoXXXoX.XoXXXoXXXXXXXXXXXXXXXXXoX.XXXoXXXXX.X.X7X7X'.7X7X'..X7X.X.X7X.X.X7XXXXX.X7XXXXXXXXXXXXXXXoXXXXXXXXXXXXXXXXX7XXXXXXXXXXXXXXX7XXXXXXX'.7X.X7X.X7X.X7X.X.X7X.X7X.X.X7XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.X.XoX.XoXXX.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX7X7X7X7X7X'..X.X7X.X.X7XXXXXXXoXXXXXXXXXXXXXXXoXoX.X.XoXXXXXXXXXXXoX.XoX.X.XoX.XXXXXXXXX7X7X7X.X'.7X7X'.7X.X'.7X.X'.7X.XXXXXXXXXXXXX7X.XXXXXXXXXXXXXXXXX7X7X7X.X7X.X.X7X7X7X7X.X.X7X7X'.XXoX.X.XoX.XXXXXoXXXXXXXXXXXXXXX.XoXoXoX.X.XoX.XXXXXXXXXXXXXXXXXoX.XXXXX.XXXXXoXXXXXXXXXXXXXXXXX.X.XoX.XXXXXoXXXoXXXoX.XXXXXXXXXoX.X.XoX.XoXoX.X.XoXoXoX.X.XoX.X",
"oXoX.XoXXX.XXXXXXXXXXXXXXXXXXXoXXXXXXXXXXXXXXXXXXXXXXXXXoX.XoX.XXXXXXXXXXXXXXXXXXX.XoXXXXXXXXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXXX.XXXXX.XXXXXXXoX.XoXXXXXXXXXXX7X7XXXXXXXXX XXXXXXXXXXX.X.X7X7X'.7X.X.X.X7X.X.X.XXXXXXX.X7X.X.XXXXXXXXXXXXX.XXXXXXXXXXXXXXX.XXXXXXXXXXXXX.XoXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXoXXX.XoX.XXXXXXXXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXXX.XXXXXXXXX.XXXXX.XXXXXXXXXXX.XXXXXXXXXXX7X7X'.7XXXXXXXXXXXXXXX.X7X X.X.XXXXXXXXXXX.XXXXXXXXX.XXXXX.XXXXXXXXXXXXXXXXXXXXX.X.X7X7X.X.XXXXX7X.X.X.X7X.X.X X7X'.7X.X7X7X'.7XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.XoXXXXXXXXX.XXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXXX.XXX.X.X7X7X.XXX7X7X.X7X'.7X.X.X7X7X'..XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.XoX.XXXXXXXXXXXXXXXXXXX.XXX.X.X.X.X7X.X7X7X.X.X.X.X7X'.7X.X.X.XXXXXXXXXXX7X.XXXXXXXXXXXXX|..X7X.X7X.X7X.X.X.X'.7X.X.X7X7X'.7X.XXXXXXXXXXXXXXXXXXXXX.X.XXXXXXX.XoX.XoXXXXXXX.XXXXXXXXXXX.XXXXX.XXXXX.XXXXXXXXXXXXXXXXXXX.XXXXXoX.XXXXX.XXXXXXXXXXXXX.XXXXXXXXXXXXXXXXX.XXXXXXXXX.XXXXXXX.XXXXX",
".X.X.X.XXXXXXXXXXXXXXX.XXXXX.X.X.XXXXXXXXXXX.XXXXXXXXXXX.XoX.XoXXXXX.XoXXXXXXXXXXXXX.XXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXX.XXXXX.XXX.XXXXXXXXXXX.XXXXXXXXXXX.XoXXXXXoX.XXXXX.XoX.XXXoX.XXXXX7X'.XXXXXXXX7X XXXXXXXXX.X7X.X.X7X.X'.7XXXXX.X7X.X7X'.XX.X7X.X7XXXXXXXXXXXXXXXXXXXXX.XXXXXXXoX.XXXXXXXXXXXXX.XXXXXXX.XXXXXXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXXXXX.X.XoX.XoXXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXXX.XXXXXXXXXXXXX.XoXXXXXoXXXXXXXXXXXXXXXXXXXXXXX.X.X7X.XXXXXXXXX.XXXXX7X.X.X7X.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.XXXXX7X.X.X.X7X.X.X|..X.X7X7XXX.X7X7X7X7X'.7X.X.X7X.XXXXXXX.XXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.XXXXXXX.XXXXXXXXXXXXX.X.X.X.X X.X.X.X.X7X.X7X7X'..X7XXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXXX7X7X.X.X.X.X X.X'.7X.X7X7X.X'.7XXXXXXXXXXXXX.X.XXXXXXXXXXXXX.X7X.X.X.X.X.X X7X7X7X.X7X.X.X.X7X.XXXoXXXXXXXXXXXXXXXXXXXoX.XXXXXXXoX.XoX.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.XXXXXXXXXXXXX.XoXXXXX.XoXXXXX",
"XXXXoX.XXXXXXXXX.XXXXXXXXX.XXXXXXXXX.XXXXXXXXX.X.XXX.XXXXX.XXXXX.XXXXXXX.XXXXX.XXXXXXX.XXXXXXX.XXX.XXXXXXX.XXXXX.XXXXX.X.XXXXX.XXXXXXX.X.XXXXXXX.XXXXXXX.XXXXXXXXX.XXX.XXXXX.XXXXX.X.XoX.X.XXXXX7X'.'.7X.X7X'.7X7X.XXX X.X.X.X.X7X'.7X.XXXXXXXXXXXXX7XXX X.X.X.XXXXX.XXXXXXXXXXXXXXX.X.XoX.X.XoX.XXXXX.XoX.XXX.X.XXXXXXXXXXXXXXX.XXX.XXXXXXX.XXXXXXXXXXX.XXX.XXX.XXX.XoXoX.XXX.X.XXXXXXX.XXXXX.XXXXXXXXX.XXX.XXX.XXXXXXXXX.XXXXXXX.XXXXXXX.X.XXXXXXXXXXXXXXXXX.X7X'.'.7XXX.X.XXX X7X XXX.X7X7X.X.XXXXX.X.XXXXX.XXXXX.XXXXXXXXXXXXXXX.XXXXX.X.XXX7X.X.X.X'..X7X.X.X.X.X.X X.X7X X'..X7X.XXXXX'.7XXXXXXX.X.XXXXXXXXX.XXXXX.XXXXX.X.XXX.XXX.XXXXX.XXXXX.XXXXX.XXXXXXXXX.XXXXX.X.XXX.X|..X.X.X.XXXXX.X7X.X7X.X7X.X7X7X.X.X'.XXXX7X'.XXXXXXXXXX.XXXXX.X.XXX.X.XXXXX.X.XXXXXoX.XXX.XXXXX.XXX.X.X.XXXXX.X.XXX X7X X.X7X7X7X'..X.X7X7X.XXXXXXXXX X7X X7X.XXXXX.X.XXX.X.X.X.X.X7X.X.X.X.X'..X7X.X'.7X'.7XXX.XXXXX.XXXXX.X.XXXXX.X.XXXXX.XXXXX.X.XXXXX.XXXXXXX.XXXXXXXXXXXXX.XXX.X.XXX.XXXXXXX.XXXXXXXXX.X.XXXXXXX.XXX.XXXXX.XXXXX.XXXXX.XXX.XXXXXXXXXXXXXXX.XoXXXXX.XXXXX",
".XoX.X.X.XXX.X.X.XXX.X.XXX.X.X.X.X.XXX.X.XXX.XXXXXXX.X.X.X.X.X.XXX.X.X.XXX.XXXXX.XXX.X.XXX.X.XXXXX.X.XXX.XXX.X.XXX.X.XXXXXXX.XXX.XXX.XXX.X.X.XXXXX.X.XXX.XXX.X.X.XXX.XoX.X.XXX.XXX.X.X.X.XXX.XoX.X7X'.7X XXX7X.X.X XXXXX7X.X.X7X.X7X.X.X.XXX.X.X XXX XXX7X.X.X7X.X.XXX.X.XXX.X.X.X.XXX.X.XXX.X.XoX.X.X.X.XXX.X.XXXXX.X.XXX.X.X.X.XXXXX.X.X.XXX.X.XXX.X.X.XXXXX.XXX.X.XoX.X.X.XXXXX.X.X.X.XXX.XXX.XXX.X.X.XXXXX.X.XXX.XXX.XXX.XXX.XXX.XXX.XXXXX.X.XXX.X.XXX.X.XXX.X7X.X.X.XXXXX.X.X.X XXXXX.X XXXXX.XXXXXXXXX.XXX.X.XXX.X.XXX.X.X.XXXXX.X.XXXXX.X.X.X.X7X7X.X'.7X7X.X.X.X7X.X.XXX7X X'.7XXXXX.X.X.XXX.XXXXX.X.X.X.XXX.X.XXX.XXX.X.XXXXX.XXXXX.XXX.X.XXX.XXXXX.XXXXX.XXX.X.XXXXX.X.X7X.X.XXXXX.XXX7X'..X.X.X.X.X X'.7X.X7XXXXX X7X.XXX.X.X.XXXXX.XXXXXXX.XXXXXXX.XXX.X.X.XXXXX.X.XXXXXXX.XXXXX.XXX.X.X7X.X.X.X X7X.X.X7X.X.X'.7X.XXX.X.X.X.X.X.X.XXX.X.XXXXX.X.X7X.X7X.X.X.X7X.X7X7X.X'.7X7X.X.X.XXX.X.X.X.XXXXXXXXX.XXX.XXX.XXXXX.X.XXX.X.XXX.XXX.X.XXX.X.XXX.X.X.XXX.XXXXX.XXX.X.X.XXX.X.XXX.XXX.XoX.XXXXX.XXX.X.X.X.X.XXX.X.XXX.XXX.XXX.X.X.XXX.XXX.X.XXXXX.XXX",
".X.X.X.X.X.X.X.XXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.XXX.X.X.X.X.X.X.X.X.X.X.X.XXX.X.X.X.X.X.X.X.X.X.X.XXX.X.XXX.X.X.X.X.X.X.XXX.X.X.X.X.X.X.X.X.X.X.XXX.X.X.X.X.X.XXX.X.X.X7X.X.X.X.X.X.X.X.X.X7X.X.X.X.X.X.X.X.X.X.X.X.XXX X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.XXX.X.X.X.XXX.X.X.X.X.XXX.X.X.X.X.X.XXX.X.X.X.X.X.X.X.XXX.XXX.X.X.X.X.X.X.X.X.X.X.X.XXX.X.X.X.X.X.XXX.X.X.XXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X7X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.XXX.X.X.X.XXX.X.X.X.X.X.X.X.X.X.X'.7X.X.X.X.X.X.X.X.X.X.X X7X X.X.X.XXX.X.X.X.X.X.XXX.X.X.X.X.XXX.X.X.X.X.X.X.XXX.X.X.X.X.X.X.X.XXX.X.X.X.XXX.X.X.X.X.X7X.X.X.X7X.X.X.X.X.X.X.X7X.X.X.X.X'.7X XXX.X.X.XXX.X.X.X.X.X.X.XXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X7X.X.X.X.X.X.X XXX.X.X.X.X.X.X.XXX.X.XXX.X.X.X.XXX.X.X.X.X.X.X.X.X.X.X.X.X X7X.X.XXX7X XXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.XXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.XXX.X.X.XXX.X.X.X.X.X.X.XXX.X.X.X.X.XXX.X.X.X.X.XXX",
".X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X'..X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X XXX.X X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X X X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.XXX'. XXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.XXX X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X'..X.X.X.X.X.X XXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X'..XXX X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X",
".X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.XXX.X.XXX.X.X.X.X.X7X.X.X.X.X.X7X.X7X.X.X.X.X.X.X.X.X.X7X.X.X.X7XXX.X.XXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X7X.X.X.X.X.X7X.X.X.X X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.XXX X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X X X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X X.X XXX.X.X7X X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X7X.X.X.X.X.X.X.X.X.X.X.X X X X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X",
".X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X X.X.X.X.X.X.X.X X.X.X X.X.X.X.X.X.X.X X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X}..X.X}..X.X.X.X.X'.'.7X.X.X.X'..X'.'..X.X.X.X'..X.X.X'..X.X.X'. X XXX X.X.X.X X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X X.X.X X.X.X.X.X X.X.X.X.X.X.X.X X.X.X X.X.X.X.X.X.X}..X.X.X.X.X.X.X.X.X.X.X X.X.X.X.X.X.X.X X.X.X X.X.X.X.X.X X.X.X.X.X.X.X.X.X'.'.7X.X.X.X'.XX XXX X.X X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X X.X.X.X.X.X.X.X.X.X.X.X.X.X.X'..X XXX.X.X.X.X.X.X X.X.X X X.X.X.X.X.X.X X.X.X.X.X.X X.X.X.X.X.X.X.X X.X.X.X.X.X.X.X.X X.X}..X.X X.X.X.X.X.X.X.X'..X.X.X.X'..X.X.X.X X.X.X.X.X.X.X.X X.X.X.X X.X.X.X.X.X.X.X X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X X.X.X.X.X.XXX.X X XXX.X'..X.X.X.X.X.X X.X.X.X.X.XXX'..X.X.X.X.X.X.X'.'..X.X.X X.X.X.X X X.X.X XXX.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X.X X.X.X.X X.X.X.X.X.X.X.X X.X.X.X.X.X X.X.X X.X.X.X X.X",
" X.X X.X X.X.X X X.X.X}.}..X.X.X.X X X.X.X.X X.X.X.X.X.X.X.X}..X.X X.X X.X.X X.X.X.X X.X X.X.X X.X X.X X X.X X.X.X X.X X.X.X X.X.X}..X}..X.X.X.X X.X}..X.X X.X.X X.X.X.X}.}..X.X.X.X.X}..X.X.X.X X.X.X X.X X X.X X.X.X X X.X.X.X.X.X X.X X.X X.X X.X.X X X.X.X X.X X X.X.X.X X.X X.X.X X.X X XXX.X.X X.X X.X X.X.X X X.X}..X.X.X X.X.X X.X.X X X X.X X.X.X X.X X.X.X X.X.X X.X X.X X.X.X X.X X.X X.X X.X.X X.X X.X.X X.X.X X.X.X X X X.X X.X.X X X.X X.X.X X.X X.X.X X.X X.X X.X X.X.X X X.X.X X X.X.X X.X X.X.X.X.X X.X X.X X X X.X X.X.X.X X.X X.X.X.X}.}..X.X.X X.X X.X X.X.X X.X X.X X.X X.X.X.X X X.X X.X.X X.X X.X X X.X X.X.X X.X X.X.X X.X X.X X.X X.X.X.X.X X}. X.X X.X.X X.X X.X.X X.X X.X X.X.X X.X X.X.X X.X.X X.X X.X.X X.X.X X.X.X X X X.X X.X.X X.X X.X.X X.X X.X X.X.X X.X X.X.X.X.X.X.X.X.X.X.X.X X X X.X X.X.X X.X X.X.X X.X X.X X.X.X X.X X.X.X.X}.}..X.X.X.X.X.X}..X.X X.X X.X X.X.X X.X X.X.X}..X.X.X.X}..X X.X.X X.X X.X.X X.X.X X.X X X.X X.X.X X.X X.X.X X.X.X.X.X X X.X X.X.X X X X.X X.X.X X.X X.X.X X X X.X X X.X X.X X.X.X X.X.X X.X",
" X X X X X X X X X X.X.X.X.X}..X X.X X X X X X X X.X}.}.}.}..X.X X X X X X X X X X X X X X X X X}..X X X.X X X X X X X X X X X X.X}..X X.X}..X}. X X X.X X X X X.X}.}..X.X.X.X}.}..X}..X.X}.}..X X X X.X X.X X X X X X.X X.X}.}. X X X X X X X X X X X X X X X X X.X X X X X X X X X X.X X X X X X X X X X X X X X.X X X.X.X}.}. X X X X X X.X X.X X X X X X X X X X X X X X X X.X X X X X X X X.X X X X X X X X X X X X X X X X.X X.X X X X X X.X X X X X X X X X X X X X X X X X X X X X X X X X X X.X X X X X X X X X X X X X X X X X X X X X.X}.}..X.X.X.X}. X.X X X X X X X X X X X.X X X X X X.X X X X X X X X X.X X.X X X X X X X X X X.X X X X X X X X X.X X.X.X.X X X X X X X X}..X.X}.}. X X X X X X X X X X X X X X X X X X X X X X X.X X.X X X X X X X X X X X X.X X X X X X X X X X.X'..X'.'..X.X'. X.X X.X X X X X X X X X X X X X.X X X X X X X X}..X.X.X.X}.}..X}..X X.X X X X X.X X X X X X X X.X}..X}. X X.X.X X X X.X X X X X X X X.X X.X X X X X X.X X X X X X X X X X.X X X X X X.X X.X X X X X X X X X X.X X.X X X.X X X X X X X X X X X X",
".X X.X X X.X X.X X.X}..X}..X}.}. X X X X X X.X X X X}..X.X.X.X}. X X.X X X X X X.X X X.X X X X.X X.X.X X X X X X X X.X X X X X X.X.X.X}..X X X X.X X X X.X X X.X X X X X.X.X.X}.}..X}..X.X}..X}. X X X X X X X X X.X X X X X.X.X X X X X.X X X X X.X X.X X X X X X X X X X X X X X X X X X X X X X X X X.X X X X X X.X X X X.X.X X X.X X X X X X X X X X X X.X X X X X X X X X X X X X X.X X X X X X X X X X.X X X X X X X X X X X X X X X X X.X X X X X X X.X X X X X X.X X X X X.X X.X X X X X X X X X X X X X X X X X X.X X X.X X X X.X X X.X X X X X.X.X.X}. X X X X.X X X X.X X X X X X X X X X X X X X X X X X X X X X.X X X X X X X X X X X X.X X X X X X X X X X.X X X.X X.X}..X}..X}..X X X X X X X.X X X X X X X X X X X X X X X X X X X X X X X X X.X X X X X X X X X X X X.X X X X X.X.X'..X.X.X.X'. X X X X.X X X X.X X X X X X X X X X X X.X X X X.X X X X.X.X.X.X}. X X}. X}. X X X.X X.X.X X X X.X.X.X}.}.}..X}. X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X.X X.X X X.X X X.X X X.X.X X X X X X X X.X X X X X X",
" X X X}. X X X X X X X X.X}. X X X X X X X X X X X X X X X X.X}. X X X X X X X X X X}. X X X X X X X}. X X X X X X X X X X X X X}..X}..X X X X X X X X X X X}. X}..X}..X}.}..X}..X}..X}. X X X X X X X X X X X X X}. X X X X}..X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X}..X}.}..X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X}. X}..X}..X}.}..X}. X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X}. X X X X X X X.X}..X}. X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X'..X.X.X.X'..X.X X X X X X X X X X X X X X X X X X X X X X X X X}..X}..X}.}.}.}..X X X.X X X X X}. X X}.}. X X X}..X}..X.X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X}..X}.}. X X}. X X X}. X X X X X X X X X X X X X",
"}. X}. X}. X}.}. X X X X X X}. X}. X X}.}. X X}. X X}. X}.}.}..X X X X X X X X}. X X}. X}. X X X}. X}..X}.}.}. X X X X X X X}. X}.}.}.}.'. X X X X'.}..X}.}.}. X X X}. X}.}.}..X.X}.}..X X X X X X X X}. X}. X}.}. X X}.}.}. X}. X X X}.}. X}.}. X X}. X X}. X X X X}. X X X X X X}. X X X}. X}. X X}. X X X X X}.}. X X X}..X}.}. X X}. X X}. X}. X X X}. X X}. X X X}. X X X X X}. X X X X X X X X}. X}.}.}. X X X X}. X X X X}. X}. X X X}. X}. X X}. X X X X X X X}.}. X}.}. X X}. X X}. X X X}. X}. X}. X}. X X X}. X}. X}. X'.}..X}.}.}. X X X}. X}.}.}..X X}. X}. X X X X X}. X}. X X X}. X X X X}. X}. X X X X X X X X}. X X}. X X}. X X X X X X X}.}. X X X}.}.}.}. X}. X}. X X}..X}.}. X}. X X}.}.}. X X}. X}. X X X X X X X}. X}. X X X X}. X X X X X X X}. X X X X X X X X X}. X X X X X X X'..X'..X}. X}. X X X X X}. X X}. X X X X X X}. X X X}. X}. X}. X X X X X X X.X}.}..X}. X}. X}. X}. X X}..X}.}.}. X}. X X X X X}. X}. X}. X X X}. X}. X X X X X}. X}. X}. X X X}. X}. X X X X X X X X}. X}. X}..X}. X X X}. X}..X}.}.}. X X X X X X}. X}.",
"}. X X}. X X X X'. X}.}.}. X}. X X}.}. X X}.}. X}. X}.}. X}.}.}.}.}.}.}. X}. X}.}. X X}.}. X}.}.}.}. X}..X}. X X}.}.}.}. X}.}. X}. X}..X X X X'. X X}.}.}.}. X X}.}. X X}..X}. X}.}. X}.}.}.}. X X}. X}. X}.}. X X}. X}..X}.}. X X}.}. X X X X X}. X X}.}. X X}. X}.}. X}.}.}.}. X X X}. X}.}. X}. X}.}.}.}.}.}.}. X}.}. X}.}.}. X X}. X X}. X}. X}.}.}. X}. X X X}.}. X X}.}. X X X}.}.}.}.}.}.}. X X}. X.X}. X X}. X}.}.}.}. X X X}. X X}.}. X X}.}. X}.}.}.}. X}.}. X X X X X}. X X}.}. X}. X X X X X X}.}. X X X X}. X}.}. X X X}.}.}.}. X X}.}. X X}..X}. X X}.}. X}.}.}.}.}. X X}. X}.}. X}. X}. X}.}. X}.}.}.}.}. X}.}. X}. X X}.}. X}.}.}.}.}.}. X}. X X X}. X}..X}. X}.}. X X X}.}..X}.}. X X}..X}.}. X X X X}.}.}.}. X X}. X}.}. X}. X}.}. X}.}.}.}.}.}. X}. X}.}.}.}.}.}.}. X X}.}. X}.}.}. X.X'..X'. X X X}.}.}.}.}. X}. X}.}.}.}. X}.}. X X}. X X}. X X X}.}.}.}.}. X}.}.}.}. X X X X X}. X X}.}. X}.}.}..X}. X}.}. X}.}. X X}.}. X X}. X}. X}.}.}. X}. X}. X}.}. X X}.}. X X}.}.}.}.}.}.}.}. X X}.}..X X}.}. X}.}.}.}. X}.}. X X}.}.}.}.}. X X X X",
"}. X X X X}.}.}.}.}. X}. X}. X}. X X X X X X X}.}.}. X}.}. X X X X}.}. X X}.}. X X}.}. X X}.}.}. X}..X}.}. X}. X X}. X}.}. X X}. X}. X X X X X X X}. X}..X}.}.}. X}. X}.}.}. X}.}.}.}. X}. X X X X}.}. X}. X X}.}.}.}..X X}. X}. X}. X}. X}. X}. X X}.}. X X X}.}. X X}.}. X}. X}. X}. X}. X X}.}. X X}. X X X X X}..X}.}.}.}. X}. X}. X X}.}.}.}. X X}. X}. X}.}. X X X}. X X}.}.}. X X X X X}. X}.}. X}.}. X}.}. X}. X}. X}. X}. X X}.}. X X}. X X X X X}. X}. X}. X}. X}. X}. X X}.}. X X X}. X X}. X X}. X}. X}.}. X X}.}. X X}. X}..X}.}.}. X}. X}.}.}. X}. X}.}. X X}.}. X}. X}. X}. X X X}. X X}. X X}. X}. X}. X}. X X}. X}.}. X X}. X}. X}. X X X X}.}.}. X}. X}.}. X X X}. X X X X}.}.}. X.X}.}.}. X}. X X}. X}. X X}.}. X X X X X X}. X}. X X X X X}. X}.}. X X}.}. X X}. X}. X X}.}.}. X X X'. X.X'. X}.}.}.}..X}. X}. X}. X X}. X X}. X X}.}. X X}.}.}.}.}.}. X}. X}. X}.}.}. X}.}.}.}. X}.}. X X X}.}.}. X X}. X X X}.}. X X}.}. X}. X}. X}.}.}.}. X X}. X X}. X}.}. X X}. X}. X}.}. X}. X}. X}.}. X}.}. X X}. X}. X}..X}. X X}. X X}. X}. X X}. X",
"}.}.}. X}. X}.}.}.}.}.}.}. X'. X}.}.}. X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}. X}.}. X}.}.}.}.'. X}. X X}.}.}.}.}.}.}. X X X}.}.}.}.}.}.}.}.}.}.}.}.'. X}.}.}.}. X}.}. X}.}.}.}.}.}.}. X}. X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}. X}.}. X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}..X}.}.}.}.}. X}.}. X}.}.}.}.}. X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}. X}.}. X}.}.}.}.}.}.}.}. X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}. X}. X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}. X}. X}.}.}.}.}.}.}. X X X}.}.}.}.}.}.}. X}.}. X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}. X}.}. X}.}.}.}.}.}. X}.}. X}.}.}.}.}.}.}.}.}.}. X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}. X}. X}.}.}.}. X X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}. X}.}. X}.}. X}.}.}.}.}.}.}. X}.}.'. X X.X'. X}. X}.}.}.}. X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}. X X}.}.}.}. X}.}. X}.}.}.}.}.}. X X}.}.}.}.}.}. X X}.}.}.}. X}.}. X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}. X}.}. X}.}.}.}.}.}.}.}. X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}. X}.}.}.}.}.}.}.}.",
"}.}.}.}.}.}.}.}.'. X X'. X'. X X}.}.}.}.}.}.}.}. X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.'.}.}.}.}.}.}.}.}. X X'. X'. X X'.}.}.}.}.}.}.}.}.}.}.}.}.'. X}.}.'.}.}.}. X X'. X}.}.}.}.}.}.}.}.}.}.}.}.}.'. X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}. X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}. X}.}. X X}.}. X}.}.}.}.}. X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}. X}.}.}.}.}.}.}. X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}. X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}..X X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}. X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}. X}.}.}.}.}. X'.}.}.}.}.}.}.}.}.}.}.}. X}.}.}. X}.}. X X X X X}. X}.}. X X}. X X}.}.}.}.}.}.}.}.}.}.}.}. X'. X}.}.'. X}.}.'. X}.}. X'.}.}.}.}.}.}.}.}.}.}.}.}.}. X'. X X'. X'. X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}. X'. X'.}.}.}.}.'.}.}.}.}.}.`.}.}.}.}.}.}.}.}.}.}.}.}.}.}.'.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.'.}.}.}.}.}.}.}.'.}.}.}.}.}.}.}.}.",
"}.}.}.}.'.}.}.}. X'.'. X'. X'. X}.}.'.}.}.}.}.'.'. X'.}.'.}. X'.}.}.}.}.}.}.}.}.'.}.}.}.}.'.}.}.}.}.'.}.}.}.}.}.}.}.}.}.}.'.}.}.'. X X'. X'. X'.}.}.}.'.'.}.}.}.}.}.}.}. X'.'. X}.}. X'.'. X X'.}.}.}.}.}.'.}.}. X'.'. X}.}.'. X}.}.}.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.}.}.}.}.}.}.'.}.'.}.}.'.b.v.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.v.b.c.c.c.(.'. X'.}.}.}. X'.}.V.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.C.}.}.}.}.(.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.v.b.c.c.c.c.V.}.'.}.}.}.}.'.}.}. Xv.c.c.c.c.b.%.c.c.c.c.b.%.c.c.c.c.c.c.c.V.'.}.}.'.}.}.}.(.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.M.V.}.'. X'. X}.'..XP.c.c.c.c.c.c.c.c.c.c.c.c.c.c.c.b.c.V.V.V.M.C.C.C.C.L.L.L.P.(.(.).}.'.}.}.}.}.}. X}.'.}.}.'. X'. X'. X X'. X'.'. X'.'. X X}.}.}.'.}.}.}.}.`.}.}.}.'. X'. X X'. X'.'.}.}.}.}.'.}.}.}.}.}.}.}.}.'.}.}.}.}.'.'. X'. X}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.}.'.}.}.}.}.}.}.}.}.'.}.}.}.}.}.'.}.}.}.}.'.}.}.}.}.}.}.}.}.'.}.}.}.}.}.}.}.}.}.}.'.}.}.",
"}.}.'.}.'.}.'.}.'. X X'. X X'.'.}.}.}.}.}.}.}.}. X'. X'. X X'.}.}.}.}.}.}.}.}.}.'.}.'.}.}.}.}.}.}.}.}.}.}.'.}.}.}.}.}.}.}.}.}.}. X'.'. X'.'. X X'.}.}.}.}.}.}.'.}.}.}.}.'. X X'. X'.'. X X'.'. X}.}.}.'.}.}.}.'.}.}.'.}.}. X}.'.}.}.}. (.'.}.}.).}.}.'.}.}.}.P. P. X'.}.}.'. X'. X}.O d X}.}.}.}.. % }.}.}.}.'.}.}.}.'.(. V }.}.}.}.}.}.}.V. . : }.}.'.'.}.}. X'.V. : 8 c N $.V.L.).'.}.'. X'.'. X'. X'. X'. X X'.}.}. X'.'.}.}.}.}.}.}.}.}.}.}.}. X'.'. X'.'. X X}.}.}.'.}.}.}.'.}.}.}.}.}.}.}.}.'. X}.'. X'.'. X}.}.}.}.}.}.}.'.}.}.}.}.}.}.}.}.'.}.}.}.}.}.}.}.}.}.'.}.'.}.'.}.}.}.}.}.}.}.}.}.'.}.}.'.}.}.}.}.}.}.}.}.}.'.}.}.}.}.'.}.}.}.}.}.",
"}.}.}.'.}.}.}.'. X'.'. X'.'. X'.}.'.'.}.'.'.}.'.'.}.'. X'.'. X'.`.}.}.}.`.}.}.'.}.}.'.}.}.}.'.}.}.'.}.'.}.}.}.}.}.'.}.'.}.'.}.'.'.'. X'.'. X'.'.}.'.}.'.}.'.}.}.'.}.'.'. X'.'. X'. X'.'.'.'. X'.}.}.'.}.'.}.'.}.}.'.}.}.'.'.'.}.}.}.}. L.}.}.}.}.}.'.}.}.'.}.C.. P.'.}.'.}.}.'.}.'.}.+ 8 }.}.}.}.}.6 (.}.'.}.'.}.'.}.}.V. b.'.}.}.'.'.}.}.V. : }.}.'.}.}.'.}.'.M. 6 b.(.'. X'.'.'.}.'.'. X'.'. X}.'.'.}.}.'.}.'.}.}.}.}.`.}.}.`.'. X'.'.'. X'.'.}.'.}.'.}.'.}.}.'.'.}.}.'.}.'.}. X'.'. X'. X'.'.'.}.'.}.}.'.}.}.}.'.}.}.}.}.`.}.}.'.'.}.}.'.}.'.}.'.}.}.}.}.}.}.`.}.}.}.}.'.}.}.}.}.'.}.'.}.'.}.}.'.}.'.}.}.}.'.}.}.}.'.}.'.}.'.",
"}.'.}.'.'.'.}.'. X'.'.'.'.'.'. X'.}.'.'.'.'.'.}.'.'.}.'.}.'.}.'.}.'.}.'.}.'.'.}.'.'.}.'.}.'.}.'.'.}.'.}.}.'.'.'.}.'.}.'.`.}.}.'.'.'.'.'.'. X'.'.'.}.'.}.'.'.}.'.'.}.'.}.'.'.}.'.'.'. X'.'.'. X'.'.}.'.'.'.}.'.'.}.'.'.}.'.'.'.'.}.'.}. v.'.}.'.'.}.'.'.}.'.}.c. P.'.'.}.'.'.}.}.'.'.# 6 '.}.}.}.`.Z C.'.}.'.'.'.'.}.'.Z L.}.}.'.'.}.'.}.N. : }.'.}.'.}.'.}.'.M. c P. X'.'. X'.'.'.'.'.'.'. X'.'.'.}.'.}.'.}.'.}.}.'.}.`.'.'.'. X'. X'.}.'.}.'.'.}.'.}.'.}.'.'.}.'.}.'.'.'.'.'. X'.'.'. X`.}.}.}.'.}.'.}.}.'.}.'.}.'.'.}.'.}.'.}.'.}.'.}.}.'.'.'.'.}.}.'.}.'.}.'.'.}.}.'.'.'.}.'.}.'.}.'.'.}.'.}.'.'.}.}.'.}.'.}.`.}.}.'.",
"'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.}.'.'.'.'.'.'.'.'.'.}.'.'.'.'.'.'.}.'.'.'.'.'.'.'.'.'.'.'.}.).'.'.'.}.'.'.'.'.}.`.'.'.'.'.'. X'.'.'.'.'.'.'.'.}.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.}.'.'.'.'.'.'.}.'.'.'.'.}. Z '.'.'.'.'.'.'.'.'.}.Z X P.'.'.'.'.'.'.'.'.'.X a '.'.`.}.}.B. Z '.'.'.'.'.'.'.'.c . '.'.'.'.'.'.'.}.V. : }.'.'.'.'.'.'.'.M. X Z '.'.'.'.'.}.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.`.}.'.}.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.}.}.`.`.'.'.}.`.'.'.'.'.'.}.'.'.'.'.'.'.'.'.'.'.'.'.'.}.'.'.'.'.}.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.}.`.'.'.",
"'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.}.`.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.`.}.`.}.'.`.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.`. c '.'.'.'.'.'.'.'.'.'.b L.'.'.'.'.'.'.'.'.'.+ 6 '.'.'.'.`.P. b '.'.'.'.'.'.'.).# 6 '.`.}.'.'.'.'.}.V. : '.'.'.'.'.'.'.'.M. c (.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.`.}.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.`.}.`.}.`.}.`.}.'.'.'.'.'.'.'.'.'.'.`.'.'.'.'.'.'.'.'.'.'.'.'.'.`.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.}.`.'.'.'.'.'.'.'.'.'.'.'.'.'.'.",
"'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.`.}.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.}.`.}.`.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.`.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.}. 2 '.'.'.'.'.'.'.'.'.'.8 X P.'.'.'.'.'.'.'.'.'.+ 6 '.'.'.'.}.}.% % '.'.'.'.'.'.'.(. V '.'.`.'.'.'.'.}.V. : '.'.'.'.'.'.'.'.M. 6 ).'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.`.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.}.`.}.`.}.`.}.`.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.`.}.).'.'.'.'.'.'.'.'.'.'.'.'.'.",
"'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.`.'.`.}.}.`.`.}.`.}.}.`.}.}.`.}.`.}.`.`.}.`.}.`.}.}.`.`.`.}.`.`.}.`.}.`.}.}.`.}.}.`.`.`.}.`.}.`.}.'.'.'.'.`.'.'.`.}.}.`.'.}.`.}.}.}.`.`.}.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.`.'.'.'.'.`.}.`.}.`. . '.'.}.`.}.}.`.`.'.).$ P.'.'.'.'.`.'.'.'.`.+ 8 }.'.}.`.}.}.d (.'.'.'.'.'.'.B. v.'.`.}.'.'.'.`.'.V. : }.`.'.}.`.`.`.}.M. d '.}.'.'.'.'.'.'.'.'.'.'.'.'.`.'.'.'.`.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.`.`.`.}.`.}.`.}.}.`.`.}.'.`.`.}.`.}.`.}.}.`.`.`.}.`.`.}.`.}.`.}.'.`.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.'.`.'.'.'.'.'.'.'.'.'.'.'.`.'.'.'.'.`.'.'.'.'.",
"`.'.'.`.'.'.`.'.`.'.'.'.`.'.`.'.'.'.`.`.`.}.`.`.`.`.`.`.`.`.`.`.`.}.`.`.}.`.`.`.`.`.}.}.`.}.`.`.`.`.`.`.`.`.`.`.}.`.}.`.`.`.`.`.`.'.`.'.'.`.'.'.`.`.'.`.`.'.`.`.`.`.}.`.`.`.'.`.`.'.`.`.`.'.`.`.'.'.'.'.`.'.`.'.`.'.`.'.`.'.`.`.}.`.`. P.).`.'.`.`.`.'.'.). P.`.'.`.'.`.'.'.`.}.+ 6 `.'.`.`.`.`.$. C.'.`.'.`.'.`.Z P.'.`.}.'.'.'.'.`.V. : '.'.`.`.}.}.`.}.:. $.}.`.'.`.`.'.'.'.'.'.'.`.'.'.`.'.'.'.`.'.`.'.'.`.'.'.`.'.'._.'.`.'.'.'.`.'.}.}.`.`.}.`.`.'.`.`.}.`.`.}.`.`.`.`.`.`.`.}.}.`.}.`.}.`.`.`.`.`.'.'.`.'.`.`.'.'.`.'.'.`.`.'.`.'.`.`.'.'.`.'.`.'.'.`.'.'.`.`.'.'.`.'.'.`.'.'.'.`.'.`.'.'.'.`.'.'.",
"'.`.`.'.`.`.`.`.`.'._._.`.`.`.'.`.`.'.`.`.'.`.`.`.`.`.`.`.}.`.`.`.`.}.`.`.`.}.`.`.`.`.`.`.`.`.`.`.`.`.`.}.`.`.`.`.`.`.`.`.`.`.`.`.'.`.'.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.'.`.'.`.'.`.`.`.'.`.'.`.'.`.'.`.`.`.`.'.`.'.`.'.'.`.`.`.}.`.'.`. C.'.`.`.`.`.`.}.`.P. P.'.`.`.`.`.`.'.'.`.+ 6 '.`.`.}.`.`.C. $.'.'.'.`.`.'.d O `.'.`.`.`.`.`.`.'.B. : `.`.`.`.`.`.}.`.M. C.`.'.`.'.'.`.`.'.'.`.`.'.`.`.`.`.'.`.`.`.'.`.`.`.`.`.'.`.`.`.`.'.'._._.'.`.`.}.`.`.`.`.`.`.`.`.`.`.'.`.`.`.`.`.`.`.`.}.`.`.`.`.`.`.`.`.`.`.`.'.`.'.'.`.`.`.'.`.`.'.`.`.`.`.'.'.`.`.'.'.`.`.`.'.`.'.`.`.`.`.`.`.`.'.`.`.'.`.`.`.`.`.'.`.`.",
"`.`.'.`.'.`.'.`.'.`.'.'.`.}.`.`.'.`.`.`.`.`.`.}.`.`.}.`.`.'.`.`.`.`.`.`.`.`.`.`.}.`.`.}.`.`.}.`.`.`.}.`.`.`.`.}.`.`.}.`.`.`.}.`.`.'.`.`.`.'.'.`.`.`.}.`.'.`.`.`.}.`.`.'.`.`.`.`.`.'.`.'.`.`.'.`.`.`.`.'.'.`.`.`.`.`.`.`.}.`.`.`.`.'.`. %.}.`.'.}.`.`.`.`.C. P.`.`.'.'.'.`.`.`.`.+ a '.`.`.`.`.`.(. b '.'.`.'.'.).O 6 `.`.`.'.`.'.'.`.'.B. : `.`.'.'.`.`.`.`.:. 8 `.`.`.'.`.'.`.`.`.`.'.`.`.'.'.`.`.`.'.`.`.`.`.`.'.`.`.'.'.'.`.`.`.'.'.'.`.`.`.`.`.`.`.`.`.`.`.}.`.`.`.`.`.`.`.}.`.`.`.`.`.`.}.`.`.`.`.}.'.`.`.`.`.`.'.`.`.`.`.'.`.`.'.`.`.`.`.`.'.`.`.`.'.`.`.`.'.`.'.`.'.'.`.'.`.'.`.`.`.'.'.`.'.`.`.'.",
"`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`._.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`. V `.`.`.`.`.`.`.`.%. P.`.`.`.`.`.`.`.`.`.+ 6 `.`.`.`.`.`.'.2 : _.`.`.`.`.P. C `.`.`.`.'._.'._._.N. : `._.'._.'.`.`.`.M. C.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.'.`.'._.'._.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.",
"`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`. d `.`.`.`.`.`.`.).Z P.`.`.`.`.`.`.`.`.).+ 6 `.`.`.`.`.`._.b (.`.`.`.`.M. M.`.`.`.`._.'._.'.`.B. : `.`.`.`.`.`.`.`.:. b `.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`._._.'.`.`._.'.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`._.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.",
"`.`._._.`.`._._._.`._.`.`._._.`.`._.`.`.`.`.`.`.`.`.`._.`.`.`.`._.`.`._._.`.`._.`.`._.`.`._.`.`.`.`._._.`.`._._._.`._.`.`.`.`._.`._.`._._.`.`.`.`.`.`.`.`._.`.`.`.`.`._._.`.`._.`.`.`.`.`._._.`.`.`.`.`._.`.`.`.`.^.`.`.`.`.`.`.`.`.`. : _.`._.`.`.`.`.`.b L.`._._.`._.`.`.`.`.+ 6 `.`._._.`.`.`.%. C.`._._.`.C P._.`.`.`._.`._._._.B. : `._.`.'._.`._.`.:. ~._.`.`.`._.`._._.`._.`._._.`._.`.`.`.`._._.`._.`.`.`._._.`._._._._._.`._.`.`.`._.^.`.`.`.`.`.`.`.`.`.`.`.`._.`.`._.`._.`.`.`.`._.`.`.`.`.`.`.`._._.`.`.`.`.`.`.`.`.`.`._.`.`._.`.`.`._.`.`._.`._._.`.`._.`.`._.`.`._._.`._.`.`._._.`.",
"_.`.`.`.`._.`.`.`._.`.`._.`._.`._.`._._.`._.^.`.`.`._.`.`._.^.`.`._.`.`.`.`._.`._._.`._._.`._._._.`.`.`.`._.`.`._.`.`.`._._.`.`.`._.`.`._.`._.`.`.`.`.^.`.`.`._.`.^.`.`.`.`._.`._._.`.`.`._.`.`.`._._.`.`._._.`.`.`.`.`.^._.`._.`.`.`. _.`._.`._.^.`.`.4 P.`._.`.`._.`._.`.`.+ 6 `.`.`.`._.`._.L. $.`._.`.`.6 + _.`._._.`._.`.'._.`.B. : `.'._._.`._.`._.M. v.`.`._.`.`._.`.`._.`._.`.`._.`.`.`.`.`._.`.`._.`._.`.`.`._.`._.'.'._.`.`.`.`.`.`.`.`._.`.`.`._.`._.`.`._._.`._.`.`._.`._._.`._.`.`._._.`._._.`.`.`.`.`._._.`.`._._.`.`.`.`._.`.`._._.`.`._.`.`._.`.`._.`.`._.`._._.`.`._.`.`._.`._.`.",
"`.`._._._.`.`._._._.`._._.`._._.`._._.`.^.`.`.`.^.`._.`._.`._.`._._._.`._.`._.`.`._.`._.`._._.`.`._.`._._.`._._.`._._.`._.`._.`.`._.`._.`._._.`.`._._.`._._._.`._.`.^.`.`._.`._._._.`._.`._.`._._.`._.`._._.`._.`.^._.`._._.`._.`._.`. K.`.`._.`._.`.`.+ K.`._._.`._._.`._.`.+ 6 _._.`._.`._._.~.. b `._.`._.. d _.`.`.`._._._.`._.`.N. : _._._._._.^.`.`.M. N _._._.`._._.`._.`._._.`._.`._._.`._._._.`._.`._.`._.`._.`._._.`._.`.^.`._._._.`._.`.`._.`.`.^.`.^.`._.`._._.`._.`._._._._.`._.`._._._.`._.`._.`._._._._.`._._._.`._._._.`._._.`._._._.`._.`._.`._._._.`._._.`._.`._._._.`._._._.`._.",
"_._._._._._._._._._._._._._._._._._._._.^.`.^.`.`._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._.`.`.^.`._.^.`._._._._._._._._._._._._._._._._._.`._.`.`.^._._._._._._._. B.^.`._._._._.~. K._._._._._._._._._.O d _._._._._._._._.8 : _._.`.K. Z _.^.`.^.`._.`._._._.N. : _._._._._.`.`.^.:. X + : _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._.`.^._._._._._._._._.^.`._._.`._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._.",
"_._._._._._._._._._._._._._._._._._._.`.`.^.`._.^.`._._._._._._._._._._._._._._._.^._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._.`.^.^.`.^._._.`._._._._._._._._._._._._._._._._._.^.^.^.`.`._._._._._._.`. $.`._._.^.^.`.K. P.^.`._._._._._._._.O 6 _._._._._._._._.V ~._._.:. N._.`.^.^._._._._._._.N. : _._._._._.`.^.`.>. N._._.K.%.2 ).`._._._._._._._._._.`._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._.^._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._.",
"_._._._._._._._._._._._._._._._._._._.^.^.`.^.`._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._.^._._._._._._._._._._._._.^.`.`.^.`._.^.^._._._._._._._._._._._._._._._._._.`.`._.^.`.^._._._._._._. N _._.^.`.`.^.B. K._.`.^.`._._._._._.O 6 _._._._._._._._.:. C._.`.V P._.^.`.`._._._._._._.N. : `._._._._.^.`.^.M. N._._.`.`.~.b K.~._._._._._._._._._.^.^.`._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._.`._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._.",
"^._._._._._.^._._._._._._._._._.`.^.`.`.^.`.^._.^._._._._._._._._._.^._.^._._._._.^._._.^._._._.^._._._._._._._._._._._.^._._._._._._._._._._._.^._._._._.^._._.`.^._._.`.`.^._._.^._._.^._._._._._._._._._._._._._.^._._._._.^._._._. 6 ^._.`.`.^._.%. K._._._._._._.^._._.O 6 ^.`._._.^._._._.P. $._._.5 $ `.^.`.^._._._.^._._._.N. 5 b b b b b b b b b b b b b b b C ^._._._._._._._.:. N.~._.^._._.~.+ >._._._.^._._.^._._.^._._._._.^._._._.^._._.^._._._._._._._._._._.^._._.^._.^._._.^.`.^._._.^.`.^._.^._._._._._.^._._._._._._._._._._._._._._._.^._._._._._._._._._._._.^._._._._._._._._._._._.^._._._._.^._._.^._._._.^._._._._._.",
"_.^.^.^._.^._.^.^.^._.^.^._.^.^.^.^.^.^.^.^._._._.^.^.^._.^.^.^.^.^._._._.^._.^._._.^._._._.^._._.^._.^.^._.^._.^.^.^._._.^.^.^.^._.^._.^.^.^._._.^.^.^._._.^._.^._.^._.^.^._.^._._.^._._._.^.^.^.^._.^.^._.^.^.^.^._._.^._.^._.^._.^. $ _._.^.^._.^.V P.^._.^.^.^.^._._.^.# 5 ^.^._.^._.^.^.^.^.+ b _.~.O d ^._._.^.^.`.^._.^._.^.N. %._.^.^.^._._._._._._.^._._._.^._._.^.^.^._.^.^._.:. N.^._._._.^.^.V $._.^._.^._._.^._.^._._.^.^.^._._.^._._.^._._._.^._.^.^._.^.^._.^._.^.^._._.^._.^._.^._.^._._.^._._._.^._.^._._._.^.^.^._.^.^._.^.^._.^.^.^.^.^._._._.^._.^._.^.^.^.^.^._._._.^.^.^.^._.^.^.^.^._._.^._.^._._.^._.^.^.^._._._.^.^.^.",
"^._._.^.^._._.^.^._.^._._.^._.^.^.`.^._._.^.^._.^._._.^.^._._.^._.^._.^.^._.^.^.^.^.^._.^.^.^.^.^._.^.^._.^.^._._.^._.^.^._._.^._.^.^._._.^._.^.^._._.^.^.^.^._.^.^._.^.^._.^.^.^.^.^.^.^.^.^._.^.^.^.^._.^._.^.^._._.^._.^.^._._.^._. W._.^._.^.^.b K._.^._.^.^._._.^.^.+ 6 ^._.^._.^.^.^.^.^.d 2 ^.K. { ^.^.^.^._.^.^._.^._.^.N. %._._.^._.^.^.^._.^.^.^._.^.^.^._.^._.^._.^._.^._.:. N.^.^.^.^.^._.%. C ^._.^.^._.^._.^.^.^.^.^._.^.^.^.^.^.^.^._.^.^.^.^.^._.^.^._.^.^._.^._._.^.^._.^._._.^.^._.^.^._.^.^._.^.^.^.^._.^.^._.^._._.^._.^.^._._.^._.^._.^.^._.^.^.^._._.^._.^._.^.^._._.^._.^._.^.^._._.^._.^.^._.^._._.^.^._.^._.^._._.^.",
"^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^._.^.^.^.^.^._.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^._.^.^.^.^.^.^.^.^.^.^.^._.^.^._.^.^._.^.^._.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^. K.^.^.^.^.^.> K.^.^.^.^.^.^.^.^.^.O 6 ^.^.^._.^._.^.^.^.Z Q.%. N.^._.^.^.^.^.^.^.^.^.^.N. %.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.:. >.^.^.^.^.^.^.C. V ^.^.^.^.^.^._.^._.^.^.^._.^._.^.^._.^.^.^.^.^._.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.",
"^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^._.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^. :.^.^.^.^.^.+ K.^.^.^.^.^.^.^.^.^.O 6 ^.^.^.^.^.^.^.^.^.>. C.V W._.^.^.^.^.^.^.^.^.^.^.N. %.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.:. >.^.^.^.^.^.^.H. b ^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^._.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.",
"^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^. $.^.^.^.^.W. K.^.^.^.^.^.^.^.^.^.O 5 ^.^.^.^.^.^.^.^.^.W. %.4 $ ^.^.^.^.^.^.^.^.^.^.^.^.>. %.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.:. N.^.^.^.^.^.^.K. f ^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.",
"^.^.^.^.^.^.^.^.^.^.^.!.^.^.!.^.!.^.^.^.^.!.!.^.^.^.!.^.!.^.^.^.^.!.^.^.^.^.^.^.!.^.^.!.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.!.^.^.^.^.!.^.!.^.^.^.^.^.^.^.^.^.^.^.^.^.!.!.^.^.!.^.!.!.^.^.^.^.^.^.^.^.^.^.^.^.^.!.^.^.!.^.^.^.^.^.^.^.^.^. B ^.!.^.^.H. K.^.^.!.^.!.^.^.^.^.O 5 ^.!.^.!.^.^.^.^.^.^.$ b b ^.^.!.^.^.!.^.^.^.^.^.^.>. %.^.^.!.^.^.!.^.^.^.^.^.^.^.^.^.^.!.!.^.^.^.^.^.^.;. >.^.^.!.^.^.^.J. d ^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.!.^.^.^.^.^.^.!.^.^.!.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.^.!.^.^.^.^.!.^.!.^.^.^.^.^.^.^.^.^.^.^.^.^.!.!.^.^.!.^.!.!.^.^.^.^.^.^.^.^.^.^.^.^.^.!.^.^.!.^.^.^.^.^.^.^.^.^.^.^.!.^.^.^.^.^.^.^.^.^.^.",
"^.^.^.!.^.!.^.^.!.^.^.^.^.^.^.^.^.^.^.!.^.^.^.^.^.^.^.^.^.^.^.!.^.^.!.^.^.^.!.^.^.^.^.^.^.!.^.^.!.^.!.^.!.^.!.^.^.!.^.!.^.^.!.^.^.^.^.^.^.!.^.!.^.!.^.!.^.!.^.^.^.^.^.^.^.^.^.^.^.^.^.!.^.!.^.!.^.!.^.^.^.!.^.^.^.^.!.^.^.^.!.^.^.^.^. 5 ^.^.^.^.>. J.^.^.^.^.^.^.^.!.^.O 5 ^.^.^.^.^.^.^.!.^.^.b . { ^.^.^.!.^.^.^.^.!.^.^.^.>. =.!.^.^.!.^.^.^.^.!.^.!.^.!.^.^.^.^.^.^.^.^.!.^.^.:. >.^.^.^.^.^.^.K. a ^.^.!.^.^.^.!.^.!.^.!.^.!.!.^.!.^.^.^.!.^.^.^.!.^.^.^.^.^.^.!.^.^.!.^.!.^.!.^.!.^.^.!.^.!.^.^.!.^.^.^.^.^.^.!.^.!.^.!.^.!.^.!.^.^.^.^.^.^.^.^.^.^.^.^.^.!.^.!.^.!.^.!.^.^.^.!.^.^.^.^.!.^.^.^.!.^.!.^.!.^.^.^.!.^.^.^.!.^.!.^.!.^.",
"^.^.^.^.!.^.^.^.^.!.^.^.!.^.^.^.^.^.^.!.^.^.^.^.!.^.^.^.^.^.!.^.^.^.!.^.^.!.!.^.^.^.^.^.!.^.^.!.^.^.^.^.^.^.^.!.^.^.!.^.^.!.!.^.^.^.^.^.^.^.^.^.!.^.^.^.!.!.^.^.!.^.^.^.^.^.!.^.^.^.^.^.^.^.^.^.^.^.^.^.!.^.!.^.^.^.!.^.^.^.^.^.^.!.^. $ ^.^.!.^.%. K.^.^.^.^.^.^.!.^.^.O 5 ^.^.^.^.^.^.!.^.^.!.$. N.^.^.!.^.!.^.^.^.^.!.^.^.>. %.^.^.^.^.!.^.^.^.^.^.^.!.^.^.^.!.^.!.^.^.^.^.^.^.:. >.^.^.^.^.^.^.K. d ^.^.!.^.^.^.!.^.^.!.^.^.^.^.^.^.^.^.^.!.^.^.!.!.^.^.^.^.^.!.^.^.!.^.^.^.^.^.^.^.!.^.^.!.^.^.!.!.^.^.^.^.^.^.^.^.^.!.^.^.^.!.!.^.^.!.^.^.^.^.^.!.^.^.^.^.^.^.^.^.^.^.^.^.^.!.^.!.^.^.^.!.^.^.^.^.^.^.^.^.^.!.^.!.^.!.^.!.^.^.^.^.!.",
"!.^.!.^.^.!.^.!.^.^.!.^.^.^.!.^.^.!.^.!.^.!.!.^.^.^.!.^.!.^.!.^.^.!.^.!.^.^.^.^.^.!.!.^.!.^.^.^.!.^.!.^.^.!.!.^.^.!.^.^.^.^.^.^.^.!.!.^.^.!.^.!.^.^.!.^.^.^.^.!.^.^.^.!.!.!.^.^.^.!.!.^.^.!.!.^.!.^.!.!.^.^.^.!.^.!.^.!.!.^.!.^.!.^.^. Q.^.^.^.B K.!.^.!.^.!.^.!.^.^.O d ^.^.!.^.!.^.!.^.^.^.H. Q.^.!.^.^.^.^.!.!.^.^.!.^.>. %.^.!.^.!.^.^.!.!.^.!.^.^.!.^.!.^.!.^.!.^.!.!.^.!.;. >.^.^.!.!.^.!.J. f !.!.^.^.!.^.^.^.!.^.^.!.^.^.!.^.!.^.!.^.!.^.^.^.^.^.!.!.^.!.^.^.^.!.^.!.^.^.!.!.^.^.!.^.^.^.^.^.^.^.!.!.^.^.!.^.!.^.^.!.^.^.^.^.!.^.^.^.!.!.!.^.^.^.!.!.^.^.!.!.^.!.^.!.!.^.^.^.!.^.!.^.!.!.^.!.^.^.!.!.^.!.^.^.^.^.^.^.^.^.!.!.^.",
"^.!.^.!.!.^.!.!.^.!.!.^.!.^.^.!.!.^.!.^.!.!.^.^.!.^.^.!.!.^.!.^.!.^.^.!.!.^.!.^.!.!.^.^.^.^.!.!.^.!.^.!.!.^.^.!.^.^.!.^.!.!.^.!.!.!.^.^.!.!.^.^.!.^.^.!.^.!.!.^.^.!.!.^.^.!.^.!.!.!.^.^.!.!.^.^.!.^.!.^.^.!.!.^.!.^.^.!.!.^.^.!.^.^.!. J.^.!.!.d J.!.^.^.!.!.^.^.!.^.O 5 !.^.^.!.^.!.!.^.!.!.Q.. : !.^.^.!.^.!.^.^.!.^.!.^.^.>. %.^.!.^.^.!.!.^.^.^.^.!.!.^.!.^.^.!.!.^.!.^.^.!.^.;. >.!.!.^.!.^.^.J. f ^.^.^.!.^.!.!.^.^.!.^.^.!.^.!.!.^.!.^.^.!.!.^.!.^.!.!.^.^.^.^.!.!.^.!.^.!.!.^.^.!.^.^.!.^.!.!.^.!.!.!.^.^.!.!.^.^.!.^.^.!.^.!.!.^.^.!.!.^.^.!.^.!.!.!.^.^.!.!.^.^.!.^.!.^.^.!.!.^.!.^.^.!.!.^.^.!.!.!.^.^.^.^.!.!.!.^.^.!.!.^.^.!.",
"^.!.!.!.^.!.!.^.!.!.^.!.!.!.!.!.!.!.^.!.!.^.!.!.!.!.!.^.!.!.^.!.^.!.!.^.!.!.!.^.!.^.!.!.!.!.!.^.^.!.!.!.^.!.!.^.!.!.^.!.!.^.!.!.!.^.!.!.!.^.!.!.!.!.!.!.!.^.!.!.!.^.!.!.^.!.!.^.!.^.!.!.!.^.!.!.^.!.^.!.!.^.!.!.^.!.!.^.!.!.!.!.!.!.!. >.!.^.!.2 J.!.!.!.^.!.!.^.!.!.+ 5 !.!.^.!.!.!.^.!.!.^.!.> b !.!.^.!.!.!.!.!.!.!.^.!.!.N. %.!.!.!.!.^.^.!.!.!.!.^.!.!.^.!.!.^.!.!.^.!.!.^.!.;. >.^.!.!.^.!.!.H. b ^.!.!.^.!.!.^.!.!.!.!.!.!.!.^.!.!.^.!.!.^.!.!.!.^.!.^.!.!.!.!.!.^.^.!.!.!.^.!.!.^.!.!.^.!.!.^.!.!.!.^.!.!.!.^.!.!.!.!.!.!.!.^.!.!.!.^.!.!.^.!.!.^.!.^.!.!.!.^.!.!.^.!.^.!.!.^.!.!.^.!.!.^.!.!.!.!.!.^.!.!.!.!.!.^.!.!.!.^.!.!.^.!.",
"!.^.!.^.!.^.!.^.!.^.!.^.!.^.!.^.^.!.^.!.!.!.!.!.^.!.!.^.!.^.!.!.!.^.!.^.!.^.^.!.^.!.^.!.^.!.!.!.!.^.!.!.!.^.!.^.!.^.!.!.!.!.^.^.^.!.!.!.!.^.!.!.!.^.!.!.^.!.^.!.!.^.!.!.!.^.!.!.!.^.!.^.^.!.!.!.!.^.!.!.!.!.^.^.!.^.!.!.!.!.^.^.^.!.^. $.!.^.!.+ J.^.!.^.!.^.!.^.!.^.O 5 !.!.!.^.!.^.^.!.^.!.!.B ..!.^.!.^.!.^.^.!.^.!.!.^.!.>. %.!.^.!.!.^.!.^.!.^.^.!.!.!.!.^.!.!.^.!.!.^.!.^.!.;. >.^.!.!.^.!.^.C. B !.!.^.^.!.^.!.!.!.^.!.!.^.!.^.!.^.^.!.!.^.!.^.^.!.^.!.^.!.^.!.!.!.!.^.!.!.!.^.!.^.!.^.!.!.!.!.^.^.^.!.!.!.!.^.!.!.!.^.!.!.^.!.^.!.!.^.!.!.!.^.!.!.!.^.!.^.^.!.!.!.!.^.!.!.!.!.^.^.!.^.!.!.!.!.^.^.!.^.!.^.^.!.!.!.^.!.!.^.!.^.!.^.",
"!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.^.^.!.!.!.!.!.^.!.!.^.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.^.!.!.!.!.^.!.^.!.!.!.!.^.!.^.!.!.!.!.!.^.^.!.!.!.!.!.!.^.!.!.!.!.!.!.!.!.^.!.!.^.!.!.!.!.!.!.!.^.!.!.!.!.^.!.!.!.!.!.!.!.^.!.!.!.!.!.!.!. N !.!.W. : J.!.!.!.!.!.!.!.!.!.O 5 !.^.!.!.!.^.!.!.!.^.!.%. C.!.!.!.!.!.!.!.!.!.!.!.^.!.>. =.!.!.!.!.^.!.!.!.!.!.!.!.^.!.!.^.!.!.!.!.^.!.!.!.;. >.!.^.!.!.!.!.-. { ^.!.!.!.!.!.^.!.!.!.!.!.^.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.^.!.!.!.!.^.!.^.!.!.!.!.^.!.^.!.!.!.!.!.^.^.!.!.!.!.!.!.^.!.!.!.!.!.!.!.!.^.!.!.^.!.!.!.!.!.!.!.^.!.!.!.!.^.!.!.!.!.!.!.!.^.!.!.!.!.!.!.!.!.!.^.!.!.!.!.!.^.!.!.!.!.",
"!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.^. + a !.!.H. a J.!.!.!.!.!.!.!.!.!.+ 5 !.!.!.!.!.!.!.!.!.!.!.H. Q.!.!.!.!.!.!.!.!.!.!.!.!.!.>. %.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.;. >.!.!.!.!.!.!.{ ;.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.",
"!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!. 4 $ !.!.;. B J.!.!.!.!.!.!.!.!.!.+ 5 !.!.!.!.!.!.!.!.!.!.!.!.O > !.!.!.!.!.!.!.!.!.!.!.!.!.!.>. %.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.;. >.E.!.!.!.!.!.f H.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.",
"!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.E.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!. b !.!.{ { J.!.!.!.!.!.!.!.!.!.O 5 !.!.!.!.!.!.!.!.!.!.!.!.a b !.!.!.!.!.!.!.!.!.!.!.!.!.!.>. %.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.=. >.!.!.!.!.!.Q.O I.!.!.!.!.!.!.!.E.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.",
"!.!.!.!.E.!.!.!.!.!.!.!.E.!.!.!.!.!.!.!.E.!.!.!.!.!.!.E.!.!.E.!.!.!.E.!.!.!.E.!.!.!.!.!.!.!.!.!.E.!.!.!.E.!.!.!.E.!.!.!.E.!.!.!.!.!.!.!.!.!.E.!.!.E.!.!.!.!.!.!.!.!.E.!.!.E.!.!.!.!.!.!.!.!.E.!.!.!.!.!.!.E.!.!.!.!.!.!.!.E.!.!.!.E.!. B @ J.!.B # %. J.!.!.!.!.!.E.!.!.!.+ 5 !.!.E.!.!.!.!.!.E.!.!.E.C ..!.!.!.E.!.!.!.E.!.E.!.!.!.!.>. X.!.E.!.!.!.!.!.!.!.!.!.!.Q.!.!.E.!.!.!.!.E.!.!.!.=. >.!.E.^.!.!.B $ !.!.!.!.!.!.!.!.!.!.!.!.E.!.!.!.!.!.!.!.E.!.!.!.E.!.!.!.!.!.!.!.E.!.E.!.!.!.E.!.!.!.E.!.!.!.E.!.!.!.!.!.!.!.!.!.E.!.!.E.!.!.!.!.!.!.!.!.E.!.!.E.!.!.!.!.!.!.!.!.E.!.!.!.!.!.!.E.!.!.!.!.!.!.!.E.!.!.!.!.!.!.!.!.!.E.!.!.E.!.!.!.!.!.",
"!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.E.!.!.!.!.!.!.E.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.E.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.E.!.!.!.!.!.E.!.!.!.!.!.E.!.!.!.!.!.!.!.!.E.!.!.!.E.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!. N a -.!.a 4 .. J.!.!.!.!.!.!.!.!.Q.O 5 !.!.!.!.!.E.!.!.!.!.!.!.>. H.!.!.!.!.!.!.!.!.!.!.!.!.!.E.>. N =.=.=.%.=.=.=.=.=.=.=.=.=.=.,.!.!.E.!.!.!.!.!.!.=. >.R.K.t.{ < b !.!.!.E.!.!.!.!.!.!.!.!.!.!.!.!.!.E.!.!.!.E.!.!.!.!.!.!.E.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.E.!.!.!.!.!.E.!.!.!.!.!.E.!.!.!.!.!.!.!.!.E.!.!.!.E.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.!.E.!.!.!.!.E.!.!.!.!.!.!.!.!.E.",
"!.E.!.E.!.E.!.E.!.E.!.E.!.E.!.E.!.E.!.!.!.E.!.E.!.!.!.!.E.!.E.!.E.!.!.E.!.E.!.E.!.E.!.!.!.E.!.E.!.E.!.E.!.E.!.E.!.E.!.E.!.E.!.E.E.!.!.E.E.!.!.!.!.E.E.!.!.!.!.!.E.!.!.!.!.E.!.E.!.E.!.!.E.!.!.!.!.E.!.E.!.E.!.E.!.E.!.E.!.E.!.E.E.!.!. B b ..!.: f . J.!.E.!.E.!.E.!.E.!.O 5 E.!.E.!.!.!.E.!.E.!.!.!.J. Q.E.E.!.!.E.!.E.!.E.!.E.E.!.!.>. < !.E.!.!.!.!.E.!.!.=. =.!.E.!.!.!.E.!.E.!.E.!.E.!.E.!.E.!.!.E.!.!.!.!.E.!.E.!.E.!.!.!.E.!.E.!.E.!.E.!.E.!.E.!.E.!.E.!.E.!.E.E.!.!.E.E.!.!.!.!.E.E.!.!.!.!.!.E.!.!.!.!.E.E.!.!.E.!.!.E.!.!.!.!.E.!.E.!.E.!.E.!.E.!.E.!.E.!.E.!.!.!.E.E.!.!.!.!.E.!.E.!.E.!.!.",
"E.!.!.!.E.!.!.!.!.!.E.!.!.!.E.!.E.!.!.E.!.!.E.!.!.E.E.!.!.!.E.!.E.!.!.!.E.!.!.!.E.!.!.!.E.!.!.!.!.!.!.E.!.!.!.E.!.E.!.!.E.!.!.!.!.E.!.!.E.!.!.!.E.!.!.!.E.!.!.E.!.!.!.!.!.E.!.!.!.E.!.!.E.!.!.!.!.!.E.!.!.!.!.E.E.!.!.!.E.!.!.!.!.!.E. B { V !. C . J.E.!.!.!.E.!.!.!.!.+ 5 !.!.E.!.!.E.!.!.E.!.!.E.!.@ 4 E.!.!.E.!.!.E.!.!.!.!.!.E.!.E.>. < !.!.!.!.!.E.!.!.!.;. R.!.!.E.!.!.!.E.!.!.!.E.!.!.E.!.!.!.E.E.!.!.!.E.!.!.!.E.!.!.!.E.!.!.!.!.!.E.!.!.!.!.E.!.E.!.!.E.!.!.!.!.E.!.!.E.!.!.!.E.!.!.!.E.!.!.E.!.!.!.!.!.E.!.!.!.E.!.!.E.!.!.!.E.!.!.!.E.!.!.!.!.!.E.!.!.!.E.!.!.E.!.!.!.!.E.!.!.!.!.E.!.!.!.E.",
"!.!.E.E.!.!.E.E.E.E.!.!.E.E.!.!.!.E.!.!.E.!.!.E.E.!.!.!.E.!.E.!.!.!.E.!.!.E.E.!.!.E.!.E.!.!.E.!.E.E.!.!.E.E.!.!.!.!.E.E.!.!.E.!.E.!.E.!.!.E.!.E.!.!.E.!.!.E.!.E.!.E.E.!.E.!.!.E.!.!.E.!.E.!.E.!.E.E.!.!.E.E.!.!.!.!.E.E.!.!.E.E.E.!.!. B ;. a I. =. . i.!.!.E.E.!.!.E.E.E.O 5 E.!.!.E.!.E.E.!.E.!.!.E.!.a N !.!.E.!.!.E.!.!.E.!.E.!.!.E.!.>. < E.!.E.!.E.!.!.E.E.=. B !.E.!.!.E.!.E.!.!.E.!.E.!.!.E.!.E.E.!.!.!.E.!.!.E.E.!.!.E.!.E.!.!.E.!.E.E.!.!.E.E.!.!.!.!.E.E.!.!.E.E.E.!.E.!.!.E.!.E.!.!.E.!.!.E.!.E.!.E.E.!.E.!.!.E.!.!.E.!.E.!.E.!.!.!.E.E.!.!.E.E.E.E.!.!.E.E.!.!.E.!.!.E.E.!.!.E.!.E.!.E.!.E.E.!.",
"E.!.E.!.E.E.E.!.!.E.!.E.!.E.!.E.E.!.E.E.E.!.E.!.!.!.E.E.!.E.E.!.!.E.E.!.E.E.!.!.E.!.E.E.!.E.!.E.!.E.!.E.E.!.E.!.E.E.E.!.E.E.!.E.!.!.E.E.E.!.E.E.!.E.!.E.E.E.!.!.E.!.E.E.E.!.E.E.!.E.!.E.E.!.E.E.!.E.!.E.!.E.!.E.E.!.E.!.E.!.E.!.E.!.E. B H. ; t. C. . J.E.!.E.!.E.!.E.!.!.O 5 E.!.E.E.!.!.E.!.E.!.E.!.!.{ %.E.E.E.!.E.!.!.E.E.!.E.!.E.!.!.-. 4 !.E.!.E.E.E.E.E.!.=. ; R.E.!.E.E.!.E.E.!.E.!.E.E.E.!.!.!.E.!.E.!.E.E.!.E.E.!.!.E.!.E.E.!.E.!.E.!.E.!.E.E.!.E.!.E.E.E.!.E.E.E.!.!.!.E.E.E.!.E.E.!.E.!.E.E.E.!.!.E.!.E.E.E.!.E.E.!.E.!.E.E.!.E.E.E.!.E.!.E.!.E.!.!.E.!.E.!.E.!.E.E.!.E.!.E.!.E.!.E.E.!.!.!.E.!.E.",
"E.E.!.E.E.!.!.E.!.E.E.E.!.E.E.!.E.E.!.E.E.!.E.E.E.E.!.E.E.!.E.E.E.E.!.E.!.E.E.E.!.E.E.!.E.E.E.!.E.E.E.!.E.E.E.!.!.E.!.E.E.!.E.E.E.E.E.!.E.E.!.E.E.E.E.!.E.!.E.E.E.E.E.!.E.E.E.!.E.E.E.!.!.E.E.!.!.E.E.!.E.E.E.!.E.E.!.E.E.E.!.E.E.E.!. B R. =. I... J.E.E.!.E.E.E.!.E.E.O 5 !.E.E.!.E.E.!.E.E.E.!.E.E.,. t.E.!.E.E.E.E.E.E.!.E.!.E.E.E.E.-. < E.E.E.E.!.!.E.!.E.=. @ J.E.!.E.E.E.E.!.E.E.E.E.!.!.E.E.E.E.!.E.E.E.E.!.E.!.E.E.E.!.E.E.!.E.E.E.!.!.E.E.!.E.E.E.!.!.E.!.E.E.!.!.E.E.E.E.!.E.E.!.E.E.E.E.!.E.!.E.E.E.E.E.!.E.E.E.!.E.E.E.!.!.E.E.!.E.E.!.E.E.E.!.E.E.E.E.E.!.E.E.!.!.E.E.E.E.!.E.E.E.!.E.E.E.!.E.E.",
"E.E.E.E.E.E.E.E.E.E.E.E.E.!.E.E.E.!.!.E.E.E.E.E.!.E.E.E.E.!.E.E.E.E.!.E.E.E.E.E.E.E.E.E.E.E.E.E.!.E.E.!.E.E.E.E.E.E.E.E.E.E.E.E.E.E.!.E.E.E.E.E.!.E.E.E.E.E.!.E.E.E.E.E.E.E.E.E.E.E.!.E.E.E.E.E.E.E.E.!.E.E.!.E.E.E.!.E.E.E.E.E.!.E.!. B T.@ N . E. . i.E.E.E.E.E.E.E.E.E.O 5 E.E.E.E.E.E.E.E.E.E.E.E.!... X.E.E.E.!.E.E.!.E.E.E.E.E.E.E.!.-. < !.E.E.E.E.E.E.E.T.=. f I.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.!.E.E.E.E.!.E.E.!.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.!.E.E.E.E.E.E.E.E.E.E.E.E.E.E.!.E.E.E.E.E.!.E.E.E.E.E.!.E.E.E.E.E.E.E.E.E.E.E.!.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.!.E.E.E.E.E.E.E.E.E.!.E.E.E.E.E.E.E.!.",
"E.!.!.E.E.E.E.E.E.E.E.!.E.E.E.E.E.E.E.E.!.E.!.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.!.E.!.E.E.E.E.E.E.E.E.E.E.E.E.E.E.!.!.E.E.!.E.E.E.E.E.!.!.E.E.E.E.E.!.E.E.E.E.E.!.E.!.E.E.!.E.E.E.E.!.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.!.E.E.E.E. B E.5 % : E. . J.E.!.!.E.E.E.E.!.E.O 5 E.E.!.E.E.E.E.E.!.E.E.!.E.B N E.E.E.E.E.E.E.E.!.E.E.E.E.E.E.-. < !.E.E.E.E.E.!.E.E.=. + f H.T.E.E.E.E.E.!.!.E.E.E.E.E.E.!.!.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.!.E.!.E.E.E.E.E.E.E.E.E.E.E.E.E.E.!.!.E.E.!.E.E.E.E.!.E.!.E.E.E.E.E.!.E.E.E.E.E.!.E.!.E.E.!.E.E.E.E.!.E.E.E.E.!.!.E.E.E.E.!.!.E.E.E.E.E.E.E.E.E.!.E.E.E.E.E.E.E.E.E.E.E.E.E.",
"E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.T.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E. B E.N a E... i.E.E.E.E.E.E.E.E.E.O 5 E.E.E.E.E.E.E.E.E.E.E.E.E.a $ E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.>. 4 E.E.E.E.E.E.E.E.T.=. > f C t.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.",
"E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.T.E.E.E.E.E.E.E.T.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.T.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.T.E.E.E.E.E.E.E.E.T.E.E.E.E.E.T.E.T.E.E.E.E.E.E.E.E.E.E.E.E.E.E.T.E.E.E.E.E.E.E.E.E.E.E.E.E.T.E.E.E.E.E.E. l E.{ B E. . J.E.T.E.E.E.E.E.E.E.X 5 E.T.E.E.E.E.E.E.E.E.E.E.E.@ J.T.E.E.E.E.E.E.E.E.E.E.E.E.E.-. > T.E.E.E.E.E.E.E.T.=. ; B ,.R.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.T.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.T.E.E.E.E.E.E.E.E.T.E.E.E.E.E.T.E.T.E.E.E.E.E.E.E.E.E.E.E.E.E.E.T.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.",
"E.E.E.E.T.T.E.E.E.E.T.T.E.E.E.E.E.E.E.T.E.E.E.T.E.E.E.T.E.E.E.T.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.T.E.E.E.T.E.E.E.T.E.T.E.E.E.T.E.E.E.E.T.E.E.E.T.T.E.E.E.T.E.T.E.E.E.E.E.E.E.E.T.T.E.E.E.T.E.E.E.E.T.E.E.T.E.E.T.E.E.E.E.E.E.E.E.T.E.E.E. B T.-. ..E. . i.E.E.E.E.T.T.E.E.T.# 5 T.E.E.T.T.E.E.E.E.E.E.E.I. =.T.E.E.E.E.E.E.T.E.E.E.T.E.E.-. > E.E.E.T.E.T.E.E.E.=. + B i.E.E.E.E.E.T.E.E.E.T.E.E.E.T.E.E.E.E.E.E.E.T.T.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.T.T.E.E.E.E.T.E.E.E.T.E.T.E.E.E.T.E.E.E.E.T.E.E.E.T.T.E.E.E.T.E.T.E.E.E.E.E.E.E.E.T.T.E.E.E.T.E.E.E.E.E.E.E.E.T.T.E.E.T.E.E.E.T.E.T.E.E.T.T.E.E.T.T.E.E.E.E.T.E.E.E.T.",
"T.E.T.E.E.E.E.T.T.E.E.E.T.E.E.E.T.T.E.E.T.T.E.E.E.E.E.E.E.T.E.E.E.E.Y.E.T.E.T.E.E.T.E.E.T.T.E.E.E.E.E.E.E.T.E.E.E.T.E.T.E.E.E.E.E.E.T.E.T.E.E.E.E.T.E.E.E.E.E.E.E.E.T.E.T.E.E.E.E.T.E.E.E.E.T.E.T.E.E.E.E.E.E.E.T.E.E.T.E.T.E.E.E.E.E. l E.i. -.T. . i.T.E.E.E.E.E.E.T.T.O 5 T.E.E.E.E.E.T.E.T.E.E.E.t. f E.E.E.T.E.T.E.E.E.T.E.E.E.T.-. 4 E.T.E.E.E.E.E.E.T.&. d i.R.T.E.T.E.T.E.E.E.T.E.E.E.T.E.T.E.T.E.E.E.E.T.E.E.Y.E.T.E.T.E.E.T.E.E.E.E.E.E.E.E.E.E.E.T.E.E.E.T.E.T.E.E.T.E.E.E.T.E.T.E.E.E.E.T.E.E.E.E.E.E.E.E.T.E.T.E.E.E.E.T.E.E.E.E.T.E.E.T.T.E.E.E.E.T.E.E.T.E.T.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.E.T.E.E.",
"T.T.E.E.E.E.T.E.T.E.T.T.E.E.T.T.E.T.T.E.E.T.T.E.Y.E.T.E.E.T.T.T.E.T.E.E.T.T.E.E.Y.E.E.T.E.T.E.T.T.E.T.T.E.T.T.T.E.E.T.E.T.E.T.T.E.T.E.T.T.E.T.E.T.E.T.T.E.T.T.T.E.T.E.T.T.E.T.E.T.E.T.E.E.T.E.T.E.E.T.E.T.E.T.T.E.E.E.T.T.T.E.E.T.E.T. B E.U. i.T. . i.E.E.T.E.T.E.T.E.T.# 5 T.E.T.E.E.E.E.T.T.E.T.E.X. ; U.T.T.E.T.E.T.T.E.E.T.T.E.E.-. 4 T.E.E.T.T.E.T.E.T.=. . { T.T.E.T.E.E.T.E.E.T.T.E.E.T.E.T.E.E.T.E.T.E.E.T.E.E.T.T.E.E.T.E.E.T.T.T.E.T.T.E.E.T.E.T.T.T.E.E.T.E.T.E.T.E.E.T.E.T.T.E.T.E.T.E.T.T.E.T.T.T.E.T.E.T.T.E.T.E.T.E.T.E.E.T.E.T.T.T.E.E.T.E.T.E.E.T.T.T.T.T.E.E.T.T.E.T.T.T.E.T.E.E.T.T.T.E.T.T.",
"T.E.T.T.T.T.T.T.T.E.T.T.T.T.T.E.T.T.T.E.T.T.T.E.E.T.E.Y.T.E.T.T.T.T.T.T.T.E.T.T.Y.E.T.T.E.T.T.T.T.T.T.E.T.T.E.T.T.T.T.T.T.T.T.E.T.E.T.T.T.E.T.T.T.T.E.T.T.T.T.T.T.E.T.T.T.E.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.E.T.T.T.T.T.T.E.T.T.T.T.T. l T.E.$ U.T. . i.T.T.T.T.T.T.T.T.T.O 5 T.T.T.T.T.T.T.T.E.T.T.T.B I.E.T.T.E.T.T.T.T.T.T.T.T.T.-. < T.T.T.E.T.T.T.T.T.=. B U.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.E.T.T.E.Y.T.T.E.T.T.T.T.T.T.T.T.T.E.T.T.T.T.T.T.T.E.T.T.E.T.T.T.E.T.T.T.T.E.T.T.T.T.T.T.E.T.T.T.E.T.T.T.T.T.T.T.T.T.T.T.E.T.T.T.T.T.T.T.E.T.T.T.E.T.T.T.T.T.E.T.T.T.E.E.T.T.E.T.T.E.T.",
"T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.E.Y.E.Y.E.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T. l T.T.a @ T.T. . i.T.T.T.T.T.T.T.T.T.O 5 Y.T.T.T.T.T.T.T.T.T.Y.E.i =.T.T.T.T.T.T.T.T.T.T.T.T.T.-. < T.T.T.T.T.T.T.T.T.+. { T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.E.Y.E.Y.Y.E.Y.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.",
"T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.Y.E.Y.E.Y.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T. B T.R.l 5 T.Y. . i.T.T.T.T.T.T.T.T.T.O 5 T.T.T.T.T.T.T.T.T.T.E.Y.+ l T.T.T.T.T.T.T.T.T.T.T.T.Y.-. < T.T.T.T.T.T.T.T.T.=. ; > @ t.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.Y.E.Y.E.E.Y.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.T.E.T.T.T.T.",
"T.T.Y.T.T.T.Y.T.T.T.T.Y.T.Y.T.T.T.T.T.T.T.T.T.T.T.Y.T.T.T.T.T.T.T.T.T.T.T.T.Y.T.Y.E.Y.E.T.T.T.T.T.Y.T.T.T.T.T.T.T.Y.Y.T.T.T.T.T.T.T.T.T.T.T.Y.T.T.T.T.T.T.T.T.T.T.T.Y.T.T.T.Y.T.T.T.T.T.Y.T.T.T.T.Y.T.T.T.T.T.T.T.T.T.T.Y.T.T.T.T.T.T. B T.T.{ f Y.T.} i.T.T.T.Y.Y.T.T.T.T.O 5 T.T.T.T.T.Y.Y.T.T.T.T.I. ; T.T.T.Y.T.T.T.T.Y.T.T.T.T.-. > T.T.T.Y.Y.T.T.Y.T.+. &.T.T.I.-.s < U.T.T.T.T.T.T.T.T.T.T.T.T.T.Y.Y.T.T.T.T.T.T.T.T.T.Y.T.Y.E.Y.E.T.T.T.T.T.T.T.T.T.T.T.T.T.Y.Y.T.T.T.T.T.T.T.T.T.T.T.Y.T.T.T.T.T.T.T.T.T.T.T.Y.T.T.T.T.T.T.T.T.T.Y.T.T.T.T.T.T.Y.Y.T.T.T.T.T.T.T.T.T.T.Y.Y.T.T.T.T.T.T.T.Y.T.T.Y.Y.T.T.Y.",
"T.Y.T.T.Y.Y.T.Y.Y.T.Y.T.Y.T.T.T.x.T.T.T.Y.T.Y.Y.Y.T.Y.T.Y.Y.T.Y.Y.T.Y.T.Y.Y.T.T.Y.Y.Y.Y.T.Y.Y.T.Y.T.Y.T.Y.Y.T.Y.T.Y.T.T.Y.Y.Y.T.Y.T.Y.Y.Y.T.T.Y.T.T.T.Y.x.T.T.Y.Y.T.T.Y.Y.T.T.Y.Y.T.Y.T.T.Y.Y.T.Y.T.Y.T.Y.Y.T.Y.Y.T.Y.Y.T.Y.T.Y.Y.T.T. l Y.T.*. { Y.Y. . u.T.Y.T.Y.T.T.T.Y.Y.O 1 Y.T.Y.Y.T.Y.T.T.Y.T.Y.,. I.T.x.T.T.Y.Y.Y.T.T.Y.T.Y.-. 4 Y.Y.T.Y.T.T.Y.T.Y.+. &.T.Y.Y.T.T.B &.Y.T.Y.Y.T.Y.Y.T.Y.Y.T.Y.T.Y.T.T.T.Y.Y.T.Y.T.Y.Y.T.T.Y.Y.Y.Y.Y.T.Y.T.Y.Y.Y.T.Y.Y.T.Y.T.Y.T.T.Y.Y.Y.T.Y.T.Y.Y.Y.T.T.Y.T.T.T.Y.x.T.T.Y.Y.T.T.Y.Y.T.Y.Y.Y.T.Y.T.T.Y.Y.T.T.Y.T.Y.T.T.Y.T.T.Y.Y.Y.T.Y.T.Y.T.T.T.T.T.Y.Y.T.Y.Y.T.Y.T.T.Y.T.",
"Y.T.Y.Y.Y.Y.Y.Y.Y.Y.T.Y.Y.Y.Y.T.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.T.Y.Y.Y.Y.T.Y.T.Y.Y.T.Y.Y.T.Y.T.T.x.T.x.T.T.Y.Y.T.Y.Y.T.Y.T.Y.Y.T.Y.Y.T.Y.T.T.Y.Y.T.Y.Y.T.Y.Y.T.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.T.Y.Y.Y.Y.T.Y.Y.Y.T.T.Y. k Y.Y.i. +.Y.T.} i.Y.T.Y.Y.Y.Y.T.Y.T.O i Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.T.} +.Y.Y.Y.Y.Y.Y.T.Y.Y.Y.Y.Y.&. < a a a d a s a a a s a a a a x Y.T.Y.Y.Y.Y.T.Y.Y.+. &.T.Y.T.Y.Y.I.O 4 Y.Y.Y.Y.T.Y.T.Y.Y.T.Y.Y.T.Y.Y.Y.T.Y.Y.Y.Y.Y.T.Y.Y.T.Y.Y.T.Y.Y.Y.Y.Y.T.T.x.T.x.T.T.Y.Y.Y.Y.Y.T.Y.T.Y.Y.Y.T.Y.Y.T.Y.T.Y.Y.Y.Y.T.x.x.T.Y.Y.Y.Y.Y.T.Y.Y.Y.Y.Y.T.Y.Y.Y.Y.Y.Y.Y.T.Y.T.Y.Y.Y.Y.T.Y.Y.T.Y.T.Y.Y.T.Y.Y.Y.T.Y.Y.T.Y.Y.T.Y.T.Y.",
"Y.Y.T.Y.Y.Y.Y.Y.Y.T.Y.Y.Y.T.Y.Y.T.Y.Y.T.Y.T.Y.Y.T.Y.Y.T.T.Y.Y.T.Y.Y.T.Y.Y.T.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.x.T.T.Y.Y.Y.Y.T.Y.Y.Y.Y.x.T.x.T.Y.Y.Y.T.x.T.x.x.T.Y.Y.Y.Y.x.T.T.Y.Y.T.Y.Y.Y.Y.Y.T.T.Y.Y.T.Y.Y.Y.Y.T.Y.Y.T.Y.Y.Y.Y.Y.Y.Y.T.Y.Y.Y.Y.Y.T. B Y.Y.Y. t.Y.Y.} i.Y.Y.Y.T.Y.Y.Y.Y.Y.O 4 Y.Y.Y.Y.T.Y.Y.T.Y.Y.Y.N B Y.Y.Y.Y.Y.Y.Y.Y.T.T.Y.T.&. X.Y.Y.Y.Y.Y.Y.Y.Y.Y.T.Y.Y.Y.T.T.Y.Y.Y.T.Y.T.Y.Y.T.=. &.Y.Y.Y.Y.Y.Y.i I.Y.Y.T.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.T.Y.Y.T.Y.Y.T.Y.T.Y.Y.Y.Y.Y.Y.Y.T.T.Y.x.T.T.Y.Y.Y.Y.Y.Y.T.T.Y.x.T.x.T.T.Y.Y.T.Y.x.T.x.Y.Y.T.T.Y.T.T.T.Y.E.Y.Y.Y.Y.Y.Y.Y.T.Y.Y.Y.Y.Y.Y.Y.T.Y.Y.Y.Y.Y.T.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.",
"Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.x.T.Y.T.Y.x.Y.Y.Y.Y.x.T.x.T.Y.Y.T.Y.Y.Y.x.T.Y.Y.Y.Y.Y.Y.T.x.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y. k Y.Y.Y.: g.T.Y... u.Y.Y.Y.Y.Y.Y.Y.Y.Y.O 4 Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.4 > x.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.&. X.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.x.T.Y.Y.x.+. &.Y.Y.Y.Y.Y.Y.B t.Y.Y.Y.x.T.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.T.x.Y.Y.Y.Y.T.x.T.x.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.x.T.Y.T.Y.Y.Y.Y.Y.Y.x.T.T.x.Y.Y.T.x.Y.Y.Y.T.Y.Y.x.Y.Y.Y.T.x.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.",
"Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.x.T.x.T.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.x.x.T.Y.Y.Y.Y.T.x.Y.Y.Y.Y.x.Y.Y.Y.T.x.Y.Y.T.x.Y.Y.x.T.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.x.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y. k Y.Y.Y.a O Y.Y.Y.} i.Y.Y.Y.Y.Y.z.Y.Y.Y.O 5 Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.+ I.Y.Y.Y.Y.Y.Y.Y.Y.x.T.Y.*. X.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.x.Y.Y.Y.Y.Y.Y.Y.Y.Y.x.Y.x.x.=. &.Y.Y.x.Y.Y.Y.} | Y.Y.x.T.x.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.x.T.Y.Y.Y.Y.x.T.x.T.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.x.x.T.Y.x.Y.Y.T.x.x.T.x.Y.x.T.x.Y.Y.Y.Y.Y.T.x.T.x.x.T.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.",
"Y.Y.Y.Y.Y.Y.x.Y.Y.x.x.Y.Y.Y.z.Y.Y.x.Y.Y.x.Y.x.Y.Y.Y.Y.Y.x.Y.Y.x.Y.x.Y.Y.x.Y.Y.x.x.Y.x.Y.Y.Y.Y.x.x.Y.x.Y.x.Y.Y.Y.Y.x.Y.Y.x.Y.x.Y.x.x.Y.Y.T.x.x.T.x.Y.Y.x.T.x.x.x.Y.x.Y.Y.Y.Y.x.Y.Y.Y.Y.x.Y.Y.x.Y.z.Y.Y.Y.Y.Y.Y.Y.Y.Y.Y.x.z.Y.Y.Y.Y.Y.x. k Y.Y.x.l > Y.Y.Y.} u.Y.Y.Y.Y.Y.Y.Y.Y.Y.O 4 Y.Y.x.Y.Y.x.x.Y.x.Y.l. @.Y.Y.Y.Y.x.Y.Y.x.Y.Y.x.&. X.Y.x.Y.Y.Y.Y.Y.Y.x.Y.Y.z.Y.Y.x.x.T.x.Y.Y.x.Y.Y.x.&. +.Y.x.Y.Y.Y.Y.+. { x.x.Y.Y.T.Y.x.Y.x.Y.Y.Y.x.Y.Y.x.Y.x.Y.Y.x.Y.Y.Y.x.Y.x.Y.x.x.Y.x.Y.x.T.x.Y.x.Y.Y.Y.Y.x.Y.Y.x.T.T.x.Y.Y.Y.x.T.x.x.x.Y.Y.x.Y.Y.x.T.x.Y.Y.Y.x.Y.Y.x.x.Y.Y.Y.x.Y.x.Y.Y.Y.Y.Y.Y.Y.z.Y.Y.x.Y.Y.Y.Y.x.Y.x.Y.Y.Y.x.Y.Y.x.Y.Y.Y.Y.x.Y.Y.x.Y.",
"z.Y.z.Y.Y.z.Y.x.x.Y.x.Y.Y.Y.z.Y.x.Y.x.x.x.Y.x.x.Y.x.x.Y.x.x.x.Y.Y.x.x.x.x.x.x.Y.x.Y.x.x.Y.x.Y.x.x.T.Y.x.Y.x.x.x.Y.x.x.x.x.x.x.T.x.Y.x.x.x.x.Y.x.x.x.x.Y.x.x.x.T.Y.Y.x.x.x.x.Y.x.Y.x.x.Y.x.x.x.Y.Y.Y.z.Y.Y.Y.Y.z.z.Y.x.Y.Y.Y.z.Y.x.Y.Y. l Y.x.Y.} s x.x.Y.} u.z.Y.z.Y.Y.z.Y.z.Y.O i x.x.x.x.x.Y.x.Y.x.x.,. l x.Y.Y.Y.x.x.x.Y.x.x.x.&. X.x.Y.x.x.x.x.x.x.Y.Y.z.Y.Y.x.Y.x.x.Y.x.Y.x.x.x.Y.| &.Y.x.x.Y.x.x.*. x x.Y.x.x.x.x.Y.x.Y.x.x.x.Y.x.x.Y.x.x.x.x.Y.x.x.x.x.x.Y.x.Y.Y.x.x.x.x.T.x.x.Y.x.x.x.Y.x.x.x.x.x.x.x.x.x.Y.x.x.x.x.T.x.x.Y.x.x.Y.x.x.Y.x.Y.x.x.Y.x.Y.Y.Y.Y.x.x.Y.x.x.z.Y.z.Y.Y.Y.z.Y.Y.x.x.x.x.Y.x.Y.x.Y.x.Y.x.x.Y.x.x.x.x.Y.Y.Y.x.x.",
"Y.Y.z.Y.x.Y.x.Y.Y.x.z.Y.Y.Y.Y.Y.Y.x.x.Y.Y.x.x.Y.x.Y.x.x.Y.x.Y.x.x.Y.x.Y.Y.x.Y.x.Y.x.x.Y.Y.x.x.x.x.x.x.T.x.x.x.Y.x.Y.x.Y.Y.x.Y.x.Y.x.x.Y.x.Y.Y.x.Y.x.x.Y.x.Y.x.x.x.Y.x.Y.x.Y.Y.x.Y.x.x.Y.x.Y.Y.x.Y.z.z.Y.Y.z.Y.z.z.Y.Y.z.Y.z.Y.z.Y.x.Y. l x.Y.x.*. B x.Y.Y.} y.Y.Y.z.Y.z.Y.Y.Y.Y.. i Y.Y.Y.x.Y.x.Y.x.x.Y.} ; < Y.Y.x.Y.Y.x.Y.x.x.x.Y.@. X.Y.x.x.x.Y.Y.x.x.Y.Y.Y.x.Y.Y.x.Y.x.x.Y.x.Y.x.Y.x.+. @.x.x.Y.Y.x.Y.t. l Y.Y.x.Y.x.x.Y.x.x.Y.x.Y.x.x.Y.x.Y.Y.x.Y.x.Y.x.x.T.x.Y.Y.x.x.Y.Y.x.x.x.x.T.x.x.Y.x.x.Y.x.Y.x.x.T.x.x.x.x.x.T.x.x.Y.x.Y.x.x.Y.x.x.x.Y.x.x.Y.x.x.x.x.x.x.x.x.Y.x.x.x.Y.z.Y.z.z.Y.Y.z.Y.x.Y.x.x.Y.x.x.Y.x.Y.x.x.Y.x.Y.x.Y.Y.x.x.Y.Y.x.",
"z.Y.Y.z.x.x.x.x.x.x.Y.x.z.z.Y.z.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.Y.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.Y.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.z.Y.Y.z.Y.Y.z.Y.Y.z.Y.Y.z.Y.Y.z.x.x.x. l x.x.x.u. } x.x.Y.} y.z.Y.Y.z.Y.z.z.Y.x.O 4 x.x.x.x.x.x.x.x.Y.x.l g O g.x.x.x.x.x.x.x.x.x.x.&. | x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.&. @.x.x.x.x.x.z.y. g Y.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.Y.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.Y.x.x.Y.x.Y.x.x.x.x.x.x.z.Y.Y.z.Y.Y.z.Y.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.",
"x.x.x.x.x.x.x.x.z.x.z.Y.z.z.z.Y.x.x.z.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.z.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.Y.Y.z.z.z.z.Y.Y.z.z.Y.z.Y.z.Y.Y.x.x.x. k Y.x.x.x.. *.x.x.x.} y.x.x.x.x.x.x.x.x.x.O 5 x.x.x.x.z.x.x.x.x.x.4 x i @.x.x.x.x.x.x.x.x.x.z.&. X.x.x.x.x.x.x.z.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.+. @.x.x.x.x.z.x.y. f x.x.x.x.x.x.x.x.x.x.Y.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.z.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.Y.Y.z.z.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.",
"x.x.k.x.z.z.x.z.x.z.Y.z.z.Y.z.z.x.x.x.z.z.x.x.z.z.x.z.z.x.x.k.x.x.z.x.z.z.x.z.x.x.x.z.x.x.z.x.z.x.z.z.x.z.x.z.x.x.z.x.z.z.x.z.x.x.z.x.z.z.x.x.z.z.x.z.x.x.z.x.z.z.x.z.x.z.x.x.k.z.x.x.z.x.z.z.x.z.z.Y.z.Y.z.z.z.z.Y.z.z.z.z.z.z.z.x.x. k z.z.x.z.; u.x.x.x.} y.z.x.z.x.x.z.x.z.z.O 1 z.z.x.z.x.x.z.x.x.Y.O X.l l x.x.z.z.x.x.z.z.x.z.@. | x.x.x.x.z.x.x.x.z.x.z.x.z.x.z.z.x.z.x.z.z.x.z.z.+. @.x.x.z.x.x.x.u. g x.z.x.z.x.x.z.x.z.x.k.x.z.z.x.z.x.z.x.z.x.z.x.z.z.z.x.z.x.z.x.x.z.x.z.z.x.z.z.z.x.x.z.z.x.z.x.z.x.x.x.x.z.z.x.z.x.z.x.z.x.x.z.x.z.x.z.x.z.k.x.x.x.z.x.x.z.x.z.x.z.z.z.z.Y.x.x.k.x.x.z.x.z.x.z.z.x.z.x.z.x.x.z.x.z.x.z.x.z.z.x.x.z.",
"x.z.x.z.x.x.x.x.z.z.Y.z.k.Y.Y.k.x.z.z.x.x.x.x.x.x.z.x.x.x.k.z.x.z.x.x.x.x.z.z.z.z.z.x.x.z.x.x.z.x.x.z.z.x.x.x.x.z.x.x.x.x.z.x.z.x.x.x.x.x.z.z.x.x.z.x.z.z.x.x.x.x.x.x.x.z.x.x.x.x.z.x.z.x.x.x.x.z.Y.z.z.Y.z.z.Y.z.Y.Y.z.z.Y.Y.z.x.z.x. k x.x.z.x.a l.x.z.z.} y.x.z.x.z.z.x.x.x.z.O 1 x.x.z.x.z.x.x.x.x.g. *.| < x.x.x.x.z.x.x.z.x.z.@. | x.x.z.z.x.x.z.z.z.z.x.x.z.x.x.z.z.x.x.x.x.z.x.x.o. @.z.z.x.z.z.z.y. s x.z.x.x.z.z.x.z.x.k.x.x.x.x.z.z.x.x.z.x.z.x.x.z.z.x.x.x.x.z.x.z.x.x.x.z.z.x.z.x.x.z.x.z.x.x.z.x.z.z.x.z.x.x.x.x.x.z.x.z.z.z.x.z.x.z.x.z.x.x.x.k.x.x.z.x.z.x.x.z.x.k.Y.z.z.x.x.z.x.x.x.z.x.x.x.z.x.x.x.x.z.z.x.z.x.x.x.x.x.x.z.z.x.",
"x.k.x.z.z.z.z.z.z.x.z.z.Y.k.Y.z.z.x.z.z.z.z.z.z.z.z.x.k.x.x.x.z.z.z.z.z.x.z.z.z.z.x.z.z.x.z.x.z.z.x.z.z.z.z.z.z.z.z.z.z.x.z.x.z.z.z.z.z.z.x.z.z.z.z.z.z.z.z.z.z.z.z.k.x.z.x.x.k.x.z.z.z.z.z.k.x.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.x.x.z.x. k z.z.z.z.x ; z.x.z.x.} y.x.z.x.z.z.z.z.z.x.O 4 z.x.z.z.z.z.z.z.z.#. u.t. l.x.k.x.z.z.x.z.z.z.@. | z.z.x.z.z.z.x.z.z.x.z.x.z.z.z.z.z.z.z.z.x.z.z.z.+. @.x.z.z.z.z.z.u. s x.x.z.z.z.x.z.z.x.k.x.x.k.x.z.x.z.x.z.x.z.z.z.z.z.z.z.z.z.z.x.z.z.z.z.z.z.z.x.z.z.z.z.x.z.z.x.z.z.x.z.z.x.z.z.z.z.x.z.z.z.z.x.z.x.x.z.z.x.k.x.k.x.x.z.z.z.z.z.z.x.Y.k.Y.z.k.x.z.x.z.z.z.z.z.z.x.z.z.z.z.x.z.z.z.z.z.z.z.z.k.x.z.z.",
"x.x.z.z.z.z.z.z.z.x.k.x.k.z.z.z.z.z.z.z.z.z.z.z.z.z.x.k.x.k.x.x.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.k.x.z.x.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z. g z.z.z.z.} i x.z.z.z.} y.k.z.z.x.z.z.z.z.z.O 4 z.z.z.z.z.z.z.z.x.( l.l. @.k.z.z.x.z.z.z.z.z.@. | z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.| @.z.z.z.z.z.z.u. a z.z.z.z.z.z.z.z.z.x.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.x.z.z.z.z.z.z.z.z.z.z.z.k.z.z.z.z.x.x.z.z.z.x.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.x.x.z.z.",
"k.z.z.k.z.z.z.z.k.k.x.z.k.z.z.z.z.z.z.z.z.z.z.z.z.z.k.x.x.k.k.z.z.z.z.z.z.z.z.z.z.z.z.z.z.k.z.z.z.z.z.z.z.z.z.k.z.z.z.z.z.z.z.k.z.z.z.k.z.z.z.z.z.z.z.z.z.z.z.k.z.z.z.z.x.k.z.k.z.z.z.z.z.x.k.x.z.z.z.z.z.z.z.z.z.z.z.z.z.z.k.z.k.z.z. l z.z.z.x.#. g x.z.z.z.} e.z.z.z.k.z.z.z.z.z.O 1 z.z.z.z.z.z.z.z.x.g @ z.z.; x z.z.z.k.z.z.z.z.z.@. | z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.k.z.z.o. @.k.z.z.k.z.z.e. i z.z.z.z.z.z.z.z.z.k.x.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.k.z.z.z.z.z.z.z.z.z.k.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.k.z.z.z.k.x.z.z.z.z.z.z.z.z.z.z.k.z.z.z.z.k.k.x.x.k.k.z.z.z.z.z.z.z.z.z.z.z.z.z.z.k.z.z.z.k.z.z.",
"z.z.z.z.z.z.z.z.x.k.z.z.z.z.z.z.z.z.z.z.z.k.z.z.z.z.x.k.z.z.z.z.z.z.z.z.z.z.z.z.k.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.k.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.x.k.z.z.z.z.k.z.z.z.z.z.z.z.z.z.z.z.z.z.z. k z.z.z.z.f. ( z.z.k.z.} y.z.z.z.z.z.z.z.z.z.O 1 z.z.z.z.k.z.z.z.z.1 < z.z.a 1 z.z.z.z.z.k.z.z.z.@. | z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.| o.z.z.z.z.z.z.y. i x.z.z.z.z.k.z.z.z.z.z.z.z.z.z.k.x.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.k.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.k.z.z.z.z.z.z.z.z.z.z.z.z.z.z.x.k.k.k.x.k.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.z.",
"k.z.k.z.z.k.z.z.k.z.k.z.k.z.k.z.k.z.k.z.k.z.z.z.k.k.x.k.z.k.z.k.k.z.k.z.z.k.z.z.k.z.k.z.k.z.k.z.k.z.k.z.z.k.z.k.z.k.z.k.z.k.z.z.z.z.z.k.z.k.z.k.z.k.z.z.k.z.z.k.z.k.k.z.k.z.z.k.k.z.z.k.z.k.k.z.k.z.k.z.z.k.z.k.k.z.k.k.k.z.k.z.k.z.z. k z.z.k.z.z. | k.z.z.k.} y.k.z.k.z.k.z.k.z.k.O i z.k.z.k.z.z.z.k.z.O s z.k.x l.z.k.z.z.z.k.k.j.@. | z.z.k.k.z.k.z.z.k.k.z.k.z.k.z.z.k.k.k.z.k.z.z.z.o. @.k.k.z.z.k.z.y. i z.k.z.k.z.k.z.k.z.z.k.z.k.z.k.z.k.k.z.z.k.z.k.z.z.k.z.z.k.z.k.z.k.z.z.k.z.k.z.z.k.z.z.z.k.k.z.k.z.k.z.k.z.k.z.k.k.k.z.k.z.z.k.k.z.k.z.z.k.z.z.k.z.k.z.z.k.z.k.z.k.z.k.z.k.k.z.k.x.z.k.x.k.z.k.z.k.z.k.z.k.k.z.z.k.z.k.z.k.z.k.z.k.",
"z.k.z.k.z.k.k.z.k.z.k.z.k.k.k.x.k.k.z.k.k.k.z.k.z.k.z.k.z.k.k.z.z.k.z.k.k.z.k.z.z.k.k.z.k.z.z.k.k.z.z.k.z.k.z.k.x.k.k.z.k.z.k.z.k.z.k.k.z.z.k.z.k.z.k.z.k.z.k.k.z.k.z.k.k.z.z.k.k.x.k.k.z.k.k.z.z.k.z.k.k.z.k.x.z.k.k.z.k.z.k.z.k.z.k. g z.k.k.k.z.> t.k.k.k.z.} e.k.z.z.k.k.z.k.z.k.O 1 k.z.k.z.k.k.z.k.f. x z.z.@. #.z.k.k.z.k.z.k.z.@. | k.z.k.z.k.k.z.k.z.k.z.k.z.k.k.x.k.z.k.z.k.z.k.z.o. @.z.k.z.z.k.k.y. 1 z.z.k.z.k.z.k.z.k.z.k.k.z.k.z.k.x.z.k.k.z.k.z.k.k.k.z.k.z.k.k.k.z.k.k.z.k.z.k.z.k.z.k.z.k.z.k.z.k.z.k.z.k.z.k.z.z.k.k.z.z.k.z.k.k.z.k.z.k.z.k.x.k.k.z.k.k.z.k.k.x.k.z.k.z.z.k.k.z.k.z.k.z.k.z.k.z.k.z.k.z.z.k.k.z.k.z.k.z.k.z.z.k.",
"k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.z.k.k.k.k.k.k.k.k.z.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.z.k.k.k.z.k.k.k.k.k.k.k.z.k.k.k.z.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.z.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k. l k.z.k.k.k.s g.k.k.k.k.) y.k.k.k.k.k.k.k.k.k.O 1 k.k.k.k.k.k.k.k.@. o.k.k.r. x z.k.k.k.k.k.k.k.O. | k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.o. O.k.k.k.k.k.k.e. 1 z.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.z.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.z.k.k.k.k.k.k.k.k.k.k.z.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.z.k.k.k.k.",
"k.k.k.k.k.k.k.k.k.k.k.k.z.k.k.k.k.k.k.z.k.k.k.k.k.k.k.k.k.k.k.k.k.k.z.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.z.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.z.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.z.k.k.k.k.z.k. l k.k.k.k.k.x + k.k.k.k.k._ e.k.k.k.k.k.k.k.k.k.O 5 k.k.k.k.k.z.z.k.( 8.z.k.k.@ 4 k.z.k.k.k.k.k.k.@. | k.k.k.k.k.k.z.k.k.k.k.k.k.k.z.k.k.k.k.k.k.k.k.k.o. @.j.k.k.k.k.k.e. 1 k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.z.k.k.k.k.k.k.k.k.k.z.k.k.k.z.k.k.k.k.k.z.k.k.k.k.k.z.k.k.k.k.k.z.k.k.k.k.k.k.k.k.k.k.k.k.z.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.",
"k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.j.k.k.k.k.k.k.k.k.k.k.k.j.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k. l k.k.k.k.k.} , k.k.k.k.k.} e.k.k.k.k.k.k.k.k.k.O 1 k.k.k.k.k.k.k.k.g g.k.k.k.a h.k.k.k.k.k.k.k.O. | k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.o. O.k.k.k.k.k.k.y. 1 k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.",
"k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.j.k.k.k.k.k.k.j.k.k.k.k.k.k.k.k.j.k.k.k.k.k.k.j.k.k.k.k.k.k.k.k.k.k.k.k.j.k.k.k.j.k.k.k.k.k.k.k.k.j.k.k.k.k.j.k.k.k.k.k.k.j.k.k.k.k.k.k.k.k.k.j.k.k.k.k.k.k.k.k.j.k.k.j.k.j.k.k.k.k.k.k.k.k.k.k.k. h k.k.k.j.k.#. s k.k.k.k.k.} e.k.k.k.k.k.k.k.k.k.O 1 k.k.k.k.k.k.k.k.1 @ j.j.k.k.x #.k.k.k.j.k.k.k.O. | k.k.k.k.k.z.k.k.j.k.k.k.k.k.k.k.j.k.k.k.k.k.j.k.` O.k.k.k.k.k.k.e. i k.k.k.k.k.k.k.k.j.k.k.k.k.k.k.k.k.k.k.j.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.k.j.k.k.k.j.k.k.k.k.k.k.k.j.k.k.j.k.j.k.k.k.k.k.k.k.j.k.k.k.k.k.k.k.k.k.k.k.j.k.k.k.k.k.k.k.k.k.j.k.j.k.k.k.j.k.k.j.k.k.k.k.j.k.k.k.k.k.k.j.k.k.k.k.k.",
"j.j.k.j.k.j.j.k.j.k.j.k.j.k.j.j.j.j.k.k.k.j.j.j.k.j.j.k.j.k.j.k.j.j.k.k.k.j.j.j.k.k.j.k.k.j.k.j.j.k.j.j.j.k.k.j.j.k.k.j.j.j.j.k.k.j.k.j.j.j.k.j.k.k.j.j.j.k.j.k.k.k.j.k.j.k.j.k.j.k.j.k.j.k.j.k.j.k.k.j.k.j.j.k.k.j.j.j.j.k.j.j.k.j.k. k j.j.k.k.j.f. x j.j.j.j.j._ e.j.j.k.k.k.j.k.j.j.O 1 j.k.j.k.k.j.j.k.. 4 k.j.j.j.#. x k.k.k.j.j.k.j.@. s ( ( ( ( _ ( ( ( } ( ( ( _ ( ( ( } 8.k.j.k.j.k.j.o. O.k.j.k.j.k.j.e. 1 k.j.j.j.k.k.k.j.k.j.k.k.j.k.j.k.j.j.j.k.k.k.k.j.j.j.k.j.k.j.k.j.j.j.k.j.j.j.k.k.j.j.k.j.k.j.j.j.k.j.j.k.j.j.k.k.k.j.j.j.j.j.k.k.j.k.k.j.j.j.k.j.k.j.j.k.j.j.k.j.k.k.j.j.j.k.k.j.k.k.k.j.k.k.j.k.j.k.j.k.j.j.k.j.k.j.k.j.k.k.j.j.j.",
"j.k.j.k.k.j.j.k.j.k.k.j.k.j.k.j.j.k.j.j.j.k.k.j.j.k.k.j.j.k.k.j.j.k.j.j.j.k.k.j.k.j.j.k.j.j.j.j.j.k.j.k.j.j.j.j.k.j.j.k.k.j.j.j.j.j.k.k.k.j.j.k.j.j.k.j.j.k.j.k.k.j.j.j.j.j.j.k.j.k.j.j.j.j.k.j.k.j.j.k.j.k.k.j.j.k.k.j.k.j.j.j.j.k.j. h j.j.j.j.j.k.. | k.k.j.k.j.} e.j.k.j.j.j.j.j.k.j.O 1 k.j.j.k.j.j.k.r. g j.k.j.k.f. i j.j.j.k.j.k.j.@. ( j.k.k.j.k.j.o. o.j.j.k.k.j.k.e. 1 j.j.k.j.k.k.j.k.j.k.j.j.k.j.j.k.j.j.k.k.j.j.k.k.j.j.k.k.j.k.j.j.j.j.j.j.k.k.j.j.j.k.j.j.k.j.k.k.j.k.j.j.k.k.k.j.j.k.j.j.k.k.j.j.k.j.j.j.j.j.k.j.j.k.j.k.k.j.k.j.j.j.j.k.j.j.j.j.j.j.k.k.j.j.k.k.j.j.j.k.j.j.j.k.j.j.k.k.j.j.k.k.j.",
"k.j.k.j.j.j.k.j.j.k.j.j.k.j.j.k.j.j.k.j.k.j.j.k.j.k.j.j.k.j.j.j.j.j.k.j.k.j.j.k.j.j.k.j.j.k.j.j.k.j.k.j.k.k.j.k.j.j.k.j.k.j.k.j.j.k.j.j.j.k.k.j.j.k.j.k.j.j.k.j.j.j.k.k.j.k.j.k.k.j.j.k.k.j.j.k.j.k.j.j.j.k.j.j.k.j.k.j.j.j.k.k.j.j.k. k j.j.k.k.j.j.< #.j.j.k.j.j._ e.k.j.k.j.k.k.j.j.j.O 1 j.k.j.j.j.k.k.O. ( k.j.k.j.j.@ j.k.j.k.j.j.j.O. x k.j.j.k.j.k.` O.j.k.j.j.j.k.y. 1 k.k.j.j.k.j.j.k.j.j.k.j.j.j.k.j.k.k.j.j.k.j.j.j.k.j.k.j.j.k.j.j.j.j.k.k.j.j.k.j.k.j.k.j.j.k.j.j.j.j.k.k.j.j.j.k.j.j.k.j.k.j.j.k.j.k.j.k.k.j.j.k.j.j.k.j.j.k.j.j.k.k.k.j.k.k.j.k.k.j.j.k.j.k.j.j.j.k.j.j.k.k.j.j.k.k.j.j.j.k.j.j.k.",
"j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.k.j.j.j.j.j.j.j.j.j.j.j.j.j.j.k.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.k.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j. g j.j.j.j.j.d.s r.j.j.j.j.j._ e.j.j.j.j.j.j.j.j.j.O 1 k.j.j.j.j.j.j.( o.j.j.j.j.j.a 8.h.j.j.j.j.j.O. ( j.j.j.j.j.d.o. O.k.j.j.j.j.j.e. 1 j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.",
"j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j. l j.j.j.j.j.j.x h.j.j.j.j.j.} 0.j.j.j.j.j.j.j.j.j.O 1 j.j.j.j.j.j.j.g 0.j.j.j.j.d.( ( k.j.j.j.j.j.O. x j.j.j.j.j.j.` O.j.j.j.j.j.j.e. 1 j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.",
"j.d.j.d.d.j.d.j.d.j.j.j.j.d.j.j.j.j.j.d.j.d.j.j.j.d.j.j.j.j.d.j.j.j.j.j.j.d.j.d.d.j.j.j.j.j.d.j.j.j.j.j.j.j.d.j.j.d.j.j.d.j.j.j.j.j.d.j.j.j.j.d.j.j.j.j.j.d.j.d.j.d.j.d.d.d.j.d.j.j.j.d.j.d.j.j.j.j.j.j.j.d.j.j.j.d.j.j.j.d.j.j.j.j.j. h j.j.j.j.d.d.| ; d.j.j.d.j.d._ e.j.d.j.d.d.j.d.j.d.O 1 j.j.d.j.j.j.j., h.j.j.d.j.j.8. 1 j.j.d.j.j.j.O. z d.j.j.j.d.d.o. O.j.j.d.j.j.j.9. i j.j.d.j.d.j.j.d.j.d.j.j.j.d.j.j.j.d.j.j.j.d.j.j.j.j.d.j.j.j.j.d.j.j.j.j.j.j.j.j.d.j.d.j.d.d.j.d.j.j.d.d.j.j.j.d.j.j.j.j.j.j.j.j.d.d.j.d.j.j.j.j.j.j.j.j.d.j.j.j.d.j.j.j.j.j.d.j.d.d.j.j.j.j.d.j.j.d.j.j.j.j.d.j.j.j.j.j.j.j.j.j.d.",
"j.j.j.j.j.j.j.j.j.j.j.d.j.j.d.j.d.d.j.j.j.j.d.j.j.j.j.d.d.j.j.j.d.d.j.j.j.d.j.j.j.j.d.j.d.j.j.j.d.d.j.j.d.j.j.j.j.j.j.d.j.j.d.j.j.d.j.j.d.j.j.j.j.j.j.d.j.j.j.j.j.d.j.j.j.j.j.j.d.j.j.d.j.j.d.j.j.d.j.d.j.j.j.d.j.j.d.j.j.j.j.d.j.j.j. l d.d.j.j.j.d.8. i j.j.d.j.j.j._ e.j.j.j.j.j.j.j.j.j.O 1 d.j.j.j.d.j.j.. ; d.d.j.j.j.d.h.. h.j.j.d.j.j.O. x j.j.d.j.j.d.o. O.j.j.j.d.d.j.e. 1 j.j.j.j.j.d.j.j.j.j.j.j.d.j.j.d.j.j.j.d.j.j.j.d.j.j.j.j.d.d.j.j.j.d.j.j.j.d.j.j.j.j.j.j.j.j.j.j.j.j.j.j.j.d.j.j.j.j.j.d.j.d.d.j.j.j.j.j.j.j.d.d.j.d.j.j.j.d.j.j.j.j.d.d.j.j.j.j.j.j.j.d.j.j.j.j.d.j.j.j.d.j.j.d.j.j.j.d.j.d.d.j.j.",
"d.d.d.j.d.j.j.d.d.j.j.d.j.d.j.d.j.d.d.j.d.j.j.d.d.j.j.d.j.d.j.d.j.d.d.j.d.j.d.j.d.j.j.j.d.j.d.j.j.d.j.j.d.j.d.j.d.j.d.j.d.j.j.d.d.d.j.d.d.j.d.d.d.j.j.d.d.j.d.j.j.d.j.j.d.j.d.j.j.j.d.j.j.d.j.j.j.d.d.j.d.j.j.d.d.j.d.d.j.d.d.j.j.j.d. h d.j.d.j.d.d.f. g j.j.j.d.j.j._ 0.d.d.d.j.d.j.j.d.d.O 1 d.j.d.j.j.d.r. i j.j.j.d.d.j.d.1 8.d.j.d.d.d.O. x d.d.d.d.j.d.` O.d.d.j.j.j.s.e. 1 d.d.d.d.j.d.j.j.d.d.j.j.d.j.d.j.d.d.j.j.j.d.j.j.d.d.j.j.d.j.d.j.d.j.d.j.d.j.d.d.j.d.d.d.j.d.j.j.d.d.d.j.d.d.j.d.d.d.j.j.j.j.j.d.j.j.j.d.d.d.j.j.d.j.j.d.j.d.j.d.d.j.j.d.j.d.j.d.j.d.j.d.d.j.j.d.j.d.j.d.j.j.d.j.j.j.d.d.j.j.j.d.j.",
"d.j.j.d.d.d.d.j.d.d.d.j.d.d.d.d.j.d.j.d.d.d.d.d.d.d.d.j.j.d.d.j.j.d.j.d.d.d.j.d.d.d.d.d.d.d.d.j.j.d.d.d.d.d.d.j.d.d.j.d.d.d.d.j.d.j.j.d.j.d.d.j.d.d.d.j.d.d.d.d.d.j.d.d.j.d.d.j.d.d.d.d.d.j.d.d.d.j.d.d.d.d.d.d.d.j.d.j.d.j.d.d.d.d.j. h d.j.d.d.j.j.d.. ( d.d.d.d.d.d._ 0.d.j.j.d.d.d.d.j.d.O 1 d.d.d.d.d.j.O. j d.d.d.d.j.j.d.x ( d.d.d.j.d.O. ( d.d.d.d.j.d.o. O.j.d.d.s.j.s.e. 1 d.j.d.j.d.d.d.d.j.d.d.d.j.d.d.d.d.d.d.d.d.d.d.d.j.d.d.d.j.j.d.d.j.d.d.d.d.d.j.j.d.j.d.j.d.d.d.d.j.d.j.j.d.j.d.d.j.d.d.d.d.d.d.d.d.d.d.d.j.d.d.d.j.d.d.d.d.d.j.d.j.d.d.d.d.d.d.d.d.j.d.d.j.d.d.d.j.d.d.d.d.d.j.d.d.d.d.j.d.d.d.d.d.",
"d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.j.d.d.d.d.d.d.d.d.d.d.d.d.d.d.j.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.j.d.d.d.d.d.d.d.d.d.j.d.d.d.d. g d.d.d.d.d.d.d., O.d.d.d.d.d.d._ 0.d.d.d.d.d.d.d.d.d.O 1 d.d.d.d.d.d.( _ d.d.d.d.d.d.d.O. i d.d.d.d.d.O. x d.d.d.d.d.d.' ] d.d.d.d.d.s.e. 1 d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.j.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.j.d.d.d.d.j.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.j.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.j.d.d.d.",
"d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.j.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.j.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.j.d.d.d.d.j.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d. l d.d.d.d.d.d.d.p 9.d.d.d.d.d.d._ 0.d.d.d.d.d.d.d.d.d.O 1 d.d.d.d.d.d.p #.d.d.d.d.d.d.d.q. . d.d.d.d.d.O. x d.d.d.d.d.d.` O.d.d.d.d.d.d.9. 1 d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.j.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.j.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.j.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.",
"d.d.d.d.d.d.d.d.d.d.d.d.d.s.d.d.d.s.d.s.s.d.s.d.d.d.s.d.d.d.d.d.s.j.j.s.d.d.d.d.d.s.s.j.s.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.s.d.d.s.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.s.s.d.d.d.d.d.d.d.d.d.d.s.d.s.d.d.d.d.d.d.d.d.d. l s.j.s.s.d.d.d.z p.j.s.d.d.d.d._ 9.d.d.s.d.d.d.d.d.d.O 1 s.d.d.d.d.s., q.d.d.d.d.d.d.d.d.; 8.j.d.d.d.O. x j.d.d.s.d.s.` ] d.d.d.s.d.j.9. i d.s.d.s.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.s.d.s.d.d.d.d.s.d.d.d.d.d.d.d.d.d.d.s.d.d.s.d.s.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.d.s.",
"s.d.s.d.d.s.d.s.d.s.d.s.d.d.d.d.d.d.d.d.d.d.d.d.s.d.d.d.d.s.d.d.s.s.s.d.s.d.s.d.s.j.s.s.d.d.s.d.s.d.s.d.s.d.s.d.d.s.d.d.d.s.d.s.d.d.s.d.d.d.d.s.s.d.s.d.d.s.d.s.d.s.s.d.d.s.d.d.s.d.s.d.d.d.d.s.d.s.s.d.s.d.d.d.d.d.d.s.s.d.s.d.d.s.d.. h j.d.s.d.d.d.s.` + d.d.d.d.d.s.d.) 9.s.d.d.d.d.s.d.d.s.O i d.d.s.d.s.s.. . d.d.d.d.d.s.s.d.s.h ( d.d.s.s.O. ( d.d.d.d.d.d.' O.s.s.d.s.d.s.9. 1 d.d.d.d.d.s.d.s.d.s.d.s.d.s.d.s.d.s.d.s.d.s.s.d.d.d.s.d.s.s.d.s.d.s.d.s.d.d.s.d.d.d.s.d.d.s.d.s.d.d.s.s.d.s.d.d.s.d.s.s.d.s.d.d.s.d.d.s.d.s.d.d.d.d.s.s.d.d.d.d.s.d.s.s.d.s.d.d.d.d.d.d.d.d.d.s.d.d.s.d.s.d.s.s.d.d.s.d.d.s.d.d.d.",
"d.s.s.s.s.s.s.d.s.s.s.d.s.s.s.s.s.d.s.d.s.d.s.d.s.d.s.d.s.s.d.s.s.j.s.d.s.s.s.d.s.j.s.d.s.s.s.d.s.d.d.s.d.s.s.s.s.s.s.s.s.s.s.d.d.s.d.s.d.s.s.s.s.s.d.s.s.s.s.s.s.d.d.s.s.s.s.s.s.d.d.s.s.d.s.s.s.d.s.d.s.d.s.s.d.s.d.s.s.s.d.s.s.d.d. g s.s.s.s.d.s.s.8. , d.s.s.d.s.s.s.) 9.s.d.s.d.s.s.d.s.s.O 1 s.d.d.s.s.9. , s.d.s.s.s.d.s.s.s.O. i s.s.d.d.] z s.s.s.d.s.s.' ] s.d.s.s.d.s.0. 1 s.s.d.s.d.d.s.d.s.d.s.d.s.s.d.d.s.s.d.d.s.d.s.s.s.s.s.s.d.d.s.d.s.s.d.d.s.s.s.d.s.s.s.d.s.s.d.d.s.d.s.s.d.d.s.s.d.s.s.d.d.s.d.s.s.s.s.s.s.d.d.s.s.s.s.s.d.s.d.s.d.s.d.s.d.d.s.s.d.d.s.s.d.s.s.d.s.s.s.s.s.s.d.d.s.s.s.s.s.s.s.s.s.",
"d.s.d.s.d.s.d.s.s.d.s.d.s.d.d.s.s.s.d.s.d.s.s.s.d.s.s.d.s.d.s.s.s.s.s.s.s.j.s.s.s.s.d.s.s.d.s.d.s.s.s.s.d.s.d.s.d.s.d.s.s.d.s.d.s.s.d.s.s.s.d.d.d.s.s.d.d.d.s.d.s.d.s.s.s.d.d.s.d.s.d.s.d.s.d.d.d.s.d.s.d.s.s.d.s.d.s.d.d.s.s.d.s.s.j. h d.s.d.d.s.d.d.p. p s.d.d.s.s.s.s._ 9.d.s.s.d.s.d.s.s.s.O 1 d.s.s.d.s.' p s.s.s.d.s.d.s.s.s.q. . s.d.s.d.] z s.s.d.s.d.s.' O.s.s.s.d.s.s.0. 1 s.d.s.d.s.s.d.s.s.s.d.s.d.s.s.s.s.d.s.s.s.d.s.d.s.s.d.d.s.s.d.s.s.d.s.s.d.s.d.s.s.s.d.s.d.s.s.s.s.s.s.d.s.s.s.d.s.s.d.s.s.s.s.s.d.d.s.d.s.s.s.s.d.d.d.s.s.s.d.s.s.d.s.d.s.s.d.s.s.s.s.d.s.s.d.s.d.d.d.s.d.s.d.s.s.s.d.d.s.d.d.s.d.",
"s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.d.s. h s.s.s.s.s.s.s.s.O x s.s.s.s.s.s.s.) 9.s.s.s.s.s.s.s.s.s.. 1 s.s.s.s.s.( ( s.s.s.s.s.s.s.s.s.a., 8.s.s.s.] z s.s.s.s.s.s.` ] s.s.s.s.s.a.9. 5 s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.",
"s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.a.s.s.s.s.s.s.s.s.s.d. g s.s.s.s.s.s.s.s.< ) s.s.s.s.s.s.s._ 9.s.s.s.s.s.s.s.s.s.O 1 s.s.s.s.s.p | s.s.s.s.s.s.s.s.s.p.( ) s.s.s.] z s.s.s.s.s.s.' ] a.s.s.s.s.s.9. 1 s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.s.",
"s.s.a.s.a.s.s.s.s.a.s.a.a.s.s.s.a.s.s.s.s.s.a.s.s.s.s.a.s.s.s.s.a.s.a.s.s.s.s.a.a.s.a.s.s.a.s.s.a.s.s.s.a.s.s.s.s.s.s.a.s.a.s.s.s.s.s.s.a.s.a.a.s.a.a.s.s.s.a.s.s.s.a.s.a.s.s.s.s.s.a.s.s.s.a.a.s.s.s.a.s.a.s.s.s.s.a.s.a.s.s.s.s.a.s. h s.a.s.s.s.a.a.s.g <.p.s.s.a.s.a.s.) 9.s.s.s.a.s.a.s.s.a.. 1 s.s.s.s.s., 8.s.s.s.w.s.s.w.s.s.s.<. p s.a.a.] z s.s.a.a.s.s.' ] a.s.s.a.s.s.9. i a.s.s.a.s.s.s.a.s.s.a.s.s.s.s.a.s.s.w.s.s.s.a.s.a.a.s.s.s.s.s.a.s.s.s.s.a.a.s.s.s.s.a.s.s.s.s.a.s.s.s.s.s.a.a.s.s.a.s.s.s.a.s.s.s.s.s.s.a.s.s.s.a.s.s.a.a.s.a.s.s.s.s.s.a.s.a.s.s.a.s.s.s.s.a.s.a.s.a.s.s.s.s.a.a.s.s.s.a.s.s.s.s.",
"a.a.s.s.s.s.a.a.s.s.s.s.s.s.a.a.s.s.s.a.a.s.s.s.a.a.s.s.a.s.a.s.s.s.a.s.s.a.s.s.s.s.a.s.s.a.s.a.s.s.a.s.s.s.a.s.a.a.s.s.s.s.a.a.s.a.a.s.s.s.s.s.s.s.s.s.a.a.s.s.a.s.s.s.a.s.s.a.a.s.s.a.a.s.s.s.s.a.s.a.s.s.s.a.a.s.s.s.a.s.a.s.a.s.s. h s.s.a.a.s.s.s.w.( q.s.s.s.s.s.s.a.) e.a.a.s.s.s.s.a.a.s.O 1 w.s.s.s.s. p.s.s.s.s.s.s.s.s.s.s.p.. O s.a.s.] z a.a.s.s.a.p.' ] s.a.s.a.s.s.9. . . 1 s.a.a.s.s.a.s.s.s.a.s.s.a.a.s.s.s.s.s.s.s.s.a.s.s.s.s.a.s.a.s.s.s.a.a.s.s.s.s.a.a.s.s.s.a.a.s.s.s.a.s.a.s.s.s.s.a.s.s.a.s.s.s.a.s.a.s.s.s.s.a.s.s.a.s.s.s.s.s.s.a.s.a.s.a.s.s.s.a.s.s.a.a.s.s.s.s.s.s.s.a.a.s.s.s.s.a.s.s.a.a.s.s.",
"s.a.a.s.a.a.s.a.s.a.s.s.a.s.a.s.a.a.a.s.a.s.a.s.s.a.s.a.s.a.s.a.a.s.s.a.s.s.s.a.a.s.a.s.a.s.s.s.a.s.s.s.a.s.s.a.a.a.s.s.a.s.s.s.a.s.s.a.s.s.a.s.a.s.s.a.s.s.a.s.a.a.s.s.a.s.s.s.s.a.a.s.a.s.s.a.a.s.a.s.a.s.a.s.a.a.s.a.a.s.a.s.a.s.s.j j j j j j j j j j j j j j j j j j j j j ] a.a.s.s.a.a.a.a.<.j j j j j j j j j j j j j j j w.s.s.s.a.s.s.a.<.j j j j j j j j j j j j j j j j j j j j j q.s.a.s.a.s.s.a.s.s.( h g h h h h h h h h h h h h j h h h h h h h h ) s.s.s.s.q.j j j j j j j j j j j j j j j j j j j j j j j z s.s.a.s.s.s.s.a.s.s.a.s.) j j j j j j j j j j j j j j j j j j j j j j q.s.a.0.h h h h h h h h h h h h h j h h h h h h h h h h h h h h h h j h h h h h h h h h h h [ a.s.a.s.s.a.9.j j j j j j j j j j j j j j j j j j j j j j j j 9.a.a.a.s.a.a.q.j j j j j j j j j j j j j j j j z j j j j j ) s.a.s.s.a.s.a.s.a.a.a.s.s.a.s.s.a.s.w.a.s.a.s.a.s.s.a.s.s.a.a.s.a.s.a.s.a.s.a.s.a.a.s.a.s.a.s.s.a.s.a.a.s.a.s.s.s.a.a.s.a.s.s.a.s.s.a.s.s.a.s.s.a.s.s.a.s.s.a.a.s.a.s.a.s.s.a.s.s.a.s.a.s.s.a.s.a.s.a.s.s.w.s.s.a.a.s.a.s.a.s.a.s.",
"a.a.s.a.a.s.s.a.a.a.a.a.a.a.s.a.s.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.s.a.a.a.a.a.a.a.a.a.a.a.s.a.a.a.s.a.a.s.a.a.a.a.a.a.a.a.a.a.a.s.s.a.a.a.s.a.a.a.a.a.a.a.a.a.a.a.s.a.a.a.s.a.a.a.a.a.a.a.a.a.a.s.a.a.a.a.a.a.a.s.s.w.w.w.s.w.a.a.a.p.a.s.s.s.w.a.a.a.a.a.a.a.a.a.s.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.w.a.a.s.a.s.s.s.w.w.s.a.w.a.a.a.a.a.s.a.a.a.a.p.a.w.s.a.w.a.a.s.a.a.a.s.a.s.s.a.s.a.a.w.s.a.a.a.a.a.a.a.a.w.s.w.a.a.a.a.s.a.a.w.s.s.w.w.s.a.a.a.a.a.s.a.a.a.a.a.a.a.a.a.a.s.w.w.s.s.a.7.s.w.s.a.w.a.a.a.s.s.w.s.a.a.a.a.a.s.s.s.w.w.s.a.w.w.s.s.w.a.a.a.a.s.a.a.a.a.a.a.a.p.a.a.a.a.a.a.a.a.a.a.a.a.a.a.s.a.s.a.a.a.a.a.a.s.s.a.a.a.s.a.a.a.a.a.a.a.a.a.s.a.a.a.a.a.a.a.a.s.s.a.a.a.s.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.s.s.a.a.a.a.a.a.s.a.a.s.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.s.a.a.a.a.a.a.s.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.s.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.s.w.s.s.s.w.s.s.w.s.a.a.a.a.a.",
"a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.s.a.s.s.w.a.a.a.a.a.a.w.w.w.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.w.s.s.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.s.w.s.w.a.a.a.a.a.a.a.a.s.w.a.a.w.a.a.a.a.s.w.a.s.w.w.s.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.s.s.w.a.a.a.a.a.a.a.a.a.a.a.a.w.s.a.a.a.a.a.a.w.w.s.s.a.a.a.a.s.w.w.s.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.s.w.w.s.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.w.s.a.a.w.w.s.s.a.a.a.a.",
"a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.s.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.w.a.w.s.w.a.a.a.a.a.a.s.s.w.s.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.a.a.a.a.a.a.w.s.w.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.a.a.a.a.a.a.a.a.a.a.w.a.w.a.a.a.a.w.a.a.a.a.a.a.s.w.a.a.a.a.a.a.a.w.a.a.w.w.s.w.a.a.a.w.a.a.a.a.a.a.a.a.a.a.a.a.w.w.s.w.a.a.a.a.a.a.a.a.a.a.a.a.w.w.a.a.a.a.a.a.w.s.w.w.a.a.a.a.w.s.w.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.a.a.a.a.a.a.a.a.a.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.a.a.w.a.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.a.w.s.w.w.a.a.w.s.w.w.a.a.w.a.",
"a.a.a.a.a.a.a.a.a.a.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.a.a.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.s.s.w.w.s.w.a.a.a.w.w.s.w.w.s.w.a.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.a.w.a.a.a.a.a.a.a.a.a.a.a.a.a.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.a.a.a.a.a.a.a.a.a.a.a.s.s.w.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.s.w.s.w.a.a.a.a.a.a.a.a.a.a.a.a.s.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.s.s.a.a.a.a.a.a.a.a.a.a.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.s.a.a.a.w.s.w.a.s.a.a.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.w.a.a.a.a.a.a.a.a.s.s.w.w.s.w.a.a.w.s.w.s.a.a.a.a.",
"w.a.w.a.w.w.a.w.a.a.a.w.w.a.w.a.a.a.7.a.a.w.w.a.a.a.7.a.w.a.w.a.w.a.w.a.a.a.w.a.w.a.w.a.a.w.w.a.a.w.a.a.a.a.a.w.w.a.a.a.w.a.w.a.a.a.w.a.a.a.a.w.w.a.w.a.a.w.a.w.a.a.w.a.a.w.w.a.w.a.w.w.a.a.w.a.w.a.w.a.a.w.a.w.a.a.a.w.w.a.w.a.a.a.w.a.a.a.7.a.a.a.w.a.w.a.a.w.a.a.w.a.a.w.a.a.w.w.a.w.a.a.w.a.a.w.w.a.a.w.w.a.w.a.a.a.a.w.w.a.w.w.w.s.w.a.w.a.w.s.w.w.w.s.w.w.a.a.a.w.a.w.a.a.a.w.w.a.a.a.7.a.a.w.a.a.w.a.a.w.w.a.w.a.7.a.w.a.a.w.a.a.w.a.a.w.a.a.a.w.a.a.w.a.w.a.w.a.w.a.a.w.a.a.a.w.w.a.w.a.w.a.a.a.w.a.a.w.w.a.a.a.w.a.w.a.w.a.a.w.w.a.a.7.w.a.w.a.w.w.w.a.a.w.w.a.w.w.a.w.a.a.w.a.a.a.w.a.s.w.w.a.a.w.w.a.a.w.a.a.a.w.7.a.w.w.a.w.a.w.w.a.a.w.a.a.w.a.a.w.w.s.w.w.w.a.w.a.a.w.a.w.a.a.a.w.a.a.w.a.a.w.a.w.a.a.a.w.w.a.w.a.a.a.a.w.a.a.7.a.w.a.w.a.w.a.a.w.a.w.w.w.w.a.w.a.a.a.a.a.w.a.a.a.w.a.w.a.w.a.a.w.w.a.w.a.w.w.a.w.a.w.a.a.a.a.a.w.a.a.w.a.a.w.a.a.w.a.w.w.w.a.w.a.w.a.w.w.a.w.a.a.w.a.a.w.a.a.a.w.a.w.w.a.a.w.a.w.w.a.w.w.w.a.w.a.w.w.a.w.w.a.w.a.w.a.a.w.a.w.w.a.7.a.w.a.a.a.w.w.a.w.a.a.w.w.a.a.a.w.w.a.w.a.w.a.w.w.s.w.w.a.a.w.w.w.w.a.w.a.w.w.",
"w.w.w.w.w.a.w.w.w.w.w.a.w.w.a.w.w.a.a.a.a.a.w.a.a.w.w.a.w.a.w.a.w.w.a.w.w.w.w.a.a.w.w.w.w.w.a.w.w.w.w.w.a.w.w.w.a.w.w.w.w.a.w.w.w.a.w.w.w.w.a.w.w.w.w.w.a.w.w.w.w.w.a.w.w.w.a.w.w.w.w.a.w.w.w.a.w.w.a.w.w.w.w.a.w.w.w.a.w.a.w.w.a.a.w.a.a.w.w.w.w.w.a.w.w.w.w.w.w.w.w.a.w.w.w.w.w.a.w.w.w.w.w.w.w.w.a.w.w.w.a.w.w.w.a.w.w.w.w.a.w.w.w.w.a.w.w.w.w.a.w.w.w.s.w.w.a.a.a.a.7.a.a.w.a.w.w.a.a.w.w.a.w.w.w.w.a.w.w.w.a.a.a.a.a.a.a.w.w.w.w.w.a.w.w.w.a.w.a.w.w.w.a.a.w.a.w.a.w.a.w.w.w.w.w.a.w.w.a.w.w.a.a.7.7.a.w.w.a.w.w.w.w.a.w.w.a.w.w.w.a.a.a.a.w.a.w.a.w.a.w.w.w.a.w.w.w.a.a.a.a.a.w.a.a.7.7.a.7.w.w.a.w.w.w.a.w.w.w.w.7.a.a.a.w.a.w.w.w.a.a.w.w.w.w.w.a.w.w.w.w.w.w.a.w.w.w.w.w.a.w.w.w.w.w.w.w.w.a.w.w.w.w.a.w.w.w.a.w.a.w.w.7.a.7.a.a.w.w.w.w.a.a.w.w.w.w.w.w.a.w.a.w.w.w.w.a.w.w.w.a.w.w.w.w.a.a.w.a.w.7.a.w.a.w.w.w.a.w.a.w.w.w.w.a.w.w.w.w.w.a.w.w.w.w.w.w.w.w.a.w.w.w.a.a.w.w.w.w.w.a.w.w.w.w.a.w.a.w.w.w.a.w.a.w.w.w.w.w.w.w.a.w.a.w.w.w.a.w.a.w.w.w.a.a.w.w.w.w.w.a.w.w.w.w.a.w.w.w.a.w.w.a.w.w.a.w.w.w.w.a.w.w.a.w.w.w.w.w.w.a.w.w.w.w.a.a.w.w.w.w.a.",
"w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.7.7.a.7.7.a.7.w.w.w.w.w.7.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.7.7.a.7.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.7.a.7.7.a.7.w.w.7.w.a.7.w.w.w.w.w.w.w.w.w.w.w.w.7.a.7.7.a.7.w.w.w.w.w.w.w.w.w.w.w.w.7.w.w.w.7.a.w.7.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.7.a.7.a.w.w.w.w.w.w.w.w.w.w.w.7.w.w.w.7.a.7.7.a.7.w.w.w.w.w.w.w.w.w.w.w.w.7.a.7.7.a.7.a.7.a.a.w.w.w.w.w.w.w.w.w.w.w.w.a.7.7.a.7.w.w.w.w.a.7.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.a.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.7.a.7.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.a.7.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.",
"w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.7.a.7.a.7.a.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.a.w.w.w.a.w.w.7.a.7.a.7.a.a.7.a.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.a.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.a.w.w.7.a.7.a.7.a.w.w.w.w.w.w.w.w.w.a.a.7.7.a.a.a.w.w.w.w.w.7.a.7.a.7.a.w.w.w.a.w.w.a.7.a.7.w.w.w.w.a.7.a.7.a.7.w.w.w.a.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.a.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.a.w.w.a.7.a.a.7.a.7.a.7.w.w.w.w.w.w.w.w.w.w.7.a.a.w.w.w.w.w.w.w.w.w.7.a.7.a.7.a.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.7.a.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.a.7.a.a.7.a.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.w.",
"w.w.w.w.w.w.w.w.w.7.w.w.w.7.w.w.w.w.w.w.w.7.w.w.w.w.7.w.w.w.w.7.w.w.w.w.w.w.w.w.7.w.w.7.w.w.7.w.w.w.w.7.w.w.w.w.w.w.w.7.7.w.w.w.w.w.w.w.7.w.w.w.a.7.a.7.w.7.w.w.7.w.w.7.w.w.7.w.w.w.w.w.w.7.7.w.7.w.w.w.w.w.7.w.w.w.w.w.w.w.7.w.7.w.a.7.7.a.7.a.7.a.w.7.7.w.w.7.w.w.w.7.w.w.w.w.w.w.w.7.7.w.w.w.w.7.w.w.7.w.w.w.7.7.w.w.7.w.w.w.w.w.w.w.7.w.w.w.w.w.w.7.w.w.w.7.w.w.7.a.7.a.7.a.w.7.7.w.a.7.7.w.7.w.7.w.7.a.7.a.7.7.7.a.7.w.w.w.a.7.a.7.w.7.w.w.7.w.w.7.7.a.7.a.w.w.w.7.7.a.7.a.7.a.w.w.w.7.w.7.w.w.w.7.w.w.w.w.w.w.w.7.7.w.w.w.w.7.w.w.w.7.w.w.w.w.w.w.w.7.w.w.w.w.w.w.w.w.w.7.7.a.7.w.w.7.w.7.7.a.7.a.7.a.7.w.w.w.7.w.w.w.w.w.7.w.7.w.a.7.7.w.7.w.a.7.a.7.a.7.w.w.w.7.w.w.7.w.w.w.w.7.7.w.w.w.w.7.w.w.w.w.w.w.w.w.w.w.w.w.w.7.w.7.w.w.w.7.w.w.w.w.w.w.w.7.w.w.w.w.7.w.w.w.7.w.w.w.w.7.w.w.7.w.w.7.w.w.7.w.w.w.w.w.7.w.w.w.7.w.w.w.w.w.w.7.w.w.w.w.w.7.w.w.w.7.w.w.w.w.w.w.7.w.w.w.w.w.7.w.w.w.w.w.7.w.w.w.w.w.w.7.w.w.w.w.w.w.w.w.w.w.7.w.w.w.7.a.7.w.w.7.w.w.w.7.w.w.w.w.7.w.w.w.7.w.w.w.w.w.7.w.w.w.7.w.w.w.w.w.w.w.w.7.w.w.w.w.w.w.w.w.w.w.w.7.w.w.w.w.w.7.",
"7.w.w.w.w.7.7.7.w.7.w.w.w.7.7.w.w.7.7.w.w.w.7.7.7.w.w.7.7.w.7.7.w.w.7.w.w.7.7.7.w.w.7.w.7.w.w.7.w.7.7.w.7.w.7.w.w.7.7.w.7.w.7.w.7.7.w.w.w.7.7.7.7.a.a.7.7.a.7.w.w.w.7.w.7.w.w.7.w.7.w.w.7.w.w.w.w.7.7.w.7.w.7.w.7.7.w.7.7.w.w.w.7.w.7.7.w.7.w.7.7.a.7.a.w.w.7.w.w.7.7.w.7.w.7.7.w.w.7.w.w.w.w.7.7.w.7.w.w.7.w.7.w.7.7.w.w.7.w.7.7.w.w.w.w.w.7.w.w.7.7.w.7.w.w.w.7.w.7.7.w.7.7.a.7.a.a.7.7.w.7.w.7.w.w.7.7.7.7.7.7.w.7.7.7.w.7.7.7.a.7.w.7.a.7.w.w.w.7.w.a.7.7.w.7.w.w.7.7.7.7.7.7.7.w.w.7.w.w.7.w.7.7.w.7.w.7.w.w.7.7.w.7.w.7.w.7.7.w.w.w.7.7.w.w.7.7.w.w.w.7.7.7.w.7.7.7.w.7.w.w.7.w.7.7.a.7.a.7.a.w.7.7.a.a.7.7.w.w.w.7.7.w.7.7.w.w.7.w.w.w.7.w.w.7.a.w.7.7.7.w.7.7.w.7.w.w.w.w.w.7.w.w.w.w.w.7.w.7.w.7.7.w.7.7.7.w.7.7.w.w.w.7.7.w.w.w.7.7.w.w.7.7.w.7.w.7.7.7.w.w.w.w.7.w.7.w.7.w.7.7.w.w.w.7.w.7.7.w.w.w.7.7.w.w.w.w.7.w.7.w.7.w.7.7.w.7.w.w.7.7.w.w.7.7.w.w.7.w.w.7.w.w.7.7.w.w.w.w.w.7.w.7.w.7.w.7.w.7.w.7.w.7.w.w.7.w.7.7.w.7.w.7.w.7.7.w.7.a.7.7.7.w.w.w.w.7.7.7.w.w.7.7.w.7.w.7.w.7.w.w.7.w.7.w.7.w.7.7.7.w.7.7.w.w.w.w.w.w.w.w.7.7.w.w.w.7.7.7.w.w.7.",
"7.7.7.w.7.w.7.7.w.w.7.7.7.w.7.7.7.w.7.7.7.7.7.w.7.7.w.7.w.7.7.7.7.7.7.7.7.7.w.7.7.7.7.w.7.7.w.7.7.w.7.7.7.w.7.7.7.w.7.7.w.7.7.7.7.w.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.w.7.7.7.7.7.7.7.7.7.w.7.w.7.7.7.w.7.w.7.7.w.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.w.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.w.7.7.7.w.7.7.a.7.7.w.7.7.w.w.7.7.w.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.a.7.7.7.7.w.7.7.7.w.7.7.7.w.7.7.7.w.7.7.7.w.7.7.w.7.7.7.7.w.7.7.7.w.7.7.7.w.7.7.7.7.7.w.7.7.7.w.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.w.7.7.7.w.7.7.7.7.w.7.7.7.7.7.w.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.w.7.w.w.7.7.7.7.7.7.7.7.w.7.7.7.w.7.7.7.w.7.7.w.7.7.w.7.7.7.7.7.w.7.7.w.7.7.w.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.w.7.w.7.7.7.w.7.7.7.w.7.7.7.w.7.7.w.7.7.w.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.w.7.7.7.7.7.7.w.7.7.7.7.7.w.7.7.w.7.w.7.7.7.7.7.7.7.w.7.7.w.7.7.7.7.7.w.7.w.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.w.7.7.w.7.",
"7.w.w.7.7.w.7.7.7.w.7.w.7.w.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.7.w.7.7.w.7.7.w.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.w.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.w.7.7.7.7.7.w.w.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.w.7.7.w.7.7.7.7.7.w.7.w.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.w.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.w.7.7.w.7.7.7.7.7.w.7.7.7.w.7.7.w.7.7.w.w.7.7.7.7.w.7.7.7.7.7.7.7.w.7.7.w.7.7.7.w.7.w.7.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.w.7.7.w.7.7.7.7.w.7.w.7.7.7.7.7.7.w.7.7.7.w.7.7.7.7.7.w.7.w.7.7.7.7.7.7.7.w.7.7.w.7.w.7.7.w.7.7.7.w.7.7.7.w.7.w.7.7.7.7.7.w.7.7.7.w.7.w.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.w.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.w.7.7.w.7.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.w.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.w.7.w.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.w.7.7.w.7.7.w.",
"7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.w.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.7.w.7.w.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.w.w.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.w.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.",
"7.7.7.7.7.7.7.7.7.7.7.7.7.w.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.6.7.7.7.7.7.7.7.7.7.7.7.6.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.6.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.6.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.",
"7.7.5.7.5.7.7.7.5.7.7.5.7.5.7.7.6.7.7.7.7.7.6.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.6.7.7.7.7.6.7.6.7.6.7.6.7.6.7.7.7.6.7.7.7.6.7.7.6.7.7.7.6.7.7.7.7.6.7.7.7.7.6.7.7.7.7.7.6.7.7.7.7.7.7.7.7.6.7.7.7.6.7.6.6.7.7.7.7.6.6.7.7.7.7.7.7.7.7.7.7.6.7.7.7.7.7.7.6.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.6.7.7.7.7.7.7.7.7.6.7.7.7.7.6.7.6.7.6.7.7.7.6.7.7.7.7.7.7.7.7.7.6.7.7.7.7.7.7.7.7.7.7.6.7.7.7.7.7.7.7.7.7.7.5.7.7.7.7.7.7.7.7.7.7.7.6.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.6.7.7.7.7.7.6.7.6.7.6.7.6.7.6.7.7.7.6.7.7.7.7.6.7.6.7.7.7.7.6.7.7.7.7.7.7.7.7.7.6.7.7.7.7.6.7.7.7.7.7.6.7.7.7.7.7.6.7.6.7.7.7.7.6.7.7.6.7.6.7.6.7.7.6.7.7.7.7.7.6.7.7.7.7.7.6.7.7.7.7.7.7.6.7.7.7.7.7.6.6.7.7.6.6.7.6.7.6.7.7.7.7.7.6.6.7.7.6.7.7.7.7.7.7.7.6.6.7.7.6.7.7.7.6.7.6.7.6.7.7.7.6.7.7.7.7.7.7.7.7.6.7.7.7.7.7.7.6.7.7.7.6.7.6.7.7.7.7.7.7.6.7.7.7.7.7.7.7.6.7.7.7.6.7.7.6.7.7.7.6.7.6.7.6.7.6.7.7.7.7.7.6.7.7.7.7.7.7.7.7.7.7.7.7.7.6.7.7.7.7.6.7.7.7.7.7.7.7.7.7.6.7.7.7.7.7.6.7.7.7.7.7.7.7.7.7.7.6.7.6.7.7.7.7.7.6.7.7.7.7.7.6.7.7.6.7.7.7.7.7.6.7.6.7.6.",
"7.7.7.6.6.7.7.7.7.7.7.7.7.7.7.7.7.7.7.7.6.7.7.7.6.7.7.7.7.7.7.7.7.7.7.7.6.7.7.7.7.6.7.7.5.7.7.5.7.6.7.7.6.7.6.7.6.7.6.7.6.7.7.6.7.7.7.6.7.7.7.6.7.7.6.7.7.7.6.7.7.7.7.7.7.7.7.6.7.7.7.6.7.7.7.7.7.6.6.7.7.7.6.7.7.6.7.6.7.7.7.7.7.6.7.6.7.6.7.7.7.7.6.7.6.6.7.6.7.6.7.7.7.6.7.6.7.7.7.6.6.7.7.7.7.6.7.7.5.7.7.7.7.6.7.7.7.6.7.7.6.7.7.7.7.6.7.6.7.7.7.6.6.7.7.7.7.7.6.7.7.6.7.7.7.7.7.7.7.7.7.7.6.7.7.7.7.7.6.7.7.7.6.7.6.6.7.6.7.7.7.7.6.7.7.7.6.7.7.7.7.7.7.7.7.7.6.7.6.7.7.7.7.6.7.7.7.7.7.6.7.6.7.7.6.7.6.7.6.7.6.7.6.7.7.6.6.7.7.7.7.7.7.6.7.7.7.6.7.7.7.7.7.7.6.7.7.6.7.7.7.7.7.7.7.7.7.7.7.6.7.6.7.6.7.7.7.7.6.7.7.7.7.7.7.7.6.7.6.7.7.7.7.6.7.6.7.7.7.6.7.6.7.7.7.6.7.6.7.7.6.7.6.7.7.6.7.6.7.6.7.7.7.6.6.7.7.6.7.7.7.7.7.6.7.6.7.6.7.7.6.7.6.7.6.7.6.6.6.7.7.7.6.7.7.7.6.7.7.7.7.7.7.7.7.6.7.7.7.7.6.7.7.7.7.7.6.7.7.6.7.7.6.7.7.7.7.7.7.7.7.7.7.7.7.7.6.7.7.7.7.7.6.7.7.7.7.7.7.7.7.7.7.7.7.7.6.7.7.7.6.7.7.7.7.7.7.7.7.7.7.7.7.7.7.6.7.7.7.6.7.7.7.7.7.7.6.7.7.7.6.7.7.7.6.7.7.7.6.7.7.6.7.7.6.7.7.6.7.6.7.7.7.6.7.6.7.7.6.7.6.7.7.7.7.7.7.6.7.7.7.6.",
"6.6.7.7.7.7.6.7.7.7.7.7.5.7.7.5.6.7.6.7.7.6.6.7.7.7.6.6.6.6.6.7.6.7.6.6.7.7.6.7.7.7.7.6.7.7.7.7.6.7.7.6.6.7.7.7.7.6.7.7.7.7.6.7.7.6.6.7.6.7.6.7.7.6.6.7.6.7.7.6.7.6.6.6.6.7.6.7.7.6.6.7.6.7.6.6.6.7.7.7.6.7.6.7.7.6.6.7.7.6.6.7.7.7.6.7.6.7.6.6.7.6.7.7.7.7.7.7.7.7.6.7.6.7.7.7.6.6.7.7.7.7.6.7.7.7.6.7.7.7.7.5.7.7.6.7.6.7.6.7.7.6.6.6.7.6.6.7.7.6.6.7.7.7.6.6.6.7.7.6.7.7.6.7.6.6.7.6.6.7.6.7.7.7.6.7.6.6.7.7.7.6.7.7.7.7.7.7.6.7.6.7.7.6.6.7.7.7.6.7.6.6.6.7.6.6.7.7.7.7.6.7.6.7.5.7.7.6.6.7.6.7.7.6.6.7.7.7.7.6.7.7.7.7.6.7.7.6.6.6.6.7.6.7.7.6.6.7.6.7.6.6.6.7.7.6.7.7.6.7.6.6.7.6.6.7.6.7.6.7.7.6.6.7.7.6.7.6.7.6.6.6.7.6.6.6.7.7.7.7.6.7.6.7.7.7.6.7.6.7.6.7.7.6.6.7.7.7.6.6.7.7.7.7.6.7.6.7.7.7.6.7.6.7.7.7.6.7.7.6.6.7.7.7.7.7.6.7.6.7.7.6.6.7.7.7.7.7.7.6.7.6.7.7.6.7.7.6.6.6.6.7.6.6.7.7.6.7.6.6.7.7.7.7.7.6.7.6.6.7.7.6.7.6.6.6.7.6.6.6.6.7.6.7.6.6.7.7.6.7.6.6.7.7.7.6.6.7.6.6.7.6.6.7.6.7.7.6.6.7.7.7.6.7.6.6.6.7.7.6.6.6.6.7.6.7.7.6.6.7.6.7.6.6.6.7.6.7.6.7.7.6.6.7.7.6.7.6.7.6.7.7.6.7.7.6.7.7.7.7.6.7.6.7.7.7.6.6.7.7.7.7.6.7.7.6.7.6.6.7.6.7.",
"6.6.7.6.6.6.6.6.5.7.7.5.6.7.7.5.7.6.6.6.6.6.7.6.6.6.6.7.6.7.7.6.6.6.6.7.6.6.6.6.5.7.6.7.6.7.6.7.7.6.6.6.6.7.6.6.6.6.7.6.6.6.6.6.6.6.6.7.7.6.6.6.6.6.6.7.7.6.6.6.6.6.6.7.7.6.6.6.6.6.6.7.7.6.6.6.6.7.6.6.6.7.6.6.6.7.6.6.6.6.7.6.6.6.6.7.7.6.6.7.6.7.6.6.7.6.6.6.6.6.7.6.6.7.6.6.6.6.7.6.6.6.6.6.5.7.7.7.6.7.6.7.6.6.7.6.6.7.6.6.7.6.7.6.6.7.7.6.6.6.6.7.7.6.6.6.6.7.6.6.6.6.7.6.7.6.6.6.7.6.6.6.6.6.6.6.6.7.7.6.6.6.7.6.7.7.5.7.7.6.6.6.6.6.7.6.6.6.6.6.6.7.7.6.6.6.7.6.6.6.6.6.7.6.6.7.7.7.6.7.7.6.6.6.6.7.6.6.6.6.7.6.6.6.6.6.6.6.6.7.7.6.6.6.6.6.6.7.7.6.6.6.6.7.6.6.6.6.7.6.7.6.6.6.7.6.6.6.6.7.6.7.6.7.6.6.6.7.6.6.7.6.6.7.6.6.7.6.6.6.6.6.6.7.6.6.6.7.6.6.7.6.6.6.6.7.6.6.6.7.7.6.6.6.6.7.6.7.6.6.6.6.6.7.6.6.7.6.6.6.7.6.6.7.6.6.6.7.6.6.6.6.6.7.7.6.6.6.7.6.6.6.6.6.7.6.6.6.6.7.7.6.6.6.6.6.7.6.6.6.6.6.6.6.6.7.7.6.6.7.6.7.6.6.7.6.6.7.6.7.7.6.6.6.6.7.6.6.6.6.6.7.7.6.6.6.7.6.6.7.6.6.7.6.6.6.6.6.7.6.6.6.6.6.6.7.7.6.6.6.6.7.7.6.6.6.6.6.6.7.7.6.6.6.6.7.6.6.7.6.6.6.6.7.6.6.6.7.6.6.5.7.7.7.6.7.5.7.6.6.7.6.6.7.6.6.6.6.7.6.6.6.6.6.5.7.6.7.6.7.6.7.",
"6.6.6.6.6.6.6.6.7.5.5.7.6.6.6.7.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.7.5.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.7.5.5.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.7.5.5.7.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.7.6.6.5.5.7.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.7.5.5.6.6.5.7.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.",
"6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.5.6.6.6.5.6.6.6.6.6.6.6.6.6.5.6.5.6.6.6.5.6.6.6.5.6.6.6.6.6.6.6.5.6.6.6.5.6.6.6.6.6.6.5.6.6.6.6.6.6.6.5.6.5.6.6.6.6.5.6.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.5.6.6.6.6.6.6.6.6.5.6.5.6.6.6.5.6.6.6.5.6.6.6.6.6.6.6.6.5.6.5.6.6.6.6.6.6.6.6.5.6.5.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.6.6.5.5.6.5.6.6.6.6.6.6.6.6.6.6.5.6.7.5.6.6.6.5.6.5.6.6.6.6.6.6.6.6.6.6.5.6.5.6.6.6.5.6.6.6.5.6.6.5.6.6.6.6.5.6.6.6.5.6.6.6.6.6.6.5.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.5.6.6.6.6.5.6.5.6.6.6.6.6.6.6.6.5.6.5.6.6.5.6.6.5.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.5.6.6.6.6.6.6.5.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.6.5.6.5.6.6.6.6.6.5.6.6.6.6.6.5.6.6.5.6.6.6.5.6.6.6.6.6.6.5.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.6.5.6.6.5.6.5.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.5.6.6.6.6.6.5.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.5.6.6.6.5.6.5.6.6.6.6.6.6.6.",
"6.6.5.6.5.6.6.5.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.5.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.6.5.6.6.6.6.5.6.6.6.6.6.5.6.6.6.6.6.5.6.6.6.5.6.6.6.6.6.6.6.6.6.6.5.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.5.6.6.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.5.6.6.5.6.6.5.6.6.6.6.6.6.6.6.6.6.5.6.6.5.6.5.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.5.6.6.5.7.6.6.6.6.6.6.6.6.6.6.6.6.6.6.7.5.5.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.5.6.6.6.5.6.6.5.6.6.5.6.6.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.5.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.5.5.6.6.6.6.6.6.5.6.6.6.6.6.5.6.6.6.5.6.6.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.6.5.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.5.6.6.6.6.6.6.5.6.6.6.6.6.5.6.6.5.6.5.6.5.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.5.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.6.6.6.6.6.5.6.5.6.6.6.6.5.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.6.5.6.6.",
"6.5.6.5.6.6.6.5.5.5.6.5.5.6.5.6.5.6.6.6.6.5.6.5.6.6.5.6.6.6.5.6.5.6.5.6.6.6.5.6.5.6.6.5.6.6.6.5.5.6.6.6.6.5.6.5.6.6.6.5.6.6.5.6.6.6.6.6.5.6.5.6.5.6.5.6.5.6.5.6.5.6.5.6.5.5.6.5.5.5.6.5.6.6.6.6.5.5.6.5.5.6.5.6.6.6.5.6.5.6.5.6.6.6.6.5.6.5.6.5.5.6.6.6.5.6.5.6.6.5.6.6.6.5.6.6.5.6.5.6.6.6.6.6.6.5.6.5.6.6.6.5.6.5.6.6.6.5.6.5.6.5.6.5.5.6.5.6.5.6.6.5.5.5.6.6.5.6.5.6.5.6.6.5.6.5.6.5.5.6.5.6.6.6.6.5.6.5.6.6.6.5.6.6.5.6.5.6.5.6.6.6.6.5.6.5.6.5.5.6.6.5.6.5.6.5.5.6.6.6.5.6.5.6.6.5.6.6.6.5.5.6.6.6.6.5.6.5.6.6.6.5.6.6.5.6.6.5.6.5.5.6.5.6.5.5.6.5.5.6.5.6.5.5.6.6.5.6.5.5.6.5.6.5.5.6.5.6.5.6.6.6.6.6.6.5.6.5.5.6.5.6.6.6.6.5.5.5.5.6.5.6.5.5.6.5.6.6.5.6.5.6.6.6.6.5.6.5.6.5.6.6.5.6.5.6.5.6.6.5.6.5.5.6.6.5.6.5.5.6.6.6.5.5.6.5.6.6.6.6.6.6.6.6.5.6.5.6.6.5.6.5.5.6.5.6.6.5.6.5.5.6.5.6.5.6.5.6.5.6.5.6.5.6.6.5.6.5.6.5.6.6.5.6.5.6.5.6.6.6.6.5.6.5.6.6.6.6.6.5.6.5.6.5.5.6.6.6.5.6.5.6.6.6.6.6.6.5.6.5.6.6.6.5.6.5.6.5.6.5.6.5.5.6.5.6.6.6.6.6.5.6.5.6.5.6.5.6.5.5.6.5.5.5.6.5.6.6.6.6.6.5.6.5.6.6.6.6.6.5.6.5.5.6.6.6.5.6.5.6.5.6.6.6.6.5.6.5.6.5.5.6.",
"5.6.5.6.5.5.6.6.5.6.6.5.6.5.6.5.6.5.5.5.6.5.6.5.5.5.5.5.5.6.5.6.5.6.5.5.5.5.6.5.6.5.6.5.5.5.5.6.6.5.5.5.6.5.6.5.5.5.5.6.5.5.6.6.5.5.5.5.6.5.6.5.6.5.6.5.5.6.5.6.5.6.5.6.5.6.5.6.5.6.5.6.5.5.5.5.5.6.5.6.6.5.6.5.5.6.5.6.5.5.6.5.5.5.6.5.5.6.5.6.5.5.5.6.5.6.5.5.6.5.5.5.5.6.5.6.5.6.5.5.5.5.5.5.6.5.6.5.5.5.5.6.6.5.5.5.5.6.5.5.5.6.5.6.6.5.6.5.6.5.5.6.5.6.6.5.5.6.6.5.6.5.5.6.5.6.5.6.6.5.6.5.5.5.6.5.6.5.5.5.5.6.5.6.5.6.5.5.6.5.5.5.6.5.5.6.5.6.5.5.5.6.5.6.5.6.5.5.5.5.6.5.6.5.6.5.5.5.5.6.6.5.5.5.6.5.6.5.5.5.5.6.5.5.6.6.5.6.5.6.6.5.6.5.6.6.5.6.5.6.6.5.5.6.6.5.6.5.6.6.5.6.5.6.6.5.6.5.5.5.5.5.5.5.6.5.5.6.6.5.6.5.5.6.5.6.5.6.6.5.6.5.6.6.5.6.5.5.6.5.6.5.5.5.6.5.5.6.5.6.5.5.6.5.6.5.6.5.5.6.5.6.5.6.5.6.5.6.5.5.5.6.5.6.5.6.5.5.5.5.5.5.5.5.5.6.5.6.5.6.5.6.6.5.6.5.5.6.5.6.6.5.6.5.6.5.6.5.6.5.6.5.6.5.5.6.5.6.5.6.5.5.6.5.6.5.6.5.5.5.6.5.6.5.5.5.5.5.5.6.5.6.5.6.5.5.5.5.6.5.6.5.5.5.5.5.6.5.6.5.5.5.5.6.5.6.5.5.5.6.5.6.6.5.6.5.5.5.5.5.6.5.6.5.5.6.5.6.5.6.5.6.5.6.5.6.5.5.5.5.6.5.6.5.5.5.5.5.5.6.5.6.5.5.5.5.6.5.6.5.6.5.5.5.5.6.5.6.5.6.5.5.",
"5.5.5.6.5.5.5.6.5.5.5.5.5.6.6.5.5.6.5.5.5.5.5.6.5.5.5.5.5.5.5.6.6.5.6.4.6.5.5.5.6.5.5.5.5.5.5.6.5.5.5.5.6.5.5.5.5.5.5.6.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.5.6.5.5.5.5.6.6.4.5.5.5.5.5.6.5.5.5.5.5.5.5.6.6.5.5.6.5.5.5.6.5.5.5.6.6.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.6.5.6.5.6.4.6.5.5.5.6.5.5.5.5.5.5.6.5.5.5.5.6.5.5.5.5.5.6.5.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.5.6.5.5.5.5.6.6.4.5.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.6.5.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.5.5.5.5.6.5.5.5.5.5.6.6.5.6.4.6.5.5.5.6.5.5.5.5.5.5.6.5.5.5.5.6.5.5.5.5.5.5.6.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.5.6.5.5.5.5.6.6.4.5.5.5.5.5.6.5.5.5.5.5.5.5.6.5.5.5.5.5.5.5.6.5.5.6.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.6.5.6.4.6.5.5.5.6.5.5.5.5.5.5.6.5.5.5.5.6.5.5.5.5.5.5.6.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.5.6.5.5.5.5.6.6.4.5.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.6.5.5.5.5.5.5.5.5.6.5.5.5.6.5.5.5.5.5.5.6.5.6.4.6.5.5.5.6.5.5.5.5.5.5.6.5.5.5.5.6.5.5.5.5.5.6.5.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.5.6.5.5.5.5.6.6.4.5.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.5.5.5.6.5.5.5.5.5.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.5.6.5.5.",
"5.6.5.5.5.5.5.5.5.5.6.5.5.5.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.5.5.5.4.6.4.6.6.5.5.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.5.5.5.5.6.5.5.6.5.5.5.5.5.5.5.4.6.6.5.6.5.6.5.5.5.5.5.6.5.6.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.6.6.5.5.5.5.6.5.5.5.5.5.5.5.5.4.6.4.6.6.5.5.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.5.7.5.5.5.5.5.6.5.5.5.5.5.5.5.5.6.5.5.6.5.5.5.5.5.5.5.4.6.6.5.6.5.6.5.5.5.5.5.6.5.6.5.5.5.5.5.5.5.7.5.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.4.6.4.6.6.5.5.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.5.5.5.5.6.5.5.6.5.5.5.5.5.5.5.4.6.6.5.6.5.6.5.5.5.5.5.6.5.6.5.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.5.6.5.6.5.5.6.5.6.5.5.5.5.5.5.5.4.6.4.6.6.5.5.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.5.5.5.5.6.5.5.6.5.5.5.5.5.5.5.4.6.6.5.6.5.6.5.5.5.5.5.6.5.6.5.5.5.5.6.5.6.5.5.5.5.5.5.5.5.5.6.5.5.6.5.5.5.5.5.5.5.5.5.5.6.5.4.6.4.6.6.5.5.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.5.7.5.5.5.5.5.6.5.5.5.5.5.5.5.5.6.5.5.6.5.5.5.5.5.5.5.4.6.6.5.6.5.6.5.5.5.5.5.6.5.6.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.6.5.5.5.5.5.5.5.5.5.5.5.5.5.",
"5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.4.5.5.6.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.4.6.4.5.5.5.5.5.5.5.5.5.5.6.4.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.4.5.5.6.5.5.5.5.5.5.5.5.5.5.5.5.5.5.4.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.4.6.4.5.5.5.5.5.5.5.5.5.5.6.4.5.5.5.5.5.5.5.4.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.4.5.5.6.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.4.6.4.5.5.5.5.5.5.5.5.5.5.6.4.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.4.5.5.6.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.4.6.4.5.5.5.5.5.5.5.5.5.5.6.4.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.4.5.5.6.5.5.5.5.5.5.5.5.5.5.5.5.5.5.4.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.4.6.4.5.5.5.5.5.5.5.5.5.5.6.4.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.",
"5.5.5.4.5.5.5.5.5.4.5.5.5.5.5.4.5.4.5.5.4.5.5.5.5.5.5.5.5.5.5.5.5.4.5.5.4.5.5.4.5.5.4.5.5.5.4.5.5.5.4.5.5.4.5.5.5.5.5.5.5.5.4.5.4.5.5.5.5.5.4.5.5.5.5.4.5.5.5.5.5.5.5.4.5.4.4.5.5.5.5.5.4.5.4.5.5.5.5.4.5.5.5.5.4.5.4.5.5.5.5.4.5.4.5.5.4.5.5.5.5.5.5.5.5.5.5.5.5.4.5.5.4.5.5.4.5.5.4.5.5.5.4.5.5.5.4.5.5.5.4.5.4.5.5.5.5.5.5.5.4.5.5.5.5.5.4.5.5.5.5.4.5.5.5.5.5.5.5.4.5.4.4.5.5.5.5.5.4.5.4.5.5.5.5.4.5.4.5.5.4.5.5.4.5.5.5.5.5.5.5.5.4.5.5.5.5.5.5.5.5.5.5.5.5.4.5.5.4.5.5.4.5.5.4.5.5.5.4.5.5.5.4.5.5.4.5.5.5.5.5.5.5.5.4.5.4.5.5.5.5.5.4.5.5.5.5.4.5.5.5.5.5.5.5.4.5.4.4.5.5.5.5.5.4.5.4.5.5.5.4.5.4.5.5.5.4.5.4.5.5.5.5.5.5.4.5.5.4.5.5.5.5.5.5.5.5.5.5.5.5.4.5.5.4.5.5.4.5.5.4.5.5.5.4.5.5.5.4.5.5.4.5.5.5.5.5.5.5.5.4.5.4.5.5.5.5.5.4.5.5.5.5.4.5.5.5.5.5.5.5.4.5.4.4.5.5.5.5.5.4.5.4.5.5.5.4.5.4.5.4.5.5.5.4.5.5.5.5.5.4.5.5.5.4.5.5.4.5.5.5.5.5.5.5.5.5.4.5.5.4.5.5.4.5.5.4.5.5.5.4.5.5.5.4.5.5.5.4.5.4.5.5.5.5.5.5.5.4.5.5.5.5.5.4.5.5.5.5.4.5.5.5.5.5.5.5.4.5.4.4.5.5.5.5.5.4.5.4.5.5.5.5.5.5.5.5.5.5.4.5.5.5.5.5.5.3.5.5.5.5.5.5.5.5.5.5.5.5.5.5.5.",
"5.4.4.5.4.4.5.4.4.5.4.4.5.4.4.5.4.4.5.4.4.5.5.4.5.5.4.5.5.4.4.5.4.5.4.4.5.4.4.4.4.4.4.5.4.4.4.5.4.5.4.5.4.4.5.4.5.3.5.5.4.5.5.4.5.5.4.5.5.4.4.5.4.5.4.4.5.4.5.5.4.4.4.5.5.4.5.5.4.4.4.5.4.4.4.5.5.4.4.5.4.4.5.4.5.4.4.5.4.5.4.4.4.5.5.4.4.5.5.4.4.5.4.5.5.5.5.3.4.5.4.4.5.4.4.4.4.4.4.5.4.4.4.5.5.4.4.5.4.4.5.4.4.5.4.4.5.4.4.5.5.5.4.5.5.4.4.5.4.5.4.4.5.4.5.5.4.4.4.5.5.4.5.5.4.4.4.5.4.4.4.5.5.4.4.5.4.4.5.4.5.4.4.5.4.5.4.4.5.5.5.4.5.4.4.4.5.5.4.5.5.5.3.5.4.5.4.4.5.4.4.4.4.4.4.5.4.4.4.5.4.5.4.5.4.4.5.4.5.3.5.5.4.5.5.4.5.5.4.5.5.4.4.5.4.5.4.4.5.4.5.5.4.4.4.5.5.4.5.5.4.4.4.5.4.4.4.5.4.5.4.4.4.5.4.4.5.4.4.5.4.5.4.4.4.5.5.4.5.4.4.4.4.5.4.4.5.5.5.4.4.5.4.4.5.4.4.4.4.4.4.5.4.4.4.5.4.5.4.5.4.4.5.4.5.3.5.5.4.5.5.4.5.5.4.5.5.4.4.5.4.5.4.4.5.4.5.5.4.4.4.5.5.4.5.5.4.4.4.5.4.4.4.5.4.5.5.4.5.5.4.5.5.4.5.5.4.5.5.4.4.5.5.4.5.4.4.5.4.5.5.4.5.5.3.5.4.5.4.4.5.4.4.4.4.4.4.5.4.4.4.5.5.4.4.5.4.4.5.4.4.5.4.4.5.4.4.5.5.5.4.5.5.4.4.5.4.5.4.4.5.4.5.5.4.4.4.5.5.4.5.5.4.4.4.5.4.4.4.5.4.5.4.4.5.4.5.4.3.5.5.4.5.5.5.5.5.5.5.3.5.5.5.3.5.3.5.3.5.5.3.5.",
"4.4.5.4.4.5.5.4.4.5.5.4.4.4.5.4.4.5.4.5.5.4.4.4.4.3.5.5.4.5.5.4.5.4.4.5.4.5.4.4.4.5.5.4.4.5.4.5.4.4.5.4.5.4.4.5.5.5.5.3.5.4.4.5.4.4.4.4.4.5.5.4.5.4.4.5.4.4.4.4.4.5.5.4.4.4.4.4.4.5.5.4.4.4.5.4.4.4.5.4.5.4.4.5.4.5.5.4.4.4.5.5.4.4.4.5.5.4.4.4.4.4.5.4.5.3.5.5.5.4.4.5.4.5.4.4.4.5.5.4.4.5.4.5.4.5.4.4.4.5.5.4.4.5.5.4.4.4.5.4.4.4.4.4.4.5.5.4.5.4.4.5.4.4.4.4.4.5.5.4.4.4.4.4.4.5.5.4.4.4.5.4.4.4.5.4.5.4.4.5.4.5.5.4.4.4.5.5.5.3.4.5.5.4.5.4.4.3.5.5.3.5.5.5.5.4.4.5.4.5.4.4.4.5.5.4.4.5.4.5.4.4.5.4.5.4.4.5.5.5.5.3.5.4.4.5.4.4.4.4.4.5.5.4.5.4.4.5.4.4.4.4.4.5.5.4.4.4.4.4.4.5.5.4.4.4.5.4.4.4.5.5.5.4.4.5.4.5.5.4.4.4.5.5.4.4.4.5.5.4.5.4.4.4.5.5.5.3.3.5.5.4.4.5.4.5.4.4.4.5.5.4.4.5.4.5.4.4.5.4.5.4.4.5.5.5.5.3.5.4.4.5.4.4.4.4.4.5.5.4.5.4.4.5.4.4.4.4.4.5.5.4.4.4.4.4.4.5.5.4.4.4.5.4.5.4.4.5.4.4.4.4.4.4.4.4.5.4.4.4.5.4.4.4.5.4.5.4.5.4.4.5.3.5.4.5.5.4.4.5.4.5.4.4.4.5.5.4.4.5.4.5.4.5.4.4.4.5.5.4.4.5.5.4.4.4.5.4.4.4.4.4.4.5.5.4.5.4.4.5.4.4.4.4.4.5.5.4.4.4.4.4.4.5.5.4.4.4.5.4.4.4.5.5.5.4.4.5.5.4.4.5.3.3.5.3.5.3.5.5.3.5.5.5.5.5.5.5.3.5.5.5.",
"4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.5.3.3.5.3.5.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.5.3.3.5.3.5.5.4.4.5.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.5.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.5.4.4.5.3.5.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.5.5.5.4.3.5.4.5.4.4.5.3.3.5.3.5.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.5.3.3.5.3.5.5.4.4.5.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.5.4.5.3.5.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.5.3.3.5.3.5.5.4.4.5.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.5.4.4.4.5.3.5.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.5.3.5.5.5.5.5.5.3.5.3.5.3.5.3.3.5.3.5.3.5.3.5.",
"4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.5.3.4.3.5.4.4.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.5.4.4.3.3.4.3.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.3.5.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.3.3.4.4.4.3.4.5.3.4.3.5.5.3.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.5.4.4.3.3.4.3.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.5.3.5.3.5.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.5.4.4.3.3.4.3.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.3.5.3.4.3.5.3.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.4.5.3.4.5.3.3.3.5.3.5.3.5.3.5.3.5.4.3.5.3.5.5.3.3.",
"4.4.3.4.3.4.4.4.3.3.4.4.4.4.3.3.3.4.4.4.4.4.4.3.3.3.3.4.4.4.3.4.4.4.3.4.3.4.3.4.4.3.4.3.4.3.4.3.4.4.4.3.3.4.4.4.3.3.4.4.4.3.4.4.4.3.4.3.4.3.3.5.3.4.3.4.4.3.3.4.4.4.4.3.4.4.4.3.3.4.4.4.4.4.4.3.3.3.4.4.3.4.4.4.3.3.4.4.4.4.3.3.3.4.4.4.4.4.4.3.3.4.3.4.4.4.3.4.4.4.3.4.3.4.3.4.4.3.4.3.4.3.4.3.4.4.3.4.4.4.4.4.3.4.4.3.4.4.3.3.4.4.3.4.4.4.3.4.3.4.3.4.4.3.3.4.4.4.4.3.4.4.4.3.3.4.4.4.4.4.4.3.4.4.4.3.4.4.3.4.3.3.4.3.4.4.3.3.3.3.3.5.3.3.3.5.3.4.3.5.3.4.3.4.4.4.3.4.3.4.3.4.4.3.4.3.4.3.4.3.4.4.4.3.3.4.4.4.3.3.4.4.4.3.4.4.4.3.4.3.4.3.3.5.3.4.3.4.4.3.3.4.4.4.4.3.4.4.4.3.3.4.4.4.4.4.4.3.4.3.4.4.4.3.4.4.4.4.3.4.3.4.3.3.4.4.4.3.4.3.3.4.3.4.4.3.4.4.4.3.4.4.3.4.3.4.3.4.4.3.4.3.4.3.4.3.4.4.4.3.3.4.4.4.3.3.4.4.4.3.4.4.4.3.4.3.4.3.3.5.3.4.3.4.4.3.3.4.4.4.4.3.4.4.4.3.3.4.4.4.4.4.4.3.3.4.4.3.4.3.4.4.4.4.3.4.3.4.4.4.4.4.4.3.4.3.3.4.4.3.4.3.4.4.4.3.4.4.3.4.3.4.3.4.4.3.4.3.4.3.4.3.4.4.3.4.4.4.4.4.3.4.4.3.4.4.3.3.4.4.3.4.4.4.3.4.3.4.3.4.4.3.3.4.4.4.4.3.4.4.4.3.3.4.4.4.4.4.4.3.4.3.4.3.5.3.3.5.3.3.3.5.5.3.3.3.5.3.3.3.5.3.3.3.3.4.3.3.4.4.4.3.",
"4.3.3.4.4.4.3.4.4.4.4.3.3.4.4.4.4.4.3.3.3.3.4.3.4.4.3.5.3.4.3.4.3.4.4.3.3.4.4.3.4.4.3.4.4.4.3.4.4.3.3.4.3.5.3.4.4.4.4.3.3.4.3.4.3.5.4.3.3.5.3.3.4.4.4.3.3.4.4.3.3.4.4.3.4.3.4.4.4.4.2.4.4.3.4.4.4.4.4.3.4.3.3.4.4.4.4.3.3.4.4.4.4.4.3.3.3.3.4.3.4.3.3.5.3.4.3.4.3.4.4.3.3.4.4.3.4.4.3.4.4.4.3.4.4.3.3.4.2.4.4.3.4.3.3.4.3.4.4.4.4.3.4.4.3.4.3.4.4.4.4.3.3.4.4.3.3.4.4.3.4.3.4.4.4.4.2.4.4.3.4.4.4.3.3.4.4.4.4.3.4.4.3.4.3.4.4.4.5.5.3.3.5.5.3.3.4.3.3.5.3.4.3.4.3.4.4.3.3.4.4.3.4.4.3.4.4.4.3.4.4.3.3.4.3.5.3.4.4.4.4.3.3.4.3.4.3.5.4.3.3.5.3.3.4.4.4.3.3.4.4.3.3.4.4.3.4.3.4.4.4.4.2.4.4.3.4.4.4.4.4.3.4.3.4.3.3.4.3.4.4.4.4.4.3.3.4.4.4.4.4.3.3.4.3.5.4.3.4.4.3.4.4.3.3.4.4.3.4.4.3.4.4.4.3.4.4.3.3.4.3.5.3.4.4.4.4.3.3.4.3.4.3.5.4.3.3.5.3.3.4.4.4.3.3.4.4.3.3.4.4.3.4.3.4.4.4.4.2.4.4.3.4.4.4.3.3.4.3.4.4.3.3.4.3.4.4.4.3.4.3.3.4.4.4.4.4.3.3.4.3.4.4.3.4.4.3.4.4.3.3.4.4.3.4.4.3.4.4.4.3.4.4.3.3.4.2.4.4.3.4.3.3.4.3.4.4.4.4.3.4.4.3.4.3.4.4.4.4.3.3.4.4.3.3.4.4.3.4.3.4.4.4.4.2.4.4.3.4.4.4.4.3.4.3.3.5.3.3.5.3.3.3.5.5.3.3.3.5.5.3.3.5.5.4.3.5.3.4.3.4.4.",
"3.4.4.3.3.3.3.3.4.3.3.3.4.3.3.3.3.4.4.4.4.3.3.3.3.5.3.3.3.5.3.4.4.3.3.4.4.4.3.4.3.4.3.4.3.4.3.4.3.4.4.3.4.3.4.3.3.4.3.4.3.4.4.3.3.5.3.4.4.3.3.5.4.3.3.3.4.4.4.4.4.3.4.4.4.3.3.3.4.3.4.4.3.3.4.3.3.4.3.4.3.4.3.3.4.3.3.3.4.3.3.3.3.4.4.4.4.3.3.3.3.5.3.3.3.5.4.3.4.3.3.4.4.4.3.4.3.4.3.4.3.4.3.4.3.4.4.3.3.4.4.3.3.4.4.3.3.4.3.4.3.4.4.3.3.4.3.4.4.3.3.3.4.4.4.4.4.3.4.4.4.3.3.3.4.3.4.4.3.3.4.3.3.4.4.3.4.2.3.4.4.4.4.4.4.3.4.3.3.3.5.3.3.3.3.3.3.5.3.3.3.5.4.3.4.3.3.4.4.4.3.4.3.4.3.4.3.4.3.4.3.4.4.3.4.3.4.3.3.4.3.4.3.4.4.3.3.5.3.4.4.3.3.5.4.3.3.3.4.4.4.4.4.3.4.4.4.3.3.3.4.3.4.4.3.3.4.3.4.3.3.3.3.4.3.3.3.4.3.4.4.3.3.3.3.4.3.4.3.3.3.3.3.3.4.3.3.5.3.3.4.3.3.4.4.4.3.4.3.4.3.4.3.4.3.4.3.4.4.3.4.3.4.3.3.4.3.4.3.4.4.3.3.5.3.4.4.3.3.5.4.3.3.3.4.4.4.4.4.3.4.4.4.3.3.3.4.3.4.4.3.3.4.3.3.4.4.3.3.4.3.3.3.4.3.4.3.3.3.3.3.4.4.3.3.3.3.3.4.3.4.4.4.3.3.3.4.3.3.4.4.4.3.4.3.4.3.4.3.4.3.4.3.4.4.3.3.4.4.3.3.4.4.3.3.4.3.4.3.4.4.3.3.4.3.4.4.3.3.3.4.4.4.4.4.3.4.4.4.3.3.3.4.3.4.4.3.3.4.3.4.4.4.4.3.5.3.3.3.3.3.5.3.3.3.3.3.3.3.3.3.3.3.3.3.3.5.3.5.3.3.3.",
"3.3.4.3.3.3.3.3.3.3.4.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.3.3.4.4.2.4.3.3.3.4.3.3.3.4.3.3.3.3.3.3.3.3.3.4.3.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.4.2.3.3.4.2.4.3.3.3.3.3.3.3.3.3.3.4.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.3.3.4.4.2.4.3.3.3.4.3.3.3.4.3.4.3.3.4.3.3.4.3.3.4.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.4.2.3.3.4.2.4.3.3.4.3.4.3.3.4.2.3.4.2.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.3.3.4.4.2.4.3.3.3.4.3.3.3.4.3.3.3.3.3.3.3.3.3.4.3.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.4.2.3.3.4.2.4.3.3.4.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.3.3.4.3.3.3.3.3.3.3.4.3.3.3.3.3.4.4.2.4.3.3.3.4.3.3.3.4.3.3.3.3.3.3.3.3.3.4.3.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.4.2.3.3.4.2.4.3.3.3.4.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.3.3.3.3.3.3.4.3.3.3.4.3.3.3.3.3.4.4.2.4.3.3.3.4.3.3.3.4.3.4.3.3.4.3.3.4.3.3.4.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.4.2.3.3.4.2.4.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.5.3.3.3.3.3.4.3.3.3.4.3.3.",
"3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.4.2.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.4.2.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.2.4.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.4.2.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.4.2.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.4.2.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.2.4.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.4.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.",
"3.3.3.3.3.3.3.3.3.3.3.2.3.3.3.2.3.3.3.3.3.2.3.3.3.2.3.3.3.3.3.3.3.3.2.3.3.3.2.3.4.2.4.2.3.3.2.3.3.3.3.3.3.2.3.2.3.3.3.3.2.3.3.3.3.3.2.3.3.3.2.3.3.2.3.2.2.3.2.3.3.3.2.3.3.3.2.3.3.2.3.2.2.3.2.3.3.3.3.3.3.2.3.3.3.3.2.3.3.3.2.3.3.3.3.3.3.2.3.3.3.2.3.3.3.3.3.3.3.3.2.3.3.3.2.3.4.2.4.2.3.3.2.3.3.3.3.3.3.2.3.2.3.2.4.2.3.2.2.3.3.2.3.3.3.3.2.3.3.2.3.2.2.3.2.3.3.3.2.3.3.3.2.3.3.2.3.2.2.3.2.3.3.3.3.3.3.2.3.2.3.2.2.3.3.2.3.3.3.3.3.3.2.3.3.3.2.3.3.3.3.2.3.3.3.3.2.3.3.3.2.3.4.2.4.2.3.3.2.3.3.3.3.3.3.2.3.2.3.3.3.3.2.3.3.3.3.3.2.3.3.3.2.3.3.2.3.2.2.3.2.3.3.3.2.3.3.3.2.3.3.2.3.2.2.3.2.3.3.3.3.3.2.3.3.3.3.3.2.3.3.3.2.3.3.3.3.3.2.3.3.3.2.3.3.3.3.3.3.3.3.3.2.3.3.3.2.3.4.2.4.2.3.3.2.3.3.3.3.3.3.2.3.2.3.3.3.3.2.3.3.3.3.3.2.3.3.3.2.3.3.2.3.2.2.3.2.3.3.3.2.3.3.3.2.3.3.2.3.2.2.3.2.3.3.3.3.3.2.3.3.3.3.3.3.3.3.2.3.3.3.3.3.3.2.3.3.3.2.3.3.3.3.3.3.3.3.3.2.3.3.3.2.3.4.2.4.2.3.3.2.3.3.3.3.3.3.2.3.2.3.2.4.2.3.2.2.3.3.2.3.3.3.3.2.3.3.2.3.2.2.3.2.3.3.3.2.3.3.3.2.3.3.2.3.2.2.3.2.3.3.3.3.2.3.3.3.2.3.3.3.3.3.2.3.3.3.3.3.3.3.3.3.2.3.3.2.3.2.3.2.3.",
"3.3.3.3.3.3.2.3.3.3.3.3.2.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.2.3.3.2.2.3.2.2.2.3.2.3.3.3.3.3.3.3.3.3.2.3.3.3.3.3.3.3.3.2.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.2.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.2.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.2.3.3.2.2.3.2.2.2.3.2.3.3.3.3.3.3.3.3.3.2.4.2.3.3.3.3.3.3.2.3.2.3.3.3.3.3.3.3.3.3.3.3.3.3.2.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.4.2.3.3.3.2.3.3.3.3.3.3.3.3.3.3.3.3.2.2.3.3.2.3.3.3.3.2.3.3.2.2.3.2.2.2.3.2.3.3.3.3.3.3.3.3.3.2.3.3.3.3.3.3.3.3.2.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.2.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.2.3.3.3.3.3.3.3.3.2.3.3.2.2.3.2.2.2.3.2.3.3.3.3.3.3.3.3.3.2.3.3.3.3.3.3.3.3.2.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.2.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.2.3.3.3.3.3.3.3.3.3.3.3.3.2.3.3.3.3.3.3.3.3.2.3.3.2.2.3.2.2.2.3.2.3.3.3.3.3.3.3.3.3.2.4.2.3.3.3.3.3.3.2.3.2.3.3.3.3.3.3.3.3.3.3.3.3.3.2.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.3.2.3.3.3.3.3.2.3.3.3.2.3.2.3.3.3.3.2.2.3.3.2.3.3.3.3.3.3.",
"3.3.3.3.2.3.3.2.3.3.2.3.3.2.2.3.2.3.2.3.3.2.2.3.2.2.2.3.2.3.3.3.2.3.2.2.3.2.3.2.3.3.2.3.3.2.3.3.3.2.2.2.2.2.2.3.3.2.2.2.2.3.2.2.2.3.2.3.2.2.3.2.3.2.2.2.3.2.2.3.2.3.2.3.2.2.3.2.3.2.2.2.3.2.2.3.3.3.3.3.2.3.3.2.3.3.2.3.2.2.2.3.2.2.3.3.3.2.2.3.2.2.2.3.2.3.3.3.2.3.2.2.3.2.3.2.3.3.2.3.3.2.3.3.2.3.2.2.2.2.2.3.3.2.2.3.2.2.2.3.2.3.3.2.2.3.2.2.3.2.2.2.3.2.2.3.2.3.2.3.2.2.3.2.3.2.2.2.3.2.2.3.3.2.2.2.2.2.2.3.2.2.2.3.2.3.3.2.2.2.3.2.2.3.2.2.3.2.3.2.3.3.2.3.2.3.2.2.3.2.3.2.3.3.2.3.3.2.3.3.3.2.2.2.2.2.2.3.3.2.2.2.2.3.2.2.2.3.2.3.2.2.3.2.3.2.2.2.3.2.2.3.2.3.2.3.2.2.3.2.3.2.2.2.3.2.2.3.3.3.2.2.2.3.2.2.3.3.2.3.2.2.2.3.2.2.3.3.2.3.2.2.3.2.3.2.3.3.3.3.2.3.2.2.3.2.3.2.3.3.2.3.3.2.3.3.3.2.2.2.2.2.2.3.3.2.2.2.2.3.2.2.2.3.2.3.2.2.3.2.3.2.2.2.3.2.2.3.2.3.2.3.2.2.3.2.3.2.2.2.3.2.2.3.2.3.2.2.2.3.2.2.3.3.3.2.2.3.3.2.2.2.3.3.2.3.2.2.3.2.3.2.3.3.3.3.2.3.2.2.3.2.3.2.3.3.2.3.3.2.3.3.2.3.2.2.2.2.2.3.3.2.2.3.2.2.2.3.2.3.3.2.2.3.2.2.3.2.2.2.3.2.2.3.2.3.2.3.2.2.3.2.3.2.2.2.3.2.2.3.3.3.2.3.3.2.2.3.3.3.3.2.2.3.3.2.3.3.2.3.3.2.3.3.2.3.2.3.2.2.3.2.",
"2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.3.2.2.2.2.2.3.2.2.2.3.2.2.2.2.2.2.2.2.3.2.2.3.2.2.2.2.3.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.3.2.2.2.2.2.3.2.2.2.3.2.2.2.2.2.2.2.2.3.2.2.3.2.2.2.2.3.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.3.2.2.2.2.2.3.2.2.2.3.2.2.2.2.2.2.2.2.3.2.2.3.2.2.2.2.3.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.3.2.2.2.2.2.3.2.2.3.2.2.2.3.2.2.2.2.2.3.2.2.3.2.2.2.2.3.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.3.2.2.2.2.2.2.3.2.2.3.2.2.2.2.2.2.2.2.3.2.2.3.2.2.2.2.3.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.3.2.2.2.2.2.3.2.2.2.3.2.2.2.2.2.2.2.2.3.2.2.3.2.2.2.2.3.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.3.2.2.2.2.2.3.2.2.3.2.2.2.3.2.2.2.2.2.3.2.2.3.2.2.2.2.3.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.3.2.2.2.2.2.3.2.2.2.3.2.2.2.2.2.2.2.2.3.2.2.3.2.2.2.2.3.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.3.2.2.2.2.2.3.2.2.2.2.2.2.2.3.2.2.2.2.2.3.2.2.3.2.2.2.2.3.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.3.2.2.2.2.2.3.2.2.3.2.2.2.3.2.2.2.2.2.3.2.2.3.2.2.2.2.3.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.3.2.2.2.2.2.2.2.3.",
"2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.",
"2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.",
"2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.1.2.2.2.1.2.2.2.2.2.2.2.1.2.2.1.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.1.2.2.2.2.1.2.2.2.2.2.2.2.1.2.2.1.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.2.1.2.2.2.1.2.2.2.2.2.2.2.1.2.2.1.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.1.2.1.2.2.2.2.2.1.2.2.1.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.1.2.2.2.2.2.2.2.2.1.2.2.1.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.1.2.2.2.2.1.2.2.2.2.2.2.2.1.2.2.1.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.1.2.2.2.2.1.2.1.2.2.2.2.2.1.2.2.1.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.1.2.2.2.2.1.2.2.2.2.2.2.2.1.2.2.1.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.2.1.2.2.2.2.2.1.2.2.1.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.1.2.1.2.2.2.2.2.1.2.2.1.2.2.2.2.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.2.2.2.2.1.2.2.",
"2.2.1.2.2.1.2.1.2.2.2.1.1.1.1.2.2.2.2.2.2.1.2.2.2.2.1.2.2.2.2.2.1.2.2.2.1.1.1.1.1.2.2.2.1.2.2.1.2.2.1.2.2.1.2.1.2.2.2.1.1.1.1.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.1.2.1.2.2.2.1.1.1.1.1.2.2.2.1.2.2.1.2.2.1.2.2.1.2.1.2.2.2.1.1.1.1.2.2.2.2.2.2.2.2.2.2.2.1.2.2.1.2.2.1.2.2.2.1.1.1.1.1.2.2.2.1.2.2.1.2.2.1.2.2.1.2.1.2.2.2.1.1.1.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.1.2.2.2.1.1.1.1.1.2.2.2.1.2.2.1.2.2.1.2.2.1.2.1.2.2.2.1.1.1.1.2.2.2.2.2.2.1.2.2.2.2.2.2.1.2.2.2.1.2.2.2.1.1.1.1.1.2.2.2.1.2.2.1.2.2.1.2.2.1.2.1.2.2.2.1.1.1.1.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.1.2.1.2.2.2.1.1.1.1.1.2.2.2.1.2.2.1.2.2.1.2.2.1.2.1.2.2.2.1.1.1.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.1.2.2.2.1.1.1.1.1.2.2.2.1.2.2.1.2.2.1.2.2.1.2.1.2.2.2.1.1.1.1.2.2.2.2.2.2.2.2.2.2.2.1.2.2.2.1.2.1.2.2.2.1.1.1.1.1.2.2.2.1.2.2.1.2.2.1.2.2.1.2.1.2.2.2.1.1.1.1.2.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.1.2.2.2.1.1.1.1.1.2.2.2.1.2.2.1.2.2.1.2.2.1.2.1.2.2.2.1.1.1.1.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.1.2.1.2.2.2.1.1.1.1.1.2.2.2.1.2.2.1.2.2.1.2.2.1.2.1.2.2.2.1.1.1.1.2.2.2.1.2.2.2.2.2.1.2.2.2.2.2.2.1.",
"1.2.2.1.2.1.1.2.1.1.1.2.1.1.1.1.2.1.1.2.1.2.2.1.1.1.2.2.1.1.2.1.2.1.1.2.1.1.1.1.1.2.1.1.2.1.2.1.1.2.2.1.2.1.1.2.1.1.1.2.1.1.1.1.2.1.1.2.1.1.2.1.1.1.2.2.1.2.2.1.2.1.1.2.1.1.1.1.1.2.1.1.2.1.2.1.1.2.2.1.2.1.1.2.1.1.1.2.1.1.1.1.2.1.1.2.1.1.2.1.1.1.2.2.1.2.2.1.2.1.1.2.1.1.1.1.1.2.1.1.2.1.2.1.1.2.2.1.2.1.1.2.1.1.1.2.1.1.1.1.2.1.1.2.2.1.1.2.2.1.1.2.1.2.1.2.2.1.1.2.1.1.1.1.1.2.1.1.2.1.2.1.1.2.2.1.2.1.1.2.1.1.1.2.1.1.1.1.2.2.1.2.1.2.2.1.1.1.2.1.2.1.2.1.2.1.1.2.1.1.1.1.1.2.1.1.2.1.2.1.1.2.2.1.2.1.1.2.1.1.1.2.1.1.1.1.2.1.1.2.1.1.2.1.1.1.2.2.1.2.2.1.2.1.1.2.1.1.1.1.1.2.1.1.2.1.2.1.1.2.2.1.2.1.1.2.1.1.1.2.1.1.1.1.2.1.1.2.2.1.1.2.2.1.1.2.1.2.1.2.2.1.1.2.1.1.1.1.1.2.1.1.2.1.2.1.1.2.2.1.2.1.1.2.1.1.1.2.1.1.1.1.2.1.1.2.1.1.2.1.1.1.2.2.1.2.2.1.2.1.1.2.1.1.1.1.1.2.1.1.2.1.2.1.1.2.2.1.2.1.1.2.1.1.1.2.1.1.1.1.2.1.1.2.2.1.1.2.2.1.1.2.1.2.1.2.2.1.1.2.1.1.1.1.1.2.1.1.2.1.2.1.1.2.2.1.2.1.1.2.1.1.1.2.1.1.1.1.2.1.1.2.2.1.1.2.2.1.1.2.1.2.1.2.2.1.1.2.1.1.1.1.1.2.1.1.2.1.2.1.1.2.2.1.2.1.1.2.1.1.1.2.1.1.1.1.2.2.2.2.2.1.1.2.2.2.1.2.1.2.1.2.",
"2.2.1.2.2.2.2.2.2.1.2.1.1.1.1.1.1.1.2.2.2.2.2.2.2.1.1.2.2.1.1.2.1.2.1.2.1.1.1.1.2.2.1.2.1.1.2.2.2.2.1.2.2.2.2.2.2.1.2.1.1.1.1.1.1.1.2.2.2.2.2.2.2.1.2.1.1.2.2.1.1.2.1.2.1.1.1.1.2.2.1.2.1.1.2.2.2.2.1.2.2.2.2.2.2.1.2.1.1.1.1.1.1.1.2.2.2.2.2.2.2.1.2.1.1.2.1.2.1.2.1.2.1.1.1.1.2.2.1.2.1.1.2.2.2.2.1.2.2.2.2.2.2.1.2.1.1.1.1.1.1.2.1.1.1.1.2.2.1.2.2.1.1.2.2.1.1.2.1.2.1.1.1.1.2.2.1.2.1.1.2.2.2.2.1.2.2.2.2.2.2.1.2.1.1.1.1.1.1.1.2.2.2.2.2.2.2.1.1.2.2.1.1.2.1.2.1.2.1.1.1.1.2.2.1.2.1.1.2.2.2.2.1.2.2.2.2.2.2.1.2.1.1.1.1.1.1.1.2.2.2.2.2.2.2.1.2.1.1.2.2.1.1.2.1.2.1.1.1.1.2.2.1.2.1.1.2.2.2.2.1.2.2.2.2.2.2.1.2.1.1.1.1.1.1.2.1.1.1.2.2.2.1.2.2.1.1.2.2.1.1.2.1.2.1.1.1.1.2.2.1.2.1.1.2.2.2.2.1.2.2.2.2.2.2.1.2.1.1.1.1.1.1.1.2.2.2.2.2.2.2.1.2.1.1.2.2.1.1.2.1.2.1.1.1.1.2.2.1.2.1.1.2.2.2.2.1.2.2.2.2.2.2.1.2.1.1.1.1.1.1.2.1.1.1.1.2.2.1.2.2.1.1.2.2.1.1.2.1.2.1.1.1.1.2.2.1.2.1.1.2.2.2.2.1.2.2.2.2.2.2.1.2.1.1.1.1.1.1.2.1.1.1.1.2.2.1.2.2.1.1.2.2.1.1.2.1.2.1.1.1.1.2.2.1.2.1.1.2.2.2.2.1.2.2.2.2.2.2.1.2.1.1.1.1.1.2.2.1.1.1.1.2.2.1.2.2.1.1.2.2.1.",
"1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.2.1.1.1.1.1.1.2.1.2.1.1.2.1.1.2.1.1.1.1.2.1.1.1.1.2.1.1.2.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.2.1.2.1.2.1.1.2.1.1.1.1.2.1.1.1.1.2.1.1.2.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.2.2.1.1.2.1.1.2.1.1.1.1.2.1.1.1.1.2.1.1.2.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.2.1.2.1.2.1.1.1.1.1.2.1.1.2.1.2.1.1.1.1.2.1.1.1.1.2.1.1.2.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.2.1.1.1.1.1.1.2.1.2.1.1.2.1.1.2.1.1.1.1.2.1.1.1.1.2.1.1.2.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.2.1.2.1.2.1.1.2.1.1.1.1.2.1.1.1.1.2.1.1.2.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.2.1.2.1.1.1.1.1.1.1.2.1.1.2.1.2.1.1.1.1.2.1.1.1.1.2.1.1.2.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.2.1.2.1.2.1.1.2.1.1.1.1.2.1.1.1.1.2.1.1.2.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.2.1.1.2.1.2.1.1.1.1.1.2.1.1.2.1.2.1.1.1.1.2.1.1.1.1.2.1.1.2.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.2.1.2.1.2.1.1.1.1.1.2.1.1.2.1.2.1.1.1.1.2.1.1.1.1.2.1.1.2.1.1.1.1.1.1.1.1.1.1.1.2.1.1.1.1.1.1.1.1.1.2.1.2.1.1.1.1.1.2.1.1.2.1.",
"1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.",
"1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.",
"1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.",
"1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.",
"1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.",
"1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.",
"1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.",
"1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1.1."
};

+ 0
- 155
mixer/icons/icon-large.svg View File

@@ -1,155 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->

<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
version="1.1"
width="512"
height="512"
id="svg3137">
<defs
id="defs3139">
<linearGradient
x1="0"
y1="150"
x2="300"
y2="150"
id="linearGradient3813"
xlink:href="#SVGID_1_"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-5.5328369e-8,-300.00001)" />
<linearGradient
x1="149.9995"
y1="4"
x2="149.9995"
y2="304"
id="SVGID_1_"
gradientUnits="userSpaceOnUse">
<stop
id="stop6"
style="stop-color:#fffdf7;stop-opacity:1"
offset="0.3398" />
<stop
id="stop22"
style="stop-color:#20fb00;stop-opacity:1"
offset="0.99440002" />
</linearGradient>
<linearGradient
x1="0"
y1="150"
x2="300"
y2="150"
id="linearGradient3135"
xlink:href="#SVGID_1_"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.7066667,0,0,1.7066667,-186.78068,-642.00002)" />
</defs>
<metadata
id="metadata3142">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
transform="translate(-130,186.78068)"
id="layer1">
<rect
width="512"
height="512"
x="-186.78067"
y="-642"
transform="matrix(0,1,-1,0,0,0)"
id="rect24"
style="fill:url(#linearGradient3135);fill-opacity:1" />
<rect
width="435.42188"
height="65.710075"
x="173.40906"
y="196.90019"
id="rect28"
style="fill:none" />
<g
id="g3571">
<path
d="m 321.16035,174.86778 0,94.91448 -21.57414,0 0,-64.07754 -8.61793,64.07754 -15.30122,0 -9.08693,-62.6119 0,62.6119 -21.57414,0 0,-94.91448 31.95083,0 c 0.93797,5.70629 1.9346,12.42866 2.98989,20.16713 l 3.40028,24.15365 5.62803,-44.32078 32.18533,0"
id="path3531"
style="font-size:120.06476593px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Impact;-inkscape-font-specification:Impact Bold" />
<path
d="m 355.74932,174.86778 0,94.91448 -24.68128,0 0,-94.91448 24.68128,0"
id="path3533"
style="font-size:120.06476593px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Impact;-inkscape-font-specification:Impact Bold" />
<path
d="m 415.78171,174.86778 -8.61793,41.97576 13.01483,52.93872 -22.86389,0 c -2.73589,-9.45822 -5.23724,-20.96832 -7.50405,-34.53035 -0.62537,5.97982 -1.48521,12.33089 -2.57952,19.05325 l -2.34501,15.4771 -24.03641,0 8.91106,-52.93872 -8.91106,-41.97576 23.86053,0 c 0.4299,2.61869 1.28973,6.9765 2.57952,13.07345 1.01614,4.65103 1.85644,8.91113 2.52089,12.78034 l 5.27628,-25.85379 20.69476,0"
id="path3535"
style="font-size:120.06476593px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Impact;-inkscape-font-specification:Impact Bold" />
<path
d="m 423.69613,174.86778 41.15501,0 0,18.99462 -16.47373,0 0,17.99799 15.41848,0 0,18.05661 -15.41848,0 0,20.87064 18.11524,0 0,18.99462 -42.79652,0 0,-94.91448"
id="path3537"
style="font-size:120.06476593px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Impact;-inkscape-font-specification:Impact Bold" />
<path
d="m 343.65625,361.65625 0,94.90625 24.65625,0 0,-42.78125 c 3.40023,5e-5 5.49954,0.60095 6.28125,1.8125 0.82072,1.21163 1.24997,4.35667 1.25,9.4375 l 0,31.53125 22.90625,0 0,-25.03125 c -7e-5,-7.66035 -0.22639,-12.31937 -0.65625,-14 -0.3909,-1.71964 -1.41321,-3.62386 -3.09375,-5.65625 -1.68065,-2.0323 -4.95836,-3.63211 -9.84375,-4.84375 5.39348,-0.50804 9.00677,-2.05327 10.84375,-4.59375 1.83687,-2.54038 2.74993,-7.48814 2.75,-14.875 -7e-5,-8.09022 -1.31895,-13.98231 -3.9375,-17.65625 -2.57957,-3.71285 -5.91969,-6.00723 -10.0625,-6.90625 -4.10382,-0.89883 -11.97812,-1.34366 -23.625,-1.34375 l -17.46875,0 z M 368.3125,377.875 c 2.85307,7e-5 4.81971,0.46833 5.875,1.40625 1.09431,0.93809 1.65622,2.92814 1.65625,5.9375 l 0,5.21875 c -3e-5,4.182 -0.58536,6.65589 -1.71875,7.4375 -1.09438,0.74264 -3.0376,1.12506 -5.8125,1.125 l 0,-21.125 z"
transform="translate(130,-186.78068)"
id="path3560"
style="font-size:120.06476593px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#000000;fill-opacity:1;stroke:none;font-family:Impact;-inkscape-font-specification:Impact Bold" />
</g>
<polygon
points="300,0 300,110.426 150,188 0,110.426 0,0 "
transform="matrix(1.7066667,0,0,1.7066667,130,-186.78068)"
id="polygon26"
style="fill:#000200" />
<g
id="g3518">
<path
d="m 247.89101,-128.45434 c -6e-5,1.1566 -0.40483,2.19744 -1.21431,3.12252 -0.8096,0.9253 -1.85043,1.38789 -3.12252,1.38778 -1.96608,0.23141 -3.29604,0.46271 -3.98988,0.69389 -3.58516,1.3879 -5.37771,4.22129 -5.37767,8.50019 l 0,82.226277 c -4e-5,4.510316 -1.33,8.44237 -3.98988,11.796175 -3.2382,4.279007 -8.03762,6.418507 -14.39827,6.418507 -6.12941,0 -10.81318,-2.081676 -14.05133,-6.245034 -2.77558,-3.469453 -4.16336,-7.459332 -4.16336,-11.969648 l 0,-82.226277 c 0,-4.5102 1.32996,-8.44225 3.98989,-11.79618 3.23815,-4.27888 7.97974,-6.41838 14.2248,-6.4185 l 27.40876,0 1.04083,0 0.6939,0.34694 c 1.96597,0.92531 2.94898,2.3131 2.94904,4.16336"
id="path3502"
style="font-size:173.47315979px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#e6e6e6;fill-opacity:1;stroke:none;font-family:Syndrome BRK;-inkscape-font-specification:Syndrome BRK" />
<path
d="m 261.59539,-128.45434 c -7e-5,1.27225 -0.46266,2.37091 -1.38779,3.29599 -0.92525,0.9253 -2.02391,1.38789 -3.29599,1.38779 -1.15655,1e-4 -2.19738,-0.46249 -3.12251,-1.38779 -0.92525,-0.92508 -1.38785,-2.02374 -1.38779,-3.29599 -6e-5,-1.27202 0.40471,-2.31286 1.21431,-3.12252 0.92513,-0.92507 2.02379,-1.38766 3.29599,-1.38778 1.27208,1.2e-4 2.37074,0.40489 3.29599,1.21431 0.92513,0.80966 1.38772,1.90832 1.38779,3.29599"
id="path3500"
style="font-size:173.47315979px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#e6e6e6;fill-opacity:1;stroke:none;font-family:Syndrome BRK;-inkscape-font-specification:Syndrome BRK" />
<path
d="m 316.23944,-32.523683 c -1.3e-4,4.510316 -1.33009,8.44237 -3.98989,11.796175 -3.23828,4.279007 -7.97987,6.418507 -14.2248,6.418507 -6.12948,0 -10.81325,-2.081676 -14.05132,-6.245034 -2.77566,-3.469453 -4.16345,-7.459332 -4.16336,-11.969648 l 0,-82.226277 c -9e-5,-2.77547 -0.80963,-4.97279 -2.42862,-6.59198 -1.61917,-1.61897 -3.87432,-2.42852 -6.76546,-2.42862 -1.15656,1e-4 -2.1974,-0.46249 -3.12251,-1.38779 -0.92527,-0.92508 -1.38786,-2.02374 -1.38779,-3.29599 -7e-5,-1.27202 0.4047,-2.31286 1.21431,-3.12252 0.92512,-0.92507 2.02378,-1.38766 3.29599,-1.38778 l 27.40876,0 c 6.01363,1.2e-4 10.6974,2.08179 14.05133,6.24503 2.77545,3.46957 4.16323,7.45945 4.16336,11.96965 l 0,82.226277"
id="path3489"
style="font-size:173.47315979px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#e6e6e6;fill-opacity:1;stroke:none;font-family:Syndrome BRK;-inkscape-font-specification:Syndrome BRK" />
<path
d="m 363.27506,-32.523683 c -5e-5,2.775586 0.80949,4.972911 2.42862,6.59198 1.61904,1.619093 3.81636,2.428634 6.59198,2.428625 1.27208,9e-6 2.37075,0.462603 3.29599,1.387785 0.92513,0.925197 1.38773,2.023859 1.38779,3.29599 -6e-5,1.156491 -0.46266,2.197329 -1.38779,3.122517 -0.92524,0.92519 -2.02391,1.387785 -3.29599,1.387785 l -27.40876,0 c -4.51032,0 -8.44237,-1.32996 -11.79617,-3.989883 -4.27902,-3.238158 -6.41852,-7.979753 -6.41851,-14.224799 l 0,-82.226277 c -10e-6,-4.5102 1.32995,-8.44225 3.98988,-11.79618 3.23815,-4.27888 7.97975,-6.41838 14.2248,-6.4185 l 27.40876,0 1.04084,0 0.69389,0.34694 c 1.96598,0.92531 2.94899,2.3131 2.94905,4.16336 -6e-5,1.1566 -0.40483,2.19744 -1.21432,3.12252 -0.80959,0.9253 -1.85043,1.38789 -3.12251,1.38778 -1.96608,0.23141 -3.29604,0.46271 -3.98989,0.69389 -3.58515,1.3879 -5.37771,4.22129 -5.37766,8.50019 l 0,82.226277"
id="path3510"
style="font-size:173.47315979px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#e6e6e6;fill-opacity:1;stroke:none;font-family:Syndrome BRK;-inkscape-font-specification:Syndrome BRK" />
<path
d="m 390.68381,-128.45434 c -6e-5,1.27225 -0.46266,2.37091 -1.38778,3.29599 -0.92526,0.9253 -2.02392,1.38789 -3.29599,1.38779 -1.15655,1e-4 -2.19739,-0.46249 -3.12252,-1.38779 -0.92525,-0.92508 -1.38784,-2.02374 -1.38778,-3.29599 -6e-5,-1.27202 0.40471,-2.31286 1.21431,-3.12252 0.92513,-0.92507 2.02379,-1.38766 3.29599,-1.38778 1.27207,1.2e-4 2.37073,0.40489 3.29599,1.21431 0.92512,0.80966 1.38772,1.90832 1.38778,3.29599"
id="path3508"
style="font-size:173.47315979px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#e6e6e6;fill-opacity:1;stroke:none;font-family:Syndrome BRK;-inkscape-font-specification:Syndrome BRK" />
<path
d="m 390.68381,-18.819303 c -6e-5,1.156491 -0.46266,2.197329 -1.38778,3.122517 -0.92526,0.92519 -2.02392,1.387785 -3.29599,1.387785 -1.2722,0 -2.37086,-0.40477 -3.29599,-1.214312 -0.8096,-0.925188 -1.21437,-2.02385 -1.21431,-3.29599 -6e-5,-1.272131 0.40471,-2.370793 1.21431,-3.29599 0.80948,-0.925182 1.90814,-1.387776 3.29599,-1.387785 1.27207,9e-6 2.37073,0.462603 3.29599,1.387785 0.92512,0.925197 1.38772,2.023859 1.38778,3.29599"
id="path3506"
style="font-size:173.47315979px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#e6e6e6;fill-opacity:1;stroke:none;font-family:Syndrome BRK;-inkscape-font-specification:Syndrome BRK" />
<path
d="m 445.32786,-32.523683 c -1.2e-4,6.129397 -2.0818,10.813168 -6.24503,14.051326 -3.46958,2.775572 -7.45946,4.163356 -11.96965,4.163356 l -27.40876,0 c -1.27221,0 -2.37088,-0.40477 -3.29599,-1.214312 -0.80962,-0.925188 -1.21439,-2.02385 -1.21431,-3.29599 -8e-5,-1.272131 0.40469,-2.370793 1.21431,-3.29599 0.80946,-0.925182 1.90813,-1.387776 3.29599,-1.387785 3.46938,9e-6 6.01365,-1.214302 7.63282,-3.642937 1.04075,-1.50342 1.56117,-3.295974 1.56126,-5.377668 l 0,-82.226277 c -9e-5,-2.77547 -0.80963,-4.97279 -2.42863,-6.59198 -1.61916,-1.61897 -3.87431,-2.42852 -6.76545,-2.42862 -1.15657,1e-4 -2.1974,-0.46249 -3.12252,-1.38779 -0.92526,-0.92508 -1.38786,-2.02374 -1.38778,-3.29599 -8e-5,-1.27202 0.40469,-2.31286 1.21431,-3.12252 0.92511,-0.92507 2.02378,-1.38766 3.29599,-1.38778 l 27.40876,0 c 6.01362,1.2e-4 10.69739,2.08179 14.05132,6.24503 2.77545,3.46957 4.16324,7.45945 4.16336,11.96965 l 0,82.226277"
id="path3491"
style="font-size:173.47315979px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#e6e6e6;fill-opacity:1;stroke:none;font-family:Syndrome BRK;-inkscape-font-specification:Syndrome BRK" />
<path
d="m 506.06786,-128.45434 c -6e-5,1.1566 -0.40483,2.19744 -1.21431,3.12252 -0.8096,0.9253 -1.85044,1.38789 -3.12252,1.38778 -1.96608,0.23141 -3.29604,0.46271 -3.98988,0.69389 -3.58516,1.3879 -5.37771,4.22129 -5.37767,8.50019 l 0,82.226277 c -4e-5,4.510316 -1.33,8.44237 -3.98988,11.796175 -3.2382,4.279007 -8.03762,6.418507 -14.39827,6.418507 -6.12941,0 -10.81318,-2.081676 -14.05133,-6.245034 -2.77558,-3.469453 -4.16336,-7.459332 -4.16336,-11.969648 l 0,-82.226277 c 0,-4.5102 1.32996,-8.44225 3.98989,-11.79618 3.23815,-4.27888 7.97974,-6.41838 14.2248,-6.4185 l 27.40875,0 1.04084,0 0.6939,0.34694 c 1.96597,0.92531 2.94898,2.3131 2.94904,4.16336"
id="path3516"
style="font-size:173.47315979px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#e6e6e6;fill-opacity:1;stroke:none;font-family:Syndrome BRK;-inkscape-font-specification:Syndrome BRK" />
<path
d="m 519.77224,-128.45434 c -7e-5,1.27225 -0.46266,2.37091 -1.38779,3.29599 -0.92525,0.9253 -2.02392,1.38789 -3.29599,1.38779 -1.15655,1e-4 -2.19738,-0.46249 -3.12251,-1.38779 -0.92525,-0.92508 -1.38785,-2.02374 -1.38779,-3.29599 -6e-5,-1.27202 0.40471,-2.31286 1.21431,-3.12252 0.92513,-0.92507 2.02379,-1.38766 3.29599,-1.38778 1.27207,1.2e-4 2.37074,0.40489 3.29599,1.21431 0.92513,0.80966 1.38772,1.90832 1.38779,3.29599"
id="path3514"
style="font-size:173.47315979px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#e6e6e6;fill-opacity:1;stroke:none;font-family:Syndrome BRK;-inkscape-font-specification:Syndrome BRK" />
<path
d="m 574.41628,-32.523683 c -1.2e-4,4.510316 -1.33008,8.44237 -3.98988,11.796175 -3.23828,4.279007 -7.97988,6.418507 -14.2248,6.418507 -6.12948,0 -10.81325,-2.081676 -14.05132,-6.245034 -2.77566,-3.469453 -4.16345,-7.459332 -4.16336,-11.969648 l 0,-82.226277 c -9e-5,-2.77547 -0.80963,-4.97279 -2.42862,-6.59198 -1.61917,-1.61897 -3.87432,-2.42852 -6.76546,-2.42862 -1.15656,1e-4 -2.1974,-0.46249 -3.12251,-1.38779 -0.92527,-0.92508 -1.38786,-2.02374 -1.38779,-3.29599 -7e-5,-1.27202 0.4047,-2.31286 1.21431,-3.12252 0.92512,-0.92507 2.02378,-1.38766 3.29599,-1.38778 l 27.40876,0 c 6.01363,1.2e-4 10.6974,2.08179 14.05133,6.24503 2.77545,3.46957 4.16323,7.45945 4.16335,11.96965 l 0,82.226277"
id="path3493"
style="font-size:173.47315979px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:center;line-height:100%;letter-spacing:0px;word-spacing:0px;writing-mode:lr-tb;text-anchor:middle;fill:#e6e6e6;fill-opacity:1;stroke:none;font-family:Syndrome BRK;-inkscape-font-specification:Syndrome BRK" />
</g>
</g>
</svg>

+ 0
- 1
mixer/icons/icon-small.svg View File

@@ -1 +0,0 @@
icon-large.svg

+ 0
- 9
mixer/non-mixer.desktop.in View File

@@ -1,9 +0,0 @@
[Desktop Entry]
Name=Non Mixer
Comment=Modular Digital Audio Workstation - Mixer
Comment[fr]=Station de travail audio-numérique modulaire - Mixeur
Exec=@BIN_PATH@/non-mixer
Terminal=false
Type=Application
Icon=non-mixer
Categories=AudioVideo;Audio;

BIN
mixer/pixmaps/panner-plane-502x502.png View File

Before After
Width: 502  |  Height: 502  |  Size: 29KB

BIN
mixer/pixmaps/panner-plane-802x802.png View File

Before After
Width: 802  |  Height: 802  |  Size: 11KB

BIN
mixer/pixmaps/panner-plane-92x92.png View File

Before After
Width: 92  |  Height: 92  |  Size: 864B

BIN
mixer/pixmaps/panner-sphere-502x502.png View File

Before After
Width: 502  |  Height: 502  |  Size: 116KB

BIN
mixer/pixmaps/panner-sphere-802x802.png View File

Before After
Width: 802  |  Height: 802  |  Size: 225KB

BIN
mixer/pixmaps/panner-sphere-92x92.png View File

Before After
Width: 92  |  Height: 92  |  Size: 8.0KB

+ 0
- 206
mixer/src/AUX_Module.C View File

@@ -1,206 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2013 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

#include <FL/fl_draw.H>
#include "AUX_Module.H"
#include "dsp.h"

/* The purpose of this module is to provide auxiliary outputs, with
* gain. This allows one to create a 'send' type topology without
* having to use an extra strip to control the 'send' gain. */

AUX_Module::AUX_Module ( ) : JACK_Module ( false )
{
is_default( false );

_number = 0;

{
Port p( this, Port::INPUT, Port::CONTROL, "Gain (dB)" );
p.hints.type = Port::Hints::LINEAR;
p.hints.ranged = true;
p.hints.minimum = -70.0f;
p.hints.maximum = 6.0f;
p.hints.default_value = 0.0f;
p.connect_to( new float );
p.control_value( p.hints.default_value );

add_port( p );
}

log_create();

color( FL_DARK1 );

copy_label( "Aux" );

smoothing.sample_rate( sample_rate() );
}

AUX_Module::~AUX_Module ( )
{
configure_outputs(0);
delete (float*)control_input[0].buffer();
}


void
AUX_Module::get ( Log_Entry &e ) const
{
e.add( ":number", number() );
JACK_Module::get(e);
}

void
AUX_Module::set ( Log_Entry &e )
{
for ( int i = 0; i < e.size(); ++i )
{
const char *s, *v;

e.get( i, &s, &v );

if ( ! ( strcmp( s, ":number" ) ) )
{
number( atoi(v) );
}
}

JACK_Module::set(e);
}

void
AUX_Module::number ( int n )
{
_number = n;

char s[10];
snprintf( s, sizeof(s), "aux-%c", 'A' + n );
prefix( s );
snprintf( s, sizeof(s), "Aux (%c)", 'A' + n );
copy_label( s );
}

void
AUX_Module::handle_sample_rate_change ( nframes_t n )
{
smoothing.sample_rate( n );
}

void
AUX_Module::process ( nframes_t nframes )
{
if ( unlikely( bypass() ) )
{
for ( unsigned int i = 0; i < audio_input.size(); ++i )
{
if ( audio_input[i].connected() )
buffer_fill_with_silence( (sample_t*)aux_audio_output[i].jack_port()->buffer(nframes), nframes );
}
}
else
{
float gt = DB_CO( control_input[0].control_value() );
sample_t gainbuf[nframes];
bool use_gainbuf = smoothing.apply( gainbuf, nframes, gt );

if ( unlikely( use_gainbuf ) )
{
for ( unsigned int i = 0; i < audio_input.size(); ++i )
{
if ( audio_input[i].connected() )
buffer_copy_and_apply_gain_buffer( (sample_t*)aux_audio_output[i].jack_port()->buffer(nframes), (sample_t*)audio_input[i].buffer(), gainbuf, nframes );
}

}
else
{
for ( unsigned int i = 0; i < audio_input.size(); ++i )
{
if ( audio_input[i].connected() )
buffer_copy_and_apply_gain( (sample_t*)aux_audio_output[i].jack_port()->buffer(nframes), (sample_t*)audio_input[i].buffer(), nframes, gt );
}
}
}
}

void
AUX_Module::draw ( void )
{
int W = 5;

child(0)->size( w() - W, h() );
Module::draw_box(x(),y(),w() - W,h());
Module::draw_label(x(),y(),w() - W,h());

Module *m = this;
fl_color( fl_darker( FL_FOREGROUND_COLOR ) );

int spacing, offset;

spacing = h() / m->ninputs();
offset = spacing / 2;
for ( int i = m->ninputs(); i--; )
{
int xi = offset + ( spacing * i );
fl_rectf( m->x() + m->w() - W, m->y() + xi, W, 2 );
}
}

bool
AUX_Module::configure_outputs ( int n )
{
int on = audio_output.size();

if ( n > on )
{
for ( int i = on; i < n; ++i )
{
add_port( Port( this, Port::OUTPUT, Port::AUDIO ) );
}
}
else
{
for ( int i = on; i > n; --i )
{
audio_output.back().disconnect();
audio_output.pop_back();
}
}

return true;
}

bool
AUX_Module::configure_inputs ( int n )
{
bool b = JACK_Module::configure_inputs( n );

if ( b )
{
return configure_outputs( n );
}

return false;
}

+ 0
- 61
mixer/src/AUX_Module.H View File

@@ -1,61 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2013 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

#pragma once

#include "JACK_Module.H"
#include "dsp.h"

class AUX_Module : public JACK_Module
{
int _number;

Value_Smoothing_Filter smoothing;

protected:

virtual void get ( Log_Entry &e ) const;
virtual void set ( Log_Entry &e );

public:

virtual const char *name ( void ) const { return "AUX"; }

int can_support_inputs ( int n ) { return n > 0 ? n : -1; }

virtual bool configure_outputs ( int n );
virtual bool configure_inputs ( int n );

void number ( int n );
int number ( void ) const { return _number; }

AUX_Module ( );
virtual ~AUX_Module ( );

LOG_CREATE_FUNC( AUX_Module );
virtual void handle_sample_rate_change ( nframes_t n );

protected:

virtual void draw ( void );
virtual void process ( nframes_t nframes );

};


+ 0
- 991
mixer/src/Chain.C View File

@@ -1,991 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2009 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

/* Filter chain. This would all be much simpler if we chose not to
* allow non 1:1 plugins to be mixed in a single chain...
*
* Supporting the mixture requires duplicating some inputs (to satisfy
* stereo input plugins reading mono outputs) and duplicating some
* plugins (to satisfy mono input plugins reading stereo outputs).
*
* Basically, what this means is that the intermediate number of
* buffers need not have any relation to the starting and ending
* buffer count. (Picture an ambisonic panner going into an ambisonic
* decoder (1:6:2).
*
* The chain will allocate enough buffers to hold data from the
* maximum number of channels used by a contained module.
*
* The process thread goes as follows:
*
* 1. Copy inputs to chain buffers.
*
* 2. process() each module in turn (reusing buffers in-place) (inputs
* will be copied or plugins duplicated as necessary)
*
* 3. Copy chain buffers to outputs.
*
* For chains where the number of channels never exceeds the maximum
* of the number of inputs and outputs, the first copy can be
* optimized out.
*/

#include "const.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include "Chain.H"
#include "Module.H"
#include "Meter_Module.H"
#include "JACK_Module.H"
#include "Gain_Module.H"
#include "Plugin_Module.H"
#include "Controller_Module.H"

#include <FL/Fl_Box.H>
#include <FL/Fl_Menu.H>
#include <FL/fl_ask.H>
#include <FL/Fl_Flip_Button.H>
#include <FL/Fl_Tabs.H>
#include "FL/Fl_Flowpack.H"
#include "FL/Fl_Scroll.H"
#include "FL/Fl_Packscroller.H"
#include <FL/fl_draw.H>
#include "FL/menu_popup.H"
#include "FL/test_press.H"

#include "debug.h"
#include "Group.H"

#include "Mixer_Strip.H"
#include <dsp.h>
#include "Mixer.H"
extern char *instance_name;


/* Chain::Chain ( int X, int Y, int W, int H, const char *L ) : */
/* Fl_Group( X, Y, W, H, L) */
Chain::Chain ( ) : Fl_Group( 0, 0, 100, 100, "")

{
/* not really deleting here, but reusing this variable */
_deleting = true;

int X = 0;
int Y = 0;
int W = 100;
int H = 100;

/* _outs = 1; */
/* _ins = 1; */

_configure_outputs_callback = NULL;

_strip = NULL;

_name = NULL;

labelsize( 10 );
align( FL_ALIGN_TOP );

{ Fl_Flip_Button* o = tab_button = new Fl_Flip_Button( X, Y, W, 16, "chain/controls");
o->type(1);
o->labelsize( 12 );
o->callback( cb_handle, this );
}

Y += 18;
H -= 18;

{ Fl_Group *o = chain_tab = new Fl_Group( X, Y, W, H, "" );
o->labeltype( FL_NO_LABEL );
o->box( FL_FLAT_BOX );
// o->color( fl_darker( FL_BACKGROUND_COLOR ) );
// o->color( FL_BACKGROUND_COLOR );
// o->box( FL_NO_BOX );
{ Fl_Packscroller *o = new Fl_Packscroller( X, Y, W, H );
o->color( FL_BACKGROUND_COLOR );
// o->box( FL_FLAT_BOX );
o->box( FL_THIN_UP_BOX );
o->type( Fl_Scroll::VERTICAL );
{ Fl_Pack *o = modules_pack = new Fl_Pack( X, Y, W, H );
o->type( Fl_Pack::VERTICAL );
o->spacing( 6 );
o->end();
Fl_Group::current()->resizable( o );
}
o->end();
}
o->end();
}
{ Fl_Group *o = control_tab = new Fl_Group( X, Y, W, H, "" );
o->box( FL_FLAT_BOX );
o->color( FL_BACKGROUND_COLOR );
o->labeltype( FL_NO_LABEL );
o->hide();
{ Fl_Scroll *o = new Fl_Scroll( X, Y, W, H );
o->color( FL_BACKGROUND_COLOR );
o->box( FL_NO_BOX );
o->type( Fl_Scroll::VERTICAL );
{ Fl_Pack *o = controls_pack = new Fl_Pack( X, Y, W, H );
o->type( Fl_Pack::VERTICAL );
o->spacing( 5 );
// o->color( FL_RED );
o->end();
Fl_Group::current()->resizable( o );
}
o->end();
Fl_Group::current()->resizable( o );
}
o->end();
o->hide();
Fl_Group::current()->resizable( o );
}
end();

log_create();

_deleting = false;
}

Chain::~Chain ( )
{
DMESSAGE( "Destroying chain" );

log_destroy();

_deleting = true;

client()->lock();

for ( unsigned int i = scratch_port.size(); i--; )
free( (sample_t*)scratch_port[i].buffer() );
/* if we leave this up to FLTK, it will happen after we've
already destroyed the client */
modules_pack->clear();
controls_pack->clear();

client()->unlock();
}

Group *
Chain::client ( void )
{
return strip()->group();
}


void
Chain::get ( Log_Entry &e ) const
{
e.add( ":strip", strip() );
e.add( ":tab", tab_button->value() ? "controls" : "chain" );
}

void
Chain::set ( Log_Entry &e )
{
for ( int i = 0; i < e.size(); ++i )
{
const char *s, *v;

e.get( i, &s, &v );

if ( ! strcmp( s, ":tab" ) )
{
tab_button->value( strcmp( v, "controls" ) == 0 );
tab_button->do_callback();
}
else if ( ! strcmp( s, ":strip" ) )
{
int i;
sscanf( v, "%X", &i );
Mixer_Strip *t = (Mixer_Strip*)Loggable::find( i );

assert( t );

t->chain( this );
}
}
}


void
Chain::log_children ( void ) const
{
log_create();

for ( int i = 0; i < modules(); ++i )
{
module(i)->log_create();
}

for ( int i = 0; i < controls_pack->children(); ++i )
{
Controller_Module *cm = (Controller_Module*)controls_pack->child( i );

cm->log_create();
}
}

/* Fill this chain with JACK I/O, Gain, and Meter modules. */
void
Chain::initialize_with_default ( void )
{

{ JACK_Module *m = new JACK_Module();
m->is_default( true );
m->chain( this );
m->configure_outputs( 1 );
add( m );
}

{ Module *m = new Gain_Module();
m->is_default( true );
m->chain(this);
add( m );
}

{ Module *m = new Meter_Module();
m->is_default( true );
add( m );
}

{ JACK_Module *m = new JACK_Module();
m->is_default( true );
m->chain( this );
add( m );
}
}


void Chain::cb_handle(Fl_Widget* o) {
if ( o == tab_button )
{
Fl_Flip_Button *fb = (Fl_Flip_Button*)o;

if ( fb->value() == 0 )
{
control_tab->hide();
chain_tab->show();
}
else
{
chain_tab->hide();
control_tab->show();
}
}
}

void Chain::cb_handle(Fl_Widget* o, void* v) {
((Chain*)(v))->cb_handle(o);
}

void
Chain::remove ( Controller_Module *m )
{
DMESSAGE( "Removing controller module from chain" );

client()->lock();

m->disconnect();

controls_pack->remove( m );
modules_pack->remove( m );

build_process_queue();

client()->unlock();

redraw();
}

void
Chain::send_feedback ( void )
{
for ( int i = 0; i < modules(); i++ )
module(i)->send_feedback();
}

/* remove a module from the chain. this isn't guaranteed to succeed,
* because removing the module might result in an invalid routing */
void
Chain::remove ( Module *m )
{
int i = modules_pack->find( m );

int ins = 0;

if ( i != 0 )
ins = module( i - 1 )->noutputs();

if ( ! can_configure_outputs( m, ins ) )
{
fl_alert( "Can't remove module at this point because the resultant chain is invalid" );
}

client()->lock();

strip()->handle_module_removed( m );

modules_pack->remove( m );

configure_ports();

client()->unlock();
}

/* determine number of output ports, signal if changed. */
void
Chain::configure_ports ( void )
{
int nouts = 0;

client()->lock();

for ( int i = 0; i < modules(); ++i )
{
module( i )->configure_inputs( nouts );
nouts = module( i )->noutputs();
}

unsigned int req_buffers = required_buffers();

DMESSAGE( "required_buffers = %i", req_buffers );

if ( scratch_port.size() < req_buffers )
{
for ( unsigned int i = scratch_port.size(); i--; )
free(scratch_port[i].buffer());
scratch_port.clear();

for ( unsigned int i = 0; i < req_buffers; ++i )
{
Module::Port p( NULL, Module::Port::OUTPUT, Module::Port::AUDIO );
p.set_buffer( buffer_alloc( client()->nframes() ) );
buffer_fill_with_silence( (sample_t*)p.buffer(), client()->nframes() );
scratch_port.push_back( p );
}
}

build_process_queue();

client()->unlock();

parent()->redraw();
}

/** invoked from the JACK latency callback... We need to update the latency values on this chains ports */
void
Chain::set_latency ( JACK::Port::direction_e dir )
{
nframes_t tmax = 0;
nframes_t tmin = 0;
nframes_t added_min = 0;
nframes_t added_max = 0;

for ( int i = 0; i < modules(); i++ )
{
Module *m;

if ( dir == JACK::Port::Input )
m = module( i );
else
m = module( (modules() - 1) - i );
nframes_t min,max;
min = max = 0;
nframes_t a = m->get_module_latency();
added_min += a;
added_max += a;
if ( dir == JACK::Port::Input ? m->aux_audio_input.size() : m->aux_audio_output.size() )
{
m->get_latency( dir, &min, &max );
tmin = 0;
added_min = 0;
}
if ( min > tmin )
tmin = min;
if ( max > tmax )
tmax = max;
m->set_latency( dir, tmin + added_min, tmax + added_max );
}
}

int
Chain::get_module_instance_number ( Module *m )
{
int n = 0;

for ( int i = 0; i < modules() && module(i) != m; ++i )
if ( ! strcmp( module(i)->label(), m->label() ) )
n++;

return n;
}

/* calculate the minimum number of buffers required to satisfy this chain */
int
Chain::required_buffers ( void )
{
int buffers = 0;
int outs = 0;

for ( int i = 0; i < modules(); ++i )
{
outs = module( i )->can_support_inputs( outs );

if ( outs > buffers )
buffers = outs;
}

return buffers;
}

/* called by a module when it wants to alter the number of its
* outputs. Also used to test for chain validity when inserting /
* removing modules */
bool
Chain::can_configure_outputs ( Module *m, int n ) const
{
/* start at the requesting module */

int outs = n;

int i = modules_pack->find( m );

if ( modules() - 1 == i )
/* last module */
return true;

for ( i++ ; i < modules(); ++i )
{
outs = module( i )->can_support_inputs( outs );

if ( outs < 0 )
return false;
}

return true;
}

unsigned int
Chain::maximum_name_length ( void )
{
return JACK::Client::maximum_name_length() - ( strlen( instance_name ) + 1 );
}

void
Chain::freeze_ports ( void )
{
for ( int i = 0; i < modules(); i++ )
{
Module *m = module(i);
m->freeze_ports();
}
}

void
Chain::thaw_ports ( void )
{
for ( int i = 0; i < modules(); i++ )
{
Module *m = module(i);
m->thaw_ports();
}
}

/* rename chain... we have to let our modules know our name has
* changed so they can take the appropriate action (in particular the
* JACK module). */
void
Chain::name ( const char *name )
{
_name = name;

if ( strip()->group() )
{
if ( strip()->group()->single() )
strip()->group()->name(name);
}
for ( int i = 0; i < modules(); ++i )
{
module( i )->handle_chain_name_changed();
}
}

bool
Chain::add ( Module *m )
{
/* FIXME: hacky */
if ( !strcmp( m->name(), "Controller" ) )
return false;
else
return insert( NULL, m );
}

bool
Chain::add ( Controller_Module *m )
{
DMESSAGE( "Adding control" );
add_control(m);
return true;
}

bool
Chain::insert ( Module *m, Module *n )
{
client()->lock();

if ( !m )
{
if ( modules() == 0 && n->can_support_inputs( 0 ) >= 0 )
{
n->chain( this );
n->configure_inputs( 0 );
modules_pack->add( n );
}
else if ( n->can_support_inputs( module( modules() - 1 )->noutputs() ) >= 0 )
{
n->chain( this );
n->configure_inputs( module( modules() - 1 )->noutputs() );
modules_pack->add( n );
}
else
{
DMESSAGE( "Module says it can't support %i inputs", module( modules() - 1 )->noutputs() );

goto err;
}
}
else
{
int i = modules_pack->find( m );

n->chain( this );

if ( 0 == i )
{
/* inserting to head of chain*/
if ( n->can_support_inputs( 0 ) >= 0 )
n->configure_inputs( 0 );
else
goto err;
}
else
{
if ( n->can_support_inputs( module( i - 1 )->noutputs() ) >= 0 )
{
n->configure_inputs( module( i - 1 )->noutputs() );

m->configure_inputs( n->noutputs() );

for ( int j = i + 1; j < modules(); ++j )
module( j )->configure_inputs( module( j - 1 )->noutputs() );
}
else
goto err;
}

modules_pack->insert( *n, i );
}


strip()->handle_module_added( n );

configure_ports();

client()->unlock();

DMESSAGE( "Module \"%s\" has %i:%i audio and %i:%i control ports",
n->name(),
n->ninputs(),
n->noutputs(),
n->ncontrol_inputs(),
n->ncontrol_outputs() );

n->initialize();
return true;

err:

client()->unlock();

DMESSAGE( "Insert failed" );

return false;
}

/* add a control to the control strip. Assumed to already be connected! */
void
Chain::add_control ( Controller_Module *m )
{
client()->lock();

controls_pack->add( m );

configure_ports();

client()->unlock();

controls_pack->redraw();
}

void
Chain::draw_connections ( Module *m )
{
int spacing;
int offset;

int X, Y, W, H;

((Fl_Packscroller*)chain_tab->child( 0 ))->bbox( X, Y, W, H );

fl_push_clip( X, Y, W, H );

Fl_Color c = FL_FOREGROUND_COLOR;
fl_color( c );

if ( m->ninputs() )
{
spacing = w() / m->ninputs();
offset = spacing / 2;

for ( int i = m->ninputs(); i--; )
fl_rectf( m->x() + offset + ( spacing * i ), m->y() - 3, 2, 3 );
}

fl_color( fl_darker( c ) );

if ( m->noutputs() )
{
spacing = w() / m->noutputs();
offset = spacing / 2;
for ( int i = m->noutputs(); i--; )
fl_rectf( m->x() + offset + ( spacing * i ), m->y() + m->h(), 2, 3 );
}

fl_pop_clip();
}

void
Chain::add_to_process_queue ( Module *m )
{
for ( std::list<Module*>::const_iterator i = process_queue.begin(); i != process_queue.end(); ++i )
if ( m == *i )
return;

process_queue.push_back( m );
}

/* run any time the internal connection graph might have
* changed... Tells the process thread what order modules need to be
* run in. */
void
Chain::build_process_queue ( void )
{
process_queue.clear();

for ( int i = 0; i < modules(); ++i )
{
Module *m = (Module*)module( i );

/* controllers */
for ( unsigned int j = 0; j < m->control_input.size(); ++j )
{
if ( m->control_input[j].connected() )
{
add_to_process_queue( m->control_input[j].connected_port()->module() );
}
}

/* audio modules */
add_to_process_queue( m );

/* indicators */
for ( unsigned int j = 0; j < m->control_output.size(); ++j )
{
if ( m->control_output[j].connected() )
{
add_to_process_queue( m->control_output[j].connected_port()->module() );
}
}
}

/* connect all the ports to the buffers */
for ( int i = 0; i < modules(); ++i )
{

Module *m = module( i );
for ( unsigned int j = 0; j < m->audio_input.size(); ++j )
{
m->audio_input[j].set_buffer( scratch_port[j].buffer() );
}
for ( unsigned int j = 0; j < m->audio_output.size(); ++j )
{
m->audio_output[j].set_buffer( scratch_port[j].buffer() );
}

m->handle_port_connection_change();
}

/* DMESSAGE( "Process queue looks like:" ); */

/* for ( std::list<Module*>::const_iterator i = process_queue.begin(); i != process_queue.end(); ++i ) */
/* { */
/* const Module* m = *i; */

/* if ( m->audio_input.size() || m->audio_output.size() ) */
/* DMESSAGE( "\t%s", (*i)->name() ); */
/* else if ( m->control_output.size() ) */
/* DMESSAGE( "\t%s -->", (*i)->name() ); */
/* else if ( m->control_input.size() ) */
/* DMESSAGE( "\t%s <--", (*i)->name() ); */

/* { */
/* char *s = m->get_parameters(); */

/* DMESSAGE( "(%s)", s ); */

/* delete[] s; */
/* } */
/* } */
}

void
Chain::strip ( Mixer_Strip * ms )
{
_strip = ms;
}


void
Chain::draw ( void )
{
Fl_Group::draw();

/* if ( 0 == strcmp( "Chain", tabs->value()->label() ) ) */
if ( chain_tab->visible() )
for ( int i = 0; i < modules(); ++i )
draw_connections( module( i ) );
}

void
Chain::resize ( int X, int Y, int W, int H )
{
Fl_Group::resize( X, Y, W, H );

/* this won't naturally resize because it's inside of an Fl_Scroll... */
controls_pack->size( W, controls_pack->h() );
}

void
Chain::get_output_ports ( std::list<std::string> &sl)
{
for ( int i = 0; i < modules(); i++ )
{
Module *m = module(i);
for ( unsigned int j = 0; j < m->aux_audio_output.size(); j++ )
{
char *s;

asprintf( &s, "%s/%s",
"*",
m->aux_audio_output[j].jack_port()->name() );

sl.push_back( s );

free(s);

if ( ! strip()->group()->single() )
{
asprintf( &s, "%s/%s",
strip()->group()->name(),
m->aux_audio_output[j].jack_port()->name() );

sl.push_back( s );
free(s);
}
}
}
}

void
Chain::auto_connect_outputs ( void )
{
for ( int i = 0; i < modules(); i++ )
{
module(i)->auto_connect_outputs();
}
}

void
Chain::auto_disconnect_outputs ( void )
{
for ( int i = 0; i < modules(); i++ )
{
module(i)->auto_disconnect_outputs();
}
}



/*****************/
/* Import/Export */
/*****************/

void
Chain::snapshot ( void *v )
{
((Chain*)v)->snapshot();
}

void
Chain::snapshot ( void )
{
log_children();
}

bool
Chain::do_export ( const char *filename )
{
MESSAGE( "Exporting chain state" );
Loggable::snapshot_callback( &Chain::snapshot, this );
Loggable::snapshot( filename );
return true;
}


/**********/
/* Client */
/**********/

void
Chain::process ( nframes_t nframes )
{
for ( std::list<Module*>::const_iterator i = process_queue.begin(); i != process_queue.end(); ++i )
{
Module *m = *i;

m->process( nframes );
}
}

void
Chain::buffer_size ( nframes_t nframes )
{
for ( unsigned int i = scratch_port.size(); i--; )
free(scratch_port[i].buffer());
scratch_port.clear();

configure_ports();

for ( int i = 0; i < modules(); ++i )
{
Module *m = module(i);

m->resize_buffers( nframes );
}
}

int
Chain::sample_rate_change ( nframes_t nframes )
{
Module::set_sample_rate ( nframes );
for ( int i = 0; i < modules(); ++i )
{
Module *m = module(i);

m->handle_sample_rate_change( nframes );
}

return 0;
}

/* handle jack port connection change */
void
Chain::port_connect ( jack_port_id_t a, jack_port_id_t b, int connect )
{
if ( _deleting )
return;

/* this is called from JACK non-RT thread... */
if ( jack_port_is_mine( client()->jack_client(), jack_port_by_id( client()->jack_client(), a ) ) ||
jack_port_is_mine( client()->jack_client(), jack_port_by_id( client()->jack_client(), b ) ))
{
Fl::awake( Chain::update_connection_status, this );
}
}

void
Chain::update ( void )
{
for ( int i = 0; i < controls_pack->children(); ++i )
{
Controller_Module *cm = (Controller_Module*)controls_pack->child( i );
cm->update();
}

for ( int i = 0; i < modules(); i++ )
{
Module *m = module(i);
m->update();
}
}

void
Chain::update_connection_status ( void *v )
{
((Chain*)v)->update_connection_status();
}

void
Chain::update_connection_status ( void )
{
for ( int i = 0; i < modules(); i++ )
{
Module *m = module(i);
if ( !strcmp( m->basename(), "JACK" ) )
{
((JACK_Module*)m)->update_connection_status();
}
}
}

+ 0
- 149
mixer/src/Chain.H View File

@@ -1,149 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2009 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

#pragma once

#include <FL/Fl.H>
#include <FL/Fl_Pack.H>
#include <FL/Fl_Button.H>

#include "Module.H"
#include "JACK/Port.H"
#include <vector>
#include <list>
#include "Loggable.H"
#include "Group.H"

class Mixer_Strip;
class Fl_Flowpack;
class Fl_Flip_Button;
class Controller_Module;

class Chain : public Fl_Group, public Loggable {

Fl_Flip_Button *tab_button;
Fl_Pack *controls_pack;
Fl_Group *chain_tab;
Fl_Group *control_tab;
Fl_Pack *modules_pack;

Mixer_Strip *_strip;
const char *_name;

std::list<Module*> process_queue;

std::vector <Module::Port> scratch_port;

Fl_Callback *_configure_outputs_callback;
void *_configure_outputs_userdata;
bool _deleting;

private:

static void snapshot ( void *v );
void snapshot ( void );

void cb_handle(Fl_Widget*);
static void cb_handle(Fl_Widget*, void*);

void draw_connections ( Module *m );
void build_process_queue ( void );
void add_to_process_queue ( Module *m );

static void update_connection_status ( void *v );
void update_connection_status ( void );

protected:

void get ( Log_Entry &e ) const;
void set ( Log_Entry &e );

public:

void auto_connect_outputs ( void );
void auto_disconnect_outputs ( void );

void get_output_ports ( std::list<std::string> &sl);

void port_connect ( jack_port_id_t a, jack_port_id_t b, int connect );
void buffer_size ( nframes_t nframes );
int sample_rate_change ( nframes_t nframes );
void process ( nframes_t );

Chain ( int X, int Y, int W, int H, const char *L = 0 );
Chain ( );
virtual ~Chain ( );

void update ( void );
void draw ( void );
void resize ( int X, int Y, int W, int H );

Mixer_Strip *strip ( void ) const { return _strip; }
void strip ( Mixer_Strip *v );
const char *name ( void ) const { return _name; }
void name ( const char *name );

void send_feedback ( void );

int get_module_instance_number ( Module *m );

void configure_ports ( void );
int required_buffers ( void );

bool can_support_input_channels ( int n );

int modules ( void ) const { return modules_pack->children(); }
Module *module ( int n ) const { return (Module*)modules_pack->child( n ); }
void remove ( Controller_Module *m );
void remove ( Module *m );
bool add ( Module *m );
bool add ( Controller_Module *m );
bool insert ( Module *m, Module *n );
void add_control ( Controller_Module *m );

bool do_export ( const char *filename );

void initialize_with_default ( void );

bool can_configure_outputs ( Module *m, int n ) const;

void configure_outputs_callback ( Fl_Callback *cb, void *v )
{
_configure_outputs_callback = cb;
_configure_outputs_userdata = v;
}

void set_latency ( JACK::Port::direction_e );

Fl_Callback * configure_outputs_callback ( void ) const { return _configure_outputs_callback; }

virtual void log_children ( void ) const;

static unsigned int maximum_name_length ( void );

Group *client ( void );

void freeze_ports ( void );
void thaw_ports ( void );

// void client ( Client * );

LOG_CREATE_FUNC( Chain );
};

+ 0
- 994
mixer/src/Controller_Module.C View File

@@ -1,994 +0,0 @@
/*******************************************************************************/
/* Copyright (C) 2009 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

#include "const.h"

#include "Controller_Module.H"

#include <stdio.h>

#include <FL/Fl.H>
#include <FL/Fl_Box.H>
#include <FL/fl_ask.H>
#include <FL/Fl_Counter.H>
#include <FL/Fl_Menu_Item.H>
#include <FL/Fl_Menu_Button.H>
#include <FL/Fl_Menu_.H>
#include <FL/Fl_Light_Button.H>
#include <FL/fl_draw.H>
#include "FL/Fl_DialX.H"
#include "FL/Fl_Labelpad_Group.H"
#include "FL/Fl_Value_SliderX.H"
#include "Panner.H"
#include "FL/test_press.H"
#include "FL/menu_popup.H"

#include "Chain.H"
#include "OSC/Endpoint.H"

// needed for mixer->endpoint
#include "Mixer.H"
#include "Spatialization_Console.H"
#include "string_util.h"


bool Controller_Module::learn_by_number = false;
bool Controller_Module::_learn_mode = false;

void
Controller_Module::take_focus ( void )
{
bool v = visible_focus();

if ( ! v )
set_visible_focus();

Fl_Widget::take_focus();
if ( ! v )
clear_visible_focus();
}

Controller_Module::Controller_Module ( bool is_default ) : Module( is_default, 50, 100, name() )
{
// label( "" );
box( FL_NO_BOX );

_horizontal = true;
_pad = true;
control = 0;
control_value =0.0f;

add_port( Port( this, Port::OUTPUT, Port::CONTROL ) );

_mode = GUI;

// mode( GUI );
// mode( CV );
// configure_inputs( 1 );

end();

// clear_visible_focus();
log_create();
}

Controller_Module::~Controller_Module ( )
{
log_destroy();

/* shutdown JACK port, if we have one */
mode( GUI );

// disconnect();
}

void
Controller_Module::handle_chain_name_changed()
{
if ( type() == SPATIALIZATION )
{
if ( Mixer::spatialization_console )
Mixer::spatialization_console->update();
}

// change_osc_path( generate_osc_path() );
}

void
Controller_Module::handle_control_disconnect ( Module::Port *p )
{
if ( type() == SPATIALIZATION )
{
if ( Mixer::spatialization_console )
Mixer::spatialization_console->update();
}
}

void
Controller_Module::disconnect ( void )
{
for ( unsigned int i = 0; i < control_output.size(); ++i )
control_output[i].disconnect();
}


void
Controller_Module::get ( Log_Entry &e ) const
{
Module::get( e );

Port *p = control_output[0].connected_port();

if ( !p )
{
e.add( ":module", "" );
e.add( ":port", "" );
e.add( ":mode", "" );
}
else
{
Module *m = p->module();
e.add( ":module", m );
e.add( ":port", m->control_input_port_index( p ) );
e.add( ":mode", mode() );
}
}

void
Controller_Module::set ( Log_Entry &e )
{
Module::set( e );

int port = -1;
Module *module = NULL;

for ( int i = 0; i < e.size(); ++i )
{
const char *s, *v;

e.get( i, &s, &v );

if ( ! strcmp( s, ":port" ) )
{
port = atoi( v );
}
else if ( ! strcmp( s, ":module" ) )
{
int i;
sscanf( v, "%X", &i );
Module *t = (Module*)Loggable::find( i );

assert( t );

module = t;
}
}

if ( port >= 0 && module )
{
connect_to( &module->control_input[port] );
module->chain()->add_control( this );
label( module->control_input[port].name() );
}

for ( int i = 0; i < e.size(); ++i )
{
const char *s, *v;

e.get( i, &s, &v );

if ( ! strcmp( s, ":mode" ) )
{
mode( (Mode)atoi( v ) );
}
}

}


void
Controller_Module::mode ( Mode m )
{
if( mode() != CV && m == CV )
{
if ( control_output[0].connected() )
{
chain()->client()->lock();

Port *p = control_output[0].connected_port();
char prefix[512];
snprintf( prefix, sizeof(prefix), "CV-%s", p->name() );
add_aux_cv_input( prefix, 0 );

chain()->client()->unlock();
}
}
else if ( mode() == CV && m != CV )
{
chain()->client()->lock();

aux_audio_input.back().jack_port()->shutdown();
delete aux_audio_input.back().jack_port();

aux_audio_input.pop_back();

chain()->client()->unlock();
}

_mode = m ;
}


bool
Controller_Module::connect_spatializer_radius_to ( Module *m )
{
Port *radius_port = NULL;
float radius_value = 0.0f;

for ( unsigned int i = 0; i < m->control_input.size(); ++i )
{
Port *p = &m->control_input[i];

if ( !strcasecmp( "Radius", p->name() ) )
/* 90.0f == p->hints.maximum && */
/* -90.0f == p->hints.minimum ) */
{
radius_port = p;
radius_value = p->control_value();
continue;
}
}

if ( ! radius_port )
return false;

if ( control_output.size() != 3 )
{
control_output.clear();
add_port( Port( this, Port::OUTPUT, Port::CONTROL ) );
add_port( Port( this, Port::OUTPUT, Port::CONTROL ) );
add_port( Port( this, Port::OUTPUT, Port::CONTROL ) );
}

control_output[2].connect_to( radius_port );

maybe_create_panner();
Panner *o = (Panner*)control;

o->point( 0 )->radius( radius_value );
if ( Mixer::spatialization_console )
Mixer::spatialization_console->update();

return true;
}

void
Controller_Module::maybe_create_panner ( void )
{
if ( _type != SPATIALIZATION )
{
clear();

Panner *o = new Panner( 0,0, 92,92 );

o->box(FL_FLAT_BOX);
o->color(FL_GRAY0);
o->selection_color(FL_BACKGROUND_COLOR);
o->labeltype(FL_NORMAL_LABEL);
o->labelfont(0);
o->labelcolor(FL_FOREGROUND_COLOR);
o->align(FL_ALIGN_TOP);
o->when(FL_WHEN_CHANGED);
label( "Spatialization" );

o->align(FL_ALIGN_TOP);
o->labelsize( 10 );
// o->callback( cb_panner_value_handle, new callback_data( this, azimuth_port_number, elevation_port_number ) );

o->callback( cb_spatializer_handle, this );

control = (Fl_Valuator*)o;

if ( _pad )
{
Fl_Labelpad_Group *flg = new Fl_Labelpad_Group( o );
flg->position( x(), y() );
flg->set_visible_focus();
size( flg->w(), flg->h() );
add( flg );
}
else
{
// o->clear_visible_focus();
o->resize( x(), y(), w(), h() );
add( o );
resizable( o );
init_sizes();
}

_type = SPATIALIZATION;
}
}

/** attempt to transform this controller into a spatialization
controller and connect to the given module's spatialization
control inputs. Returns true on success, false if given module
does not accept spatialization inputs. */
bool
Controller_Module::connect_spatializer_to ( Module *m )
{
connect_spatializer_radius_to( m );
/* these are for detecting related parameter groups which can be
better represented by a single control */
Port *azimuth_port = NULL;
float azimuth_value = 0.0f;
Port *elevation_port = NULL;
float elevation_value = 0.0f;

for ( unsigned int i = 0; i < m->control_input.size(); ++i )
{
Port *p = &m->control_input[i];

if ( !strcasecmp( "Azimuth", p->name() ) &&
180.0f == p->hints.maximum &&
-180.0f == p->hints.minimum )
{
azimuth_port = p;
azimuth_value = p->control_value();
continue;
}
else if ( !strcasecmp( "Elevation", p->name() ) &&
90.0f == p->hints.maximum &&
-90.0f == p->hints.minimum )
{
elevation_port = p;
elevation_value = p->control_value();
continue;
}
}
if ( ! ( azimuth_port && elevation_port ) )
return false;

if ( control_output.size() != 3 )
{
control_output.clear();
add_port( Port( this, Port::OUTPUT, Port::CONTROL ) );
add_port( Port( this, Port::OUTPUT, Port::CONTROL ) );
add_port( Port( this, Port::OUTPUT, Port::CONTROL ) );
}

control_output[0].connect_to( azimuth_port );
control_output[1].connect_to( elevation_port );

maybe_create_panner();
Panner *o = (Panner*)control;

o->point( 0 )->azimuth( azimuth_value );
o->point( 0 )->elevation( elevation_value );
if ( Mixer::spatialization_console )
Mixer::spatialization_console->update();

return true;
}

void
Controller_Module::connect_to ( Port *p )
{
control_output[0].connect_to( p );

clear();

Fl_Widget *w;

if ( p->hints.type == Module::Port::Hints::BOOLEAN )
{
Fl_Button *o = new Fl_Button( 0, 0, 40, 40, p->name() );
w = o;
o->type( FL_TOGGLE_BUTTON );
o->value( p->control_value() );
o->selection_color( fl_color_average( FL_GRAY, FL_CYAN, 0.5 ) );

_type = TOGGLE;

/* FIXME: hack */
control = (Fl_Valuator*)o;
}
else if ( p->hints.type == Module::Port::Hints::INTEGER )
{

Fl_Counter *o = new Fl_Counter(0, 0, 58, 24, p->name() );
control = o;
w = o;

o->type(1);
o->step(1);

if ( p->hints.ranged )
{
o->minimum( p->hints.minimum );
o->maximum( p->hints.maximum );
}

_type = SPINNER;

o->value( p->control_value() );
}
// else if ( p->hints.type == Module::Port::Hints::LOGARITHMIC )
else
{
Fl_Value_SliderX *o = new Fl_Value_SliderX(0, 0, 30, 250, p->name() );
control = o;
w = o;

if ( ! _horizontal )
{
o->size( 30, 250 );
o->type(FL_VERT_NICE_SLIDER);
}
else
{
o->size(250,20);
o->type(FL_HOR_NICE_SLIDER);
}

// o->type(4);
o->color( FL_BACKGROUND2_COLOR );
o->selection_color( fl_color_average( FL_GRAY, FL_CYAN, 0.5 ) );
o->minimum(1.5);
o->maximum(0);
o->value(1);
// o->textsize(9);

if ( p->hints.ranged )
{
if ( ! _horizontal )
{
o->minimum( p->hints.maximum );
o->maximum( p->hints.minimum );
}
else
{
o->minimum( p->hints.minimum );
o->maximum( p->hints.maximum );
}
}

o->precision(2);

o->value( p->control_value() );

_type = SLIDER;
}
/* else */
/* { */
/* { Fl_DialX *o = new Fl_DialX( 0, 0, 50, 50, p->name() ); */
/* w = o; */
/* control = o; */

/* if ( p->hints.ranged ) */
/* { */
/* DMESSAGE( "Min: %f, max: %f", p->hints.minimum, p->hints.maximum ); */
/* o->minimum( p->hints.minimum ); */
/* o->maximum( p->hints.maximum ); */
/* } */
/* o->color( fl_darker( FL_GRAY ) ); */
/* o->selection_color( FL_WHITE ); */
/* o->value( p->control_value() ); */
/* } */

/* _type = KNOB; */
/* } */

control_value = p->control_value();

w->clear_visible_focus();
w->align(FL_ALIGN_TOP);
w->labelsize( 10 );
w->callback( cb_handle, this );

if ( _pad )
{
Fl_Labelpad_Group *flg = new Fl_Labelpad_Group( w );
flg->set_visible_focus();
size( flg->w(), flg->h() );
flg->position( x(), y() );
add( flg );
resizable(flg);
// init_sizes();
}
else
{
/* HACK: hide label */
if ( _type == TOGGLE )
{
w->align( FL_ALIGN_INSIDE );
}
else
{
w->labeltype( FL_NO_LABEL );
}
w->resize( x(), y(), this->w(), h() );
add( w );
resizable( w );
init_sizes();
}
}

void
Controller_Module::update ( void )
{
/* we only need this in CV (JACK) mode, because with other forms
* of control the change happens in the GUI thread and we know it */
if ( mode() != CV )
return;

/* ensures that port value change callbacks are run */
if ( control && control_output.size() > 0 && control_output[0].connected() )
control_output[0].connected_port()->control_value( control_value );
}

void
Controller_Module::cb_handle ( Fl_Widget *w, void *v )
{
((Controller_Module*)v)->cb_handle( w );
}

void
Controller_Module::cb_handle ( Fl_Widget *w )
{
if ( type() == TOGGLE )
{
control_value = ((Fl_Button*)w)->value();
}
else
control_value = ((Fl_Valuator*)w)->value();

if ( control_output[0].connected() )
control_output[0].connected_port()->control_value( control_value );
}


void
Controller_Module::cb_spatializer_handle ( Fl_Widget *w, void *v )
{
((Controller_Module*)v)->cb_spatializer_handle( w );
}

void
Controller_Module::cb_spatializer_handle ( Fl_Widget *w )
{
Panner *pan = (Panner*)w;

if ( control_output[0].connected() &&
control_output[1].connected() )
{
control_output[0].connected_port()->control_value( pan->point( 0 )->azimuth() );
control_output[1].connected_port()->control_value( pan->point( 0 )->elevation() );
}

if ( control_output[2].connected() )
{
control_output[2].connected_port()->control_value( pan->point( 0 )->radius() );
}
}

void
Controller_Module::menu_cb ( Fl_Widget *w, void *v )
{
((Controller_Module*)v)->menu_cb( (Fl_Menu_*) w );
}

void
Controller_Module::menu_cb ( const Fl_Menu_ *m )
{
char picked[256];

m->item_pathname( picked, sizeof( picked ) );

Logger log( this );

if ( ! strcmp( picked, "Mode/GUI + OSC" ) )
mode( GUI );
else if ( ! strcmp( picked, "Mode/Control Voltage (JACK)" ) )
mode( CV );
else if ( ! strcmp( picked, "/Remove" ) )
command_remove();
else if ( ! strncmp( picked, "Connect To/", strlen( "Connect To/" ) ) )
{
char *peer_name = index( picked, '/' ) + 1;
*index( peer_name, '/' ) = 0;

// OSC::Signal s = (OSC::Signal*)m->mvalue()->user_data();
const char *path = ((OSC::Signal*)m->mvalue()->user_data())->path();

/* if ( ! _osc_output()->is_connected_to( ((OSC::Signal*)m->mvalue()->user_data()) ) ) */
/* { */
/* _persistent_osc_connections.push_back( strdup(path) ); */

Port *p = control_output[0].connected_port();

if ( learn_by_number )
mixer->osc_endpoint->add_translation( path, p->osc_number_path());
else
mixer->osc_endpoint->add_translation( path, p->osc_path() );
}
else if ( ! strncmp( picked, "Disconnect From/", strlen( "Disconnect From/" ) ) )
{
/* char *peer_name = index( picked, '/' ) + 1; */
/* *index( peer_name, '/' ) = 0; */

// OSC::Signal s = (OSC::Signal*)m->mvalue()->user_data();
const char *path = (const char*)m->mvalue()->user_data();

/* if ( ! _osc_output()->is_connected_to( ((OSC::Signal*)m->mvalue()->user_data()) ) ) */
/* { */
/* _persistent_osc_connections.push_back( strdup(path) ); */

// Port *p = control_output[0].connected_port();

mixer->osc_endpoint->del_translation( path );

/* if ( learn_by_number ) */
/* { */
/* char *our_path = p->osc_number_path(); */
/* mixer->osc_endpoint->add_translation( path, our_path ); */

/* free(our_path); */
/* } */
/* else */
/* mixer->osc_endpoint->add_translation( path, p->osc_path() ); */
}



/* } */
/* else */
/* { */
/* /\* timeline->osc->disconnect_signal( _osc_output(), path ); *\/ */
/* /\* for ( std::list<char*>::iterator i = _persistent_osc_connections.begin(); *\/ */
/* /\* i != _persistent_osc_connections.end(); *\/ */
/* /\* ++i ) *\/ */
/* /\* { *\/ */
/* /\* if ( !strcmp( *i, path ) ) *\/ */
/* /\* { *\/ */
/* /\* free( *i ); *\/ */
/* /\* i = _persistent_osc_connections.erase( i ); *\/ */
/* /\* break; *\/ */
/* /\* } *\/ */
/* /\* } *\/ */
/* //free( path ); */
/* } */

}
static Fl_Menu_Button *peer_menu;
static const char *peer_prefix;

void
Controller_Module::peer_callback( OSC::Signal *sig, OSC::Signal::State state, void *v )
{
char *s;

DMESSAGE( "Paramter limits: %f %f", sig->parameter_limits().min, sig->parameter_limits().max );

/* only show outputs */
if ( sig->direction() != OSC::Signal::Output )
return;


/* only list CV signals for now */
if ( ! ( sig->parameter_limits().min == 0.0 &&
sig->parameter_limits().max == 1.0 ) )
return;

if ( ! v )
{
/* if( state == OSC::Signal::Created ) */
/* timeline->connect_osc(); */
/* else */
/* timeline->update_osc_connection_state(); */
}
else
{
/* building menu */
// const char *name = sig->peer_name();
assert( sig->path() );

char *path = strdup( sig->path() );

unescape_url( path );

asprintf( &s, "%s/%s", peer_prefix, path );

peer_menu->add( s, 0, NULL, (void*)( sig ), 0 );

/* FL_MENU_TOGGLE | */
/* ( ((Controller_Module*)v)->_osc_output()->is_connected_to( sig ) ? FL_MENU_VALUE : 0 ) ); */
free( path );

free( s );
}
}

void
Controller_Module::add_osc_peers_to_menu ( Fl_Menu_Button *m, const char *prefix )
{
mixer->osc_endpoint->peer_signal_notification_callback( &Controller_Module::peer_callback, NULL );

peer_menu = m;
peer_prefix = prefix;

mixer->osc_endpoint->list_peer_signals( this );
}

void
Controller_Module::add_osc_connections_to_menu ( Fl_Menu_Button *m, const char *prefix )
{
/* peer_menu = m; */
const char *peer_prefix = prefix;

// mixer->osc_endpoint->list_peer_signals( this );

Port *p = control_output[0].connected_port();

const char *number_path = p->osc_number_path();
const char *name_path = p->osc_path();

const char *paths[] = { number_path,name_path,NULL };

for ( const char **cpath = paths; *cpath; cpath++ )
{
const char ** conn = mixer->osc_endpoint->get_connections( *cpath );

if ( conn )
{
for ( const char **s = conn; *s; s++ )
{
/* building menu */
char *path = strdup( *s );
unescape_url( path );

char *ns;
asprintf( &ns, "%s/%s", peer_prefix, path );
peer_menu->add( ns, 0, NULL, const_cast<char*>(*s), 0 );
free( path );
// free(*s);
}

free( conn );
}
}
}

/** build the context menu for this control */
Fl_Menu_Button &
Controller_Module::menu ( void )
{
static Fl_Menu_Button m( 0, 0, 0, 0, "Controller" );

m.clear();

if ( mode() == GUI )
{
add_osc_peers_to_menu( &m, "Connect To" );
add_osc_connections_to_menu( &m, "Disconnect From" );
}

m.add( "Mode/GUI + OSC", 0, 0, 0, FL_MENU_RADIO | ( mode() == GUI ? FL_MENU_VALUE : 0 ));
m.add( "Mode/Control Voltage (JACK)", 0, 0, 0, FL_MENU_RADIO | ( mode() == CV ? FL_MENU_VALUE : 0 ));
m.add( "Remove", 0, 0, 0, is_default() ? FL_MENU_INACTIVE : 0 );

// menu_set_callback( m.items(), &Controller_Module::menu_cb, (void*)this );
m.callback( &Controller_Module::menu_cb, (void*)this );
// m.copy( items, (void*)this );

return m;
}

void
Controller_Module::draw ( void )
{
Fl_Group::draw();
draw_box(x(),y(),w(),h());

if ( learn_mode() )
{
fl_rectf( x(),y(),w(),h(), fl_color_add_alpha( FL_MAGENTA, 50 ) );
}
}

int
Controller_Module::handle ( int m )
{

switch ( m )
{
case FL_PUSH:
{
if ( learn_mode() )
{
tooltip( "Now learning control. Move the desired control on your controller" );

//connect_to( &module->control_input[port] );
Port *p = control_output[0].connected_port();
if ( p )
{
const char * path = learn_by_number ? p->osc_number_path() : p->osc_path();

DMESSAGE( "Will learn %s", path );

mixer->osc_endpoint->learn( path );
}

return 1;
}

if ( Fl::event_button3() )
{
/* context menu */
/* if ( type() != SPATIALIZATION ) */
menu_popup( &menu() );

return 1;
}
else
return Fl_Group::handle( m );
}
}

return Fl_Group::handle( m );
}

void
Controller_Module::handle_control_changed ( Port *p )
{
/* ignore changes initiated while mouse is over widget */

if ( type() == SPATIALIZATION )
{
if ( Mixer::spatialization_console )
Mixer::spatialization_console->handle_control_changed( this );
}

if ( contains( Fl::pushed() ) )
return;

if ( p )
control_value = p->control_value();

if ( control->value() == control_value )
return;

/* if ( control->value() != control_value ) */
/* { */
/* redraw(); */
/* } */

if ( type() == SPATIALIZATION )
{
Panner *pan = (Panner*)control;

pan->point( 0 )->azimuth( control_output[0].control_value() );
pan->point( 0 )->elevation( control_output[1].control_value() );

if ( control_output[2].connected() )
{
// Port *pp = control_output[2].connected_port();
float v = control_output[2].control_value();
// float s = pp->hints.maximum - pp->hints.minimum;

pan->point( 0 )->radius( v );
}
if ( visible_r() )
pan->redraw();
}
else
{
if ( type() == TOGGLE )
((Fl_Button*)control)->value(control_value);
else
control->value(control_value);
}
}

void
Controller_Module::command_remove ( void )
{
if ( is_default() )
fl_alert( "Default modules may not be deleted." );
else
{
chain()->remove( this );
Fl::delete_widget( this );
}
}

/**********/
/* Client */
/**********/

void
Controller_Module::process ( nframes_t nframes )
{
THREAD_ASSERT( RT );

if ( type() == SPATIALIZATION )
{
return;
}

if ( control_output[0].connected() )
{
float f = control_value;

if ( mode() == CV )
{
f = *((float*)aux_audio_input[0].jack_port()->buffer( nframes ));

const Port *p = control_output[0].connected_port();

if (p->hints.ranged )
{
// scale value to range.
// we assume that CV values are between 0 and 1

float scale = p->hints.maximum - p->hints.minimum;
float offset = p->hints.minimum;

f = ( f * scale ) + offset;
}
}
// else
// f = *((float*)control_output[0].buffer());

*((float*)control_output[0].buffer()) = f;

control_value = f;
}
}

+ 0
- 127
mixer/src/Controller_Module.H View File

@@ -1,127 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2009 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

#pragma once

#include "Module.H"
#include <vector>
#include "JACK/Port.H"
#include "OSC/Endpoint.H"

class Fl_Menu_Button;
class Fl_Menu_;

class Fl_Valuator;

class Controller_Module : public Module
{

bool _pad;
bool _horizontal;

volatile float control_value;

Fl_Menu_Button & menu ( void );
static void menu_cb ( Fl_Widget *w, void *v );
void menu_cb ( const Fl_Menu_ *m );


static void peer_callback( OSC::Signal *sig, OSC::Signal::State state, void *v );
void peer_callback( OSC::Signal *sig, OSC::Signal::State state );
void add_osc_peers_to_menu ( Fl_Menu_Button *m, const char *prefix );
void add_osc_connections_to_menu ( Fl_Menu_Button *m, const char *prefix );

public:

static bool _learn_mode;

static bool learn_by_number;
static bool learn_mode ( void ) { return _learn_mode; }
static void learn_mode ( bool b ) { _learn_mode = b; }

enum Mode { GUI, CV, OSC, MIDI };

enum Type { KNOB,
SLIDER,
SPINNER,
TOGGLE,
SPATIALIZATION };

Mode mode ( void ) const { return _mode; }
void mode ( Mode v );

void horizontal ( bool v ) { _horizontal = v; }
Type type ( void ) const { return _type; }

Controller_Module ( bool is_default = false );
virtual ~Controller_Module ( );

const char *name ( void ) const { return "Controller"; }

int can_support_inputs ( int ) { return 0; }
bool configure_inputs ( int ) { return false; }

void pad ( bool v ) { _pad = v; }

static void cb_handle ( Fl_Widget *w, void *v );
void cb_handle ( Fl_Widget *w );
static void cb_spatializer_handle ( Fl_Widget *w, void *v );
void cb_spatializer_handle ( Fl_Widget *w );

void connect_to ( Port *p );
bool connect_spatializer_to ( Module *m );
bool connect_spatializer_radius_to ( Module *m );
void disconnect ( void );

void handle_control_changed ( Port *p );
void handle_chain_name_changed ( void );
void handle_control_disconnect ( Port *p );

virtual void command_remove ( void );

LOG_CREATE_FUNC( Controller_Module );

virtual void update ( void );

void process ( nframes_t nframes );

void draw ( void );

int handle ( int m );

void take_focus ( void );
// void set_control_value ( float f ) { control_value = f; }

protected:

void get ( Log_Entry &e ) const;
void set ( Log_Entry &e );

private:

void maybe_create_panner ( void );
char *generate_osc_path ( void );
void change_osc_path ( char *path );
Mode _mode;
Type _type;

Fl_Valuator *control;

};

+ 0
- 256
mixer/src/DPM.C View File

@@ -1,256 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2008 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

/* a Digital Peak Meter, either horizontal or vertical. Color is a
gradient from min_color() to max_color(). box() is used to draw the
individual 'lights'. division() controls how many 'lights' there
are. value() is volume in dBFS */

#include "DPM.H"

/* we cache the gradient for (probably excessive) speed */
float DPM::_dim;
Fl_Color DPM::_gradient[128] = { (Fl_Color)0 };
Fl_Color DPM::_dim_gradient[128];

#include <FL/Fl.H>
#include <FL/fl_draw.H>
#include <FL/Fl_Group.H>

#include <math.h>
#include <stdio.h>

DPM::DPM ( int X, int Y, int W, int H, const char *L ) :
Meter( X, Y, W, H, L )
{
tooltip( peak_string );

_last_drawn_hi_segment = 0;

pixels_per_segment( 4 );

type( FL_VERTICAL );

// resize( X, Y, W, H );

dim( 0.85f );

/* initialize gradients */
if ( DPM::_gradient[ 0 ] == 0 )
{
int breaks[] = {0,60,70,80,90,127};

Fl_Color cols[] = {
fl_rgb_color( 45,58,64),
fl_rgb_color( 84,181,195 ),
fl_rgb_color( 122,200,211 ),
fl_rgb_color( 178,213,212 ),
fl_rgb_color( 209,213,179 ),
fl_rgb_color( 250, 40, 30 )
};

DPM::blend( 6, breaks, cols );
}

box( FL_FLAT_BOX );
color( FL_BACKGROUND_COLOR );

resize( X,Y,W,H);
}

/* which marks to draw beside meter */
const int marks [] = { -70, -50, -40, -30, -20, -10, -3, 0, 4 };

void
DPM::draw_label ( void )
{

/* dirty hack */
if ( parent()->child( 0 ) == this )
{
fl_font( FL_TIMES, 8 );
fl_color( FL_WHITE );
/* draw marks */
char pat[5];
if ( type() == FL_HORIZONTAL )
{
for ( int i = sizeof( marks ) / sizeof( marks[0] ); i-- ; )
{
sprintf( pat, "%d", marks[ i ] );

int v = w() * deflection( (float)marks[ i ] );

fl_draw( pat, x() + v, (y() + h() + 8), 19, 8, (Fl_Align) (FL_ALIGN_RIGHT | FL_ALIGN_TOP) );
}

}
else
{
for ( int i = sizeof( marks ) / sizeof( marks[0] ); i-- ; )
{
sprintf( pat, "%d", marks[ i ] );

int v = h() * deflection( (float)marks[ i ] );

fl_draw( pat, x() - 20, (y() + h() - 4) - v, 19, 8, (Fl_Align) (FL_ALIGN_RIGHT | FL_ALIGN_TOP) );
}
}
}
}

void
DPM::resize ( int X, int Y, int W, int H )
{
int old_segments = _segments;
Fl_Widget::resize( X, Y, W, H );
int tx,ty,tw,th;
bbox(tx,ty,tw,th);

if ( type() == FL_HORIZONTAL )
_segments = floor( tw / (double)_pixels_per_segment );
else
_segments = floor( th / (double)_pixels_per_segment );
if ( old_segments != _segments )
_last_drawn_hi_segment = 0;
}

void DPM::bbox ( int &X, int &Y, int &W, int &H )
{
X = x() + 2;
Y = y() + 2;
W = w() - 4;
H = h() - 4;
}

void
DPM::draw ( void )
{
snprintf( peak_string, sizeof( peak_string ), "%.1f", peak() );
tooltip( peak_string );

int X,Y,W,H;
bbox(X,Y,W,H);

int v = pos( value() );
int pv = pos( peak() );
int clipv = pos( 0 );

int bh = H / _segments;
/* int bh = _pixels_per_segment; */
/* int bw = _pixels_per_segment; */
int bw = W / _segments;

if ( damage() & FL_DAMAGE_ALL )
{
draw_label();

draw_box( FL_FLAT_BOX, x(), y(), w(), h(), FL_DARK1 );
}

fl_push_clip( X, Y, W, H );

const int active = active_r();

int hi, lo;
/* only draw as many segments as necessary */
if ( damage() == FL_DAMAGE_USER1 )
{
if ( v > _last_drawn_hi_segment )
{
hi = v;
lo = _last_drawn_hi_segment;
}
else
{
hi = _last_drawn_hi_segment;
lo = v;
}
}
else
{
lo = 0;
hi = _segments;
}

_last_drawn_hi_segment = v;

for ( int p = lo; p <= hi; p++ )
{
Fl_Color c;

if ( p <= v )
{
if ( p == clipv )
c = fl_color_average( FL_YELLOW, div_color( p ), 0.40 );
else
c = div_color( p );
}
else if ( p == pv )
c = div_color( p );
else
c = dim_div_color( p );
if ( ! active )
c = fl_inactive( c );

int yy = 0;
int xx = 0;
if ( type() == FL_HORIZONTAL )
{
xx = X + p * bw;
fl_rectf( X + (p * bw), Y, bw, H, c );
}
else
{
yy = Y + H - ((p+1) * bh);
fl_rectf( X, yy, W, bh, c );
}
if ( _pixels_per_segment >= 3 )
{
fl_color( FL_DARK1 );

if ( type() == FL_HORIZONTAL )
{
fl_line( xx, Y, xx, Y + H - 1 );
}
else
{
fl_line( X, yy, X + W - 1, yy );
}
}

/* } */
/* else */
/* { */
/* if ( type() == FL_HORIZONTAL ) */
/* fl_draw_box( box(), X + (p * bw), Y, bw, H, c ); */
/* else */
/* fl_draw_box( box(), X, Y + H - ((p + 1) * bh), W, bh, c ); */
/* } */
}

fl_pop_clip();
}

+ 0
- 107
mixer/src/DPM.H View File

@@ -1,107 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2008 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

#pragma once

#include <FL/Fl_Valuator.H> // for FL_HORIZONTAL and FL_VERTICAL

#include "Meter.H"

class DPM : public Meter
{
char peak_string[10];

int _segments;
int _pixels_per_segment;
int _last_drawn_hi_segment;

float _value;

int pos ( float v )
{
float pv = deflection( v ) * ( _segments - 1 );
return pv;
}

static float _dim;
static Fl_Color _gradient[];
static Fl_Color _dim_gradient[];

Fl_Color
div_color ( int i )
{
return _gradient[ i * 127 / _segments ];
}

Fl_Color
dim_div_color ( int i )
{
return _dim_gradient[ i * 127 / _segments ];
}


protected:

virtual void draw_label ( void );
virtual void draw ( void );
virtual void resize ( int, int, int, int );

void bbox ( int &X, int &Y, int &W, int &H );

public:

DPM ( int X, int Y, int W, int H, const char *L = 0 );

void value ( float v )
{
if ( _value != v )
{
if ( pos( v ) != pos( _value ) )
Meter::value( v );
}

_value = v;
}

float value ( void ) const
{
return _value;
}

void pixels_per_segment ( int v ) { _pixels_per_segment = v; }

float dim ( void ) const { return _dim; }
void dim ( float v ) { _dim = v; if ( visible_r() ) redraw(); }

static
void
blend ( int nbreaks, int* b, Fl_Color *c )
{
for ( int i = 0; i < nbreaks - 1; i++ )
{
int k = 0;
for ( int j = b[i]; j <= b[i+1]; j++, k++ )
_gradient[ j ] = fl_color_average( c[i+1], c[i], ( k ) / (float)(b[i+1] - b[i] ));
}

for ( int i = 0; i < 128; i++ )
_dim_gradient[ i ] = fl_color_average( FL_BLACK, _gradient[ i ], _dim );
}
};

+ 0
- 142
mixer/src/Gain_Module.C View File

@@ -1,142 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2009 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

#include <math.h>
#include <dsp.h>

#include "Gain_Module.H"


Gain_Module::Gain_Module ( )
: Module ( 50, 24, name() )
{
add_port( Port( this, Port::INPUT, Port::AUDIO ) );
add_port( Port( this, Port::OUTPUT, Port::AUDIO ) );

{
Port p( this, Port::INPUT, Port::CONTROL, "Gain (dB)" );
p.hints.type = Port::Hints::LINEAR;
p.hints.ranged = true;
p.hints.minimum = -70.0f;
p.hints.maximum = 6.0f;
p.hints.default_value = 0.0f;

p.connect_to( new float );
p.control_value( p.hints.default_value );

add_port( p );
}

{
Port p( this, Port::INPUT, Port::CONTROL, "Mute" );
p.hints.type = Port::Hints::BOOLEAN;
p.hints.ranged = true;
p.hints.minimum = 0.0f;
p.hints.maximum = 1.0f;
p.hints.default_value = 0.0f;

p.connect_to( new float );
p.control_value( p.hints.default_value );

add_port( p );
}

end();

log_create();

smoothing.sample_rate( sample_rate() );
}

Gain_Module::~Gain_Module ( )
{
delete (float*)control_input[0].buffer();
delete (float*)control_input[1].buffer();
log_destroy();
}


bool
Gain_Module::configure_inputs ( int n )
{
audio_input.clear();
audio_output.clear();
// control_input.clear();

for ( int i = 0; i < n; ++i )
{
add_port( Port( this, Port::INPUT, Port::AUDIO ) );
add_port( Port( this, Port::OUTPUT, Port::AUDIO ) );
}

return true;
}

void
Gain_Module::handle_sample_rate_change ( nframes_t n )
{
smoothing.sample_rate( n );
}


/**********/
/* Engine */
/**********/

void
Gain_Module::process ( nframes_t nframes )
{

if ( unlikely( bypass() ) )
{
/* nothing to do */
}
else
{
const float gt = DB_CO( control_input[1].control_value() ? -90.f : control_input[0].control_value() );

sample_t gainbuf[nframes];
bool use_gainbuf = smoothing.apply( gainbuf, nframes, gt );
if ( unlikely( use_gainbuf ) )
{
for ( int i = audio_input.size(); i--; )
{
if ( audio_input[i].connected() && audio_output[i].connected() )
{
sample_t *out = (sample_t*)audio_input[i].buffer();

buffer_apply_gain_buffer( out, gainbuf, nframes );
}
}
}
else
for ( int i = audio_input.size(); i--; )
{
if ( audio_input[i].connected() && audio_output[i].connected() )
{
buffer_apply_gain( (sample_t*)audio_input[i].buffer(), nframes, gt );
}
}
}
}

+ 0
- 50
mixer/src/Gain_Module.H View File

@@ -1,50 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2009 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

#pragma once

#include "Module.H"
#include "dsp.h"

class Gain_Module : public Module
{
Value_Smoothing_Filter smoothing;

public:

Gain_Module ( );
Gain_Module ( const Gain_Module & rhs );
virtual ~Gain_Module ( );

const char *name ( void ) const { return "Gain"; }

int can_support_inputs ( int n ) { return n; }
bool configure_inputs ( int n );

LOG_CREATE_FUNC( Gain_Module );

MODULE_CLONE_FUNC( Gain_Module );

virtual void handle_sample_rate_change ( nframes_t n );

protected:

virtual void process ( nframes_t nframes );

};

+ 0
- 303
mixer/src/Group.C View File

@@ -1,303 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2013 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

#include <Mixer.H>
#include "Group.H"
#include "Chain.H"
#include "Mixer_Strip.H"
#include "Module.H"

#include <unistd.h>
extern char *instance_name;

Group::Group ( )
{
_single =false;
_name = NULL;
_dsp_load = _load_coef = 0;
}

Group::Group ( const char *name, bool single ) : Loggable ( !single )
{
_single = single;
_name = strdup(name);
_dsp_load = _load_coef = 0;

// this->name( name );
/* FIXME: handle client creation error */
/* if ( ! jack_name ) */
/* { */
/* _engine = NULL; */
/* // fl_alert( "Could not create JACK client. Perhaps the sound device already in use. In any event, now I'll die." ); */
/* exit( 1 ); */
/* // return false; */
/* } */
}

Group::~Group ( )
{
DMESSAGE( "Destroying group" );

if ( _name )
free( _name );

deactivate();
}

void
Group::get ( Log_Entry &e ) const
{
e.add( ":name", name() );
}

void
Group::set ( Log_Entry &e )
{
for ( int i = 0; i < e.size(); ++i )
{
const char *s, *v;

e.get( i, &s, &v );

if ( ! ( strcmp( s, ":name" ) ) )
{
bool add = false;
if (!_name )
add = true;

_name = strdup(v);

if ( add )
mixer->add_group(this);
}
}
}


/*************/
/* Callbacks */
/*************/

void
Group::latency ( jack_latency_callback_mode_t mode )
{
for ( std::list<Mixer_Strip*>::iterator i = strips.begin();
i != strips.end();
i++ )
{
if ( (*i)->chain() )
(*i)->chain()->set_latency(mode == JackCaptureLatency ? JACK::Port::Input : JACK::Port::Output );
}
}

/* THREAD: RT */
/** This is the jack xrun callback */
int
Group::xrun ( void )
{
return 0;
}

/* THREAD: RT */
void
Group::freewheel ( bool starting )
{
if ( starting )
DMESSAGE( "entering freewheeling mode" );
else
DMESSAGE( "leaving freewheeling mode" );
}

/* THREAD: RT (non-RT) */
int
Group::buffer_size ( nframes_t nframes )
{
recal_load_coef();

/* JACK calls this in the RT thread, even though it's a
* non-realtime operation. This mucks up our ability to do
* THREAD_ASSERT, so just lie and say this is the UI thread... */

_thread.set( "UI" );

for ( std::list<Mixer_Strip*>::iterator i = strips.begin();
i != strips.end();
i++ )
{
if ( (*i)->chain() )
(*i)->chain()->buffer_size(nframes);
}
_thread.set( "RT" );

return 0;
}

/* THREAD: ?? */
void
Group::port_connect( jack_port_id_t a, jack_port_id_t b, int connect )
{
for ( std::list<Mixer_Strip*>::iterator i = strips.begin();
i != strips.end();
i++ )
{
if ( (*i)->chain() )
(*i)->chain()->port_connect( a, b, connect);
}
}


/* THREAD: RT */
int
Group::process ( nframes_t nframes )
{
jack_time_t then = jack_get_time();

/* FIXME: wrong place for this */
_thread.set( "RT" );

if ( ! trylock() )
{
/* the data structures we need to access here (tracks and
* their ports, but not track contents) may be in an
* inconsistent state at the moment. Just punt and drop this
* buffer. */
++_buffers_dropped;
return 0;
}


/* since feedback loops are forbidden and outputs are
* summed, we don't care what order these are processed
* in */
for ( std::list<Mixer_Strip*>::iterator i = strips.begin();
i != strips.end();
i++ )
{
if ( (*i)->chain() )
(*i)->chain()->process(nframes);
}

unlock();

_dsp_load = (float)(jack_get_time() - then ) * _load_coef;

return 0;
}

void
Group::recal_load_coef ( void )
{
_load_coef = 1.0f / ( nframes() / (float)sample_rate() * 1000000.0 );
}
int
Group::sample_rate_changed ( nframes_t srate )
{
recal_load_coef();

for ( std::list<Mixer_Strip*>::iterator i = strips.begin();
i != strips.end();
i++ )
{
if ( (*i)->chain() )
(*i)->chain()->sample_rate_change(srate);
}
return 0;
}

/* TRHEAD: RT */
void
Group::thread_init ( void )
{
_thread.set( "RT" );
}

/* THREAD: RT */
void
Group::shutdown ( void )
{
}

/*******************/
/* Group interface */
/*******************/

void
Group::name ( const char *n )
{
if ( _name )
free( _name );

char ename[512];

_name = strdup( n );

if ( _single )
snprintf( ename, sizeof(ename), "%s/%s", instance_name, n );
else
snprintf( ename, sizeof(ename), "%s (%s)", instance_name, n );

if ( !active() )
{
Client::init( ename );
Module::set_sample_rate( sample_rate() );
}
else
{
Client::name( ename );
}
}

void
Group::add ( Mixer_Strip *o )
{
lock();
if ( ! active() )
{
/* to call init */
char *n = strdup(name());
name(n);
free(n);
}
if ( o->chain() )
o->chain()->thaw_ports();

strips.push_back(o);
unlock();
}

void
Group::remove ( Mixer_Strip *o )
{
lock();
strips.remove(o);
if ( o->chain() )
o->chain()->freeze_ports();
if ( strips.size() == 0 && active() )
{
Client::close();
}
unlock();
}


+ 0
- 102
mixer/src/Group.H View File

@@ -1,102 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2013 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

#pragma once

#include <list>
class Mixer_Strip;

#include "Mutex.H"

class Port;

#include "JACK/Client.H"

#include "Thread.H"
#include "Loggable.H"

class Group : public Loggable, public JACK::Client, public Mutex
{
bool _single;
char *_name;

Thread _thread; /* only used for thread checking */

int _buffers_dropped; /* buffers dropped because of locking */
/* int _buffers_dropped; /\* buffers dropped because of locking *\/ */

volatile float _dsp_load;
float _load_coef;

int sample_rate_changed ( nframes_t srate );
void shutdown ( void );
int process ( nframes_t nframes );
int xrun ( void );
void freewheel ( bool yes );
int buffer_size ( nframes_t nframes );
void thread_init ( void );
void port_connect ( jack_port_id_t a, jack_port_id_t b, int connect );
virtual void latency ( jack_latency_callback_mode_t mode );

/* not allowed */
Group ( const Group &rhs );
Group & operator = ( const Group &rhs );

void request_locate ( nframes_t frame );

void recal_load_coef ( void );

protected:

virtual void get ( Log_Entry &e ) const;
virtual void set ( Log_Entry &e );

private:

friend class Port;
friend class Transport;

public:

LOG_CREATE_FUNC( Group );

float dsp_load ( void ) const { return _dsp_load; }
int nstrips ( void ) const { return strips.size(); }
int dropped ( void ) const { return _buffers_dropped; }

Group ( );
Group ( const char * name, bool single );
virtual ~Group ( );

bool single ( void ) const { return _single; }

const char * name ( void ) const { return _name; }
void name ( const char *n );

std::list<Mixer_Strip*> strips;

/* static void process ( nframes_t nframes, void *v ); */
/* void process ( nframes_t nframes ); */

void add (Mixer_Strip*);
void remove (Mixer_Strip*);

/* Engine *engine ( void ) { return _engine; } */
};


+ 0
- 730
mixer/src/JACK_Module.C View File

@@ -1,730 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2009 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

#include "const.h"

#include <string.h>

#include <FL/fl_ask.H>
#include <FL/Fl_Box.H>
#include <FL/Fl_Pack.H>
#include <FL/Fl_Scalepack.H>

#include "dsp.h"

#include "Chain.H"

#include "JACK_Module.H"
#include <FL/fl_draw.H>

#include <FL/Fl.H>
#include <FL/Fl_Browser.H>

#include <FL/Fl_PNG_Image.H>
#include <FL/img_io_input_connector_10x10_png.h>
#include <FL/img_io_output_connector_10x10_png.h>

static Fl_PNG_Image *input_connector_image = NULL;
static Fl_PNG_Image *output_connector_image = NULL;

extern char *instance_name;

#include "Mixer.H"
#include "Group.H"

static JACK_Module *receptive_to_drop = NULL;

const int MAX_PORTS = 16;

JACK_Module::JACK_Module ( bool log )
: Module ( 25, 25, name() )
{
_prefix = 0;

_connection_handle_outputs[0][0] = 0;
_connection_handle_outputs[0][1] = 0;
_connection_handle_outputs[1][0] = 0;
_connection_handle_outputs[1][1] = 0;


align( FL_ALIGN_TOP | FL_ALIGN_INSIDE );

if ( log )
{
/* FIXME: how do Controls find out that a connected value has changed? How does this work in ladspa? */
{
Port p( this, Port::INPUT, Port::CONTROL, "Inputs" );
p.hints.type = Port::Hints::INTEGER;
p.hints.minimum = 1;
p.hints.maximum = MAX_PORTS;
p.hints.ranged = true;
p.hints.visible = false;

p.connect_to( new float );
p.control_value_no_callback( 0 );

add_port( p );
}

{
Port p( this, Port::INPUT, Port::CONTROL, "Outputs" );
p.hints.type = Port::Hints::INTEGER;
p.hints.minimum = 1;
p.hints.maximum = MAX_PORTS;
p.hints.ranged = true;
p.hints.visible = false;

p.connect_to( new float );
p.control_value_no_callback( 0 );

add_port( p );
}

color( FL_DARK1 );

log_create();
}


{ Fl_Scalepack *o = new Fl_Scalepack( x() + Fl::box_dx(box()),
y() + Fl::box_dy(box()),
w() - Fl::box_dw(box()),
h() - Fl::box_dh(box()) );
o->type( Fl_Pack::VERTICAL );
o->spacing(0);


{ Fl_Scalepack *o = new Fl_Scalepack( x() + Fl::box_dx(box()),
y() + Fl::box_dy(box()),
w(),
24 - Fl::box_dh(box()) );
o->type( Fl_Pack::HORIZONTAL );
o->spacing( 0 );


{ Fl_Box *o = input_connection_handle = new Fl_Box( x(), y(), 18, 18 );
o->tooltip( "Drag and drop to make and break JACK connections.");
o->hide();
o->image( input_connector_image ? input_connector_image : input_connector_image = new Fl_PNG_Image( "input_connector", img_io_input_connector_10x10_png, img_io_input_connector_10x10_png_len ) );
}

{ Fl_Box *o = new Fl_Box( x() + 10, y(), w() - 20, h() );
Fl_Group::current()->resizable(o);
}


{ Fl_Button *o = dec_button = new Fl_Button( 0, 0, 12, h(), "-" );
o->callback( cb_button, this );
o->labelsize(10);
o->labelfont( FL_HELVETICA_BOLD );
o->hide();
}
{ Fl_Button *o = inc_button = new Fl_Button( 0,0, 12, h(), "+" );
o->labelsize(10);
o->labelfont( FL_HELVETICA_BOLD );
o->callback( cb_button, this );
o->hide();
}

{ Fl_Box *o = output_connection_handle = new Fl_Box( x(), y(), 12, 12 );
o->tooltip( "Drag and drop to make and break JACK connections.");
o->image( output_connector_image ? output_connector_image : output_connector_image = new Fl_PNG_Image( "output_connector", img_io_output_connector_10x10_png, img_io_output_connector_10x10_png_len ) );
o->hide();
}

{ Fl_Box *o = output_connection2_handle = new Fl_Box( x(), y(), 12, 12 );
o->tooltip( "Drag and drop to make and break JACK connections.");
o->image( output_connector_image ? output_connector_image : output_connector_image = new Fl_PNG_Image( "output_connector", img_io_output_connector_10x10_png, img_io_output_connector_10x10_png_len ) );
o->hide();
}

o->end();
}

{
Fl_Browser *o = connection_display = new Fl_Browser( 0, 0, w(), h() );
o->has_scrollbar(Fl_Browser_::VERTICAL);
o->textsize( 10 );
o->textcolor( FL_LIGHT3 );
o->textfont( FL_COURIER );
o->box( FL_FLAT_BOX );
o->color( FL_DARK1 );
// o->color( fl_color_add_alpha( fl_rgb_color( 10, 10, 10 ), 100 ));
Fl_Group::current()->resizable(o);
}
o->end();
resizable(o);
}
end();
}

JACK_Module::~JACK_Module ( )
{
log_destroy();
configure_inputs( 0 );
configure_outputs( 0 );
if ( _prefix )
free( _prefix );
}


void
JACK_Module::draw ( void )
{
Module::draw();
if ( this == receptive_to_drop )
{
Fl_Widget *o = input_connection_handle;
fl_draw_box( FL_OVAL_BOX, o->x(), o->y(), o->w(), o->h(), fl_color_add_alpha( FL_GREEN, 127 ) );
}
}

static std::list<std::string>
get_connections_for_ports ( std::vector<Module::Port> ports )
{
std::list<std::string> names;

for ( unsigned int i = 0; i < ports.size(); ++i )
{
const char **connections = ports[i].jack_port()->connections();

if ( ! connections )
return names;

bool is_output = ports[i].jack_port()->direction() == JACK::Port::Output;

for ( const char **c = connections; *c; c++ )
{
char *client_id = 0;
char *strip_name = 0;
// char *client_name = 0;
if ( 2 == sscanf( *c, "Non-Mixer.%m[^:/]/%m[^:]:", &client_id, &strip_name ) )
{
free( client_id );
char *s = NULL;
asprintf( &s, "%s%s", is_output ? "@r" : "", strip_name );
free( strip_name );
strip_name = s;
}
else if ( 2 == sscanf( *c, "Non-Mixer.%m[^:(] (%m[^:)]):", &client_id, &strip_name ) )
{
free( client_id );
char *s = NULL;
asprintf( &s, "%s%s", is_output ? "@r" : "", strip_name );
free( strip_name );
strip_name = s;
}
else if ( 2 == sscanf( *c, "Non-Timeline.%m[^:/]:%m[^/]/", &client_id, &strip_name ) )
{
free( client_id );
char *s = NULL;
asprintf( &s, "@C2%s%s", is_output ? "@r" : "", strip_name );
free( strip_name );
strip_name = s;
}
else if ( 2 == sscanf( *c, "Non-DAW.%m[^:/]:%m[^/]/", &client_id, &strip_name ) )
{
free( client_id );
char *s = NULL;
asprintf( &s, "@C2%s%s", is_output ? "@r" : "", strip_name );
free( strip_name );
strip_name = s;
}
else if ( 1 == sscanf( *c, "%m[^:]:", &strip_name ) )
{
char *s = NULL;
asprintf( &s, "@C3%s%s", is_output ? "@r" : "", strip_name );
free( strip_name );
strip_name = s;
}
else
{
continue;
}
for ( std::list<std::string>::const_iterator j = names.begin();
j != names.end();
j++ )
{
if ( !strcmp( j->c_str(), strip_name ) )
{
goto skip;
}
}
names.push_back( strip_name );

skip:
free( strip_name );
;
}
}

names.sort();
return names;
}

void
JACK_Module::update_connection_status ( void )
{
/* do nothing when running in noui mode, as ->add will call some
* font measurement stuff which attempts to open the X display. */
if ( ! fl_display )
{
return;
}

std::list<std::string> output_names = get_connections_for_ports( aux_audio_output );
std::list<std::string> input_names = get_connections_for_ports( aux_audio_input );

connection_display->clear();

int n = 0;
for ( std::list<std::string>::const_iterator j = input_names.begin();
j != input_names.end();
j++ )
{
connection_display->add( j->c_str() );
n++;
}
for ( std::list<std::string>::const_iterator j = output_names.begin();
j != output_names.end();
j++ )
{
connection_display->add( j->c_str() );
n++;
}
/* limit number of lines displayed */
if ( n > 15 )
n = 15;

if ( n > 0 )
size( w(), 26 + ( n * ( connection_display->incr_height() ) ) );
else
size( w(), 24 );
parent()->parent()->redraw();
}

void
JACK_Module::cb_button ( Fl_Widget *w, void *v )
{
((JACK_Module*)v)->cb_button( w );
}

void
JACK_Module::cb_button( Fl_Widget *w )
{
int n = audio_output.size();

Logger log(this);

if ( w == dec_button )
{
--n;
}
else if ( w == inc_button )
{
++n;
}
control_input[1].control_value( n );
}

int
JACK_Module::can_support_inputs ( int )
{
return audio_output.size();
}


void
JACK_Module::remove_aux_audio_outputs ( void )
{
for ( unsigned int i = aux_audio_output.size(); i--; )
{
aux_audio_output.back().jack_port()->shutdown();
aux_audio_output.pop_back();
}
}

bool
JACK_Module::configure_inputs ( int n )
{
if ( n > 0 )
{
output_connection_handle->show();
}

if ( n < 1 || n > MAX_PORTS )
return false;
int on = audio_input.size();

if ( n > on )
{
for ( int i = on; i < n; ++i )
{
if ( add_aux_audio_output(_prefix, i ) )
{
add_port( Port( this, Port::INPUT, Port::AUDIO ) );
}
}

mixer->maybe_auto_connect_output(&aux_audio_output.back());
}
else
{
for ( int i = on; i > n; --i )
{
audio_input.back().disconnect();
audio_input.pop_back();
aux_audio_output.back().disconnect();
aux_audio_output.back().jack_port()->shutdown();
delete aux_audio_output.back().jack_port();
aux_audio_output.pop_back();
}
}

_connection_handle_outputs[0][0] = 0;
_connection_handle_outputs[0][1] = aux_audio_output.size();

if ( is_default() )
control_input[0].control_value_no_callback( n );

return true;
}

bool
JACK_Module::configure_outputs ( int n )
{
int on = audio_output.size();

if ( n > MAX_PORTS )
return false;
if ( n > 0 )
{
input_connection_handle->show();
}
if ( n > on )
{
for ( int i = on; i < n; ++i )
{
if ( add_aux_audio_input(_prefix, i ) )
{
add_port( Port( this, Port::OUTPUT, Port::AUDIO ) );
}
}

mixer->auto_connect();
}
else
{
for ( int i = on; i > n; --i )
{
audio_output.back().disconnect();
audio_output.pop_back();
aux_audio_input.back().disconnect();
aux_audio_input.back().jack_port()->shutdown();
delete aux_audio_input.back().jack_port();
aux_audio_input.pop_back();
}
}

if ( is_default() )
control_input[1].control_value_no_callback( n );

if ( n > 0 && is_default() )
{
dec_button->show();
inc_button->show();
}

return true;
}


bool
JACK_Module::initialize ( void )
{
return true;
}

void
JACK_Module::handle_control_changed ( Port *p )
{
// THREAD_ASSERT( UI );

if ( 0 == strcmp( p->name(), "Inputs" ) )
{
DMESSAGE( "Adjusting number of inputs (JACK outputs)" );
configure_inputs( p->control_value() );
if ( chain() )
chain()->configure_ports();
}
else if ( 0 == strcmp( p->name(), "Outputs" ) )
{
DMESSAGE( "Adjusting number of outputs (JACK inputs)" );

if ( ! chain() )
{
configure_outputs( p->control_value() );
}
else if ( chain()->can_configure_outputs( this, p->control_value() ) )
{
configure_outputs( p->control_value() );
chain()->configure_ports();
}
else
{
p->connected_port()->control_value( noutputs() );
}
}

Module::handle_control_changed( p );
}

int
JACK_Module::handle ( int m )
{
static unsigned long _event_state = 0;

unsigned long evstate = Fl::event_state();

switch ( m )
{
case FL_PUSH:
if ( Fl::event_inside( output_connection_handle ) ||
Fl::event_inside( output_connection2_handle ) ||
Fl::event_inside( input_connection_handle ) )
{
_event_state = evstate;
return 1;
}

return Module::handle(m) || 1;

case FL_RELEASE:
Fl::selection_owner(0);
receptive_to_drop = NULL;

if ( Fl::event_inside( output_connection_handle ) ||
Fl::event_inside( output_connection2_handle ) ||
Fl::event_inside( input_connection_handle ) )
{
if ( _event_state & FL_BUTTON3 )
{
/* was a right click */
// TODO: Pop up connection menu.
}
}

return Module::handle(m) || 1;
case FL_DRAG:
{
if ( Fl::event_is_click() )
return 1;

int connection_handle = -1;
if ( Fl::event_inside( output_connection_handle ) )
connection_handle = 0;
if ( Fl::event_inside( output_connection2_handle ) )
connection_handle = 1;

if ( Fl::event_button1() &&
connection_handle >= 0
&& ! Fl::selection_owner() )
{
DMESSAGE( "initiation of drag" );

char *s = (char*)malloc(256);
s[0] = 0;
for ( unsigned int i = _connection_handle_outputs[connection_handle][0];
i < aux_audio_output.size() && i < _connection_handle_outputs[connection_handle][1]; ++i )
{
char *s2;
asprintf(&s2, "jack.port://%s\r\n",
aux_audio_output[i].jack_port()->jack_name() );
s = (char*)realloc( s, strlen( s ) + strlen( s2 ) + 1 );
strcat( s, s2 );

free( s2 );
}
Fl::copy(s, strlen(s) + 1, 0);

Fl::selection_owner(this);

free( s );

Fl::dnd();

return 1;
}
return 1;
}
/* we have to prevent Fl_Group::handle() from getting these, otherwise it will mess up Fl::belowmouse() */
case FL_MOVE:
if ( Fl::event_inside( output_connection_handle ) ||
Fl::event_inside( output_connection2_handle ) ||
Fl::event_inside( input_connection_handle ) )
{
fl_cursor( FL_CURSOR_HAND );
}
else
fl_cursor( FL_CURSOR_DEFAULT );

Module::handle(m);
return 1;
case FL_ENTER:
case FL_DND_ENTER:
Module::handle(m);
return 1;
case FL_LEAVE:
case FL_DND_LEAVE:
Module::handle(m);
if ( this == receptive_to_drop )
{
receptive_to_drop = NULL;
redraw();
}
fl_cursor( FL_CURSOR_DEFAULT );
return 1;
case FL_DND_RELEASE:
Fl::selection_owner(0);
receptive_to_drop = NULL;
redraw();
return 1;
case FL_DND_DRAG:
{
if ( this == receptive_to_drop )
return 1;

if ( aux_audio_input.size() )
{
receptive_to_drop = this;
redraw();
return 1;
}
return 0;
}
case FL_PASTE:
{
receptive_to_drop = NULL;
redraw();

if ( ! Fl::event_inside( this ) )
return 0;

/* NOW we get the text... */
const char *text = Fl::event_text();

DMESSAGE( "Got drop text \"%s\"",text);

if ( strncmp( text, "jack.port://", strlen( "jack.port://" ) ) )
{
return 0;
}
std::vector<std::string> port_names;

char *port_name;
int end;
while ( sscanf( text, "jack.port://%m[^\r\n]\r\n%n", &port_name, &end ) > 0 )
{
DMESSAGE( "Scanning %s", port_name );
port_names.push_back( port_name );
free(port_name );
text += end;
}
for ( unsigned int i = 0; i < aux_audio_input.size() && i < port_names.size(); i++)
{
const char *pn = port_names[i].c_str();
JACK::Port *ji = aux_audio_input[i].jack_port();
if ( ji->connected_to( pn ) )
{
DMESSAGE( "Disconnecting from \"%s\"", pn );
ji->disconnect( pn );
}
else
{
DMESSAGE( "Connecting to %s", pn );
ji->connect( pn );
}
}
Fl::selection_owner(0);
return 1;
}
}
return Module::handle(m);
}

/**********/
/* Engine */
/**********/

void
JACK_Module::process ( nframes_t nframes )
{
for ( unsigned int i = 0; i < audio_input.size(); ++i )
{
if ( audio_input[i].connected() )
{
buffer_copy( (sample_t*)aux_audio_output[i].jack_port()->buffer(nframes),
(sample_t*)audio_input[i].buffer(),
nframes );
}
}

for ( unsigned int i = 0; i < audio_output.size(); ++i )
{
if ( audio_output[i].connected() )
{
buffer_copy( (sample_t*)audio_output[i].buffer(),
(sample_t*)aux_audio_input[i].jack_port()->buffer(nframes),
nframes );
}
}
}

+ 0
- 87
mixer/src/JACK_Module.H View File

@@ -1,87 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2009 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

#pragma once

class Fl_Box;
class Fl_Browser;
#include "Module.H"
#include "JACK/Port.H"
#include <vector>

class JACK_Module : public Module
{
char *_prefix;

protected:
void prefix ( const char *s )
{
if ( _prefix )
free( _prefix );
_prefix = NULL;
if ( s )
_prefix = strdup( s );
}

Fl_Button * dec_button;
Fl_Button * inc_button;
Fl_Browser * connection_display;
Fl_Box * input_connection_handle;
Fl_Box * output_connection_handle;
Fl_Box * output_connection2_handle;
static void cb_button ( Fl_Widget *w, void *v );
void cb_button ( Fl_Widget *w );

protected:

unsigned int _connection_handle_outputs[2][2];
public:

void update_connection_status ( void );

JACK_Module ( bool log = true );
virtual ~JACK_Module ( );

virtual const char *basename ( void ) const { return "JACK"; }
virtual const char *name ( void ) const { return "JACK"; }
virtual bool initialize ( void );

virtual void draw ( void );
virtual int handle ( int m );

virtual int can_support_inputs ( int );
void remove_aux_audio_outputs ( void );
virtual bool configure_inputs ( int n );
virtual bool configure_outputs ( int n );

virtual void handle_control_changed ( Port *p );

LOG_CREATE_FUNC( JACK_Module );


protected:

virtual void process ( nframes_t nframes );

};

+ 0
- 828
mixer/src/LADSPAInfo.C View File

@@ -1,828 +0,0 @@
//
// LADSPAInfo.C - Class for indexing information on LADSPA Plugins
//
// Copyleft (C) 2002 Mike Rawes <myk@waxfrenzy.org>
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//

// #include <config.h>

#include <vector>
#include <string>
#include <list>
#include <map>
#include <iostream>
#include <sstream>
#include <algorithm>
#include <stdio.h>
#include <cstring>
#include <cstdlib>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <dlfcn.h>

#include <ladspa.h>

#define HAVE_LIBLRDF 1
#ifdef HAVE_LIBLRDF
#include <lrdf.h>
#endif

#include "LADSPAInfo.h"

using namespace std;

LADSPAInfo::LADSPAInfo(bool override,
const char *path_list)
{
if (strlen(path_list) > 0) {
m_ExtraPaths = strdup(path_list);
} else {
m_ExtraPaths = NULL;
}
m_LADSPAPathOverride = override;

RescanPlugins();
}

LADSPAInfo::~LADSPAInfo()
{
CleanUp();
}

void
LADSPAInfo::RescanPlugins(void)
{
// Clear out what we've got
CleanUp();

if (!m_LADSPAPathOverride) {
// Get $LADPSA_PATH, if available
char *ladspa_path = getenv("LADSPA_PATH");
if (ladspa_path) {
ScanPathList(ladspa_path, &LADSPAInfo::ExaminePluginLibrary);

} else {

cerr << "WARNING: LADSPA_PATH environment variable not set" << endl;
cerr << " Assuming /usr/lib/ladspa:/usr/local/lib/ladspa" << endl;

ScanPathList("/usr/lib/ladspa:/usr/local/lib/ladspa", &LADSPAInfo::ExaminePluginLibrary);
}
}

// Check any supplied extra paths
if (m_ExtraPaths) {
ScanPathList(m_ExtraPaths, &LADSPAInfo::ExaminePluginLibrary);
}

// Do we have any plugins now?
if (m_Plugins.size() == 0) {
cerr << "WARNING: No plugins found" << endl;
} else {
cerr << m_Plugins.size() << " plugins found in " << m_Libraries.size() << " libraries" << endl;

#ifdef HAVE_LIBLRDF
// Got some plugins. Now search for RDF data
lrdf_init();

char *rdf_path = getenv("LADSPA_RDF_PATH");

if (rdf_path) {
// Examine rdf info
ScanPathList(rdf_path, &LADSPAInfo::ExamineRDFFile);

} else {
cerr << "WARNING: LADSPA_RDF_PATH environment variable not set" << endl;
cerr << " Assuming /usr/share/ladspa/rdf:/usr/local/share/ladspa/rdf" << endl;

// Examine rdf info
ScanPathList("/usr/share/ladspa/rdf:/usr/local/share/ladspa/rdf", &LADSPAInfo::ExamineRDFFile);
}
MetadataRDFDescend(LADSPA_BASE "Plugin", 0);

// See which plugins were not added to an rdf group, and add them
// all into the top level 'LADSPA' one
list<unsigned long> rdf_p;

// Get indices of plugins added to groups
for (vector<RDFURIInfo>::iterator ri = m_RDFURIs.begin(); ri != m_RDFURIs.end(); ri++) {
rdf_p.insert(rdf_p.begin(), ri->Plugins.begin(), ri->Plugins.end());
}

// Add all uncategorized plugins to top level group, subclassed by their
// library's basename.
rdf_p.unique();
rdf_p.sort();
unsigned long last_p = 0;
for (list<unsigned long>::iterator p = rdf_p.begin(); p != rdf_p.end(); p++) {
if ((*p - last_p) > 1) {
for (unsigned long i = last_p + 1; i < *p; i++) {
// URI 0 is top-level "LADSPA" group
m_RDFURIs[0].Plugins.push_back(i);
}
}
last_p = *p;
}
while (++last_p < m_Plugins.size()) {
// URI 0 is top-level "LADSPA" group
m_RDFURIs[0].Plugins.push_back(last_p);
}

lrdf_cleanup();
#else
// No RDF. Add all plugins to top-level group
RDFURIInfo ri;

ri.URI = "";
ri.Label = "LADSPA";

m_RDFURIs.push_back(ri);
m_RDFLabelLookup["LADSPA"] = 0;

for (unsigned long i = 0; i < m_Plugins.size(); i++) {
// Add plugin index
m_RDFURIs[0].Plugins.push_back(i);
}
#endif
}
}

void
LADSPAInfo::UnloadAllLibraries(void)
{
// Blank descriptors
for (vector<PluginInfo>::iterator i = m_Plugins.begin();
i != m_Plugins.end(); i++) {
if (i->Descriptor) i->Descriptor = NULL;
}
// Unload DLLs,
for (vector<LibraryInfo>::iterator i = m_Libraries.begin();
i != m_Libraries.end(); i++) {
if (i->Handle) {
dlclose(i->Handle);
i->Handle = NULL;
}
i->RefCount = 0;
}
}

const LADSPA_Descriptor *
LADSPAInfo::GetDescriptorByID(unsigned long unique_id)
{
if (m_IDLookup.find(unique_id) == m_IDLookup.end()) {
cerr << "LADSPA Plugin ID " << unique_id << " not found!" << endl;
return NULL;
}

// Got plugin index
unsigned long plugin_index = m_IDLookup[unique_id];

PluginInfo *pi = &(m_Plugins[plugin_index]);
LibraryInfo *li = &(m_Libraries[pi->LibraryIndex]);

if (!(pi->Descriptor)) {
LADSPA_Descriptor_Function desc_func = GetDescriptorFunctionForLibrary(pi->LibraryIndex);
if (desc_func) pi->Descriptor = desc_func(pi->Index);
}

if (pi->Descriptor) {

// Success, so increment ref counter for library
li->RefCount++;
}

return pi->Descriptor;
}

void
LADSPAInfo::DiscardDescriptorByID(unsigned long unique_id)
{
if (m_IDLookup.find(unique_id) == m_IDLookup.end()) {
cerr << "LADSPA Plugin ID " << unique_id << " not found!" << endl;
} else {

// Get plugin index
unsigned long plugin_index = m_IDLookup[unique_id];

PluginInfo *pi = &(m_Plugins[plugin_index]);
LibraryInfo *li = &(m_Libraries[pi->LibraryIndex]);

pi->Descriptor = NULL;

// Decrement reference counter for library, and unload if last
if (li->RefCount > 0) {
li->RefCount--;
if (li->RefCount == 0) {

// Unload library
dlclose(li->Handle);
li->Handle = NULL;
}
}
}
}

// ****************************************************************************
// ** SSM Specific Functions **
// ****************************************************************************

unsigned long
LADSPAInfo::GetIDFromFilenameAndLabel(std::string filename,
std::string label)
{
bool library_loaded = false;

if (m_FilenameLookup.find(filename) == m_FilenameLookup.end()) {
cerr << "LADSPA Library " << filename << " not found!" << endl;
return 0;
}

unsigned long library_index = m_FilenameLookup[filename];

if (!(m_Libraries[library_index].Handle)) library_loaded = true;

LADSPA_Descriptor_Function desc_func = GetDescriptorFunctionForLibrary(library_index);

if (!desc_func) {
return 0;
}

// Search for label in library
const LADSPA_Descriptor *desc;
for (unsigned long i = 0; (desc = desc_func(i)) != NULL; i++) {
string l = desc->Label;
if (l == label) {

// If we had to load the library, unload it
unsigned long id = desc->UniqueID;
if (library_loaded) {
dlclose(m_Libraries[library_index].Handle);
m_Libraries[library_index].Handle = NULL;
}
return id;
}
}

cerr << "Plugin " << label << " not found in library " << filename << endl;
return 0;
}

const vector<LADSPAInfo::PluginEntry>
LADSPAInfo::GetMenuList(void)
{
m_SSMMenuList.clear();

DescendGroup("", "LADSPA", 1);

return m_SSMMenuList;
}

const vector<LADSPAInfo::PluginInfo>
LADSPAInfo::GetPluginInfo(void)
{
return m_Plugins;
}

unsigned long
LADSPAInfo::GetPluginListEntryByID(unsigned long unique_id)
{
unsigned long j = 0;
for (vector<PluginEntry>::iterator i = m_SSMMenuList.begin();
i != m_SSMMenuList.end(); i++, j++) {
if (i->UniqueID == unique_id) return j;
}
return m_SSMMenuList.size();
}

// ****************************************************************************
// ** Private Member Functions **
// ****************************************************************************

// Build a list of plugins by group, suitable for SSM LADSPA Plugin drop-down
// The top-level "LADSPA" group is not included

void
LADSPAInfo::DescendGroup(string prefix,
const string group,
unsigned int depth)
{
list<string> groups = GetSubGroups(group);

if (prefix.length() > 0) {
// Add an explicit '/' as we're creating sub-menus from groups
prefix += "/";
}

for (list<string>::iterator g = groups.begin(); g != groups.end(); g++) {
string name;

// Escape '/' and '|' characters
size_t x = g->find_first_of("/|");
if (x == string::npos) {
name = *g;
} else {
size_t last_x = 0;
while (x < string::npos) {
name += g->substr(last_x, x - last_x) + '\\' + (*g)[x];
last_x = x + 1;
x = g->find_first_of("/|", x + 1);
}
name += g->substr(last_x, x - last_x);
}

DescendGroup(prefix + name, *g, depth + 1);
}
if (m_RDFLabelLookup.find(group) != m_RDFLabelLookup.end()) {
unsigned long uri_index = m_RDFLabelLookup[group];

// Create group for unclassified plugins
if (prefix.length() == 0) {
prefix = "Unclassified/";
depth = depth + 1;
}

// Temporary list (for sorting the plugins by name)
list<PluginEntry> plugins;

for (vector<unsigned long>::iterator p = m_RDFURIs[uri_index].Plugins.begin();
p != m_RDFURIs[uri_index].Plugins.end(); p++) {

PluginInfo *pi = &(m_Plugins[*p]);
string name;

// Escape '/' and '|' characters
size_t x = pi->Name.find_first_of("/|");
if (x == string::npos) {
name = pi->Name;
} else {
size_t last_x = 0;
while (x < string::npos) {
name += pi->Name.substr(last_x, x - last_x) + '\\' + pi->Name[x];
last_x = x + 1;
x = pi->Name.find_first_of("/|", x + 1);
}
name += pi->Name.substr(last_x, x - last_x);
}

PluginEntry pe;

pe.Depth = depth;
pe.UniqueID = pi->UniqueID;
pe.Name = name;
pe.Category = prefix;
pe.Category = pe.Category.substr(0, pe.Category.size()-1);

plugins.push_back(pe);
}
plugins.sort();

// Deal with duplicates by numbering them
for (list<PluginEntry>::iterator i = plugins.begin();
i != plugins.end(); ) {
string name = i->Name;

i++;
unsigned long n = 2;
while ((i != plugins.end()) && (i->Name == name)) {
stringstream s;
s << n;
i->Name = name + " (" + s.str() + ")";
n++;
i++;
}
}

// Add all ordered entries to the Menu List
// This ensures that plugins appear after groups
for (list<PluginEntry>::iterator p = plugins.begin(); p != plugins.end(); p++) {
m_SSMMenuList.push_back(*p);
}
}
}

// Get list of groups that are within given group. The root group is
// always "LADSPA"
list<string>
LADSPAInfo::GetSubGroups(const string group)
{
list<string> groups;
unsigned long uri_index;

if (m_RDFLabelLookup.find(group) == m_RDFLabelLookup.end()) {
return groups;
} else {
uri_index = m_RDFLabelLookup[group];
}

for (vector<unsigned long>::iterator sg = m_RDFURIs[uri_index].Children.begin();
sg != m_RDFURIs[uri_index].Children.end(); sg++) {
groups.push_back(m_RDFURIs[*sg].Label);
}

groups.sort();

return groups;
}

// Unload any loaded DLLs and clear vectors etc
void
LADSPAInfo::CleanUp(void)
{
m_MaxInputPortCount = 0;

m_IDLookup.clear();
m_Plugins.clear();

// Unload loaded dlls
for (vector<LibraryInfo>::iterator i = m_Libraries.begin();
i != m_Libraries.end(); i++) {
if (i->Handle) dlclose(i->Handle);
}

m_Libraries.clear();
m_Paths.clear();

m_RDFURILookup.clear();
m_RDFURIs.clear();

if (m_ExtraPaths) {
free(m_ExtraPaths);
m_ExtraPaths = NULL;
}
}

// Given a colon-separated list of paths, examine the contents of each
// path, examining any regular files using the given member function,
// which currently can be:
//
// ExaminePluginLibrary - add plugin library info from plugins
// ExamineRDFFile - add plugin information from .rdf/.rdfs files
void
LADSPAInfo::ScanPathList(const char *path_list,
void (LADSPAInfo::*ExamineFunc)(const string,
const string))
{
const char *start;
const char *end;
int extra;
char *path;
string basename;
DIR *dp;
struct dirent *ep;
struct stat sb;

// This does the same kind of thing as strtok, but strtok won't
// like the const
start = path_list;
while (*start != '\0') {
while (*start == ':') start++;
end = start;
while (*end != ':' && *end != '\0') end++;

if (end - start > 0) {
extra = (*(end - 1) == '/') ? 0 : 1;
path = (char *)malloc(end - start + 1 + extra);
if (path) {
strncpy(path, start, end - start);
if (extra == 1) path[end - start] = '/';
path[end - start + extra] = '\0';

dp = opendir(path);
if (!dp) {
cerr << "WARNING: Could not open path " << path << endl;
} else {
while ((ep = readdir(dp))) {

// Stat file to get type
basename = ep->d_name;
if (!stat((path + basename).c_str(), &sb)) {

// We only want regular files
if (S_ISREG(sb.st_mode)) (*this.*ExamineFunc)(path, basename);
}
}
closedir(dp);
}
free(path);
}
}
start = end;
}
}

// Check given file is a valid LADSPA Plugin library
//
// If so, add path, library and plugin info
// to the m_Paths, m_Libraries and m_Plugins vectors.
//
void
LADSPAInfo::ExaminePluginLibrary(const string path,
const string basename)
{
void *handle;
LADSPA_Descriptor_Function desc_func;
const LADSPA_Descriptor *desc;
string fullpath = path + basename;

// We're not executing any code, so be lazy about resolving symbols
handle = dlopen(fullpath.c_str(), RTLD_LAZY);

if (!handle) {
cerr << "WARNING: File " << fullpath
<< " could not be examined" << endl;
cerr << "dlerror() output:" << endl;
cerr << dlerror() << endl;
} else {

// It's a DLL, so now see if it's a LADSPA plugin library
desc_func = (LADSPA_Descriptor_Function)dlsym(handle,
"ladspa_descriptor");
if (!desc_func) {

// Is DLL, but not a LADSPA one
cerr << "WARNING: DLL " << fullpath
<< " has no ladspa_descriptor function" << endl;
cerr << "dlerror() output:" << endl;
cerr << dlerror() << endl;
} else {

// Got ladspa_descriptor, so we can now get plugin info
bool library_added = false;
unsigned long i = 0;
desc = desc_func(i);
while (desc) {

// First, check that it's not a dupe
if (m_IDLookup.find(desc->UniqueID) != m_IDLookup.end()) {
unsigned long plugin_index = m_IDLookup[desc->UniqueID];
unsigned long library_index = m_Plugins[plugin_index].LibraryIndex;
unsigned long path_index = m_Libraries[library_index].PathIndex;

cerr << "WARNING: Duplicated Plugin ID ("
<< desc->UniqueID << ") found:" << endl;

cerr << " Plugin " << m_Plugins[plugin_index].Index
<< " in library: " << m_Paths[path_index]
<< m_Libraries[library_index].Basename
<< " [First instance found]" << endl;
cerr << " Plugin " << i << " in library: " << fullpath
<< " [Duplicate not added]" << endl;
} else {
if (CheckPlugin(desc)) {

// Add path if not already added
unsigned long path_index;
vector<string>::iterator p = find(m_Paths.begin(), m_Paths.end(), path);
if (p == m_Paths.end()) {
path_index = m_Paths.size();
m_Paths.push_back(path);
} else {
path_index = p - m_Paths.begin();
}

// Add library info if not already added
if (!library_added) {
LibraryInfo li;
li.PathIndex = path_index;
li.Basename = basename;
li.RefCount = 0;
li.Handle = NULL;
m_Libraries.push_back(li);

library_added = true;
}

// Add plugin info
PluginInfo pi;
pi.LibraryIndex = m_Libraries.size() - 1;
pi.Index = i;
pi.UniqueID = desc->UniqueID;
pi.Label = desc->Label;
pi.Name = desc->Name;
pi.Descriptor = NULL;
pi.Maker = desc->Maker;
pi.AudioInputs = 0;
pi.AudioOutputs = 0;
// Find number of input ports
unsigned long in_port_count = 0;
for (unsigned long p = 0; p < desc->PortCount; p++) {
if (LADSPA_IS_PORT_INPUT(desc->PortDescriptors[p])) {
in_port_count++;
if ( LADSPA_IS_PORT_AUDIO(desc->PortDescriptors[p] ) )
pi.AudioInputs++;
}
}
for (unsigned long p = 0; p < desc->PortCount; p++) {
if (LADSPA_IS_PORT_OUTPUT(desc->PortDescriptors[p])) {
if ( LADSPA_IS_PORT_AUDIO(desc->PortDescriptors[p] ) )
pi.AudioOutputs++;
}
}
if (in_port_count > m_MaxInputPortCount) {
m_MaxInputPortCount = in_port_count;
}

m_Plugins.push_back(pi);

// Add to index
m_IDLookup[desc->UniqueID] = m_Plugins.size() - 1;

} else {
cerr << "WARNING: Plugin " << desc->UniqueID << " not added" << endl;
}
}

desc = desc_func(++i);
}
}
dlclose(handle);
}
}

#ifdef HAVE_LIBLRDF
// Examine given RDF plugin meta-data file
void
LADSPAInfo::ExamineRDFFile(const std::string path,
const std::string basename)
{
string fileuri = "file://" + path + basename;

if (lrdf_read_file(fileuri.c_str())) {
cerr << "WARNING: File " << path + basename << " could not be parsed [Ignored]" << endl;
}
}

// Recursively add rdf information for plugins that have been
// found from scanning LADSPA_PATH
void
LADSPAInfo::MetadataRDFDescend(const char * uri,
unsigned long parent)
{
unsigned long this_uri_index;

// Check URI not already added
if (m_RDFURILookup.find(uri) == m_RDFURILookup.end()) {

// Not found
RDFURIInfo ri;

ri.URI = uri;

if (ri.URI == LADSPA_BASE "Plugin") {

// Add top level group as "LADSPA"
// This will always happen, even if there are no .rdf files read by liblrdf
// or if there is no liblrdf support
ri.Label = "LADSPA";
} else {
char * label = lrdf_get_label(uri);
if (label) {
ri.Label = label;
} else {
ri.Label = "(No label)";
}
}

// Add any instances found
lrdf_uris * instances = lrdf_get_instances(uri);
if (instances) {
for (unsigned long j = 0; j < instances->count; j++) {
unsigned long uid = lrdf_get_uid(instances->items[j]);
if (m_IDLookup.find(uid) != m_IDLookup.end()) {
ri.Plugins.push_back(m_IDLookup[uid]);
}
}
}

lrdf_free_uris(instances);

m_RDFURIs.push_back(ri);
this_uri_index = m_RDFURIs.size() - 1;

m_RDFURILookup[ri.URI] = this_uri_index;
m_RDFLabelLookup[ri.Label] = this_uri_index;

} else {

// Already added
this_uri_index = m_RDFURILookup[uri];
}

// Only add parent - child info if this uri is NOT the first (root) uri
if (this_uri_index > 0) {
m_RDFURIs[this_uri_index].Parents.push_back(parent);
m_RDFURIs[parent].Children.push_back(this_uri_index);
}

lrdf_uris * uris = lrdf_get_subclasses(uri);

if (uris) {
for (unsigned long i = 0; i < uris->count; i++) {
MetadataRDFDescend(uris->items[i], this_uri_index);
}
}

lrdf_free_uris(uris);
}
#endif

bool
LADSPAInfo::CheckPlugin(const LADSPA_Descriptor *desc)
{
#define test(t, m) { \
if (!(t)) { \
cerr << m << endl; \
return false; \
} \
}
test(desc->instantiate, "WARNING: Plugin has no instatiate function");
test(desc->connect_port, "WARNING: Warning: Plugin has no connect_port funciton");
test(desc->run, "WARNING: Plugin has no run function");
test(!(desc->run_adding != 0 && desc->set_run_adding_gain == 0),
"WARNING: Plugin has run_adding but no set_run_adding_gain");
test(!(desc->run_adding == 0 && desc->set_run_adding_gain != 0),
"WARNING: Plugin has set_run_adding_gain but no run_adding");
test(desc->cleanup, "WARNING: Plugin has no cleanup function");
test(!LADSPA_IS_INPLACE_BROKEN(desc->Properties),
"WARNING: Plugin cannot use in place processing");
test(desc->PortCount, "WARNING: Plugin has no ports");
test(desc->Name, "WARNING: Plugin has no name" );

if ( strcmp( desc->Maker, "Tom Szilagyi" ) )
{
/* The author of the TAP plugins has a very narrow
* interpretation of the HARD RT hint which differs from
* most everyone else, so we are left in the unfortunate
* position of having to ignore the hint for TAP plugins
* and consider them all RT safe */
test(LADSPA_IS_HARD_RT_CAPABLE( desc->Properties ), "WARNING: Plugin is not RT capable" );
}

return true;
}

LADSPA_Descriptor_Function
LADSPAInfo::GetDescriptorFunctionForLibrary(unsigned long library_index)
{
LibraryInfo *li = &(m_Libraries[library_index]);

if (!(li->Handle)) {

// Need full path
string fullpath = m_Paths[li->PathIndex];
fullpath.append(li->Basename);

// Immediate symbol resolution, as plugin code is likely to be executed
li->Handle = dlopen(fullpath.c_str(), RTLD_NOW);
if (!(li->Handle)) {

// Plugin library changed since last path scan
cerr << "WARNING: Plugin library " << fullpath << " cannot be loaded" << endl;
cerr << "Rescan of plugins recommended" << endl;
cerr << "dlerror() output:" << endl;
cerr << dlerror() << endl;
return NULL;
}
}

// Got handle so now verify that it's a LADSPA plugin library
const LADSPA_Descriptor_Function desc_func = (LADSPA_Descriptor_Function)dlsym(li->Handle,
"ladspa_descriptor");
if (!desc_func) {

// Is DLL, but not a LADSPA one (changed since last path scan?)
cerr << "WARNING: DLL " << m_Paths[li->PathIndex] << li->Basename
<< " has no ladspa_descriptor function" << endl;
cerr << "Rescan of plugins recommended" << endl;
cerr << "dlerror() output:" << endl;
cerr << dlerror() << endl;

// Unload library
dlclose(li->Handle);
return NULL;
}

return desc_func;
}

+ 0
- 208
mixer/src/LADSPAInfo.h View File

@@ -1,208 +0,0 @@
//
// LADSPAInfo.h - Header file for LADSPA Plugin info class
//
// Copyleft (C) 2002 Mike Rawes <myk@waxfrenzy.org>
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//

#ifndef __ladspa_info_h__
#define __ladspa_info_h__

// #include <config.h>

#include <string>
#include <vector>
#include <list>
#include <map>
#include <ladspa.h>

class LADSPAInfo
{
public:
// If override is false, examine $LADSPA_PATH
// Also examine supplied path list
// For all paths, add basic plugin information for later lookup,
// instantiation and so on.
LADSPAInfo(bool override = false, const char *path_list = "");

// Unload all loaded plugins and clean up
~LADSPAInfo();

// ************************************************************************
// Loading/Unloading plugin libraries
//
// At first, no library dlls are loaded.
//
// A plugin library may have more than one plugin descriptor. The
// descriptor is used to instantiate, activate, execute plugin instances.
// Administration of plugin instances are outwith the scope of this class,
// instead, descriptors are requested using GetDecriptorByID, and disposed
// of using DiscardDescriptorByID.
//
// Each library keeps a reference count of descriptors requested. A library
// is loaded when a descriptor is requested for the first time, and remains
// loaded until the number of discards matches the number of requests.

// Rescan all paths in $LADSPA_PATH, as per constructor.
// This will also unload all libraries, and make any descriptors that
// have not been discarded with DiscardDescriptorByID invalid.
void RescanPlugins(void);

// Unload all dlopened libraries. This will make any descriptors that
// have not been discarded with DiscardDescriptorByID invalid.
void UnloadAllLibraries(void);

// Get descriptor of plugin with given ID. This increments the descriptor
// count for the corresponding library.
const LADSPA_Descriptor *GetDescriptorByID(unsigned long unique_id);

// Notify that a descriptor corresponding to the given ID has been
// discarded. This decrements the descriptor count for the corresponding
// library.
void DiscardDescriptorByID(unsigned long unique_id);

// ************************************************************************
// SSM Specific options

// Get unique ID of plugin identified by given library filename and label.
// This is for backwards compatibility with older versions of SSM where the
// path and label of the plugin was stored in the configuration - current
// versions store the Unique ID
unsigned long GetIDFromFilenameAndLabel(std::string filename,
std::string label);

// Struct for plugin information returned by queries
struct PluginEntry
{
unsigned int Depth;
unsigned long UniqueID;
std::string Name;
std::string Category;

bool operator<(const PluginEntry& pe)
{
return (Name<pe.Name);
}
};


// For cached plugin information
struct PluginInfo
{
unsigned long LibraryIndex; // Index of library in m_Libraries
unsigned long Index; // Plugin index in library
unsigned long UniqueID; // Unique ID
std::string Label; // Plugin label
std::string Name; // Plugin Name
std::string Maker;
unsigned int AudioInputs;
unsigned int AudioOutputs;
const LADSPA_Descriptor *Descriptor; // Descriptor, NULL

};

// Get ordered list of plugin names and IDs for plugin menu
const std::vector<PluginEntry> GetMenuList(void);
const std::vector<PluginInfo> GetPluginInfo(void);

// Get the index in the above list for given Unique ID
// If not found, this returns the size of the above list
unsigned long GetPluginListEntryByID(unsigned long unique_id);

// Get the number of input ports for the plugin with the most
// input ports
unsigned long GetMaxInputPortCount(void) { return m_MaxInputPortCount; }

private:
// See LADSPAInfo.C for comments on these functions
void DescendGroup(std::string prefix,
const std::string group,
unsigned int depth);
std::list<std::string> GetSubGroups(const std::string group);

void CleanUp(void);
void ScanPathList(const char *path_list,
void (LADSPAInfo::*ExamineFunc)(const std::string,
const std::string));
void ExaminePluginLibrary(const std::string path,
const std::string basename);

bool CheckPlugin(const LADSPA_Descriptor *desc);
LADSPA_Descriptor_Function GetDescriptorFunctionForLibrary(unsigned long library_index);
#ifdef HAVE_LIBLRDF
void ExamineRDFFile(const std::string path,
const std::string basename);
void MetadataRDFDescend(const char *uri,
unsigned long parent);
#endif

// For cached library information
struct LibraryInfo
{
unsigned long PathIndex; // Index of path in m_Paths
std::string Basename; // Filename
unsigned long RefCount; // Count of descriptors requested
void *Handle; // DLL Handle, NULL
};

// For cached RDF uri information
struct RDFURIInfo
{
std::string URI; // Full URI for use with lrdf
std::string Label; // Label
std::vector<unsigned long> Parents; // Index of parents in m_RDFURIs
std::vector<unsigned long> Children; // Indices of children in m_RDFURIs
std::vector<unsigned long> Plugins; // Indices of plugins in m_Plugins
};

// Lookup maps
typedef std::map<unsigned long,
unsigned long,
std::less<unsigned long> > IDMap;

typedef std::map<std::string,
unsigned long,
std::less<std::string> > StringMap;

bool m_LADSPAPathOverride;
char *m_ExtraPaths;

// LADSPA Plugin information database
std::vector<std::string> m_Paths;
std::vector<LibraryInfo> m_Libraries;
std::vector<PluginInfo> m_Plugins;

// Plugin lookup maps
IDMap m_IDLookup;

// RDF URI database
std::vector<RDFURIInfo> m_RDFURIs;

// RDF URI lookup map
StringMap m_RDFURILookup;

// RDF Label lookup map
StringMap m_RDFLabelLookup;

// SSM specific data
std::vector<PluginEntry> m_SSMMenuList;
StringMap m_FilenameLookup;
unsigned long m_MaxInputPortCount;
};

#endif // __ladspa_info_h__

+ 0
- 101
mixer/src/Meter.H View File

@@ -1,101 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2008 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/


/* Base class for all meters */

#include <FL/Fl.H>
#include <FL/Fl_Widget.H>
#include <FL/Fl_Valuator.H>
#include "FL/test_press.H"

class Meter : public Fl_Valuator
{

float _peak;
float _value;

protected:

virtual void draw ( void ) = 0;
virtual int handle ( int m )
{
if ( m == FL_ENTER || m == FL_LEAVE )
return 1;
else if ( m == FL_PUSH && test_press( FL_BUTTON1 ))
{
reset();
return 1;
}

return Fl_Valuator::handle( m );
}

float
deflection ( float db )
{
float def = 0.0f;

if ( db < -70.0f )
def = 0.0f;
else if ( db < -60.0f )
def = ( db + 70.0f ) * 0.25f;
else if ( db < -50.0f )
def = ( db + 60.0f ) * 0.5f + 2.5f;
else if ( db < -40.0f )
def = ( db + 50.0f ) * 0.75f + 7.5f;
else if ( db < -30.0f )
def = ( db + 40.0f ) * 1.5f + 15.0f;
else if ( db < -20.0f )
def = ( db + 30.0f ) * 2.0f + 30.0f;
else if ( db < 6.0f )
def = ( db + 20.0f ) * 2.5f + 50.0f;
else
def = 115.0f;

return def / 115.0f;
}

public:

Meter ( int X, int Y, int W, int H, const char *L = 0 ) :
Fl_Valuator( X, Y, W, H, L )
{
_peak = _value = -80.0f;
}

virtual ~Meter ( ) { }

virtual void value ( float v )
{
if ( visible_r() )
damage( FL_DAMAGE_USER1 );

_value = v;

if ( _value > _peak )
_peak = _value;
}

virtual float value ( void ) const { return _value; }
float peak ( void ) const { return _peak; }

void reset ( void ) { _peak = -80.0f; redraw(); }

};

+ 0
- 267
mixer/src/Meter_Indicator_Module.C View File

@@ -1,267 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2010 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

#include "Meter_Indicator_Module.H"

#include <stdio.h>

#include <FL/Fl.H>
#include <FL/Fl_Value_Slider.H>
#include <FL/Fl_Box.H>
#include <FL/fl_draw.H>
#include <FL/Fl_Counter.H>
#include <FL/Fl_Light_Button.H>

#include "FL/Fl_Dial.H"
#include "FL/Fl_Labelpad_Group.H"
#include "FL/Fl_Scalepack.H"

#include "Chain.H"
#include "DPM.H"

#include "FL/test_press.H"


Meter_Indicator_Module::Meter_Indicator_Module ( bool is_default )
: Module ( is_default, 50, 100, name() )
{
box( FL_FLAT_BOX );
color( FL_BLACK );

_disable_context_menu = false;
_pad = true;
control_value = 0;

add_port( Port( this, Port::INPUT, Port::CONTROL ) );

control_input[0].hints.visible = false;

dpm_pack = new Fl_Scalepack( x(), y(), w(), h() );
dpm_pack->color( FL_BACKGROUND_COLOR );
dpm_pack->box( FL_FLAT_BOX );
dpm_pack->type( FL_HORIZONTAL );

end();

control_value = new float[1];
*control_value = -70.0f;

align( (Fl_Align)(FL_ALIGN_CENTER | FL_ALIGN_INSIDE ) );

clear_visible_focus();
}

Meter_Indicator_Module::~Meter_Indicator_Module ( )
{
if ( control_value )
{
delete[] control_value;
control_value = NULL;
}

log_destroy();
}


void
Meter_Indicator_Module::get ( Log_Entry &e ) const
{

Port *p = control_input[0].connected_port();
Module *m = p->module();

e.add( ":module", m );
e.add( ":port", m->control_output_port_index( p ) );

Module::get( e );
}

void
Meter_Indicator_Module::set ( Log_Entry &e )
{
Module::set( e );

int port = -1;
Module *module = NULL;

for ( int i = 0; i < e.size(); ++i )
{
const char *s, *v;

e.get( i, &s, &v );

if ( ! strcmp( s, ":port" ) )
{
port = atoi( v );
}
else if ( ! strcmp( s, ":module" ) )
{
int i;
sscanf( v, "%X", &i );
Module *t = (Module*)Loggable::find( i );

assert( t );

module = t;
}
}

if ( port >= 0 && module )
control_input[0].connect_to( &module->control_output[port] );
}


void
Meter_Indicator_Module::update ( void )
{
if ( control_input[0].connected() )
{
// A little hack to detect that the connected module's number
// of control outs has changed.
Port *p = control_input[0].connected_port();

if ( dpm_pack->children() != p->hints.dimensions )
{
/* engine->lock(); */

dpm_pack->clear();

control_value = new float[p->hints.dimensions];

for ( int i = p->hints.dimensions; i--; )
{

DPM *dpm = new DPM( x(), y(), w(), h() );
dpm->type( FL_VERTICAL );

dpm_pack->add( dpm );

control_value[i] = -70.0f;
dpm->value( -70.0f );
}

/* engine->unlock(); */
}
else
{
for ( int i = 0; i < dpm_pack->children(); ++i )
{
((DPM*)dpm_pack->child( i ))->value( control_value[i] );
control_value[i] = -70.0f;
}
}
}
}

void
Meter_Indicator_Module::connect_to ( Port *p )
{
control_input[0].connect_to( p );

/* DPM *o = new DPM( 10, 10, 10, 10 ); */
/* o->type( FL_VERTICAL ); */

/* dpm_pack->add( o ); */

redraw();
}


int
Meter_Indicator_Module::handle ( int m )
{
switch ( m )
{
case FL_PUSH:
{
if ( Fl::event_button3() && _disable_context_menu )
return 0;

if ( test_press( FL_BUTTON1 ) )
{
/* don't let Module::handle eat our click */
return Fl_Group::handle( m );
}
}
}

return Module::handle( m );
}


void
Meter_Indicator_Module::handle_control_changed ( Port *p )
{
THREAD_ASSERT( UI );

/* The engine is already locked by the UI thread at this point in
the call-graph, so we can be sure that process() won't be
executed concurrently. */
if ( p->connected() )
{
p = p->connected_port();

if ( dpm_pack->children() != p->hints.dimensions )
{
dpm_pack->clear();

control_value = new float[p->hints.dimensions];

for ( int i = p->hints.dimensions; i--; )
{
DPM *dpm = new DPM( x(), y(), w(), h() );
dpm->type( FL_VERTICAL );
align( (Fl_Align)(FL_ALIGN_CENTER | FL_ALIGN_INSIDE ) );

dpm_pack->add( dpm );
dpm_pack->redraw();

control_value[i] = -70.0f;
dpm->value( -70.0f );
}

redraw();
}
}
}

/**********/
/* Engine */
/**********/

void
Meter_Indicator_Module::process ( nframes_t )
{
if ( control_input[0].connected() )
{
Port *p = control_input[0].connected_port();

for ( int i = 0; i < p->hints.dimensions; ++i )
{
float dB = ((float*)control_input[0].buffer())[i];
if ( dB > control_value[i])
control_value[i] = dB;
}
}
}

+ 0
- 83
mixer/src/Meter_Indicator_Module.H View File

@@ -1,83 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2009 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

#pragma once

#include "Module.H"
#include <vector>
#include "JACK/Port.H"

class Fl_Valuator;
class Fl_Scalepack;

class Meter_Indicator_Module : public Module
{
Fl_Scalepack *dpm_pack;


bool _pad;

volatile float *control_value;

bool _disable_context_menu;

public:

virtual void update ( void );

void disable_context_menu ( bool b ) { _disable_context_menu = b; }

void handle_control_changed ( Port *p );

Meter_Indicator_Module ( bool is_default = false );
virtual ~Meter_Indicator_Module ( );

bool allows_external_control ( void ) const { return false; }
const char *name ( void ) const { return "Meter Indicator"; }

int can_support_inputs ( int ) { return 0; }
bool configure_inputs ( int ) { return false; }

void pad ( bool v ) { _pad = v; }

static void cb_handle ( Fl_Widget *w, void *v );
void cb_handle ( Fl_Widget *w );

void connect_to ( Port *p );

LOG_CREATE_FUNC( Meter_Indicator_Module );

void process ( nframes_t );

protected:

void get ( Log_Entry &e ) const;
void set ( Log_Entry &e );

virtual void draw ( void )
{
// draw_box();
Fl_Group::draw();
}

virtual int handle ( int m );

private:

};

+ 0
- 185
mixer/src/Meter_Module.C View File

@@ -1,185 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2009 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

#include "const.h"

#include <math.h>
#include <FL/Fl.H>
#include <FL/Fl_Single_Window.H>

#include "FL/Fl_Scalepack.H"
#include "FL/test_press.H"

#include "Meter_Module.H"
#include "DPM.H"
#include "JACK/Port.H"
#include "dsp.h"


Meter_Module::Meter_Module ( )
: Module ( 50, 100, name() )
{
box( FL_NO_BOX );
dpm_pack = new Fl_Scalepack( x(), y(), w(), h() );
dpm_pack->type( FL_HORIZONTAL );

control_value = 0;

color( FL_BLACK );

end();

Port p( this, Port::OUTPUT, Port::CONTROL, "dB level" );
p.hints.type = Port::Hints::LOGARITHMIC;
p.hints.ranged = true;
p.hints.maximum = 6.0f;
p.hints.minimum = -70.0f;
p.hints.dimensions = 1;
p.connect_to( new float[1] );
p.control_value_no_callback( -70.0f );

add_port( p );

log_create();
}

Meter_Module::~Meter_Module ( )
{
if ( control_value )
delete[] control_value;

log_destroy();
}


void
Meter_Module::update ( void )
{
for ( int i = dpm_pack->children(); i--; )
{
((DPM*)dpm_pack->child( i ))->value( control_value[i] );
control_value[i] = -70.0f;
}
}

bool
Meter_Module::configure_inputs ( int n )
{
THREAD_ASSERT( UI );

int on = audio_input.size();

if ( n > on )
{
for ( int i = on; i < n; ++i )
{
DPM *dpm = new DPM( 0, 0, w(), h() );
dpm->type( FL_VERTICAL );
align( (Fl_Align)(FL_ALIGN_CENTER | FL_ALIGN_INSIDE ) );

dpm_pack->add( dpm );

add_port( Port( this, Port::INPUT, Port::AUDIO ) );
add_port( Port( this, Port::OUTPUT, Port::AUDIO ) );

}
}
else
{
for ( int i = on; i > n; --i )
{
DPM *dpm = (DPM*)dpm_pack->child( dpm_pack->children() - 1 );
dpm_pack->remove( dpm );
delete dpm;

audio_input.back().disconnect();
audio_input.pop_back();
audio_output.back().disconnect();
audio_output.pop_back();
}
}

control_output[0].hints.dimensions = n;
delete[] (float*)control_output[0].buffer();
{
float *f = new float[n];

for ( int i = n; i--; )
f[i] = -70.0f;

control_output[0].connect_to( f );
}

if ( control_value )
delete [] control_value;

control_value = new float[n];
for ( int i = n; i--; )
control_value[i] = -70.0f;

if ( control_output[0].connected() )
control_output[0].connected_port()->module()->handle_control_changed( control_output[0].connected_port() );

return true;
}


int
Meter_Module::handle ( int m )
{
switch ( m )
{
case FL_PUSH:
{
int r = 0;
if ( test_press( FL_BUTTON1 ) )
{
/* don't let Module::handle eat our click */
r = Fl_Group::handle( m );
}
return Module::handle( m ) || r;
}
}

return Module::handle( m );
}


/**********/
/* Engine */
/**********/


void
Meter_Module::process ( nframes_t nframes )
{
for ( unsigned int i = 0; i < audio_input.size(); ++i )
{
// float dB = 20 * log10( get_peak_sample( (float*)audio_input[i].buffer(), nframes ) / 2.0f );
float dB = 20 * log10( buffer_get_peak( (sample_t*) audio_input[i].buffer(), nframes ) );

((float*)control_output[0].buffer())[i] = dB;
if (dB > control_value[i])
control_value[i] = dB;
}
}

+ 0
- 51
mixer/src/Meter_Module.H View File

@@ -1,51 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2009 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

#pragma once

#include "Module.H"

class Fl_Scalepack;

class Meter_Module : public Module
{
Fl_Scalepack *dpm_pack;

volatile float *control_value;

public:

Meter_Module ( );
virtual ~Meter_Module ( );

const char *name ( void ) const { return "Meter"; }

int can_support_inputs ( int n ) { return n > 0 ? n : -1; }
bool configure_inputs ( int n );

LOG_CREATE_FUNC( Meter_Module );

virtual void update ( void );

protected:

virtual int handle ( int m );
virtual void process ( nframes_t nframes );
virtual void draw ( void ) { draw_box(x(),y(),w(),h()); }
};

+ 0
- 1310
mixer/src/Mixer.C
File diff suppressed because it is too large
View File


+ 0
- 176
mixer/src/Mixer.H View File

@@ -1,176 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2009 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

#pragma once

#include <FL/Fl.H>
#include <FL/Fl_Widget.H>
#include <FL/Fl_Group.H>
#include <FL/Fl_Scroll.H>
#include <FL/Fl_Pack.H>
#include "Mixer_Strip.H"

#include "Thread.H"

class Fl_Blink_Button;
class Fl_Flowpack;
class Fl_Menu_Bar;
class Spatialization_Console;
namespace OSC { class Endpoint; }
#include <lo/lo.h>
class Group;

class Mixer : public Fl_Group
{

public:

OSC::Endpoint *osc_endpoint;
Fl_Button *sm_blinker;

private:

float _update_interval;

static void show_tooltip ( const char *s );
static void hide_tooltip ( void );

int _rows;
int _strip_height;

Fl_Color system_colors[3];

Mixer_Strip* track_by_name ( const char *name );

void snapshot ( void );
static void snapshot ( void *v ) { ((Mixer*)v)->snapshot(); }

void cb_menu(Fl_Widget*);
static void cb_menu(Fl_Widget*, void*);

Fl_Menu_Bar *menubar;
Fl_Scroll *scroll;
Fl_Pack *pack;
Fl_Box *project_name;
Fl_Box *_status;

Fl_Flowpack *mixer_strips;

void load_options ( void );
void save_options ( void );
void save_translations ( void );
void load_translations ( void );

static void send_feedback_cb ( void *v );
void send_feedback ( void );
void redraw_windows ( void );

static void handle_dirty ( int, void *v );

static int osc_non_hello ( const char *, const char *, lo_arg **, int , lo_message msg, void * );
static int osc_strip_by_number ( const char *, const char *, lo_arg **, int , lo_message msg, void * );

static void update_cb ( void * );
void update_cb ( void );


public:
void auto_connect ( void );
void maybe_auto_connect_output ( Module::Port *p );
std::list<std::string> get_auto_connect_targets ( void );
Group * group_by_name ( const char * name );
char *get_unique_group_name ( const char *name );

std::list <Group*> groups;
Group *group ( int n );
void add_group ( Group *g );
void remove_group ( Group *g );
void update_menu ( void );

static Spatialization_Console *spatialization_console;

int nstrips ( void ) const;
Mixer_Strip* track_by_number ( int n );

void update_frequency ( float f );
void status ( const char *s ) {
if ( s ) _status->copy_label( s );
else _status->label(0);
_status->redraw(); }

virtual int handle ( int m );

char * get_unique_track_name ( const char *name );

int min_h ( void ) const { return Mixer_Strip::min_h() + (18 * 2); }

void rows ( int n );
virtual void resize ( int X, int Y, int W, int H );

void new_strip ( void );
void add ( Mixer_Strip *ms );
void remove ( Mixer_Strip *ms );
void move_left ( Mixer_Strip *ms );
void move_right ( Mixer_Strip *ms );
void insert ( Mixer_Strip *ms, Mixer_Strip *before );
void insert ( Mixer_Strip *ms, int i );
bool contains ( Mixer_Strip *ms );
Mixer_Strip * event_inside ( void );
int find_strip ( const Mixer_Strip *m ) const;

bool save ( void );
void quit ( void );

Mixer ( int X, int Y, int W, int H, const char *L );
virtual ~Mixer();

void handle_hello ( lo_message msg );

void announce ( const char *nash_url, const char *process_name );

int init_osc ( const char* osc_port );

void sm_active ( bool b );

void say_hello ( void );

void save_default_project_settings ( void );
void load_default_project_settings ( void );
void reset_project_settings ( void );
void save_project_settings ( void );
void load_project_settings ( void );

public:
void command_toggle_fader_view ( void );
void command_clear_mappings ( void );
void command_new ( void );
bool command_save ( void );
bool command_load ( const char *path, const char *display_name = 0 );
bool command_new ( const char *path, const char *display_name = 0 );
void command_quit ( void );

void command_add_strip ( void );

};

extern Mixer* mixer;

+ 0
- 1263
mixer/src/Mixer_Strip.C
File diff suppressed because it is too large
View File


+ 0
- 188
mixer/src/Mixer_Strip.H View File

@@ -1,188 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2010 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

#pragma once

#include <FL/Fl.H>
#include "DPM.H"
#include "Panner.H"
#include <FL/Fl_Scalepack.H>
#include <FL/Fl_Pack.H>
#include <FL/Fl_Flip_Button.H>
#include <FL/Fl_Dial.H>
#include <FL/Fl_Group.H>
#include <FL/Fl_Box.H>
#include <FL/Fl_Button.H>
#include <FL/Fl_Value_Slider.H>
#include <FL/Fl_Counter.H>
#include <FL/Fl_Progress.H>
#include <JACK/Port.H>


#include "../FL/Fl_Sometimes_Input.H"

#include "Loggable.H"
class Chain;
class Fl_Flowpack;
class Controller_Module;
class Meter_Indicator_Module;
class Module;
class Fl_Flip_Button;
class Fl_Input;
class Fl_Menu_;
class Fl_Menu_Button;
class Fl_Choice;
class Group;

#include "Module.H"

class Mixer_Strip : public Fl_Group, public Loggable {

public:

static int min_h ( void ) { return 333; }

Mixer_Strip( const char *strip_name );
Mixer_Strip(); /* for log create */
virtual ~Mixer_Strip();

void chain ( Chain *c );
Chain *chain ( void ) { return _chain; }

virtual void log_children ( void ) const;

virtual void color ( Fl_Color c );
virtual Fl_Color color ( void ) const;

LOG_CREATE_FUNC( Mixer_Strip );

static void configure_outputs ( Fl_Widget *o, void *v );
void configure_outputs ( void );

bool configure_ports ( int n );

void handle_module_added ( Module *m );
void handle_module_removed ( Module *m );

void update ( void );

void name ( const char *name );
const char *name ( void ) const { return label(); }

private:

char *_auto_input;
void auto_input ( const char *s );
unsigned int _dsp_load_index;

/* used to defer setting the mode of the gain controller until the
chain has been added and the controller connected to a default
module */
int _gain_controller_mode;
int _mute_controller_mode;
bool _manual_connection;

Fl_Menu_Button *output_connection_button;
Fl_Flip_Button *width_button;
Fl_Flip_Button *tab_button;
Fl_Button *close_button;
Fl_Input *name_field;
Fl_Choice *group_choice;

Fl_Flowpack *controls_pack;
Fl_Group *tab_group;
Fl_Group *signal_tab;
Fl_Group *fader_tab;
Fl_Pack *panner_pack;

Chain *_chain;
Group *_group;

Fl_Box *spatialization_label;
Controller_Module *gain_controller;
Controller_Module *mute_controller;
Controller_Module *jack_input_controller;
Controller_Module *spatialization_controller;
Meter_Indicator_Module *meter_indicator;

Fl_Progress *dsp_load_progress;

Fl_Box *color_box;

nframes_t nframes;

Fl_Color _color;

void init ( );
void cb_handle(Fl_Widget*);
static void cb_handle(Fl_Widget*, void*);

void set_tab ( void );

void update_port_names ( void );

void menu_cb ( const Fl_Menu_ *m );
static void menu_cb ( Fl_Widget *w, void *v );
Fl_Menu_Button & menu ( void ) const;

static void snapshot ( void *v );
void snapshot ( void );
bool export_strip ( const char *filename );

void set_spatializer_visibility ( void );

protected:

void get ( Log_Entry &e ) const;
void set ( Log_Entry &e );

virtual int handle ( int m );
virtual void draw ( void );

public:

void manual_connection ( bool b );
bool has_group_affinity ( void ) const;
void auto_connect_outputs ( void );
bool maybe_auto_connect_output ( Module::Port *p );
void get_output_ports ( std::list<std::string> &ports );

void update_group_choice ( void );

Controller_Module *spatializer ( void );

Group *group ( void ) { return _group;}

// int group ( void ) const;
void group ( Group * );
void send_feedback ( void );
int number ( void ) const;
static bool import_strip ( const char *filename );

void command_toggle_fader_view ( void );
void command_move_left ( void );
void command_move_right ( void );
void command_close ( void );
void command_rename ( const char * s );
void command_width ( bool b );
void command_view ( bool b );

};

+ 0
- 1426
mixer/src/Module.C
File diff suppressed because it is too large
View File


+ 0
- 578
mixer/src/Module.H View File

@@ -1,578 +0,0 @@

/*******************************************************************************/
/* Copyright (C) 2009 Jonathan Moore Liles */
/* */
/* This program is free software; you can redistribute it and/or modify it */
/* under the terms of the GNU General Public License as published by the */
/* Free Software Foundation; either version 2 of the License, or (at your */
/* option) any later version. */
/* */
/* This program is distributed in the hope that it will be useful, but WITHOUT */
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */
/* more details. */
/* */
/* You should have received a copy of the GNU General Public License along */
/* with This program; see the file COPYING. If not,write to the Free Software */
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
/*******************************************************************************/

#pragma once

#include <FL/Fl.H>
#include <FL/Fl_Group.H>

#include <stdlib.h>
#include "debug.h"
#include <vector>

#include "Thread.H"

#include "Loggable.H"
#include "JACK/Port.H"
#include "OSC/Endpoint.H"
#include <list>
#include <algorithm>

class Chain;
class Module_Parameter_Editor;
class Fl_Menu_;
class Fl_Menu_Button;
class Fl_Button;
class Mixer_Strip;

class Module : public Fl_Group, public Loggable {

int _ins;
int _outs;
int _instances;
nframes_t _nframes;
Chain *_chain;
bool _is_default;

static nframes_t _sample_rate;
static Module *_copied_module_empty;
static char *_copied_module_settings;

void init ( void );

void insert_menu_cb ( const Fl_Menu_ *m );
static void insert_menu_cb ( Fl_Widget *w, void *v );

void menu_cb ( const Fl_Menu_ *m );
static void menu_cb ( Fl_Widget *w, void *v );
Fl_Menu_Button & menu ( void ) const;

bool copy ( void ) const;
void paste_before ( void );

protected:

Module_Parameter_Editor *_editor;

volatile bool _bypass;

public:

virtual nframes_t get_module_latency ( void ) const { return 0; }

virtual void get_latency ( JACK::Port::direction_e dir, nframes_t *min, nframes_t *max ) const;
virtual void set_latency ( JACK::Port::direction_e dir, nframes_t min, nframes_t max );

/* true if this module was added by default and not under normal user control */
bool is_default ( void ) const { return _is_default; }
void is_default ( bool v ) { _is_default = v; }
virtual void update ( void ) {}

virtual void update_tooltip ( void );

class Port
{

/* support multiple connection for audio ports (many to one, one to many, many to many).
control ports only support one to one and one to many. */

/* char *type_names[] = { "Audio", "Control" }; */
/* char *direction_names[] = { "Input", "Output" }; */

void update_connected_port_buffer ( void )
{
if ( connected() )
connected_port()->_buf = _buf;
}

public:

enum Direction { INPUT, OUTPUT };
enum Type { AUDIO, CONTROL, AUX_AUDIO };

/* hints for control ports (specifically control inputs) */
struct Hints
{
enum Type { LINEAR, LOGARITHMIC, BOOLEAN, INTEGER };

Type type;
bool ranged;
float minimum;
float maximum;
float default_value;
int dimensions;
bool visible;

Hints ( )
{
type = LINEAR;
ranged = false;
minimum = 0;
maximum = 1; /* FIXME: totally bogus, but some
* plugins (SWH delays) don't
* provide an upper bound. */
default_value = 0.0f;
dimensions = 1;
visible = true;
}
};

static int osc_control_change_exact ( float v, void *user_data );
static int osc_control_change_cv ( float v, void *user_data );

Hints hints;

Port ( Module *module, Direction direction, Type type, const char *name = 0 )
{
_name = name;
_direction = direction;
_type = type;
_buf = 0;
_nframes = 0;
_module = module;
_scaled_signal = 0;
_unscaled_signal = 0;
_by_number_path = 0;
_by_number_number = -1;
_jack_port = 0;
}

Port ( const Port& p )
{
_name = p._name;
_direction = p._direction;
_type = p._type;
_buf = p._buf;
_nframes = p._nframes;
_module = p._module;
hints = p.hints;
_scaled_signal = p._scaled_signal;
_unscaled_signal = p._unscaled_signal;
_by_number_path = 0;
_by_number_number = -1;
_jack_port = p._jack_port;
}

virtual ~Port ( )
{
if ( _by_number_path )
free( _by_number_path );
_by_number_path = NULL;
}

const char *name ( void ) const { return _name; }
Type type ( void ) const { return _type; }
Direction direction ( void ) const { return _direction; }

Module * module ( void ) const { return _module; }
nframes_t nframes ( void ) const { return _nframes; }

void buffer ( void *buf, nframes_t nframes ) { _buf = buf; _nframes = nframes; };
void *buffer ( void ) const { return _buf; }

OSC::Signal *scaled_signal ( void ) { return _scaled_signal; }

int _by_number_number;
char *_by_number_path;

const char *osc_path ( )
{
if ( _scaled_signal )
return _scaled_signal->path();
else
return NULL;
}

const char *osc_number_path ( void );

void update_osc_port ( )
{
// if ( INPUT == _direction )
change_osc_path( generate_osc_path() );
}

void destroy_osc_port ( )
{
delete _unscaled_signal;
delete _scaled_signal;
_unscaled_signal = _scaled_signal = NULL;
}

void control_value_no_callback ( float f )
{
/* can also be called from the OSC thread */
ASSERT( Thread::is( "UI" ) || Thread::is( "OSC" ),
"Function called from wrong thread! (is %s)", Thread::current()->name() );

if ( buffer() )
{
*((float*)buffer()) = f;
}
}

void control_value ( float f )
{
control_value_no_callback( f );
_module->handle_control_changed( this );
if ( connected() )
connected_port()->_module->handle_control_changed( connected_port() );
}

float control_value ( void ) const
{
if ( buffer() )
return *((float*)buffer());
else
return 0.0f;
}

bool connected ( void ) const {
if ( _type == Port::AUDIO )
/* internal audio ports are considered connected by the buffer setting */
return _buf != 0;
else
/* control and external audio ports belong to a graph */
return _connected.size() > 0;
}
bool connected_osc ( void ) const;

Port *connected_port ( void ) const
{
ASSERT( _type == Port::CONTROL, "Operation only available for control ports" );
return _connected.size() == 0 ? NULL : _connected.front();
}

void connect_to ( Port *to )
{
if ( _type != Port::AUX_AUDIO )
{
_buf = to->_buf;
}

if ( jack_port() && to->jack_port() )
jack_port()->connect( to->jack_port()->jack_name() );

if ( std::find(_connected.begin(),_connected.end(),to) == _connected.end() )
{
_connected.push_back(to);
to->_connected.push_back(this);
}
}


/* disconnect this port from any ports of modules belonging to strip /o/ */
void disconnect_from_strip ( Mixer_Strip *o );
void connect_to ( void *buf )
{
ASSERT( _type == Port::CONTROL, "Operation only available for control ports" );
_buf = buf;
update_connected_port_buffer();
}

void set_buffer ( void *buf )
{
ASSERT( _type != Port::CONTROL, "Operation only available for audio ports" );
_buf = buf;
}

void send_feedback ( void );

bool connected_to ( Port *p )
{
return std::find( _connected.begin(), _connected.end(), p ) != _connected.end();
}
/* disconnect from specified port */
void disconnect ( Port *p )
{
if ( ! connected_to(p) )
return;

if ( _type == Port::CONTROL && p->_module )
p->_module->handle_control_disconnect( this );
if ( jack_port() && p->jack_port() )
jack_port()->disconnect( p->jack_port()->jack_name() );

_connected.remove(p);
p->_connected.remove(this);
}
/* disconnect from *all* connected ports */
void disconnect ( void )
{
if ( _connected.size() )
{
for ( std::list<Port*>::iterator i = _connected.begin(); i != _connected.end(); i++ )
{
Port *p = *i;

/* iterator about to be invalidated... */
i = _connected.erase(i);
disconnect(p);
}
}
}

void jack_port ( JACK::Port *v ) { _jack_port = v; }
JACK::Port *jack_port ( void ) const { return _jack_port; }

private:

char *generate_osc_path ( void );
void change_osc_path ( char *path );

std::list <Port*> _connected;
Type _type;
Direction _direction;
const char *_name;
void *_buf;
nframes_t _nframes;
Module *_module;
/* used for auxilliary I/Os */
JACK::Port *_jack_port;

OSC::Signal *_scaled_signal;
OSC::Signal *_unscaled_signal;

static void handle_signal_connection_state_changed ( OSC::Signal *, void *o );
};

void bbox ( int &X, int &Y, int &W, int &H )
{
X += + 5;
Y += 5;
W -= 10;
H -= 10;
}

Module ( int W, int H, const char *L = 0 );
Module ( );
Module ( bool is_default, int W, int H, const char *L = 0 );

virtual ~Module ( );

LOG_NAME_FUNC( Module );

nframes_t nframes ( void ) const { return _nframes; }
virtual void resize_buffers ( nframes_t v ) { _nframes = v; }


int instances ( void ) const { return _instances; }
void instances ( int i ) { _instances = i; }

bool is_being_controlled ( void ) const
{
for ( nframes_t i = control_input.size(); i--; )
if ( control_input[i].connected() )
return true;
return false;
}

bool is_controlling ( void ) const
{
for ( nframes_t i = control_output.size(); i--; )
if ( control_output[i].connected() )
return true;
return false;
}

/* bool */
/* is_being_controlled_osc ( void ) const */
/* { */
/* for ( nframes_t i = control_input.size(); i--; ) */
/* if ( control_input[i].connected_osc() ) */
/* return true; */
/* return false; */
/* } */

virtual const char *name ( void ) const = 0;
virtual const char *basename ( void ) const { return "Module"; }

std::vector<Port> audio_input;
std::vector<Port> audio_output;
std::vector<Port> control_input;
std::vector<Port> control_output;
std::vector<Port> aux_audio_input;
std::vector<Port> aux_audio_output;

void add_port ( const Port &p )
{
if ( p.type() == Port::AUDIO && p.direction() == Port::INPUT )
audio_input.push_back( p );
else if ( p.type() == Port::AUDIO && p.direction() == Port::OUTPUT )
audio_output.push_back( p );
else if ( p.type() == Port::CONTROL && p.direction() == Port::INPUT )
control_input.push_back( p );
else if ( p.type() == Port::CONTROL && p.direction() == Port::OUTPUT )
control_output.push_back( p );
}

int noutputs ( void ) const
{
return audio_output.size();
}

int ninputs ( void ) const
{
return audio_input.size();
}

int ncontrol_inputs ( void ) const
{
return control_input.size();
}

int ncontrol_outputs ( void ) const
{
return control_output.size();
}

int nvisible_control_inputs ( void ) const
{
int n = 0;
for ( std::vector<Port>::const_iterator i = control_input.begin();
i != control_input.end();
i++ )
if ( i->hints.visible )
n++;

return n;
}

virtual bool bypass ( void ) const { return _bypass; }
virtual void bypass ( bool v ) { _bypass = v; }

virtual bool bypassable ( void ) const
{
return ninputs() == noutputs() ||
( ninputs() == 1 && noutputs() == 2 );
}

int control_input_port_index ( Port *p )
{
for ( nframes_t i = control_input.size(); i--; )
if ( &control_input[i] == p )
return i;

return -1;
}

int control_output_port_index ( Port *p )
{
for ( nframes_t i = control_output.size(); i--; )
if ( &control_output[i] == p )
return i;

return -1;
}

Chain *chain ( void ) const { return _chain; }
void chain ( Chain * v );

char *get_parameters ( void ) const;
void set_parameters ( const char * );

bool show_analysis_window ( void );

void send_feedback ( void );
virtual bool initialize ( void ) { return true; }

/* for the given number of inputs, return how many outputs this
* plugin would have. -1 if this plugin can't support so many
* inputs. */
virtual int can_support_inputs ( int n ) = 0;
/* called by the chain whenever we need to adjust our input
* channel configuration, but only if can_support_inputs() returns
* true */
virtual bool configure_inputs ( int n ) = 0;

virtual void process ( nframes_t ) = 0;

/* called whenever the module is initialized or when the sample rate is changed at runtime */
virtual void handle_sample_rate_change ( nframes_t sample_rate ) {}
/* called whenever the value of a control port is changed.
This can be used to take appropriate action from the GUI thread */
virtual void handle_control_changed ( Port * );
virtual void handle_control_disconnect ( Port * ) {}
/* called whenever the name of the chain changes (usually because
* the name of the mixer strip changed). */
virtual void handle_chain_name_changed ();

virtual void handle_port_connection_change () {}

/* module should create a new context, run against this impulse,
* and return true if there's anything worth reporting */
virtual bool get_impulse_response ( sample_t *buf, nframes_t nframes )
{
return false;
}

#define MODULE_CLONE_FUNC(class) \
virtual Module *clone_empty ( void ) const \
{ \
return new class (); \
}

virtual Module *clone_empty ( void ) const { return NULL; }
Module *clone ( Chain *dest ) const;
Module *clone ( void ) const;

protected:

void draw_connections ( void );
void draw_label ( int X, int Y, int W, int H );
void draw_box ( int X, int Y, int W, int H );

virtual void draw ( void ) { Module::draw_box(x(),y(),w(),h()); Module::draw_label(x(),y(),w(),h()); }
virtual int handle ( int m );

virtual void get ( Log_Entry &e ) const;
virtual void set ( Log_Entry &e );

bool add_aux_port ( bool input, const char *prefix, int n , JACK::Port::type_e type );

public:
nframes_t sample_rate ( void ) const { return Module::_sample_rate; }


void auto_connect_outputs();
void auto_disconnect_outputs();

void freeze_ports ( void );
void thaw_ports ( void );

bool add_aux_audio_output ( const char *prefix, int n );
bool add_aux_audio_input ( const char *prefix, int n );
bool add_aux_cv_input ( const char *prefix, int n );

static void set_sample_rate ( nframes_t srate ) { _sample_rate = srate; }

void command_open_parameter_editor();
virtual void command_activate ( void );
virtual void command_deactivate ( void );
virtual void command_remove ( void );

};

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save