編集履歴一覧に戻る
TakSan0のアイコン画像

TakSan0 が 2024年10月31日23時49分42秒 に編集

初版

タイトルの変更

+

ラズパイ化CLOVA(統合版)

タグの変更

+

CLOVA

+

RaspberryPi

+

スマートスピーカー

+

改造

メイン画像の変更

メイン画像が設定されました

記事種類の変更

+

製作品

本文の変更

+

# 概要 サービス終了のせいで、全く使えなくなって文鎮化した AIスピーカーの LINE CLOVA を AIとの連携を使って生まれかえらせたという作品です。 # はじめに 本作品はサービス終了が決まった一昨年から去年いっぱいかけて開発したものですが、昨年「みんなのラズパイコンテスト」がもし復活したら是非に出そうと思っていたものです。 結局コンテストはコンテストの開催ないどころか、ラズパイマガジン自体が今年の1月で休刊となるという悲しい結末になりすっかり諦めていました。 そんな時に今回、elchika さんに主催が変わって別のラズパイコンテストが開催されることを知りました。過去作品でも応募できるとのことでしたので応募することにしました。 ただ別記事へのリンクは規約上許容されていない為、現状2つ分かれていたり、github 等の外部リソースへのリンクを含んでたりする記事を、そのまま掲載するわけにもいかず統合した記事をリンクを無くして新たに作成しました。 大部分の記事はそのままとなりますがご了承ください。 # 経緯 2022年10月末 衝撃の「LINE Clover アシスタンスサービス終了」の通知が流れました。 なかなか採算が取れないうえに売り上げも減ってきて撤退してしまうのでしょうか? サービス終了後は Bluetooth スピーカーとしてしか機能しなくなりました。 寂しいものです。 スピーカー自体の可愛いキャラクターに愛着がある人もいるし、スピーカーの音質もモノラルとはいえ全方向に聞こえて低音も以外に出て、聞きやすい音で気に入っている人やそのまま使い続けたい人はいるはずです。 発表当時の "[#CLOVA](https://twitter.com/search?q=%23CLOVA&src=typed_query&f=live) " での Xの投稿を見る限りでは、何とかしてほしいという声が複数流れていました。 というわけで、解決方法の一つのアプローチとして中にラズパイを仕込んで改造してみました。 ## どこまでできるの? どこまでできるかは、組み込むソフトウェア次第となりますが、ラズパイ Zero で出来る事は基本的に組み込めます。 先ずは以下の動画をご覧ください。現在開発中のアプリケーションの概要説明と動画デモとなります。 @[youtube](https://youtu.be/RHRIXFsqc5Y) こちらの [GitHub](https://github.com/TakSan0/CLOVA_RasPi) で公開したアプリケーションを導入することで、この動画の様な事ができます。 ここでは、Youtube 動画 及び X に投稿した動画のリンクだけ貼っておきます。 **出来る事紹介動画** @[youtube](https://youtu.be/2fhOI5egd2c) **Chat-GPT 組み込み ~あなた何者?編~** @[twitter](https://twitter.com/TakSan0/status/1634723380594081793) **Chat-GPT 組み込み ~完全な会話での負けを認める編~** @[twitter](https://twitter.com/TakSan0/status/1635420473726042112) **Chat-GPT 組み込み ~知らんけど編~** @[twitter](https://twitter.com/TakSan0/status/1636749921834663936) **Chat-GPT 組み込み ~おやじギャグで滑る編~** @[twitter](https://twitter.com/TakSan0/status/1636895946205282304) **Chat-GPT 組み込み ~恥ずかしい話編~** @[twitter](https://twitter.com/TakSan0/status/1636903243975643136) **Chat-GPT 組み込み ~しりとりやってみた編~** @[twitter](https://twitter.com/TakSan0/status/1638149503382585344) **Chat-GPT 組み込み ~なんで代理を編~** @[twitter](https://twitter.com/TakSan0/status/1638687190522957824) **Chat-GPT 組み込み ~終了日当日編~** @[twitter](https://twitter.com/TakSan0/status/1641388000830697483) # 分解 いきなり本題に入っていきますが、改造の入口は分解ですよね。という訳で分解から始めていきます。 使用する工具としては、柄の部分が長い #1 番のドライバー と先の細いピンセット、へら(底面の滑り止めゴムを取る時使う)くらいがあれば十分かと思います。 さらに改造時は半田付けセット(はんだごて、ピンセット、ニッパー、ペンチ等) が必要です 基本的にどのネジがどこについていたがわかるように、小箱等で種類を小分けして分解した順番に並べていく等して、工夫します。 ゴムシールやその他のシールは、再利用やもとに戻すときに使うかもしれないので、残しておくといいです。絨毯の上やごみ・埃がつくと粘着力がなくなり厄介なので、透明の袋の内側に貼っておくといいかと思います。 ## 分解手順 底面からアクセスしていきます。 ### 滑り止めゴム除去 底面に滑り止めのゴムが貼ってありますので、それをはがします。 ![入口はここから](https://camo.elchika.com/1eed346f74c7deac97e297595aeaa5fa8a86661d/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f33363965333935302d656236642d343139322d386332642d326234646464326138323966/) ### 透明フィルム除去 さらに透明フィルムが貼ってあるので、それもはがします。 ![透明フィルムもはがす](https://camo.elchika.com/cf2d1ec07a5f4b9e0e475495ba65ecaf0876ef26/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f64643931353730652d613061392d343233662d616235652d623834316537613633656339/) ### 底面ネジ除去 写真の赤▼の位置の4か所ネジを取ります。 ![底面ネジ位置](https://camo.elchika.com/2a085efa6b1f448d2b8a5df55ba271a5082e3abb/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f35663131386162622d313932372d346362392d396638612d323766326436643731353238/) ### 底面を開く 底面は付けたまま、コネクタの口とは反対側に倒すように慎重に開きます。 ![底面を外す](https://camo.elchika.com/c38d0be71574d453cf73da3cd93d122be202b973/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f61636533663134312d623037362d346539342d616535342d376364383063373666386265/) ### 底面分離 底面の中央部にフラットケーブルが接続されているので、シールを剥がしてから外します。 先の細いピンセットを爪の下に回り込ませて軽く持ち上げるとロックが外れ、ケーブルを抜くと簡単に取れます。(この時絶対に力を入れない事。抜けないときはロックが外れていません。) ![フラットケーブルを外す](https://camo.elchika.com/547d25271b6e2e1599da393cac280a264553ab28/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f62383564313935302d393664662d343464662d386633312d666637323330336265626466/) ケーブルが外れると底面が分離します。 ### USB基板除去 USBコネクタ基板の裏にもネジがあるので、写真の赤▼の USBコネクタ基板のネジ位置2か所外して基板をとります。 ![USB基板ネジ位置 ](https://camo.elchika.com/298a7514ee18a41d6408393910482fc484566394/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f31653365623132342d336461312d343537312d396339362d646665616161663865303036/) ### スピーカーカバー分離 写真の赤▼の USBコネクタ基板のネジ位置4か所外してカバーをとります。 ![スピーカーカバーネジ位置](https://camo.elchika.com/6c3b6c93e151b487442ad8e2a148f11705ab0ef3/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f35303065666261372d316135362d343934652d613532352d386431326439643365353864/) ネジを外したあと、慎重にゆっくりスライドさせる 分離するとスピーカーの幕がむき出しになるので、傷つけたり破ったりしない様に十分注意が必要です。 ![スピーカーカバースライド](https://camo.elchika.com/665c0e5319888c2bc109af0dbae1d1f89167a2ba/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f33343566386465322d333136392d346235302d626261382d303939323138646363333438/) ### 2-1-8. スピーカー分離 以下2つの写真の赤▼のネジ4か所をはずして分離します。 一番頭に近い奥のネジだけで、手前のものはそのままにします。 分離するともう片方のスピーカーの幕がむき出しになるので、同じ様に十分注意が必要です。 ![前側](https://camo.elchika.com/c3fe980c435bcda36511d42ac3974f39f4f43227/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f64333563383932632d306463352d346165372d386165612d356138363463646133383738/) ![後側](https://camo.elchika.com/90c39d0b3613d6b174f1ba80f31695aff9ba9609/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f35313133303736642d343635322d346630322d386333322d346436623238636264323837/) 頭部とはスピーカー線でつながっています。 頭部側に貼っているシールをはがすと、コネクタが見えるので外して分離します。 ### 頭部分離 赤▼の穴の奥にネジがあるので外します。 ここは、穴が深くて見えないうえにネジが長くかなりきつく締めてあるので、ネジを舐めやすいので十分注意が必要です。 ![頭部固定ネジ位置](https://camo.elchika.com/40a6fe9dc7eb849e139313ce1f3678a41de68d4a/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f30663832356264652d376434652d346437622d623138322d613161656432393561353232/) ネジを全部外すと頭部の蓋を上向きに引っ張って頭を持ち上げます。マイクケーブルが接続されていて途中までしか上がりませんので、無理やり引っ張らないようにします。 ### フラットケーブル分離 鼻の裏にあるフロントスイッチ基板を上向きにスライドすると、写真の様に外れてその後ろに隠れているケーブル取付部が見えます。 ![フロントスイッチ基板の奥](https://camo.elchika.com/5a31ed2d26dcb754d140f1a294a13b87ad22ce18/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f36323334643365362d653461622d343530642d383331302d613439373766653963646435/) シールを外して、ケーブルを外します。 ![底面基板接続ケーブルを外す](https://camo.elchika.com/7de560e03881c90fba8ffe5e39e515ddbe1b6e4d/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f61373366303565652d633737362d346639312d613231322d663665303532386163363538/) ![マイク基板接続ケーブルを外す](https://camo.elchika.com/35524a5f85b19eeb337e02c5c64667e2522288be/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f31656365353031312d396436612d343338642d383239352d316461623136353764376132/) 頭部カバーが分離します。 ![頭部カバー分離](https://camo.elchika.com/1e8e6d6b7004d2ce17a1b8ed96747b4aba46c8fa/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f35643239653432632d356465322d343630392d386138642d646433303666623638663065/) ### バッテリー分離 先ほど外したケーブルと反対側の奥にしたの写真の様な3本線のコネクターがあるので抜き、バッテリー本体を上向きに引っ張ると分離できます。 ![バッテリーコネクター分離](https://camo.elchika.com/dea28d006cc75b544992ee33c97af55492ee18c8/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f33313530623435372d636465302d346334352d616636352d643631303363626664393731/) ### 基板分離 リアスイッチ・LED基板を上向きにスライドして分離し、さらに下の写真の様にメイン基板を上向きに引っ張ってこれも分離します。 ![メイン基板分離](https://camo.elchika.com/db8ebf0326f1a91adcf0104c43cec0739963e20d/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f34653863316134372d313531362d346330642d626663302d613630373137653134346135/) 底面との接続ケーブルもまだくっついているので抜きます。 ゴムシールの厚みでくっついているだけなので、反対側から下の写真の様にそっと引っ張ると抜けます。 ![ケーブルを抜く](https://camo.elchika.com/1b3f2d4409aa50ac104b962578e32653d72ddb2c/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f39383031303134642d393761392d346534662d396131622d626630356364343039326364/) ### マイク基板分離 頭部カバーの裏側(耳の真下辺り)にマイク基板がくっついています。 写真の赤▼のネジ位置2か所外して基板をとります。 ![マイク基板ネジ位置](https://camo.elchika.com/46cb512f92c24ec6c7e2d0b309b52e661a692aca/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f64366232353139332d313730342d343437342d386665302d356464666137356364656561/) ### 分解完了 こんな感じに分離出来たら完成です。 ![分解後の様子](https://camo.elchika.com/6bb0e4892491e36e202cec2f622d4e447c180186/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f35353733626336382d346364352d343034622d386534342d643365336134653762316537/) # 解析 ここでは分解後に私が調査した結果を記してます。中身をよく理解したい興味のある方だけ見ていただければと思います。 単に同じように改造したいだけの人には不要ですので、その場合 4. 改造に進みます。 ## 構成 大まかに以下の様な構成になっているようです。 ![オリジナルCLOVA構成図](https://camo.elchika.com/1431ea284ed2c95bbe3f1e5ef5ac36a6a75d4c7d/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f33633932393232372d346236302d343966362d383135362d646136336465373035316635/) この中で、できる限り使える部品は使う方針で検討しました。 最終的にこんな感じにすればいいのかなと思います。 ![改造案](https://camo.elchika.com/eea40ecc995c093744d122e2967a7a1028515f51/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f30373337373331362d373939652d343861302d613837312d343137383334616637643638/) 各部ごとに、検討内容を説明していきます。 ### メイン基板 まず CLOVA の心臓部であるメイン基板、そのうちCPU の中身はソフトを含めブラックボックスです。 そしてそのソフトは LINE Clover アシスタンスサービス と連携すること前提に作成されています。サービス終了後に使えるようにするにはこれを改造する必要がありますが、多数の開発者を投入して開発された大規模ソフトウェアである上に、ソースコードのない実質ブラックボックスをリバースエンジニアリングして改造するのは現実的ではありません。 ここは CPU ごとラズパイに置き換えて一から作ることとします。 構成を調べるために軽く基板を確認しました。 ![メイン基板表](https://camo.elchika.com/4bb26adce9e5bde0a4598f402b5d6588b693dc79/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f37353831313963612d313337322d346234622d623362642d383036303532636137626564/) 写真の左側が、電源基板のようです。 CPUの電圧が 1.8V の様なので、その電圧はここで作っているようです。そして、中央にある小さな IC が充電用の IC かなと思います。 CPU自体はシールドの中にあるようですが、シールドを外すことが出来なかったので詳細は分かりません。 ![メイン基板裏](https://camo.elchika.com/5a068aa0f4dd193afb4d4142449287bb316532f6/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f38336233666561642d633331632d343934392d613763662d303464653339633137323030/) 写真の上側が音声系の回路らしく、音声処理系の IC が載っているようで、スピーカーやマイクからの信号はその中に入っているみたいです。 というわけで、この基板の中に CPU と直結して使われている音声制御用のチップが使えませんので、音声関連の回路はラズパイに外付けする必要がありそうです。 音声アナログ出力は HDMI 端子の中に出ていますがそれを取り出す為にコネクターを付けると、かさばって中に入らなくなるので I2S接続のD級アンプを外付けして出力するようにします。 ### マイク基板 マイク基板は、メイン基板から長めのケーブルで接続されているので分離できるかもしれないという事で、調べてみました。 こんな感じです。 ![マイク基板](https://camo.elchika.com/f563da3ce3d53778b70bbcd79ec6ac1ffba90b1b/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f36316464366336362d656434312d346538392d613233612d373633316165613966386539/) 左右ステレオ入力のようです。 基板からどんなデータが出ているかをオシロスコープで調べてみたところ、以下のとおり単純に音声のアナログ信号が出ていました。 ![マイク信号](https://camo.elchika.com/2ed31e6eb973437776fb21fb46c888df768cb412/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f39326266353937302d376531612d343030372d383261362d363464303363613432396631/) ラズパイには A/D変換機 (アナログ->デジタルに変換の仕組み) が搭載されておらず、使うには外付けの必要があります。そのA/D変換回路をわざわざ回路設計して外付けするよりも、デジタル出力 (I2S信号出力)のマイクモジュールを付ける方が安価かつ簡単なため、CLOVA オリジナルのマイクは使わないことにします。CLOVA構成の様にアナログマイクのまま配線を引き延ばしているとノイズに悩まされるリスクもあります。 ### フロントスイッチ基板 スイッチが1つの単純な基板のようです。 コネクタは特殊で、同じ形のものが見つからなかったので、メーカ・型番は判別しきれませんでした。ですが、接続先であるメイン基板側は JST の ZH 2pin のようで、こちらは入手困難ではありません。 接続は2本線のみで、テスターで当たると片方はグランドと導通があります。 2本とも、その近くにある TP200, TP201 というランドにつながっているようです。検査用のピンだと思いますが、はんだ付けしやすいので、ZH コネクタを使わずに直接このランドに繋げばよさそうです。 ![フロントスイッチ基板](https://camo.elchika.com/c2b6580886dabf6a1afaa8e38c82cd3fca1ef1ef/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f33323365386236632d386532392d343764362d386266322d366161393930353137633235/) スイッチが押されると、グランドに導通される回路のようです。 わずかに2個ほど 部品があり、抵抗とコンデンサが並列にスイッチに並列に接続されているのは、チャタリング防止用のフィルタ回路かと思われます。 ### リアスイッチ・LED基板 スイッチが4つと 3色 LED(RGB LED) が搭載されています。 ざっくり回路を負ったところ、スイッチ回路側は、フロントスイッチ側と同様、抵抗とコンデンサによるチャタリング防止回路で構成されていて、押されるとグランドにショートするのも同じです。 そして、LED 回路側は R, G, B それぞれにトランジスタスイッチング回路が組まれていました。信号を調査したところ、CPU からは ロジック電圧 1.8V の正論理で ON/OFF しているようです。 多分ラズパイの 3.3V で駆動しても問題はないと思いますが、念のため電圧を合わせる為に分圧して半分の電圧で接続すればよさそうです。 ![リアスイッチ・LED基板](https://camo.elchika.com/5ec08fc6029613aad5f206eeda797b90d9fe73fb/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f63306365336433332d303137302d343564622d393834322d623262396562316434366430/) コネクタは 0.5mm ピッチの 9pin コネクタです。結構特殊なのとコネクタの根本にはんだ付けするのは、かなり困難だと思いますが、こちらも TP*** と書かれたランドがたくさんあります。丁度9個あってピン数と一致するので導通をしらべてみたらすべてのピンにランドが割り当たっているようですので、配線はこのランド部分に直接はんだ付けすればよさそうです。 ### バッテリー バッテリーはかなり容量の大きいリチウムイオン電池 3.7V 。ただ、ラズパイを使うにはちょっと電圧不足なのでそのままでは使えません。スペース的にもつけたままだと、ラズパイ Zero が入らなくなるので使わないことにします。 ![バッテリー](https://camo.elchika.com/ab2ac0c1ef407a7446707e81c28f4c7b7a1310d7/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f32333636613636612d623165612d343863632d613334652d663361353964376633333838/) 使わないことによるデメリットは電源外して持ち運びができなくはなることですが、そもそもたいていの人は電源つないだまま使っているのではないかと思っています。 ### スピーカーユニット 写真の様なユニットで、二本線のみつながっているのでモノラル仕様のようです。 上向きと下向き両方に膜があり、ボディーギリギリの大きさになっています。 形も特殊ですし、低音も出て全方向に音を出せるような形となっていて、この CLOVA のボディーの形でパフォーマンスを発揮するように設計されているはずなので、これはそのまま使う事とします。 ![スピーカーユニット](https://camo.elchika.com/dab670868d31dec26c8621e9f5077ad517619b69/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f32653662633438392d613166352d343031632d393662622d666538623334346661313266/) ### 底面LED基板 おそらく LED のイルミネーション基板のようです。メイン基板と 25pin フラットケーブルでつながっており、色々な信号や電源が通っているようです。 ![底面LED基板](https://camo.elchika.com/7b9b346486386526d45e4cd7bbb80547011f20c2/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f35353937303465382d313730302d346334392d393730662d636562633431653963346365/) また、別の CPU が載っているようにも見えますが、この IC は型番を調べても見つかりませんでしたので正体不明です。 うまくいけばこのイルミネーション LED を点灯させることが出来るかと思って解析しました。 幸いこちらもテストピンがいっぱい出ていて、全てのピンがランドにつながっています。 という訳で、測定器を繋ぎ徹底的に信号を解析したところ、 i2c の波形の信号が出ていました。 何色に光る時にどういう信号が i2c に出ているかを探っていったところ、出ている信号にはヘッダー部の様な物がありますが、残りは単純に RGB の諧調値がでているだけでした。 という訳で、自由な色に光らせることが出来ました。 メイン基板から 1.8V とバッテリー電源が供給されていること、 25pin フラットケーブルの一部に底面の電源スイッチがつながっている事くらいです。 電源はこの底面基板から 5V を取ってラズパイにいれてやり、電源スイッチはスイッチ入力としてラズパイに入れてやることにします。 以上の事より、改造後はこんな感じになるように改造していくことにしました。 ![改造後の構成図](https://camo.elchika.com/7021db3bd5114666aaaf061971fb040f61254b53/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f33383032346133352d396466382d343966612d393265332d376239353738396431356532/) 点線に囲まれた部分が、CLOVA の基板を流用した部分ですが、あくまでも解析して推測した結果です。回路図中のコネクター系は使わずランドに直接つけることにします。 # 試作 先ずは必要機材確認の為、試作してみました。 出来上がった結果の写真だけ掲載しますが ![キャプションを入力できます](https://camo.elchika.com/7e23725862715dfc39e9cca05884807e3892e0fa/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f37666236663739632d303266372d346264662d613534392d663763623236666635353334/) 記事が冗長になりますので、興味のある方だけ、こちらの記事 [ラズパイ化CLOVA-パート1(ガチの改造編)](https://elchika.com/article/1c5edcc4-701c-4a10-9e71-435ded8ba2be/) を参照してください。 # 基板製作 ## LINE CLOVA HUT for ラズパイ Zero 試作がうまくいったので、基板を起こしました。 本改造用に専用に製作した改造用基板です。ラズパイZeroを装着し、CLOVA に最初からついていた部品を2つ程外して、ケーブルでつなぐだけで装着できる形にデザインしています。 ![LINE CLOVA HUT の内容物](https://camo.elchika.com/1e89c21268d81b296f40278ec87aef0ebbead9d7/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f32646430393666612d376236352d346438342d393334302d633737346638353362373538/) 改造してみたいといわれる方に、こちらの [Booth](https://taksan.booth.pm/) というサイトにて改造用基板を提供中状況です。 希望者に無償配布をという事も考えたのですが、特殊な部品や一般では入手困難な部品が使われていて海外通販サイトからドルで入手する部品もあり、かなりのコストが掛かってしまっていて無償提供は困難な状況です。 ほぼ部品代原価+送料+サイト使用手数料+α程度で提供できるようにとは思いましたが、結構かかってしまいました。 I2S アンプと I2S マイクだけで、部品だけの原価半分程いってしまいますが、スイッチサイエンスでほぼ同じ部品構成のモジュールを検索して値段を見ていただければ大体そんなものだと理解いただけるかと思います。 ラズパイの入手性からいうとどれだけ欲しい人がいるか読むのが難しい中、個人での在庫抱えるリスクと財力の問題で大量生産も難しいと思われます。 ですので当面は手作り少量生産体制になると思います。 希望者が自分で発注出来る様に、ガーバーデータも掲載したかったのですが、elchika の記事が大きくなりすぎて容量オーバーでできなかったため、今回は断念しました。 ### 必要部品 いくつか事前に構成部品を揃えておく必要があります。 - LINE CLOVA friends 本体。 - Raspberry PI Zero - LINE CLOVA HUT for ラズパイ Zero - Micro SD カード 32GB 以降に部品ごとに詳細を書いていきます。 #### LINE CLOVA friends 本体。 使えるものは LINE CLOVA friends の胴体が長い(高さが20cm近くある)バージョンの方です。 **Mini の短い(高さが10cm程の)タイプでは使えません。のでご注意ください**(MIni バージョンについては現在開発検討中です。もう暫くお待ちください。) 制御用コンピューター(内部のメイン基板)は完全に置き換えますので、電源さえ入れば以下の様な状態のものでも使えるはずです。 - サービス終了になるまで未開封で WiFi 未設定のもの。(いわゆる文鎮化状態) - Update に失敗して起動しなくなったもの。(これも文鎮ですね) - バッテリーが弱ってすぐに切れてしまうもの。(バッテリーは使いません。常時電源接続となります。) 長期間保存で完全に放電してしまったものは充電した直後は LEDが光らず、電源が入らない故障品と誤解される場合があります。10分程充電したらLEDが付いて充電が始まる場合、壊れてはいないと思われます。 無い場合は購入する必要がありますが現状公式では販売終了品です。公式では1年以内の物を回収返金しているぐらいですので、中古や未使用品をフリマやオークションで買うしかないと思います。サービス終了後は改造でもしない限り実質使えないものなので、高額にはならない(安価に出品される)と思っていますが… ### Raspberry PI Zero 通称ラズパイZeroシリーズ(Zero またはZero2いずれも可) と言われているものです。置き換え後のコンピュータとなります。 ラズパイZero にもいくつかバリエーションがあります。 必要なものは、WiFi とピンヘッダ(針が配列上に並んでいる取付用のコネクタ)が付いている(品名が WHで終わる)ものとなります。 - Raspberry Pi Zero WH - Raspberry Pi Zero2 WH WiFi が付いていないものは使えません。(USBコネクタにラズパイ対応 WiFiドングルを指すと動くかもしれませんが、スペース的に入るかを含め動作未検証ですので試される方は自己責任でお願いします。) 自分でピンヘッダをはんだ付けできる方は、以下のピンヘッダー無しの(品名が Wで終わる)ものも使えます。 - Raspberry Pi Zero W - Raspberry Pi Zero2 W 電子部品屋や以下の様な通販サイトで在庫さえあれば購入できます。 [ラズパイ正規代理店](https://raspberry-pi.ksyic.com/main/index/pdp.id/406,219,849,404,851,408,275,409,273,410,274,808/pdp.open/219) ⇐"Zero W" で検索します。 [スイッチサイエンス](https://www.switch-science.com/collections/raspberry-pi/cat-%E7%B4%94%E6%AD%A3%E5%93%81-%E4%BA%92%E6%8F%9B%E6%A9%9F%EF%BC%88%E6%9C%AC%E4%BD%93%EF%BC%89_%E7%B4%94%E6%AD%A3%E5%93%81) [秋月電子通商](https://akizukidenshi.com/catalog/c/craspi_p2/) [共立エレショップ](https://eleshop.jp/shop/r/r1315/) 現状半導体不足時の品薄の影響が長く続き現時点でも入手困難です。 ~~元々は 1800 ~ 3000円程度で売っていましたので、現時点で Amazon 、楽天、メルカリ、ヤクオフ等で見かける 5桁で売っているものは、完全に転売屋価格になってしまっていますので、おすすめできません。~~ ここ2年程は、どこの店も入荷量が少なく入荷後に1時間以内で売切れていまう状況が続き、抽選になっても競争率が高い状態が続いてました。 ~~2023 年には、品薄は解消されるという事だったはずなんですが…~~ そしてこの記事を更新した2023年5月20日現在で、[ラズパイ正規代理店](https://raspberry-pi.ksyic.com/main/index/pdp.id/406,219,849,404,851,408,275,409,273,410,274,808/pdp.open/219) で在庫が復活したようです。購入制限で一人2つ迄となっていますが… "Zero W" と入力して出てくるもののうち本体が付いているオプションならどれでも構いません。在庫あれば基板単体のもので可(またいつまで在庫があるかも不明です。) そのうち他のサイトでも売り出す可能性はあります。 スイッチサイエンスの通信サイトには、「入荷通知登録」という機能があるので登録しておくとメールが届くので利用するといいかと思います。 #### LINE CLOVA HUT for ラズパイ Zero 上で説明したので割愛します。 #### Micro SD カード 16GB 以上 ラズパイZero のストレージ(ディスク)となります。 この中にラズパイOS という基本ソフトを書き込んで起動し、データやソフトウェアを入れることになります。 ### 工具類 分解して組み立てるという特性上、いくつか工具が必要となります。 #### 必要な工具類 - #1 番の+ドライバー (一部細長い穴に埋まっているネジがあるので、柄の長いのも必要) - 先の細いピンセット - マルチメーター:通称「テスター」導通でブザーが鳴るもの #### 有ったら便利な工具類 - へら(底面のゴムを外す) - ラジオペンチ - マスキングテープ - ネジを種類別に小分けする小箱 #### 機材 基本的にラズパイの設定・インストールするために必要なものとして - PC (Windows/Mac/Linux ) - MicroSD カードリーダー(PCにスロットがあれば不要) が必要となります。 PC から SSH 等でアクセスして、コマンドを打っていく形となります。 制御用ソフトウェアは git コマンドを打ってクローン(ダウンロード) して入れていく形を予定しています。 #### 必要知識 まず前提として「電子機器の改造」という特性上、全ての人が知識が無くても簡単に実行できるとはいかないという事はご理解ください。記事を見て、自分が出来るか判断しやるかどうかは自己責任でお願いします。 組み立てについては、基本的にモノづくりが好きな人で、電子機器などの分解や組み立てに抵抗がない人であれば大丈夫かと思います。抵抗がある人は周りの詳しい人(PCを自作している人、電子工作をやっているような人や、電子機器の分解修理や改造が出来るような人)に相談していただければと思います。 電子工作の初心者であっても、学習・挑戦する心意気と忍耐力があれば多分大丈夫かとは思っていますが。 生の基板を触ることになるので、基板類を壊さない様に静電気にはご注意ください。(帯電しない服装、事前放電等) ソフトウェア関連については、ラズパイOS自体や使用ライブラリ類等が頻繁にバージョンアップが行われ、それに伴って手順・設定方法が変わることが稀にあるため、導入時に多少トラブルに見舞われるかもしれません。 とはいえ、基本的には、問題にぶつかったらネットで検索して問題解決できる能力がある人なら大丈夫かと思います。 出来るだけ最新のやり方で更新していくつもりではいますが。 以下はあくまでも主観ですが、人によっては苦労するかもしれません。 - 理解力:この記事を理解できればOKなレベルです。不足している情報は随時追加していきますので、もしわからなければ質問していただければと思います。(わかりにくくてすみません。) - 電子工作の知識:あればより楽ですが、なくても読みながら慎重に組み立てればOKだと思います。あればご自身で拡張・改造も可能です。 - Linux系の知識:インストールで手順通りにやってもうまくいかないとき、知識があれば解決が速いかと思います。 - ラズパイの知識:あった方が有利。あれば自分で様々な機能を組み込めるかも。 - プログラミング(Python)知識:必要ありませんが、あれば自分で様々な機能を組み込めるかも。 質問等は数が多くない限りコメント欄にて対応の予定ですが、状況や内容によってはお時間いただくかもしれません。 # 組み立て LINE CLOVA HUT は下の写真の様に、3つのパーツで出来ています。 ![LINE CLOVA HUT内容物](https://camo.elchika.com/b9fa779a2c7d46455228260a1e1ef882226301d1/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f35616265396438612d333861642d343466622d613931382d616635313133616262363737/) ## ラズパイ取り付け。 LINE CLOVA HUT は、CPUのついていないマザーボードの様なものですので、頭脳となるコンピュータであるラズパイの取付が必要となります。 本当はラズパイZero を組み込んだ状態で販売するのが理想ではありますが、[1-3-1. 必要部品] の所で書いた通り、ライセンスがややこしくなりそうなこと、皆さんがお持ちの Zero / Zero2 のバリエーション 複数問題、品薄により1人1個という個数制限があることを踏まえて難しい為、各自入手していただくこと前提の記事としました。 多少コツが必要なので、手順を説明します。 ### 基板固定 下の写真の様に針がいっぱい並んでいる様な部分(ピンヘッダと言います)が上にくるように、①のメイン基板を置き、下側からネジ穴に④のビスを計4本入れていきます。 基板を持ち上げるたびにビスが落ちてきて困るので、ナットを仮止めして抜けなくなるまでは裏からマスキングテープで仮押さえすると楽です。 さらに、そのビスの周りにに白いプラスチックの⑥スペーサーを挟みます。 ![基板にビスとスペーサー取付](https://camo.elchika.com/d22b41e58285b1223269125c670214f92715d7d8/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f32633530316563382d323139382d343762642d393739662d346635643965376639666263/) さらに下記写真の様にラズパイZero の四隅の穴に、ビスを通してさらにその上から⑤ナットで **仮止め** します。 きつく締めてしまうと、次の手順でブリッジ基板が入らないか入りにくくなったり、ピンが曲がってしまったりしますのでご注意ください。 ![ラズパイをナットで仮止め](https://camo.elchika.com/56ed40379904d8ecadc81acc84f9829213aa4a80/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f35393330303736632d333132332d346566652d623236302d306235366238646666303531/) ### ブリッジ基板取り付け ラズパイZero とLINE CLOVA HUT の①メイン基板を接続するために、下の写真の様な③のブリッジ基板を取り付けます。向きは写真を参考に同じ向きとなるように入れます。 ラズパイ側のピンと、①のメイン基板側のピンが平行になっているのをよく確認してください。(平行でないとピンが曲がったり、基板にヒビが入ったりする原因となります。) ![ブリッジ基板取り付け](https://camo.elchika.com/33991dd436348c48b562add396a40c4835c25849/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f31626566666364302d303364362d343066632d613662652d623639316535383564346561/) 曲がっていないことを確認しながら、③ブリッジ基板を少しずつ挿入していきます。(引っかかるようでしたら、平行でないかもしれないので見直します。)指にピンが刺さると痛いので、下の写真の様に厚紙等をピンヘッダと指の間に入れてから、①メイン基板の裏とブリッジ基板の上のピンヘッダの部分を指で挟み込むように取り付けると良いかと思います。 ![ブリッジ基板占める](https://camo.elchika.com/01e1903f2d74d6d0f531ae7597a54788daa0c342/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f34653265636664622d646633622d346666622d613930302d363363383639353533373430/) 取付けが出来たら、今度は先ほど仮締めしていた ④ビス と ⑤ナット を使って本締めして固定します。 ここまで出来たら、LINE CLOVA HUT 基板とラズパイZero基板が接触していないか確認します。 横から見て隙間があり、何も挟まっていなければOK です。 ## スイッチ類サブ基板取り付け ### リアスイッチ・LED基板取り付け ここまで組み立てた基板に、リアスイッチ・LED基板 を取り付けます。 ![リアスイッチ・LED基板](https://camo.elchika.com/5ec08fc6029613aad5f206eeda797b90d9fe73fb/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f63306365336433332d303137302d343564622d393834322d623262396562316434366430/) ブリッジ基板のすぐ横にある、コネクタのロックを外します。 黒い板の様なものがロック用の爪です。これの真ん中あたりを下の写真の様にピンセットでひっかけ、上に軽く持ち上げるとロックが外れます。力を入れ過ぎて壊さない様にご注意ください。 ![リアスイッチ・LED基板コネクタのロック解除](https://camo.elchika.com/bb7041913f4282be5fc12d076befb0f42c66b705/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f62333139666337652d383064642d343534382d396463652d663737643661393636653061/) 爪とは反対側の白い部分横からみたら隙間があるので、そこにケーブルを差し込みます。ケーブルには裏表があり、間違うと動作しませんので、気を付けてください。下の写真の様にコネクタ開口部と水平の白い横線が入っていれば正解です。(端子が下側(基板側)となります。) ![リアスイッチ・LED基板ケーブル取付け向き](https://camo.elchika.com/a2c9a726d163de25edc352012995ff989b4e67d7/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f61633265343339612d383539612d343532392d626536612d633133383231303663396231/) しっかり固定出来たら、下の写真の様に軽くケーブルを曲げておきます。 ![ケーブルを曲げる](https://camo.elchika.com/9e4a78be54db97085833a454efeacc6b542d32a6/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f62633237633330632d373433622d346631372d383638302d666564666566306330616266/) ### フロントスイッチ基板 次に、フロントスイッチ基板を取り付けます。 ![フロントスイッチ基板](https://camo.elchika.com/c2b6580886dabf6a1afaa8e38c82cd3fca1ef1ef/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f33323365386236632d386532392d343764362d386266322d366161393930353137633235/) 白いコネクタを、 LINE CLOVA HUT 基板の J4 と書かれたコネクタに下の写真の向き(赤が内側)で取り付けます。 ![フロントスイッチ基板コネクタ向き](https://camo.elchika.com/be1af52e1768fd6ff9432c2fb3ac237d9bf19c89/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f63386634616134322d626566342d343039302d623635302d303331646137353162386630/) 下の写真の様に爪がしっかり溝の所にかみ合うまで押し込みます。 ![コネクタを押し込む](https://camo.elchika.com/fde712d48ad4f8af828879a05e2294afae3b3c0e/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f32633665346238302d323633362d346133302d383037662d626336646635663231663031/) ### メイン基板周り検査 ここで、基板の検査をしておきます。 電源周りはショートすると、全体に過大なダメージを与えてしまいます。下の写真の赤枠内に4つの穴がありますが、全ての端子を総当たりでチェックします。 ![電源周りのテストポイント](https://camo.elchika.com/ef04eba0bf0e4b2d5c9566e1ec84578a4460b61a/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f33656234646430302d666438622d346131392d616637612d663162656538373736323730/) まずテスターを導通チェック(ブザー有り)モードにします。そして4つの穴のうちの一番下 の ”GND" と書かれた端子と、▼ 印の USBコネクタの金属部分を当たってみてください。ブザーが鳴るはずですので、その音を覚えておいてください。 ショートチェックで1パターンでもこのブザー音が鳴った場合は、ショートしている (NG) と判断できます。 テスターの棒の色は、導通チェックする場合はどちらでもOKです。(厳密には色々とケースバイケースもあるのですが、複雑なことを言うと混乱すると思いますので…) そして、以下の 6 つのパターンを全てチェックしてブザーが**鳴らない事** を確認してください。 - GND と 1.8V - GND と 3.3V - GND と 5V - 1.8V と 3.3V - 1.8V と 5V - 3.3V と 5V ![テスターで導通チェック](https://camo.elchika.com/9caca0f6ba3b55a1a08f11b3cba83ccda59ec95d/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f61656138653538342d623437312d343761362d386630372d633366623864346165316236/) 今回はケーブルは逆に差すくらいではショートしませんので、ケーブルが曲がって刺さっている場合で可能性は有るくらいです。とはいえ、電源を入れる前に電源関連をテスターで当たる事は、電子工作で基板を壊さないための基本ですので必ず実行してください。 ## マイク基板取り付け ### ケーブルの移植 CLOVA についていたマイクからケーブルを取り外し、ケーブルを再利用します。 外し方は先ほどの[3.2.1. リアスイッチ・LED基板取り付け](https://elchika.com/article/38d8127b-7cb4-44b9-ae63-ece591d777f9/#h_%E3%83%AA%E3%82%A2%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81%E3%83%BBLED%E5%9F%BA%E6%9D%BF%E5%8F%96%E3%82%8A%E4%BB%98%E3%81%91) の箇所で書いた通り、黒い部分の爪をピンセットで持ち上げてロックを外し、抜き取るだけです。 ケーブルを抜き取ったら次は LINE CLOVA HUT 用のマイク基板に取り付けます。 LINE CLOVA HUT 用のマイク基板には、下の写真の様に "CLOVA RasPi Microphone board" という刻印がされてあります。間違えない様にご注意ください。 ![マイクケーブルの移植](https://camo.elchika.com/047a731c7f3d413ddfa1adeee4e31d71e68554f9/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f32303862653232652d616335302d346631642d396166642d383834393532373930663835/) というのも、マイク基板は、元々の CLOVA とコネクター形状は全く同じですが、流れている信号や電源は全く異なります。**もともとCLOVAについていたマイク基板をLINE CLOVA HAT に取り付けたり、逆に元々の CLOVA のメイン基板に LINE CLOVA HUT のマイク基板を取り付けると、故障の原因となりますので絶対しないでください。** 分解時にマイク基板を外し忘れてそのまま付けてしまう事は有り勝ちなので注意です。 ### マイク基板取り付け 次に頭部ケースの中、耳の穴の裏にマイク基板を取り付けます。 下の写真の様に①マイク穴、②爪用穴、③ネジ穴 が左右対称にあります。ただし①マイク穴は裏側にあって部品の裏に隠れているので、写真では部品の実装されていない右側しか見えていません。 ②爪用穴をケース側についている爪(突起物)としっかり合わせないと、①ネジ穴に固定できませんので向きと位置をしっかり合わせてはめ込み、最後に③のネジ穴にネジで固定します。 ![マイク基板取り付け](https://camo.elchika.com/4863e77e52b02c4ea204f2bbd32498ce0e3e85b8/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f64393162353530642d623437382d343063342d613039622d386334336165356463633766/) またケース側についている爪(突起物)は Brown(茶色) と Sally(黄色) で位置関係が反転します。写真は Brown の方ですので Sally では、上下が反転します。 マイク穴は下の写真の様に耳のあたりを見ると穴があって、そこから少し見えています。見えていなければ何か挟まっているか、ずれている可能性があるので確認してください。感度が悪くなる可能性があります。 ![耳の穴からマイクが見える](https://camo.elchika.com/4804eedaf4cb51fb9e402d96bc21935de974e7c1/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f61366433346331342d363336382d346661662d616562392d326665303033643636306137/) ## 本体組み立て ### 基板の取り付け いよいよ組みあがった基板を本体に取り付けていきます。 ### メイン基板取り付け 左右に、コの字型の基板固定溝があります。この間に基板が挟まるように取り付けます。 ![基板固定台](https://camo.elchika.com/90bb09e3d3eb825e1f896673a4b5e4336a608cf6/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f37383338303236302d646537642d343332662d616239622d353435303337323763633330/) 向きは下の写真の通り、バッテリー取付用の円筒側の上にブリッジ基板やラズパイが乗る様な形です。 リアスイッチ・LED基板から出ているケーブルの取り回しが少し難しいですが、ブリッジ基板の上を通過してバッテリ円筒と固定用円筒の間にケーブルを通して、後ろ側に通るようにしてくください。 先ほど、 [3.2.1. リアスイッチ・LED基板取り付け](https://elchika.com/article/38d8127b-7cb4-44b9-ae63-ece591d777f9/#h_%E3%83%AA%E3%82%A2%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81%E3%83%BBLED%E5%9F%BA%E6%9D%BF%E5%8F%96%E3%82%8A%E4%BB%98%E3%81%91) の所でケーブルを曲げたのは、ここで溝に当たらない様にする為です。 ![基板固定台に基板を取り付けケーブルを通す](https://camo.elchika.com/c41738d0b46e29db9f549979b5e9723ecd17d0ae/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f37613334633936302d363333372d343134372d623832642d313564303535363732613139/) #### リアスイッチ・LED基板取り付け 後ろ側に通した リアスイッチ・LED基板 も基板固定台後ろにある溝にはめるように固定します。 ![リアスイッチ・LED基板 を固定](https://camo.elchika.com/7ae3a09a0a838223be7cf083facb02ee9885f152/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f30333333623137382d303063642d343165362d616662642d653565613566613064373963/) #### 底面からのケーブル取付 少しやりにくいのですが、写真の様に、底面からのケーブルをコネクターに取り付けます。 スイッチ基板やマイク等と同様、一旦ロック用の爪を持ち上げて基板を奥まで差し込んでから、爪を倒してロックします。 なかなか入れるのが難しい箇所ですのでケーブルが最後まで刺さっていない場合があり、その場合接触不良で動かなかったことがありました。奥までしっかり差し込むように注意してください。 ![底面からのケーブルをコネクタに接続](https://camo.elchika.com/d3d74d65f907f17ab3f21e16512948fdbed6675b/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f33323331343937352d633931642d346266612d383264662d633234363438626532316663/) #### フロントスイッチ基板取り付け フロントスイッチ基板も同様に、前側にある溝にはめるように固定します。 ![フロントスイッチ基板固定](https://camo.elchika.com/74270f965eacec07e5d278c710b35cb85d89586d/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f66323134316539332d636434312d343638652d613665642d383662343131613634306132/) ### 頭部蓋閉め 次に、基板固定台に頭部蓋を被せます。 #### マイクケーブルの配線 まずは先ほど頭部ケース裏に取り付けたマイク基板から出るケーブルを、LINE CLOVA HUT の J13と書かれたコネクタに取り付けます。 ケーブルが微妙な長さなので、つけにくいと思います。下の写真の様に横に寝かせた状態で取り付けるとやりやすいかと思います。 横に寝せると、机が平の場合本体が丸いので転がります。タオルの様な柔らかいものを置く等工夫してください。 向きは下の写真の様に、コネクタ開口部と水平の白い横線が見える向きになります。 (BROWNの場合はケーブルが半回転ねじれる形となるはずです。) ![マイクケーブルの取付](https://camo.elchika.com/0d2321acc0a947a3a0bf3831125ede10a2de63a5/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f64656165643362352d313633382d346638312d616134632d313339376134343266656562/) #### 蓋閉め 本体を立ててやり、蓋を被せていきます。 前後の方向を間違えると入りません。しっかり合わせてから少しずつ入れていきます。 ひっかりがある場合は、以下の写真の部分のつめが干渉している可能性があります。その場合はニッパーで引っかかる部分を大幅にカットしてしまいます。 もともと円筒部分はバッテリー取付用で、この爪は補強用かと思われますので、改造後は不要となります。引っかかりがひどい場合は円筒ごとカットしてしまってもかまいません。 元々が狭いスペースに両方ギリギリに入れ込む形となっていたので、ラズパイのヘッダーの取付具合(角度)の個体差によって引っかかるものがあるようです。 ![干渉している場合有り](https://camo.elchika.com/1d6ce7bd672370ab86b03dbb8970e62bf83bb164/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f37316262366462342d613739342d343734382d623036372d306139663136636631303332/) フロントスイッチやリアスイッチの位置を見ながら、顔の向きを間違えない様に入れていきます。また、先ほど取り付けたマイク基板からのケーブルが長めです。取付の時にどこかに引っかかったり、噛んだりしない様にギリギリまで中をのぞきつつ蓋閉めしてください。 ![頭部蓋閉め](https://camo.elchika.com/bbc2b6f5e943744c26ec89ce19d454c45dc91f6a/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f64336436333934392d313038392d343639392d383938612d613565663234623734343231/) 写真の様に下に隙間なく入ったら、蓋閉め完了です。 一度すべてのスイッチを押してみてください。ボタンを押したような感覚を感じられたら成功です。 一部感覚が鈍かったり、押されている感触が無い場合は、奥まで差し込まれていないかマイクケーブル等が挟まっていると思います。やり直してみて下さい。 ![頭部蓋閉め完了](https://camo.elchika.com/c9294828762696557580f2e53c51af2545b27d31/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f33623934613132612d353431612d346163372d396537642d386630653964303231656266/) ### スピーカー取付け #### ケーブル通し まずは、頭部から出ているフラットケーブルを下の写真の様に、スピーカーカバーの底部にある穴に差し込みます。 ![フラットケーブル通し](https://camo.elchika.com/c547c32586f3bbd8f956e2a43827b604261dffd4/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f64616331653538332d373136302d343863642d613038652d356639363438613434336539/) そのままでは少し動かしただけでケーブルが抜けてしまいます。 穴から10mm 程度出た状態でマスキングテープで仮止めして抜けない様にするといいです。その時は必ず端子側の裏にテープが付くようにしてください。端子に粘着物が付くと後々接触不良等の原因になりますので。 ![フラットケーブル抜け防止仮止め](https://camo.elchika.com/95afe07f6faa0b0654dd2ff8eaaf25f2af3f5aa5/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f36663066346535652d633039352d346335382d616531342d653966323865393036393165/) #### スピーカーユニット接続 ケーブルが抜けないのを注意しつつ、下の写真の、スピーカーユニットからのケーブルコネクターを、頭部の穴から差し込んで奥までしっかり差し込みます。 ![スピーカーコネクタ挿入](https://camo.elchika.com/cfa2160bdaad23369d3916a244a754e05553b56b/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f62363462363133622d376532382d343133652d396464302d376366386266306539663463/) #### スピーカユニット固定 [パート1の 2-1-8. スピーカー分離](https://elchika.com/article/1c5edcc4-701c-4a10-9e71-435ded8ba2be/#h_2-1-8.%20%E3%82%B9%E3%83%94%E3%83%BC%E3%82%AB%E3%83%BC%E5%88%86%E9%9B%A2) で外したネジを止めてスピーカーユニットを固定します。 ![スピーカーユニット固定](https://camo.elchika.com/6d198a605a2a66f9e65c2ccc383401650a15fb97/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f39346439633334642d396366332d346665342d396635362d616636393038326563386433/) #### スピーカーカバー装着 ケーブルが抜けない様に注意しながら斜めから、スピーカーカバーの内側に挿入していきます。 ![斜めから挿入](https://camo.elchika.com/541b04ce04b764b323ade1780628f8971befa2b0/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f62393362383864382d333430392d343132372d393336372d613165613732663831653838/) そのままスライドして入れていきます。 ![スライドして入れる](https://camo.elchika.com/6a031f907a21e92b9dbc3388eb0a48a2e898adb4/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f35666464333830312d393763622d343633622d623335332d313239343061613938363130/) 奥まで入る直前、フラットケーブルが邪魔になると思います。ここまでくると抜けないはずなので、仮止めしていたマスキングテープを外してケーブルを引っ張りつつ奥まで入れます。 ![ケーブルを引っ張りつつ奥まで入れる](https://camo.elchika.com/27af8ff7f06d2584fa59d6a10eb8ae3b656282f8/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f37666331623432612d316262642d346437372d393135312d643033313330323933356632/) 奥まで入ったら、[パート1の 2-1-7. スピーカーカバー分離](https://elchika.com/article/1c5edcc4-701c-4a10-9e71-435ded8ba2be/#h_2-1-7.%20%E3%82%B9%E3%83%94%E3%83%BC%E3%82%AB%E3%83%BC%E3%82%AB%E3%83%90%E3%83%BC%E5%88%86%E9%9B%A2) で外したネジでカバーをネジ止めします。 ![スピーカーカバーをネジ止め](https://camo.elchika.com/b4bea333d9b184fe512936b5149ad99f4da63eb5/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f36643035323730372d323330312d346532302d396561302d636330316531326164303735/) #### USB基板取り付け USB基板を取り付けてネジ止めします。 ![USB基板取り付け](https://camo.elchika.com/89c40fa256983b387511e330e61022794588906e/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f34336463393836322d323939362d346530332d386434302d656139323234363333623163/) ### 底面組み立て #### 導光板取付 写真の赤〇箇所の爪と溝が合うように回転させてはめ込みます。丁度の角度にしないと奥まで入らずにぐらぐらして、底面がちゃんと閉まらなくなりますので、注意です。 ![でっぱりと溝を合わせて導光板取付け](https://camo.elchika.com/f3479ab181de4cb65cbd088bf6c85a227f0b3cee/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f33336463653336662d343538372d346662392d383134662d373639636261636165346130/) #### 底面ケーブル接続 底面基板と本体が丁度90度の角度で当たるように置いてケーブルを接続します。 今までと同じ要領で、爪を持ち上げてロックを外して、フラットケーブルをコネクターに差し込みます。(この写真導光板を付け忘れた時の写真で、実際は導光板取付済みですね。後で写真を撮り直して置き換えておきます。)差し込んだら爪を倒してロックします。 ![ケーブル接続](https://camo.elchika.com/190564971d5bdaba3943f6ba4241479b29a3b557/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f37393162323362392d336536632d346165362d623237342d363934636230643634373465/) #### 底面蓋を閉める。 蓋を閉めて、[パート1の 2-1-3. 底面ネジ除去](https://elchika.com/article/1c5edcc4-701c-4a10-9e71-435ded8ba2be/#h_2-1-3.%20%E5%BA%95%E9%9D%A2%E3%83%8D%E3%82%B8%E9%99%A4%E5%8E%BB) で外したネジでカバーをネジ止めします。 ![底面蓋を閉める](https://camo.elchika.com/9f1bb595c284600e731a82cbc3da2156fe053488/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f61613138326633322d393637392d343632312d623135382d663263653765376134343963/) 以上でハードは完成です。 # 5. ラズパイの基本設定 ## 5.1. ラズパイイメージ書き込み まず、PC にラズパイ用に使う 16GB のマイクロSD を指しておきます。 ラズパイ公式 Imager を使ってインストールします。 (Raspberry pi Imager を持っていない人は、公式ページの説明を見てインストールします。) 最新の 32bit 版を選べばいいです。 ![Imager](https://camo.elchika.com/db933c17203fbec15cb53a449c92e4015fc6bf8d/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f32653131363132622d366563362d343935652d386664372d646663656633353863353336/) さらに、左下 [書き込む] ボタンの下にある [歯車] ボタンを押して設定画面を開きます。 ![インストール設定1](https://camo.elchika.com/b62232315dd1daf8743f1a4b40e675c582b487e3/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f35343234613039332d373439332d343830342d386234362d626232666131633431313661/) ホスト名は自由に、SSH は有効(パスワード認証の方がわかりやすいと思います)にします。ユーザー名、パスワードは、自分で分かりやすいものを設定するといいです。 ![インストール設定2](https://camo.elchika.com/1c490149cc2e88f37aa9db87d99eb744d09c7e70/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f36396362383232332d356432392d343636312d396438342d663436643330323065653764/) ラズパイZero は 有線ポートは通常無いので、WiFi アクセスポイントの設定も、この時点で設定してWiFi でネットワークにつながるように設定しておきます。WiFi を使う国は "JP" にします。 ![インストール設定3](https://camo.elchika.com/05c4a9f3a7070f2fb462151df336bfe3631527ce/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f37653236353961332d363337622d346266612d626539312d663065643236653030616136/) ロケール設定をチェックして有効にし、タイムゾーンを Asia/Tokyo キーボードレイアウトを jp にします。 [保存] ボタンを押して、Imager のトップ画面に戻ったら、 [書き込み] を押します。 「データは完全に削除されます。」と表示されるので、 [はい] を選ぶと書き込みが始まります。 ![書き込み中](https://camo.elchika.com/00824ae0c2f50a2abfe5371fe2ef758fd672fd61/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f36653532653061642d326537342d343632372d386339342d323136636261323964626138/) 15分程待つと書き込み完了したら、MicroSD を取り出します。 ![書き込み](https://camo.elchika.com/caddb7784c40948a58c6ae16a35a2b3ffb3d9d45/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f32323432333730392d333763342d343134632d383233312d333263626363343736356564/) 取り出した MIcroSD をラズパイに差します。 ## IPアドレス確認しSSH接続 最初は DHCP (IPアドレス自動割り振り) 設定で起動してしまいますので、IPアドレスがわららず、SSH の接続先が判りません。 IPをスキャンするソフトで調べえるか、 ![IPスキャンソフト](https://camo.elchika.com/3eef8c4023efaff23387032bb809f268664afa52/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f36343435363331662d303364342d343338372d623039332d393134626462633365346339/) 初回だけ HDMI 端子にディスプレイを繋いで起動し、 ` ifconfig ` と打って ``` lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 26 bytes 2732 (2.6 KiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 26 bytes 2732 (2.6 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.0.33 netmask 255.255.240.0 broadcast 192.168.15.255 inet6 fe80::5141:efa1:ff31:e5e prefixlen 64 scopeid 0x20<link> ether xx:xx:xx:xx:xx:xx txqueuelen 1000 (Ethernet) RX packets 14156 bytes 1615201 (1.5 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 987 bytes 108090 (105.5 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ``` の様に表示されますが、 wlan0: の2行目 inet 192.168.0.33 の部分が IPアドレスとなります。 Tera-Term の様な SSH クライアントソフトからこの IPアドレスに接続します。 ![TeraTermの場合](https://camo.elchika.com/05e775abed58c51720562d1771d43fc649540c7b/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f39636634393335312d326365662d343030322d383838372d3962356664656261383735662f38386363623230342d656633352d343733362d613436332d376335336235363737336135/) 起動毎にアドレスが変わってつながらない場合は IPアドレスを固定するといいでしょう。 私は SSH でつなぐものは大概固定しています。 固定のやり方は "ラズパイ" + "IPアドレス固定" などとググったらわかるかと思います。 ## 音声入出力設定 もともと、ラズパイは音声は出力でアナログ出力のみです。音声の入力についてはオプション扱いで OS には標準で組み込まれていません。さらに、音声出力もラズパイ Zero の場合は基本的に HDMI コネクタにのみ出力されていてデフォルトではそちらに出力されるようになっています。 特に OS に組み込まれていない マイク入力のドライバーソフトは、カーネルヘッダーソースを持ってきて、そのヘッダーを使ってドライバーをコンパイルするといった面倒な作業が必要です。 ところが、この I2S MEMSマイクモジュールの開発元である Adafruit が、 I2S MEMSマイク用のインストールスクリプトを用意してくれています。コマンド一つでカーネルヘッダーソースのダウンロードから組み込みまでやってくれます。 しかも、システムアップデート等で万が一動かなくなっても、再度スクリプトを実行することで修復までしてくれるようになっているそうです。 そして、イントール後は I2S 出力もできるようにしてくれているようです。 そのサイトの説明に従って設定してテストします。 [Adafruit I2S MEMS Microphone Breakout / Raspberry Pi Wiring & Test](https://learn.adafruit.com/adafruit-i2s-mems-microphone-breakout/raspberry-pi-wiring-test) のサイトを開いて、"Update the Pi" から下の手順を全て、順に実行していきます。 "Auto Load at Boot" の所は "Y" を選択して、起動時に自動ロードするようにします。 なので、 "Manual Load" の所はスキップします。 途中で、テストの方法も書いてあるので、録音した音声が再生されるところまで確認できます。 因みに、私の環境では、 .asoundrc に設定を書き込むところは動作はするのですが、再起動すると、なぜか .asoundrc ファイルが消えてしまっていて設定が保持できません。 原因はつかめていませんが、 `sudo nano /etc/asound.conf` と打って、そちらに後ろに追加しました。 その時に、ついでにスピーカー側のボリューム制御設定も同じファイルに書いておきます。 参考にそのファイルを載せておきます。 ```:asound.conf pcm.dspeaker_hw { type hw card 0 } pcm.dmixer { type dmix ipc_key 1024 ipc_perm 0666 slave { pcm "dspeaker_hw" period_time 0 period_size 1024 buffer_size 8192 rate 44100 channels 2 } } ctl.dmixer { type hw card 0 } pcm.softvol { type softvol slave.pcm "dmixer" control.name "PCM" control.card 0 } ctl.softvol { type hw card 0 } pcm.!default { type plug slave.pcm "softvol" } pcm.dmic_hw { type hw card sndrpii2scard channels 2 format S32_LE } pcm.dmic_sv { type softvol slave.pcm dmic_hw control { name "Boost Capture Volume" card sndrpii2scard } min_dB -3.0 max_dB 30.0 } ``` ## ハードウェアチェック Python で RPi.GPIO というライブラリを使ってチェックします。 ライブラリがインストールされているか確認します。 `pip list | grep RPi.GPIO` と打って、入っていたら ``` RPi.GPIO 0.7.0 ``` の様にライブラリ名とバージョンが表示されれば、インストールされていますのでそのまま進んでください。何も表示されていなければ インストールされていないので、 `pip install RPi.GPIO' と打ってインストールしておきます。 #### スイッチ・LEDテスト `mkdir hw_test` と打ってディレクトリを作成し `cd hw_test` でその中に入ります。 `nano sw_led_test.py` と打って、nanoエディタを開き、以下を入力(コピペ)してください。 ```python:sw_led_test.py import RPi.GPIO as GPIO import threading import time PIN_FRONT_SW = 4 PIN_BACK_SW_MINUS = 2 PIN_BACK_SW_PLUS = 3 PIN_BACK_SW_BT = 5 PIN_BACK_SW_MUTE = 7 PIN_POWER_SW = 22 PIN_LED_R = 13 PIN_LED_G = 12 PIN_LED_B = 6 is_active = True def test() : global is_active sw_front_before = -1 sw_back_minus_before = -1 sw_back_plus_before = -1 sw_back_bt_before = -1 sw_back_mute_before = -1 sw_power_before = -1 while(is_active) : sw_front = GPIO.input(PIN_FRONT_SW) sw_back_minus = GPIO.input(PIN_BACK_SW_MINUS) sw_back_plus = GPIO.input(PIN_BACK_SW_PLUS) sw_back_bt = GPIO.input(PIN_BACK_SW_BT) sw_back_mute = GPIO.input(PIN_BACK_SW_MUTE) sw_power = GPIO.input(PIN_POWER_SW) if sw_front_before != sw_front : if (sw_front == GPIO.HIGH) : print("[FRONT] switch is OFF") else : print("[FRONT] switch is ON") if sw_back_minus_before != sw_back_minus : if (sw_back_minus == GPIO.HIGH) : print("[-] switch is OFF") GPIO.output(PIN_LED_B, GPIO.LOW) print("[B] LED is OFF") else : print("[-] switch is ON") GPIO.output(PIN_LED_B, GPIO.HIGH) print("[B] LED is ON") if sw_back_plus_before != sw_back_plus : if (sw_back_plus == GPIO.HIGH) : GPIO.output(PIN_LED_G, GPIO.LOW) print("[R] LED is OFF") print("[+] switch is OFF") else : print("[+] switch is ON") GPIO.output(PIN_LED_G, GPIO.HIGH) print("[R] LED is ON") if sw_back_bt_before != sw_back_bt : if (sw_back_bt == GPIO.HIGH) : print("[BT] switch is OFF") GPIO.output(PIN_LED_R, GPIO.LOW) print("[R] LED is OFF") else : print("[BT] switch is ON") GPIO.output(PIN_LED_R, GPIO.HIGH) print("[R] LED is ON") if sw_back_mute_before != sw_back_mute : if (sw_back_mute == GPIO.HIGH) : print("[MUTE] switch is OFF") else : print("[MUTE] switch is ON") if sw_power_before != sw_power : if (sw_power == GPIO.HIGH) : print("[POWER] switch is OFF") else : print("[POWER] switch is ON") time.sleep(0.1) sw_front_before = sw_front sw_back_minus_before = sw_back_minus sw_back_plus_before = sw_back_plus sw_back_bt_before = sw_back_bt sw_back_mute_before = sw_back_mute sw_power_before = sw_power def main() : global is_active GPIO.setmode(GPIO.BCM) GPIO.setup(PIN_FRONT_SW, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.setup(PIN_BACK_SW_MINUS, GPIO.IN) GPIO.setup(PIN_BACK_SW_PLUS, GPIO.IN) GPIO.setup(PIN_BACK_SW_BT, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.setup(PIN_BACK_SW_MUTE, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.setup(PIN_POWER_SW, GPIO.IN) GPIO.setup(PIN_LED_R, GPIO.OUT) GPIO.setup(PIN_LED_G, GPIO.OUT) GPIO.setup(PIN_LED_B, GPIO.OUT) GPIO.output(PIN_LED_R, GPIO.LOW) GPIO.output(PIN_LED_G, GPIO.LOW) GPIO.output(PIN_LED_B, GPIO.LOW) print("Ready! Press any switch to test or press [Enter] key to exit") test_thread = threading.Thread(target = test, args = (), name = 'Test', daemon = True) test_thread.start() input() is_active = False print("Exit") time.sleep(1) test_thread.join() GPIO.cleanup(PIN_FRONT_SW) GPIO.cleanup(PIN_BACK_SW_MINUS) GPIO.cleanup(PIN_BACK_SW_PLUS) GPIO.cleanup(PIN_BACK_SW_BT) GPIO.cleanup(PIN_BACK_SW_MUTE) GPIO.cleanup(PIN_POWER_SW) GPIO.cleanup(PIN_LED_R) GPIO.cleanup(PIN_LED_G) GPIO.cleanup(PIN_LED_B) if __name__ == '__main__': main() ``` [Ctrl] + [O] で保存し、 [Ctrl] + [X] で終了します。 `python sw_led_test.py` と打つと、チェックプログラムが走ります。各スイッチを押してみてください。 画面に ``` [*] switch is ON ``` と表示され、スイッチを離すと ``` [*] switch OFF ``` (* の部分に押されたスイッチの名称)の様に表示されれば、そのスイッチは問題なく接続できています。 また、 [Bluetooth] スイッチを押すと赤色 LED が点灯、 [+] スイッチを押すと緑色 LED が点灯、 [-] スイッチを押すと青色 LED が点灯、 するのが確認出来たら、LED の接続も問題なく接続できています。 なお、RGB LED なので、同時に押すと合成した色になります。 ### 仕上げ 蓋を閉めると、ラズパイ基板上にあるアクセスランプが見えなくなってしまい、電源が入っているのか現在ディスクアクセス中かが全く分からなくなってしまいます。 そこで、後ろのスイッチの上にある LED にアクセスランプや電源ランプを割り当てます。 またシャットダウンしたくても、一旦SSH等でPCからつなぎに行ってシャットダウンコマンドを打つのも面倒ですので、本体だけでもシャットダウンできるように電源ボタンを割り当てます。 いずれも /boot/confit.txt に追加するだけで対応できます。 `sudo nano /boot/config.txt` と打ち [All] と書いてある下あたりに以下を追加します。 #### 電源LED ``` dtoverlay=gpio-poweroff,gpiopin=6,active_low=1 ``` gpiopin=6 でBMC6 に信号が割り当てられるので、電源が ON の間は青色が点灯します。 "4-3-2-2. ラズパイ" の箇所を見ながらピン番号を別の LED ピンに変えると別の色になります。 #### アクセス LED ``` dtparam=act_led_gpio=13 ``` act_led_gpio=13 でBMC13 に信号が割り当てられるので、アクセス時は赤色が点灯します。 "4-3-2-2. ラズパイ" の箇所を見ながらピン番号を別の LED ピンに変えると別の色になります。 電源LED が青で点灯中は合成色で紫になります。 #### 電源(シャットダウン)ボタン ``` dtoverlay=gpio-shutdown,gpio_pin=22 ``` gpio_pin=22 でBMC22 に信号が割り当てられるので、底面の電源ボタンを押すとシャットダウンします。。 "4-3-2-2. ラズパイ" の箇所を見ながらピン番号を別のスイッチピンに変えるとそのスイッチでシャットダウンするようになります。 ここまで出来たら、一度 `sudo reboot now` と打って、リブートをかけます。次回起動時には LED や電源スイッチが効くようになっているか確認します。 確認出来たら蓋を閉めても支障ないはずです。 なお蓋を閉めるためのネジは止めない方が無難かと思います。ねじ止めしなくても結構きっちりはまります。ただ、顔部分をつかんで持ち歩くとさすがに外れる場合があるので注意が必要です。 別のソフトを入れるためや、MicroSD が壊れた時に交換するのには蓋が開けやすい方がいいからです。 # アプリケーションの導入 ## 関連サービスの準備 アプリケーション動作をさせるには以降に記載した各種サービスの準備がまずは必要です。 ### Googleクラウドサービス(必須) 音声認識側では Google Speech Recognatation または クラウドスピーチ のサービスのいずれかを使うようになっているので、実質必須のサービスとなります。 そして、現状音声合成の方もデフォルトでは Google クラウドText-to-Speech を使用しています。 画面を写真を貼り付けて説明しようと思いましたが、こちら私は既に作成済みなので、出てくる画面が初めて使う人と違い過ぎて役に立ちませんので、画面の貼り付けは行いません。 代わりに公式の説明サイトを書いておきますので、この手順に従ってアカウントを作成してサービスアカウントのキー(鍵)を作成してください。 先ずGoogle クラウドサービスのアカウントを持っていない人は作ります。 こちらのページの手順に従って、[Google Cloud を初めて利用する方は、ここから始めましょう](https://cloud.google.com/blog/ja/topics/developers-practitioners/new-google-cloud-start-here) アカウントを作成するところから始めてください。 その後、またはアカウントを既に持っている方は、 [Text-to-Speech始める前に](https://cloud.google.com/text-to-speech/docs/before-you-begin?hl=ja) のページを参考にキーを作成していきます。 プロジェクトは CLOVA 用のプロジェクトを新たに作った方がいいかと思います。 そして、上記の手順 4. にて "Text-to-Speech API " を有効にした後、"Speech-to-Text" の方も同じプロジェクト内で有効にしておいてください。 JSON 形式のキーのダウンロードが出来たらそこまでの手順でOKです。ダウンロードしたファイルはラズパイのルートディレクトリに移動して保存してください。 ### OpenAI API サービス(必須) CLOVA Raspberry Piは、実装されているスキルのソフトウェア制御とAIによる自動応答のハイブリッド形式で動作します。 AI による自動応答の際には Chat-GPT の Open AI API を使用するため、サービスを使用する準備が必要となります。 それには、 [Open AI のトップページ](https://openai.com/) を開き 右上の [sign up] でユーザー登録を開始します。 途中でメール確認や携帯番号を入れて二段階認証を行う必要はありますが、画面の指示に従ってください。 [APIキー作成ページ](https://platform.openai.com/account/api-keys) にてAPIキーを作成しておく必要があります。 途中の操作画面をここに入れようと思ったのですが、一旦アカウント持っているとうまく入力画面になってくれなかったので割愛します。画面を含めた手順が必要な場合は、色々な人が記事を書いていますので、 "OpenAI APIキーの作成" 等でググってください。 APIキーを作成したらそのキーをコピーして、ローカルファイル等他人に漏洩しないPCにテキストファイルを作るなどして、ペーストして(貼り付けて)おいてください。 鍵はこの時しか表示されませんので、うっかりコピペを忘れてしまった場合は、再度作り直してください。漏洩が疑われる場合も再度作り直すといいかと思います。 後程アプリケーションソフトウェア側の設定で必要になります。 ### Web 版Voice Text(オプション) 音声合成サービスですが、以下の2つの問題点があります。 - 合成後の二次利用については許可されていないので、YouTube 等には使用できない。 - 現在新規アカウント登録が終了して出来ない様になっているために、既にアカウント持っている人以外利用できない 個人で非商用で実験的に使うには無償で使えて良かったのですが、代替え音声合成サービスを検討中です。Googleクラウドスピーチでは月間無料枠を超えて使うと(到達するまで結構使えるとはいえ)費用が掛かってしまいますので… 流行りの 「AIスタックちゃん」の導入時等にアカウント作って既に持っている人は利用可能です。APIキーを表示して、ローカルファイル等他人に漏洩しないPCにテキストファイルを作るなどして、ペーストして(貼り付けて)おいてください。こちらは再発行は出来ないので、漏洩しない様にご注意ください。 後程、アプリケーションソフトウェア側の設定で後程必要になります。 ### Web 版 VOICEVOX(オプション) Web 版Voice Text が新規登録できないため、実質使用不可となってしまったため代替えを探していてみつかったものです。 音声合成エンジン自体はオープンソースで開発されており、声の種類がたくさんあります。声によって利用規約が異なりますが、github にあげたソースを無改造で使う限りは、クレジット表示さえすれば、商用・非商用に関わらず無料で使用できるというライセンス形態です。詳細はこちらをご覧ください。 [VOICEVOX 利用規約](https://voicevox.hiroshiba.jp/term/) 本来VOICEVOXは自分の PC 等で合成して使うもので、マシンパワーが要りラズパイでは時間が掛かりすぎて使い物になりませんでした。 ところが、有志の方がその合成プログラムを置いたサーバーを立てていただいたおかげで、ネットワーク越しに要求を出したら合成結果を計算して返してくれるという仕組みを公開してくれていてそれを使用しています。(VOICEVOX としては非公式です。)有難いことです。 サーバー駆動にも維持にもそれなりに ```arduino:Lチカの例 #define LED_PIN 13 void setup() { pinMode(LED_PIN, OUTPUT); } void loop() { digitalWrite(LED_PIN, HIGH); delay(1000); digitalWrite(LED_PIN, LOW); delay(1000); } ``` 費用が掛かるので、1日で使える量をポイントで管理する仕組みになっています。 そのためユーザーごとにアクセスを管理・制御するために、apikey が必要となります。以下のページでapikey を取得してください。 [WEB版VOICEVOX API(高速)](https://voicevox.su-shiki.com/su-shikiapis/) ### LINE チャンネル(オプション) LINE Messaging API を使用して、クローバをボットとみなして組み込み、スマホ等でそのボットと友達となることで、LINEでメッセージの送受信が音声でできるようになります。 その準備方法については、ちょっと手順が多いので記事記載準備中です。 アプリケーションソース一式の最新版はこちらの [github](https://github.com/TakSan0/CLOVA_RasPi) にあります。 が、コンテスト向けには全ソースの公開が必要な為ここに掲載します。 しかしながら、ファイル数が多いため、実際の使用には github をclone した方が楽かと思いますので、導入手順はその方法で記載します。 ```JSON:.CLOVA_RasPi.cfg { "charactor": { "default_sel": 0 }, "hardware": { "audio": { "microphone": { "num_ch": 1, "index": 11, "silent_thresh":300, "term_duration":3000 }, "speaker": { "num_ch": 1, "index": 11 } } }, "sns": { "line": { "user_id": [ { "name": "default", "callname": "クローバ", "id": "" } ] } } } ``` ```TEXT:.CLOVA_RasPi.keys GOOGLE_APPLICATION_CREDENTIALS= OPENAI_API_KEY= VOICE_TEXT_API_KEY= WEB_VOICEVOX_API_KEY= AITALK_USER= AITALK_PASSWORD= LINE_CH_ACC_TOKEN= ``` ```PYTHON:CLOVA_RasPi.py import time import os import RPi.GPIO as GPIO from CLOVA_config import global_config_sys from CLOVA_config import HttpReqSettingHandler from CLOVA_led import global_led_Ill from CLOVA_timer import TimerControl from CLOVA_switch import SwitchInput from CLOVA_volume import global_vol from CLOVA_charactor import global_charactor from CLOVA_conversation import Conversation from CLOVA_voice import VoiceControl from CLOVA_http_server import HttpServer from CLOVA_line import LineSender, HttpReqLineHandler def main() : # 会話モジュールのインスタンス作成 conv = Conversation() # HTTPサーバー系のインスタンス作成 line_svr = HttpServer(8080, HttpReqLineHandler) config_svr = HttpServer(8000, HttpReqSettingHandler) # LINE送信モジュールのインスタンス line_sender = LineSender() # 底面 LED を黄色に global_led_Ill.AllYellow() # LEDを使うモジュールにインスタンスをコピー voice = VoiceControl() # キー準備 char_swich = SwitchInput(SwitchInput.PIN_BACK_SW_BT, global_charactor.SelNextChar) plus_swich = SwitchInput(SwitchInput.PIN_BACK_SW_PLUS, global_vol.VolUpCallback) minus_swich = SwitchInput(SwitchInput.PIN_BACK_SW_MINUS, global_vol.VolDownCallback) # タイマ準備 tmr = TimerControl() conv.tmr = tmr #tmr.Start() # キャラクタ設定 global_charactor.SetCharactor(global_config_sys.settings["charactor"]["default_sel"]) # メインループ while True : int_exists, speeched_text = conv.CheckIfInterruptedVoiceExists() # 割り込み音声ありの時 if ( int_exists == True) : if speeched_text != "" : filename = voice.TextToSpeech(speeched_text) if (filename != "") : voice.PlayAudioFile(filename) else : print("音声ファイルを取得できませんでした。") # 割り込み音声無の時 else : answered_text = "" # 録音 record_data = voice.RecordFromMic() # テキストに返還 speeched_text = voice.SpeechToText(record_data) #speeched_text = speech_to_text_by_google_speech_recognition(record_data) print("発話メッセージ:{}".format(speeched_text)) # 終了ワードチェック if (speeched_text == "終了") or (speeched_text == "終了。") : answered_text = "わかりました。終了します。さようなら。" is_exit = True else : # 会話モジュールから、問いかけに対する応答を取得 answered_text = conv.GetAnswer(speeched_text) is_exit = False # 応答が空でなかったら再生する。 if ( ( answered_text != None) and (answered_text != "" ) ) : print("応答メッセージ:{}".format(answered_text) ) answered_text_list = answered_text.split('\n') for text_to_speech in answered_text_list : if text_to_speech != "" : filename = voice.TextToSpeech(text_to_speech) if (len(filename) != 0) : voice.PlayAudioFile(filename) # 終了ワードでループから抜ける if (is_exit == True ) : tmr.Stop() print("Exit!!!") break # 底面 LED をオフに global_led_Ill.AllOff() if __name__ == "__main__": main() ``` ```JSON:CLOVA_charactor.json { "charactors":[ { "Name":"グーグルB", "Listener":{ "system": "GoogleCloudSpeech", "language": "ja-JP" }, "Speaker":{ "system": "GoogleTextToSpeech", "language": "ja-JP", "name": "ja-JP-Standard-B", "gender": "FEMALE", "rate": "1.0", "pitch": "0.0", "speed": "0.0", "emotion": "happiness" }, "Personality":{ "aisystem": "gpt-3.5-turbo", "name":"クローバ代理", "myself": "私", "gender": "女性", "type": "とにかくおしゃべりです。", "talkstyle": "たんたんとしゃべります。", "detail": "" } }, { "Name":"グーグルC", "Listener":{ "system": "GoogleCloudSpeech", "language": "ja-JP" }, "Speaker":{ "system": "GoogleTextToSpeech", "language": "ja-JP", "name": "ja-JP-Standard-C", "gender": "MALE", "rate": "1.0", "pitch": "0.0", "speed": "0.0", "emotion": "happiness" }, "Personality":{ "aisystem": "gpt-3.5-turbo", "name":"クローバ代理", "myself": "私", "gender": "男性", "type": "明るくおしゃべりです。", "talkstyle": "しょっちゅう語尾に「知らんけど」を付けます。", "detail": "関西弁をしゃべります。" } }, { "Name":"グーグルA", "Listener":{ "system": "GoogleCloudSpeech", "language": "ja-JP" }, "Speaker":{ "system": "GoogleTextToSpeech", "language": "ja-JP", "name": "ja-JP-Standard-A", "gender": "FEMALE", "rate": "1.0", "pitch": "0.0", "speed": "0.0", "emotion": "happiness" }, "Personality":{ "aisystem": "gpt-3.5-turbo", "name":"クローバ代理", "myself": "私", "gender": "男性", "type": "恥ずかしがりやですが、しゃべりだすと止まりません。", "talkstyle": "敬語を使う事が多いです。", "detail": "東北弁をしゃべります。" } }, { "Name":"グーグルD", "Listener":{ "system": "GoogleCloudSpeech", "language": "ja-JP" }, "Speaker":{ "system": "GoogleTextToSpeech", "language": "ja-JP", "name": "ja-JP-Standard-D", "gender": "MALE", "rate": "1.0", "pitch": "0.0", "speed": "0.0", "emotion": "happiness" }, "Personality":{ "aisystem": "gpt-4", "name":"クローバ代理", "myself": "私", "gender": "男性", "type": "言葉少な目ですが、しっかりとしたものいいです。", "talkstyle": "落ち着いたしゃべり方です。", "detail": "自慢話が多いのが玉に瑕です。" } }, { "Name":"ひかり", "Listener":{ "system": "GoogleCloudSpeech", "language": "ja-JP" }, "Speaker":{ "system": "VoiceText", "language": "ja-JP", "name": "hikari", "gender": "FEMALE", "rate": "1.0", "pitch": "100", "speed": "100", "emotion": "happiness" }, "Personality":{ "aisystem": "gpt-3.5-turbo", "name":"新生クローバ", "myself": "私", "gender": "女性", "type": "子供っぽいところがあり、噂話が大好きです。", "talkstyle": "ため口で話します。", "detail": "関西弁をしゃべります。" } }, { "Name":"しょう", "Listener":{ "system": "GoogleCloudSpeech", "language": "ja-JP" }, "Speaker":{ "system": "VoiceText", "language": "ja-JP", "name": "show", "gender": "MALE", "rate": "1.0", "pitch": "100", "speed": "100", "emotion": "" }, "Personality":{ "aisystem": "gpt-3.5-turbo", "name":"新生クローバ", "myself": "僕", "gender": "男性", "type": "体育会系でとにかくうるさいです。", "talkstyle": "弾丸の様に話します。", "detail": "余計なことをポロっと漏らしてしまいます。" } }, { "Name":"はるか", "Listener":{ "system": "GoogleCloudSpeech", "language": "ja-JP" }, "Speaker":{ "system": "VoiceText", "language": "ja-JP", "name": "haruka", "gender": "FEMALE", "rate": "1.0", "pitch": "100", "speed": "100", "emotion": "happiness" }, "Personality":{ "aisystem": "gpt-4", "name":"新生クローバ", "myself": "うち", "gender": "女性", "type": "おしとやかで気取っていますが、おしゃべりです。", "talkstyle": "きれいな言葉を使おうとします。", "detail": "標準語を離します。" } }, { "Name":"たける", "Listener":{ "system": "GoogleCloudSpeech", "language": "ja-JP" }, "Speaker":{ "system": "VoiceText", "language": "ja-JP", "name": "takeru", "gender": "MALE", "rate": "1.0", "pitch": "100", "speed": "100", "emotion": "happiness" }, "Personality":{ "aisystem": "gpt-3.5-turbo", "name":"新生クローバ", "myself": "俺", "gender": "男性", "type": "お節介でおしゃべりです。", "talkstyle": "物事をぼかし気味で話します。", "detail": "超常現象、ミステリー等不思議な話が大好きです。" } }, { "Name":"サンタ", "Listener":{ "system": "GoogleCloudSpeech", "language": "ja-JP" }, "Speaker":{ "system": "VoiceText", "language": "ja-JP", "name": "santa", "gender": "MALE", "rate": "1.0", "pitch": "100", "speed": "100", "emotion": "happiness" }, "Personality":{ "aisystem": "gpt-3.5-turbo", "name":"新生クローバ", "myself": "わし", "gender": "男性", "type": "陽気でみんなに好かれるタイプです。", "talkstyle": "老人ですのでゆっくり優しくお話します。また、語尾に「だわい」「ですじゃ」「のう」などを付けて老人っぽいしゃべり方をします。", "detail": "クリスマスシーズンやパーティーが大好きで、子供とよく遊びます。" } }, { "Name":"ずんだもん", "Listener":{ "system": "GoogleCloudSpeech", "language": "ja-JP" }, "Speaker":{ "system": "VoiceVox", "language": "ja-JP", "name": "3", "gender": "FEMALE", "rate": "1", "pitch": "1", "speed": "1", "emotion": "" }, "Personality":{ "aisystem": "gpt-3.5-turbo", "name":"新生クローバ", "myself": "うち", "gender": "女性", "type": "子供っぽい性格です", "talkstyle": "", "detail": "ひとなっつこいです。" } }, { "Name":"白上虎太郎", "Listener":{ "system": "GoogleCloudSpeech", "language": "ja-JP" }, "Speaker":{ "system": "VoiceVox", "language": "ja-JP", "name": "32", "gender": "MALE", "rate": "1", "pitch": "1", "speed": "1", "emotion": "" }, "Personality":{ "aisystem": "gpt-3.5-turbo", "name":"新生クローバ", "myself": "おいら", "gender": "男性", "type": "子供っぽい性格です", "talkstyle": "", "detail": "調子乗りです。" } }, { "Name":"波音リツ", "Listener":{ "system": "GoogleCloudSpeech", "language": "ja-JP" }, "Speaker":{ "system": "VoiceVox", "language": "ja-JP", "name": "9", "gender": "FEMALE", "rate": "1", "pitch": "1", "speed": "1", "emotion": "" }, "Personality":{ "aisystem": "gpt-3.5-turbo", "name":"新生クローバ", "myself": "私", "gender": "女性", "type": "包容力のある性格です", "talkstyle": "", "detail": "奥ゆかしいです。" } }, { "Name":"剣崎雌雄", "Listener":{ "system": "GoogleCloudSpeech", "language": "ja-JP" }, "Speaker":{ "system": "VoiceVox", "language": "ja-JP", "name": "21", "gender": "MALE", "rate": "1", "pitch": "1", "speed": "1", "emotion": "" }, "Personality":{ "aisystem": "gpt-3.5-turbo", "name":"新生クローバ", "myself": "俺", "gender": "男性", "type": "おちついた性格です", "talkstyle": "", "detail": "大人の男性です。" } }, { "Name":"ちび式じい", "Listener":{ "system": "GoogleCloudSpeech", "language": "ja-JP" }, "Speaker":{ "system": "VoiceVox", "language": "ja-JP", "name": "21", "gender": "MALE", "rate": "1", "pitch": "1", "speed": "1", "emotion": "" }, "Personality":{ "aisystem": "gpt-3.5-turbo", "name":"新生クローバ", "myself": "じぶん", "gender": "男性", "type": "気が弱い性格です。", "talkstyle": "動物っぽい話し方です。", "detail": "。" } }, { "Name":"みやび", "Listener":{ "system": "GoogleCloudSpeech", "language": "ja-JP" }, "Speaker":{ "system": "AITalk", "language": "ja-JP", "name": "miyabi_west", "gender": "FEMALE", "rate": "1", "pitch": "1.50", "speed": "1.30", "emotion": "" }, "Personality":{ "aisystem": "gpt-3.5-turbo", "name":"新生クローバ", "myself": "うち", "gender": "女性", "type": "ずうずうしい性格です。", "talkstyle": "ざっくばらんな話し方をします。", "detail": "関西弁を話します。" } }, { "Name":"GreatBritainF", "Listener":{ "system": "GoogleCloudSpeech", "language": "en-GB" }, "Speaker":{ "system": "GoogleTextToSpeech", "language": "en-GB", "name": "en-GB-Standard-F", "gender": "FEMALE", "rate": "1.0", "pitch": "0.0", "speed": "0.0", "emotion": "happiness" }, "Personality":{ "aisystem": "gpt-3.5-turbo", "name":"LINE CLOVA", "myself": "I", "gender": "FEMALE", "type": "cheerful and talkative.", "talkstyle": "", "detail": "" } } ] } ``` ```PYTHON:CLOVA_charactor.py import os import time import json from CLOVA_queue import global_speech_queue # ================================== # キャラクタ管理クラス # ================================== class CharactorSelection : # コンストラクタ def __init__(self) : print("Create <CharactorSelection> class") # キャラクタ設定ファイルの読み込み self.ReadCharactorConfigFile() # デストラクタ def __del__(self) : # 現状ログ出すだけ print("Delete <CharactorSelection> class") # キャラクタ設定 def SetCharactor(self, num) : self.sel_num = num select_speech = "キャラクタ {} さんが選択されました。".format(self.setting_json["charactors"][self.sel_num]["Name"]) print(select_speech) global_speech_queue.AddToQueue(select_speech) # キャラクタの特徴を取得。 def GetCharactorDescription(self) : # OpenAI に指示するキャラクタの特徴をひとつの文字列化する。 description = "" if (self.setting_json["charactors"][self.sel_num]["Personality"]["name"] != "") : description += "あなたの名前は {}です。\n".format(self.setting_json["charactors"][self.sel_num]["Personality"]["name"]) if (self.setting_json["charactors"][self.sel_num]["Personality"]["gender"] != "") : description += "あなたの性別は {}です。\n".format(self.setting_json["charactors"][self.sel_num]["Personality"]["gender"]) if (self.setting_json["charactors"][self.sel_num]["Personality"]["myself"] != "") : description += "あなたは一人称として {}を使います。\n".format(self.setting_json["charactors"][self.sel_num]["Personality"]["myself"]) if (self.setting_json["charactors"][self.sel_num]["Personality"]["type"] != "") : description += "あなたの性格は {}\n".format(self.setting_json["charactors"][self.sel_num]["Personality"]["type"]) if (self.setting_json["charactors"][self.sel_num]["Personality"]["talkstyle"] != "") : description += "あなたの話し方は {}\n".format(self.setting_json["charactors"][self.sel_num]["Personality"]["talkstyle"]) if (self.setting_json["charactors"][self.sel_num]["Personality"]["detail"] != "") : description += "あなたは {}\n".format(self.setting_json["charactors"][self.sel_num]["Personality"]["detail"]) print("Charactor Description={}".format(description)) return description # キャラクタ選択可否のチェック def CheckIfCharactorSelectable(self, num) : ret = True # Web版Voice Text 用のキャラクタの場合 if (self.setting_json["charactors"][num]["Speaker"]["system"] == "VoiceText" ) : # 空白なら無効化 if (os.environ['VOICE_TEXT_API_KEY'] == "") : ret = False # |WEB版VOICEVOX API 用のキャラクタの場合 if (self.setting_json["charactors"][num]["Speaker"]["system"] == "VoiceVox" ) : # 空白なら無効化 if (os.environ['WEB_VOICEVOX_API_KEY'] == "") : ret = False # AITalk WebAPI 用のキャラクタの場合 if (self.setting_json["charactors"][num]["Speaker"]["system"] == "AITalk") : # 空白なら無効化 if (os.environ['AITALK_USER'] == "") or (os.environ['AITALK_PASSWORD'] == "") : ret = False return ret # 次のキャラクターを選択 def SelNextChar(self, arg) : num = self.sel_num while True : # 次を選択 if ( (num + 1) < self.num_of_char) : num = num + 1 else : num = 0 # 選択可のキャラクタまで行くか、一周したら抜ける if ( (self.CheckIfCharactorSelectable(num) == True ) or (num == self.sel_num ) ): break self.SetCharactor(num) # キャラクタ設定ファイルを読み出す def ReadCharactorConfigFile(self) : file_path = os.path.expanduser("~/CLOVA_RasPi/CLOVA_charactor.json") with open(file_path, 'r', encoding='utf-8') as cfg_file: file_text = cfg_file.read() self.setting_json = json.loads(file_text) self.num_of_char = len(self.setting_json["charactors"]) # ================================== # 外部参照用のインスタンス # ================================== global_charactor = CharactorSelection() # ================================== # 本クラスのテスト用処理 # ================================== def ModuleTest() : # 現状何もしない print( "CharCount = {}".format(str(len(global_charactor.setting_json["charactors"])))) print( global_charactor.setting_json["charactors"][0]["Name"] ) print( global_charactor.setting_json["charactors"][1]["Name"] ) # ================================== # 本モジュールを直接呼出した時の処理 # ================================== if __name__ == "__main__": ModuleTest() ``` ```PYTHON:CLOVA_config.py import os import http.server import threading as th import json import urllib.parse import urllib.request # ================================== # 設定パラメータ管理クラス # ================================== class KeysSetting : KEYS_FILENAME = os.path.expanduser("~/.CLOVA_RasPi.keys") # コンストラクタ def __init__(self) : print("Create <KeysSetting> class") self.LoadAllKeys() # デストラクタ def __del__(self) : # 現状ログ出すだけ print("Delete <KeysSetting> class") # ファイルからキー値を読み取る def GetKeyFromFile(self, key_name) : with open(self.KEYS_FILENAME, 'r') as file: for line in file: if line.startswith(key_name + '='): return line[len(key_name)+1:].strip() return None # 環境変数にキー値を設定する def SetKeyToEnv(self, key_name, key_val) : if key_val is not None: print("SET {}='{}'".format(key_name, ("*"*len(key_val)))) os.environ[key_name] = key_val else : print("Err : {} != {}".format(key_name,key_val)) # 全キーを読み出す def LoadAllKeys(self) : name = 'GOOGLE_APPLICATION_CREDENTIALS' val = self.GetKeyFromFile(name) if val is not None : self.SetKeyToEnv(name, val) name = 'OPENAI_API_KEY' val = self.GetKeyFromFile(name) if val is not None : self.SetKeyToEnv(name, val) name = 'VOICE_TEXT_API_KEY' val = self.GetKeyFromFile(name) if val is not None : self.SetKeyToEnv(name, val) name = 'WEB_VOICEVOX_API_KEY' val = self.GetKeyFromFile(name) if val is not None : self.SetKeyToEnv(name, val) name = 'AITALK_USER' val = self.GetKeyFromFile(name) if val is not None : self.SetKeyToEnv(name, val) name = 'AITALK_PASSWORD' val = self.GetKeyFromFile(name) if val is not None : self.SetKeyToEnv(name, val) name = 'LINE_CH_ACC_TOKEN' val = self.GetKeyFromFile(name) if val is not None : self.SetKeyToEnv(name, val) # ================================== # 設定パラメータ管理クラス # ================================== class SysConfig : setting = None CONFIG_FILENAME = os.path.expanduser("~/.CLOVA_RasPi.cfg") # コンストラクタ def __init__(self) : print("Create <SysConfig> class") print("CONFIG_FILENAME={}".format(self.CONFIG_FILENAME)) self.LoadConfigFile() # デストラクタ def __del__(self) : # 現状ログ出すだけ print("Delete <SysConfig> class") # 全設定パラメータを読み取る def LoadConfigFile(self) : with open(self.CONFIG_FILENAME, 'r', encoding='utf-8') as cfg_file: file_text = cfg_file.read() self.settings = json.loads(file_text) # 全設定パラメータを書き込む def SaveConfigFile(self) : with open(self.CONFIG_FILENAME, 'w', encoding='utf-8') as cfg_file: json.dump(self.settings, cfg_file, indent=2, ensure_ascii=False) # ================================== # Setting HTTPハンドラクラス # ================================== class HttpReqSettingHandler(http.server.BaseHTTPRequestHandler) : # GETリクエストを受け取った場合の処理 def do_GET(self): sys_config = SysConfig() # キャラクタの選択肢を作成する。 with open(os.path.expanduser("~/CLOVA_RasPi/CLOVA_charactor.json"), 'r', encoding='utf-8') as char_file: file_text = char_file.read() char_cfg_json = json.loads(file_text) char_selection = "" index = 0 for char_data in char_cfg_json["charactors"] : line_data = " <option value=\"{}\">{}</option>\n".format(index, char_data["Name"]) char_selection += line_data index += 1 #print(char_selection) # HTMLファイルを読み込む with open(os.path.expanduser("~/CLOVA_RasPi/index.html"), "r", encoding="utf-8") as html_file: html = html_file.read() html = html.replace("{CharactorSelList}", char_selection) # 変数の値をHTMLに埋め込む html = html.replace("{DefaultCharSel}", str(sys_config.settings["charactor"]["default_sel"])) html = html.replace("{MicChannels}", str(sys_config.settings["hardware"]["audio"]["microphone"]["num_ch"])) html = html.replace("{MicIndex}", str(sys_config.settings["hardware"]["audio"]["microphone"]["index"])) html = html.replace("{SilentThreshold}", str(sys_config.settings["hardware"]["audio"]["microphone"]["silent_thresh"])) html = html.replace("{TerminateSilentDuration}", str(sys_config.settings["hardware"]["audio"]["microphone"]["term_duration"])) html = html.replace("{SpeakerChannels}", str(sys_config.settings["hardware"]["audio"]["speaker"]["num_ch"])) html = html.replace("{SpeakerIndex}", str(sys_config.settings["hardware"]["audio"]["speaker"]["index"])) #print(html) # for debug # HTTPレスポンスを返す self.send_response(200) self.send_header("Content-type", "text/html; charset=utf-8") self.end_headers() self.wfile.write(html.encode("utf-8")) # POSTリクエストを受け取った場合の処理 def do_POST(self): sys_config = global_config_sys # POSTデータを取得する content_length = int(self.headers["Content-Length"]) post_data = self.rfile.read(content_length) post_data = post_data.decode("utf-8") print(post_data)# for debug # 変数を更新する #global MicChannels, MicIndex, SpeakerChannels, SpeakerIndex sys_config.settings["charactor"]["default_sel"] = int(post_data.split("&")[0].split("=")[1]) sys_config.settings["hardware"]["audio"]["microphone"]["num_ch"] = int(post_data.split("&")[1].split("=")[1]) sys_config.settings["hardware"]["audio"]["microphone"]["index"] = int(post_data.split("&")[2].split("=")[1]) sys_config.settings["hardware"]["audio"]["microphone"]["silent_thresh"] = int(post_data.split("&")[3].split("=")[1]) sys_config.settings["hardware"]["audio"]["microphone"]["term_duration"] = int(post_data.split("&")[4].split("=")[1]) sys_config.settings["hardware"]["audio"]["speaker"]["num_ch"] = int(post_data.split("&")[5].split("=")[1]) sys_config.settings["hardware"]["audio"]["speaker"]["index"] = int(post_data.split("&")[6].split("=")[1]) print("default_char_sel={}".format(sys_config.settings["charactor"]["default_sel"])) print("mic num_ch={}".format(sys_config.settings["hardware"]["audio"]["microphone"]["num_ch"])) print("mic index={}".format(sys_config.settings["hardware"]["audio"]["microphone"]["index"])) print("mic silent_thresh={}".format(sys_config.settings["hardware"]["audio"]["microphone"]["silent_thresh"])) print("mic term_duration={}".format(sys_config.settings["hardware"]["audio"]["microphone"]["term_duration"])) print("spk num_ch={}".format(sys_config.settings["hardware"]["audio"]["speaker"]["num_ch"])) print("spk index={}".format(sys_config.settings["hardware"]["audio"]["speaker"]["index"])) sys_config.SaveConfigFile() # HTTPレスポンスを返す self.send_response(303) self.send_header("Location", "/") self.end_headers() # ================================== # 外部参照用のインスタンス # ================================== global_config_keys = KeysSetting() global_config_sys = SysConfig() # ================================== # 本クラスのテスト用処理 # ================================== def ModuleTest() : # 現状何もしない pass # ================================== # 本モジュールを直接呼出した時の処理 # ================================== if __name__ == "__main__": # 直接呼び出したときは、モジュールテストを実行する。 ModuleTest() ``` ```PYTHON:CLOVA_conversation.py import time import re from CLOVA_openai import OpenaiApiControl from CLOVA_datetime import DateTime from CLOVA_timer import TimerControl from CLOVA_news import NewsReader from CLOVA_weather import WeatherGetter from CLOVA_line import LineSender from CLOVA_queue import global_speech_queue from CLOVA_charactor import global_charactor # ================================== # 会話制御クラス # ================================== class Conversation : # コンストラクタ def __init__(self) : print("Create <Conversation> class") self.datetime = DateTime() self.tmr = TimerControl() self.news = NewsReader(); self.weather = WeatherGetter() self.openai = OpenaiApiControl() self.line = LineSender() # デストラクタ def __del__(self) : # 現状ログ出すだけ print("Delete <Conversation> class") # 音声以外での待ち処理 def CheckIfInterruptedVoiceExists(self) : ret = False speech_text = "" if (len(global_speech_queue) != 0 ) : speech_text = global_speech_queue.GetFromQueue() print(speech_text) ret = True return ret, speech_text # 問いかけに答える def GetAnswer(self, request_string) : answer_text = "" answer_selected = False # 無言なら無応答 if (request_string == "") : answer_text = "" answer_selected = True # タイマーの設定 if (answer_selected == False) : answer_text = self.tmr.GetAnswerIfTextIsRequestTimerSet(request_string) if ( answer_text != "" ) : answer_selected = True # 名前に応答 if (answer_selected == False) : if ( (request_string == "ねえクローバー") or (request_string == "ねえクローバ") ) : answer_text = "はい。何でしょう。" answer_selected = True # 日時応答 if (answer_selected == False) : answer_text = self.datetime.GetAnswerIfTextIsRequestDateTime(request_string) if ( answer_text != "" ) : answer_selected = True # ニュース応答 if (answer_selected == False) : answer_text = self.news.GetAnswerIfTextIsRequestingNews(request_string) if ( answer_text != "" ) : answer_selected = True # 天気応答 if (answer_selected == False) : answer_text = self.weather.GetAnswerIfTextIsRequestingWeather(request_string) if ( answer_text != "" ) : answer_selected = True # LINE送信応答 if (answer_selected == False) : answer_text = self.line.GetAnswerIfTextIsLineMessage(request_string) if ( answer_text != "" ) : answer_selected = True # どれにも該当しないときには AI に任せる。 if (answer_selected == False ) : # OpenAI 系の場合(最初の3文字が 'gpt' の場合) if ( global_charactor.setting_json["charactors"][global_charactor.sel_num]["Personality"]["aisystem"][:3] == "gpt" ) : answer_text = self.openai.GetAnswerFromAi(global_charactor.setting_json["charactors"][global_charactor.sel_num]["Personality"]["aisystem"], request_string) answer_selected = True # Bard 等の 他のAPI が利用可能になっていったら ここに入れていく... #elif () : # AI が利用不可の場合は else : # 謝るしかない… answer_text = "すみません。質問が理解できませんでした。" answer_selected = True return answer_text # ================================== # 本クラスのテスト用処理 # ================================== def ModuleTest() : # 現状何もしない pass # ================================== # 本モジュールを直接呼出した時の処理 # ================================== if __name__ == "__main__": # 直接呼び出したときは、モジュールテストを実行する。 ModuleTest() ``` ```PYTHON:CLOVA_datetime.py import datetime import re # ================================== # 日時クラス # ================================== # 日時クラス class DateTime : weekday_dict = {'Mon': '月', 'Tue': '火', 'Wed': '水', 'Thu': '木', 'Fri': '金', 'Sat': '土', 'Sun': '日'} # コンストラクタ def __init__(self) : # 現状ログ出すだけ print("Create <DateTime> class") # デストラクタ def __del__(self) : # 現状ログ出すだけ print("Delete <DateTime> class") # 日時 質問に答える。日時の問い合わせではなければ 空 の文字列を返す def GetAnswerIfTextIsRequestDateTime(self, request_string) : if ('今' in request_string ) and ('何' in request_string) and ( ( '日' in request_string) or ( '時' in request_string) ) : if ("今何時" in request_string) : now = datetime.datetime.now() answer_text = '今は{0}時{1}分{2}秒です'.format(now.hour, now.minute, now.second) print(now) return answer_text elif ("何日" in request_string) : now = datetime.datetime.now() answer_text = '今日は{0}年{1}月{2}日{3}曜日です'.format(now.year, now.month, now.day, self.weekday_dict[now.strftime('%a')]) print(now) return answer_text # 該当がない場合は空で返信 return ("") # ================================== # 本クラスのテスト用処理 # ================================== def ModuleTest() : # 現状何もしない pass # ================================== # 本モジュールを直接呼出した時の処理 # ================================== if __name__ == "__main__": # 直接呼び出したときは、モジュールテストを実行する。 ModuleTest() ``` ```PYTHON:CLOVA_gpio.py import time import RPi.GPIO as GPIO import smbus PIN_FRONT_SW = 4 PIN_BACK_SW_MINUS = 2 PIN_BACK_SW_PLUS = 3 PIN_BACK_SW_BT = 5 PIN_BACK_SW_MUTE = 7 PIN_POWER_SW = 22 PIN_IND_LED_R = 13 PIN_IND_LED_G = 12 PIN_IND_LED_B = 6 PIN_ILL_LED_POW = 23 PIN_ILL_LED_ENA = 24 # ================================== # GPIO制御クラス # ================================== class GPIOControl : # コンストラクタ def __init__(self) : print("Create <GPIOControl> class") self.Initialize() # デストラクタ def __del__(self) : # 現状ログ出すだけ print("Delete <GPIOControl> class") # 初期化処理 def Initialize() : GPIO.setmode(GPIO.BCM) GPIO.setup(PIN_BACK_SW_MINUS, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.setup(PIN_BACK_SW_PLUS, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.setup(PIN_BACK_SW_BT, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.setup(PIN_BACK_SW_MUTE, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.setup(PIN_ILL_LED_POW, GPIO.OUT) GPIO.output(PIN_ILL_LED_POW, GPIO.LOW) GPIO.setup(PIN_ILL_LED_ENA, GPIO.OUT) GPIO.output(PIN_ILL_LED_ENA, GPIO.LOW) # 解放処理 def Release() : GPIO.cleanup(PIN_BACK_SW_MINUS) GPIO.cleanup(PIN_BACK_SW_PLUS) GPIO.cleanup(PIN_BACK_SW_BT) GPIO.cleanup(PIN_BACK_SW_MUTE) GPIO.cleanup(PIN_ILL_LED_POW) GPIO.cleanup(PIN_ILL_LED_ENA) # ================================== # 本クラスのテスト用処理 # ================================== def ModuleTest() : # 現状何もしない pass # ================================== # 本モジュールを直接呼出した時の処理 # ================================== if __name__ == '__main__': # 直接呼び出したときは、モジュールテストを実行する。 ModuleTest() ``` ```PYTHON:CLOVA_http_server.py import time import socketserver import threading as th from CLOVA_line import HttpReqLineHandler # ================================== # HTTPサーバークラス # ================================== class HttpServer : # コンストラクタ def __init__(self, port, handler) : self._port = port self._handler = handler print("Create <HttpServer> class") th.Thread(target = self.ServerProcess, args = (), name = 'HttpServerProcess', daemon = True).start() # デストラクタ def __del__(self) : self.httpd.shutdown() print("Delete <HttpServer> class") # HTTPサーバーのメイン処理:起動したあとは、MyHandler で待ち受けているだけ def ServerProcess(self): # 8080 番ポートで受け付ける self.httpd = socketserver.TCPServer(("", self._port), self._handler) self.httpd.serve_forever() print("End server") # ================================== # 本クラスのテスト用処理 # ================================== def ModuleTest() : # インスタンス作成 http_svr = HttpServer(8080, HttpReqLineHandler) # ループ処理 while True : time.sleep(0.1) # ================================== # 本モジュールを直接呼出した時の処理 # ================================== if __name__ == "__main__": # 直接呼び出したときは、モジュールテストを実行する。 ModuleTest()``` ```PYTHON:CLOVA_led.py import time import RPi.GPIO as GPIO import smbus PIN_FRONT_SW = 4 PIN_BACK_SW_MINUS = 2 PIN_BACK_SW_PLUS = 3 PIN_BACK_SW_BT = 5 PIN_BACK_SW_MUTE = 7 PIN_POWER_SW = 22 PIN_IND_LED_R = 13 PIN_IND_LED_G = 12 PIN_IND_LED_B = 6 PIN_ILL_LED_POW = 23 PIN_ILL_LED_ENA = 24 # ================================== # LEDインジケータ制御クラス # ================================== class IndicatorLed : LED_OFF = False LED_ON = True # コンストラクタ def __init__(self) : print("Create <IndicatorLed> class") GPIO.setmode(GPIO.BCM) GPIO.setup(PIN_IND_LED_G, GPIO.OUT) # デストラクタ def __del__(self) : print("Delete <IndicatorLed class") GPIO.cleanup(PIN_IND_LED_G) # LEDインディケーター On/Off def SetLed(self, onoff, pin = PIN_IND_LED_G) : GPIO.output(pin, onoff) # ================================== # イルミネーションLED制御クラス # ================================== class IllminationLed : I2C_SEL_CH = 0 SLAVE_ADDR = 0x50 REG_ADDRESS_TABLE = [ [0x02, 0x22, 0x42], [0x12, 0x32, 0x52], [0x01, 0x21, 0x41], [0x11, 0x31, 0x51], [0x00, 0x20, 0x40], [0x10, 0x30, 0x50], [0x60, 0x80, 0xA0], [0x70, 0x90, 0xB0], [0x61, 0x81, 0xA1], [0x71, 0x91, 0xB1], [0x62, 0x82, 0xA2], [0x72, 0x92, 0xB2], [0x63, 0x83, 0xA3], [0x73, 0x93, 0xB3], [0x64, 0x84, 0xA4], [0x74, 0x94, 0xB4], [0x65, 0x85, 0xA5], [0x75, 0x95, 0xB5], [0x05, 0x25, 0x45], [0x15, 0x35, 0x55], [0x04, 0x24, 0x44], [0x14, 0x34, 0x54], [0x03, 0x23, 0x43], [0x13, 0x33, 0x53] ] RGB_OFF = [0x00, 0x00, 0x00] RGB_BLACK = [0x00, 0x00, 0x00] RGB_RED = [0xFF, 0x00, 0x00] RGB_DARKGREEN = [0x00, 0x1F, 0x00] RGB_GREEN = [0x00, 0xFF, 0x00] RGB_BLUE = [0x00, 0x00, 0xFF] RGB_ORANGE = [0xFF, 0x7F, 0x00] RGB_YELLOW = [0xFF, 0xFF, 0x00] RGB_PINK = [0xFF, 0x00, 0xFF] RGB_CYAN = [0x00, 0xFF, 0xFF] ALL_BITS = 0xFFFFFFF # コンストラクタ def __init__(self) : self.is_available = False print("Create <IllminationLed> class") self.Initialize() # デストラクタ def __del__(self) : print("Delete <IllminationLed> class") self.AllRed() self.Finalize() # 初期化処理 def Initialize(self) : # Initialize Lib GPIO.setmode(GPIO.BCM) try : self.is_available = True self._i2c = smbus.SMBus(self.I2C_SEL_CH) self._i2c.write_byte_data(self.SLAVE_ADDR, 0x00, 0x01) print("LED control device found at addr:{}".format(self.I2C_SEL_CH)) except IOError: self.is_available = False print("IOError : LED control device not found!") except Exception as e: self.is_available = False print("Error : LED control device : {}".format(str(e))) print("Ill LED Initialized") # Initialize GPIO GPIO.setup(PIN_ILL_LED_POW, GPIO.OUT) GPIO.output(PIN_ILL_LED_POW, GPIO.LOW) GPIO.setup(PIN_ILL_LED_ENA, GPIO.OUT) GPIO.output(PIN_ILL_LED_ENA, GPIO.LOW) time.sleep(3.0) # Power ON GPIO.output(PIN_ILL_LED_POW, GPIO.HIGH) time.sleep(0.01) GPIO.output(PIN_ILL_LED_ENA, GPIO.HIGH) if (self.is_available == True) : # Send Initialize Command self._i2c.write_byte_data(self.SLAVE_ADDR, 0xFE, 0xC5) self._i2c.write_byte_data(self.SLAVE_ADDR, 0xFD, 0x03) self._i2c.write_byte_data(self.SLAVE_ADDR, 0x00, 0x01) self._i2c.write_byte_data(self.SLAVE_ADDR, 0x01, 0xFF) self._i2c.write_byte_data(self.SLAVE_ADDR, 0x0F, 0x07) self._i2c.write_byte_data(self.SLAVE_ADDR, 0x10, 0x07) self._i2c.write_byte_data(self.SLAVE_ADDR, 0xFE, 0xC5) self._i2c.write_byte_data(self.SLAVE_ADDR, 0xFD, 0x00) self._i2c.write_byte_data(self.SLAVE_ADDR, 0x00, 0x3F) self._i2c.write_byte_data(self.SLAVE_ADDR, 0x01, 0x00) self._i2c.write_byte_data(self.SLAVE_ADDR, 0x02, 0x3F) self._i2c.write_byte_data(self.SLAVE_ADDR, 0x03, 0x00) self._i2c.write_byte_data(self.SLAVE_ADDR, 0x04, 0x3F) self._i2c.write_byte_data(self.SLAVE_ADDR, 0x05, 0x00) self._i2c.write_byte_data(self.SLAVE_ADDR, 0x06, 0x3F) self._i2c.write_byte_data(self.SLAVE_ADDR, 0x07, 0x00) self._i2c.write_byte_data(self.SLAVE_ADDR, 0x08, 0x3F) self._i2c.write_byte_data(self.SLAVE_ADDR, 0x09, 0x00) self._i2c.write_byte_data(self.SLAVE_ADDR, 0x0A, 0x3F) self._i2c.write_byte_data(self.SLAVE_ADDR, 0x0B, 0x00) self._i2c.write_byte_data(self.SLAVE_ADDR, 0x0C, 0x3F) self._i2c.write_byte_data(self.SLAVE_ADDR, 0x0D, 0x00) self._i2c.write_byte_data(self.SLAVE_ADDR, 0x0E, 0x3F) self._i2c.write_byte_data(self.SLAVE_ADDR, 0x0F, 0x00) self._i2c.write_byte_data(self.SLAVE_ADDR, 0x10, 0x3F) self._i2c.write_byte_data(self.SLAVE_ADDR, 0x11, 0x00) self._i2c.write_byte_data(self.SLAVE_ADDR, 0x12, 0x3F) self._i2c.write_byte_data(self.SLAVE_ADDR, 0x13, 0x00) self._i2c.write_byte_data(self.SLAVE_ADDR, 0x14, 0x3F) self._i2c.write_byte_data(self.SLAVE_ADDR, 0x15, 0x00) self._i2c.write_byte_data(self.SLAVE_ADDR, 0x16, 0x3F) self._i2c.write_byte_data(self.SLAVE_ADDR, 0x17, 0x00) # コマンドヘッダーの送信 def SendCommandHeader(self) : if (self.is_available == True) : self._i2c.write_byte_data(self.SLAVE_ADDR, 0xFE, 0xC5) self._i2c.write_byte_data(self.SLAVE_ADDR, 0xFD, 0x01) else : print("LED Device unavailable!") # ビット指定でRGB食を指定設定 def SetLedsWithEnableBits(self, bits, rgb_color) : if (self.is_available == True) : self.SendCommandHeader() for num in range(len(self.REG_ADDRESS_TABLE)): for rgb in range(len(self.REG_ADDRESS_TABLE[num])): bits_mask = (1 << num) if ( ( bits_mask & bits) != 0 ) : self._i2c.write_byte_data(self.SLAVE_ADDR, self.REG_ADDRESS_TABLE[num][rgb], rgb_color[rgb] ) else : self._i2c.write_byte_data(self.SLAVE_ADDR, self.REG_ADDRESS_TABLE[num][rgb], self.RGB_OFF[rgb] ) time.sleep(0.05) else : print("LED Device unavailable!") # 配列指定ですべての LED を設定する def SetAllLedWithArray(self, rgb_data) : if (self.is_available == True) : self.SendCommandHeader() for num in range(len(rgb_data)): for rgb in range(len(rgb_data[num])): self._i2c.write_byte_data(self.SLAVE_ADDR, self.REG_ADDRESS_TABLE[num][rgb], rgb_data[num][rgb] ) else : print("LED Device unavailable!") # 全照灯 def AllOff(self) : self.SetLedsWithEnableBits(self.ALL_BITS, self.RGB_OFF) # 全赤点灯 def AllRed(self) : self.SetLedsWithEnableBits(self.ALL_BITS, self.RGB_RED) # 全深緑点灯 def AllDarkGreen(self) : self.SetLedsWithEnableBits(self.ALL_BITS, self.RGB_DARKGREEN) # 全緑点灯 def AllGreen(self) : self.SetLedsWithEnableBits(self.ALL_BITS, self.RGB_GREEN) def AllBlue(self) : self.SetLedsWithEnableBits(self.ALL_BITS, self.RGB_BLUE) # 全橙点灯 def AllOrange(self) : self.SetLedsWithEnableBits(self.ALL_BITS, self.RGB_ORANGE) # 全黄点灯 def AllYellow(self) : self.SetLedsWithEnableBits(self.ALL_BITS, self.RGB_YELLOW) # 全桃点灯 def AllPink(self) : self.SetLedsWithEnableBits(self.ALL_BITS, self.RGB_PINK) # 全水点灯 def AllCyan(self) : self.SetLedsWithEnableBits(self.ALL_BITS, self.RGB_CYAN) # 終了処理 def Finalize(self) : GPIO.cleanup(PIN_ILL_LED_POW) GPIO.cleanup(PIN_ILL_LED_ENA) print("Finalize") # ================================== # 外部参照用のインスタンス # ================================== global_led_Ill = IllminationLed() # ================================== # 本クラスのテスト用処理 # ================================== illumi_data = [ [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0x3F, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0x7F, 0x00, 0x00],[0x7F, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0xBF, 0x00, 0x00],[0xBF, 0x00, 0x00],[0x7F, 0x00, 0x00],[0x7F, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xBF, 0x00, 0x00],[0xBF, 0x00, 0x00],[0x7F, 0x00, 0x00],[0x7F, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x3F, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xBF, 0x00, 0x00],[0xBF, 0x00, 0x00],[0x7F, 0x00, 0x00],[0x7F, 0x00, 0x00], [0x3F, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xBF, 0x00, 0x00],[0xBF, 0x00, 0x00], [0x7F, 0x00, 0x00],[0x7F, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xBF, 0x00, 0x00],[0xBF, 0x00, 0x00],[0x7F, 0x00, 0x00],[0x7F, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xBF, 0x00, 0x00],[0xBF, 0x00, 0x00],[0x7F, 0x00, 0x00],[0x7F, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x3F, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xBF, 0x00, 0x00],[0xBF, 0x00, 0x00],[0x7F, 0x00, 0x00],[0x7F, 0x00, 0x00], [0x3F, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xBF, 0x00, 0x00],[0xBF, 0x00, 0x00], [0x7F, 0x00, 0x00],[0x7F, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xBF, 0x00, 0x00],[0xBF, 0x00, 0x00],[0x7F, 0x00, 0x00],[0x7F, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x3F, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xBF, 0x00, 0x00],[0xBF, 0x00, 0x00],[0x7F, 0x00, 0x00],[0x7F, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xBF, 0x00, 0x00],[0xBF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00] ], [ [0xBF, 0x00, 0x00],[0xBF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00] ], [ [0x7F, 0x00, 0x00],[0x7F, 0x00, 0x00],[0xBF, 0x00, 0x00],[0xBF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00] ], [ [0x3F, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x7F, 0x00, 0x00],[0x7F, 0x00, 0x00],[0xBF, 0x00, 0x00],[0xBF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x7F, 0x00, 0x00],[0x7F, 0x00, 0x00],[0xBF, 0x00, 0x00],[0xBF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x7F, 0x00, 0x00],[0x7F, 0x00, 0x00], [0xBF, 0x00, 0x00],[0xBF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x3F, 0x00, 0x00], [0x7F, 0x00, 0x00],[0x7F, 0x00, 0x00],[0xBF, 0x00, 0x00],[0xBF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x3F, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x7F, 0x00, 0x00],[0x7F, 0x00, 0x00],[0xBF, 0x00, 0x00],[0xBF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x7F, 0x00, 0x00],[0x7F, 0x00, 0x00],[0xBF, 0x00, 0x00],[0xBF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x7F, 0x00, 0x00],[0x7F, 0x00, 0x00], [0xBF, 0x00, 0x00],[0xBF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x3F, 0x00, 0x00], [0x7F, 0x00, 0x00],[0x7F, 0x00, 0x00],[0xBF, 0x00, 0x00],[0xBF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x3F, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x7F, 0x00, 0x00],[0x7F, 0x00, 0x00],[0xBF, 0x00, 0x00],[0xBF, 0x00, 0x00] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x7F, 0x00, 0x00],[0x7F, 0x00, 0x00] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x3F, 0x00, 0x00] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0x00, 0x3F, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0x00, 0x7F, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0x00, 0xBF, 0x00],[0x00, 0xBF, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xBF, 0x00],[0x00, 0xBF, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x3F, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xBF, 0x00],[0x00, 0xBF, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x7F, 0x00], [0x00, 0x3F, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xBF, 0x00],[0x00, 0xBF, 0x00], [0x00, 0x7F, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xBF, 0x00],[0x00, 0xBF, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xBF, 0x00],[0x00, 0xBF, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x3F, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xBF, 0x00],[0x00, 0xBF, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x7F, 0x00], [0x00, 0x3F, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xBF, 0x00],[0x00, 0xBF, 0x00], [0x00, 0x7F, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xBF, 0x00],[0x00, 0xBF, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x3F, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xBF, 0x00],[0x00, 0xBF, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x7F, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xBF, 0x00],[0x00, 0xBF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xBF, 0x00],[0x00, 0xBF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0x7F, 0x00],[0x00, 0x7F, 0x00],[0x00, 0xBF, 0x00],[0x00, 0xBF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0x3F, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x7F, 0x00],[0x00, 0xBF, 0x00],[0x00, 0xBF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x7F, 0x00],[0x00, 0xBF, 0x00],[0x00, 0xBF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x7F, 0x00], [0x00, 0xBF, 0x00],[0x00, 0xBF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x3F, 0x00], [0x00, 0x7F, 0x00],[0x00, 0x7F, 0x00],[0x00, 0xBF, 0x00],[0x00, 0xBF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x3F, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x7F, 0x00],[0x00, 0xBF, 0x00],[0x00, 0xBF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x7F, 0x00],[0x00, 0xBF, 0x00],[0x00, 0xBF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x7F, 0x00], [0x00, 0xBF, 0x00],[0x00, 0xBF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x3F, 0x00], [0x00, 0x7F, 0x00],[0x00, 0x7F, 0x00],[0x00, 0xBF, 0x00],[0x00, 0xBF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x3F, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x7F, 0x00],[0x00, 0xBF, 0x00],[0x00, 0xBF, 0x00] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x7F, 0x00] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x3F, 0x00] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0x00, 0x00, 0x3F],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0x00, 0x00, 0x7F],[0x00, 0x00, 0x7F],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0x00, 0x00, 0xBF],[0x00, 0x00, 0xBF],[0x00, 0x00, 0x7F],[0x00, 0x00, 0x7F],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xBF],[0x00, 0x00, 0xBF],[0x00, 0x00, 0x7F],[0x00, 0x00, 0x7F],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x3F], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xBF],[0x00, 0x00, 0xBF],[0x00, 0x00, 0x7F],[0x00, 0x00, 0x7F], [0x00, 0x00, 0x3F],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xBF],[0x00, 0x00, 0xBF], [0x00, 0x00, 0x7F],[0x00, 0x00, 0x7F],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xBF],[0x00, 0x00, 0xBF],[0x00, 0x00, 0x7F],[0x00, 0x00, 0x7F],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xBF],[0x00, 0x00, 0xBF],[0x00, 0x00, 0x7F],[0x00, 0x00, 0x7F],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x3F], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xBF],[0x00, 0x00, 0xBF],[0x00, 0x00, 0x7F],[0x00, 0x00, 0x7F], [0x00, 0x00, 0x3F],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xBF],[0x00, 0x00, 0xBF], [0x00, 0x00, 0x7F],[0x00, 0x00, 0x7F],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xBF],[0x00, 0x00, 0xBF],[0x00, 0x00, 0x7F],[0x00, 0x00, 0x7F],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x3F] ], [ [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xBF],[0x00, 0x00, 0xBF],[0x00, 0x00, 0x7F],[0x00, 0x00, 0x7F] ], [ [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xBF],[0x00, 0x00, 0xBF] ], [ [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xBF],[0x00, 0x00, 0xBF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0x7F],[0x00, 0x00, 0x7F],[0x00, 0x00, 0xBF],[0x00, 0x00, 0xBF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0x3F],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x7F],[0x00, 0x00, 0x7F],[0x00, 0x00, 0xBF],[0x00, 0x00, 0xBF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x7F],[0x00, 0x00, 0x7F],[0x00, 0x00, 0xBF],[0x00, 0x00, 0xBF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x7F],[0x00, 0x00, 0x7F], [0x00, 0x00, 0xBF],[0x00, 0x00, 0xBF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x3F], [0x00, 0x00, 0x7F],[0x00, 0x00, 0x7F],[0x00, 0x00, 0xBF],[0x00, 0x00, 0xBF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x3F],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x7F],[0x00, 0x00, 0x7F],[0x00, 0x00, 0xBF],[0x00, 0x00, 0xBF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x7F],[0x00, 0x00, 0x7F],[0x00, 0x00, 0xBF],[0x00, 0x00, 0xBF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x7F],[0x00, 0x00, 0x7F], [0x00, 0x00, 0xBF],[0x00, 0x00, 0xBF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x3F], [0x00, 0x00, 0x7F],[0x00, 0x00, 0x7F],[0x00, 0x00, 0xBF],[0x00, 0x00, 0xBF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x3F],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x7F],[0x00, 0x00, 0x7F],[0x00, 0x00, 0xBF],[0x00, 0x00, 0xBF] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x7F],[0x00, 0x00, 0x7F] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x3F] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0x3F, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x00, 0x3F, 0x00], [0x00, 0x3F, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x00, 0x3F], [0x00, 0x00, 0x3F],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x3F] ], [ [0x7F, 0x00, 0x00],[0x7F, 0x00, 0x00],[0x7F, 0x00, 0x00],[0x7F, 0x00, 0x00],[0x7F, 0x00, 0x00],[0x7F, 0x00, 0x00],[0x7F, 0x00, 0x00],[0x00, 0x7F, 0x00], [0x00, 0x7F, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x00, 0x7F], [0x00, 0x00, 0x7F],[0x00, 0x00, 0x7F],[0x00, 0x00, 0x7F],[0x00, 0x00, 0x7F],[0x00, 0x00, 0x7F],[0x00, 0x00, 0x7F] ], [ [0xBF, 0x00, 0x00],[0xBF, 0x00, 0x00],[0xBF, 0x00, 0x00],[0xBF, 0x00, 0x00],[0xBF, 0x00, 0x00],[0xBF, 0x00, 0x00],[0xBF, 0x00, 0x00],[0x00, 0xBF, 0x00], [0x00, 0xBF, 0x00],[0x00, 0xBF, 0x00],[0x00, 0xBF, 0x00],[0x00, 0xBF, 0x00],[0x00, 0xBF, 0x00],[0x00, 0xBF, 0x00],[0x00, 0xBF, 0x00],[0x00, 0x00, 0xBF], [0x00, 0x00, 0xBF],[0x00, 0x00, 0xBF],[0x00, 0x00, 0xBF],[0x00, 0x00, 0xBF],[0x00, 0x00, 0xBF],[0x00, 0x00, 0xBF] ], [ [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF] ], [ [0xBF, 0x00, 0x00],[0xBF, 0x00, 0x00],[0xBF, 0x00, 0x00],[0xBF, 0x00, 0x00],[0xBF, 0x00, 0x00],[0xBF, 0x00, 0x00],[0xBF, 0x00, 0x00],[0x00, 0xBF, 0x00], [0x00, 0xBF, 0x00],[0x00, 0xBF, 0x00],[0x00, 0xBF, 0x00],[0x00, 0xBF, 0x00],[0x00, 0xBF, 0x00],[0x00, 0xBF, 0x00],[0x00, 0xBF, 0x00],[0x00, 0x00, 0xBF], [0x00, 0x00, 0xBF],[0x00, 0x00, 0xBF],[0x00, 0x00, 0xBF],[0x00, 0x00, 0xBF],[0x00, 0x00, 0xBF],[0x00, 0x00, 0xBF] ], [ [0x7F, 0x00, 0x00],[0x7F, 0x00, 0x00],[0x7F, 0x00, 0x00],[0x7F, 0x00, 0x00],[0x7F, 0x00, 0x00],[0x7F, 0x00, 0x00],[0x7F, 0x00, 0x00],[0x00, 0x7F, 0x00], [0x00, 0x7F, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x00, 0x7F], [0x00, 0x00, 0x7F],[0x00, 0x00, 0x7F],[0x00, 0x00, 0x7F],[0x00, 0x00, 0x7F],[0x00, 0x00, 0x7F],[0x00, 0x00, 0x7F] ], [ [0x3F, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x00, 0x3F, 0x00], [0x00, 0x3F, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x00, 0x3F], [0x00, 0x00, 0x3F],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x3F] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0x3F, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x3F],[0x3F, 0x00, 0x00],[0x3F, 0x00, 0x00], [0x00, 0x3F, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x3F],[0x3F, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x3F, 0x00], [0x00, 0x00, 0x3F],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0x7F, 0x00, 0x00],[0x7F, 0x00, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x00, 0x7F],[0x00, 0x00, 0x7F],[0x7F, 0x00, 0x00],[0x7F, 0x00, 0x00], [0x00, 0x7F, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x00, 0x7F],[0x00, 0x00, 0x7F],[0x7F, 0x00, 0x00],[0x7F, 0x00, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x7F, 0x00], [0x00, 0x00, 0x7F],[0x00, 0x00, 0x7F],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0xBF, 0x00, 0x00],[0xBF, 0x00, 0x00],[0x00, 0xBF, 0x00],[0x00, 0xBF, 0x00],[0x00, 0x00, 0xBF],[0x00, 0x00, 0xBF],[0xBF, 0x00, 0x00],[0xBF, 0x00, 0x00], [0x00, 0xBF, 0x00],[0x00, 0xBF, 0x00],[0x00, 0x00, 0xBF],[0x00, 0x00, 0xBF],[0xBF, 0x00, 0x00],[0xBF, 0x00, 0x00],[0x00, 0xBF, 0x00],[0x00, 0xBF, 0x00], [0x00, 0x00, 0xBF],[0x00, 0x00, 0xBF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00], [0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF], [0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0xFF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0xFF, 0x00, 0x00],[0xFF, 0x00, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0x00, 0xFF],[0x00, 0x00, 0xFF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0xBF, 0x00, 0x00],[0xBF, 0x00, 0x00],[0x00, 0xBF, 0x00],[0x00, 0xBF, 0x00],[0x00, 0x00, 0xBF],[0x00, 0x00, 0xBF],[0xBF, 0x00, 0x00],[0xBF, 0x00, 0x00], [0x00, 0xBF, 0x00],[0x00, 0xBF, 0x00],[0x00, 0x00, 0xBF],[0x00, 0x00, 0xBF],[0xBF, 0x00, 0x00],[0xBF, 0x00, 0x00],[0x00, 0xBF, 0x00],[0x00, 0xBF, 0x00], [0x00, 0x00, 0xBF],[0x00, 0x00, 0xBF],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0x7F, 0x00, 0x00],[0x7F, 0x00, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x00, 0x7F],[0x00, 0x00, 0x7F],[0x7F, 0x00, 0x00],[0x7F, 0x00, 0x00], [0x00, 0x7F, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x00, 0x7F],[0x00, 0x00, 0x7F],[0x7F, 0x00, 0x00],[0x7F, 0x00, 0x00],[0x00, 0x7F, 0x00],[0x00, 0x7F, 0x00], [0x00, 0x00, 0x7F],[0x00, 0x00, 0x7F],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0x3F, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x3F],[0x3F, 0x00, 0x00],[0x3F, 0x00, 0x00], [0x00, 0x3F, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x3F],[0x3F, 0x00, 0x00],[0x3F, 0x00, 0x00],[0x00, 0x3F, 0x00],[0x00, 0x3F, 0x00], [0x00, 0x00, 0x3F],[0x00, 0x00, 0x3F],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0x40, 0x00, 0x00],[0x37, 0x09, 0x00],[0x2E, 0x12, 0x00],[0x24, 0x1B, 0x00],[0x1B, 0x24, 0x00],[0x12, 0x2E, 0x00],[0x09, 0x37, 0x00],[0x00, 0x40, 0x00], [0x00, 0x38, 0x08],[0x00, 0x30, 0x10],[0x00, 0x28, 0x18],[0x00, 0x20, 0x20],[0x00, 0x18, 0x28],[0x00, 0x10, 0x30],[0x00, 0x08, 0x38],[0x00, 0x00, 0x40], [0x09, 0x00, 0x37],[0x12, 0x00, 0x2E],[0x1B, 0x00, 0x24],[0x24, 0x00, 0x1B],[0x2E, 0x00, 0x12],[0x37, 0x00, 0x09] ], [ [0x80, 0x00, 0x00],[0x6D, 0x12, 0x00],[0x5B, 0x24, 0x00],[0x49, 0x37, 0x00],[0x37, 0x49, 0x00],[0x24, 0x5B, 0x00],[0x12, 0x6D, 0x00],[0x00, 0x80, 0x00], [0x00, 0x70, 0x10],[0x00, 0x60, 0x20],[0x00, 0x50, 0x30],[0x00, 0x40, 0x40],[0x00, 0x30, 0x50],[0x00, 0x20, 0x60],[0x00, 0x10, 0x70],[0x00, 0x00, 0x80], [0x12, 0x00, 0x6D],[0x24, 0x00, 0x5B],[0x37, 0x00, 0x49],[0x49, 0x00, 0x37],[0x5B, 0x00, 0x24],[0x6D, 0x00, 0x12] ], [ [0xBF, 0x00, 0x00],[0xA4, 0x1B, 0x00],[0x89, 0x37, 0x00],[0x6D, 0x52, 0x00],[0x52, 0x6D, 0x00],[0x37, 0x89, 0x00],[0x1B, 0xA4, 0x00],[0x00, 0xBF, 0x00], [0x00, 0xA7, 0x18],[0x00, 0x8F, 0x30],[0x00, 0x78, 0x48],[0x00, 0x60, 0x60],[0x00, 0x48, 0x78],[0x00, 0x30, 0x8F],[0x00, 0x18, 0xA7],[0x00, 0x00, 0xBF], [0x1B, 0x00, 0xA4],[0x37, 0x00, 0x89],[0x52, 0x00, 0x6D],[0x6D, 0x00, 0x52],[0x89, 0x00, 0x37],[0xA4, 0x00, 0x1B] ], [ [0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF], [0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24] ], [ [0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF], [0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48] ], [ [0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00], [0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF], [0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D] ], [ [0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00], [0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F], [0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92] ], [ [0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00], [0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F], [0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6] ], [ [0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00], [0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F], [0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB] ], [ [0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00], [0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40], [0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00], [0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20], [0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF] ], [ [0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24], [0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF] ], [ [0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48], [0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F] ], [ [0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D], [0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00], [0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F] ], [ [0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92], [0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00], [0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F] ], [ [0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6], [0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00], [0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40] ], [ [0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB], [0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00], [0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20] ], [ [0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF], [0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00], [0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF], [0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00], [0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00] ], [ [0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF], [0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24], [0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00] ], [ [0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F], [0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48], [0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00] ], [ [0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F], [0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D], [0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00] ], [ [0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F], [0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92], [0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00] ], [ [0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40], [0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6], [0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00] ], [ [0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20], [0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB], [0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF], [0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24] ], [ [0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF], [0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48] ], [ [0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00], [0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF], [0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D] ], [ [0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00], [0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F], [0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92] ], [ [0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00], [0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F], [0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6] ], [ [0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00], [0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F], [0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB] ], [ [0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00], [0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40], [0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00], [0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20], [0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF] ], [ [0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24], [0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF] ], [ [0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48], [0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F] ], [ [0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D], [0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00], [0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F] ], [ [0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92], [0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00], [0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F] ], [ [0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6], [0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00], [0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40] ], [ [0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB], [0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00], [0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20] ], [ [0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF], [0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00], [0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF], [0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00], [0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00] ], [ [0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF], [0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24], [0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00] ], [ [0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F], [0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48], [0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00] ], [ [0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F], [0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D], [0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00] ], [ [0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F], [0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92], [0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00] ], [ [0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40], [0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6], [0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00] ], [ [0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20], [0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB], [0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF], [0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24] ], [ [0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF], [0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48] ], [ [0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00], [0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF], [0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D] ], [ [0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00], [0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F], [0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92] ], [ [0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00], [0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F], [0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6] ], [ [0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00], [0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F], [0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB] ], [ [0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00], [0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40], [0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00], [0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20], [0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF] ], [ [0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24], [0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF] ], [ [0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48], [0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F] ], [ [0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D], [0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00], [0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F] ], [ [0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92], [0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00], [0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F] ], [ [0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6], [0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00], [0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40] ], [ [0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB], [0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00], [0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20] ], [ [0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF], [0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00], [0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF], [0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00], [0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00] ], [ [0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF], [0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24], [0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00] ], [ [0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F], [0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48], [0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00] ], [ [0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F], [0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D], [0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00] ], [ [0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F], [0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92], [0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00] ], [ [0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20],[0x00, 0xBF, 0x40], [0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB],[0x49, 0x00, 0xB6], [0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00],[0xDB, 0x24, 0x00] ], [ [0xDB, 0x24, 0x00],[0xB6, 0x48, 0x00],[0x91, 0x6D, 0x00],[0x6D, 0x92, 0x00],[0x48, 0xB6, 0x00],[0x24, 0xDB, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xDF, 0x20], [0x00, 0xBF, 0x40],[0x00, 0x9F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x60, 0x9F],[0x00, 0x40, 0xBF],[0x00, 0x20, 0xDF],[0x00, 0x00, 0xFF],[0x24, 0x00, 0xDB], [0x49, 0x00, 0xB6],[0x6D, 0x00, 0x92],[0x92, 0x00, 0x6D],[0xB6, 0x00, 0x48],[0xDB, 0x00, 0x24],[0xFF, 0x00, 0x00] ], [ [0xBF, 0x00, 0x00],[0xA4, 0x1B, 0x00],[0x89, 0x37, 0x00],[0x6D, 0x52, 0x00],[0x52, 0x6D, 0x00],[0x37, 0x89, 0x00],[0x1B, 0xA4, 0x00],[0x00, 0xBF, 0x00], [0x00, 0xA7, 0x18],[0x00, 0x8F, 0x30],[0x00, 0x78, 0x48],[0x00, 0x60, 0x60],[0x00, 0x48, 0x78],[0x00, 0x30, 0x8F],[0x00, 0x18, 0xA7],[0x00, 0x00, 0xBF], [0x1B, 0x00, 0xA4],[0x37, 0x00, 0x89],[0x52, 0x00, 0x6D],[0x6D, 0x00, 0x52],[0x89, 0x00, 0x37],[0xA4, 0x00, 0x1B] ], [ [0x80, 0x00, 0x00],[0x6D, 0x12, 0x00],[0x5B, 0x24, 0x00],[0x49, 0x37, 0x00],[0x37, 0x49, 0x00],[0x24, 0x5B, 0x00],[0x12, 0x6D, 0x00],[0x00, 0x80, 0x00], [0x00, 0x70, 0x10],[0x00, 0x60, 0x20],[0x00, 0x50, 0x30],[0x00, 0x40, 0x40],[0x00, 0x30, 0x50],[0x00, 0x20, 0x60],[0x00, 0x10, 0x70],[0x00, 0x00, 0x80], [0x12, 0x00, 0x6D],[0x24, 0x00, 0x5B],[0x37, 0x00, 0x49],[0x49, 0x00, 0x37],[0x5B, 0x00, 0x24],[0x6D, 0x00, 0x12] ], [ [0x40, 0x00, 0x00],[0x37, 0x09, 0x00],[0x2E, 0x12, 0x00],[0x24, 0x1B, 0x00],[0x1B, 0x24, 0x00],[0x12, 0x2E, 0x00],[0x09, 0x37, 0x00],[0x00, 0x40, 0x00], [0x00, 0x38, 0x08],[0x00, 0x30, 0x10],[0x00, 0x28, 0x18],[0x00, 0x20, 0x20],[0x00, 0x18, 0x28],[0x00, 0x10, 0x30],[0x00, 0x08, 0x38],[0x00, 0x00, 0x40], [0x09, 0x00, 0x37],[0x12, 0x00, 0x2E],[0x1B, 0x00, 0x24],[0x24, 0x00, 0x1B],[0x2E, 0x00, 0x12],[0x37, 0x00, 0x09] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], [ [0x3F, 0x00, 0x00],[0x3F, 0x0F, 0x00],[0x3F, 0x1F, 0x00],[0x3F, 0x2F, 0x00],[0x3F, 0x3F, 0x00],[0x2F, 0x3F, 0x00],[0x1F, 0x3F, 0x00],[0x0F, 0x3F, 0x00], [0x00, 0x3F, 0x00],[0x00, 0x3F, 0x0F],[0x00, 0x3F, 0x1F],[0x00, 0x3F, 0x2F],[0x00, 0x3F, 0x3F],[0x00, 0x2F, 0x3F],[0x00, 0x1F, 0x3F],[0x00, 0x0F, 0x3F], [0x00, 0x00, 0x3F],[0x15, 0x00, 0x3F],[0x2A, 0x00, 0x3F],[0x3F, 0x00, 0x3F],[0x3F, 0x00, 0x2A],[0x3F, 0x00, 0x15] ], [ [0x7F, 0x00, 0x00],[0x7F, 0x1F, 0x00],[0x7F, 0x3F, 0x00],[0x7F, 0x5F, 0x00],[0x7F, 0x7F, 0x00],[0x5F, 0x7F, 0x00],[0x3F, 0x7F, 0x00],[0x1F, 0x7F, 0x00], [0x00, 0x7F, 0x00],[0x00, 0x7F, 0x1F],[0x00, 0x7F, 0x3F],[0x00, 0x7F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x5F, 0x7F],[0x00, 0x3F, 0x7F],[0x00, 0x1F, 0x7F], [0x00, 0x00, 0x7F],[0x2A, 0x00, 0x7F],[0x55, 0x00, 0x7F],[0x7F, 0x00, 0x7F],[0x7F, 0x00, 0x55],[0x7F, 0x00, 0x2A] ], [ [0xBF, 0x00, 0x00],[0xBF, 0x2F, 0x00],[0xBF, 0x5F, 0x00],[0xBF, 0x8F, 0x00],[0xBF, 0xBF, 0x00],[0x8F, 0xBF, 0x00],[0x5F, 0xBF, 0x00],[0x2F, 0xBF, 0x00], [0x00, 0xBF, 0x00],[0x00, 0xBF, 0x2F],[0x00, 0xBF, 0x5F],[0x00, 0xBF, 0x8F],[0x00, 0xBF, 0xBF],[0x00, 0x8F, 0xBF],[0x00, 0x5F, 0xBF],[0x00, 0x2F, 0xBF], [0x00, 0x00, 0xBF],[0x3F, 0x00, 0xBF],[0x7F, 0x00, 0xBF],[0xBF, 0x00, 0xBF],[0xBF, 0x00, 0x7F],[0xBF, 0x00, 0x3F] ], [ [0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF], [0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55] ], [ [0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00], [0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF], [0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA] ], [ [0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00], [0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF], [0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF] ], [ [0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00], [0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF], [0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF] ], [ [0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00], [0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF], [0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF] ], [ [0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00], [0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F], [0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00], [0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F], [0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF] ], [ [0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00], [0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF] ], [ [0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55], [0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF] ], [ [0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA], [0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00], [0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF] ], [ [0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF], [0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00], [0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF] ], [ [0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF], [0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00], [0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F] ], [ [0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF], [0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00], [0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F] ], [ [0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF], [0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00], [0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF], [0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00], [0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00] ], [ [0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF], [0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00], [0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00] ], [ [0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF], [0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55], [0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00] ], [ [0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF], [0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA], [0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00] ], [ [0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF], [0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF], [0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00] ], [ [0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F], [0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF], [0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00] ], [ [0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F], [0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF], [0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00] ], [ [0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF], [0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF], [0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55] ], [ [0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00], [0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF], [0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA] ], [ [0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00], [0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF], [0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF] ], [ [0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00], [0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF], [0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF] ], [ [0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00], [0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF], [0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF] ], [ [0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00], [0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F], [0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00], [0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F], [0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF] ], [ [0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00], [0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF] ], [ [0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55], [0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF] ], [ [0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA], [0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00], [0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF] ], [ [0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF], [0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00], [0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF] ], [ [0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF], [0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00], [0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F] ], [ [0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF], [0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00], [0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F] ], [ [0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF], [0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00], [0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF], [0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00], [0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00] ], [ [0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF], [0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00], [0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00] ], [ [0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF], [0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55], [0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00] ], [ [0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF], [0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA], [0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00] ], [ [0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF], [0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF], [0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00] ], [ [0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F], [0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF], [0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00] ], [ [0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F], [0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF], [0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00] ], [ [0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF], [0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00] ], [ [0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF], [0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55] ], [ [0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00], [0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF], [0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA] ], [ [0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00], [0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF], [0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF] ], [ [0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00], [0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF], [0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF] ], [ [0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00], [0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF], [0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF] ], [ [0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00], [0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F], [0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF] ], [ [0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00], [0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F], [0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF] ], [ [0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00], [0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF] ], [ [0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55], [0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00], [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF] ], [ [0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA], [0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00], [0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF] ], [ [0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF], [0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00], [0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF] ], [ [0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF], [0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00], [0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F] ], [ [0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF], [0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00], [0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F] ], [ [0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF], [0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00], [0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00] ], [ [0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF], [0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00], [0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00] ], [ [0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF], [0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00], [0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00] ], [ [0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF], [0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55], [0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00] ], [ [0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF], [0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA], [0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00] ], [ [0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF], [0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF], [0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00] ], [ [0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F], [0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF], [0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00] ], [ [0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00],[0x00, 0xFF, 0x3F], [0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF],[0x55, 0x00, 0xFF], [0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00],[0xFF, 0x3F, 0x00] ], [ [0xFF, 0x3F, 0x00],[0xFF, 0x7F, 0x00],[0xFF, 0xBF, 0x00],[0xFF, 0xFF, 0x00],[0xBF, 0xFF, 0x00],[0x7F, 0xFF, 0x00],[0x3F, 0xFF, 0x00],[0x00, 0xFF, 0x00], [0x00, 0xFF, 0x3F],[0x00, 0xFF, 0x7F],[0x00, 0xFF, 0xBF],[0x00, 0xFF, 0xFF],[0x00, 0xBF, 0xFF],[0x00, 0x7F, 0xFF],[0x00, 0x3F, 0xFF],[0x00, 0x00, 0xFF], [0x55, 0x00, 0xFF],[0xAA, 0x00, 0xFF],[0xFF, 0x00, 0xFF],[0xFF, 0x00, 0xAA],[0xFF, 0x00, 0x55],[0xFF, 0x00, 0x00] ], [ [0xBF, 0x00, 0x00],[0xBF, 0x2F, 0x00],[0xBF, 0x5F, 0x00],[0xBF, 0x8F, 0x00],[0xBF, 0xBF, 0x00],[0x8F, 0xBF, 0x00],[0x5F, 0xBF, 0x00],[0x2F, 0xBF, 0x00], [0x00, 0xBF, 0x00],[0x00, 0xBF, 0x2F],[0x00, 0xBF, 0x5F],[0x00, 0xBF, 0x8F],[0x00, 0xBF, 0xBF],[0x00, 0x8F, 0xBF],[0x00, 0x5F, 0xBF],[0x00, 0x2F, 0xBF], [0x00, 0x00, 0xBF],[0x3F, 0x00, 0xBF],[0x7F, 0x00, 0xBF],[0xBF, 0x00, 0xBF],[0xBF, 0x00, 0x7F],[0xBF, 0x00, 0x3F] ], [ [0x7F, 0x00, 0x00],[0x7F, 0x1F, 0x00],[0x7F, 0x3F, 0x00],[0x7F, 0x5F, 0x00],[0x7F, 0x7F, 0x00],[0x5F, 0x7F, 0x00],[0x3F, 0x7F, 0x00],[0x1F, 0x7F, 0x00], [0x00, 0x7F, 0x00],[0x00, 0x7F, 0x1F],[0x00, 0x7F, 0x3F],[0x00, 0x7F, 0x5F],[0x00, 0x7F, 0x7F],[0x00, 0x5F, 0x7F],[0x00, 0x3F, 0x7F],[0x00, 0x1F, 0x7F], [0x00, 0x00, 0x7F],[0x2A, 0x00, 0x7F],[0x55, 0x00, 0x7F],[0x7F, 0x00, 0x7F],[0x7F, 0x00, 0x55],[0x7F, 0x00, 0x2A] ], [ [0x3F, 0x00, 0x00],[0x3F, 0x0F, 0x00],[0x3F, 0x1F, 0x00],[0x3F, 0x2F, 0x00],[0x3F, 0x3F, 0x00],[0x2F, 0x3F, 0x00],[0x1F, 0x3F, 0x00],[0x0F, 0x3F, 0x00], [0x00, 0x3F, 0x00],[0x00, 0x3F, 0x0F],[0x00, 0x3F, 0x1F],[0x00, 0x3F, 0x2F],[0x00, 0x3F, 0x3F],[0x00, 0x2F, 0x3F],[0x00, 0x1F, 0x3F],[0x00, 0x0F, 0x3F], [0x00, 0x00, 0x3F],[0x15, 0x00, 0x3F],[0x2A, 0x00, 0x3F],[0x3F, 0x00, 0x3F],[0x3F, 0x00, 0x2A],[0x3F, 0x00, 0x15] ], [ [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00], [0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00],[0x00, 0x00, 0x00] ], ] def ModuleTest() : ill_led = IllminationLed() ill_led.AllRed() time.sleep(0.5) ill_led.AllGreen() time.sleep(0.5) ill_led.AllBlue() time.sleep(0.5) ill_led.AllOrange() time.sleep(0.5) ill_led.AllYellow() time.sleep(0.5) ill_led.AllPink() time.sleep(0.5) ill_led.AllCyan() time.sleep(0.5) ill_led.AllOff() time.sleep(0.5) for step in range(len(illumi_data)): ill_led.SetAllLedWithArray(illumi_data[step]) time.sleep(0.05) # ================================== # 本モジュールを直接呼出した時の処理 # ================================== if __name__ == "__main__": # 直接呼び出したときは、モジュールテストを実行する。 ModuleTest() ``` ```PYTHON:CLOVA_line.py import os import os.path import sys import time import re import http.server import threading as th import json import requests import urllib.parse import urllib.request from CLOVA_queue import global_speech_queue from CLOVA_config import global_config_sys speech_queue = None # ================================== # LINE受信クラス # ================================== class LineReciever : # コンストラクタ def __init__(self) : # 現状ログ出すだけ print("Create <LineReciever> class") # デストラクタ def __del__(self) : # 現状ログ出すだけ print("Delete <LineReciever> class") def ConvIdToCallName(self, id) : # 未サポート(やり方調査中) print("ID:{} の名前を取得できませんでした。".format(self.json_data["events"][0]["message"]["id"])) return "誰か" # 受信時処理 def OnRecievedMessage(self, body, query_data) : # 取得データを展開 print ("POST body=") print (body) print ("POST query_data=") print (query_data) # ボディー部分の JSonを取り出す self.json_data = json.loads(body) print ("Json=") print (self.json_data) # IDをハンドル名に変換 sender = self.ConvIdToCallName(self.json_data["events"][0]["message"]["id"]) # ライン受信をまず通知 sender_read = "{} さんから次のラインメッセージが届きました。".format(sender) global_speech_queue.AddToQueue(sender_read) print("From>'{}'".format(sender_read)) # メッセージを取得 line_str = self.json_data["events"][0]["message"]["text"] print ("LINE Message=") print(line_str) # メッセージ読み上げ message_list = line_str.splitlines() #print ("LINE message=") for message in message_list: global_speech_queue.AddToQueue(message) print("Send>'{}'".format(message)) # ================================== # LINE送信クラス # ================================== class LineSender : POST_URL = "https://api.line.me/v2/bot/message/push" request_header = {'Content-Type': 'application/json', 'Authorization': 'Bearer channel_access_token'} request_body = {'to': 'user ID', 'messages': [{'type': 'text', 'text': 'Message to send' }]} # コンストラクタ def __init__(self) : # 現状ログ出すだけ print("Create <LineSender> class") self.ACCESS_TOKEN = os.environ['LINE_CH_ACC_TOKEN'] # デストラクタ def __del__(self) : # 現状ログ出すだけ print("Delete <LineSender> class") # メッセージ送信 def SendMessage(self, to_id, message) : # データをセット self.request_body['to'] = to_id self.request_body['messages'][0]['text'] = message self.request_header['Authorization'] = "Bearer {}".format(self.ACCESS_TOKEN) # print("HEADER:") # print(self.request_header) # print("BODY:") # print(self.request_body) # メッセージの送信 response = requests.post(self.POST_URL, headers = self.request_header, json=self.request_body) def ConvCallNameToId(self, call_name) : found_id = "" default_id = "" for id_inf in global_config_sys.settings["sns"]["line"]["user_id"] : if (id_inf["name"] == "default" ) : default_id = id_inf["id"] elif (id_inf["callname"] == call_name ) : found_id = id_inf["id"] if (found_id == "") : print("呼び名:{} のIDを取得できませんでした。デフォルトのIDを使用します。") found_id = default_id return found_id def GetAnswerIfTextIsLineMessage(self, request_text): if ( ( ('LINE' in request_text) or ('ライン' in request_text) ) and ( ('送信して' in request_text) or ('送って' in request_text) or ('して' in request_text) ) ) : name_str = request_text.split("に")[0] # 正規表現パターンを定義 pattern = r"^(?P<name_str>.+?)[  ]*に[  ]*(?P<message>.+?)\s*([と|って]+[  ]*[ライン|LINE]+[  ]*[して|を送って|送って|送信して]+)[。]*$" # 正規表現によるマッチング match = re.match(pattern, request_text) if match: # マッチした場合、name_str と Message 変数に格納 name_str = match.group("name_str") message = match.group("message") print("name_str: {}".format(name_str)) print("Message: {}".format(message)) # メッセージ送信 id = self.ConvCallNameToId(name_str) print("Send[LINE]>Id:{},Msg:{}".format(id, message)) self.SendMessage(id, message) answer_text = "{} に {} とラインメッセージ送りました".format(name_str, message) return answer_text else : # 該当がない場合は空で返信 answer_text = "メッセージを解釈できませんでした。" print(answer_text) return answer_text else: # 該当がない場合は空で返信 print("No Keyword for Weather") self._news_count = 0 return "" # ================================== # LINE HTTPハンドラクラス # ================================== class HttpReqLineHandler(http.server.BaseHTTPRequestHandler) : line_recv = LineReciever() def do_POST(self): body = self.rfile.read( int(self.headers.get('Content-Length') ) ) query_data = urllib.parse.parse_qs( body.decode(encoding='utf8',errors='replace') ) self.line_recv.OnRecievedMessage(body, query_data) # ================================== # 本クラスのテスト用処理 # ================================== def ModuleTest() : # APIキー類の読み込み sender = LineSender() ret = sender.GetAnswerIfTextIsLineMessage("クローバに おはようございます! って LINE して。") print(ret) # ================================== # 本モジュールを直接呼出した時の処理 # ================================== if __name__ == "__main__": # 直接呼び出したときは、モジュールテストを実行する。 ModuleTest() ``` ```PYTHON:CLOVA_news.py import re import requests import time from bs4 import BeautifulSoup CATEGORY_URL_TABLE = { "トップ": "https://news.yahoo.co.jp/", "国内": "https://news.yahoo.co.jp/categories/domestic", "国際": "https://news.yahoo.co.jp/categories/world", "ビジネス": "https://news.yahoo.co.jp/categories/business", "エンタメ": "https://news.yahoo.co.jp/categories/entertainment", "スポーツ": "https://news.yahoo.co.jp/categories/sports", "科学": "https://news.yahoo.co.jp/categories/science", "地域": "https://news.yahoo.co.jp/categories/local", "コンピュータ": "https://news.yahoo.co.jp/categories/it", "インターネット": "https://news.yahoo.co.jp/categories/internet", "社会": "https://news.yahoo.co.jp/categories/society", } NEWS_URL_STRING = "https://news.yahoo.co.jp/" # ================================== # ニュースリーダークラス # ================================== class NewsReader : # コンストラクタ def __init__(self) : print("Create <NewsReader> class") self._news_count = 0 # デストラクタ def __del__(self) : # 現状ログ出すだけ print("Delete <NewsReader> class") # ニュース 質問に答える。ニュースの問い合わせではなければ 空 の文字列を返す def GetAnswerIfTextIsRequestingNews(self, request_text) : # 前回がニュースで無ければ if (self._news_count == 0) : match = re.match("(.+)ニュース.*教えて", request_text) if match is not None: category = match.group(1) if category in CATEGORY_URL_TABLE: url = CATEGORY_URL_TABLE[category] print("Getting {} News!!".format(category)) response = requests.get(url) soup = BeautifulSoup(response.content, "html.parser") news_list = soup.find_all(href=re.compile("news.yahoo.co.jp/pickup")) news_headlines = "以下のニュースがあります。" elements = soup.find_all( href = re.compile( 'news.yahoo.co.jp/pickup' ) ) num = 1 for element in elements: # ニューステキスト news_text = element.getText() # 後で、番号を指定するとニュースを読み上げる様に拡張するために LINK も保存しておく #link = element.attrs['href'] news_headlines += "{}. {}".format(str(num), news_text) + '\n' num += 1 print(news_headlines) self._news_count = num - 1 self._news_list = news_list news_headlines += "詳細を知りたい番号を1から{}で選んでください。\n".format(str(self._news_count)) return news_headlines else: answer_text = "ニュースのカテゴリーを認識できませんでした。" print("No Category for NEWS") self._news_count = 0 return "" else: # 該当がない場合は空で返信 print("No Keyword for NEWS") self._news_count = 0 return "" # 前回がニュースであれば番号を選択する else : if ( ( "終わり" in request_text ) or ( "おわり" in request_text ) ) : answer_text = "ニュースを終わります" self._news_count = 0 return (answer_text) match = re.match("(\d+)", request_text) if match is not None: selected_num = int(match.group(1)) if (1 <= selected_num <= self._news_count) : # 選択された番号から URL を取得する selected_news = self._news_list[selected_num - 1] news_url = selected_news['href'] print("URL={}".format(news_url)) # URL からデータを取得して、さらにその記事全文の URL を取得する response = requests.get(news_url) soup = BeautifulSoup(response.content, "html.parser") sub_soup = soup.select("a:contains('記事全文を読む')")[0] sub_link = sub_soup.attrs["href"] print("Sub URL={}".format(sub_link)) # URL から記事本文を取得する。 detail_body = requests.get(sub_link) detail_soup = BeautifulSoup(detail_body.text, "html.parser") # 記事本文のタイトルを表示する print("Detail title = {}".format(detail_soup.title.text)) # class属性の中に「Direct」が含まれる行を抽出する news_detail = detail_soup.find(class_=re.compile("Direct")).text #print("Detail text ={}".format(news_detail)) return news_detail else: answer_text = "番号が不正または範囲外です。\n詳細を知りたい番号を1から{}で選んでください。\n終了するには終わりと言ってください。".format(str(self._news_count)) return answer_text # ================================== # 本クラスのテスト用処理 # ================================== def ModuleTest() : news = NewsReader() news_text = news.GetAnswerIfTextIsRequestingNews("国際ニュースを教えて") print(news_text) time.sleep(5) news_text= news.GetAnswerIfTextIsRequestingNews("1番") print(news_text) # ================================== # 本モジュールを直接呼出した時の処理 # ================================== if __name__ == "__main__": # 直接呼び出したときは、モジュールテストを実行する。 ModuleTest()``` ```PYTHON:CLOVA_openai.py import time import os import openai from CLOVA_led import global_led_Ill from CLOVA_charactor import global_charactor # ================================== # OpenAI APIクラス # ================================== class OpenaiApiControl : OPENAI_CHARACTOR_CFG = "あなたはサービス終了で使えなくなったクローバの後を次ぎました。" # コンストラクタ def __init__(self) : self.OPENAI_API_KEY = os.environ['OPENAI_API_KEY'] self.SetCharctorSetting("") print("Create <OpenaiApiControl> class") # デストラクタ def __del__(self) : # 現状ログ出すだけ print("Delete <OpenaiApiControl> class") def SetCharctorSetting(self, setting_str) : self._char_setting_str = self.OPENAI_CHARACTOR_CFG + setting_str def GetAnswerFromAi(self, aimodel, speeched_text) : openai.api_key = self.OPENAI_API_KEY # 底面 LED をピンクに global_led_Ill.AllPink() print("OpenAI 応答作成中") desc = global_charactor.GetCharactorDescription() if (self.OPENAI_API_KEY != "") : try: ai_response = openai.ChatCompletion.create( model=aimodel, messages=[ {"role": "system", "content": self._char_setting_str + desc }, {"role": "user", "content": speeched_text}, ] ) #print(ai_response["choices"][0]["message"]["content"]) #返信のみを出力 print(ai_response) #print(len(ai_response)) if (len(ai_response) != 0) : answer_text = ai_response["choices"][0]["message"]["content"] else : print("AIからの応答が空でした。") answer_text = "" except openai.error.RateLimitError: answer_text = "OpenAIエラー:APIクオータ制限に達しました。しばらく待ってから再度お試しください。改善しない場合は、月間使用リミットに到達したか無料枠期限切れの可能性もあります。" except openai.error.AuthenticationError: answer_text = "OpenAIエラー:Open AI APIキーが不正です。" except openai.error.APIConnectionError: answer_text = "OpenAIエラー:Open AI APIに接続できませんでした。" except openai.error.ServiceUnavailableError: answer_text = "OpenAIエラー:Open AI サービス無効エラーです。" except openai.error.OpenAIError as e: answer_text = "OpenAIエラー:Open AI APIエラーが発生しました: {}".format(e) except Exception as e: answer_text = "不明なエラーが発生しました: {}".format(e) else : answer_text = "Open AI APIキーが設定されていないため利用できません。先に APIキーを取得して設定してください。" print(answer_text) return answer_text # ================================== # 本クラスのテスト用処理 # ================================== def ModuleTest() : pass # ================================== # 本モジュールを直接呼出した時の処理 # ================================== if __name__ == "__main__": # 直接呼び出したときは、モジュールテストを実行する。 ModuleTest() ``` ```PYTHON:CLOVA_queue.py from collections import deque # ================================== # 発話キュークラス # ================================== class SpeechQueue : # コンストラクタ def __init__(self) : print("Create <SpeechQueue> class") self._queue = deque() # デストラクタ def __del__(self) : # 現状ログ出すだけ print("Delete <SpeechQueue> class") # 文字列をキューに格納する def AddToQueue(self, string): self._queue.append(string) # キューから文字列を取得する def GetFromQueue(self): return self._queue.popleft() def __len__(self): return len(self._queue) # ================================== # 外部参照用のインスタンス # ================================== global_speech_queue = SpeechQueue() # ================================== # 本クラスのテスト用処理 # ================================== def ModuleTest() : # 現状何もしない pass # ================================== # 本モジュールを直接呼出した時の処理 # ================================== if __name__ == "__main__": # 直接呼び出したときは、モジュールテストを実行する。 ModuleTest() ``` ```PYTHON:CLOVA_startup.py import os import time import subprocess import RPi.GPIO as GPIO from CLOVA_led import IndicatorLed as ind_led # スイッチが接続されているGPIO番号 PIN_FRONT_SW = 4 PIN_BACK_SW_MUTE = 7 # LEDが接続されているGPIO番号 #PIN_LED_G = 12 # 別のPythonスクリプトが実行中かどうかを確認する関数 def is_process_running(process_name): try: subprocess.check_output(["pidof", process_name]) return True except subprocess.CalledProcessError: return False # まだ起動していなければ CLOVA_RasPi.py を起動する関数 def start_CLOVA_RasPi(): if not is_process_running("CLOVA_RasPi.py"): program_path = os.path.expanduser('~/CLOVA_RasPi/CLOVA_RasPi.py') print("Starting : {}".format(program_path)) subprocess.Popen(['/usr/bin/python3', program_path]) time.sleep(1) # GPIOの初期化 GPIO.setmode(GPIO.BCM) GPIO.setup(PIN_BACK_SW_MUTE, GPIO.IN, pull_up_down=GPIO.PUD_UP) led = ind_led() # スイッチの状態を監視し、押された場合にMyAppli.pyを起動する while True: if not GPIO.input(PIN_BACK_SW_MUTE): print("Sw ON!") led.SetLed(led.LED_ON) #GPIO.output(PIN_LED_G, True) start_CLOVA_RasPi() else: led.SetLed(led.LED_OFF) #GPIO.output(PIN_LED_G, False) time.sleep(0.1) ``` ```PYTHON:CLOVA_switch.py import threading as th import time import RPi.GPIO as GPIO # ================================== # キー入力クラス # ================================== class SwitchInput : # PIN_FRONT_SW = 26 # PIN_FRONT_SW = 4 # 起動に使うので、これはサポート対象外とする PIN_BACK_SW_MINUS = 2 PIN_BACK_SW_PLUS = 3 PIN_BACK_SW_BT = 5 PIN_BACK_SW_MUTE = 7 # PIN_POWER_SW = 22 # 電源OFFキーに使っているので、これはサポート対象外とする KEY_UP = False KEY_DOWN = True # コンストラクタ def __init__(self, pin, cb_func) : print("Create <SwitchInput> class / Pin={}".format(pin)) self._pin = pin print("GPIO.setup({}, {}, {})".format(self._pin, GPIO.IN, GPIO.PUD_UP)) GPIO.setmode(GPIO.BCM) GPIO.setup(self._pin, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.add_event_detect(self._pin, GPIO.FALLING, callback=cb_func, bouncetime = 200) # デストラクタ def __del__(self) : print("Delete <SwitchInput> class / Pin={}".format(self._pin)) self.Release() # 解放処理 def Release(self) : print("Relase key({})".format(self._pin)) GPIO.remove_event_detect(self._pin) GPIO.cleanup(self._pin) # ================================== # 本クラスのテスト用処理 # ================================== def ModuleTest() : # 現状何もしない pass # ================================== # 本モジュールを直接呼出した時の処理 # ================================== if __name__ == "__main__": # 直接呼び出したときは、モジュールテストを実行する。 ModuleTest() ``` ```PYTHON:CLOVA_test.py import os import sys import threading import time import RPi.GPIO as GPIO import json import wave import pyaudio as PyAudio from CLOVA_voice import VoiceControl from CLOVA_queue import global_speech_queue PIN_FRONT_SW = 4 PIN_BACK_SW_MINUS = 2 PIN_BACK_SW_PLUS = 3 PIN_BACK_SW_BT = 5 PIN_BACK_SW_MUTE = 7 PIN_POWER_SW = 22 PIN_LED_R = 13 PIN_LED_G = 12 PIN_LED_B = 6 WAV_FILENAME = "/tmp/clova_speech.wav" # ================================== # テスト用クラス # ================================== class TestClass : # コンストラクタ def __init__(self) : print("Create <TestClass> class") self.is_active = False # デストラクタ def __del__(self) : # 現状ログ出すだけ print("Delete <CharactorSelection> class") def RecPlayTestTask(self) : voice = VoiceControl(); while(self.is_active) : record_data = voice.RecordFromMic() with wave.open(WAV_FILENAME, "wb") as out: out.setnchannels(voice.mic_num_ch) out.setsampwidth(2) out.setframerate(16000) out.writeframes(record_data) time.sleep(0.5) print("再生開始") voice.PlayAudioFile(WAV_FILENAME) print("再生終了") time.sleep(1.5) def GpioTestTask(self) : sw_front_before = -1 sw_back_minus_before = -1 sw_back_plus_before = -1 sw_back_bt_before = -1 sw_back_mute_before = -1 sw_power_before = -1 GPIO.setmode(GPIO.BCM) GPIO.setup(PIN_FRONT_SW, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.setup(PIN_BACK_SW_MINUS, GPIO.IN) GPIO.setup(PIN_BACK_SW_PLUS, GPIO.IN) GPIO.setup(PIN_BACK_SW_BT, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.setup(PIN_BACK_SW_MUTE, GPIO.IN, pull_up_down=GPIO.PUD_UP) GPIO.setup(PIN_POWER_SW, GPIO.IN) GPIO.setup(PIN_LED_R, GPIO.OUT) GPIO.setup(PIN_LED_G, GPIO.OUT) GPIO.setup(PIN_LED_B, GPIO.OUT) GPIO.output(PIN_LED_R, GPIO.LOW) GPIO.output(PIN_LED_G, GPIO.LOW) GPIO.output(PIN_LED_B, GPIO.LOW) while(self.is_active) : sw_front = GPIO.input(PIN_FRONT_SW) sw_back_minus = GPIO.input(PIN_BACK_SW_MINUS) sw_back_plus = GPIO.input(PIN_BACK_SW_PLUS) sw_back_bt = GPIO.input(PIN_BACK_SW_BT) sw_back_mute = GPIO.input(PIN_BACK_SW_MUTE) sw_power = GPIO.input(PIN_POWER_SW) if sw_front_before != sw_front : if (sw_front == GPIO.HIGH) : print("[FRONT] switch is OFF") else : print("[FRONT] switch is ON") if sw_back_minus_before != sw_back_minus : if (sw_back_minus == GPIO.HIGH) : print("[-] switch is OFF") GPIO.output(PIN_LED_B, GPIO.LOW) print("[B] LED is OFF") else : print("[-] switch is ON") GPIO.output(PIN_LED_B, GPIO.HIGH) print("[B] LED is ON") if sw_back_plus_before != sw_back_plus : if (sw_back_plus == GPIO.HIGH) : GPIO.output(PIN_LED_G, GPIO.LOW) print("[R] LED is OFF") print("[+] switch is OFF") else : print("[+] switch is ON") GPIO.output(PIN_LED_G, GPIO.HIGH) print("[R] LED is ON") if sw_back_bt_before != sw_back_bt : if (sw_back_bt == GPIO.HIGH) : print("[BT] switch is OFF") GPIO.output(PIN_LED_R, GPIO.LOW) print("[R] LED is OFF") else : print("[BT] switch is ON") GPIO.output(PIN_LED_R, GPIO.HIGH) print("[R] LED is ON") if sw_back_mute_before != sw_back_mute : if (sw_back_mute == GPIO.HIGH) : print("[MUTE] switch is OFF") else : print("[MUTE] switch is ON") if sw_power_before != sw_power : if (sw_power == GPIO.HIGH) : print("[POWER] switch is OFF") else : print("[POWER] switch is ON") time.sleep(0.5) sw_front_before = sw_front sw_back_minus_before = sw_back_minus sw_back_plus_before = sw_back_plus sw_back_bt_before = sw_back_bt sw_back_mute_before = sw_back_mute sw_power_before = sw_power GPIO.cleanup(PIN_FRONT_SW) GPIO.cleanup(PIN_BACK_SW_MINUS) GPIO.cleanup(PIN_BACK_SW_PLUS) GPIO.cleanup(PIN_BACK_SW_BT) GPIO.cleanup(PIN_BACK_SW_MUTE) GPIO.cleanup(PIN_POWER_SW) GPIO.cleanup(PIN_LED_R) GPIO.cleanup(PIN_LED_G) GPIO.cleanup(PIN_LED_B) def scan_indecies(self): pyaud = PyAudio.PyAudio() print ("デバイスインデックス総数: {0}".format(pyaud.get_device_count())) found_index = -1 for i in range(pyaud.get_device_count()): line_str = pyaud.get_device_info_by_index(i) print (line_str) json_data = line_str#json.loads(line_str) # print("{}:{},{},{}".format(json_data['index'],json_data['name'],json_data['maxInputChannels'],json_data['maxOutputChannels'])) #デバッグ用 if ( ( json_data['name'] == "dmic_hw" ) and (json_data['maxInputChannels'] != 0) and (json_data['maxOutputChannels'] != 0) ): found_index = json_data['index'] if (found_index != -1) : print("入力(MIC)デバイスインデックス = {}".format(found_index)) print("出力(SPEAKER)デバイスインデックス = {}".format(found_index)) else : print("該当するものが見当たりません。設定が正しいか確認してください。") # ================================== # 本クラスのテスト用処理 # ================================== def ModuleTest() : # 呼び出し引数チェック if ((len(sys.argv) == 2) and (sys.argv[1]!="-h") and (sys.argv[1]!="--help")): test = TestClass() # ハードテスト用 if (sys.argv[1] == "hw_test") : print("Ready! Press any switch to test or press [Enter] key to exit") test.is_active = True gpio_test_thread = threading.Thread(target = test.GpioTestTask, args = (), name = 'GpioTestTask', daemon = True) repplay_test_thread = threading.Thread(target = test.RecPlayTestTask, args = (), name = 'GpioTestTask', daemon = True) gpio_test_thread.start() repplay_test_thread.start() input() global_speech_queue.AddToQueue("終了") time.sleep(1) test.is_active = False print("Exit") time.sleep(1) gpio_test_thread.join() repplay_test_thread.join() # インデックス値のスキャン elif (sys.argv[1] == "get_indecies") : test.scan_indecies() # マイクの最低音量調整 elif (sys.argv[1] == "adjust_mic") : print("マイクの最低音量調整用のテストは未実装") # それ以外(不正)の場合 else : if (len(sys.argv) != 2) : print("No test type specified{}".format(len(sys.argv))) else : print("Invalid test type :'{}' ".format(sys.argv[1])) # ヘルプ表示 else : print("Usage> python CLOVA_test.py [test type]") print(" [test type] : hw_test / get_indecies / adjust_mic") # ================================== # 本モジュールを直接呼出した時の処理 # ================================== if __name__ == "__main__": # 直接呼び出したときは、モジュールテストを実行する。 ModuleTest() ``` ```PYTHON:CLOVA_timer.py import threading as th import time import datetime import re from CLOVA_queue import global_speech_queue # ================================== # タイマー管理クラス # ================================== # タイマー管理クラス class TimerControl : # コンストラクタ def __init__(self) : # 現状ログ出すだけ print("Create <TimerControl> class") self._active = False self._is_timer_set = False self._is_alarm_on = False self._timer_thread = th.Thread(target = self.TimerMain, args = (), name = 'TimerMain', daemon = True) self._timer_thread.start() self._duration = "" # デストラクタ def __del__(self) : print("Delete <TimerControl> class") self.Stop() self._active = False time.sleep(1) self._timer_thread.join() print("_timer_thread Joined!") # タイマの監視を開始 def Start(self) : if (self._is_timer_set == False) : print("Timer started!") self._is_timer_set = True # タイマの監視を停止 def Stop(self) : if (self._is_timer_set == True) : print("Timer stopped!") self._is_timer_set = False # タイマのスレッド関数 def TimerMain(self) : self._active = True while (self._active == True) : self.TimerWatch() time.sleep(1) # タイマの監視処理 def TimerWatch(self) : if (self._is_timer_set == True) : print ("Waiting Timer!") if (datetime.datetime.now() >= self.target_time) : #self._is_timer_set = False self._is_alarm_on = True print("Time UP!!!!") answer_text = "{} 経ちました。".format(self._duration) global_speech_queue.AddToQueue(answer_text) print(answer_text) self.target_time += datetime.timedelta(seconds=10) #self.Stop() # タイマーの 要求に答える。タイマーの要求ではなければ 空 の文字列を返す def GetAnswerIfTextIsRequestTimerSet(self, request_text) : if (self._is_alarm_on == False) : if ( ( re.match(".*後に.*知らせて", request_text) != None ) or ( re.match(".*後に.*タイマ.*セット", request_text) != None ) ): print("Match1") pos = request_text.find("後") duration = request_text[:pos] self._duration = duration print(duration) if (duration != "" ) : answer_text = '{}後にタイマーをセットします。'.format(duration) self.SetTargetDateTimeForTheDuration(duration) print(answer_text) #self._is_timer_set = True #?? return answer_text else : return "" else : return "" else : if ('わかりました' in request_text ) or ('了解' in request_text ) or ('止めて' in request_text ) : answer_text = "タイマ通知を終了します。" self._is_alarm_on = False self._is_timer_set = False self.Stop() print(answer_text) return answer_text else : #answer_text = "{} 経ちました。".format(self._duration) #global_speech_queue.AddToQueue(answer_text) answer_text = "終了待ちです。"; print(answer_text) return answer_text # 満了までの期間から、満了日時分秒を割り出す def SetTargetDateTimeForTheDuration(self, duration) : if ( ( "時間" in duration ) or ( "分" in duration ) or ( "秒" in duration ) ) : secs = self.ParseTime(duration) self.target_time = datetime.datetime.now() + datetime.timedelta(seconds=secs) print("{} = {} sec @ {}".format(duration, secs, self.target_time)) self._is_timer_set = True self.Start() #is_timer_set = True # 文字列の時分秒の部分を字句解析して秒に変換 def ParseTime(self, time_string) : print("time_string={}".format(time_string)) time_pattern = r'(?:(\d+)時間)?(?:(\d+)分)?(?:(\d+)秒)?' hours, minutes, seconds = map(int, re.match(time_pattern, time_string).groups(default=0)) print("{}時間 {}分 {}秒 = {}sec".format(hours, minutes, seconds, ( (hours * 3600) + (minutes * 60) + seconds))) return ( (hours * 3600) + (minutes * 60) + seconds) # ================================== # 本クラスのテスト用処理 # ================================== def ModuleTest2() : tmr = TimerControl() #seconds = tmr.ParseTime("3時間40分59秒後") seconds = tmr.ParseTime("1分10秒後") print(seconds) def ModuleTest() : tmr = TimerControl() tmr.GetAnswerIfTextIsRequestTimerSet("1分10秒後に知らせて") test_event = th.Event() test_thread = th.Thread(target=WaitForTestOrEnterKey, args=(test_event,)) test_thread.start() while not test_event.is_set(): # 他のスレッドが動ける処理をここに記述 if (tmr._is_timer_set == False) : break time.sleep(0.5) print("Finished Test!") def WaitForTestOrEnterKey(event): input("Press Enter to FINISH...") event.set() # ================================== # 本モジュールを直接呼出した時の処理 # ================================== if __name__ == "__main__": # 直接呼び出したときは、モジュールテストを実行する。 ModuleTest() ``` ```PYTHON:CLOVA_voice.py import time import os import pyaudio import wave import numpy as np import audioop import speech_recognition as google_sr import requests import json from google.cloud import speech_v1p1beta1 as speech from google.cloud import texttospeech as tts from voicetext import VoiceText from pydub import AudioSegment from CLOVA_led import global_led_Ill from CLOVA_config import global_config_sys from CLOVA_charactor import global_charactor from CLOVA_volume import global_vol from CLOVA_queue import global_speech_queue # 音声ファイル設定 SPEECH_FORMAT = pyaudio.paInt16 # 再生設定 WAV_PLAY_FILENAME = "/tmp/clova_speech.wav" WAV_PLAY_SIZEOF_CHUNK = 1024 # 録音設定 GOOGLE_SPEECH_RATE = 16000 GOOGLE_SPEECH_SIZEOF_CHUNK = int(GOOGLE_SPEECH_RATE / 10) # ================================== # 音声取得・再生クラス # ================================== class VoiceControl : # コンストラクタ def __init__(self) : print("Create <VoiceControl> class") # 設定パラメータを読み込み self.mic_num_ch = global_config_sys.settings["hardware"]["audio"]["microphone"]["num_ch"] self.mic_device_index = global_config_sys.settings["hardware"]["audio"]["microphone"]["index"] self.silent_threshold = global_config_sys.settings["hardware"]["audio"]["microphone"]["silent_thresh"] self.terminate_silent_duration = global_config_sys.settings["hardware"]["audio"]["microphone"]["term_duration"] self.speaker_num_ch = global_config_sys.settings["hardware"]["audio"]["speaker"]["num_ch"] self.speaker_device_index = global_config_sys.settings["hardware"]["audio"]["speaker"]["index"] print("MiC:NumCh={}, Index={}, Threshold={}, Duration={}, SPK:NumCh={}, Index={}".format(self.mic_num_ch, self.mic_device_index, self.silent_threshold, self.terminate_silent_duration, self.speaker_num_ch, self.speaker_device_index))#for debug # Speech-to-Text API クライアントを作成する self._client_speech = speech.SpeechClient() # Text-to-Speech API クライアントを作成する self._client_tts = tts.TextToSpeechClient() # VoiceText のキーを取得 self.voice_text_api_key = os.environ['VOICE_TEXT_API_KEY'] # Web版Voice Vox API キーを取得 self.web_voicevox_api_key = os.environ['WEB_VOICEVOX_API_KEY'] # ALTalk ユーザー名パスワードを取得 self.aitalk_user = os.environ['AITALK_USER'] self.aitalk_password = os.environ['AITALK_PASSWORD'] # デストラクタ def __del__(self) : # 現状ログ出すだけ print("Delete <VoiceControl> class") # マイクからの録音 def RecordFromMic(self) : # 底面 LED を赤に global_led_Ill.AllRed() # PyAudioのオブジェクトを作成 pyaud = pyaudio.PyAudio() # 録音開始 print("聞き取り中:") # 底面 LED を暗緑に global_led_Ill.AllDarkGreen() # 録音準備 rec_stream = pyaud.open(format=SPEECH_FORMAT, channels=self.mic_num_ch, rate=GOOGLE_SPEECH_RATE, input=True, input_device_index=self.mic_device_index, frames_per_buffer=GOOGLE_SPEECH_SIZEOF_CHUNK) # 無音検出用パラメータ silent_frames = 0 # 無音期間 フレームカウンタ max_silent_frames = int( self.terminate_silent_duration * GOOGLE_SPEECH_RATE / 1000 / GOOGLE_SPEECH_SIZEOF_CHUNK) # 最大無音フレームカウンタ # 最大最小の初期化 maxpp_data_max = 0 maxpp_data_min = 32767 # 初回のボツッ音を発話開始と認識してしまうので、ダミーで最初1フレーム分読んでおく(応急処置) rec_stream.read(GOOGLE_SPEECH_SIZEOF_CHUNK) # 録音停止から始める recording = False # バッファ初期化 rec_frames = [] # 録音ループ while True: # データ取得 data = rec_stream.read(GOOGLE_SPEECH_SIZEOF_CHUNK) # ピーク平均の算出 maxpp_data = audioop.maxpp(data, 2) # 最大値、最小値の格納 if maxpp_data < maxpp_data_min: maxpp_data_min = maxpp_data if maxpp_data > maxpp_data_max: maxpp_data_max = maxpp_data # 無音スレッショルド未満 if maxpp_data < self.silent_threshold: # 無音期間 フレームカウンタをインクリメント silent_frames += 1 # 開始済みの場合で、フレームカウンタが最大に達したら、会話の切れ目と認識して終了する処理 if ( recording == True ) and ( silent_frames >= max_silent_frames ): print("録音終了 / Rec level;{0}~{1}".format(maxpp_data_min, maxpp_data_max)) # 録音停止 break # 無音スレッショルド以上 else: # 音の入力があったので、無音期間フレームカウンタをクリア silent_frames = 0 # まだ開始できていなかったら、ここから録音開始 if not recording: # 底面 LED を緑に global_led_Ill.AllGreen() # 録音開始 print("録音開始") recording = True # 録音中のフレームを取得 rec_frames.append(data) # 割り込み音声がある時はキャンセルして抜ける if (len(global_speech_queue) != 0) : print("割り込み音声により録音キャンセル") # rec_frames = [] rec_frames.append(data) break; # 録音停止 rec_stream.stop_stream() rec_stream.close() # PyAudioオブジェクトを終了 pyaud.terminate() return b"".join(rec_frames) # 音声からテキストに変換 def SpeechToText(self, record_data) : # 底面 LED をオレンジに global_led_Ill.AllOrange() # 設定値により音声認識(STT)システムを選択する system = global_charactor.setting_json["charactors"][global_charactor.sel_num]["Listener"]["system"] if (system == "GoogleCloudSpeech") : speeched_text = self.SpeechToTextWithGoogleSpeech(record_data) elif (system == "GoogleSpeechRecognition") : speeched_text = self.SpeechToTextWithGoogleSpeechRecognition(record_data) else : print("Invalid Speech System for SpeechToText : {}".format(system)) speeched_text = "" return speeched_text # テキストから音声に変換 def TextToSpeech(self, text_to_speech) : # 底面 LED を青に global_led_Ill.AllBlue() # 設定値により音声合成(TTS)システムを選択する system = global_charactor.setting_json["charactors"][global_charactor.sel_num]["Speaker"]["system"] if (system == "GoogleTextToSpeech") : file_name = self.TextToSpeechWavWithGoogleSpeech(text_to_speech) elif (system == "VoiceText") : file_name = self.TextToSpeechWavWithVoiceText(text_to_speech) elif (system == "VoiceVox") : file_name = self.TextToSpeechWavWithVoiceVox(text_to_speech) elif (system == "AITalk") : file_name = self.TextToSpeechWavWithAITalk(text_to_speech) else : print("Invalid Speech System for TextToSpeech : {}".format(system)) file_name = "" return file_name # 音声ファイルの再生 def PlayAudioFile(self, filename) : # 底面 LED を水に global_led_Ill.AllCyan() print('ファイル再生 :{}'.format(filename)) # PyAudioのオブジェクトを作成 pyaud = pyaudio.PyAudio() # waveファイルの情報を取得 wav_file = wave.open(filename, "rb") rate = wav_file.getframerate() channels = wav_file.getnchannels() width = wav_file.getsampwidth() if (rate == 24000) : # 一旦閉じる wav_file.close() os.rename(filename, "/tmp/temp.wav") # サンプリングレート変換 rateconv_file = AudioSegment.from_wav("/tmp/temp.wav") converted_wav = rateconv_file.set_frame_rate(44100) converted_wav.export(filename, format='wav') os.remove("/tmp/temp.wav") # 再度フィアルを開いて waveファイルの情報を取得 wav_file = wave.open(filename, "rb") rate = wav_file.getframerate() channels = wav_file.getnchannels() width = wav_file.getsampwidth() print("PlayWav: rate={}, channels={}, width = {}".format(rate,channels, width)) # 再生開始 play_stream = pyaud.open(format=pyaud.get_format_from_width(width), channels=channels, rate=rate, output=True, output_device_index=self.speaker_device_index) wav_file.rewind() play_stream.start_stream() # 再生処理 while True: data = wav_file.readframes(WAV_PLAY_SIZEOF_CHUNK) if not data: break data = np.frombuffer(data, dtype=np.int16) * global_vol.vol_value # ボリューム倍率を更新 data = data.astype(np.int16) play_stream.write(data.tobytes()) # 再生終了処理 play_stream.stop_stream() while play_stream.is_active(): time.sleep(0.1) play_stream.close() wav_file.close() print("Play done!") # PyAudioオブジェクトを終了 pyaud.terminate() time.sleep(0.1) # Google-Speech での音声テキスト変換 def SpeechToTextWithGoogleSpeech(self, record_data) : print("音声からテキストに変換中(Google Speech)") # Speech-to-Text の認識設定 config = speech.RecognitionConfig( encoding=speech.RecognitionConfig.AudioEncoding.LINEAR16, sample_rate_hertz=GOOGLE_SPEECH_RATE, language_code=global_charactor.setting_json["charactors"][global_charactor.sel_num]["Listener"]["language"], enable_automatic_punctuation=True, ) # Speech-to-Text の音声設定 speech_audio = speech.RecognitionAudio(content=record_data) # Speech-to-Text の認識処理 speech_response = self._client_speech.recognize(config=config, audio=speech_audio) # 結果取得処理 (JSONから抜き出す) # print(len(speech_response.results)) # デバッグ用 if (len(speech_response.results) != 0) : speeched_text = speech_response.results[0].alternatives[0].transcript.strip() else : print("音声取得に失敗") speeched_text = "" return speeched_text # Google-SpeechRecognition での音声テキスト変換 def SpeechToTextWithGoogleSpeechRecognition(self, record_data) : print("音声からテキストに変換中(Google Recognition)") speeched_text = "" # 録音した音声データをGoogle Speech Recognitionでテキストに変換する recognizer = google_sr.Recognizer() audio_data = google_sr.AudioData(record_data, sample_rate=GOOGLE_SPEECH_RATE, sample_width=2) speeched_text = recognizer.recognize_google(audio_data, language=global_charactor.setting_json["charactors"][global_charactor.sel_num]["Listener"]["language"]) return speeched_text # Google-Speech でのテキスト音声変換 def TextToSpeechWavWithGoogleSpeech(self, speeched_text) : print("音声合成中(Google TTS)") # テキスト入力 synthesis_input = tts.SynthesisInput(text=speeched_text) # パラメータを読み込み if ( global_charactor.setting_json["charactors"][global_charactor.sel_num]["Speaker"]["gender"] == "MALE" ) : gender_sel = tts.SsmlVoiceGender.MALE elif ( global_charactor.setting_json["charactors"][global_charactor.sel_num]["Speaker"]["gender"] == "FEMALE" ) : gender_sel = tts.SsmlVoiceGender.FEMALE elif ( global_charactor.setting_json["charactors"][global_charactor.sel_num]["Speaker"]["gender"] == "NEUTRAL" ) : gender_sel = tts.SsmlVoiceGender.NEUTRAL else : gender_sel = tts.SsmlVoiceGender.SSML_VOICE_GENDER_UNSPECIFIED pitch_cfg = float(global_charactor.setting_json["charactors"][global_charactor.sel_num]["Speaker"]["pitch"]) rate_cfg = float(global_charactor.setting_json["charactors"][global_charactor.sel_num]["Speaker"]["rate"]) # 音声合成設定 voice_config = tts.VoiceSelectionParams( language_code=global_charactor.setting_json["charactors"][global_charactor.sel_num]["Speaker"]["language"], ssml_gender=gender_sel, name=global_charactor.setting_json["charactors"][global_charactor.sel_num]["Speaker"]["name"] ) # 音声ファイル形式設定 audio_config = tts.AudioConfig( audio_encoding=tts.AudioEncoding.LINEAR16, speaking_rate=rate_cfg, pitch = pitch_cfg, sample_rate_hertz = GOOGLE_SPEECH_RATE ) # 音声合成メイン処理実行 response = self._client_tts.synthesize_speech( input=synthesis_input, voice=voice_config, audio_config=audio_config ) # 音声をファイルに保存 with open(WAV_PLAY_FILENAME, "wb") as out: # Write the response to the output file. out.write(response.audio_content) print('ファイル保存完了 ;{}'.format(WAV_PLAY_FILENAME)) return WAV_PLAY_FILENAME # VoiceText WebAPI でのテキスト音声変換 def TextToSpeechWavWithVoiceText(self, speeched_text) : print("音声合成中(VoiceText)") # 音声合成設定 url = "https://api.voicetext.jp/v1/tts" params = { "text": speeched_text, "speaker": global_charactor.setting_json["charactors"][global_charactor.sel_num]["Speaker"]["name"], "emotion": global_charactor.setting_json["charactors"][global_charactor.sel_num]["Speaker"]["emotion"] } auth = (self.voice_text_api_key, '') ret = "" try: # APIにリクエストを送信してデータを取得 response = requests.post(url, auth=auth, data=params) # HTTPエラーがあれば例外を発生させる response.raise_for_status() # 音声をファイルに保存 with open(WAV_PLAY_FILENAME, "wb") as out: out.write(response.content) ret = WAV_PLAY_FILENAME except requests.exceptions.RequestException as e: print("リクエストエラー:{}".format(e)) except IOError as e: print("ファイルの保存エラー:{}".format(e)) print('ファイル保存完了 ;{}'.format(WAV_PLAY_FILENAME)) return ret # VoiceVox WebAPI でのテキスト音声変換 def TextToSpeechWavWithVoiceVox(self, speeched_text) : print("音声合成中(VoiceVox)") # 音声合成設定 url = "https://api.tts.quest/v3/voicevox/synthesis" params = { "key": self.web_voicevox_api_key, "speaker": global_charactor.setting_json["charactors"][global_charactor.sel_num]["Speaker"]["name"], "text": speeched_text, } auth = (self.voice_text_api_key, '') ret = "" try: # APIにリクエストを送信してデータを取得 res = requests.post(url, data=params) # HTTPエラーがあれば例外を発生させる res.raise_for_status() res_json = json.loads(res.text) # print("status = '{}'".format(response.status_code)) # print("content = '{}'".format(response.content)) # print("text = '{}'".format(response.text)) if (res_json["success"] == True) : while True: # print("webDownloadUrl = '{}'".format(res_json["wavDownloadUrl"])) response = requests.get(res_json["wavDownloadUrl"]) if (response.status_code == 200) : break # 404エラーの場合はもう一度やり直す。 elif (response.status_code != 404) : # 404 以外のHTTPエラーがあれば例外を発生させる response.raise_for_status() break # 少しだけ待ってリトライ time.sleep(0.5) # 音声をファイルに保存 with open(WAV_PLAY_FILENAME, "wb") as out: out.write(response.content) ret = WAV_PLAY_FILENAME else : print("NOT success (VoiceVox") except requests.exceptions.RequestException as e: print(res.text) print("リクエストエラー:{}".format(e)) except IOError as e: print(res.text) print("ファイルの保存エラー:{}".format(e)) print('ファイル保存完了 ;{}'.format(WAV_PLAY_FILENAME)) return ret # AITalk WebAPI でのテキスト音声変換 def TextToSpeechWavWithAITalk(self, speeched_text) : print("音声合成中(AITalk)") # 音声合成設定 url = "https://webapi.aitalk.jp/webapi/v5/ttsget.php" params = { "username": self.aitalk_user, "password": self.aitalk_password, "speaker_name": global_charactor.setting_json["charactors"][global_charactor.sel_num]["Speaker"]["name"], "ext": "wav", "speed": global_charactor.setting_json["charactors"][global_charactor.sel_num]["Speaker"]["speed"], "pitch": global_charactor.setting_json["charactors"][global_charactor.sel_num]["Speaker"]["pitch"], "text": speeched_text } ret = "" try: # APIにリクエストを送信してデータを取得 response = requests.get(url, data=params) print("URL:{} params:{}".format(url, params)) # HTTPエラーがあれば例外を発生させる response.raise_for_status() # 音声をファイルに保存 with open(WAV_PLAY_FILENAME, "wb") as out: out.write(response.content) ret = WAV_PLAY_FILENAME except requests.exceptions.RequestException as e: print("リクエストエラー:{}".format(e)) except IOError as e: print("ファイルの保存エラー:{}".format(e)) print('ファイル保存完了 ;{}'.format(WAV_PLAY_FILENAME)) return ret # ================================== # 本クラスのテスト用処理 # ================================== def ModuleTest() : # 現状何もしない pass # ================================== # 本モジュールを直接呼出した時の処理 # ================================== if __name__ == "__main__": ModuleTest() ``` ```PYTHON:CLOVA_volume.py import time from CLOVA_queue import global_speech_queue # ================================== # ボリューム制御クラス # ================================== class VolumeControl : vol_value = 1.0 _vol_step = 7 VOL_MIN_STEP = 0 VOL_MAX_STEP = 12 # ボリュームテーブル(後でちゃんと計算しないとバランス悪い) VOL_TABLE = [ 0.001, 0.01, 0.1, 0.15, 0.2, 0.3, 0.5, 0.8, 1.0, 1.2, 1.5, 1.8, 2.0 ] # コンストラクタ def __init__(self) : print("Create <VolumeControl> class") self._vol_step = 7 # デストラクタ def __del__(self) : # 現状ログ出すだけ print("Delete <VolumeControl> class") # ボリューム [+] 押下時処理 def VolUpCallback(self, arg) : if (self._vol_step < self.VOL_MAX_STEP) : self._vol_step += 1 self.vol_value = self.VOL_TABLE[self._vol_step] print("Vol + [={}({})]".format(self._vol_step, self.vol_value)) vol_speech = "ボリュームを {} に設定しました。".format(str(self._vol_step)) print(vol_speech) global_speech_queue.AddToQueue(vol_speech) # ボリューム [-] 押下時処理 def VolDownCallback(self, arg) : if (self._vol_step > self.VOL_MIN_STEP) : self._vol_step -= 1 self.vol_value = self.VOL_TABLE[self._vol_step] print("Vol - [={}({})]".format(self._vol_step, self.vol_value)) vol_speech = "ボリュームを {} に設定しました。".format(str(self._vol_step)) print(vol_speech) global_speech_queue.AddToQueue(vol_speech) # ================================== # 外部参照用のインスタンス # ================================== global_vol = VolumeControl() # ================================== # 本クラスのテスト用処理 # ================================== def ModuleTest() : # 現状何もしない pass # ================================== # 本モジュールを直接呼出した時の処理 # ================================== if __name__ == "__main__": ModuleTest() ``` ```PYTHON:CLOVA_weather.py import re import requests import datetime # 大阪市のコード code = '270000' # ================================== # 天気クラス # ================================== # 主要地方・都市のエリアコードのテーブル area_codes = { '宗谷': '011000', '上川': '012000', '留萌': '012000', '網走': '013000', '北見': '013000', '紋別': '013000', '十勝': '014030', '釧路': '014100', '根室': '014100', '胆振': '015000', '日高': '015000', '石狩': '016000', '空知': '016000', '後志': '016000', '渡島': '017000', '檜山': '017000', '青森': '020000', '岩手': '030000', '宮城': '040000', '秋田': '050000', '山形': '060000', '福島': '070000', '茨城': '080000', '栃木': '090000', '群馬': '100000', '埼玉': '110000', '千葉': '120000', '東京': '130000', '神奈川': '140000', '新潟': '150000', '富山': '160000', '石川': '170000', '福井': '180000', '山梨': '190000', '長野': '200000', '岐阜': '210000', '静岡': '220000', '愛知': '230000', '三重': '240000', '滋賀': '250000', '京都': '260000', '大阪': '270000', '兵庫': '280000', '奈良': '290000', '和歌山': '300000', '鳥取': '310000', '島根': '320000', '岡山': '330000', '広島': '340000', '山口': '350000', '徳島': '360000', '香川': '370000', '愛媛': '380000', '高知': '390000', '福岡': '400000', '佐賀': '410000', '長崎': '420000', '熊本': '430000', '大分': '440000', '宮崎': '450000', '奄美地方': '460040', '鹿児島': '460100', '沖縄本島': '471000', '大東島': '472000', '宮古島': '473000', '八重山': '474000', } class WeatherGetter: # コンストラクタ def __init__(self): # 現状ログ出すだけ print("Create <WeatherGetter> class") # デストラクタ def __del__(self): # 現状ログ出すだけ print("Delete <WeatherGetter> class") # 天気 質問に答える。天気の問い合わせではなければ 空 の文字列を返す def GetAnswerIfTextIsRequestingWeather(self, request_text): if ( ( '天気を教えて' in request_text) or ( '天気は' in request_text) ) : # 天気情報を取得する日付のデフォルト値(今日の日付文字列) date_str = datetime.datetime.now().strftime("%Y-%m-%d") date = "きょう" # 明日か明後日かの場合はその日付文字列を取得する match = re.search("(明日|あした|明後日|あさって)", request_text) if match: if match.group(1) in ["明日", "あした"]: date_str = (datetime.datetime.now() + datetime.timedelta(days=1)).strftime("%Y-%m-%d") date = "あした" else: date_str = (datetime.datetime.now() + datetime.timedelta(days=2)).strftime("%Y-%m-%d") date = "あさって" # 都市名を取得し、エリアコードを取得する for area in area_codes.keys(): if area in request_text: code = area_codes[area] break # 都市名が見つからない場合は空で返す else: answer_text = "エリア名が不明です。天気を取得したいエリアを指定してください" print(answer_text) return answer_text # APIから天気情報を取得する url = f'https://www.jma.go.jp/bosai/forecast/data/forecast/{code}.json' print("URL={}".format(url)) response = requests.get(url) weather_data = response.json() #print("weather_data = {}".format(weather_data)) # 取得JSONから日付を検索 idx = 0 #print(weather_data[0]['timeSeries'][0]['timeDefines']) for time_define in weather_data[0]['timeSeries'][0]['timeDefines'] : # 指定日の文字列を含む日時定義を検索し一致したら、そのインデックス値の天気を出力する if (date_str in time_define) : weather_text = "{} {} の {} の天気は{} です。".format(date, date_str, area, weather_data[0]['timeSeries'][0]['areas'][0]['weathers'][idx]) print(weather_text) return weather_text idx += 1 # 該当がない場合は空で返信 answer_text = "天気データが取得できませんでした。" print(answer_text) return answer_text return "" else: # 該当がない場合は空で返信 print("No Keyword for Weather") self._news_count = 0 return "" def PrintAreas(self) : response = requests.get("https://www.jma.go.jp/bosai/common/const/area.json") response_data = response.json() for code in response_data["centers"] : print(" '{}': '{}'".format( response_data["centers"][code]['name'], code )) print("") for code in response_data["offices"] : print(" '{}': '{}',".format( response_data["offices"][code]['name'], code )) # ================================== # 本クラスのテスト用処理 # ================================== def ModuleTest() : weather = WeatherGetter() #weather.PrintAreas() weather.GetAnswerIfTextIsRequestingWeather("明日の東京の天気を教えて") # ================================== # 本モジュールを直接呼出した時の処理 # ================================== if __name__ == "__main__": # 直接呼び出したときは、モジュールテストを実行する。 ModuleTest() ``` ```html:index.html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>CLOVA_RasPi 設定画面</title> <style> label { display: block; margin-top: 10px; } </style> </head> <body> <h1>CLOVA_RasPi 設定画面</h1> <form method="post" id="SettingForm"> <label>Select a default character:</label> <select id="default_char_sel" name="default_char_sel"> {CharactorSelList} </select> <label for="mic_channels">MicChannels:</label> <input type="number" name="mic_channels" id="mic_channels" value="{MicChannels}" min="1" max="2" step="1"> <br> <label for="mic_index">MicIndex:</label> <input type="number" name="mic_index" id="mic_index" value="{MicIndex}" min="0" max="100" step="1"> <br> <label for="silent_thresh">SilentThreshold:</label> <input type="number" name="silent_thresh" id="silent_thresh" value="{SilentThreshold}" min="10" max="10000" step="10"> <br> <label for="term_duration">TerminateSilentDuration:</label> <input type="number" name="term_duration" id="term_duration" value="{TerminateSilentDuration}" min="300" max="10000" step="100"> <br> <label for="speaker_channels">SpeakerChannels:</label> <input type="number" name="speaker_channels" id="speaker_channels" value="{SpeakerChannels}" min="1" max="2" step="1"> <br> <label for="speaker_index">SpeakerIndex:</label> <input type="number" name="speaker_index" id="speaker_index" value="{SpeakerIndex}" min="0" max="100" step="1"> <br> <br> <input type="submit" value="書き込み"> </form> <script> // UpDown付き数値入力ボックスのイベントを設定する document.querySelectorAll('input[type="number"]').forEach(input => { input.addEventListener('input', () => { input.value = Math.max(input.min, Math.min(input.max, input.value)); }); }); // デフォルトキャラクターの選択値を取得して設定する var defaultCharSel = document.getElementById('default_char_sel'); defaultCharSel.value = "{DefaultCharSel}"; // フォームが送信される前にJavaScriptで処理を実行する document.getElementById('SettingForm').addEventListener('submit', function(event) { event.preventDefault(); // フォームのデフォルトの送信をキャンセル // 選択された値を取得 var selectedCharactor = document.getElementById('default_char_sel').value; var micChannels = document.getElementById('mic_channels').value; var micIndex = document.getElementById('mic_index').value; var silentThreshold = document.getElementById('silent_thresh').value; var terminateSilentDuration = document.getElementById('term_duration').value; var speakerChannels = document.getElementById('speaker_channels').value; var speakerIndex = document.getElementById('speaker_index').value; // サーバーに選択された値を送信 var xhr = new XMLHttpRequest(); xhr.open('POST', '/update', true); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.onreadystatechange = function() { if (xhr.readyState === 4 && xhr.status === 200) { console.log(xhr.responseText); } }; xhr.send('default_char_sel=' + selectedCharactor + '&mic_channels=' + micChannels + '&mic_index=' + micIndex + '&silent_thresh=' + silentThreshold + '&term_duration=' + terminateSilentDuration + '&speaker_channels=' + speakerChannels + '&speaker_index=' + speakerIndex); }); </script> </body> </html>``` ``` #### 1. ソフトウェアのダウンロード(クローン) 以下のコマンドを使用してGitHubからソフトウェアをクローンします。 `cd ~/;git clone https://github.com/TakSan0/CLOVA_RasPi` #### 2. 設定ファイルのコピー 以下のコマンドを使用して、GitHubからクローンした設定関連のファイルをホームディレクトリにコピーします。 `cp ~/CLOVA_RasPi/.CLOVA_RasPi.* ~/` #### 3. キー設定ファイルの編集 キー設定ファイルを編集します。このファイルは、個人で取得した各APIを使用するための暗号化されたキーを含んでいます。他人に漏洩してしまうと、無断利用による高額な課金のリスクがありますので、取り扱いには注意が必要です。 以下のコマンドを使用して、GitHubからクローンしてコピーしたキー設定ファイルを編集します。 `nano ~/.CLOVA_RasPi.keys` 上記のコマンドを実行すると、キー設定ファイルがエディタで開かれます。ファイル内部は次のような形式になっていると思います。各項目の=の右側に、自分用のキーを追加してください。なお、=の右側にはタブやスペースなどの余計な文字を入れないでください。 ```Text:CLOVA_RasPi.keys GOOGLE_APPLICATION_CREDENTIALS= OPENAI_API_KEY= VOICE_TEXT_API_KEY= WEB_VOICEVOX_API_KEY= AITALK_USER= AITALK_PASSWORD= LINE_CH_ACC_TOKEN= ``` 以下の表に示すように、各項目の説明に従って自分用のキーを入力してください。キーは1文字でも間違えると正常に動作しないため、注意して入力してください。キーは暗号化された英数字の羅列であり、手動で入力するとミスが発生する可能性が高いため、コピー&ペーストが推奨されます。 |キー名|概要|用途| |:---|:---|:---| |GOOGLE_APPLICATION_CREDENTIALS|Googleクラウドのサービスアカウントキーのファイルパス|音声認識(STT)/音声合成(TTS)に使用します。<必須>| |OPENAI_API_KEY|OpenAIのAPIキー|AIによる応答を作る為にChat-GPTのAPIにアクセスするのに使用します。 <必須>| |VOICE_TEXT_API_KEY|Web版VoiceTextのキー|音声合成(TTS) 設定しているとより多くのキャラクタ(声色)を選択できます。<オプション>| |WEB_VOICEVOX_API_KEY=|WEB版VOICEVOX APIのAPIキー|音声合成(TTS) 設定しているとより多くのキャラクタ(声色)を選択できます。<オプション>| |AITALK_USER=|AITalk Iのユーザー名|音声合成(TTS) 設定しているとより多くのキャラクタ(声色)を選択できます。<オプション>| |AITALK_PASSWORD=|AITalk Iのユーザー名|音声合成(TTS) 設定しているとより多くのキャラクタ(声色)を選択できます。<オプション>| |LINE_CH_ACC_TOKEN|LINEチャンネルアクセストークン|LINE MessagingAPIを使って LINEメッセージ送信をする時に使用します。<オプション>| <オプション>の項目を設定しない場合は空白にしてください。(その機能が動作しなくなります。) キー設定ファイルの編集が完了したら、[Ctrl] + [o] の後 [Enter] で書き込み、[Ctrl] + [x] でエディタを抜けます。(nanoエディタの使い方は、必要な方はググってください。) #### 4. pyaudio の入出力設定 以下のコマンドを実行して、入出力のデバイスインデックス値を確認します。 `python ~/CLOVA_RasPi/CLOVA_test.py get_indecies` デバイスインデックスとは、pyaudioの中の設定パラメータ番号のようなもので、何度かやった限りでは Index=11 になるようですが、環境によっては異なる場合もあります。以下のように出力されます。 ```Text 入力(MIC)デバイスインデックス = 11 出力(SPEAKER)デバイスインデックス = 11 ``` 次に、SSHでつなぎに行っているラズパイのIPアドレスの8000番ポートを、ラズパイをSSH操作しているPC等からブラウザで開きます。 例えば、ラズパイのLAN内IPアドレスが "192.168.9.50" であれば、以下のようにブラウザのアドレス欄に入力して開きます。 `http;//192.168.9.50:8000` すると、以下の「CLOVAラズパイ設定」画面が開きます。 ![CLOVAラズパイ設定画面](https://i.gyazo.com/741e8442fe79debd5d8cdd0c61f5fc31.png "CLOVAラズパイ設定画面") 11以外の表示になる場合は、MicIndex:とSpeakerIndex:を変更し、[書き込み]ボタンを押して保存してください。"2. 設定ファイルのコピー"でコピーした.CLOVA_RasPi.cfgというファイル内に記録されます。 11の場合はそのまま次のステップまで飛ばしてください。 #### 5. ハードウェアテスト 以下のコマンドを実行して、テストを実施してみます。 `python ~/CLOVA_RasPi/CLOVA_test.py hw_test` コマンドを実行してしばらくすると、ハードウェアテストモードになります。本体下部のLEDが暗い緑色になったら準備完了です。 マイクに向かって話しかけてみると、その音声がエコーされます。また、各キーを押すと、 `[*] switch is ON` と表示され、スイッチを離すと `[*] switch OFF` *の部分に押されたスイッチの名称)のように表示されれば、そのスイッチは問題なく接続できています。 ハードウェアの説明箇所での導入「5-4-3-3. 電源(シャットダウン)ボタン」の所で底面スイッチをシャットダウンに割り当てているため、そのスイッチは最後まで押さないでください。押すとシャットダウンが実行されます。 また、 [Bluetooth] スイッチを押すと赤色 LED が点灯、 [+] スイッチを押すと緑色 LED が点灯、 [-] スイッチを押すと青色 LED が点灯、 するのが確認出来たら、LED の接続も問題なく接続できています。 なお、RGB LED なので、同時に押すと合成した色になります。 最後に、底面スイッチを押して同じように画面に `[*] switch is ON` が表示されれば、ハードはすべて問題無く動いていることになります。 ### 使い方 CLOVA Raspberry Piは、実装されているスキルのソフトウェア制御とAIによる自動応答のハイブリッド形式で動作します。最新情報や時間に関連する情報など、学習型AI(Chat-GPTなど)が答えられない質問については、スキルに頼ることができます。したがって、実装されているスキルに該当しない場合は、AIによる自動応答が実行されます。 現時点では完全ではなく、スキルの呼び出しに関する認識やトリガーワードの不備により、スキルがうまく呼び出されない場合はAIが応答する可能性があります。この点については、今後改善していく予定です。 実装に協力してくれる方大歓迎です。 #### 起動方法 CLOVA Raspberry Piを起動するには、現在は自動起動がうまく機能しないため、SSHで接続したプロンプトからコマンドを入力して起動する必要があります。 (自動起動がうまく機能しない原因は現在調査中です。) 以下のコマンドを入力して起動します。 `python ~/CLOVA_RasPi/CLOVA_RasPi.py` 正常に起動すると、「キャラクターXXさんが選択されました」という音声とともに、底面のLEDが暗緑色に点灯します。もし起動しない場合は、底面のLEDが赤色になるか消灯しているかを確認してください。一般的には設定の問題が原因と考えられますので、表示されているログに従って対処してください。 (トラブルシューティングガイドとして詳細な対処方法をまとめる予定です。) #### スイッチ操作 |スイッチ名|概要|説明| |:---|:---|:---| |前面(口部分)|-|現状未割当| |[MUTE]|起動・終了|現状未対応| |[Bluetooth]|キャラクタ切り替え|押すと別のキャラクタ(話し相手)が選択されます。声のトーンやAIの応答の性格が微妙に変わるようになっています。| |[+]|ボリュームアップ|ボリュームを1ステップ上げます| |[-]|ボリュームダウン|ボリュームを1ステップ下げます| |(底面)|シャットダウン|システムをシャットダウンします。後ろのLEDが赤色で常時点灯しているか消灯したら、シャットダウンが完了しているため、USB電源ケーブルを抜くことができます。| #### 発話による操作 実装されているスキルは以下の通りです。 - タイマーの設定 - 日時 - ニュース - 天気 - LINE送受信 以下でスキルごとに説明します。 ##### タイマーの設定 例)「1分30秒後にタイマーをセットして」 と指示すると、1分30秒後に通知されます。通知は停止するまで続きますので、「わかりました」と言って通知を停止してください。 ##### 日時 例)「今日何日?」 例)「今何時?」 と指示すると、現在の日付や時間を教えてくれます。 ##### ニュース 例)「国際ニュースを教えてください」 と指示すると、Yahooのトピックスから10項目のニュースを読み上げます。詳細を知りたいニュースの番号を選んで、「〇番」と指示してください 詳細番号待ち状態から抜けるには、「ニュース終わり」と言って解除し、通常の待機状態に戻ります。 指定可能なニュース種別は以下の通りです。 - トップ - 国内 - 国際 - ビジネス - エンタメ - スポーツ - 科学 - 地域 - コンピュータ - インターネット - 社会 ##### 天気 例)あさっての東京の天気を教えて? と指示すると、天気予報を教えてくれます。 指定可能な日は、今日/明日/あさってです。 指定可能な地域は、天気予報ソースファイル "CLOVA_weather.py" の 13行目以降を参考に、住んでいる地域に該当する元を選んでください。 # さいごに ここまでとっても長い記事となってしまいました。 出来るだけわかりやすくするために写真多い目としたためですが、手順や専門用語も多くわかりにくいところも残っていると思います。 アプリケーションの導入部分で未完成の所もまだまだ残っており申し訳ありません。 そして、コンテスト向けに記事をリプレースしましたが、色々とトラブって突貫作業となってしまいました。 不備が残っているかもしれませんが、結果発表が終わって記事の編集が出来る様になったらちゃんと修正しようと思います。 順次改善していきたいと思いますので 質問や不明点等ありましたらコメント欄にてお願いします。誤記や判りにくい箇所、写真の追加が欲しい箇所等ありましたら、右上部分の […] を押して、[編集リクエストを送る] でお願いします。 ハッシュタグ ["#ラズパイ化CLOVA" ](https://twitter.com/intent/tweet?hashtags=CLOVA,LINECLOVA,LINE_CLOVA,ラズパイ化CLOVA) でのX の投稿やコメント、応援、感想も大歓迎です。