Help us understand the problem. What is going on with this article?

Delphi VCLでFluent Designに挑戦(その2) - Reveal Highlight

More than 1 year has passed since last update.

Delphi Advent Calender 2018の18日の記事です。

Delphi VCLでFluent Designに挑戦(その1) - Arcylic Form (アクリル フォーム)
https://qiita.com/p_kato/private/eb8c2d166506b7944b9a
では,Delphi VCLでアクリルフォームの表示をして,移動やリサイズができるようにしました。今回は,その1で作成したアクリルフォームに載せることができるメニューボタンを作ろうと思います。

Windowsアプリの制作者のためのFluent Design System
https://docs.microsoft.com/ja-jp/windows/uwp/design/fluent-design-system/
の「ライトの使用」に書かれている効果を追加したいと思います。このボタンは既にWindows10のEdgeのボタンやURL表示,Newsアプリのメニュー,計算機アプリのボタンなどで実装が進んでいるようです。

ボタンの周りに輪郭線とボヤっとした光(Reveal focus)を追加するのであれば,FMXなら簡単にできそうですね。VCLだとどのようにかけるかトライしたいと思います。

Reveal Highlightの実現方法

表示を見ていると,ボタンが光っている周りのボタンも影響を受けているようです。
そこで,複数のボタンを一つのコントロールで表示することにします。
また,アクリルフォームに重ねるコントロールはTWinControlではせっかくアクリルに表示された効果が上書きされてしまいましたので。TControlから選ぶことにし,TImageをベースにすることにしました。

光の当たっていない画像と光の当たった画像を2つ用意して,光の当たった部分と光の当たっていない部分を重ね合わせた画像を生成するようにしました。
字は16x16の白黒のアイコンから文字と同じ色で描画し,文字とアイコンは不透明で描画しその他のところはアルファブレンディングすることにしました。
メニューの文字はTStringListで格納し,アイコンはImageListでbf32bitで格納しました。0番目のメニューはStringList[0]とImageList[0]に対応します。
そして,ボタンの描画はTimerで集約します。OnMouseLeaveが期待したタイミングでもらえなかったので,Timerでマウスカーソルがボタンから離れた時の処理を書きます。
メニューが選択された結果はOnMouseUpイベントに書かれた処理の後,RMenuIndexに格納されます。
なお,ライトのマスクは,お絵かきソフトで黒地に光の当たる部分を白にしたBMPファイルからデータを作りました。

Reveal Highlightを実現させるユニット

アクリルフォームと合わせて以下のようなユニットを作りました。

unit uFluent;

interface

uses
  System.Types, System.Classes,
  winapi.Windows, winapi.Messages,
  Vcl.Graphics, Vcl.Forms, Vcl.Controls, Vcl.ExtCtrls, Vcl.Imaging.pngimage;

// acrylic form

var
  FAllowSize: Boolean=True; // フォームをリサイズできる
  FAllowMove: Boolean=True; // フォームを移動できる

function AcrylicFormSet(AForm:TForm;AColor:UInt32):integer;
procedure _WMNCHitTest(AForm:TForm;var Msg: TWMNCHitTest);

// Reveal Menu

var
  RMenuList:TStringList; // メニューのラベル名
  RMenuIndex:integer;    // メニューで選択されたIndex

procedure RMenuCreate; // メニューの初期化
procedure RMenuUpdate(AWidth,AHeight:integer); // メニューの情報を更新
procedure RMenuDestroy; // メニューを破棄

procedure RMenuColorsSet(AColor:TColor); // AColorから全体の色セットを設定する

procedure RMenuMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); // メニューのOnMouseDown処理
procedure RMenuMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); // メニューのOnMouseMove処理
procedure RMenuMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); // メニューのOnMouseUp処理
procedure RMenuTimer(AHandle:HWND;AImage:TImage;AImageList:TImageList); // メニューのOnTimerの処理

implementation

uses
  Vcl.GraphUtil;

type
  AccentPolicy = packed record
    AccentState: Integer;
    AccentFlags: Integer;
    GradientColor: Integer;
    AnimationId: Integer;
  end;

  WindowCompositionAttributeData = packed record
    Attribute: Cardinal;
    Data: Pointer;
    SizeOfData: Integer;
  end;

var
  SetWindowCompositionAttribute:function (hWnd: HWND; var data: WindowCompositionAttributeData):integer; stdcall;

function AcrylicFormSet(AForm:TForm;AColor:UInt32):integer;
const
  WCA_ACCENT_POLICY = 19;
  ACCENT_ENABLE_ACRYLICBLURBEHIND = 4; // Windows 10 April 2018 Update
  DrawLeftBorder = $20;
  DrawTopBorder = $40;
  DrawRightBorder = $80;
  DrawBottomBorder = $100;

var
  dwm10: THandle;
  data: WindowCompositionAttributeData;
  accent: AccentPolicy;
begin
  Result:=-1;// Not found Windows 10 SetWindowCompositionAttribute in user32.dll

  AForm.GlassFrame.Bottom:=-1;
  AForm.GlassFrame.Top:=-1;
  AForm.GlassFrame.Left:=-1;
  AForm.GlassFrame.Right:=-1;
  AForm.GlassFrame.SheetOfGlass:=True;
  AForm.GlassFrame.Enabled:=True;
  AForm.BorderStyle := bsNone;
  AForm.BorderIcons := [biSystemMenu, biMinimize];
  AForm.DoubleBuffered:=True;

  dwm10 := LoadLibrary('user32.dll');
  try
    @SetWindowCompositionAttribute := GetProcAddress(dwm10, 'SetWindowCompositionAttribute');
    if @SetWindowCompositionAttribute <> nil then begin
      accent.AccentState := ACCENT_ENABLE_ACRYLICBLURBEHIND;
      accent.GradientColor := AColor;
      accent.AccentFlags := DrawLeftBorder or DrawTopBorder or DrawRightBorder or DrawBottomBorder;
      data.Attribute := WCA_ACCENT_POLICY;
      data.SizeOfData := SizeOf(accent);
      data.Data := @accent;
      SetWindowCompositionAttribute(AForm.Handle, data);
      Result:=0;
    end;
  finally
    FreeLibrary(dwm10);
  end;
end;

procedure _WMNCHitTest(AForm:TForm;var Msg: TWMNCHitTest);
const
  hCORNER: Integer=19;
  hWIDTH : Integer= 3;
  hHEIGHT: Integer=48;

var
  ScreenPt : TPoint;
  MoveArea : TRect;
begin
  Msg.Result :=HTTRANSPARENT;
  if not (csDesigning in AForm.ComponentState) then begin
    ScreenPt := AForm.ScreenToClient(Point(Msg.Xpos, Msg.Ypos));
    if FAllowSize then begin
      if (ScreenPt.x <  hCORNER)and(ScreenPt.y <  hCORNER) then begin                             // top left corner
        Msg.Result := HTTOPLEFT
      end else if (ScreenPt.x <  hCORNER)and(ScreenPt.y >= AForm.Height-hCORNER) then begin       // bottom left corner
        Msg.Result := HTBOTTOMLEFT
      end else if (ScreenPt.x >= AForm.Width-hCORNER)and(ScreenPt.y <  hCORNER) then begin        // top right corner
        Msg.Result := HTTOPRIGHT
      end else if (ScreenPt.x >= AForm.Width-hCORNER)and(ScreenPt.y >= AForm.Height-hCORNER) then begin // bottom right corner
        Msg.Result := HTBOTTOMRIGHT
      end else if (ScreenPt.x<hWIDTH) then begin              // left side
        Msg.Result := HTLEFT
      end else if (ScreenPt.y<hWIDTH) then begin              // top side
        Msg.Result := HTTOP
      end else if (ScreenPt.x>=AForm.Width -hWIDTH) then begin // right side
        Msg.Result := HTRIGHT
      end else if (ScreenPt.y>=AForm.Height-hWIDTH) then begin // bottom side
        Msg.Result := HTBOTTOM
      end;
    end;
  end;
  if FAllowMove then begin // スクリーンをドラッグで動かしたい場合 上部だけ
    MoveArea := Rect(hWIDTH, hWIDTH, AForm.Width - hWIDTH, hHEIGHT - hWIDTH);
    if PtInRect(MoveArea, ScreenPt) then begin
      Msg.Result := HTCAPTION;
    end;
  end;
end;

// Reveal Menu

const
  fdw0=256;  // メニューの最大幅
  fdw1=16;   // マージン アイコンの左上
  fdw2=16*2; // アイコンの右下
  fdw3=16*3; // 48 メニューの高さ
  fdw4=16*4; // 64 文字の左上
  fdw5=fdw0-fdw1; // 240 文字の右下

// 表示モード

type
  TMenuState=(msNone,msNormal,msHover,msSelected,msNotUse); // ボタンの表示モード

// 色指定

type
  TRMenuColor =array[0..2]of TColor;             // 一つの状態のボタンの色
  TRMenuColors=array[0..1,0..3]of TRMenuColor;
var
  RMenuColors:TRMenuColors; // ボタンのすべての状態の色を保存する
  RMenuNColor,RMenuSColor:TRMenuColor;

// ボタンの色指定にHLSを利用する

// 適正なL値S値に調整する
function HLS_LSAdjust(AValue:Word):Word;
begin
  if AValue>240 then begin
    Result:=240
  end else if AValue<0 then begin
    Result := 0;
  end else begin
    Result :=AValue;
  end;
end;

// 適正なL値H値に調整する
function HLS_HAdjust(AValue:Word):Word;
begin
  Result:=AValue mod 240;
end;

// H,L,Sを適切な値に調整してから適用する H:0-239 L:0-240 S:0-240
function ColorHLSToRGBAdjust(H,L,S:Word):TColor;
begin
  Result:=ColorHLSToRGB(HLS_HAdjust(H),HLS_LSAdjust(L),HLS_LSAdjust(S));
end;

procedure RMenuColorsSet(AColor:TColor); // 一つの色から全体の色セットを設定する
var
  H, L, S, H2:word;
begin
  ColorRGBToHLS(AColor,H, L, S);
  H2:=H+80;
  // オリジナル
  // msNormal
  RMenuColors[0,0,0]:=ColorHLSToRGBAdjust(H,L,120); // 線
  RMenuColors[0,0,1]:=ColorHLSToRGBAdjust(H,L,  0); // 字
  RMenuColors[0,0,2]:=ColorHLSToRGBAdjust(H,L,120); // 背景
  // msHover
  RMenuColors[0,1,0]:=ColorHLSToRGBAdjust(H2,160,240); // 線
  RMenuColors[0,1,1]:=ColorHLSToRGBAdjust(H2,240,200); // 字
  RMenuColors[0,1,2]:=ColorHLSToRGBAdjust(H2,160,120); // 背景
  // msSelected
  RMenuColors[0,2,0]:=ColorHLSToRGBAdjust(H2,  L,120); // 線
  RMenuColors[0,2,1]:=ColorHLSToRGBAdjust(H2,240,240); // 字
  RMenuColors[0,2,2]:=ColorHLSToRGBAdjust(H2,  L,120); // 背景
  // msNotUse
  RMenuColors[0,3,0]:=ColorHLSToRGBAdjust(H, 20,120); // 線
  RMenuColors[0,3,1]:=ColorHLSToRGBAdjust(H, 20,240); // 字
  RMenuColors[0,3,2]:=ColorHLSToRGBAdjust(H, 20,120); // 背景
  // スポットライト
  // msNormal
  RMenuColors[1,0,0]:=ColorHLSToRGBAdjust(H,200,240); // 線
  RMenuColors[1,0,1]:=ColorHLSToRGBAdjust(H,  L, 40); // 字
  RMenuColors[1,0,2]:=ColorHLSToRGBAdjust(H,  L,160); // 背景
  // msHover
  RMenuColors[1,1,0]:=ColorHLSToRGBAdjust(H2,  L,240); // 線
  RMenuColors[1,1,1]:=ColorHLSToRGBAdjust(H2,240,240); // 字
  RMenuColors[1,1,2]:=ColorHLSToRGBAdjust(H2,160,160); // 背景
  // msSelected
  RMenuColors[1,2,0]:=ColorHLSToRGBAdjust(H2,  L,240); // 線
  RMenuColors[1,2,1]:=ColorHLSToRGBAdjust(H2,240,200); // 字
  RMenuColors[1,2,2]:=ColorHLSToRGBAdjust(H2,  L,100); // 背景
  // msNotUse
  RMenuColors[1,3,0]:=ColorHLSToRGBAdjust(H, 20,  0); // 線
  RMenuColors[1,3,1]:=ColorHLSToRGBAdjust(H, 20,240); // 字
  RMenuColors[1,3,2]:=ColorHLSToRGBAdjust(H, 20,120); // 背景
end;


function RMenuColorOrgGet(AMenuState:TMenuState):TRMenuColor; // 色セットからオリジナル用ビットマップ色を取得
begin
  case AMenuState of
    msNormal:begin
      Result:=RMenuColors[0,0];
    end;
    msHover:begin
      Result:=RMenuColors[0,1];
    end;
    msSelected:begin
      Result:=RMenuColors[0,2];
    end;
    msNotUse,msNone:begin
      Result:=RMenuColors[0,3];
    end;
  end;
end;

function RMenuColorSptGet(AMenuState:TMenuState):TRMenuColor; // 色セットかスポットライト用ビットマップ色を取得
begin
  case AMenuState of
    msNormal:begin
      Result:=RMenuColors[1,0];
    end;
    msHover:begin
      Result:=RMenuColors[1,1];
    end;
    msSelected:begin
      Result:=RMenuColors[1,2];
    end;
    msNotUse,msNone:begin
      Result:=RMenuColors[1,3];
    end;
  end;
end;

procedure IconPDraw(ABitmap:TBitmap;AIndex,x,y:integer;AColor:TColor;AImageList:TImageList);
var
  i,j,i0,i1:integer;
  SL,SL0: pByteArray;
  Bitmap:TBitmap;
  r,g,b:byte;
begin
  r:=(AColor and $FF0000) shr 16;
  g:=(AColor and $00FF00) shr  8;
  b:=(AColor and $0000FF);
  Bitmap:=TBitmap.Create;
  Bitmap.PixelFormat:=TPixelFormat.pf24Bit;
  AImageList.GetBitmap(AIndex,Bitmap);
  for j:=0 to Bitmap.Height-1 do begin
    SL :=Bitmap.ScanLine[j];
    SL0:=ABitmap.ScanLine[j+y];
    for i:=0 to Bitmap.Width-1 do begin
      i0:=i*3;
      i1:=(i+x)*3;
      SL0[i1  ]:=trunc((r*SL[i0]+SL0[i0  ]*(255-SL[i0]))/255);
      SL0[i1+1]:=trunc((g*SL[i0]+SL0[i0+1]*(255-SL[i0]))/255);
      SL0[i1+2]:=trunc((b*SL[i0]+SL0[i0+2]*(255-SL[i0]))/255);
    end;
  end;
  Bitmap.Free;
end;

procedure IconMDraw(ABitmap:TBitmap;AIndex,x,y:integer;AImageList:TImageList);
var
  i,j,i0:integer;
  SL,SL0: pByteArray;
  Bitmap:TBitmap;
begin
  Bitmap:=TBitmap.Create;
  Bitmap.PixelFormat:=TPixelFormat.pf24Bit;
  AImageList.GetBitmap(AIndex,Bitmap);
  for j:=0 to Bitmap.Height-1 do begin
    SL :=Bitmap.ScanLine[j];
    SL0:=ABitmap.ScanLine[j+y];
    for i:=0 to Bitmap.Width-1 do begin
      i0:=(i+x)*3;
      SL0[i0  ]:=SL[i0];
      SL0[i0+1]:=SL[i0];
      SL0[i0+2]:=SL[i0];
    end;
  end;
  Bitmap.Free;
end;

procedure RMenuPDraw(ABitmap:TBitmap;AMenuList:TStringList;AImageList:TImageList;AIndex:integer);
var
  w,h,i,c:integer;
  ARect:TRect;
  s:string;
  MenuColor3:TRMenuColor;
begin
  c:=AMenuList.Count;
  w:=ABitmap.Width;
  h:=ABitmap.Height;
  ABitmap.Canvas.Brush.Color:=$FFFFFF;
  ABitmap.Canvas.Brush.Style:=bsSolid;
  ABitmap.Canvas.Pen.Style  :=psClear;
  ABitmap.Canvas.Rectangle(0,0,w+1,h+1);
  for i:=0 to c-1 do begin
    if (i=AIndex) then begin
      MenuColor3:=RMenuSColor;
      // 背景
      ABitmap.Canvas.Brush.Color:=MenuColor3[2];
      ABitmap.Canvas.Brush.Style:=bsSolid;
      ABitmap.Canvas.Pen.Style  :=psClear;
      ABitmap.Canvas.Rectangle(0,i*fdw3,w,(i+1)*fdw3);
    end else begin
      MenuColor3:=RMenuNColor;
    end;
    // アイコン
    IconPDraw(ABitmap,i,fdw1,i*fdw3+fdw1,MenuColor3[1],AImageList);
    // 文字
    ABitmap.Canvas.Brush.Style:=bsClear;
    ABitmap.Canvas.Font.Color:=MenuColor3[1];
    ABitmap.Canvas.Font.Name:='Sagoe UI';
    ABitmap.Canvas.Font.Height:=15;
    ARect:=Rect(fdw4,i*fdw3,fdw5,(i+1)*fdw3);
    s:=AMenuList[i];
    ABitmap.Canvas.TextRect(ARect,s,[TTextFormats.tfSingleLine,TTextFormats.tfVerticalCenter]);
    // 線
    if MenuColor3[2]<>MenuColor3[0] then begin
      ABitmap.Canvas.Brush.Style:=bsClear;
      ABitmap.Canvas.Pen.Style:=psSolid;
      ABitmap.Canvas.Pen.Color:=MenuColor3[0];
      ABitmap.Canvas.Pen.Width:=1;
      ABitmap.Canvas.Rectangle(1,i*fdw3+1,w-1,(i+1)*fdw3-1);
    end;
  end;
//  ABitmap.SaveToFile('d:\pascal\desktop\test.bmp');
end;

procedure RMenuMDraw(ABitmap:TBitmap;AMenuList:TStringList;AImageList:TImageList);
var
  w,h,i,c:integer;
  ARect:TRect;
  s:string;
begin
  c:=AMenuList.Count;
  w:=ABitmap.Width;
  h:=ABitmap.Height;
  ABitmap.Canvas.Brush.Color:=$000000;
  ABitmap.Canvas.Brush.Style:=bsSolid;
  ABitmap.Canvas.Pen.Style  :=psClear;
  ABitmap.Canvas.Rectangle(0,0,w+1,h+1);
  for i:=0 to c-1 do begin
    // アイコン
    IconMDraw(ABitmap,i,fdw1,i*fdw3+fdw1,AImageList);
    // 文字
    ABitmap.Canvas.Brush.Style:=bsClear;
    ABitmap.Canvas.Font.Color:=$FFFFFF;
    ABitmap.Canvas.Font.Name:='Sagoe UI';
    ABitmap.Canvas.Font.Height:=15;
    ARect:=Rect(fdw4,i*fdw3,fdw5,(i+1)*fdw3);
    s:=AMenuList[i];
    ABitmap.Canvas.TextRect(ARect,s,[TTextFormats.tfSingleLine,TTextFormats.tfVerticalCenter]);
  end;
end;

const
  RMMaskMax=120; // 照明の直径
  RMMaskR  = 60; // 証明の半径
type
  TRMMask=array[0..RMMaskMax,0..RMMaskMax] of byte;

const
  RMMask:TRMMask=(
    ($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FE,$FE,$FD,$FE,$FE,$FE,$FD,$FD,$FC,$FB,$FB,$F9,$FA,$F9,$F8,$F7,$F6,$F4,$F4,$F4,$F1,$F0,$EF,$EE,$ED,$EB,$EA,$E8,$E8,$E6,$E4,$E3,$E1,$E1,$DF,$DE,$DD,$DC,$DB,$DB,$DA,$DA,$D9,$D9,$D8,$D8,$D8,$D9,$DA,$DA,$DB,$DB,$DC,$DD,$DE,$DF,$E0,$E1,$E4,$E4,$E6,$E7,$E8,$E9,$EA,$ED,$EE,$EF,$F0,$F2,$F3,$F4,$F5,$F6,$F7,$F8,$F9,$FA,$FB,$FB,$FC,$FC,$FC,$FD,$FD,$FE,$FE,$FE,$FE,$FE,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FE,$FE,$FE,$FE,$FD,$FD,$FD,$FC,$FB,$FA,$FA,$F9,$F8,$F7,$F6,$F5,$F3,$F3,$F2,$F1,$EE,$ED,$EC,$EA,$E8,$E7,$E5,$E3,$E2,$E0,$DF,$DD,$DD,$DA,$D8,$D7,$D6,$D5,$D4,$D3,$D3,$D2,$D2,$D0,$D1,$D1,$D1,$D2,$D2,$D2,$D4,$D4,$D5,$D6,$D7,$D8,$D9,$DB,$DC,$DD,$E0,$E1,$E4,$E4,$E6,$E7,$E9,$EB,$ED,$EE,$EF,$F2,$F2,$F4,$F5,$F5,$F7,$F9,$F8,$FA,$F9,$FA,$FB,$FC,$FC,$FD,$FD,$FE,$FE,$FE,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FE,$FE,$FE,$FD,$FD,$FC,$FC,$FB,$FB,$FA,$F8,$F8,$F7,$F6,$F5,$F4,$F3,$F1,$F0,$ED,$EC,$EB,$EA,$E8,$E5,$E3,$E1,$DF,$DD,$DC,$D9,$D8,$D5,$D4,$D2,$D0,$D0,$CE,$CD,$CC,$CB,$CA,$C9,$C8,$C9,$C9,$C8,$C8,$C9,$CA,$CA,$CB,$CC,$CD,$CE,$CE,$D1,$D2,$D3,$D5,$D7,$D9,$DA,$DC,$DE,$E0,$E2,$E4,$E7,$E9,$EA,$EC,$ED,$EF,$F0,$F2,$F4,$F5,$F7,$F7,$F8,$F8,$FA,$FA,$FB,$FC,$FD,$FD,$FD,$FE,$FE,$FE,$FE,$FD,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FE,$FE,$FE,$FE,$FE,$FD,$FD,$FC,$FC,$FB,$FA,$F9,$F9,$F8,$F7,$F6,$F3,$F3,$F1,$EF,$EE,$EB,$EA,$E7,$E7,$E4,$E2,$E1,$DD,$DB,$D8,$D5,$D5,$D2,$D0,$CE,$CB,$CA,$C8,$C6,$C5,$C4,$C2,$C2,$C0,$BF,$C0,$BF,$BE,$BF,$BE,$C0,$BF,$C0,$C2,$C2,$C4,$C5,$C6,$C8,$C9,$CA,$CD,$CF,$D1,$D3,$D5,$D7,$DA,$DC,$DE,$E1,$E3,$E5,$E7,$EA,$EC,$EC,$F0,$F0,$F2,$F4,$F4,$F6,$F7,$F9,$FA,$FB,$FB,$FC,$FC,$FB,$FD,$FE,$FE,$FE,$FE,$FE,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FE,$FE,$FE,$FE,$FD,$FC,$FC,$FC,$FB,$FA,$F9,$F7,$F7,$F5,$F5,$F4,$F2,$F0,$EF,$EC,$EA,$E7,$E6,$E4,$E1,$DF,$DC,$D9,$D6,$D4,$D1,$CF,$CB,$CA,$C7,$C5,$C2,$C1,$C0,$BD,$BC,$BA,$B8,$B7,$B5,$B6,$B5,$B4,$B3,$B3,$B3,$B5,$B5,$B6,$B7,$B8,$B9,$BB,$BD,$BE,$BF,$C2,$C3,$C6,$C8,$CA,$CD,$D0,$D3,$D5,$D8,$DB,$DD,$E0,$E3,$E6,$E7,$E9,$EB,$EE,$EE,$F0,$F3,$F3,$F5,$F7,$F7,$F9,$FA,$FB,$FB,$FC,$FD,$FD,$FE,$FE,$FE,$FE,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FE,$FE,$FE,$FD,$FD,$FD,$FC,$FA,$FB,$FA,$F9,$F8,$F7,$F5,$F4,$F3,$F1,$EE,$EC,$EB,$E9,$E5,$E4,$E0,$DE,$DB,$D8,$D5,$D2,$CF,$CD,$C8,$C6,$C4,$C1,$BE,$BA,$B9,$B6,$B4,$B2,$B0,$AF,$AE,$AB,$AA,$A9,$A9,$A9,$A7,$A8,$A7,$A8,$AA,$AA,$AB,$AC,$AE,$AF,$B0,$B2,$B4,$B8,$BB,$BC,$C0,$C2,$C4,$C8,$CB,$CE,$D0,$D4,$D6,$D9,$DD,$E0,$E2,$E4,$E7,$E9,$EB,$ED,$F0,$F2,$F4,$F5,$F5,$F7,$F8,$FA,$FB,$FB,$FC,$FD,$FD,$FD,$FE,$FE,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FE,$FE,$FE,$FD,$FD,$FC,$FC,$FB,$F8,$F9,$F8,$F5,$F5,$F2,$F0,$F0,$ED,$EB,$E9,$E6,$E4,$E1,$DE,$DA,$D7,$D4,$D0,$CE,$CA,$C7,$C4,$C0,$BC,$B9,$B6,$B3,$B0,$AE,$AA,$A9,$A6,$A5,$A2,$A0,$9F,$9D,$9D,$9D,$9C,$9B,$9C,$9B,$9B,$9D,$9E,$9F,$9F,$A3,$A4,$A4,$A7,$AA,$AB,$AE,$B2,$B5,$B8,$BC,$BE,$C1,$C5,$C9,$CC,$CF,$D2,$D6,$D9,$DC,$DF,$E2,$E5,$E7,$E9,$EC,$EE,$EF,$F3,$F3,$F5,$F6,$F7,$F9,$FA,$FB,$FC,$FC,$FD,$FD,$FE,$FE,$FE,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FE,$FE,$FE,$FE,$FD,$FD,$FC,$FC,$FB,$FB,$F9,$F8,$F7,$F6,$F4,$F2,$F0,$EF,$EC,$E9,$E7,$E4,$E1,$DE,$DB,$D6,$D2,$D0,$CC,$C9,$C4,$C0,$BD,$BA,$B6,$B2,$AE,$AB,$A7,$A5,$A2,$9E,$9C,$99,$98,$96,$94,$92,$90,$90,$8F,$8E,$8E,$8D,$8D,$8E,$90,$91,$92,$94,$95,$97,$99,$9B,$9D,$A0,$A3,$A7,$A9,$AD,$B1,$B4,$B7,$BC,$C0,$C4,$C6,$CA,$CF,$D1,$D6,$D9,$DC,$E1,$E2,$E5,$E7,$EB,$EC,$EF,$F1,$F3,$F5,$F6,$F8,$F9,$FA,$FA,$FC,$FD,$FD,$FD,$FE,$FE,$FE,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FF,$FF,$FF,$FE,$FE,$FE,$FD,$FD,$FC,$FC,$FC,$FA,$FA,$F9,$F8,$F6,$F5,$F3,$F2,$F0,$ED,$EA,$E8,$E5,$E3,$E0,$DC,$D8,$D4,$D0,$CC,$C8,$C3,$C0,$BB,$B7,$B4,$AE,$AB,$A6,$A2,$9F,$9C,$99,$95,$91,$8F,$8D,$8B,$89,$86,$85,$83,$82,$81,$81,$80,$80,$80,$81,$82,$83,$84,$86,$87,$8A,$8C,$8E,$91,$93,$96,$9A,$9D,$A1,$A5,$A9,$AE,$B2,$B6,$BB,$BD,$C1,$C7,$CB,$CF,$D1,$D6,$DA,$DE,$E1,$E4,$E6,$EA,$EB,$EE,$F0,$F3,$F4,$F6,$F7,$F9,$FA,$FB,$FC,$FB,$FC,$FD,$FE,$FE,$FE,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FF,$FF,$FF,$FE,$FE,$FE,$FD,$FD,$FC,$FB,$FA,$F9,$F9,$F7,$F5,$F5,$F2,$F1,$EF,$EC,$E9,$E6,$E3,$E0,$DD,$D9,$D5,$D1,$CB,$C7,$C3,$BF,$BA,$B7,$B1,$AD,$A7,$A2,$9E,$9A,$97,$92,$8E,$8C,$88,$85,$82,$7F,$7D,$7A,$78,$76,$75,$73,$73,$72,$72,$72,$72,$73,$74,$75,$76,$78,$79,$7C,$7E,$80,$84,$86,$89,$8E,$92,$96,$99,$9D,$A2,$A7,$AA,$B0,$B4,$B9,$BD,$C2,$C6,$CA,$CE,$D3,$D7,$DB,$DE,$E2,$E5,$E9,$EA,$EE,$EF,$F2,$F3,$F5,$F7,$F9,$FA,$FB,$FB,$FC,$FC,$FD,$FD,$FE,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FF,$FF,$FF,$FE,$FE,$FD,$FD,$FD,$FB,$FA,$F9,$F9,$F8,$F5,$F3,$F3,$F1,$EE,$EB,$E8,$E5,$E2,$DE,$DB,$D6,$D2,$CD,$C9,$C5,$BF,$BA,$B5,$B2,$AB,$A6,$A1,$9B,$97,$93,$8E,$89,$84,$80,$7E,$7A,$77,$75,$72,$6F,$6C,$6A,$68,$66,$66,$66,$64,$64,$64,$64,$65,$66,$67,$67,$69,$6B,$6D,$71,$72,$76,$79,$7C,$80,$84,$88,$8D,$90,$95,$9A,$9F,$A5,$A8,$AE,$B3,$B8,$BE,$C2,$C7,$CC,$D0,$D5,$D9,$DD,$E1,$E4,$E8,$EB,$ED,$F0,$F0,$F3,$F6,$F7,$F9,$FA,$FA,$FB,$FC,$FD,$FD,$FD,$FE,$FE,$FF,$FF,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FF,$FE,$FE,$FE,$FD,$FD,$FC,$FC,$FB,$FA,$F8,$F7,$F5,$F4,$F2,$F0,$ED,$EB,$E7,$E5,$E1,$DD,$D8,$D4,$D0,$CB,$C5,$C1,$BB,$B7,$B2,$AB,$A6,$A0,$9C,$95,$90,$8B,$86,$82,$7C,$77,$73,$6F,$6B,$69,$66,$64,$61,$5E,$5D,$5A,$58,$58,$58,$56,$56,$56,$56,$57,$57,$59,$59,$5B,$5D,$5F,$62,$65,$67,$6B,$6F,$72,$76,$7B,$7F,$85,$88,$8D,$93,$98,$9F,$A3,$A9,$AF,$B4,$BA,$BF,$C4,$C8,$CE,$D2,$D7,$DC,$DF,$E3,$E6,$E8,$ED,$EE,$F1,$F4,$F5,$F6,$F9,$FA,$FB,$FC,$FD,$FD,$FD,$FD,$FE,$FE,$FE,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FE,$FE,$FE,$FD,$FD,$FC,$FB,$FB,$FA,$F9,$F7,$F5,$F4,$F2,$EF,$ED,$EB,$E6,$E3,$DF,$DB,$D7,$D2,$CE,$C9,$C3,$BD,$B7,$B3,$AD,$A8,$A1,$9B,$95,$8F,$89,$83,$7E,$78,$74,$6F,$6A,$66,$62,$5E,$5B,$59,$56,$53,$51,$4F,$4C,$4B,$49,$49,$49,$48,$48,$48,$49,$49,$4B,$4D,$4D,$50,$52,$54,$56,$59,$5C,$60,$64,$69,$6D,$71,$77,$7C,$81,$85,$8C,$93,$98,$9E,$A3,$AA,$B0,$B5,$BB,$C1,$C5,$CB,$D1,$D5,$DB,$DE,$E1,$E5,$E9,$EB,$EF,$F0,$F2,$F5,$F7,$F9,$F9,$FB,$FB,$FC,$FD,$FD,$FE,$FE,$FE,$FE,$FF,$FF,$FF),
    ($FF,$FF,$FE,$FE,$FE,$FD,$FD,$FC,$FB,$FB,$FA,$F8,$F6,$F6,$F4,$F2,$EF,$ED,$E9,$E6,$E3,$DE,$DA,$D5,$D0,$CA,$C7,$C1,$BA,$B5,$AE,$A7,$A2,$9C,$94,$8F,$89,$81,$7C,$77,$70,$6C,$67,$62,$5D,$59,$55,$51,$4D,$4A,$49,$46,$43,$41,$3F,$3E,$3D,$3D,$3C,$3C,$3C,$3A,$3B,$3D,$3F,$40,$40,$42,$44,$47,$49,$4D,$50,$54,$57,$5B,$60,$64,$69,$6F,$73,$7A,$7F,$86,$8C,$92,$97,$9F,$A5,$AB,$B1,$B8,$BD,$C4,$C9,$CE,$D4,$D8,$DC,$E1,$E4,$E9,$EC,$ED,$EF,$F3,$F5,$F7,$F8,$F9,$FA,$FB,$FC,$FD,$FE,$FE,$FE,$FE,$FE,$FF,$FF),
    ($FF,$FE,$FE,$FE,$FD,$FD,$FD,$FC,$FB,$FA,$F9,$F7,$F6,$F4,$F1,$EF,$EC,$E9,$E5,$E2,$DE,$DA,$D4,$CD,$C9,$C3,$BE,$B8,$B2,$AB,$A3,$9D,$97,$90,$89,$83,$7C,$76,$70,$6A,$63,$5E,$59,$55,$50,$4B,$47,$44,$41,$3F,$3C,$3A,$37,$35,$34,$33,$31,$30,$30,$2F,$30,$2F,$2F,$31,$33,$33,$34,$36,$38,$3A,$3D,$3F,$43,$47,$4A,$4F,$53,$58,$5D,$61,$67,$6C,$73,$7A,$7F,$86,$8C,$92,$99,$A0,$A8,$AE,$B4,$BC,$C1,$C7,$CC,$D1,$D7,$DC,$E0,$E4,$E7,$EB,$ED,$F1,$F2,$F4,$F7,$F7,$F9,$FB,$FB,$FC,$FD,$FE,$FE,$FD,$FD,$FF,$FF),
    ($FE,$FE,$FE,$FE,$FD,$FC,$FC,$FB,$FA,$F9,$F8,$F5,$F4,$F2,$EF,$ED,$E8,$E4,$E1,$DD,$D9,$D3,$CE,$C7,$C1,$BB,$B5,$AE,$A8,$A0,$99,$92,$8B,$84,$7D,$76,$6F,$69,$63,$5D,$58,$51,$4C,$48,$44,$3F,$3B,$38,$35,$33,$30,$2E,$2B,$2A,$29,$28,$27,$26,$26,$25,$25,$25,$26,$26,$27,$28,$29,$2B,$2D,$2E,$31,$33,$37,$3A,$3E,$42,$46,$4A,$50,$54,$59,$5F,$66,$6B,$72,$7A,$80,$87,$8E,$96,$9E,$A5,$AB,$B2,$B8,$BF,$C5,$CA,$D0,$D6,$DB,$E0,$E3,$E7,$EA,$ED,$F1,$F2,$F5,$F6,$F8,$FA,$FB,$FB,$FD,$FD,$FD,$FE,$FE,$FE,$FF),
    ($FE,$FE,$FE,$FD,$FD,$FC,$FB,$FB,$F8,$F6,$F5,$F4,$F1,$EF,$ED,$EA,$E5,$E0,$DC,$D8,$D2,$CD,$C6,$C0,$B9,$B3,$AD,$A6,$9D,$96,$8D,$86,$7F,$78,$71,$69,$63,$5B,$55,$51,$4A,$45,$40,$3B,$38,$33,$2F,$2E,$2B,$27,$26,$24,$21,$20,$1F,$1E,$1F,$1E,$1D,$1D,$1C,$1C,$1D,$1E,$1E,$1F,$21,$21,$22,$25,$27,$29,$2C,$2F,$32,$36,$3A,$3D,$43,$49,$4D,$53,$58,$5F,$66,$6D,$74,$7B,$83,$8B,$92,$9A,$A1,$A9,$B0,$B7,$BD,$C4,$CB,$D0,$D6,$DB,$DF,$E4,$E7,$EB,$EE,$F0,$F2,$F4,$F7,$F8,$FA,$FB,$FB,$FC,$FD,$FE,$FE,$FE,$FF),
    ($FE,$FE,$FD,$FD,$FC,$FB,$FA,$FA,$F8,$F6,$F4,$F2,$EF,$ED,$E8,$E5,$E1,$DC,$D8,$D3,$CD,$C7,$C0,$B9,$B2,$A9,$A2,$9B,$92,$89,$82,$7A,$74,$6C,$64,$5D,$56,$4F,$49,$44,$3E,$39,$34,$2F,$2C,$29,$26,$23,$21,$1F,$1D,$1C,$1A,$19,$17,$16,$16,$15,$15,$16,$15,$16,$16,$17,$16,$17,$18,$19,$1B,$1C,$1E,$20,$23,$25,$28,$2B,$2F,$34,$38,$3D,$42,$47,$4D,$53,$59,$61,$68,$70,$77,$7F,$87,$90,$98,$9E,$A6,$AE,$B5,$BC,$C4,$C9,$CF,$D6,$DB,$E0,$E3,$E7,$EA,$EE,$F1,$F3,$F4,$F7,$F9,$FA,$FB,$FC,$FD,$FE,$FE,$FE,$FE),
    ($FE,$FD,$FD,$FD,$FC,$FB,$F9,$F8,$F6,$F5,$F3,$F0,$EE,$E9,$E4,$E1,$DD,$D8,$D2,$CC,$C6,$BF,$B7,$B0,$A7,$A1,$98,$90,$88,$7E,$76,$6F,$66,$5F,$57,$51,$4A,$43,$3E,$38,$33,$2E,$2B,$27,$24,$20,$1D,$1B,$1A,$17,$15,$14,$14,$12,$11,$11,$11,$11,$11,$11,$10,$0F,$11,$10,$12,$12,$13,$13,$14,$15,$17,$18,$1B,$1D,$1F,$22,$25,$2A,$2D,$32,$36,$3C,$41,$48,$4D,$54,$5B,$63,$6C,$73,$7B,$84,$8C,$95,$9E,$A6,$AD,$B5,$BC,$C1,$C9,$CF,$D6,$DB,$E0,$E3,$E7,$EB,$ED,$F1,$F4,$F6,$F7,$F9,$FB,$FC,$FC,$FD,$FD,$FE,$FE),
    ($FE,$FD,$FC,$FC,$FA,$FA,$F7,$F6,$F4,$F3,$EF,$ED,$EA,$E5,$E2,$DC,$D8,$D2,$CB,$C4,$BD,$B8,$AF,$A8,$9F,$97,$8F,$86,$7C,$74,$6C,$63,$5B,$53,$4C,$46,$40,$39,$33,$2F,$29,$25,$22,$1E,$1B,$19,$17,$15,$13,$12,$10,$10,$0E,$0D,$0C,$0C,$0C,$0B,$0A,$0A,$0A,$0B,$0A,$0B,$0C,$0C,$0E,$0F,$0F,$10,$12,$12,$14,$16,$18,$19,$1D,$21,$24,$28,$2B,$30,$36,$3C,$42,$49,$50,$58,$60,$68,$70,$78,$81,$8A,$93,$9B,$A4,$AB,$B4,$BA,$C1,$C8,$CF,$D5,$DB,$DF,$E4,$E8,$EC,$EE,$F2,$F3,$F6,$F8,$FA,$FB,$FC,$FD,$FD,$FD,$FE),
    ($FD,$FD,$FC,$FB,$FA,$F8,$F7,$F4,$F2,$F0,$ED,$EA,$E6,$E2,$DD,$D8,$D2,$CC,$C5,$BD,$B6,$AF,$A7,$9E,$95,$8D,$83,$7A,$70,$69,$60,$58,$4F,$48,$41,$3B,$34,$2F,$2A,$26,$21,$1D,$1A,$17,$15,$13,$11,$10,$0D,$0D,$0C,$0A,$08,$09,$06,$06,$06,$07,$06,$06,$06,$06,$06,$07,$07,$07,$08,$08,$0A,$0A,$0C,$0D,$10,$10,$13,$14,$16,$19,$1C,$1F,$23,$28,$2C,$32,$37,$3E,$45,$4C,$53,$5D,$64,$6D,$75,$7F,$88,$92,$9A,$A3,$AB,$B4,$BA,$C1,$C9,$CF,$D4,$DB,$E0,$E5,$E8,$EB,$EE,$F1,$F3,$F5,$F8,$FA,$FB,$FC,$FC,$FD,$FE),
    ($FD,$FC,$FA,$FA,$F9,$F8,$F6,$F3,$F0,$EE,$EB,$E7,$E2,$DE,$D9,$D3,$CC,$C5,$BE,$B7,$AF,$A6,$9C,$94,$8B,$82,$78,$6F,$66,$5E,$54,$4C,$45,$3D,$37,$31,$2C,$26,$21,$1E,$19,$17,$14,$13,$10,$0E,$0C,$0B,$08,$09,$06,$06,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$07,$07,$09,$09,$0A,$0C,$0D,$0F,$12,$13,$15,$18,$1C,$20,$23,$29,$2E,$35,$3B,$41,$48,$51,$58,$61,$6B,$74,$7E,$86,$90,$99,$A1,$AB,$B4,$BA,$C1,$CA,$D0,$D6,$DC,$E2,$E6,$E9,$EC,$EF,$F2,$F5,$F7,$F9,$FA,$FB,$FC,$FD,$FD),
    ($FC,$FC,$FB,$FA,$F7,$F6,$F5,$F2,$EF,$EB,$E8,$E4,$DE,$D8,$D4,$CE,$C7,$BF,$B7,$AE,$A7,$9D,$94,$89,$80,$76,$6D,$64,$5B,$52,$4B,$43,$39,$34,$2E,$28,$22,$1E,$1A,$17,$14,$11,$10,$0D,$0C,$09,$06,$06,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$06,$07,$06,$09,$0A,$0C,$0E,$11,$13,$16,$19,$1C,$20,$25,$2C,$30,$37,$3F,$46,$4F,$57,$60,$6A,$73,$7C,$85,$8F,$9A,$A2,$AB,$B3,$BA,$C2,$CA,$D1,$D7,$DC,$E1,$E6,$E9,$ED,$F0,$F3,$F6,$F7,$F9,$FA,$FC,$FD,$FD),
    ($FC,$FB,$FA,$F9,$F6,$F4,$F2,$F0,$ED,$E8,$E4,$DF,$DA,$D5,$CF,$C7,$C0,$B8,$AE,$A7,$9E,$94,$8B,$80,$76,$6C,$63,$59,$50,$47,$40,$38,$31,$2B,$25,$20,$1B,$17,$14,$11,$10,$0C,$0A,$09,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$07,$0B,$0C,$0E,$11,$13,$17,$1A,$1E,$23,$28,$2E,$35,$3D,$44,$4D,$55,$5E,$68,$72,$7C,$86,$90,$99,$A3,$AC,$B3,$BD,$C3,$CB,$D2,$D8,$DD,$E2,$E8,$EB,$EE,$F1,$F3,$F5,$F8,$FA,$FB,$FC,$FD),
    ($FC,$F9,$F9,$F8,$F6,$F2,$F1,$ED,$E9,$E6,$E1,$DC,$D6,$D1,$C8,$C1,$B9,$B1,$A6,$9D,$95,$89,$80,$76,$6D,$62,$58,$50,$46,$3D,$37,$2E,$29,$23,$1E,$19,$14,$13,$10,$0C,$0C,$09,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$06,$09,$0C,$0F,$11,$14,$17,$1C,$20,$26,$2C,$33,$3B,$43,$4A,$53,$5D,$68,$72,$7C,$86,$90,$99,$A4,$AD,$B6,$BD,$C4,$CD,$D3,$D9,$DF,$E5,$E8,$ED,$EE,$F2,$F4,$F7,$F8,$FA,$FB,$FC),
    ($FB,$FA,$F7,$F7,$F5,$F1,$EE,$EA,$E6,$E2,$DE,$D8,$D2,$CB,$C3,$BB,$B1,$A8,$9F,$96,$8C,$80,$76,$6C,$62,$57,$4E,$45,$3D,$35,$2E,$27,$21,$1B,$18,$14,$10,$0E,$0C,$06,$07,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$07,$08,$0E,$10,$13,$16,$19,$1F,$24,$2A,$32,$3A,$41,$4A,$54,$5E,$68,$72,$7C,$87,$91,$9A,$A5,$AE,$B7,$C0,$C7,$CE,$D5,$DB,$E0,$E5,$E9,$EC,$F0,$F3,$F6,$F6,$F9,$FA,$FC),
    ($FA,$F9,$F7,$F4,$F2,$F0,$ED,$E8,$E4,$DE,$DA,$D4,$CD,$C4,$BD,$B4,$AB,$A2,$96,$8C,$82,$78,$6D,$62,$58,$4E,$45,$3B,$34,$2C,$26,$20,$1A,$15,$13,$0F,$0D,$0B,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$09,$0B,$0E,$11,$15,$19,$1D,$23,$2A,$31,$38,$41,$4B,$54,$5E,$69,$72,$7D,$88,$93,$9D,$A5,$AF,$B8,$C2,$C9,$CF,$D6,$DD,$E3,$E7,$EB,$ED,$F1,$F4,$F6,$F9,$FA,$FB),
    ($F9,$F8,$F5,$F3,$F1,$EE,$EA,$E6,$E1,$DB,$D5,$CE,$C7,$BD,$B6,$AC,$A2,$99,$8E,$84,$79,$6E,$63,$58,$4F,$46,$3B,$33,$2D,$24,$1E,$19,$16,$12,$0E,$0C,$09,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$08,$0B,$0C,$10,$14,$18,$1D,$22,$29,$30,$38,$41,$4A,$55,$5F,$6A,$74,$7F,$8A,$95,$9E,$A7,$B2,$BB,$C4,$CC,$D2,$D8,$DE,$E4,$E8,$EB,$EF,$F1,$F4,$F7,$F8,$FB),
    ($F9,$F7,$F5,$F2,$EE,$EC,$E7,$E3,$DD,$D7,$D0,$CA,$C1,$B9,$AF,$A6,$9B,$91,$85,$7A,$70,$65,$59,$4F,$45,$3D,$33,$2B,$25,$1E,$18,$14,$11,$0F,$0A,$07,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$06,$09,$0C,$10,$13,$16,$1B,$21,$29,$30,$38,$41,$4C,$56,$61,$6C,$76,$81,$8C,$97,$A1,$AC,$B5,$BE,$C6,$CE,$D3,$DA,$E0,$E5,$EA,$EC,$F0,$F3,$F5,$F8,$FA),
    ($F8,$F6,$F3,$F0,$ED,$E9,$E4,$E0,$D8,$D3,$CC,$C3,$BC,$B2,$A9,$9F,$92,$87,$7D,$72,$67,$5C,$51,$46,$3C,$33,$2B,$24,$1E,$19,$14,$11,$0D,$0A,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$08,$0C,$0F,$12,$16,$1C,$22,$29,$31,$39,$42,$4D,$57,$62,$6C,$78,$84,$8F,$9A,$A5,$AD,$B7,$C0,$C9,$CF,$D6,$DC,$E2,$E7,$EB,$EE,$F2,$F4,$F7,$F9),
    ($F6,$F5,$F2,$EE,$EB,$E6,$E1,$DC,$D6,$CF,$C7,$BF,$B6,$AC,$A1,$96,$8B,$80,$74,$68,$5D,$52,$48,$3E,$35,$2C,$25,$1E,$18,$13,$10,$0D,$0A,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$09,$0A,$0F,$13,$17,$1C,$21,$28,$31,$3A,$44,$4E,$5A,$64,$71,$7B,$85,$92,$9C,$A6,$B1,$BA,$C4,$CB,$D3,$D9,$DF,$E4,$EA,$ED,$F0,$F2,$F6,$F8),
    ($F5,$F4,$EF,$ED,$E8,$E4,$DE,$D9,$D2,$CB,$C1,$B9,$AF,$A5,$9A,$8F,$84,$79,$6C,$61,$54,$4B,$40,$37,$2E,$26,$1F,$19,$14,$11,$0E,$08,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$09,$0A,$0F,$12,$16,$1B,$23,$2A,$32,$3B,$47,$51,$5B,$67,$73,$7E,$8B,$95,$A1,$AB,$B5,$BF,$C7,$CF,$D6,$DC,$E1,$E6,$EB,$EE,$F2,$F4,$F7),
    ($F5,$F1,$EE,$EA,$E6,$E1,$DB,$D5,$CE,$C6,$BD,$B4,$AA,$9E,$93,$88,$7B,$71,$65,$5A,$4D,$43,$39,$30,$27,$20,$1A,$14,$11,$0E,$08,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$06,$0A,$0F,$12,$17,$1D,$24,$2C,$34,$3F,$49,$54,$5F,$6A,$76,$82,$8E,$9A,$A4,$AF,$B9,$C2,$CA,$D2,$D9,$DE,$E4,$E8,$EE,$F0,$F3,$F6),
    ($F4,$EF,$EB,$E8,$E4,$DE,$D8,$D1,$C9,$C1,$B9,$AF,$A3,$98,$8D,$81,$74,$67,$5C,$51,$45,$3B,$32,$29,$22,$1B,$15,$11,$0D,$09,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$0B,$0F,$14,$18,$1E,$26,$2D,$37,$41,$4B,$58,$63,$6F,$7B,$87,$94,$9F,$AA,$B3,$BD,$C5,$CE,$D5,$DB,$E1,$E6,$EC,$EE,$F1,$F5),
    ($F2,$EE,$EA,$E5,$E1,$DC,$D5,$CE,$C6,$BC,$B3,$A8,$9C,$91,$85,$7A,$6E,$60,$55,$49,$3F,$34,$2C,$24,$1D,$16,$12,$0D,$0A,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$09,$0C,$10,$13,$1A,$20,$28,$2F,$3A,$45,$50,$5B,$67,$74,$80,$8D,$97,$A3,$AF,$B8,$C2,$CA,$D0,$D8,$DE,$E4,$E9,$EC,$F1,$F3),
    ($F0,$EC,$E9,$E3,$DF,$D9,$D1,$CA,$C2,$B8,$AE,$A1,$96,$8A,$7F,$72,$66,$59,$4D,$42,$38,$2E,$25,$1E,$18,$13,$0E,$0A,$09,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$09,$0D,$12,$16,$1B,$23,$2A,$34,$3E,$49,$54,$5F,$6C,$79,$86,$91,$9D,$A8,$B4,$BC,$C5,$CE,$D5,$DD,$E1,$E6,$EB,$F0,$F2),
    ($EF,$EA,$E6,$E1,$DC,$D5,$CE,$C5,$BD,$B3,$A7,$9C,$91,$84,$79,$6A,$5E,$52,$47,$3C,$32,$29,$21,$1A,$14,$10,$0C,$06,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$06,$08,$0F,$12,$18,$1E,$25,$2E,$38,$42,$4D,$59,$65,$72,$7F,$8B,$98,$A2,$AD,$B7,$C2,$CA,$D2,$D9,$DF,$E4,$EA,$ED,$F1),
    ($EE,$E9,$E4,$DF,$D9,$D3,$CB,$C1,$B9,$AE,$A3,$98,$8B,$7F,$71,$64,$57,$4B,$41,$36,$2C,$23,$1C,$16,$11,$0C,$08,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$0B,$10,$14,$1A,$20,$28,$31,$3B,$46,$52,$5E,$6A,$79,$85,$92,$9E,$A8,$B4,$BE,$C7,$CF,$D6,$DD,$E2,$E7,$EB,$EF),
    ($EB,$E8,$E2,$DD,$D7,$CF,$C6,$BE,$B4,$A8,$9C,$91,$85,$78,$6A,$5D,$51,$46,$3A,$30,$27,$1F,$19,$13,$0E,$0B,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$09,$0E,$11,$15,$1B,$23,$2C,$36,$42,$4C,$57,$65,$71,$7E,$8C,$98,$A4,$AE,$B9,$C3,$CC,$D3,$DB,$E0,$E6,$EA,$EF),
    ($EA,$E6,$E0,$DB,$D4,$CA,$C2,$B9,$AF,$A4,$97,$8B,$7E,$71,$64,$59,$4C,$40,$35,$2C,$22,$1B,$15,$10,$0C,$09,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$08,$0E,$13,$18,$1F,$27,$31,$3B,$47,$53,$5F,$6C,$7A,$85,$92,$9F,$AB,$B5,$BE,$C8,$D0,$D8,$DF,$E4,$E9,$ED),
    ($E9,$E5,$DF,$D9,$D1,$C7,$BF,$B4,$A9,$9E,$93,$86,$79,$6C,$5F,$53,$46,$3B,$2F,$26,$1F,$17,$13,$0D,$09,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$0C,$10,$15,$1C,$23,$2B,$35,$41,$4D,$59,$65,$73,$80,$8D,$99,$A6,$B1,$BB,$C5,$CD,$D5,$DC,$E1,$E7,$EB),
    ($E8,$E2,$DD,$D6,$CE,$C6,$BB,$B1,$A5,$9A,$8F,$81,$75,$66,$58,$4D,$41,$36,$2A,$21,$1B,$15,$0F,$0B,$07,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$0B,$0F,$12,$17,$1E,$26,$30,$3C,$48,$53,$60,$6E,$7B,$88,$95,$A1,$AC,$B8,$C1,$C9,$D2,$D9,$DF,$E6,$EA),
    ($E6,$E0,$DA,$D3,$CB,$C3,$B8,$AC,$A1,$95,$8A,$7D,$6F,$61,$54,$47,$3C,$31,$27,$1F,$18,$13,$0D,$08,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$09,$0C,$10,$15,$1C,$23,$2E,$37,$42,$4F,$5B,$69,$77,$83,$91,$9D,$A9,$B4,$BD,$C7,$D0,$D7,$DD,$E5,$E9),
    ($E4,$DF,$D8,$D1,$C8,$BF,$B4,$AA,$9E,$90,$85,$77,$6A,$5D,$4F,$43,$37,$2C,$23,$1C,$15,$11,$0C,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$09,$0E,$12,$19,$20,$29,$32,$3D,$49,$57,$64,$70,$7F,$8C,$99,$A4,$AF,$BB,$C3,$CE,$D5,$DC,$E2,$E7),
    ($E3,$DD,$D6,$CD,$C4,$BB,$B1,$A7,$9A,$8C,$80,$72,$65,$58,$4A,$3E,$32,$29,$1F,$19,$13,$0D,$09,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$0C,$11,$16,$1C,$25,$2F,$39,$45,$52,$5F,$6C,$79,$87,$95,$A0,$AC,$B6,$C1,$CB,$D3,$DA,$E0,$E6),
    ($E1,$DB,$D4,$CC,$C2,$B9,$AE,$A3,$96,$89,$7B,$6E,$60,$53,$47,$3A,$2F,$25,$1C,$16,$10,$0C,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$08,$0E,$13,$1A,$22,$2C,$36,$40,$4E,$59,$67,$74,$82,$90,$9C,$A8,$B3,$BE,$C9,$D1,$D8,$DE,$E4),
    ($DF,$D9,$D2,$C9,$C1,$B5,$AB,$9F,$92,$85,$77,$6A,$5C,$4F,$42,$36,$2B,$23,$19,$14,$0F,$0A,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$09,$0D,$11,$18,$1F,$28,$31,$3C,$49,$56,$63,$71,$7E,$8C,$99,$A6,$B1,$BC,$C5,$CE,$D6,$DD,$E4),
    ($DE,$D7,$D0,$C7,$BD,$B3,$A7,$9B,$8F,$81,$73,$66,$58,$4B,$3E,$32,$29,$20,$18,$13,$0D,$08,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$0C,$10,$15,$1D,$24,$2E,$38,$45,$52,$60,$6D,$7B,$89,$95,$A3,$AF,$BA,$C3,$CB,$D5,$DC,$E2),
    ($DE,$D5,$CE,$C6,$BC,$B1,$A5,$98,$8C,$7E,$6F,$61,$54,$48,$3A,$2F,$26,$1D,$17,$11,$0C,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$09,$0F,$13,$1A,$22,$2B,$35,$42,$4E,$5B,$6A,$78,$86,$93,$9F,$AC,$B6,$C1,$CA,$D3,$DA,$E1),
    ($DC,$D5,$CD,$C2,$B9,$AE,$A2,$96,$88,$7A,$6C,$5E,$51,$45,$38,$2C,$24,$1B,$13,$0E,$0A,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$0D,$11,$17,$1F,$28,$32,$3E,$4B,$59,$65,$74,$83,$90,$9D,$A9,$B5,$BF,$C9,$D1,$D8,$DF),
    ($DB,$D3,$CB,$C0,$B7,$AB,$9F,$93,$86,$77,$6A,$5C,$4E,$42,$35,$2A,$20,$19,$13,$0E,$09,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$0C,$11,$16,$1C,$25,$30,$3C,$47,$56,$63,$72,$7F,$8D,$9A,$A7,$B3,$BC,$C7,$D0,$D7,$DE),
    ($DA,$D2,$C9,$C0,$B5,$A9,$9D,$91,$83,$75,$67,$59,$4D,$40,$33,$27,$1F,$17,$12,$0C,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$0A,$10,$14,$1B,$24,$2D,$39,$45,$53,$61,$6F,$7C,$8A,$97,$A5,$B0,$BA,$C4,$CE,$D6,$DD),
    ($D9,$D1,$C8,$BE,$B3,$A8,$9A,$8E,$80,$73,$65,$57,$49,$3D,$30,$26,$1E,$16,$11,$0C,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$09,$0F,$13,$1A,$22,$2D,$36,$43,$51,$5F,$6B,$79,$88,$96,$A2,$AE,$BA,$C3,$CD,$D5,$DC),
    ($D7,$CF,$C7,$BC,$B1,$A6,$99,$8C,$7E,$6F,$62,$54,$47,$3B,$2F,$25,$1B,$15,$0F,$0B,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$09,$0D,$13,$18,$21,$2A,$34,$41,$4E,$5C,$6A,$77,$86,$92,$9F,$AD,$B9,$C3,$CB,$D3,$DB),
    ($D5,$CE,$C6,$BB,$B0,$A3,$97,$89,$7D,$6F,$60,$52,$45,$39,$2D,$23,$1B,$14,$0F,$0A,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$08,$0C,$11,$17,$20,$2A,$33,$3F,$4C,$5A,$68,$76,$84,$91,$9E,$AB,$B7,$C1,$CB,$D3,$DA),
    ($D6,$CE,$C5,$BA,$AE,$A2,$96,$88,$7B,$6D,$5F,$50,$43,$37,$2B,$22,$1A,$14,$0E,$09,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$09,$0C,$10,$16,$1E,$28,$32,$3C,$49,$58,$67,$74,$82,$90,$9E,$AA,$B5,$BF,$CA,$D2,$D9),
    ($D4,$CD,$C3,$B8,$AD,$A1,$95,$87,$79,$6A,$5C,$4F,$42,$36,$2B,$22,$19,$13,$0D,$09,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$0A,$0F,$16,$1D,$26,$30,$3C,$48,$57,$65,$74,$80,$8E,$9D,$A8,$B4,$BF,$C9,$D1,$D9),
    ($D5,$CD,$C3,$B9,$AE,$A0,$93,$86,$78,$6A,$5B,$4F,$41,$34,$2A,$21,$18,$13,$0E,$09,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$0B,$10,$15,$1C,$25,$30,$3B,$48,$56,$64,$73,$80,$8E,$9C,$A7,$B3,$BD,$C7,$D1,$D8),
    ($D4,$CC,$C2,$B8,$AC,$A1,$93,$86,$77,$69,$5B,$4D,$40,$34,$29,$20,$18,$11,$0E,$09,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$0B,$10,$15,$1B,$25,$2F,$3B,$48,$55,$63,$71,$7F,$8D,$9B,$A8,$B3,$BE,$C8,$D1,$D8),
    ($D3,$CC,$C1,$B6,$AC,$A1,$93,$84,$76,$68,$5A,$4D,$40,$34,$29,$20,$17,$12,$0C,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$0A,$0F,$15,$1C,$24,$2E,$3A,$47,$55,$62,$71,$7F,$8D,$9A,$A6,$B3,$BD,$C8,$D0,$D8),
    ($D4,$CC,$C2,$B7,$AC,$A0,$93,$85,$76,$68,$59,$4D,$40,$33,$28,$1F,$17,$11,$0C,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$09,$0E,$15,$1C,$25,$2E,$3A,$47,$54,$62,$71,$7E,$8C,$9A,$A7,$B3,$BD,$C8,$D0,$D8),
    ($D4,$CC,$C2,$B8,$AB,$A0,$93,$85,$76,$67,$59,$4D,$40,$32,$28,$1F,$18,$11,$0C,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$0A,$10,$15,$1B,$24,$2E,$39,$45,$53,$62,$70,$7E,$8B,$9A,$A7,$B2,$BC,$C6,$D0,$D8),
    ($D3,$CA,$C3,$B7,$AD,$A0,$93,$85,$77,$69,$5A,$4C,$3F,$33,$29,$1F,$17,$12,$0C,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$0B,$10,$14,$1B,$24,$2F,$3A,$47,$55,$62,$70,$7F,$8D,$9A,$A6,$B3,$BD,$C7,$D0,$D7),
    ($D4,$CC,$C3,$B7,$AD,$A1,$93,$86,$77,$68,$5B,$4E,$40,$34,$28,$20,$18,$12,$0C,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$09,$0F,$15,$1C,$26,$2F,$3A,$47,$56,$64,$71,$7F,$8C,$9A,$A8,$B4,$BD,$C7,$D0,$D8),
    ($D5,$CD,$C4,$B9,$AD,$A1,$94,$87,$78,$6A,$5B,$4E,$41,$35,$29,$20,$19,$12,$0C,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$0B,$10,$15,$1C,$25,$30,$3A,$48,$56,$64,$72,$80,$8E,$9B,$A8,$B3,$BE,$C8,$D2,$D9),
    ($D5,$CC,$C3,$B9,$AF,$A3,$96,$87,$79,$6B,$5D,$4F,$42,$36,$2B,$21,$19,$13,$0D,$08,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$0C,$11,$15,$1D,$27,$31,$3D,$49,$57,$65,$74,$81,$8F,$9D,$A9,$B5,$BE,$C9,$D2,$D9),
    ($D6,$CE,$C5,$B9,$AE,$A3,$96,$89,$7B,$6D,$5F,$51,$44,$38,$2C,$22,$19,$13,$0E,$09,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$0C,$11,$16,$1E,$28,$33,$3E,$4C,$59,$67,$76,$83,$8F,$9D,$AA,$B5,$C0,$C9,$D2,$D9),
    ($D6,$CE,$C6,$BB,$B1,$A4,$99,$8A,$7D,$6F,$60,$52,$45,$39,$2E,$23,$1A,$14,$0F,$08,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$09,$0D,$12,$17,$1F,$29,$33,$3F,$4D,$5A,$69,$77,$84,$91,$A0,$AC,$B8,$C2,$CB,$D3,$DA),
    ($D7,$D0,$C8,$BC,$B1,$A5,$9B,$8D,$7F,$70,$62,$54,$47,$3B,$30,$25,$1C,$15,$10,$0A,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$09,$0D,$13,$19,$20,$2A,$35,$41,$4E,$5C,$6B,$78,$86,$94,$A2,$AE,$B7,$C1,$CC,$D4,$DB),
    ($D9,$D1,$C9,$BE,$B3,$A8,$9C,$8F,$81,$72,$65,$56,$49,$3C,$31,$27,$1E,$17,$11,$0C,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$09,$0F,$14,$1B,$23,$2D,$38,$43,$51,$5E,$6C,$7A,$88,$96,$A3,$AF,$BA,$C4,$CE,$D5,$DC),
    ($DA,$D2,$C8,$C0,$B5,$A9,$9E,$90,$83,$76,$67,$59,$4C,$3F,$33,$29,$20,$17,$12,$0D,$09,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$0B,$0F,$15,$1D,$24,$2E,$39,$45,$54,$61,$6F,$7D,$89,$98,$A4,$B1,$BC,$C6,$CF,$D5,$DD),
    ($DB,$D4,$CA,$C1,$B8,$AC,$A0,$94,$86,$78,$6A,$5C,$4E,$41,$36,$2A,$22,$19,$14,$0D,$09,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$0C,$11,$17,$1E,$27,$31,$3C,$49,$55,$64,$71,$7F,$8D,$9A,$A6,$B2,$BC,$C7,$D1,$D8,$DE),
    ($DC,$D5,$CC,$C4,$BA,$AE,$A2,$96,$89,$7B,$6D,$5F,$51,$45,$38,$2D,$23,$1C,$15,$0F,$0B,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$08,$0D,$12,$19,$20,$29,$33,$3E,$4B,$5A,$67,$74,$82,$90,$9D,$A9,$B4,$BF,$C9,$D1,$D9,$DF),
    ($DE,$D7,$CE,$C5,$BC,$B1,$A5,$98,$8C,$7E,$71,$62,$54,$47,$3A,$2F,$26,$1D,$17,$10,$0C,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$09,$0F,$14,$1B,$22,$2B,$36,$42,$4F,$5C,$6A,$78,$85,$92,$9F,$AD,$B6,$C0,$CB,$D3,$DA,$E2),
    ($DF,$D9,$D1,$C7,$BE,$B3,$A7,$9B,$8F,$82,$74,$66,$58,$4C,$3E,$34,$29,$20,$19,$13,$0D,$09,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$0C,$10,$15,$1D,$24,$2E,$3A,$45,$52,$60,$6D,$7B,$89,$96,$A3,$AE,$B9,$C4,$CD,$D5,$DC,$E3),
    ($E1,$DA,$D2,$CA,$C1,$B6,$AA,$9F,$91,$86,$79,$6B,$5C,$4F,$43,$37,$2C,$22,$1A,$15,$0E,$0A,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$09,$0D,$12,$18,$1F,$28,$31,$3D,$48,$56,$64,$71,$7F,$8D,$9A,$A7,$B1,$BD,$C5,$CE,$D7,$DE,$E3),
    ($E2,$DC,$D4,$CB,$C2,$B8,$AE,$A2,$96,$89,$7B,$6F,$61,$53,$46,$3B,$30,$26,$1D,$17,$11,$0C,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$0B,$10,$14,$19,$21,$2B,$36,$41,$4E,$5B,$67,$75,$82,$91,$9D,$AA,$B4,$BE,$C9,$D0,$D8,$DF,$E4),
    ($E4,$DD,$D7,$CE,$C5,$BC,$B2,$A6,$99,$8D,$80,$72,$65,$59,$4C,$3F,$33,$29,$20,$19,$14,$0F,$09,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$08,$0C,$10,$16,$1D,$25,$2F,$3A,$46,$52,$5F,$6B,$79,$87,$95,$A1,$AC,$B7,$C2,$CA,$D3,$DA,$E1,$E6),
    ($E5,$DF,$D9,$D1,$C9,$C0,$B5,$AA,$9E,$92,$85,$78,$6A,$5C,$50,$43,$36,$2C,$23,$1C,$15,$10,$0C,$09,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$08,$0F,$12,$19,$20,$29,$34,$3E,$49,$57,$64,$71,$7F,$8C,$99,$A4,$B0,$BA,$C5,$CD,$D6,$DD,$E4,$E7),
    ($E7,$E1,$DB,$D4,$CC,$C1,$B8,$AD,$A1,$96,$8A,$7D,$70,$61,$55,$48,$3B,$31,$28,$1F,$18,$12,$0D,$09,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$0C,$11,$15,$1C,$23,$2D,$37,$43,$4F,$5C,$69,$76,$84,$90,$9D,$A8,$B3,$BF,$C8,$D0,$D7,$DF,$E4,$EA),
    ($E8,$E3,$DD,$D6,$CE,$C6,$BC,$B2,$A6,$9A,$8E,$82,$74,$67,$5A,$4D,$41,$36,$2B,$22,$1B,$15,$0F,$0C,$08,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$09,$0F,$13,$18,$1F,$27,$32,$3C,$48,$54,$61,$6D,$7B,$89,$95,$A1,$AD,$B7,$C1,$CA,$D2,$DA,$E1,$E6,$EA),
    ($E9,$E6,$DF,$D9,$D1,$C8,$C0,$B6,$AB,$9F,$93,$87,$7A,$6D,$5F,$53,$47,$3A,$31,$27,$1F,$18,$13,$0E,$0B,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$08,$0C,$10,$15,$1C,$23,$2C,$36,$42,$4E,$59,$66,$74,$80,$8C,$9B,$A7,$B1,$BC,$C4,$CE,$D5,$DC,$E2,$E9,$ED),
    ($EB,$E6,$E1,$DB,$D4,$CB,$C3,$B9,$B0,$A4,$97,$8B,$80,$72,$66,$5A,$4C,$41,$36,$2B,$23,$1C,$15,$11,$0E,$08,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$0A,$0E,$13,$19,$20,$28,$32,$3D,$46,$53,$60,$6C,$79,$87,$92,$9E,$AA,$B6,$C0,$C9,$D0,$D7,$DE,$E4,$EA,$EE),
    ($EC,$E8,$E3,$DE,$D7,$CE,$C7,$BE,$B3,$A8,$9D,$92,$86,$79,$6D,$5F,$53,$47,$3D,$30,$28,$1F,$19,$13,$0F,$0A,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$09,$0D,$12,$15,$1C,$24,$2D,$37,$42,$4C,$59,$66,$73,$80,$8C,$99,$A3,$AF,$B9,$C4,$CB,$D4,$DA,$E1,$E7,$EC,$EF),
    ($EE,$EA,$E5,$E0,$DA,$D2,$CA,$C2,$B9,$AD,$A2,$98,$8B,$7F,$72,$66,$59,$4E,$42,$37,$2D,$25,$1D,$17,$11,$0D,$08,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$0C,$11,$14,$19,$20,$29,$33,$3E,$49,$52,$60,$6D,$79,$86,$93,$9D,$A9,$B3,$BE,$C6,$CF,$D7,$DD,$E3,$E8,$ED,$EF),
    ($F0,$EC,$E7,$E2,$DD,$D6,$CE,$C6,$BD,$B3,$A9,$9D,$92,$86,$79,$6C,$60,$54,$48,$3D,$33,$2A,$21,$1B,$15,$0F,$0C,$09,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$0A,$10,$13,$17,$1E,$26,$2F,$38,$43,$50,$5A,$67,$73,$7F,$8D,$99,$A4,$AF,$B9,$C3,$CA,$D3,$D9,$E1,$E5,$EB,$EE,$F2),
    ($F0,$EC,$E9,$E5,$DF,$D9,$D2,$CA,$C2,$B7,$AE,$A2,$98,$8C,$80,$73,$67,$5B,$50,$44,$39,$30,$27,$1F,$18,$13,$0F,$0C,$08,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$0B,$0E,$11,$16,$1C,$23,$2B,$35,$3F,$4B,$56,$61,$6D,$7A,$87,$93,$9E,$A9,$B3,$BD,$C7,$CF,$D6,$DC,$E2,$E7,$ED,$F0,$F3),
    ($F2,$EF,$EC,$E7,$E1,$DC,$D6,$CD,$C5,$BD,$B4,$A9,$9E,$92,$86,$7A,$6E,$62,$56,$4A,$3F,$36,$2D,$24,$1D,$18,$13,$0F,$0C,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$07,$08,$0D,$11,$14,$1A,$22,$29,$32,$3C,$45,$51,$5D,$69,$75,$80,$8E,$9A,$A4,$AE,$B9,$C2,$CB,$D2,$D9,$DF,$E4,$EA,$EE,$F0,$F4),
    ($F3,$F1,$EE,$EA,$E5,$DF,$D9,$D2,$CA,$C0,$B9,$AF,$A4,$99,$8E,$81,$76,$69,$5E,$52,$47,$3D,$32,$2A,$23,$1B,$17,$12,$0F,$0B,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$09,$0C,$0F,$14,$19,$20,$27,$2F,$38,$43,$4E,$58,$64,$70,$7C,$88,$95,$A0,$AA,$B5,$BE,$C7,$CF,$D6,$DC,$E2,$E8,$EB,$EF,$F3,$F4),
    ($F5,$F1,$EF,$EC,$E7,$E1,$DC,$D6,$CE,$C6,$BD,$B5,$AB,$A0,$94,$89,$7D,$71,$66,$5A,$4F,$44,$3A,$31,$29,$22,$1B,$15,$10,$0D,$09,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$09,$0C,$10,$14,$18,$1E,$25,$2D,$36,$40,$4A,$56,$61,$6C,$78,$84,$90,$9A,$A5,$AF,$BA,$C3,$CB,$D3,$D9,$DF,$E5,$E9,$EE,$F1,$F2,$F6),
    ($F6,$F4,$F0,$ED,$EA,$E4,$DF,$D9,$D3,$CA,$C3,$BA,$AF,$A7,$9C,$8F,$85,$7A,$6E,$63,$56,$4C,$42,$38,$30,$27,$20,$1A,$15,$11,$0E,$0B,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$07,$09,$0C,$0F,$14,$17,$1D,$24,$2B,$34,$3E,$48,$52,$5E,$69,$74,$80,$8C,$97,$A1,$AB,$B5,$BF,$C8,$CF,$D6,$DC,$E2,$E7,$EC,$EF,$F2,$F4,$F7),
    ($F7,$F6,$F3,$EF,$EB,$E7,$E2,$DC,$D7,$D0,$C8,$BF,$B7,$AE,$A3,$98,$8D,$81,$76,$6A,$5F,$54,$49,$3F,$36,$2D,$26,$20,$1A,$14,$11,$0E,$0A,$07,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$09,$0C,$10,$13,$17,$1C,$23,$2B,$32,$3C,$46,$4F,$5A,$66,$71,$7C,$89,$94,$9F,$A9,$B3,$BC,$C3,$CC,$D3,$DA,$E0,$E6,$EA,$ED,$F0,$F3,$F6,$F7),
    ($F8,$F7,$F5,$F1,$EE,$E9,$E5,$DF,$DA,$D4,$CD,$C5,$BC,$B3,$AA,$9F,$95,$8A,$7E,$73,$69,$5E,$52,$47,$3F,$35,$2D,$26,$20,$19,$15,$10,$0D,$0B,$09,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$0A,$0C,$10,$13,$16,$1D,$22,$2A,$31,$3A,$44,$4F,$57,$64,$6E,$7A,$85,$90,$9B,$A5,$B0,$B9,$C1,$C9,$D1,$D8,$DE,$E3,$E8,$ED,$EF,$F1,$F5,$F8,$F9),
    ($F9,$F7,$F6,$F3,$F0,$EB,$E8,$E3,$DE,$D8,$D1,$CA,$C2,$BA,$B0,$A6,$9D,$92,$87,$7C,$71,$66,$5B,$51,$46,$3D,$34,$2D,$26,$1F,$1A,$15,$11,$0F,$0C,$09,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$0A,$0D,$10,$13,$17,$1C,$23,$29,$32,$3A,$43,$4C,$57,$61,$6D,$77,$83,$8E,$98,$A2,$AD,$B5,$BF,$C7,$CE,$D5,$DB,$E1,$E6,$EA,$ED,$F1,$F4,$F6,$F8,$F9),
    ($F9,$F8,$F6,$F4,$F2,$ED,$EA,$E6,$E1,$DC,$D5,$CF,$C8,$BF,$B7,$AD,$A4,$99,$90,$86,$7A,$6F,$65,$59,$50,$46,$3E,$35,$2C,$26,$20,$1B,$15,$12,$0F,$0C,$09,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$09,$0B,$0D,$11,$14,$18,$1D,$23,$2B,$32,$3A,$43,$4C,$55,$60,$6B,$75,$81,$8C,$96,$9F,$AA,$B3,$BD,$C3,$CB,$D3,$D9,$DF,$E4,$E9,$EC,$F0,$F3,$F6,$F8,$F9,$FB),
    ($FA,$F9,$F7,$F5,$F4,$F0,$EC,$E9,$E4,$DF,$DA,$D4,$CD,$C5,$BE,$B5,$AC,$A2,$98,$8E,$83,$79,$6F,$64,$5A,$50,$47,$3E,$36,$2E,$27,$21,$1B,$17,$13,$10,$0D,$0A,$06,$07,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$06,$09,$0C,$0F,$11,$15,$1A,$1F,$25,$2C,$33,$3A,$43,$4C,$54,$5F,$69,$74,$7F,$8A,$94,$9D,$A7,$B1,$BB,$C1,$C9,$D0,$D7,$DD,$E2,$E7,$EC,$EE,$F2,$F4,$F7,$F7,$FA,$FB),
    ($FB,$F9,$F8,$F7,$F5,$F3,$EF,$EC,$E7,$E2,$DE,$D8,$D2,$CC,$C3,$BC,$B4,$AB,$A1,$96,$8C,$82,$77,$6E,$64,$5A,$50,$47,$3E,$37,$2E,$29,$23,$1D,$19,$15,$11,$0E,$0C,$0B,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$06,$09,$0B,$0D,$11,$13,$17,$1A,$20,$26,$2C,$33,$3B,$43,$4B,$55,$60,$6A,$73,$7E,$88,$92,$9B,$A5,$AE,$B9,$C0,$C8,$CF,$D4,$DB,$E2,$E5,$EA,$EE,$F1,$F4,$F5,$F7,$F9,$FB,$FC),
    ($FA,$FB,$F9,$F7,$F7,$F4,$F1,$ED,$EA,$E5,$E1,$DD,$D7,$D1,$C9,$C2,$BA,$B1,$A8,$9F,$96,$8C,$82,$78,$6E,$64,$5A,$51,$48,$3F,$38,$31,$29,$24,$1F,$1A,$16,$13,$11,$0D,$0C,$09,$06,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$07,$09,$0B,$0E,$10,$11,$15,$19,$1D,$21,$27,$2D,$35,$3B,$44,$4D,$56,$60,$69,$74,$7E,$88,$91,$9B,$A5,$AD,$B7,$BF,$C6,$CD,$D4,$DA,$E0,$E4,$E8,$EC,$F0,$F3,$F5,$F7,$F9,$FA,$FA,$FC),
    ($FC,$FB,$F9,$F9,$F7,$F4,$F2,$F0,$ED,$E8,$E4,$E0,$DB,$D6,$D0,$C9,$C1,$B9,$B1,$A9,$9F,$96,$8C,$82,$79,$6E,$65,$5C,$52,$49,$42,$39,$32,$2C,$27,$21,$1D,$19,$15,$13,$10,$0E,$0B,$08,$08,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$06,$08,$0B,$0C,$0F,$12,$14,$18,$1B,$1F,$25,$2A,$2F,$36,$3E,$46,$4E,$57,$60,$6A,$73,$7E,$87,$92,$99,$A4,$AE,$B6,$BD,$C5,$CC,$D2,$D8,$DE,$E3,$E8,$EB,$EE,$F2,$F4,$F5,$F8,$FA,$FB,$FC,$FD),
    ($FC,$FC,$FB,$FA,$F8,$F5,$F5,$F3,$EF,$EB,$E7,$E3,$E0,$DA,$D5,$CE,$C8,$C1,$B9,$B1,$A7,$9F,$96,$8C,$82,$79,$70,$66,$5D,$55,$4B,$43,$3D,$35,$2F,$2A,$24,$1F,$1B,$18,$15,$12,$10,$0D,$0C,$0A,$08,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$07,$07,$09,$0B,$0B,$0D,$10,$10,$14,$17,$1A,$1D,$21,$26,$2C,$32,$39,$40,$48,$50,$5A,$63,$6A,$75,$7E,$86,$92,$9A,$A3,$AD,$B5,$BE,$C5,$CB,$D2,$D6,$DD,$E1,$E6,$EB,$EE,$F0,$F3,$F6,$F7,$FA,$FB,$FC,$FD,$FD),
    ($FC,$FC,$FB,$FB,$F9,$F7,$F5,$F5,$F2,$EE,$EC,$E8,$E3,$DE,$D9,$D4,$CD,$C7,$C0,$B8,$B0,$A8,$9F,$94,$8C,$84,$7A,$71,$68,$60,$57,$4E,$46,$3F,$39,$33,$2C,$27,$23,$1F,$1A,$18,$16,$13,$10,$10,$0D,$0A,$09,$09,$07,$06,$06,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$06,$06,$06,$06,$09,$08,$0B,$0B,$0C,$0D,$10,$11,$14,$16,$1A,$1C,$21,$25,$29,$2F,$36,$3C,$44,$4B,$53,$5B,$64,$6D,$77,$7F,$89,$92,$9A,$A4,$AD,$B4,$BD,$C4,$CA,$D0,$D7,$DC,$E1,$E5,$EA,$ED,$EF,$F2,$F4,$F8,$F9,$FA,$FB,$FD,$FD,$FD),
    ($FD,$FC,$FC,$FB,$FA,$F9,$F8,$F6,$F4,$F1,$EE,$EA,$E7,$E2,$DD,$D9,$D3,$CD,$C6,$C0,$B7,$AF,$A9,$9F,$97,$8E,$85,$7D,$74,$6A,$62,$5A,$52,$4B,$44,$3C,$36,$30,$2B,$26,$22,$1F,$1C,$19,$16,$14,$12,$0F,$0E,$0D,$0C,$0A,$0B,$09,$08,$07,$07,$06,$06,$06,$06,$06,$08,$08,$06,$09,$09,$0B,$0A,$0C,$0D,$0F,$10,$11,$13,$16,$17,$1A,$1E,$20,$24,$29,$2E,$33,$3A,$41,$48,$4E,$56,$5E,$67,$70,$78,$82,$8A,$93,$9B,$A3,$AC,$B5,$BC,$C4,$CA,$D1,$D6,$DC,$E1,$E5,$E8,$EC,$EF,$F2,$F5,$F7,$F9,$FA,$FB,$FC,$FD,$FD,$FE),
    ($FD,$FD,$FC,$FC,$FB,$FA,$F9,$F7,$F6,$F4,$F1,$EE,$E9,$E6,$E2,$DD,$D8,$D3,$CE,$C6,$BF,$B7,$B0,$A9,$A0,$98,$8F,$88,$7F,$75,$6D,$65,$5D,$56,$4F,$48,$41,$3C,$36,$30,$2B,$27,$23,$1F,$1D,$1B,$18,$16,$15,$13,$11,$10,$0F,$0F,$0E,$0C,$0C,$0C,$0C,$0B,$0B,$0B,$0C,$0C,$0C,$0E,$0D,$0E,$10,$11,$13,$14,$14,$16,$19,$1C,$1F,$21,$25,$29,$2D,$32,$39,$3F,$45,$4B,$53,$5A,$62,$6A,$73,$7A,$84,$8C,$95,$9D,$A3,$AC,$B5,$BB,$C2,$CA,$D1,$D6,$DB,$E0,$E4,$E9,$EB,$EE,$F2,$F4,$F6,$F8,$F9,$FA,$FB,$FC,$FD,$FD,$FE),
    ($FE,$FD,$FD,$FC,$FC,$FB,$FA,$F7,$F7,$F4,$F3,$F0,$ED,$EA,$E5,$E2,$DD,$D8,$D3,$CE,$C7,$C1,$B9,$B1,$AA,$A1,$9A,$91,$8A,$81,$79,$70,$69,$62,$5A,$53,$4D,$47,$41,$3A,$35,$31,$2D,$29,$25,$22,$1F,$1C,$1B,$19,$18,$17,$14,$14,$13,$11,$12,$11,$11,$11,$10,$11,$10,$11,$11,$12,$13,$15,$16,$17,$17,$1A,$1B,$1E,$21,$25,$26,$2B,$2F,$33,$38,$3E,$43,$4A,$50,$56,$5E,$66,$6D,$75,$7D,$86,$8D,$96,$9E,$A6,$AD,$B5,$BC,$C4,$CA,$D0,$D6,$DB,$E0,$E4,$E8,$EB,$EE,$F1,$F5,$F6,$F7,$F9,$FB,$FB,$FC,$FD,$FD,$FE,$FE),
    ($FE,$FD,$FD,$FD,$FC,$FB,$FB,$F9,$F8,$F6,$F5,$F3,$EF,$EC,$EA,$E6,$E2,$DD,$D8,$D3,$CD,$C7,$C2,$BB,$B2,$AB,$A3,$9C,$94,$8D,$85,$7D,$75,$6E,$67,$5F,$58,$52,$4D,$47,$42,$3B,$37,$33,$2F,$2C,$28,$26,$23,$20,$1F,$1C,$1C,$1A,$19,$18,$17,$17,$17,$16,$16,$16,$16,$18,$18,$18,$19,$1B,$1D,$1E,$1F,$22,$23,$27,$29,$2D,$31,$35,$3A,$3E,$44,$49,$4F,$54,$5C,$63,$6B,$71,$79,$81,$89,$91,$99,$A0,$A8,$B0,$B6,$BD,$C5,$CA,$D0,$D5,$DB,$E0,$E4,$E8,$EC,$EF,$F1,$F4,$F6,$F8,$F8,$FA,$FB,$FC,$FC,$FD,$FE,$FE,$FE),
    ($FE,$FE,$FE,$FD,$FD,$FC,$FA,$FA,$F9,$F7,$F7,$F5,$F2,$EF,$EE,$EA,$E5,$E1,$DD,$D8,$D3,$CE,$C9,$C2,$BB,$B5,$AE,$A6,$9F,$98,$90,$88,$82,$7A,$73,$6B,$65,$5E,$59,$53,$4D,$47,$43,$3D,$39,$36,$33,$2F,$2D,$2A,$28,$27,$24,$23,$22,$20,$1F,$1E,$1E,$1E,$1E,$1E,$1E,$1F,$20,$20,$21,$23,$25,$26,$28,$2C,$2E,$31,$34,$38,$3C,$40,$46,$4B,$50,$56,$5C,$61,$68,$70,$77,$7E,$86,$8B,$93,$9D,$A4,$A9,$B2,$B9,$BE,$C6,$CD,$D1,$D7,$DB,$E0,$E4,$E9,$EB,$ED,$F1,$F4,$F6,$F6,$F8,$FA,$FB,$FC,$FC,$FD,$FE,$FE,$FE,$FE),
    ($FE,$FE,$FE,$FD,$FD,$FC,$FC,$FB,$FA,$F9,$F8,$F6,$F3,$F2,$EF,$EC,$EA,$E5,$E2,$DD,$D9,$D4,$CF,$CA,$C4,$BE,$B7,$B1,$AA,$A1,$9A,$94,$8D,$86,$7F,$78,$71,$6B,$65,$5F,$59,$54,$4F,$49,$46,$42,$3E,$39,$37,$34,$33,$30,$2E,$2C,$2A,$2A,$29,$27,$27,$27,$26,$27,$27,$28,$2A,$2A,$2B,$2D,$2F,$30,$33,$36,$38,$3C,$40,$44,$48,$4C,$52,$57,$5C,$62,$68,$6F,$76,$7C,$83,$8A,$90,$98,$9F,$A7,$AE,$B4,$BA,$C1,$C6,$CD,$D3,$D7,$DC,$E0,$E4,$E7,$EB,$EE,$F0,$F4,$F6,$F8,$F9,$FA,$FB,$FC,$FC,$FD,$FE,$FE,$FD,$FE,$FF),
    ($FF,$FE,$FE,$FE,$FE,$FD,$FC,$FB,$FB,$FA,$F9,$F7,$F6,$F5,$F3,$EF,$ED,$EA,$E6,$E2,$DE,$DA,$D5,$D1,$CC,$C5,$BF,$B9,$B4,$AB,$A6,$9F,$99,$93,$8C,$85,$7E,$78,$71,$6C,$65,$61,$5C,$57,$53,$4E,$49,$47,$44,$41,$3D,$3B,$3A,$37,$36,$34,$33,$33,$32,$32,$31,$31,$33,$34,$34,$36,$37,$38,$3A,$3C,$3E,$42,$45,$49,$4C,$50,$55,$5A,$5E,$63,$69,$70,$75,$7B,$82,$88,$8F,$96,$9D,$A2,$AA,$B0,$B6,$BD,$C3,$C8,$CF,$D3,$D8,$DD,$E0,$E4,$E7,$EA,$EE,$F0,$F3,$F5,$F7,$F9,$F9,$FB,$FC,$FC,$FC,$FD,$FE,$FD,$FE,$FF,$FF),
    ($FF,$FF,$FE,$FE,$FE,$FD,$FD,$FC,$FA,$FB,$FA,$F9,$F8,$F7,$F4,$F3,$F0,$EC,$EA,$E7,$E3,$DF,$DA,$D7,$D2,$CC,$C7,$C2,$BD,$B6,$B0,$A9,$A5,$9E,$98,$92,$8B,$85,$7F,$79,$73,$6D,$6A,$65,$60,$5B,$56,$52,$50,$4E,$4B,$48,$45,$44,$42,$41,$3F,$3E,$3D,$3E,$3E,$3E,$3E,$3F,$40,$41,$43,$45,$47,$49,$4C,$4F,$52,$55,$5A,$5D,$62,$66,$6C,$71,$76,$7C,$82,$88,$8E,$94,$9A,$A2,$A7,$AC,$B3,$BA,$C0,$C5,$CB,$D0,$D5,$D9,$DD,$E1,$E5,$E9,$EB,$ED,$F0,$F4,$F5,$F7,$F8,$FA,$FB,$FC,$FC,$FC,$FD,$FD,$FE,$FE,$FF,$FF,$FF),
    ($FF,$FF,$FE,$FE,$FE,$FE,$FC,$FD,$FC,$FB,$FB,$FA,$F8,$F7,$F5,$F5,$F2,$EF,$ED,$EA,$E7,$E3,$DF,$DC,$D8,$D3,$CE,$CA,$C5,$BF,$B9,$B3,$AE,$A8,$A2,$9C,$98,$92,$8C,$86,$80,$7B,$77,$72,$6C,$68,$64,$61,$5D,$5A,$58,$56,$53,$51,$4F,$4E,$4C,$4C,$4A,$4B,$4A,$4C,$4B,$4C,$4D,$4F,$50,$51,$54,$57,$5A,$5D,$60,$63,$67,$6A,$70,$74,$79,$7F,$83,$89,$8F,$93,$9B,$9F,$A5,$AC,$B1,$B6,$BC,$C1,$C8,$CE,$D1,$D6,$DB,$DE,$E1,$E5,$EA,$ED,$EE,$F1,$F3,$F6,$F7,$F8,$FA,$FB,$FC,$FC,$FD,$FD,$FD,$FE,$FE,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FE,$FE,$FE,$FE,$FD,$FD,$FC,$FC,$FB,$FA,$F9,$F8,$F6,$F4,$F3,$F1,$ED,$EB,$E9,$E4,$E1,$DD,$DA,$D5,$D0,$CD,$C7,$C3,$BE,$B8,$B3,$AD,$A8,$A2,$9E,$97,$93,$8D,$89,$84,$7F,$7A,$77,$72,$6E,$6C,$69,$66,$63,$60,$5E,$5C,$5B,$59,$5A,$59,$57,$57,$58,$5A,$59,$5A,$5B,$5E,$60,$61,$64,$68,$6A,$6E,$72,$75,$79,$7D,$82,$86,$8C,$91,$96,$9B,$9F,$A6,$AB,$B0,$B7,$BB,$C1,$C5,$CA,$CF,$D4,$D8,$DC,$E0,$E3,$E6,$E9,$ED,$F0,$F1,$F3,$F5,$F7,$F9,$FA,$FB,$FC,$FC,$FD,$FD,$FE,$FE,$FF,$FF,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FF,$FF,$FE,$FE,$FD,$FD,$FC,$FC,$FC,$FB,$FA,$F8,$F8,$F7,$F5,$F3,$F0,$EE,$EC,$E9,$E6,$E2,$DF,$DB,$D6,$D3,$CF,$CB,$C6,$C1,$BC,$B8,$B2,$AD,$A8,$A3,$A0,$99,$95,$91,$8C,$88,$84,$81,$7D,$7A,$77,$74,$71,$6E,$6D,$6B,$6A,$68,$68,$67,$66,$66,$67,$68,$68,$69,$6A,$6C,$6D,$6F,$72,$75,$78,$7B,$7F,$83,$87,$8B,$90,$94,$98,$9E,$A1,$A6,$AC,$AF,$B6,$BB,$C0,$C4,$C8,$CD,$D2,$D6,$DA,$DD,$E1,$E4,$E7,$EB,$ED,$F0,$F1,$F3,$F5,$F7,$F8,$F9,$FB,$FB,$FC,$FC,$FD,$FD,$FE,$FE,$FF,$FF,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FE,$FD,$FD,$FD,$FC,$FB,$FB,$FA,$F9,$F7,$F7,$F6,$F4,$F1,$EE,$ED,$EB,$E7,$E4,$E2,$DD,$DA,$D6,$D2,$CD,$CA,$C5,$C2,$BD,$B7,$B3,$AF,$AA,$A5,$A1,$9E,$9A,$95,$91,$8E,$8B,$88,$85,$82,$7F,$7D,$7A,$79,$77,$76,$75,$75,$75,$74,$74,$75,$76,$77,$78,$7A,$7C,$7E,$80,$83,$86,$88,$8C,$8F,$94,$97,$9B,$9F,$A3,$A8,$AD,$B2,$B6,$BA,$C0,$C3,$C8,$CC,$D1,$D5,$D8,$DC,$DF,$E2,$E6,$E8,$EB,$ED,$F0,$F3,$F4,$F6,$F8,$F8,$F9,$FB,$FC,$FD,$FD,$FD,$FE,$FE,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FE,$FE,$FE,$FD,$FD,$FC,$FC,$FC,$FA,$FA,$F8,$F7,$F6,$F4,$F2,$F1,$ED,$EB,$E9,$E6,$E2,$E0,$DC,$D9,$D5,$D1,$CD,$CA,$C6,$C2,$BE,$B9,$B5,$B0,$AD,$A9,$A5,$A1,$9D,$9B,$98,$95,$91,$8E,$8D,$8B,$88,$86,$85,$85,$84,$83,$83,$83,$83,$84,$85,$85,$87,$88,$89,$8C,$8D,$90,$93,$96,$9A,$9C,$9F,$A5,$A7,$AB,$B0,$B4,$B8,$BC,$BF,$C3,$C7,$CC,$D0,$D3,$D7,$DB,$DE,$E1,$E5,$E7,$EA,$EC,$F0,$F1,$F3,$F5,$F6,$F7,$F9,$FA,$FB,$FC,$FC,$FD,$FD,$FD,$FE,$FE,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FE,$FE,$FE,$FD,$FD,$FC,$FC,$FB,$FB,$FA,$F8,$F7,$F6,$F5,$F2,$F0,$EF,$ED,$EA,$E7,$E5,$E1,$DF,$DC,$D9,$D5,$D2,$CD,$CB,$C7,$C2,$BE,$BB,$B7,$B5,$B1,$AD,$AA,$A7,$A5,$A1,$9E,$9C,$9A,$98,$95,$95,$93,$92,$91,$91,$8F,$90,$90,$92,$93,$94,$95,$96,$97,$99,$9C,$9E,$A0,$A3,$A6,$A8,$AB,$B0,$B2,$B5,$BA,$BD,$C2,$C4,$C8,$CD,$D0,$D4,$D7,$DA,$DD,$E0,$E3,$E6,$EA,$EC,$EE,$F0,$F2,$F3,$F6,$F8,$F9,$F9,$FA,$FB,$FC,$FC,$FC,$FD,$FE,$FE,$FE,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FD,$FE,$FE,$FD,$FD,$FD,$FC,$FB,$FA,$F9,$F8,$F7,$F6,$F5,$F4,$F2,$EF,$EE,$EC,$E9,$E6,$E4,$E1,$DF,$DC,$D9,$D6,$D3,$CF,$CC,$C9,$C4,$C2,$BE,$BB,$B8,$B6,$B3,$AF,$AC,$AC,$A9,$A6,$A6,$A2,$A1,$A0,$A0,$9F,$9E,$9E,$9E,$9D,$9F,$9F,$A0,$A1,$A3,$A4,$A7,$A8,$AA,$AD,$AF,$B0,$B4,$B7,$B9,$BC,$BF,$C3,$C7,$CA,$CC,$D1,$D3,$D7,$DA,$DD,$DF,$E2,$E5,$E8,$EB,$ED,$EF,$F0,$F3,$F5,$F6,$F8,$F8,$FA,$FB,$FC,$FC,$FD,$FD,$FD,$FD,$FE,$FE,$FE,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FE,$FE,$FD,$FD,$FD,$FC,$FC,$FB,$FA,$F8,$F7,$F7,$F6,$F4,$F3,$F1,$EF,$ED,$EA,$EA,$E6,$E4,$E1,$DE,$DD,$DA,$D7,$D3,$D0,$CD,$CB,$C7,$C4,$C3,$BF,$BC,$BB,$B8,$B6,$B4,$B3,$B1,$B0,$AE,$AC,$AB,$AA,$AB,$AA,$AB,$AA,$AB,$AB,$AD,$AE,$AE,$AF,$B1,$B4,$B4,$B8,$B8,$BB,$BD,$C1,$C4,$C6,$C9,$CC,$CF,$D1,$D4,$D8,$DA,$DD,$DF,$E2,$E4,$E7,$EA,$ED,$EF,$EF,$F3,$F4,$F5,$F6,$F8,$F9,$FA,$FB,$FA,$FC,$FD,$FC,$FD,$FE,$FE,$FE,$FE,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FE,$FE,$FE,$FD,$FD,$FB,$FB,$FB,$FA,$FA,$F9,$F8,$F7,$F5,$F4,$F3,$F0,$EE,$EE,$EB,$E8,$E7,$E4,$E2,$DF,$DD,$DA,$D8,$D6,$D3,$D0,$CE,$CB,$C8,$C6,$C4,$C2,$C1,$BF,$BD,$BA,$BA,$B8,$B8,$B6,$B5,$B6,$B6,$B6,$B7,$B7,$B7,$B7,$B8,$B9,$BA,$BC,$BF,$BF,$C1,$C3,$C6,$C7,$CA,$CD,$CF,$D1,$D4,$D7,$D9,$DC,$DE,$E0,$E2,$E5,$E7,$EA,$EB,$EE,$EF,$F1,$F4,$F5,$F6,$F8,$F9,$F9,$FA,$FB,$FB,$FC,$FD,$FD,$FD,$FE,$FE,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FE,$FE,$FE,$FE,$FE,$FC,$FB,$FC,$FC,$FB,$FA,$F9,$F7,$F7,$F5,$F4,$F3,$F1,$F0,$EF,$ED,$EA,$EA,$E6,$E4,$E3,$E0,$DE,$DC,$DA,$D8,$D6,$D3,$D2,$CE,$CE,$CC,$CA,$C8,$C7,$C6,$C4,$C3,$C3,$C1,$C0,$C1,$C0,$C1,$C1,$C1,$C2,$C2,$C3,$C4,$C5,$C7,$C8,$CA,$CC,$CD,$CF,$D0,$D2,$D5,$D7,$D9,$DB,$DD,$E0,$E2,$E3,$E5,$E7,$EB,$EC,$EE,$F0,$F2,$F3,$F5,$F6,$F7,$F8,$F8,$FA,$FB,$FB,$FC,$FC,$FD,$FE,$FE,$FD,$FE,$FE,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FE,$FE,$FE,$FE,$FD,$FD,$FD,$FC,$FB,$FB,$FA,$FA,$F8,$F8,$F6,$F5,$F4,$F4,$F0,$F0,$EE,$EE,$EC,$E9,$E7,$E5,$E4,$E2,$E0,$DF,$DD,$DB,$DA,$D7,$D6,$D4,$D2,$D1,$D0,$CE,$CD,$CC,$CC,$CB,$CB,$CB,$CA,$CB,$CA,$CB,$CC,$CC,$CC,$CE,$CE,$CE,$D1,$D1,$D4,$D4,$D7,$D8,$DA,$DC,$DF,$DF,$E1,$E4,$E5,$E7,$E9,$EB,$EC,$ED,$EF,$F0,$F3,$F5,$F6,$F7,$F7,$F9,$FA,$FA,$FB,$FB,$FC,$FD,$FD,$FD,$FE,$FE,$FE,$FE,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF),
    ($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FE,$FE,$FE,$FE,$FD,$FC,$FC,$FC,$FB,$FB,$FA,$F9,$F9,$F7,$F7,$F6,$F3,$F3,$F2,$F1,$EF,$EE,$ED,$EB,$E9,$E8,$E5,$E4,$E2,$E0,$DF,$DE,$DD,$DC,$DA,$D9,$D8,$D6,$D5,$D5,$D4,$D4,$D3,$D3,$D3,$D3,$D3,$D3,$D4,$D4,$D5,$D6,$D6,$D7,$D9,$DA,$DB,$DC,$DE,$DF,$E1,$E2,$E3,$E5,$E6,$E8,$EA,$EC,$ED,$EF,$F0,$F1,$F2,$F4,$F6,$F7,$F8,$F9,$FA,$FA,$FB,$FB,$FC,$FC,$FC,$FC,$FE,$FE,$FE,$FE,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF)
);

procedure RevealDraw(x,y:integer;ABitmap0,ABitmap1,ABitmap:TBitmap);
var
  x0,y0,x1,y1:integer;
  i0,j0:integer;
  i,j:integer;
  SL,SL0,SL1: pByteArray;
  k0,k1,k2:integer;
  d:byte;
begin
  ABitmap.Assign(ABitmap0);
  if x<0 then exit;
  x0:=x-RMMaskR; x1:=x+RMMaskR; i0:=x0;
  y0:=y-RMMaskR; y1:=y+RMMaskR; j0:=y0;
  // クリッピング
  if x0<0 then begin
    i0:=x0; x0:=0;
  end;
  if y0<0 then begin
    j0:=y0; y0:=0;
  end;

  if x1>=ABitmap0.Width then begin
    x1:=ABitmap0.Width-1;
  end;
  if y1>=ABitmap0.Height then begin
    y1:=ABitmap0.Height-1;
  end;
  for j:=y0 to y1 do begin
    SL :=ABitmap.ScanLine[j];
    SL0:=ABitmap0.ScanLine[j];
    SL1:=ABitmap1.ScanLine[j];
    for i:= x0 to x1 do begin
      k0:=i*3; k1:=k0+1; k2:=k0+2;
      d:=RMMask[i-i0,j-j0];
      SL[k0]:=trunc((SL0[k0]*d+SL1[k0]*($FF-d))/$FF);
      SL[k1]:=trunc((SL0[k1]*d+SL1[k1]*($FF-d))/$FF);
      SL[k2]:=trunc((SL0[k2]*d+SL1[k2]*($FF-d))/$FF);
    end;
  end;
end;

procedure RMenuBitmapToImage(ABitmap,MBitmap:TBitmap;AAlpha:byte;AImage:TImage);
// BitmapをImageコンポーネントに転送 PNGImage経由でないと透明にならない
var
  PngImage: TPngImage;
  x,y: integer;
  SL0,SLM: pByteArray;
  a:Single;
begin
  PngImage := TPngImage.Create;
  a:=(255-AAlpha)/255;
  try
    PngImage.Assign(ABitmap);
    PngImage.CreateAlpha;
    for y:=0 to PngImage.Height-1 do begin
      SL0 := PngImage.AlphaScanline[y];
      SLM := MBitmap.ScanLine[y];
      for x:=0 to PngImage.Width-1 do begin
        SL0[x]:=AAlpha+Trunc(SLM[x*3]*a);
      end;
    end;
    AImage.Picture.Assign(PngImage);
  finally
    PngImage.Free;
  end;
end;

var
  isMenuUpdated:Boolean;                       // 更新されたらTrue タイマーでビットマップが更新される
  MenuBitmap0,MenuBitmap1,MenuBitmap2:TBitmap; // メニューを描画するためのビットマップ
  MenuBitmapM:TBitmap;                         // メニューのマスク画像
  isMenuMove:boolean;                          // マウスがメニュー場を移動しているか
  MenuX,MenuY:integer;                         // ホバー時のマウスカーソルの位置
  MenuIndex0,MenuIndex1:integer;               // 現在選択されているメニューのインデックス 選ばれていないときは-1
  MenuState:TMenuState;                        // マウスが押されているか
  MenuWidth:integer;                           // メニューの幅

function MenuIndexGet(AX,AY:integer):integer; // メニューの選択番号を返す
var
  r:integer;
begin
  r:=AY div fdw3;
  if (AX<0)or(AX>=MenuWidth) then begin
    r:=-1;
  end;
  Result:=r;
end;

//

procedure RMenuCreate;
begin
  RMenuList:=TStringList.Create;
  MenuBitmap0:=TBitmap.Create; MenuBitmap0.PixelFormat:=pf24bit;
  MenuBitmap1:=TBitmap.Create; MenuBitmap1.PixelFormat:=pf24bit;
  MenuBitmap2:=TBitmap.Create; MenuBitmap2.PixelFormat:=pf24bit;
  MenuBitmapM:=TBitmap.Create; MenuBitmapM.PixelFormat:=pf24bit;
  RMenuIndex:=-1;
end;

procedure RMenuUpdate(AWidth,AHeight:integer); // メニューの情報を更新
begin
  isMenuUpdated:=False;
  MenuWidth:=AWidth;
  MenuBitmap0.SetSize(AWidth,AHeight);
  MenuBitmap1.SetSize(AWidth,AHeight);
  MenuBitmap2.SetSize(AWidth,AHeight);
  MenuBitmapM.SetSize(AWidth,AHeight);

  isMenuMove:=False;
  MenuIndex0:=-1; MenuIndex1:=-1;
  MenuState:=TMenuState.msNormal;
  isMenuUpdated:=True;
end;

procedure RMenuDestroy; // メニューを破棄
begin
  RMenuList.Free;
  MenuBitmap0.Free;
  MenuBitmap1.Free;
  MenuBitmap2.Free;
  MenuBitmapM.Free;
end;

procedure RMenuMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); // メニューのOnMouseDown処理
var
  LIndex:integer;
begin
  isMenuUpdated:=False;
  LIndex:=MenuIndexGet(X,Y);
  if (LIndex>=0)and(LIndex<RMenuList.Count) then begin
    MenuIndex0:=LIndex;
    MenuIndex1:=LIndex;
    MenuState:=TMenuState.msSelected;
  end;
  MenuX:=X; MenuY:=Y;
  isMenuMove:=True;
  isMenuUpdated:=True;
end;

procedure RMenuMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); // メニューのOnMouseMove処理
var
  LIndex:integer;
begin
  isMenuUpdated:=False;
  LIndex:=MenuIndexGet(X,Y);
  MenuIndex1:=LIndex;
  if (LIndex>=0)and(LIndex<RMenuList.Count) then begin
    if MenuIndex0=-1 then begin // MouseDownしてなかったら
      MenuState:=TMenuState.msHover;
    end else begin
      if MenuIndex0=LIndex then begin
        MenuState:=TMenuState.msSelected;
      end else begin
        MenuIndex1:=-1;
        MenuState:=TMenuState.msNormal;
      end;
    end;
  end else begin
    MenuState:=TMenuState.msNormal;
  end;
  MenuX:=X; MenuY:=Y;
  isMenuMove:=True;
  isMenuUpdated:=True;
end;

procedure RMenuMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); // メニューのOnMouseUp処理
var
  LIndex:integer;
begin
  isMenuUpdated:=False;
  LIndex:=MenuIndexGet(X,Y);
  if (LIndex=MenuIndex0) then begin
    RMenuIndex:=LIndex;
  end else begin
    RMenuIndex:=-1;
  end;
  MenuIndex0:=-1;
  MenuState:=TMenuState.msHover;
  isMenuMove:=True;
  isMenuUpdated:=True;
end;

procedure RMenuTimer(AHandle:HWND;AImage:TImage;AImageList:TImageList); // メニューのOnTimerの処理
// AHandleはImageのParent.Handleで取得できるはず
var
  P: TPoint;
begin // ボタン描画用
  if isMenuUpdated=False then exit;
  if MenuIndex1<>-1 then begin
    winapi.Windows.GetCursorPos(P);
    winapi.Windows.ScreenToClient(aHandle,P);
    if (P.X<(AImage.Left))or(P.X>(AImage.Left+AImage.Width))
     or (P.Y<(AImage.Top))or(P.Y>(AImage.Top +AImage.Height)) then begin
      MenuIndex1:=-1;
      MenuX:=-1;MenuY:=-1;
      MenuState:=TMenuState.msNormal;
    end;
  end;
  RMenuNColor:=RMenuColorOrgGet(TMenuState.msNormal);
  RMenuSColor:=RMenuColorOrgGet(MenuState);
  RMenuPDraw(MenuBitmap1,RMenuList,AImageList,MenuIndex1);
  RMenuMDraw(MenuBitmapM,RMenuList,AImageList);
  if isMenuMove then begin
    RMenuNColor:=RMenuColorSptGet(TMenuState.msNormal);
    RMenuSColor:=RMenuColorSptGet(MenuState);
    RMenuPDraw(MenuBitmap2,RMenuList,AImageList,MenuIndex1);
    RevealDraw(MenuX,MenuY,MenuBitmap1,MenuBitmap2,MenuBitmap0);
    RMenuBitmapToImage(MenuBitmap0,MenuBitmapM,100,AImage);
    isMenuMove:=False;
  end else begin
    RMenuBitmapToImage(MenuBitmap1,MenuBitmapM,100,AImage);
  end;
  isMenuUpdated:=False;
end;

利用するフォームの設定

これを使って,フォームにボタンButton1とImage1,Timer1,ImageList1
を配置します。
フォームは,DoubleBufferedをTrueに設定してください。

フォームの上48ピクセルはフォームの移動用になりますので,配置しないでください。
Image1は幅256ピクセル 高さ150ピクセル以上で,ボトムにもアンカーを設定してください。
Timer1はEnabledをFalseに,Intervalを100に設定してください。
(ボタン描画は0.1秒ごとに行われます)
ImageList1はHeightとWidthを16に設定し,ColorDepthをcd24Bitにしてください。メニューの数の画像を用意して,イメージリストに追加してください。追加時には透明色を黒と白以外に設定してください。
画像は黒いところが透明に,白いところが文字と同じ色に描画されます。灰色は半透明に表示されます。他の色は使わないでください。

フォームのコードは以下のようになります。

unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls,
  System.ImageList, Vcl.ImgList,
  uFLuent;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    ImageList1: TImageList;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormResize(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
    procedure Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
    procedure Timer1Timer(Sender: TObject);
  private
    procedure WMNCHitTest(var Msg: TWMNCHitTest);message WM_NCHITTEST;
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
  Vcl.GraphUtil;

procedure TForm1.WMNCHitTest(var Msg: TWMNCHitTest);
begin
  inherited;
  _WMNCHitTest(Self,Msg); // アクリルフォームがリサイズや移動ができるための処理
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  AcrylicFormSet(Self,$11FF0000); // アクリルフォームにする

  RMenuCreate; // メニューの初期化

  // メニュー項目の追加
  RMenuList.Add('Menu1');
  RMenuList.Add('Menu2');
  RMenuList.Add('Menu3');

  RMenuColorsSet($FF0000); // メニューの色相を決める $RRGGBB

  RMenuUpdate(Image1.Width,Image1.Height); // メニューの情報を更新

  Timer1.Enabled:=True;
end;

procedure TForm1.FormDestroy(Sender: TObject); // メニューを破棄
begin
  RMenuDestroy;
end;

procedure TForm1.FormResize(Sender: TObject);
begin
  RMenuUpdate(Image1.Width,Image1.Height); // メニューの情報を更新
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  LIndex:integer;
begin
  RMenuMouseDown(Sender,Button,Shift,X,Y); // メニューのOnMouseDown処理
  // Label1.Caption:='Down:'+IntToStr(LIndex);
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer);
begin
  RMenuMouseMove(Sender,Shift,X,Y); // メニューのOnMouseMove処理
  // Label1.Caption:=IntToStr(MenuIndex0);
end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  RMenuMouseUp(Sender,Button,Shift,X,Y); // メニューのOnMouseUp処理
  case RMenuIndex of // コマンドの実行
  0:begin
      button1.Caption:='0がクリックされました';
    end;
  1:begin
      button1.Caption:='1がクリックされました';
    end;
  2:begin
      button1.Caption:='2がクリックされました';
    end;
  end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin // ボタン描画用
  RMenuTimer(Self.Handle,Image1,ImageList1);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Close; // 終了ボタンが表示されないので,必ず作ってください
end;

end.

メニューが選択されるとボタンの文字が変わるようにしています。

実装時の注意

この機能もアクリルフォームと同じように,省電力のためオフにする機能が必要でしょう。

まとめ

VCLでもReveal Heighlight風のボタンを作ることができました。Timeイベントで描画しているので,アニメーションへの変更も可能だと思います。

参考文献

CODIGOBIT - Enable Windows 10 Aero Glass a.k.a Blur Behind in our Delphi project
http://vhanla.codigobit.info/2015/07/enable-windows-10-aero-glass-aka-blur.html
Slashback Software - Borderless window resizing with WM_NCHITTEST
https://slashbackassociates.com/blog/Borderless-window-resizing-with-WM-NCHITTEST
ACCENT_ENABLE_ACRYLICBLURBEHIND
https://stackoverflow.com/questions/32724187/how-do-you-set-the-glass-blend-colour-on-windows-10
RGBからHLS形式へ変換する
http://www.geocities.jp/asumaroyuumaro/program/tips/rgb2hls.html

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account